/
fixtures.go
106 lines (91 loc) · 3 KB
/
fixtures.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Package coretest provides utilities for testing Chain Core.
package coretest
import (
"context"
"testing"
"time"
"chain/core/account"
"chain/core/asset"
"chain/core/pin"
"chain/core/query"
"chain/core/txbuilder"
"chain/crypto/ed25519/chainkd"
"chain/protocol"
"chain/protocol/bc"
"chain/protocol/bc/legacy"
"chain/testutil"
)
func CreatePins(ctx context.Context, t testing.TB, s *pin.Store) {
pins := []string{
account.PinName,
account.ExpirePinName,
account.DeleteSpentsPinName,
asset.PinName,
query.TxPinName,
}
for _, p := range pins {
err := s.CreatePin(ctx, p, 0)
if err != nil {
testutil.FatalErr(t, err)
}
}
}
func CreateAccount(ctx context.Context, t testing.TB, accounts *account.Manager, alias string, tags map[string]interface{}) string {
keys := []chainkd.XPub{testutil.TestXPub}
acc, err := accounts.Create(ctx, keys, 1, alias, tags, "")
if err != nil {
testutil.FatalErr(t, err)
}
return acc.ID
}
func CreateAsset(ctx context.Context, t testing.TB, assets *asset.Registry, def map[string]interface{}, alias string, tags map[string]interface{}) bc.AssetID {
keys := []chainkd.XPub{testutil.TestXPub}
asset, err := assets.Define(ctx, keys, 1, def, alias, tags, "")
if err != nil {
testutil.FatalErr(t, err)
}
return asset.AssetID
}
func IssueAssets(ctx context.Context, t testing.TB, c *protocol.Chain, s txbuilder.Submitter, assets *asset.Registry, accounts *account.Manager, assetID bc.AssetID, amount uint64, accountID string) (*legacy.TxOutput, *bc.Output, bc.Hash) {
assetAmount := bc.AssetAmount{AssetId: &assetID, Amount: amount}
tpl, err := txbuilder.Build(ctx, nil, []txbuilder.Action{
assets.NewIssueAction(assetAmount, nil), // does not support reference data
accounts.NewControlAction(assetAmount, accountID, nil),
}, time.Now().Add(time.Hour))
if err != nil {
testutil.FatalErr(t, err)
}
SignTxTemplate(t, ctx, tpl, &testutil.TestXPrv)
err = txbuilder.FinalizeTx(ctx, c, s, tpl.Transaction)
if err != nil {
testutil.FatalErr(t, err)
}
outID0 := tpl.Transaction.OutputID(0)
out0 := tpl.Transaction.Entries[*outID0].(*bc.Output)
return tpl.Transaction.Outputs[0], out0, *outID0
}
func Transfer(ctx context.Context, t testing.TB, c *protocol.Chain, s txbuilder.Submitter, actions []txbuilder.Action) *legacy.Tx {
template, err := txbuilder.Build(ctx, nil, actions, time.Now().Add(time.Hour))
if err != nil {
testutil.FatalErr(t, err)
}
SignTxTemplate(t, ctx, template, &testutil.TestXPrv)
tx := legacy.NewTx(template.Transaction.TxData)
err = txbuilder.FinalizeTx(ctx, c, s, tx)
if err != nil {
testutil.FatalErr(t, err)
}
return tx
}
func SignTxTemplate(t testing.TB, ctx context.Context, template *txbuilder.Template, priv *chainkd.XPrv) {
if priv == nil {
priv = &testutil.TestXPrv
}
err := txbuilder.Sign(ctx, template, []chainkd.XPub{priv.XPub()}, func(_ context.Context, _ chainkd.XPub, path [][]byte, data [32]byte) ([]byte, error) {
derived := priv.Derive(path)
return derived.Sign(data[:]), nil
})
if err != nil {
t.Fatal(err)
}
}