-
Notifications
You must be signed in to change notification settings - Fork 0
/
transfer_from.go
81 lines (64 loc) · 1.96 KB
/
transfer_from.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
package cmds
import (
"context"
"github.com/ProtoconNet/mitum-point/operation/point"
currencycmds "github.com/ProtoconNet/mitum-currency/v3/cmds"
"github.com/ProtoconNet/mitum-point/utils"
"github.com/pkg/errors"
"github.com/ProtoconNet/mitum2/base"
"github.com/ProtoconNet/mitum2/util"
)
type TransferFromCommand struct {
OperationCommand
Receiver currencycmds.AddressFlag `arg:"" name:"receiver" help:"point receiver" required:"true"`
Target currencycmds.AddressFlag `arg:"" name:"target" help:"target approving" required:"true"`
Amount currencycmds.BigFlag `arg:"" name:"amount" help:"amount to transfer" required:"true"`
receiver base.Address
target base.Address
}
func (cmd *TransferFromCommand) Run(pctx context.Context) error { // nolint:dupl
if _, err := cmd.prepare(pctx); err != nil {
return err
}
if err := cmd.parseFlags(); err != nil {
return err
}
op, err := cmd.createOperation()
if err != nil {
return err
}
currencycmds.PrettyPrint(cmd.Out, op)
return nil
}
func (cmd *TransferFromCommand) parseFlags() error {
if err := cmd.OperationCommand.parseFlags(); err != nil {
return err
}
receiver, err := cmd.Receiver.Encode(cmd.Encoders.JSON())
if err != nil {
return errors.Wrapf(err, "invalid receiver format, %q", cmd.Receiver.String())
}
cmd.receiver = receiver
target, err := cmd.Target.Encode(cmd.Encoders.JSON())
if err != nil {
return errors.Wrapf(err, "invalid target format, %q", cmd.Target.String())
}
cmd.target = target
return nil
}
func (cmd *TransferFromCommand) createOperation() (base.Operation, error) { // nolint:dupl}
e := util.StringError(utils.ErrStringCreate("transfer-from operation"))
fact := point.NewTransferFromFact(
[]byte(cmd.Token),
cmd.sender, cmd.contract,
cmd.Currency.CID,
cmd.receiver,
cmd.target,
cmd.Amount.Big,
)
op := point.NewTransferFrom(fact)
if err := op.Sign(cmd.Privatekey, cmd.NetworkID.NetworkID()); err != nil {
return nil, e.Wrap(err)
}
return op, nil
}