forked from Onyx-Protocol/Onyx
/
builder.go
67 lines (55 loc) · 1.6 KB
/
builder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package asset
import (
"context"
"crypto/rand"
"encoding/json"
"time"
"chain/core/signers"
"chain/core/txbuilder"
"chain/database/pg"
chainjson "chain/encoding/json"
"chain/errors"
"chain/protocol/bc"
"chain/protocol/bc/legacy"
)
func (reg *Registry) NewIssueAction(assetAmount bc.AssetAmount, referenceData chainjson.Map) txbuilder.Action {
return &issueAction{
assets: reg,
AssetAmount: assetAmount,
ReferenceData: referenceData,
}
}
func (reg *Registry) DecodeIssueAction(data []byte) (txbuilder.Action, error) {
a := &issueAction{assets: reg}
err := json.Unmarshal(data, a)
return a, err
}
type issueAction struct {
assets *Registry
bc.AssetAmount
ReferenceData chainjson.Map `json:"reference_data"`
}
func (a *issueAction) Build(ctx context.Context, builder *txbuilder.TemplateBuilder) error {
if a.AssetId.IsZero() {
return txbuilder.MissingFieldsError("asset_id")
}
asset, err := a.assets.findByID(ctx, *a.AssetId)
if errors.Root(err) == pg.ErrUserInputNotFound {
err = errors.WithDetailf(err, "missing asset with ID %x", a.AssetId.Bytes())
}
if err != nil {
return err
}
var nonce [8]byte
_, err = rand.Read(nonce[:])
if err != nil {
return err
}
assetdef := asset.RawDefinition()
txin := legacy.NewIssuanceInput(nonce[:], a.Amount, a.ReferenceData, asset.InitialBlockHash, asset.IssuanceProgram, nil, assetdef)
tplIn := &txbuilder.SigningInstruction{}
path := signers.Path(asset.Signer, signers.AssetKeySpace)
tplIn.AddWitnessKeys(asset.Signer.XPubs, path, asset.Signer.Quorum)
builder.RestrictMinTime(time.Now())
return builder.AddInput(txin, tplIn)
}