From c2148ba106d7491f145c793f1c9fd9a20654e33c Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 15 Sep 2020 19:27:36 -0400 Subject: [PATCH] Multisig: Add a CLI command to propose locking some balance --- cli/multisig.go | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/cli/multisig.go b/cli/multisig.go index 4596628f4..01e922a07 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -11,6 +11,10 @@ import ( "strconv" "text/tabwriter" + "github.com/filecoin-project/lotus/chain/actors" + + "github.com/filecoin-project/go-state-types/big" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/util/adt" @@ -43,6 +47,9 @@ var multisigCmd = &cli.Command{ msigSwapProposeCmd, msigSwapApproveCmd, msigSwapCancelCmd, + msigLockProposeCmd, + msigLockApproveCmd, + msigLockCancelCmd, msigVestedCmd, }, } @@ -971,6 +978,93 @@ var msigSwapCancelCmd = &cli.Command{ }, } +var msigLockProposeCmd = &cli.Command{ + Name: "lock-propose", + Usage: "Propose to lock up some balance", + ArgsUsage: "[multisigAddress startEpoch unlockDuration amount]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "from", + Usage: "account to send the approve message from", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.Args().Len() != 4 { + return ShowHelp(cctx, fmt.Errorf("must pass multisig address, start epoch, unlock duration, and amount")) + } + + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + msig, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + start, err := strconv.ParseUint(cctx.Args().Get(1), 10, 64) + if err != nil { + return err + } + + duration, err := strconv.ParseUint(cctx.Args().Get(2), 10, 64) + if err != nil { + return err + } + + amount, err := types.ParseFIL(cctx.Args().Get(3)) + if err != nil { + return err + } + + var from address.Address + if cctx.IsSet("from") { + f, err := address.NewFromString(cctx.String("from")) + if err != nil { + return err + } + from = f + } else { + defaddr, err := api.WalletDefaultAddress(ctx) + if err != nil { + return err + } + from = defaddr + } + + params, actErr := actors.SerializeParams(&samsig.LockBalanceParams{ + StartEpoch: abi.ChainEpoch(start), + UnlockDuration: abi.ChainEpoch(duration), + Amount: abi.NewTokenAmount(amount.Int64()), + }) + + if actErr != nil { + return actErr + } + + msgCid, err := api.MsigPropose(ctx, msig, msig, big.Zero(), from, uint64(builtin.MethodsMultisig.LockBalance), params) + if err != nil { + return err + } + + fmt.Println("sent lock proposal in message: ", msgCid) + + wait, err := api.StateWaitMsg(ctx, msgCid, build.MessageConfidence) + if err != nil { + return err + } + + if wait.Receipt.ExitCode != 0 { + return fmt.Errorf("lock proposal returned exit %d", wait.Receipt.ExitCode) + } + + return nil + }, +} + var msigVestedCmd = &cli.Command{ Name: "vested", Usage: "Gets the amount vested in an msig between two epochs",