5 stdjson "encoding/json"
12 ipfs "github.com/ipfs/go-ipfs-api"
13 "github.com/vapor/common"
14 "github.com/vapor/consensus"
15 "github.com/vapor/encoding/json"
16 "github.com/vapor/protocol/bc"
17 "github.com/vapor/protocol/bc/types"
18 "github.com/vapor/protocol/vm/vmutil"
21 // DecodeControlAddressAction convert input data to action struct
22 func DecodeControlAddressAction(data []byte) (Action, error) {
23 a := new(controlAddressAction)
24 err := stdjson.Unmarshal(data, a)
28 type controlAddressAction struct {
30 Address string `json:"address"`
33 func (a *controlAddressAction) Build(ctx context.Context, b *TemplateBuilder) error {
36 missing = append(missing, "address")
38 if a.AssetId.IsZero() {
39 missing = append(missing, "asset_id")
42 missing = append(missing, "amount")
45 return MissingFieldsError(missing...)
48 address, err := common.DecodeAddress(a.Address, &consensus.ActiveNetParams)
52 redeemContract := address.ScriptAddress()
55 switch address.(type) {
56 case *common.AddressWitnessPubKeyHash:
57 program, err = vmutil.P2WPKHProgram(redeemContract)
58 case *common.AddressWitnessScriptHash:
59 program, err = vmutil.P2WSHProgram(redeemContract)
61 return errors.New("unsupport address type")
67 out := types.NewTxOutput(*a.AssetId, a.Amount, program)
68 return b.AddOutput(out)
71 func (a *controlAddressAction) ActionType() string {
72 return "control_address"
75 // DecodeControlProgramAction convert input data to action struct
76 func DecodeControlProgramAction(data []byte) (Action, error) {
77 a := new(controlProgramAction)
78 err := stdjson.Unmarshal(data, a)
82 type controlProgramAction struct {
84 Program json.HexBytes `json:"control_program"`
87 func (a *controlProgramAction) Build(ctx context.Context, b *TemplateBuilder) error {
89 if len(a.Program) == 0 {
90 missing = append(missing, "control_program")
92 if a.AssetId.IsZero() {
93 missing = append(missing, "asset_id")
96 missing = append(missing, "amount")
99 return MissingFieldsError(missing...)
102 out := types.NewTxOutput(*a.AssetId, a.Amount, a.Program)
103 return b.AddOutput(out)
106 func (a *controlProgramAction) ActionType() string {
107 return "control_program"
110 // DecodeRetireAction convert input data to action struct
111 func DecodeRetireAction(data []byte) (Action, error) {
112 a := new(retireAction)
113 err := stdjson.Unmarshal(data, a)
117 type retireAction struct {
119 Arbitrary json.HexBytes `json:"arbitrary"`
122 func (a *retireAction) Build(ctx context.Context, b *TemplateBuilder) error {
124 if a.AssetId.IsZero() {
125 missing = append(missing, "asset_id")
128 missing = append(missing, "amount")
130 if len(missing) > 0 {
131 return MissingFieldsError(missing...)
134 program, err := vmutil.RetireProgram(a.Arbitrary)
138 out := types.NewTxOutput(*a.AssetId, a.Amount, program)
139 return b.AddOutput(out)
142 func (a *retireAction) ActionType() string {
151 type dataAction struct {
152 Type uint32 `json:"type"`
153 Data string `json:"data"`
156 func (a *dataAction) Build(ctx context.Context, b *TemplateBuilder) error {
163 fi, err := os.Stat(a.Data)
164 if os.IsNotExist(err) {
168 return fmt.Errorf("data [%s] is directory", a.Data)
170 r, err = os.Open(a.Data)
177 return errors.New("data is empty")
180 r = strings.NewReader(a.Data)
185 sh := ipfs.NewShell("localhost:5001")
186 cid, err := sh.Add(r)