package itests import ( "context" "fmt" "os" "regexp" "strings" "testing" "time" "github.com/filecoin-project/go-address" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/itests/kit" "github.com/stretchr/testify/require" ) // TestMultisig does a basic test to exercise the multisig CLI commands func TestMultisig(t *testing.T) { _ = os.Setenv("BELLMAN_NO_GPU", "1") kit.QuietMiningLogs() blocktime := 5 * time.Millisecond ctx := context.Background() clientNode, _ := kit.StartOneNodeOneMiner(ctx, t, blocktime) runMultisigTests(t, clientNode) } func runMultisigTests(t *testing.T, clientNode kit.TestFullNode) { // Create mock CLI ctx := context.Background() mockCLI := kit.NewMockCLI(ctx, t, cli.Commands) clientCLI := mockCLI.Client(clientNode.ListenAddr) // Create some wallets on the node to use for testing multisig var walletAddrs []address.Address for i := 0; i < 4; i++ { addr, err := clientNode.WalletNew(ctx, types.KTSecp256k1) require.NoError(t, err) walletAddrs = append(walletAddrs, addr) kit.SendFunds(ctx, t, clientNode, addr, types.NewInt(1e15)) } // Create an msig with three of the addresses and threshold of two sigs // msig create --required=2 --duration=50 --value=1000attofil amtAtto := types.NewInt(1000) threshold := 2 paramDuration := "--duration=50" paramRequired := fmt.Sprintf("--required=%d", threshold) paramValue := fmt.Sprintf("--value=%dattofil", amtAtto) out := clientCLI.RunCmd( "msig", "create", paramRequired, paramDuration, paramValue, walletAddrs[0].String(), walletAddrs[1].String(), walletAddrs[2].String(), ) fmt.Println(out) // Extract msig robust address from output expCreateOutPrefix := "Created new multisig:" require.Regexp(t, regexp.MustCompile(expCreateOutPrefix), out) parts := strings.Split(strings.TrimSpace(strings.Replace(out, expCreateOutPrefix, "", -1)), " ") require.Len(t, parts, 2) msigRobustAddr := parts[1] fmt.Println("msig robust address:", msigRobustAddr) // Propose to add a new address to the msig // msig add-propose --from= paramFrom := fmt.Sprintf("--from=%s", walletAddrs[0]) out = clientCLI.RunCmd( "msig", "add-propose", paramFrom, msigRobustAddr, walletAddrs[3].String(), ) fmt.Println(out) // msig inspect out = clientCLI.RunCmd("msig", "inspect", "--vesting", "--decode-params", msigRobustAddr) fmt.Println(out) // Expect correct balance require.Regexp(t, regexp.MustCompile("Balance: 0.000000000000001 FIL"), out) // Expect 1 transaction require.Regexp(t, regexp.MustCompile(`Transactions:\s*1`), out) // Expect transaction to be "AddSigner" require.Regexp(t, regexp.MustCompile(`AddSigner`), out) // Approve adding the new address // msig add-approve --from= 0 false txnID := "0" paramFrom = fmt.Sprintf("--from=%s", walletAddrs[1]) out = clientCLI.RunCmd( "msig", "add-approve", paramFrom, msigRobustAddr, walletAddrs[0].String(), txnID, walletAddrs[3].String(), "false", ) fmt.Println(out) }