2021-06-22 20:25:04 +00:00
|
|
|
package multisig
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
2022-06-14 15:00:51 +00:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
2021-06-22 20:25:04 +00:00
|
|
|
"github.com/filecoin-project/go-address"
|
2022-06-14 15:00:51 +00:00
|
|
|
|
2021-08-12 18:01:24 +00:00
|
|
|
"github.com/filecoin-project/lotus/api"
|
2021-06-22 20:25:04 +00:00
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
|
|
"github.com/filecoin-project/lotus/cli"
|
|
|
|
"github.com/filecoin-project/lotus/itests/kit"
|
|
|
|
)
|
|
|
|
|
2021-06-23 16:33:17 +00:00
|
|
|
func RunMultisigTests(t *testing.T, client *kit.TestFullNode) {
|
2021-06-22 20:25:04 +00:00
|
|
|
// Create mock CLI
|
|
|
|
ctx := context.Background()
|
2021-08-12 18:03:19 +00:00
|
|
|
mockCLI := kit.NewMockCLI(ctx, t, cli.Commands, api.NodeFull)
|
2021-06-23 16:33:17 +00:00
|
|
|
clientCLI := mockCLI.Client(client.ListenAddr)
|
2021-06-22 20:25:04 +00:00
|
|
|
|
|
|
|
// Create some wallets on the node to use for testing multisig
|
|
|
|
var walletAddrs []address.Address
|
|
|
|
for i := 0; i < 4; i++ {
|
2021-06-23 16:33:17 +00:00
|
|
|
addr, err := client.WalletNew(ctx, types.KTSecp256k1)
|
2021-06-22 20:25:04 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
walletAddrs = append(walletAddrs, addr)
|
|
|
|
|
2021-06-23 16:33:17 +00:00
|
|
|
kit.SendFunds(ctx, t, client, addr, types.NewInt(1e15))
|
2021-06-22 20:25:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Create an msig with three of the addresses and threshold of two sigs
|
|
|
|
// msig create --required=2 --duration=50 --value=1000attofil <addr1> <addr2> <addr3>
|
|
|
|
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=<addr> <msig> <addr>
|
|
|
|
paramFrom := fmt.Sprintf("--from=%s", walletAddrs[0])
|
|
|
|
out = clientCLI.RunCmd(
|
|
|
|
"msig", "add-propose",
|
|
|
|
paramFrom,
|
|
|
|
msigRobustAddr,
|
|
|
|
walletAddrs[3].String(),
|
|
|
|
)
|
|
|
|
fmt.Println(out)
|
|
|
|
|
|
|
|
// msig inspect <msig>
|
|
|
|
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=<addr> <msig> <addr> 0 <addr> 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)
|
|
|
|
}
|