--- /dev/null
+ Package coretest provides utilities for testing Chain Core.
+package coretest
+
+import (
+ "context"
+ "testing"
+ "time"
+
+ "github.com/bytom/account"
+ "github.com/bytom/asset"
+ "github.com/bytom/pin"
+ "github.com/bytom/query"
+ "github.com/bytom/txbuilder"
+ "github.com/bytom/crypto/ed25519/chainkd"
+ "github.com/bytom/protocol"
+ "github.com/bytom/protocol/bc"
+ "github.com/bytom/protocol/bc/legacy"
+ "github.com/bytom/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)
+ }
+}