github.com/Bytom/bytom@v1.1.2-0.20210127130405-ae40204c0b09/asset/builder.go (about) 1 package asset 2 3 import ( 4 "context" 5 "crypto/rand" 6 "encoding/json" 7 "time" 8 9 log "github.com/sirupsen/logrus" 10 11 "github.com/bytom/bytom/blockchain/signers" 12 "github.com/bytom/bytom/blockchain/txbuilder" 13 "github.com/bytom/bytom/protocol/bc" 14 "github.com/bytom/bytom/protocol/bc/types" 15 ) 16 17 //NewIssueAction create a new asset issue action 18 func (reg *Registry) NewIssueAction(assetAmount bc.AssetAmount) txbuilder.Action { 19 return &issueAction{ 20 assets: reg, 21 AssetAmount: assetAmount, 22 } 23 } 24 25 //DecodeIssueAction unmarshal JSON-encoded data of asset issue action 26 func (reg *Registry) DecodeIssueAction(data []byte) (txbuilder.Action, error) { 27 a := &issueAction{assets: reg} 28 err := json.Unmarshal(data, a) 29 return a, err 30 } 31 32 type issueAction struct { 33 assets *Registry 34 bc.AssetAmount 35 Arguments []txbuilder.ContractArgument `json:"arguments"` 36 } 37 38 func (a *issueAction) Build(ctx context.Context, builder *txbuilder.TemplateBuilder) error { 39 if a.AssetId.IsZero() { 40 return txbuilder.MissingFieldsError("asset_id") 41 } 42 43 asset, err := a.assets.FindByID(ctx, a.AssetId) 44 if err != nil { 45 return err 46 } 47 48 var nonce [8]byte 49 _, err = rand.Read(nonce[:]) 50 if err != nil { 51 return err 52 } 53 54 txin := types.NewIssuanceInput(nonce[:], a.Amount, asset.IssuanceProgram, nil, asset.RawDefinitionByte) 55 tplIn := &txbuilder.SigningInstruction{} 56 if asset.Signer != nil { 57 path := signers.GetBip0032Path(asset.Signer, signers.AssetKeySpace) 58 tplIn.AddRawWitnessKeys(asset.Signer.XPubs, path, asset.Signer.Quorum) 59 } else if a.Arguments != nil { 60 if err := txbuilder.AddContractArgs(tplIn, a.Arguments); err != nil { 61 return err 62 } 63 } 64 65 log.Info("Issue action build") 66 builder.RestrictMinTime(time.Now()) 67 return builder.AddInput(txin, tplIn) 68 } 69 70 func (a *issueAction) ActionType() string { 71 return "issue" 72 }