OSDN Git Service

create-asset add user defined contract for issue-program (#1245)
[bytom/bytom-spv.git] / account / builder.go
index da4cb81..7679492 100644 (file)
@@ -2,7 +2,6 @@ package account
 
 import (
        "context"
-       "encoding/hex"
        "encoding/json"
 
        "github.com/bytom/blockchain/signers"
@@ -10,7 +9,6 @@ import (
        "github.com/bytom/common"
        "github.com/bytom/consensus"
        "github.com/bytom/crypto/ed25519/chainkd"
-       chainjson "github.com/bytom/encoding/json"
        "github.com/bytom/errors"
        "github.com/bytom/protocol/bc"
        "github.com/bytom/protocol/bc/types"
@@ -111,26 +109,9 @@ func (m *Manager) DecodeSpendUTXOAction(data []byte) (txbuilder.Action, error) {
 
 type spendUTXOAction struct {
        accounts       *Manager
-       OutputID       *bc.Hash           `json:"output_id"`
-       UseUnconfirmed bool               `json:"use_unconfirmed"`
-       Arguments      []contractArgument `json:"arguments"`
-}
-
-// contractArgument for smart contract
-type contractArgument struct {
-       Type    string          `json:"type"`
-       RawData json.RawMessage `json:"raw_data"`
-}
-
-// rawTxSigArgument is signature-related argument for run contract
-type rawTxSigArgument struct {
-       RootXPub chainkd.XPub         `json:"xpub"`
-       Path     []chainjson.HexBytes `json:"derivation_path"`
-}
-
-// dataArgument is the other argument for run contract
-type dataArgument struct {
-       Value string `json:"value"`
+       OutputID       *bc.Hash                     `json:"output_id"`
+       UseUnconfirmed bool                         `json:"use_unconfirmed"`
+       Arguments      []txbuilder.ContractArgument `json:"arguments"`
 }
 
 func (a *spendUTXOAction) Build(ctx context.Context, b *txbuilder.TemplateBuilder) error {
@@ -164,37 +145,10 @@ func (a *spendUTXOAction) Build(ctx context.Context, b *txbuilder.TemplateBuilde
        }
 
        sigInst = &txbuilder.SigningInstruction{}
-       for _, arg := range a.Arguments {
-               switch arg.Type {
-               case "raw_tx_signature":
-                       rawTxSig := &rawTxSigArgument{}
-                       if err = json.Unmarshal(arg.RawData, rawTxSig); err != nil {
-                               return err
-                       }
-
-                       // convert path form chainjson.HexBytes to byte
-                       var path [][]byte
-                       for _, p := range rawTxSig.Path {
-                               path = append(path, []byte(p))
-                       }
-                       sigInst.AddRawWitnessKeys([]chainkd.XPub{rawTxSig.RootXPub}, path, 1)
-
-               case "data":
-                       data := &dataArgument{}
-                       if err = json.Unmarshal(arg.RawData, data); err != nil {
-                               return err
-                       }
-
-                       value, err := hex.DecodeString(data.Value)
-                       if err != nil {
-                               return err
-                       }
-                       sigInst.WitnessComponents = append(sigInst.WitnessComponents, txbuilder.DataWitness(value))
-
-               default:
-                       return errors.New("contract argument type is not exist")
-               }
+       if err := txbuilder.AddContractArgs(sigInst, a.Arguments); err != nil {
+               return err
        }
+
        return b.AddInput(txInput, sigInst)
 }