OSDN Git Service

txpool handle orphan (#1228)
[bytom/bytom.git] / asset / builder.go
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/blockchain/signers"
12         "github.com/bytom/blockchain/txbuilder"
13         "github.com/bytom/protocol/bc"
14         "github.com/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 }
36
37 func (a *issueAction) Build(ctx context.Context, builder *txbuilder.TemplateBuilder) error {
38         if a.AssetId.IsZero() {
39                 return txbuilder.MissingFieldsError("asset_id")
40         }
41
42         asset, err := a.assets.FindByID(ctx, a.AssetId)
43         if err != nil {
44                 return err
45         }
46
47         var nonce [8]byte
48         _, err = rand.Read(nonce[:])
49         if err != nil {
50                 return err
51         }
52
53         assetDef := asset.RawDefinitionByte
54
55         txin := types.NewIssuanceInput(nonce[:], a.Amount, asset.IssuanceProgram, nil, assetDef)
56
57         tplIn := &txbuilder.SigningInstruction{}
58         path := signers.Path(asset.Signer, signers.AssetKeySpace)
59         tplIn.AddRawWitnessKeys(asset.Signer.XPubs, path, asset.Signer.Quorum)
60
61         log.Info("Issue action build")
62         builder.RestrictMinTime(time.Now())
63         return builder.AddInput(txin, tplIn)
64 }