github.com/mavryk-network/mvgo@v1.19.9/internal/compose/alpha/task/token_revoke.go (about) 1 // Copyright (c) 2023 Blockwatch Data Inc. 2 // Author: alex@blockwatch.cc, abdul@blockwatch.cc 3 4 package task 5 6 import ( 7 "fmt" 8 9 "github.com/mavryk-network/mvgo/codec" 10 "github.com/mavryk-network/mvgo/contract" 11 "github.com/mavryk-network/mvgo/internal/compose" 12 "github.com/mavryk-network/mvgo/internal/compose/alpha" 13 "github.com/mavryk-network/mvgo/mavryk" 14 "github.com/mavryk-network/mvgo/rpc" 15 "github.com/mavryk-network/mvgo/signer" 16 17 "github.com/pkg/errors" 18 ) 19 20 var _ alpha.TaskBuilder = (*TokenRevokeTask)(nil) 21 22 func init() { 23 alpha.RegisterTask("token_revoke", NewTokenRevokeTask) 24 } 25 26 type TokenRevokeTask struct { 27 TargetTask 28 Spender mavryk.Address 29 Standard string 30 TokenId mavryk.Z 31 } 32 33 func NewTokenRevokeTask() alpha.TaskBuilder { 34 return &TokenRevokeTask{} 35 } 36 37 func (t *TokenRevokeTask) Type() string { 38 return "token_revoke" 39 } 40 41 func (t *TokenRevokeTask) Build(ctx compose.Context, task alpha.Task) (*codec.Op, *rpc.CallOptions, error) { 42 if err := t.parse(ctx, task); err != nil { 43 return nil, nil, errors.Wrap(err, "parse") 44 } 45 var xfer codec.Operation 46 switch t.Standard { 47 case "fa2", "": 48 xfer = contract.NewFA2ApprovalArgs(). 49 RemoveOperator(t.Source, t.Spender, t.TokenId). 50 WithSource(t.Source). 51 WithDestination(t.Destination). 52 Encode() 53 case "fa1", "fa12", "fa1.2": 54 xfer = contract.NewFA1ApprovalArgs(). 55 Revoke(t.Spender). 56 WithSource(t.Source). 57 WithDestination(t.Destination). 58 Encode() 59 } 60 61 opts := rpc.NewCallOptions() 62 opts.Signer = signer.NewFromKey(t.Key) 63 op := codec.NewOp().WithContents(xfer) 64 return op, opts, nil 65 } 66 67 func (t *TokenRevokeTask) Validate(ctx compose.Context, task alpha.Task) error { 68 return t.parse(ctx, task) 69 } 70 71 func (t *TokenRevokeTask) parse(ctx compose.Context, task alpha.Task) (err error) { 72 if err = t.TargetTask.parse(ctx, task); err != nil { 73 return err 74 } 75 if t.Standard, err = ctx.ResolveString(task.Args["standard"]); err != nil { 76 return errors.Wrap(err, "standard") 77 } 78 switch t.Standard { 79 case "fa2", "", "fa1", "fa12", "fa1.2": 80 // skip 81 default: 82 return fmt.Errorf("unsupported token standard %s", t.Standard) 83 } 84 if t.Spender, err = ctx.ResolveAddress(task.Args["spender"]); err != nil { 85 return errors.Wrap(err, "spender") 86 } 87 // only required for fa2 88 switch t.Standard { 89 case "fa2", "": 90 if t.TokenId, err = ctx.ResolveZ(task.Args["token_id"]); err != nil { 91 return errors.Wrap(err, "token_id") 92 } 93 } 94 return 95 }