From 14341913a362fdca983f8dc728299597dc38f39d Mon Sep 17 00:00:00 2001 From: John Letey Date: Thu, 23 Nov 2023 14:38:14 +0100 Subject: [PATCH] feat: rebuild e2e tests --- .github/workflows/simulation-tests.yaml | 4 +- .github/workflows/unit-tests.yaml | 8 +- app/app.go | 1 + app/upgrades/krypton/constants.go | 3 + app/upgrades/krypton/upgrade.go | 5 + interchaintest/cctp_deposit_for_burn_test.go | 77 +-- .../cctp_deposit_for_burn_with_caller_test.go | 77 +-- interchaintest/cctp_receive_message_test.go | 67 +- .../cctp_receive_message_with_caller_test.go | 69 +- .../cctp_replace_deposit_for_burn_test.go | 79 +-- interchaintest/cctp_roles_test.go | 165 ++--- interchaintest/genesis_test.go | 7 +- interchaintest/globalfee_test.go | 61 +- interchaintest/go.mod | 5 +- interchaintest/go.sum | 4 +- interchaintest/ibc_bps_fee_test.go | 117 +--- .../ibc_client_expire_substitute_test.go | 135 +--- interchaintest/ics_migration_test.go | 51 +- interchaintest/noble_test.go | 35 +- interchaintest/packet_forward_test.go | 637 ------------------ interchaintest/paramauthority_test.go | 79 +-- interchaintest/setup_test.go | 107 +++ interchaintest/upgrade_argon_test.go | 10 +- proto/tariff/params.proto | 6 + x/tariff/keeper/allocation.go | 4 +- x/tariff/keeper/keeper.go | 23 +- x/tariff/types/params.go | 17 + x/tariff/types/params.pb.go | 106 ++- .../client/cli/query_blacklisted_test.go | 165 ----- .../client/cli/query_blacklister_test.go | 72 -- .../client/cli/query_master_minter_test.go | 72 -- .../cli/query_minter_controller_test.go | 161 ----- .../client/cli/query_minters_test.go | 161 ----- .../client/cli/query_minting_denom_test.go | 86 --- x/tokenfactory/client/cli/query_owner_test.go | 72 -- .../client/cli/query_paused_test.go | 72 -- .../client/cli/query_pauser_test.go | 72 -- 37 files changed, 578 insertions(+), 2314 deletions(-) delete mode 100644 interchaintest/packet_forward_test.go create mode 100644 interchaintest/setup_test.go delete mode 100644 x/tokenfactory/client/cli/query_blacklisted_test.go delete mode 100644 x/tokenfactory/client/cli/query_blacklister_test.go delete mode 100644 x/tokenfactory/client/cli/query_master_minter_test.go delete mode 100644 x/tokenfactory/client/cli/query_minter_controller_test.go delete mode 100644 x/tokenfactory/client/cli/query_minters_test.go delete mode 100644 x/tokenfactory/client/cli/query_minting_denom_test.go delete mode 100644 x/tokenfactory/client/cli/query_owner_test.go delete mode 100644 x/tokenfactory/client/cli/query_paused_test.go delete mode 100644 x/tokenfactory/client/cli/query_pauser_test.go diff --git a/.github/workflows/simulation-tests.yaml b/.github/workflows/simulation-tests.yaml index 2e1c9dbe..5bc48ac7 100644 --- a/.github/workflows/simulation-tests.yaml +++ b/.github/workflows/simulation-tests.yaml @@ -1,7 +1,7 @@ name: Simulation Tests on: - pull_request: + workflow_dispatch: jobs: simulation-tests: @@ -15,5 +15,5 @@ jobs: with: go-version: 1.21 - - name: Run Unit Tests + - name: Run Simulation Tests run: go test -bench BenchmarkSimulation ./app diff --git a/.github/workflows/unit-tests.yaml b/.github/workflows/unit-tests.yaml index fad47f29..5ccb9b3e 100644 --- a/.github/workflows/unit-tests.yaml +++ b/.github/workflows/unit-tests.yaml @@ -5,15 +5,15 @@ on: jobs: unit-tests: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout Repository + uses: actions/checkout@v4 - - name: Set up Go + - name: Install Go uses: actions/setup-go@v4 with: - go-version: ^1.21 + go-version: 1.21 - name: Run Unit Tests run: go test -v ./... diff --git a/app/app.go b/app/app.go index a71b9e17..522a83c5 100644 --- a/app/app.go +++ b/app/app.go @@ -384,6 +384,7 @@ func New( app.GetSubspace(tarifftypes.ModuleName), app.AccountKeeper, app.BankKeeper, + authtypes.FeeCollectorName, consumertypes.ConsumerRedistributeName, app.IBCKeeper.ChannelKeeper, ) diff --git a/app/upgrades/krypton/constants.go b/app/upgrades/krypton/constants.go index 7ebbc327..171fe707 100644 --- a/app/upgrades/krypton/constants.go +++ b/app/upgrades/krypton/constants.go @@ -2,3 +2,6 @@ package krypton // UpgradeName is the name of this specific software upgrade used on-chain. const UpgradeName = "krypton" + +// RehearsalChainID is the Chain ID of the Noble Replicated Security rehearsal network. +const RehearsalChainID = "grand-rehearsal-1" diff --git a/app/upgrades/krypton/upgrade.go b/app/upgrades/krypton/upgrade.go index c2279ee3..fc15e476 100644 --- a/app/upgrades/krypton/upgrade.go +++ b/app/upgrades/krypton/upgrade.go @@ -1,6 +1,7 @@ package krypton import ( + "errors" "fmt" "os" @@ -24,6 +25,10 @@ func CreateUpgradeHandler( fiatTokenFactoryKeeper *fiattokenfactorykeeper.Keeper, ) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + if ctx.ChainID() != RehearsalChainID { + return vm, errors.New(fmt.Sprintf("%s upgrade not allowed to execute on %s chain", UpgradeName, ctx.ChainID())) + } + vm, err := mm.RunMigrations(ctx, configurator, vm) if err != nil { return vm, err diff --git a/interchaintest/cctp_deposit_for_burn_test.go b/interchaintest/cctp_deposit_for_burn_test.go index e536f3e1..00712571 100644 --- a/interchaintest/cctp_deposit_for_burn_test.go +++ b/interchaintest/cctp_deposit_for_burn_test.go @@ -6,15 +6,13 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/crypto" - cosmossdk_io_math "cosmossdk.io/math" cctptypes "github.com/circlefin/noble-cctp/x/cctp/types" sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/noble-assets/noble/v5/cmd" + "github.com/ethereum/go-ethereum/crypto" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -31,68 +29,47 @@ func TestCCTP_DepositForBurn(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "grand-1", nv, nf, false, false, true, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, true, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - cmd.SetPrefixes(noble.Config().Bech32Prefix) - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error nobleValidator := noble.Validators[0] // SET UP FIAT TOKEN FACTORY AND MINT - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), gw.fiatTfRoles.Minter.FormattedAddress(), "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), wrapper.fiatTfRoles.Minter.FormattedAddress(), "-b", "block", ) require.NoError(t, err, "failed to execute configure minter controller tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), - "fiat-tokenfactory", "configure-minter", gw.fiatTfRoles.Minter.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), + "fiat-tokenfactory", "configure-minter", wrapper.fiatTfRoles.Minter.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.Minter.KeyName(), - "fiat-tokenfactory", "mint", gw.extraWallets.User.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.Minter.KeyName(), + "fiat-tokenfactory", "mint", wrapper.extraWallets.User.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute mint to user tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), cctptypes.ModuleAddress.String(), "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), cctptypes.ModuleAddress.String(), "-b", "block", ) require.NoError(t, err, "failed to configure cctp minter controller") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), "fiat-tokenfactory", "configure-minter", cctptypes.ModuleAddress.String(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to configure cctp minter") @@ -113,13 +90,13 @@ func TestCCTP_DepositForBurn(t *testing.T) { msgs := []sdk.Msg{} msgs = append(msgs, &cctptypes.MsgAddRemoteTokenMessenger{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), DomainId: 0, Address: tokenMessenger, }) msgs = append(msgs, &cctptypes.MsgLinkTokenPair{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), RemoteDomain: 0, RemoteToken: burnToken, LocalToken: denomMetadataUsdc.Base, @@ -131,20 +108,20 @@ func TestCCTP_DepositForBurn(t *testing.T) { tx, err := cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, + wrapper.fiatTfRoles.Owner, msgs..., ) require.NoError(t, err, "error configuring remote domain") require.Zero(t, tx.Code, "configuring remote domain failed: %s - %s - %s", tx.Codespace, tx.RawLog, tx.Data) - beforeBurnBal, err := noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + beforeBurnBal, err := noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err) mintRecipient := make([]byte, 32) copy(mintRecipient[12:], common.FromHex("0xfCE4cE85e1F74C01e0ecccd8BbC4606f83D3FC90")) depositForBurnNoble := &cctptypes.MsgDepositForBurn{ - From: gw.extraWallets.User.FormattedAddress(), + From: wrapper.extraWallets.User.FormattedAddress(), Amount: cosmossdk_io_math.NewInt(1000000), BurnToken: denomMetadataUsdc.Base, DestinationDomain: 0, @@ -154,13 +131,13 @@ func TestCCTP_DepositForBurn(t *testing.T) { tx, err = cosmos.BroadcastTx( bCtx, broadcaster, - gw.extraWallets.User, + wrapper.extraWallets.User, depositForBurnNoble, ) require.NoError(t, err, "error broadcasting msgDepositForBurn") require.Zero(t, tx.Code, "msgDepositForBurn failed: %s - %s - %s", tx.Codespace, tx.RawLog, tx.Data) - afterBurnBal, err := noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + afterBurnBal, err := noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err) require.Equal(t, afterBurnBal, beforeBurnBal-1000000) @@ -178,7 +155,7 @@ func TestCCTP_DepositForBurn(t *testing.T) { require.Equal(t, uint64(0), depositForBurn.Nonce) require.Equal(t, expectedBurnToken, depositForBurn.BurnToken) require.Equal(t, depositForBurnNoble.Amount, depositForBurn.Amount) - require.Equal(t, gw.extraWallets.User.FormattedAddress(), depositForBurn.Depositor) + require.Equal(t, wrapper.extraWallets.User.FormattedAddress(), depositForBurn.Depositor) require.Equal(t, mintRecipient, depositForBurn.MintRecipient) require.Equal(t, uint32(0), depositForBurn.DestinationDomain) require.Equal(t, tokenMessenger, depositForBurn.DestinationTokenMessenger) @@ -199,7 +176,7 @@ func TestCCTP_DepositForBurn(t *testing.T) { expectedBurnToken := crypto.Keccak256([]byte(depositForBurnNoble.BurnToken)) moduleAddress := make([]byte, 32) - copy(moduleAddress[12:], sdk.MustAccAddressFromBech32(gw.extraWallets.User.FormattedAddress())) + copy(moduleAddress[12:], sdk.MustAccAddressFromBech32(wrapper.extraWallets.User.FormattedAddress())) destinationCaller := make([]byte, 32) diff --git a/interchaintest/cctp_deposit_for_burn_with_caller_test.go b/interchaintest/cctp_deposit_for_burn_with_caller_test.go index 572df8d6..952497f7 100644 --- a/interchaintest/cctp_deposit_for_burn_with_caller_test.go +++ b/interchaintest/cctp_deposit_for_burn_with_caller_test.go @@ -6,15 +6,13 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/crypto" - cosmossdk_io_math "cosmossdk.io/math" cctptypes "github.com/circlefin/noble-cctp/x/cctp/types" sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/ethereum/go-ethereum/common" - "github.com/noble-assets/noble/v5/cmd" + "github.com/ethereum/go-ethereum/crypto" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -31,68 +29,47 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "grand-1", nv, nf, false, false, true, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, true, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - cmd.SetPrefixes(noble.Config().Bech32Prefix) - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error nobleValidator := noble.Validators[0] // SET UP FIAT TOKEN FACTORY AND MINT - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), gw.fiatTfRoles.Minter.FormattedAddress(), "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), wrapper.fiatTfRoles.Minter.FormattedAddress(), "-b", "block", ) require.NoError(t, err, "failed to execute configure minter controller tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), - "fiat-tokenfactory", "configure-minter", gw.fiatTfRoles.Minter.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), + "fiat-tokenfactory", "configure-minter", wrapper.fiatTfRoles.Minter.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.Minter.KeyName(), - "fiat-tokenfactory", "mint", gw.extraWallets.User.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.Minter.KeyName(), + "fiat-tokenfactory", "mint", wrapper.extraWallets.User.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute mint to user tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), cctptypes.ModuleAddress.String(), "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), cctptypes.ModuleAddress.String(), "-b", "block", ) require.NoError(t, err, "failed to configure cctp minter controller") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), "fiat-tokenfactory", "configure-minter", cctptypes.ModuleAddress.String(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to configure cctp minter") @@ -113,13 +90,13 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { msgs := []sdk.Msg{} msgs = append(msgs, &cctptypes.MsgAddRemoteTokenMessenger{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), DomainId: 0, Address: tokenMessenger, }) msgs = append(msgs, &cctptypes.MsgLinkTokenPair{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), RemoteDomain: 0, RemoteToken: burnToken, LocalToken: denomMetadataUsdc.Base, @@ -131,13 +108,13 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { tx, err := cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, + wrapper.fiatTfRoles.Owner, msgs..., ) require.NoError(t, err, "error configuring remote domain") require.Zero(t, tx.Code, "configuring remote domain failed: %s - %s - %s", tx.Codespace, tx.RawLog, tx.Data) - beforeBurnBal, err := noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + beforeBurnBal, err := noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err) mintRecipient := make([]byte, 32) @@ -146,7 +123,7 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { destinationCaller := []byte("12345678901234567890123456789012") depositForBurnWithCallerNoble := &cctptypes.MsgDepositForBurnWithCaller{ - From: gw.extraWallets.User.FormattedAddress(), + From: wrapper.extraWallets.User.FormattedAddress(), Amount: cosmossdk_io_math.NewInt(1000000), BurnToken: denomMetadataUsdc.Base, DestinationDomain: 0, @@ -157,13 +134,13 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { tx, err = cosmos.BroadcastTx( bCtx, broadcaster, - gw.extraWallets.User, + wrapper.extraWallets.User, depositForBurnWithCallerNoble, ) require.NoError(t, err, "error broadcasting msgDepositForBurnWithCaller") require.Zero(t, tx.Code, "msgDepositForBurnWithCaller failed: %s - %s - %s", tx.Codespace, tx.RawLog, tx.Data) - afterBurnBal, err := noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + afterBurnBal, err := noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err) require.Equal(t, afterBurnBal, beforeBurnBal-1000000) @@ -181,7 +158,7 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { require.Equal(t, uint64(0), depositForBurn.Nonce) require.Equal(t, expectedBurnToken, depositForBurn.BurnToken) require.Equal(t, depositForBurnWithCallerNoble.Amount, depositForBurn.Amount) - require.Equal(t, gw.extraWallets.User.FormattedAddress(), depositForBurn.Depositor) + require.Equal(t, wrapper.extraWallets.User.FormattedAddress(), depositForBurn.Depositor) require.Equal(t, mintRecipient, depositForBurn.MintRecipient) require.Equal(t, uint32(0), depositForBurn.DestinationDomain) require.Equal(t, tokenMessenger, depositForBurn.DestinationTokenMessenger) @@ -202,7 +179,7 @@ func TestCCTP_DepositForBurnWithCaller(t *testing.T) { expectedBurnToken := crypto.Keccak256([]byte(depositForBurnWithCallerNoble.BurnToken)) moduleAddress := make([]byte, 32) - copy(moduleAddress[12:], sdk.MustAccAddressFromBech32(gw.extraWallets.User.FormattedAddress())) + copy(moduleAddress[12:], sdk.MustAccAddressFromBech32(wrapper.extraWallets.User.FormattedAddress())) require.Equal(t, uint32(0), message.Version) require.Equal(t, uint32(4), message.SourceDomain) diff --git a/interchaintest/cctp_receive_message_test.go b/interchaintest/cctp_receive_message_test.go index a72e9884..8f4dfedb 100644 --- a/interchaintest/cctp_receive_message_test.go +++ b/interchaintest/cctp_receive_message_test.go @@ -19,7 +19,6 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/noble-assets/noble/v5/cmd" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -36,44 +35,22 @@ func TestCCTP_ReceiveMessage(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", nv, nf, true, false, true, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + true, false, true, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain().AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) - nobleChainCfg := noble.Config() - - cmd.SetPrefixes(nobleChainCfg.Bech32Prefix) + var err error attesters := make([]*ecdsa.PrivateKey, 2) msgs := make([]sdk.Msg, 2) @@ -85,13 +62,13 @@ func TestCCTP_ReceiveMessage(t *testing.T) { attesters[i] = p - pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) //public key + pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) // public key attesterPub := hex.EncodeToString(pubKey) // Adding an attester to protocal msgs[i] = &cctptypes.MsgEnableAttester{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), Attester: attesterPub, } } @@ -108,7 +85,7 @@ func TestCCTP_ReceiveMessage(t *testing.T) { // maps remote token on remote domain to a local token -- used for minting msgs = append(msgs, &cctptypes.MsgLinkTokenPair{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), RemoteDomain: 0, RemoteToken: burnToken, LocalToken: denomMetadataUsdc.Base, @@ -120,7 +97,7 @@ func TestCCTP_ReceiveMessage(t *testing.T) { tx, err := cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, + wrapper.fiatTfRoles.Owner, msgs..., ) require.NoError(t, err, "error submitting add public keys tx") @@ -135,22 +112,22 @@ func TestCCTP_ReceiveMessage(t *testing.T) { cctpModuleAccount := authtypes.NewModuleAddress(cctptypes.ModuleName).String() - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), cctpModuleAccount, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), cctpModuleAccount, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter controller tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), "fiat-tokenfactory", "configure-minter", cctpModuleAccount, "1000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter tx") - const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" //account + const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" // account receiverBz, err := hex.DecodeString(receiver) require.NoError(t, err) - nobleReceiver, err := bech32.ConvertAndEncode(nobleChainCfg.Bech32Prefix, receiverBz) + nobleReceiver, err := bech32.ConvertAndEncode(noble.Config().Bech32Prefix, receiverBz) require.NoError(t, err) burnRecipientPadded := append([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, receiverBz...) @@ -166,7 +143,7 @@ func TestCCTP_ReceiveMessage(t *testing.T) { depositForBurnBz, err := depositForBurn.Bytes() require.NoError(t, err) - var senderBurn = []byte("12345678901234567890123456789012") + senderBurn := []byte("12345678901234567890123456789012") emptyDestinationCaller := make([]byte, 32) @@ -186,7 +163,7 @@ func TestCCTP_ReceiveMessage(t *testing.T) { digestBurn := crypto.Keccak256(wrappedDepositForBurnBz) // hashed message is the key to the attestation - attestationBurn := make([]byte, 0, len(attesters)*65) //65 byte + attestationBurn := make([]byte, 0, len(attesters)*65) // 65 byte // CCTP requires attestations to have signatures sorted by address sort.Slice(attesters, func(i, j int) bool { @@ -210,9 +187,9 @@ func TestCCTP_ReceiveMessage(t *testing.T) { tx, err = cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, - &cctptypes.MsgReceiveMessage{ //note: all messages that go to noble go through MsgReceiveMessage - From: gw.fiatTfRoles.Owner.FormattedAddress(), + wrapper.fiatTfRoles.Owner, + &cctptypes.MsgReceiveMessage{ // note: all messages that go to noble go through MsgReceiveMessage + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), Message: wrappedDepositForBurnBz, Attestation: attestationBurn, }, diff --git a/interchaintest/cctp_receive_message_with_caller_test.go b/interchaintest/cctp_receive_message_with_caller_test.go index a85cfdcf..69eba309 100644 --- a/interchaintest/cctp_receive_message_with_caller_test.go +++ b/interchaintest/cctp_receive_message_with_caller_test.go @@ -19,7 +19,6 @@ import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/noble-assets/noble/v5/cmd" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -36,44 +35,22 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", nv, nf, true, false, true, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + true, false, true, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain().AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) - nobleChainCfg := noble.Config() - - cmd.SetPrefixes(nobleChainCfg.Bech32Prefix) + var err error attesters := make([]*ecdsa.PrivateKey, 2) msgs := make([]sdk.Msg, 2) @@ -85,13 +62,13 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { attesters[i] = p - pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) //public key + pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) // public key attesterPub := hex.EncodeToString(pubKey) // Adding an attester to protocal msgs[i] = &cctptypes.MsgEnableAttester{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), Attester: attesterPub, } } @@ -108,7 +85,7 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { // maps remote token on remote domain to a local token -- used for minting msgs = append(msgs, &cctptypes.MsgLinkTokenPair{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), RemoteDomain: 0, RemoteToken: burnToken, LocalToken: denomMetadataUsdc.Base, @@ -120,7 +97,7 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { tx, err := cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, + wrapper.fiatTfRoles.Owner, msgs..., ) require.NoError(t, err, "error submitting add public keys tx") @@ -135,22 +112,22 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { cctpModuleAccount := authtypes.NewModuleAddress(cctptypes.ModuleName).String() - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), cctpModuleAccount, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), cctpModuleAccount, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter controller tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), "fiat-tokenfactory", "configure-minter", cctpModuleAccount, "1000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter tx") - const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" //account + const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" // account receiverBz, err := hex.DecodeString(receiver) require.NoError(t, err) - nobleReceiver, err := bech32.ConvertAndEncode(nobleChainCfg.Bech32Prefix, receiverBz) + nobleReceiver, err := bech32.ConvertAndEncode(noble.Config().Bech32Prefix, receiverBz) require.NoError(t, err) burnRecipientPadded := append([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, receiverBz...) @@ -166,10 +143,10 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { depositForBurnBz, err := depositForBurn.Bytes() require.NoError(t, err) - var senderBurn = []byte("12345678901234567890123456789012") + senderBurn := []byte("12345678901234567890123456789012") destinationCaller := make([]byte, 32) - copy(destinationCaller[12:], gw.fiatTfRoles.Owner.Address()) + copy(destinationCaller[12:], wrapper.fiatTfRoles.Owner.Address()) wrappedDepositForBurn := cctptypes.Message{ Version: 0, @@ -187,7 +164,7 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { digestBurn := crypto.Keccak256(wrappedDepositForBurnBz) // hashed message is the key to the attestation - attestationBurn := make([]byte, 0, len(attesters)*65) //65 byte + attestationBurn := make([]byte, 0, len(attesters)*65) // 65 byte // CCTP requires attestations to have signatures sorted by address sort.Slice(attesters, func(i, j int) bool { @@ -211,9 +188,9 @@ func TestCCTP_ReceiveMessageWithCaller(t *testing.T) { tx, err = cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, - &cctptypes.MsgReceiveMessage{ //note: all messages that go to noble go through MsgReceiveMessage - From: gw.fiatTfRoles.Owner.FormattedAddress(), + wrapper.fiatTfRoles.Owner, + &cctptypes.MsgReceiveMessage{ // note: all messages that go to noble go through MsgReceiveMessage + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), Message: wrappedDepositForBurnBz, Attestation: attestationBurn, }, diff --git a/interchaintest/cctp_replace_deposit_for_burn_test.go b/interchaintest/cctp_replace_deposit_for_burn_test.go index 42606559..06d42c28 100644 --- a/interchaintest/cctp_replace_deposit_for_burn_test.go +++ b/interchaintest/cctp_replace_deposit_for_burn_test.go @@ -11,16 +11,14 @@ import ( "testing" "time" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/ethereum/go-ethereum/crypto" - cosmossdk_io_math "cosmossdk.io/math" cctptypes "github.com/circlefin/noble-cctp/x/cctp/types" sdkclient "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/ethereum/go-ethereum/common" - "github.com/noble-assets/noble/v5/cmd" + "github.com/ethereum/go-ethereum/crypto" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -37,51 +35,22 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", nv, nf, true, false, true, false), - { - Name: "gaia", - Version: "v10.0.2", - NumValidators: &nv, - NumFullNodes: &nf, - }, + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + true, false, true, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) - nobleChainCfg := noble.Config() - - cmd.SetPrefixes(nobleChainCfg.Bech32Prefix) + var err error attesters := make([]*ecdsa.PrivateKey, 2) msgs := make([]sdk.Msg, 2) @@ -93,13 +62,13 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { attesters[i] = p - pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) //public key + pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) // public key attesterPub := hex.EncodeToString(pubKey) // Adding an attester to protocal msgs[i] = &cctptypes.MsgEnableAttester{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), Attester: attesterPub, } } @@ -116,7 +85,7 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { // maps remote token on remote domain to a local token -- used for minting msgs = append(msgs, &cctptypes.MsgLinkTokenPair{ - From: gw.fiatTfRoles.Owner.FormattedAddress(), + From: wrapper.fiatTfRoles.Owner.FormattedAddress(), RemoteDomain: 0, RemoteToken: burnToken, LocalToken: denomMetadataUsdc.Base, @@ -128,7 +97,7 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { tx, err := cosmos.BroadcastTx( bCtx, broadcaster, - gw.fiatTfRoles.Owner, + wrapper.fiatTfRoles.Owner, msgs..., ) require.NoError(t, err, "error submitting add public keys tx") @@ -140,17 +109,17 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { cctpModuleAccount := authtypes.NewModuleAddress(cctptypes.ModuleName).String() - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), cctpModuleAccount, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), cctpModuleAccount, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter controller tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), "fiat-tokenfactory", "configure-minter", cctpModuleAccount, "1000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter tx") - const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" //account + const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" // account receiverBz, err := hex.DecodeString(receiver) require.NoError(t, err) @@ -158,7 +127,7 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { burnRecipientPadded := append([]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, receiverBz...) messageSender := make([]byte, 32) - copy(messageSender[12:], sdk.MustAccAddressFromBech32(gw.extraWallets.User.FormattedAddress())) + copy(messageSender[12:], sdk.MustAccAddressFromBech32(wrapper.extraWallets.User.FormattedAddress())) // someone burned USDC on Ethereum -> Mint on Noble depositForBurn := cctptypes.BurnMessage{ @@ -189,7 +158,7 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { digestBurn := crypto.Keccak256(wrappedDepositForBurnBz) // hashed message is the key to the attestation - attestationBurn := make([]byte, 0, len(attesters)*65) //65 byte + attestationBurn := make([]byte, 0, len(attesters)*65) // 65 byte // CCTP requires attestations to have signatures sorted by address sort.Slice(attesters, func(i, j int) bool { @@ -216,9 +185,9 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { tx, err = cosmos.BroadcastTx( bCtx, broadcaster, - gw.extraWallets.User, + wrapper.extraWallets.User, &cctptypes.MsgReplaceDepositForBurn{ - From: gw.extraWallets.User.FormattedAddress(), + From: wrapper.extraWallets.User.FormattedAddress(), OriginalMessage: wrappedDepositForBurnBz, OriginalAttestation: attestationBurn, NewDestinationCaller: newDestCaller, @@ -243,7 +212,7 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { require.Equal(t, wrappedDepositForBurn.Nonce, actualDepositForBurn.Nonce) require.Equal(t, expectedBurnToken, actualDepositForBurn.BurnToken) require.Equal(t, depositForBurn.Amount, actualDepositForBurn.Amount) - require.Equal(t, gw.extraWallets.User.FormattedAddress(), actualDepositForBurn.Depositor) + require.Equal(t, wrapper.extraWallets.User.FormattedAddress(), actualDepositForBurn.Depositor) require.Equal(t, newMintRecipient, actualDepositForBurn.MintRecipient) // new require.Equal(t, wrappedDepositForBurn.DestinationDomain, actualDepositForBurn.DestinationDomain) require.Equal(t, wrappedDepositForBurn.Recipient, actualDepositForBurn.DestinationTokenMessenger) @@ -261,7 +230,7 @@ func TestCCTP_ReplaceDepositForBurn(t *testing.T) { fmt.Println(expectedBurnToken) moduleAddress := make([]byte, 32) - copy(moduleAddress[12:], sdk.MustAccAddressFromBech32(gw.extraWallets.User.FormattedAddress())) + copy(moduleAddress[12:], sdk.MustAccAddressFromBech32(wrapper.extraWallets.User.FormattedAddress())) require.Equal(t, wrappedDepositForBurn.Version, message.Version) require.Equal(t, wrappedDepositForBurn.SourceDomain, message.SourceDomain) diff --git a/interchaintest/cctp_roles_test.go b/interchaintest/cctp_roles_test.go index 5aafa5f1..3aed28f7 100644 --- a/interchaintest/cctp_roles_test.go +++ b/interchaintest/cctp_roles_test.go @@ -6,7 +6,6 @@ import ( "github.com/circlefin/noble-cctp/x/cctp/types" "github.com/gogo/protobuf/jsonpb" - "github.com/noble-assets/noble/v5/cmd" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -22,49 +21,28 @@ func TestCCTP_UpdateOwner(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - nv := 1 - nf := 0 - - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "grand-1", nv, nf, false, false, false, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, false, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - cmd.SetPrefixes(noble.Config().Bech32Prefix) - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error nobleValidator := noble.Validators[0] // - currentOwner := gw.fiatTfRoles.Owner - newOwner := gw.extraWallets.User + currentOwner := wrapper.fiatTfRoles.Owner + newOwner := wrapper.extraWallets.User _, err = nobleValidator.ExecTx(ctx, currentOwner.KeyName(), "cctp", "update-owner", newOwner.FormattedAddress(), @@ -93,49 +71,28 @@ func TestCCTP_UpdateAttesterManager(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - nv := 1 - nf := 0 - - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "grand-1", nv, nf, false, false, false, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, false, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - cmd.SetPrefixes(noble.Config().Bech32Prefix) - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error nobleValidator := noble.Validators[0] // - currentAttesterManager := gw.fiatTfRoles.Owner - newAttesterManager := gw.extraWallets.User + currentAttesterManager := wrapper.fiatTfRoles.Owner + newAttesterManager := wrapper.extraWallets.User _, err = nobleValidator.ExecTx(ctx, currentAttesterManager.KeyName(), "cctp", "update-attester-manager", newAttesterManager.FormattedAddress(), @@ -155,49 +112,28 @@ func TestCCTP_UpdatePauser(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - nv := 1 - nf := 0 - - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "grand-1", nv, nf, false, false, false, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, false, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - cmd.SetPrefixes(noble.Config().Bech32Prefix) - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error nobleValidator := noble.Validators[0] // - currentPauser := gw.fiatTfRoles.Owner - newPauser := gw.extraWallets.User + currentPauser := wrapper.fiatTfRoles.Owner + newPauser := wrapper.extraWallets.User _, err = nobleValidator.ExecTx(ctx, currentPauser.KeyName(), "cctp", "update-pauser", newPauser.FormattedAddress(), @@ -217,49 +153,28 @@ func TestCCTP_UpdateTokenController(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - nv := 1 - nf := 0 - - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "grand-1", nv, nf, false, false, false, false), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, false, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - cmd.SetPrefixes(noble.Config().Bech32Prefix) - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error nobleValidator := noble.Validators[0] // - currentTokenController := gw.fiatTfRoles.Owner - newTokenController := gw.extraWallets.User + currentTokenController := wrapper.fiatTfRoles.Owner + newTokenController := wrapper.extraWallets.User _, err = nobleValidator.ExecTx(ctx, currentTokenController.KeyName(), "cctp", "update-token-controller", newTokenController.FormattedAddress(), diff --git a/interchaintest/genesis_test.go b/interchaintest/genesis_test.go index 7815b350..acd0fc9c 100644 --- a/interchaintest/genesis_test.go +++ b/interchaintest/genesis_test.go @@ -19,8 +19,11 @@ import ( ) var nobleImageInfo = []ibc.DockerImage{ - // TODO: Revert to local image once post ICS testing has been solved. - ghcrImage("v4.0.0"), + { + Repository: "noble", + Version: "local", + UidGid: "1025:1025", + }, } var ( diff --git a/interchaintest/globalfee_test.go b/interchaintest/globalfee_test.go index bbe00c73..61e1b06f 100644 --- a/interchaintest/globalfee_test.go +++ b/interchaintest/globalfee_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - "github.com/noble-assets/noble/v5/cmd" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/testreporter" @@ -24,42 +23,23 @@ func TestGlobalFee(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", 2, 0, false, true, false, true), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, true, false, true, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error chainCfg := noble.Config() - - cmd.SetPrefixes(chainCfg.Bech32Prefix) - nobleValidator := noble.Validators[0] sendAmount100 := fmt.Sprintf("100%s", chainCfg.Denom) @@ -69,7 +49,7 @@ func TestGlobalFee(t *testing.T) { zeroGasPrice := "0.0" + chainCfg.Denom // send tx with zero fees with the default MinimumGasPricesParam of 0 (null) - tx should succeed - _, err = nobleValidator.ExecTx(ctx, gw.extraWallets.User2.KeyName(), "bank", "send", gw.extraWallets.User2.KeyName(), gw.extraWallets.Alice.FormattedAddress(), sendAmount100, "--gas-prices", zeroGasPrice) + _, err = nobleValidator.ExecTx(ctx, wrapper.extraWallets.User2.KeyName(), "bank", "send", wrapper.extraWallets.User2.KeyName(), wrapper.extraWallets.Alice.FormattedAddress(), sendAmount100, "--gas-prices", zeroGasPrice) require.NoError(t, err, "failed sending transaction") msgUpdateParams := proposaltypes.MsgUpdateParams{ @@ -83,15 +63,15 @@ func TestGlobalFee(t *testing.T) { Value: fmt.Sprintf(`[{"denom":"%s", "amount":"%s"}]`, chainCfg.Denom, minGasPriceAmount), }, }), - Authority: gw.paramAuthority.FormattedAddress(), + Authority: wrapper.paramAuthority.FormattedAddress(), } broadcaster := cosmos.NewBroadcaster(t, noble) wallet := cosmos.NewWallet( - gw.paramAuthority.KeyName(), - gw.paramAuthority.Address(), - gw.paramAuthority.Mnemonic(), + wrapper.paramAuthority.KeyName(), + wrapper.paramAuthority.Address(), + wrapper.paramAuthority.Mnemonic(), chainCfg, ) @@ -105,37 +85,36 @@ func TestGlobalFee(t *testing.T) { require.Equal(t, uint32(0), tx.Code, "tx proposal failed") // send tx with zero fees while the default MinimumGasPricesParam requires fees - tx should fail - _, err = nobleValidator.ExecTx(ctx, gw.extraWallets.User2.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.extraWallets.User2.KeyName(), "bank", "send", - gw.extraWallets.User2.FormattedAddress(), gw.extraWallets.Alice.FormattedAddress(), sendAmount100, + wrapper.extraWallets.User2.FormattedAddress(), wrapper.extraWallets.Alice.FormattedAddress(), sendAmount100, "--gas-prices", zeroGasPrice, "-b", "block", ) require.Error(t, err, "tx should not have succeeded with zero fees") // send tx with the gas price set by MinimumGasPricesParam - tx should succeed - _, err = nobleValidator.ExecTx(ctx, gw.extraWallets.User2.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.extraWallets.User2.KeyName(), "bank", "send", - gw.extraWallets.User2.FormattedAddress(), gw.extraWallets.Alice.FormattedAddress(), sendAmount100, + wrapper.extraWallets.User2.FormattedAddress(), wrapper.extraWallets.Alice.FormattedAddress(), sendAmount100, "--gas-prices", minGasPrice, "-b", "block", ) require.NoError(t, err, "tx should have succeeded") // send tx with zero fees while the default MinimumGasPricesParam requires fees, but update owner msg is in the bypass min fee msgs list - tx should succeed - _, err = nobleValidator.ExecTx(ctx, gw.tfRoles.Owner.KeyName(), - "tokenfactory", "update-owner", gw.tfRoles.Owner2.FormattedAddress(), + _, err = nobleValidator.ExecTx(ctx, wrapper.tfRoles.Owner.KeyName(), + "tokenfactory", "update-owner", wrapper.tfRoles.Owner2.FormattedAddress(), "--gas-prices", zeroGasPrice, "-b", "block", ) require.NoError(t, err, "failed to execute update owner tx with zero fees") // send tx with zero fees while the default MinimumGasPricesParam requires fees, but accept owner msg is in the bypass min fee msgs list - tx should succeed - _, err = nobleValidator.ExecTx(ctx, gw.tfRoles.Owner2.KeyName(), + _, err = nobleValidator.ExecTx(ctx, wrapper.tfRoles.Owner2.KeyName(), "tokenfactory", "accept-owner", "--gas-prices", zeroGasPrice, "-b", "block", ) require.NoError(t, err, "failed to execute tx to accept ownership with zero fees") - } diff --git a/interchaintest/go.mod b/interchaintest/go.mod index 3c6ec0e2..b8fc8b37 100644 --- a/interchaintest/go.mod +++ b/interchaintest/go.mod @@ -9,6 +9,7 @@ require ( github.com/cosmos/cosmos-sdk v0.45.16 github.com/cosmos/ibc-go/v4 v4.5.1 github.com/cosmos/interchain-security/v2 v2.0.0 + github.com/docker/docker v24.0.1+incompatible github.com/ethereum/go-ethereum v1.12.2 github.com/gogo/protobuf v1.3.3 github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 @@ -64,7 +65,6 @@ require ( github.com/dgraph-io/ristretto v0.1.1 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.1+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -196,6 +196,9 @@ replace ( // use local version of noble github.com/noble-assets/noble/v5 => ./.. + // use noble version of interchaintest + github.com/strangelove-ventures/interchaintest/v4 => github.com/noble-assets/interchaintest/v4 v4.0.0-20231123134450-0c502bc002dc + // use cosmos compatible syndtr/goleveldb github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 diff --git a/interchaintest/go.sum b/interchaintest/go.sum index b177ac05..e1544cf6 100644 --- a/interchaintest/go.sum +++ b/interchaintest/go.sum @@ -812,6 +812,8 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/noble-assets/interchaintest/v4 v4.0.0-20231123134450-0c502bc002dc h1:NFnVLw9EpLT2tBgP6rV+e3dnSd1ZKelLiKAKUtZTywU= +github.com/noble-assets/interchaintest/v4 v4.0.0-20231123134450-0c502bc002dc/go.mod h1:6uU5QfVSS/anQaMO/RJL2SiE+kpq0ozTgBLaDGsJPEI= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1001,8 +1003,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20231109205540-ba30bbf6f78d h1:vPgbu6ZG5sfEldxDpUskkTPvMzgu6oAUIVLQCxm+Uh4= -github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20231109205540-ba30bbf6f78d/go.mod h1:6uU5QfVSS/anQaMO/RJL2SiE+kpq0ozTgBLaDGsJPEI= github.com/strangelove-ventures/paramauthority v1.1.0 h1:SMeG2NvoWC1sP09ouszukck7ufSu+3gv98Apd+ytQHQ= github.com/strangelove-ventures/paramauthority v1.1.0/go.mod h1:WZltb3MpbQo40z4eQD6oNZRpCXtxr5/7j8lbMleDFIY= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= diff --git a/interchaintest/ibc_bps_fee_test.go b/interchaintest/ibc_bps_fee_test.go index 1a050528..63d8da1e 100644 --- a/interchaintest/ibc_bps_fee_test.go +++ b/interchaintest/ibc_bps_fee_test.go @@ -6,10 +6,8 @@ import ( transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" "github.com/strangelove-ventures/interchaintest/v4" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/ibc" "github.com/strangelove-ventures/interchaintest/v4/testreporter" - "github.com/strangelove-ventures/interchaintest/v4/testutil" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) @@ -23,111 +21,63 @@ func TestICS20BPSFees(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", nv, nf, false, false, true, false), - { - Name: "gaia", - Version: "v9.0.2", - NumValidators: &nv, - NumFullNodes: &nf, - }, + noble, gaia, interchain, rly := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, true, false, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - r := interchaintest.NewBuiltinRelayerFactory( - ibc.CosmosRly, - zaptest.NewLogger(t), - relayerImage, - ).Build(t, client, network) - - var gaia *cosmos.CosmosChain - gw.chain, gaia = chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain) - noble := gw.chain - - path := "p" - - ic := interchaintest.NewInterchain(). - AddChain(noble). - AddChain(gaia). - AddRelayer(r, "relayer"). - AddLink(interchaintest.InterchainLink{ - Chain1: noble, - Chain2: gaia, - Path: path, - Relayer: r, - }) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) + var err error + var res ibc.RelayerExecResult nobleValidator := noble.Validators[0] - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MasterMinter.KeyName(), - "fiat-tokenfactory", "configure-minter-controller", gw.fiatTfRoles.MinterController.FormattedAddress(), gw.fiatTfRoles.Minter.FormattedAddress(), "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MasterMinter.KeyName(), + "fiat-tokenfactory", "configure-minter-controller", wrapper.fiatTfRoles.MinterController.FormattedAddress(), wrapper.fiatTfRoles.Minter.FormattedAddress(), "-b", "block", ) require.NoError(t, err, "failed to execute configure minter controller tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.MinterController.KeyName(), - "fiat-tokenfactory", "configure-minter", gw.fiatTfRoles.Minter.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.MinterController.KeyName(), + "fiat-tokenfactory", "configure-minter", wrapper.fiatTfRoles.Minter.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute configure minter tx") - _, err = nobleValidator.ExecTx(ctx, gw.fiatTfRoles.Minter.KeyName(), - "fiat-tokenfactory", "mint", gw.extraWallets.User.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", + _, err = nobleValidator.ExecTx(ctx, wrapper.fiatTfRoles.Minter.KeyName(), + "fiat-tokenfactory", "mint", wrapper.extraWallets.User.FormattedAddress(), "1000000000000"+denomMetadataUsdc.Base, "-b", "block", ) require.NoError(t, err, "failed to execute mint to user tx") - userBalance, err := noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + userBalance, err := noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err, "failed to get user balance") require.Equalf(t, int64(1000000000000), userBalance, "failed to mint %s to user", denomMetadataUsdc.Base) - nobleChans, err := r.GetChannels(ctx, eRep, noble.Config().ChainID) + nobleChans, err := rly.GetChannels(ctx, execReporter, noble.Config().ChainID) require.NoError(t, err, "failed to get noble channels") - require.Len(t, nobleChans, 1, "more than one channel found") - nobleChan := nobleChans[0] + require.Len(t, nobleChans, 2, "more than two channels found") + nobleChan := nobleChans[1] gaiaReceiver := "cosmos169xaqmxumqa829gg73nxrenkhhd2mrs36j3vrz" - err = r.StartRelayer(ctx, eRep, path) - require.NoError(t, err, "failed to start relayer") - defer r.StopRelayer(ctx, eRep) - - height, err := noble.Height(ctx) - require.NoError(t, err, "failed to get noble height") - // First, test BPS below max fees - tx, err := noble.SendIBCTransfer(ctx, nobleChan.ChannelID, gw.extraWallets.User.KeyName(), ibc.WalletAmount{ + _, err = noble.SendIBCTransfer(ctx, nobleChan.ChannelID, wrapper.extraWallets.User.KeyName(), ibc.WalletAmount{ Address: gaiaReceiver, Denom: denomMetadataUsdc.Base, Amount: 100000000, }, ibc.TransferOptions{}) require.NoError(t, err, "failed to send ibc transfer from noble") - _, err = testutil.PollForAck(ctx, noble, height, height+10, tx.Packet) - require.NoError(t, err, "failed to find ack for ibc transfer") + res = rly.Exec(ctx, execReporter, []string{"hermes", "clear", "packets", "--chain", noble.Config().ChainID, "--port", "transfer", "--channel", nobleChan.ChannelID}, nil) + require.NoError(t, res.Err) - userBalance, err = noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + userBalance, err = noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err, "failed to get user balance") require.Equal(t, int64(999900000000), userBalance, "user balance is incorrect") @@ -140,24 +90,24 @@ func TestICS20BPSFees(t *testing.T) { require.NoError(t, err, "failed to get receiver balance") require.Equal(t, int64(99990000), receiverBalance, "receiver balance incorrect") - // of the 10000 taken as fees, 80% goes to distribution entity (8000) - distributionEntityBalance, err := noble.GetBalance(ctx, gw.paramAuthority.FormattedAddress(), denomMetadataUsdc.Base) + // of the 10000 taken as fees, 75% goes to distribution entity (7500) + distributionEntityBalance, err := noble.GetBalance(ctx, wrapper.paramAuthority.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err, "failed to get distribution entity balance") - require.Equal(t, int64(8000), distributionEntityBalance, "distribution entity balance incorrect") + require.Equal(t, int64(7500), distributionEntityBalance, "distribution entity balance incorrect") // Now test max fee - tx, err = noble.SendIBCTransfer(ctx, nobleChan.ChannelID, gw.extraWallets.User.FormattedAddress(), ibc.WalletAmount{ + _, err = noble.SendIBCTransfer(ctx, nobleChan.ChannelID, wrapper.extraWallets.User.FormattedAddress(), ibc.WalletAmount{ Address: gaiaReceiver, Denom: denomMetadataUsdc.Base, Amount: 100000000000, }, ibc.TransferOptions{}) require.NoError(t, err, "failed to send ibc transfer from noble") - _, err = testutil.PollForAck(ctx, noble, height, height+10, tx.Packet) - require.NoError(t, err, "failed to find ack for ibc transfer") + res = rly.Exec(ctx, execReporter, []string{"hermes", "clear", "packets", "--chain", noble.Config().ChainID, "--port", "transfer", "--channel", nobleChan.ChannelID}, nil) + require.NoError(t, res.Err) // 999900000000 user balance from prior test, now subtract 100000000000 = 899900000000 - userBalance, err = noble.GetBalance(ctx, gw.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) + userBalance, err = noble.GetBalance(ctx, wrapper.extraWallets.User.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err, "failed to get user balance") require.Equal(t, int64(899900000000), userBalance, "user balance is incorrect") @@ -167,9 +117,8 @@ func TestICS20BPSFees(t *testing.T) { require.NoError(t, err, "failed to get receiver balance") require.Equal(t, int64(100094990000), receiverBalance, "receiver balance incorrect") - // prior balance 8000, add 80% of the 5000000 fee (4000000) = 4008000 - distributionEntityBalance, err = noble.GetBalance(ctx, gw.paramAuthority.FormattedAddress(), denomMetadataUsdc.Base) + // prior balance 7500, add 75% of the 5000000 fee (3750000) = 3757500 + distributionEntityBalance, err = noble.GetBalance(ctx, wrapper.paramAuthority.FormattedAddress(), denomMetadataUsdc.Base) require.NoError(t, err, "failed to get distribution entity balance") - require.Equal(t, int64(4008000), distributionEntityBalance, "distribution entity balance incorrect") - + require.Equal(t, int64(3757500), distributionEntityBalance, "distribution entity balance incorrect") } diff --git a/interchaintest/ibc_client_expire_substitute_test.go b/interchaintest/ibc_client_expire_substitute_test.go index f40427bc..9f6a2145 100644 --- a/interchaintest/ibc_client_expire_substitute_test.go +++ b/interchaintest/ibc_client_expire_substitute_test.go @@ -5,8 +5,8 @@ import ( "testing" "github.com/strangelove-ventures/interchaintest/v4" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/ibc" + "github.com/strangelove-ventures/interchaintest/v4/relayer/hermes" "github.com/strangelove-ventures/interchaintest/v4/testreporter" "github.com/strangelove-ventures/interchaintest/v4/testutil" "github.com/stretchr/testify/require" @@ -18,119 +18,66 @@ func TestClientSubstitution(t *testing.T) { if testing.Short() { t.Skip() } - t.Log("hi") + t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper - - nv := 1 - nf := 0 + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", nv, nf, true, true, true, true), - { - Name: "gaia", - Version: "v10.0.2", - NumValidators: &nv, - NumFullNodes: &nf, - }, + noble, gaia, interchain, rly := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + true, true, true, true, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - gaia := chains[1].(*cosmos.CosmosChain) - - r := interchaintest.NewBuiltinRelayerFactory( - ibc.CosmosRly, - zaptest.NewLogger(t), - relayerImage, - ).Build(t, client, network) - - pathName := "noble-gaia" - - ic := interchaintest.NewInterchain(). - AddChain(noble). - AddChain(gaia). - AddRelayer(r, "r"). - AddLink(interchaintest.InterchainLink{ - Chain1: noble, - Chain2: gaia, - Relayer: r, - Path: pathName, - }) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: true, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) nobleChainID := noble.Config().ChainID gaiaChainID := gaia.Config().ChainID - err = r.GeneratePath(ctx, eRep, nobleChainID, gaiaChainID, pathName) - require.NoError(t, err) + var err error + var res ibc.RelayerExecResult // create client on noble with short trusting period which will expire. - res := r.Exec(ctx, eRep, []string{"rly", "tx", "client", nobleChainID, gaiaChainID, pathName, "--client-tp", "20s", "--home", "/home/relayer"}, nil) + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "client", "--host-chain", nobleChainID, "--reference-chain", gaiaChainID, "--trusting-period", "1m"}, nil) require.NoError(t, res.Err) + nobleClientID, err := hermes.GetClientIdFromStdout(res.Stdout) + require.NoError(t, err) + // create client on gaia with longer trusting period so it won't expire for this test. - res = r.Exec(ctx, eRep, []string{"rly", "tx", "client", gaiaChainID, nobleChainID, pathName, "--home", "/home/relayer"}, nil) + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "client", "--host-chain", gaiaChainID, "--reference-chain", nobleChainID}, nil) require.NoError(t, res.Err) - err = testutil.WaitForBlocks(ctx, 2, noble, gaia) + gaiaClientID, err := hermes.GetClientIdFromStdout(res.Stdout) require.NoError(t, err) - err = r.CreateConnections(ctx, eRep, pathName) - require.NoError(t, err) + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "connection", "--a-chain", nobleChainID, "--a-client", nobleClientID, "--b-client", gaiaClientID}, nil) + require.NoError(t, res.Err) - err = testutil.WaitForBlocks(ctx, 2, noble, gaia) + nobleConnectionID, _, err := hermes.GetConnectionIDsFromStdout(res.Stdout) require.NoError(t, err) - err = r.CreateChannel(ctx, eRep, pathName, ibc.CreateChannelOptions{ - SourcePortName: "transfer", - DestPortName: "transfer", - Order: ibc.Unordered, - Version: "ics20-1", - }) + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "channel", "--a-chain", nobleChainID, "--a-connection", nobleConnectionID, "--a-port", "transfer", "--b-port", "transfer"}, nil) + require.NoError(t, res.Err) + + nobleChannelID, _, err := hermes.GetChannelIDsFromStdout(res.Stdout) require.NoError(t, err) const userFunds = int64(10_000_000_000) users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), userFunds, noble, gaia) - nobleClients, err := r.GetClients(ctx, eRep, nobleChainID) - require.NoError(t, err) - require.Len(t, nobleClients, 1) - - nobleClient := nobleClients[0] - - nobleChannels, err := r.GetChannels(ctx, eRep, nobleChainID) - require.NoError(t, err) - require.Len(t, nobleChannels, 1) - nobleChannel := nobleChannels[0] - - err = testutil.WaitForBlocks(ctx, 20, noble) + err = testutil.WaitForBlocks(ctx, 10, noble) require.NoError(t, err) // client should now be expired, no relayer was running to update the clients during the 20s trusting period. - _, err = noble.SendIBCTransfer(ctx, nobleChannel.ChannelID, users[0].KeyName(), ibc.WalletAmount{ + _, err = noble.SendIBCTransfer(ctx, nobleChannelID, users[0].KeyName(), ibc.WalletAmount{ Address: users[1].FormattedAddress(), Amount: 1000000, Denom: noble.Config().Denom, @@ -140,42 +87,24 @@ func TestClientSubstitution(t *testing.T) { require.ErrorContains(t, err, "status Expired: client is not active") // create new client on noble - res = r.Exec(ctx, eRep, []string{"rly", "tx", "client", nobleChainID, gaiaChainID, pathName, "--override", "--home", "/home/relayer"}, nil) + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "client", "--host-chain", nobleChainID, "--reference-chain", gaiaChainID}, nil) require.NoError(t, res.Err) - nobleClients, err = r.GetClients(ctx, eRep, nobleChainID) + newNobleClientID, err := hermes.GetClientIdFromStdout(res.Stdout) require.NoError(t, err) - require.Len(t, nobleClients, 2) - - newNobleClient := nobleClients[1] // substitute new client state into old client - _, err = noble.Validators[0].ExecTx(ctx, gw.paramAuthority.KeyName(), "ibc-authority", "update-client", nobleClient.ClientID, newNobleClient.ClientID) - require.NoError(t, err) - - // update config to old client ID - res = r.Exec(ctx, eRep, []string{"rly", "paths", "update", pathName, "--src-client-id", nobleClient.ClientID, "--home", "/home/relayer"}, nil) - require.NoError(t, res.Err) - - // start up relayer and test a transfer - err = r.StartRelayer(ctx, eRep, pathName) - require.NoError(t, err) - - t.Cleanup(func() { - _ = r.StopRelayer(ctx, eRep) - }) - - nobleHeight, err := noble.Height(ctx) + _, err = noble.Validators[0].ExecTx(ctx, wrapper.paramAuthority.KeyName(), "ibc-authority", "update-client", nobleClientID, newNobleClientID) require.NoError(t, err) // send a packet on the same channel with new client, should succeed. - tx, err := noble.SendIBCTransfer(ctx, nobleChannel.ChannelID, users[0].KeyName(), ibc.WalletAmount{ + _, err = noble.SendIBCTransfer(ctx, nobleChannelID, users[0].KeyName(), ibc.WalletAmount{ Address: users[1].FormattedAddress(), Amount: 1000000, Denom: noble.Config().Denom, }, ibc.TransferOptions{}) require.NoError(t, err) - _, err = testutil.PollForAck(ctx, noble, nobleHeight, nobleHeight+10, tx.Packet) - require.NoError(t, err) + res = rly.Exec(ctx, execReporter, []string{"hermes", "clear", "packets", "--chain", noble.Config().ChainID, "--port", "transfer", "--channel", nobleChannelID}, nil) + require.NoError(t, res.Err) } diff --git a/interchaintest/ics_migration_test.go b/interchaintest/ics_migration_test.go index 58a8bddc..754f47a0 100644 --- a/interchaintest/ics_migration_test.go +++ b/interchaintest/ics_migration_test.go @@ -13,6 +13,7 @@ import ( "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/ibc" + "github.com/strangelove-ventures/interchaintest/v4/relayer/hermes" "github.com/strangelove-ventures/interchaintest/v4/testreporter" "github.com/strangelove-ventures/interchaintest/v4/testutil" "github.com/stretchr/testify/require" @@ -26,7 +27,7 @@ func modifyGaiaGenesis(_ ibc.ChainConfig, bz []byte) ([]byte, error) { return nil, err } - err := dyno.Set(genesis, time.Minute.String(), "app_state", "gov", "voting_params", "voting_period") + err := dyno.Set(genesis, (15 * time.Second).String(), "app_state", "gov", "voting_params", "voting_period") if err != nil { return nil, err } @@ -45,8 +46,8 @@ func TestICS_StandaloneToConsumerMigration(t *testing.T) { var wrapper genesisWrapper - spec := nobleChainSpec(ctx, &wrapper, "grand-1", 1, 0, false, false, false, false) - spec.Images = []ibc.DockerImage{ghcrImage("v4.0.0")} + spec := nobleChainSpec(ctx, &wrapper, "grand-rehearsal-1", 1, 0, false, false, false, false) + spec.Images = []ibc.DockerImage{ghcrImage("v4.0.1")} factory := interchaintest.NewBuiltinChainFactory(logger, []*interchaintest.ChainSpec{ spec, @@ -64,14 +65,12 @@ func TestICS_StandaloneToConsumerMigration(t *testing.T) { noble := chains[0].(*cosmos.CosmosChain) gaia := chains[1].(*cosmos.CosmosChain) - wrapper.chain = noble rly := interchaintest.NewBuiltinRelayerFactory( - ibc.CosmosRly, + ibc.Hermes, logger, - relayerImage, - ).Build(t, client, network) + ).Build(t, client, network).(*hermes.Relayer) interchain := interchaintest.NewInterchain(). AddChain(noble). @@ -104,7 +103,7 @@ func TestICS_StandaloneToConsumerMigration(t *testing.T) { } // Register the Krypton upgrade on Noble. - upgradeHeight := 42 + upgradeHeight := 50 _, err = noble.Validators[0].ExecTx(ctx, wrapper.paramAuthority.KeyName(), "upgrade", "software-upgrade", "krypton", "--upgrade-height", strconv.Itoa(upgradeHeight)) require.NoError(t, err) @@ -112,7 +111,7 @@ func TestICS_StandaloneToConsumerMigration(t *testing.T) { current, err := noble.Height(ctx) require.NoError(t, err) - timeoutCtx, timeoutCtxCancel := context.WithTimeout(ctx, 30*time.Second) + timeoutCtx, timeoutCtxCancel := context.WithTimeout(ctx, 15*time.Second) defer timeoutCtxCancel() _ = testutil.WaitForBlocks(timeoutCtx, (upgradeHeight-int(current))+1, noble) @@ -169,12 +168,38 @@ func TestICS_StandaloneToConsumerMigration(t *testing.T) { // Execute the Krypton upgrade on Noble. require.NoError(t, noble.StopAllNodes(ctx)) - container := nobleImageInfo[0] // NOTE: use ghcrImage("john-replicated-security") for local testing + container := nobleImageInfo[0] noble.UpgradeVersion(ctx, client, container.Repository, container.Version) require.NoError(t, noble.StartAllNodes(ctx)) - // TODO: Create an IBC connection and test relaying of VSC packets! - // For now, just wait for 50 blocks to be produced. - require.NoError(t, testutil.WaitForBlocks(ctx, 50, noble)) + // Create the Replicated Security channel using the newly created clients. + var res ibc.RelayerExecResult + nobleClientID, gaiaClientID := "07-tendermint-1", "07-tendermint-1" + + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "connection", "--a-chain", noble.Config().ChainID, "--a-client", nobleClientID, "--b-client", gaiaClientID}, nil) + require.NoError(t, res.Err) + + nobleConnectionID, _, err := hermes.GetConnectionIDsFromStdout(res.Stdout) + require.NoError(t, err) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "create", "channel", "--a-chain", noble.Config().ChainID, "--a-connection", nobleConnectionID, "--a-port", "consumer", "--b-port", "provider", "--order", "ORDER_ORDERED"}, nil) + require.NoError(t, res.Err) + + // Execute a delegation on Gaia to generate a VSC packet. + delegators := interchaintest.GetAndFundTestUsers(t, ctx, "delegator", 1000000000000, gaia) + delegator := delegators[0] + + validator, err := gaia.Validators[0].KeyBech32(ctx, "validator", "val") + require.NoError(t, err) + + _, err = gaia.FullNodes[0].ExecTx(ctx, delegator.KeyName(), "staking", "delegate", validator, "999999000000uatom") + require.NoError(t, err) + + // Clear packets on the Replicated Security channel. + res = rly.Exec(ctx, execReporter, []string{"hermes", "clear", "packets", "--chain", noble.Config().ChainID, "--port", "consumer", "--channel", "channel-1"}, nil) + require.NoError(t, res.Err) + + // Wait for 10 blocks to be produced. + require.NoError(t, testutil.WaitForBlocks(ctx, 10, noble)) } diff --git a/interchaintest/noble_test.go b/interchaintest/noble_test.go index a1657c7b..dacf6852 100644 --- a/interchaintest/noble_test.go +++ b/interchaintest/noble_test.go @@ -23,46 +23,29 @@ func TestNobleChain(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", 2, 1, false, false, true, true), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + false, false, true, true, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) t.Run("tokenfactory", func(t *testing.T) { t.Parallel() - nobleTokenfactory_e2e(t, ctx, "tokenfactory", denomMetadataFrienzies.Base, noble, gw.tfRoles, gw.extraWallets) + nobleTokenfactory_e2e(t, ctx, "tokenfactory", denomMetadataFrienzies.Base, noble, wrapper.tfRoles, wrapper.extraWallets) }) t.Run("fiat-tokenfactory", func(t *testing.T) { t.Parallel() - nobleTokenfactory_e2e(t, ctx, "fiat-tokenfactory", denomMetadataUsdc.Base, noble, gw.fiatTfRoles, gw.extraWallets) + nobleTokenfactory_e2e(t, ctx, "fiat-tokenfactory", denomMetadataUsdc.Base, noble, wrapper.fiatTfRoles, wrapper.extraWallets) }) } diff --git a/interchaintest/packet_forward_test.go b/interchaintest/packet_forward_test.go deleted file mode 100644 index 60b09a77..00000000 --- a/interchaintest/packet_forward_test.go +++ /dev/null @@ -1,637 +0,0 @@ -package interchaintest_test - -import ( - "context" - "encoding/json" - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" - "github.com/strangelove-ventures/interchaintest/v4" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v4/ibc" - "github.com/strangelove-ventures/interchaintest/v4/testreporter" - "github.com/strangelove-ventures/interchaintest/v4/testutil" - "github.com/stretchr/testify/require" - "go.uber.org/zap/zaptest" -) - -type PacketMetadata struct { - Forward *ForwardMetadata `json:"forward"` -} - -type ForwardMetadata struct { - Receiver string `json:"receiver"` - Port string `json:"port"` - Channel string `json:"channel"` - Timeout time.Duration `json:"timeout"` - Retries *uint8 `json:"retries,omitempty"` - Next *string `json:"next,omitempty"` - RefundSequence *uint64 `json:"refund_sequence,omitempty"` -} - -// run `make local-image`to rebuild updated binary before running test -func TestPacketForwardMiddleware(t *testing.T) { - if testing.Short() { - t.Skip("skipping in short mode") - } - - var ( - ctx = context.Background() - client, network = interchaintest.DockerSetup(t) - rep = testreporter.NewNopReporter() - eRep = rep.RelayerExecReporter(t) - chainID_A, chainID_B, chainID_C, chainID_D = "chain-a", "chain-b", "chain-c", "chain-d" - nv = 1 - nf = 0 - gw1, gw2, gw3, gw4 genesisWrapper - ) - - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw1, chainID_A, nv, nf, true, true, true, true), - nobleChainSpec(ctx, &gw2, chainID_B, nv, nf, true, true, true, true), - nobleChainSpec(ctx, &gw3, chainID_C, nv, nf, true, true, true, true), - nobleChainSpec(ctx, &gw4, chainID_D, nv, nf, true, true, true, true), - }) - - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw1.chain, gw2.chain, gw3.chain, gw4.chain = chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain), chains[2].(*cosmos.CosmosChain), chains[3].(*cosmos.CosmosChain) - chainA, chainB, chainC, chainD := gw1.chain, gw2.chain, gw3.chain, gw4.chain - - r := interchaintest.NewBuiltinRelayerFactory( - ibc.CosmosRly, - zaptest.NewLogger(t), - relayerImage, - ).Build(t, client, network) - - const pathAB = "ab" - const pathBC = "bc" - const pathCD = "cd" - - ic := interchaintest.NewInterchain(). - AddChain(chainA). - AddChain(chainB). - AddChain(chainC). - AddChain(chainD). - AddRelayer(r, "relayer"). - AddLink(interchaintest.InterchainLink{ - Chain1: chainA, - Chain2: chainB, - Relayer: r, - Path: pathAB, - }). - AddLink(interchaintest.InterchainLink{ - Chain1: chainB, - Chain2: chainC, - Relayer: r, - Path: pathBC, - }). - AddLink(interchaintest.InterchainLink{ - Chain1: chainC, - Chain2: chainD, - Relayer: r, - Path: pathCD, - }) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - - SkipPathCreation: false, - })) - t.Cleanup(func() { - _ = ic.Close() - }) - - const userFunds = int64(10_000_000_000) - users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), userFunds, chainA, chainB, chainC, chainD) - - abChan, err := ibc.GetTransferChannel(ctx, r, eRep, chainID_A, chainID_B) - require.NoError(t, err) - - baChan := abChan.Counterparty - - cbChan, err := ibc.GetTransferChannel(ctx, r, eRep, chainID_C, chainID_B) - require.NoError(t, err) - - bcChan := cbChan.Counterparty - - dcChan, err := ibc.GetTransferChannel(ctx, r, eRep, chainID_D, chainID_C) - require.NoError(t, err) - - cdChan := dcChan.Counterparty - - // Start the relayer on both paths - err = r.StartRelayer(ctx, eRep, pathAB, pathBC, pathCD) - require.NoError(t, err) - - t.Cleanup( - func() { - err := r.StopRelayer(ctx, eRep) - if err != nil { - t.Logf("an error occured while stopping the relayer: %s", err) - } - }, - ) - - // Get original account balances - userA, userB, userC, userD := users[0], users[1], users[2], users[3] - - const transferAmount int64 = 100000 - - // Compose the prefixed denoms and ibc denom for asserting balances - firstHopDenom := transfertypes.GetPrefixedDenom(baChan.PortID, baChan.ChannelID, chainA.Config().Denom) - secondHopDenom := transfertypes.GetPrefixedDenom(cbChan.PortID, cbChan.ChannelID, firstHopDenom) - thirdHopDenom := transfertypes.GetPrefixedDenom(dcChan.PortID, dcChan.ChannelID, secondHopDenom) - - firstHopDenomTrace := transfertypes.ParseDenomTrace(firstHopDenom) - secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) - thirdHopDenomTrace := transfertypes.ParseDenomTrace(thirdHopDenom) - - firstHopIBCDenom := firstHopDenomTrace.IBCDenom() - secondHopIBCDenom := secondHopDenomTrace.IBCDenom() - thirdHopIBCDenom := thirdHopDenomTrace.IBCDenom() - - firstHopEscrowAccount := sdk.MustBech32ifyAddressBytes(chainA.Config().Bech32Prefix, transfertypes.GetEscrowAddress(abChan.PortID, abChan.ChannelID)) - secondHopEscrowAccount := sdk.MustBech32ifyAddressBytes(chainB.Config().Bech32Prefix, transfertypes.GetEscrowAddress(bcChan.PortID, bcChan.ChannelID)) - thirdHopEscrowAccount := sdk.MustBech32ifyAddressBytes(chainC.Config().Bech32Prefix, transfertypes.GetEscrowAddress(cdChan.PortID, abChan.ChannelID)) - - t.Run("multi-hop a->b->c->d", func(t *testing.T) { - // Send packet from Chain A->Chain B->Chain C->Chain D - - transfer := ibc.WalletAmount{ - Address: userB.FormattedAddress(), - Denom: chainA.Config().Denom, - Amount: transferAmount, - } - - secondHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userD.FormattedAddress(), - Channel: cdChan.ChannelID, - Port: cdChan.PortID, - }, - } - nextBz, err := json.Marshal(secondHopMetadata) - require.NoError(t, err) - next := string(nextBz) - - firstHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userC.FormattedAddress(), - Channel: bcChan.ChannelID, - Port: bcChan.PortID, - Next: &next, - }, - } - - memo, err := json.Marshal(firstHopMetadata) - require.NoError(t, err) - - chainAHeight, err := chainA.Height(ctx) - require.NoError(t, err) - - transferTx, err := chainA.SendIBCTransfer(ctx, abChan.ChannelID, userA.KeyName(), transfer, ibc.TransferOptions{Memo: string(memo)}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainA, chainAHeight, chainAHeight+30, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainA) - require.NoError(t, err) - - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err) - - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopIBCDenom) - require.NoError(t, err) - - chainCBalance, err := chainC.GetBalance(ctx, userC.FormattedAddress(), secondHopIBCDenom) - require.NoError(t, err) - - chainDBalance, err := chainD.GetBalance(ctx, userD.FormattedAddress(), thirdHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, userFunds-transferAmount, chainABalance) - require.Equal(t, int64(0), chainBBalance) - require.Equal(t, int64(0), chainCBalance) - require.Equal(t, transferAmount, chainDBalance) - - firstHopEscrowBalance, err := chainA.GetBalance(ctx, firstHopEscrowAccount, chainA.Config().Denom) - require.NoError(t, err) - - secondHopEscrowBalance, err := chainB.GetBalance(ctx, secondHopEscrowAccount, firstHopIBCDenom) - require.NoError(t, err) - - thirdHopEscrowBalance, err := chainC.GetBalance(ctx, thirdHopEscrowAccount, secondHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, transferAmount, firstHopEscrowBalance) - require.Equal(t, transferAmount, secondHopEscrowBalance) - require.Equal(t, transferAmount, thirdHopEscrowBalance) - }) - - t.Run("multi-hop denom unwind d->c->b->a", func(t *testing.T) { - // Send packet back from Chain D->Chain C->Chain B->Chain A - transfer := ibc.WalletAmount{ - Address: userC.FormattedAddress(), - Denom: thirdHopIBCDenom, - Amount: transferAmount, - } - - secondHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userA.FormattedAddress(), - Channel: baChan.ChannelID, - Port: baChan.PortID, - }, - } - - nextBz, err := json.Marshal(secondHopMetadata) - require.NoError(t, err) - - next := string(nextBz) - - firstHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userB.FormattedAddress(), - Channel: cbChan.ChannelID, - Port: cbChan.PortID, - Next: &next, - }, - } - - memo, err := json.Marshal(firstHopMetadata) - require.NoError(t, err) - - chainDHeight, err := chainD.Height(ctx) - require.NoError(t, err) - - transferTx, err := chainD.SendIBCTransfer(ctx, dcChan.ChannelID, userD.KeyName(), transfer, ibc.TransferOptions{Memo: string(memo)}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainD, chainDHeight, chainDHeight+30, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainA) - require.NoError(t, err) - - // assert balances for user controlled wallets - chainDBalance, err := chainD.GetBalance(ctx, userD.FormattedAddress(), thirdHopIBCDenom) - require.NoError(t, err) - - chainCBalance, err := chainC.GetBalance(ctx, userC.FormattedAddress(), secondHopIBCDenom) - require.NoError(t, err) - - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopIBCDenom) - require.NoError(t, err) - - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err) - - require.Equal(t, int64(0), chainDBalance) - require.Equal(t, int64(0), chainCBalance) - require.Equal(t, int64(0), chainBBalance) - require.Equal(t, userFunds, chainABalance) - - // assert balances for IBC escrow accounts - firstHopEscrowBalance, err := chainA.GetBalance(ctx, firstHopEscrowAccount, chainA.Config().Denom) - require.NoError(t, err) - - secondHopEscrowBalance, err := chainB.GetBalance(ctx, secondHopEscrowAccount, firstHopIBCDenom) - require.NoError(t, err) - - thirdHopEscrowBalance, err := chainC.GetBalance(ctx, thirdHopEscrowAccount, secondHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, int64(0), firstHopEscrowBalance) - require.Equal(t, int64(0), secondHopEscrowBalance) - require.Equal(t, int64(0), thirdHopEscrowBalance) - }) - - t.Run("forward ack error refund", func(t *testing.T) { - // Send a malformed packet with invalid receiver address from Chain A->Chain B->Chain C - // This should succeed in the first hop and fail to make the second hop; funds should then be refunded to Chain A. - transfer := ibc.WalletAmount{ - Address: userB.FormattedAddress(), - Denom: chainA.Config().Denom, - Amount: transferAmount, - } - - metadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: "xyz1t8eh66t2w5k67kwurmn5gqhtq6d2ja0vp7jmmq", // malformed receiver address on Chain C - Channel: bcChan.ChannelID, - Port: bcChan.PortID, - }, - } - - memo, err := json.Marshal(metadata) - require.NoError(t, err) - - chainAHeight, err := chainA.Height(ctx) - require.NoError(t, err) - - transferTx, err := chainA.SendIBCTransfer(ctx, abChan.ChannelID, userA.KeyName(), transfer, ibc.TransferOptions{Memo: string(memo)}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainA, chainAHeight, chainAHeight+25, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainA) - require.NoError(t, err) - - // assert balances for user controlled wallets - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err) - - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopIBCDenom) - require.NoError(t, err) - - chainCBalance, err := chainC.GetBalance(ctx, userC.FormattedAddress(), secondHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, userFunds, chainABalance) - require.Equal(t, int64(0), chainBBalance) - require.Equal(t, int64(0), chainCBalance) - - // assert balances for IBC escrow accounts - firstHopEscrowBalance, err := chainA.GetBalance(ctx, firstHopEscrowAccount, chainA.Config().Denom) - require.NoError(t, err) - - secondHopEscrowBalance, err := chainB.GetBalance(ctx, secondHopEscrowAccount, firstHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, int64(0), firstHopEscrowBalance) - require.Equal(t, int64(0), secondHopEscrowBalance) - }) - - t.Run("forward timeout refund", func(t *testing.T) { - // Send packet from Chain A->Chain B->Chain C with the timeout so low for B->C transfer that it can not make it from B to C, which should result in a refund from B to A after two retries. - transfer := ibc.WalletAmount{ - Address: userB.FormattedAddress(), - Denom: chainA.Config().Denom, - Amount: transferAmount, - } - - retries := uint8(2) - metadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userC.FormattedAddress(), - Channel: bcChan.ChannelID, - Port: bcChan.PortID, - Retries: &retries, - Timeout: 1 * time.Second, - }, - } - - memo, err := json.Marshal(metadata) - require.NoError(t, err) - - chainAHeight, err := chainA.Height(ctx) - require.NoError(t, err) - - transferTx, err := chainA.SendIBCTransfer(ctx, abChan.ChannelID, userA.KeyName(), transfer, ibc.TransferOptions{Memo: string(memo)}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainA, chainAHeight, chainAHeight+25, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainA) - require.NoError(t, err) - - // assert balances for user controlled wallets - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err) - - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopIBCDenom) - require.NoError(t, err) - - chainCBalance, err := chainC.GetBalance(ctx, userC.FormattedAddress(), secondHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, userFunds, chainABalance) - require.Equal(t, int64(0), chainBBalance) - require.Equal(t, int64(0), chainCBalance) - - firstHopEscrowBalance, err := chainA.GetBalance(ctx, firstHopEscrowAccount, chainA.Config().Denom) - require.NoError(t, err) - - secondHopEscrowBalance, err := chainB.GetBalance(ctx, secondHopEscrowAccount, firstHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, int64(0), firstHopEscrowBalance) - require.Equal(t, int64(0), secondHopEscrowBalance) - }) - - t.Run("multi-hop ack error refund", func(t *testing.T) { - // Send a malformed packet with invalid receiver address from Chain A->Chain B->Chain C->Chain D - // This should succeed in the first hop and second hop, then fail to make the third hop. - // Funds should be refunded to Chain B and then to Chain A via acknowledgements with errors. - transfer := ibc.WalletAmount{ - Address: userB.FormattedAddress(), - Denom: chainA.Config().Denom, - Amount: transferAmount, - } - - secondHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: "xyz1t8eh66t2w5k67kwurmn5gqhtq6d2ja0vp7jmmq", // malformed receiver address on chain D - Channel: cdChan.ChannelID, - Port: cdChan.PortID, - }, - } - - nextBz, err := json.Marshal(secondHopMetadata) - require.NoError(t, err) - - next := string(nextBz) - - firstHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userC.FormattedAddress(), - Channel: bcChan.ChannelID, - Port: bcChan.PortID, - Next: &next, - }, - } - - memo, err := json.Marshal(firstHopMetadata) - require.NoError(t, err) - - chainAHeight, err := chainA.Height(ctx) - require.NoError(t, err) - - transferTx, err := chainA.SendIBCTransfer(ctx, abChan.ChannelID, userA.KeyName(), transfer, ibc.TransferOptions{Memo: string(memo)}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainA, chainAHeight, chainAHeight+30, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainA) - require.NoError(t, err) - - // assert balances for user controlled wallets - chainDBalance, err := chainD.GetBalance(ctx, userD.FormattedAddress(), thirdHopIBCDenom) - require.NoError(t, err) - - chainCBalance, err := chainC.GetBalance(ctx, userC.FormattedAddress(), secondHopIBCDenom) - require.NoError(t, err) - - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopIBCDenom) - require.NoError(t, err) - - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err) - - require.Equal(t, userFunds, chainABalance) - require.Equal(t, int64(0), chainBBalance) - require.Equal(t, int64(0), chainCBalance) - require.Equal(t, int64(0), chainDBalance) - - // assert balances for IBC escrow accounts - firstHopEscrowBalance, err := chainA.GetBalance(ctx, firstHopEscrowAccount, chainA.Config().Denom) - require.NoError(t, err) - - secondHopEscrowBalance, err := chainB.GetBalance(ctx, secondHopEscrowAccount, firstHopIBCDenom) - require.NoError(t, err) - - thirdHopEscrowBalance, err := chainC.GetBalance(ctx, thirdHopEscrowAccount, secondHopIBCDenom) - require.NoError(t, err) - - require.Equal(t, int64(0), firstHopEscrowBalance) - require.Equal(t, int64(0), secondHopEscrowBalance) - require.Equal(t, int64(0), thirdHopEscrowBalance) - }) - - t.Run("multi-hop through native chain ack error refund", func(t *testing.T) { - // send normal IBC transfer from B->A to get funds in IBC denom, then do multihop A->B(native)->C->D - // this lets us test the burn from escrow account on chain C and the escrow to escrow transfer on chain B. - - // Compose the prefixed denoms and ibc denom for asserting balances - baDenom := transfertypes.GetPrefixedDenom(abChan.PortID, abChan.ChannelID, chainB.Config().Denom) - bcDenom := transfertypes.GetPrefixedDenom(cbChan.PortID, cbChan.ChannelID, chainB.Config().Denom) - cdDenom := transfertypes.GetPrefixedDenom(dcChan.PortID, dcChan.ChannelID, bcDenom) - - baDenomTrace := transfertypes.ParseDenomTrace(baDenom) - bcDenomTrace := transfertypes.ParseDenomTrace(bcDenom) - cdDenomTrace := transfertypes.ParseDenomTrace(cdDenom) - - baIBCDenom := baDenomTrace.IBCDenom() - bcIBCDenom := bcDenomTrace.IBCDenom() - cdIBCDenom := cdDenomTrace.IBCDenom() - - transfer := ibc.WalletAmount{ - Address: userA.FormattedAddress(), - Denom: chainB.Config().Denom, - Amount: transferAmount, - } - - chainBHeight, err := chainB.Height(ctx) - require.NoError(t, err) - - transferTx, err := chainB.SendIBCTransfer(ctx, baChan.ChannelID, userB.KeyName(), transfer, ibc.TransferOptions{}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainB, chainBHeight, chainBHeight+10, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainB) - require.NoError(t, err) - - // assert balance for user controlled wallet - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), baIBCDenom) - require.NoError(t, err) - - baEscrowBalance, err := chainB.GetBalance( - ctx, - sdk.MustBech32ifyAddressBytes(chainB.Config().Bech32Prefix, transfertypes.GetEscrowAddress(baChan.PortID, baChan.ChannelID)), - chainB.Config().Denom, - ) - require.NoError(t, err) - - require.Equal(t, transferAmount, chainABalance) - require.Equal(t, transferAmount, baEscrowBalance) - - // Send a malformed packet with invalid receiver address from Chain A->Chain B->Chain C->Chain D - // This should succeed in the first hop and second hop, then fail to make the third hop. - // Funds should be refunded to Chain B and then to Chain A via acknowledgements with errors. - transfer = ibc.WalletAmount{ - Address: userB.FormattedAddress(), - Denom: baIBCDenom, - Amount: transferAmount, - } - - secondHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: "xyz1t8eh66t2w5k67kwurmn5gqhtq6d2ja0vp7jmmq", // malformed receiver address on chain D - Channel: cdChan.ChannelID, - Port: cdChan.PortID, - }, - } - - nextBz, err := json.Marshal(secondHopMetadata) - require.NoError(t, err) - - next := string(nextBz) - - firstHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userC.FormattedAddress(), - Channel: bcChan.ChannelID, - Port: bcChan.PortID, - Next: &next, - }, - } - - memo, err := json.Marshal(firstHopMetadata) - require.NoError(t, err) - - chainAHeight, err := chainA.Height(ctx) - require.NoError(t, err) - - transferTx, err = chainA.SendIBCTransfer(ctx, abChan.ChannelID, userA.KeyName(), transfer, ibc.TransferOptions{Memo: string(memo)}) - require.NoError(t, err) - _, err = testutil.PollForAck(ctx, chainA, chainAHeight, chainAHeight+30, transferTx.Packet) - require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, chainA) - require.NoError(t, err) - - // assert balances for user controlled wallets - chainDBalance, err := chainD.GetBalance(ctx, userD.FormattedAddress(), cdIBCDenom) - require.NoError(t, err) - - chainCBalance, err := chainC.GetBalance(ctx, userC.FormattedAddress(), bcIBCDenom) - require.NoError(t, err) - - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), chainB.Config().Denom) - require.NoError(t, err) - - chainABalance, err = chainA.GetBalance(ctx, userA.FormattedAddress(), baIBCDenom) - require.NoError(t, err) - - require.Equal(t, transferAmount, chainABalance) - require.Equal(t, userFunds-transferAmount, chainBBalance) - require.Equal(t, int64(0), chainCBalance) - require.Equal(t, int64(0), chainDBalance) - - // assert balances for IBC escrow accounts - cdEscrowBalance, err := chainC.GetBalance( - ctx, - sdk.MustBech32ifyAddressBytes(chainC.Config().Bech32Prefix, transfertypes.GetEscrowAddress(cdChan.PortID, cdChan.ChannelID)), - bcIBCDenom, - ) - require.NoError(t, err) - - bcEscrowBalance, err := chainB.GetBalance( - ctx, - sdk.MustBech32ifyAddressBytes(chainB.Config().Bech32Prefix, transfertypes.GetEscrowAddress(bcChan.PortID, bcChan.ChannelID)), - chainB.Config().Denom, - ) - require.NoError(t, err) - - baEscrowBalance, err = chainB.GetBalance( - ctx, - sdk.MustBech32ifyAddressBytes(chainB.Config().Bech32Prefix, transfertypes.GetEscrowAddress(baChan.PortID, baChan.ChannelID)), - chainB.Config().Denom, - ) - require.NoError(t, err) - - require.Equal(t, transferAmount, baEscrowBalance) - require.Equal(t, int64(0), bcEscrowBalance) - require.Equal(t, int64(0), cdEscrowBalance) - }) -} diff --git a/interchaintest/paramauthority_test.go b/interchaintest/paramauthority_test.go index 88b468e0..b8ca4678 100644 --- a/interchaintest/paramauthority_test.go +++ b/interchaintest/paramauthority_test.go @@ -8,7 +8,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/params/types/proposal" "github.com/icza/dyno" - "github.com/noble-assets/noble/v5/cmd" "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/ibc" @@ -80,98 +79,77 @@ func TestNobleParamAuthority(t *testing.T) { t.Parallel() ctx := context.Background() - - rep := testreporter.NewNopReporter() - eRep := rep.RelayerExecReporter(t) - + logger := zaptest.NewLogger(t) + reporter := testreporter.NewNopReporter() + execReporter := reporter.RelayerExecReporter(t) client, network := interchaintest.DockerSetup(t) - var gw genesisWrapper + var wrapper genesisWrapper - cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ - nobleChainSpec(ctx, &gw, "noble-1", 1, 0, true, true, true, true), + noble, _, interchain, _ := SetupInterchain(t, ctx, logger, execReporter, client, network, &wrapper, TokenFactoryConfiguration{ + true, true, true, true, }) - chains, err := cf.Chains(t.Name()) - require.NoError(t, err) - - gw.chain = chains[0].(*cosmos.CosmosChain) - noble := gw.chain - - ic := interchaintest.NewInterchain(). - AddChain(noble) - - require.NoError(t, ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - - SkipPathCreation: false, - })) t.Cleanup(func() { - _ = ic.Close() + _ = interchain.Close() }) - chainCfg := noble.Config() - - cmd.SetPrefixes(chainCfg.Bech32Prefix) - broadcaster := cosmos.NewBroadcaster(t, noble) - var orderedTestCases = []ParamsCase{ + orderedTestCases := []ParamsCase{ { title: "change authority to alice from incorrect msg authority and signer", description: "change params and upgrade authority to alice's address", - newAuthority: gw.extraWallets.Alice.FormattedAddress(), - msgAuthority: gw.extraWallets.User.FormattedAddress(), // matches signer, but this is not the params authority. - signer: gw.extraWallets.User, + newAuthority: wrapper.extraWallets.Alice.FormattedAddress(), + msgAuthority: wrapper.extraWallets.User.FormattedAddress(), // matches signer, but this is not the params authority. + signer: wrapper.extraWallets.User, shouldSucceed: false, }, { title: "change authority to alice from correct signer but incorrect msg authority", description: "change params and upgrade authority to alice's address", - newAuthority: gw.extraWallets.Alice.FormattedAddress(), - msgAuthority: gw.extraWallets.User.FormattedAddress(), // this is not the params authority. - signer: gw.paramAuthority, // this is the params authority, but does not match msgAuthority + newAuthority: wrapper.extraWallets.Alice.FormattedAddress(), + msgAuthority: wrapper.extraWallets.User.FormattedAddress(), // this is not the params authority. + signer: wrapper.paramAuthority, // this is the params authority, but does not match msgAuthority shouldSucceed: false, }, { title: "change authority to alice from correct msg authority but incorrect signer", description: "change params and upgrade authority to alice's address", - newAuthority: gw.extraWallets.Alice.FormattedAddress(), - msgAuthority: gw.paramAuthority.FormattedAddress(), // this is the params authority. - signer: gw.extraWallets.User, // this is not the params authority. + newAuthority: wrapper.extraWallets.Alice.FormattedAddress(), + msgAuthority: wrapper.paramAuthority.FormattedAddress(), // this is the params authority. + signer: wrapper.extraWallets.User, // this is not the params authority. shouldSucceed: false, }, { title: "change authority to alice from correct signer and msg authority", description: "change params and upgrade authority to alice's address", - newAuthority: gw.extraWallets.Alice.FormattedAddress(), - msgAuthority: gw.paramAuthority.FormattedAddress(), // this is the params authority. - signer: gw.paramAuthority, // this is the params authority. + newAuthority: wrapper.extraWallets.Alice.FormattedAddress(), + msgAuthority: wrapper.paramAuthority.FormattedAddress(), // this is the params authority. + signer: wrapper.paramAuthority, // this is the params authority. shouldSucceed: true, }, { title: "change authority to user2 from prior authority", description: "change params and upgrade authority to user2's address", - newAuthority: gw.extraWallets.User2.FormattedAddress(), - msgAuthority: gw.paramAuthority.FormattedAddress(), // this account is no longer the params authority. - signer: gw.paramAuthority, // this account is no longer the params authority. + newAuthority: wrapper.extraWallets.User2.FormattedAddress(), + msgAuthority: wrapper.paramAuthority.FormattedAddress(), // this account is no longer the params authority. + signer: wrapper.paramAuthority, // this account is no longer the params authority. shouldSucceed: false, }, { title: "change authority to user2 from new authority", description: "change params and upgrade authority to user2's address", - newAuthority: gw.extraWallets.User2.FormattedAddress(), - msgAuthority: gw.extraWallets.Alice.FormattedAddress(), // this account is the new params authority. - signer: gw.extraWallets.Alice, // this account is the new params authority. + newAuthority: wrapper.extraWallets.User2.FormattedAddress(), + msgAuthority: wrapper.extraWallets.Alice.FormattedAddress(), // this account is the new params authority. + signer: wrapper.extraWallets.Alice, // this account is the new params authority. shouldSucceed: true, }, } for _, testCase := range orderedTestCases { t.Run(testCase.title, func(t *testing.T) { - testParamsCase(t, ctx, broadcaster, testCase, chainCfg) + testParamsCase(t, ctx, broadcaster, testCase, noble.Config()) }) } @@ -191,6 +169,5 @@ func TestNobleParamAuthority(t *testing.T) { authority, err := dyno.Get(gs, "app_state", "params", "params", "authority") require.NoError(t, err, "failed to get authority from state export") - require.Equal(t, gw.extraWallets.User2.FormattedAddress(), authority, "authority does not match") - + require.Equal(t, wrapper.extraWallets.User2.FormattedAddress(), authority, "authority does not match") } diff --git a/interchaintest/setup_test.go b/interchaintest/setup_test.go new file mode 100644 index 00000000..ecc29867 --- /dev/null +++ b/interchaintest/setup_test.go @@ -0,0 +1,107 @@ +package interchaintest_test + +import ( + "context" + "testing" + + "github.com/docker/docker/client" + "github.com/noble-assets/noble/v5/cmd" + "github.com/strangelove-ventures/interchaintest/v4" + "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v4/ibc" + "github.com/strangelove-ventures/interchaintest/v4/relayer/hermes" + "github.com/strangelove-ventures/interchaintest/v4/testreporter" + "github.com/stretchr/testify/require" + "go.uber.org/zap" +) + +type TokenFactoryConfiguration struct { + MinSetupTF bool + MinSetupFiatTF bool + MinModifyTF bool + MinModifyFiatTF bool +} + +func SetupInterchain(t *testing.T, ctx context.Context, logger *zap.Logger, execReporter *testreporter.RelayerExecReporter, client *client.Client, network string, wrapper *genesisWrapper, config TokenFactoryConfiguration) (noble *cosmos.CosmosChain, gaia *cosmos.CosmosChain, interchain *interchaintest.Interchain, rly *hermes.Relayer) { + factory := interchaintest.NewBuiltinChainFactory(logger, []*interchaintest.ChainSpec{ + nobleChainSpec(ctx, wrapper, "noble-1", 1, 0, config.MinSetupTF, config.MinSetupFiatTF, config.MinModifyTF, config.MinModifyFiatTF), + { + Name: "gaia", + Version: "latest", + ChainConfig: ibc.ChainConfig{ + ChainID: "cosmoshub-4", + }, + }, + }) + + chains, err := factory.Chains(t.Name()) + require.NoError(t, err) + + noble = chains[0].(*cosmos.CosmosChain) + gaia = chains[1].(*cosmos.CosmosChain) + wrapper.chain = noble + + rly = interchaintest.NewBuiltinRelayerFactory( + ibc.Hermes, + logger, + ).Build(t, client, network).(*hermes.Relayer) + + interchain = interchaintest.NewInterchain(). + AddChain(noble). + AddChain(gaia). + AddRelayer(rly, "rly"). + AddProviderConsumerLink(interchaintest.ProviderConsumerLink{ + Provider: gaia, + Consumer: noble, + Relayer: rly, + }) + + require.NoError(t, interchain.Build(ctx, execReporter, interchaintest.InterchainBuildOptions{ + TestName: t.Name(), + Client: client, + NetworkID: network, + + SkipPathCreation: true, + })) + + cmd.SetPrefixes(noble.Config().Bech32Prefix) + + var res ibc.RelayerExecResult + nobleClientID, gaiaClientID := "07-tendermint-0", "07-tendermint-0" + + require.NoError(t, rly.MarkChainAsConsumer(ctx, noble.Config().ChainID)) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "connection", "--a-chain", noble.Config().ChainID, "--a-client", nobleClientID, "--b-client", gaiaClientID}, nil) + require.NoError(t, res.Err) + + nobleConnectionID, gaiaConnectionID, err := hermes.GetConnectionIDsFromStdout(res.Stdout) + require.NoError(t, err) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "--json", "create", "channel", "--a-chain", noble.Config().ChainID, "--a-connection", nobleConnectionID, "--a-port", "consumer", "--b-port", "provider", "--order", "ORDER_ORDERED"}, nil) + require.NoError(t, res.Err) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "tx", "chan-open-try", "--dst-chain", gaia.Config().ChainID, "--src-chain", noble.Config().ChainID, "--dst-connection", gaiaConnectionID, "--dst-port", "transfer", "--src-port", "transfer", "--src-channel", "channel-1"}, nil) + require.NoError(t, res.Err) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "tx", "chan-open-ack", "--dst-chain", noble.Config().ChainID, "--src-chain", gaia.Config().ChainID, "--dst-connection", nobleConnectionID, "--dst-port", "transfer", "--src-port", "transfer", "--dst-channel", "channel-1", "--src-channel", "channel-1"}, nil) + require.NoError(t, res.Err) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "tx", "chan-open-confirm", "--dst-chain", gaia.Config().ChainID, "--src-chain", noble.Config().ChainID, "--dst-connection", gaiaConnectionID, "--dst-port", "transfer", "--src-port", "transfer", "--dst-channel", "channel-1", "--src-channel", "channel-1"}, nil) + require.NoError(t, res.Err) + + delegators := interchaintest.GetAndFundTestUsers(t, ctx, "delegator", 1000000000000, gaia) + delegator := delegators[0] + + validator, err := gaia.Validators[0].KeyBech32(ctx, "validator", "val") + require.NoError(t, err) + + _, err = gaia.FullNodes[0].ExecTx(ctx, delegator.KeyName(), "staking", "delegate", validator, "999999000000uatom") + require.NoError(t, err) + + res = rly.Exec(ctx, execReporter, []string{"hermes", "clear", "packets", "--chain", noble.Config().ChainID, "--port", "consumer", "--channel", "channel-0"}, nil) + require.NoError(t, res.Err) + res = rly.Exec(ctx, execReporter, []string{"hermes", "clear", "packets", "--chain", noble.Config().ChainID, "--port", "transfer", "--channel", "channel-1"}, nil) + require.NoError(t, res.Err) + + return +} diff --git a/interchaintest/upgrade_argon_test.go b/interchaintest/upgrade_argon_test.go index 6ddf8755..14fb29c3 100644 --- a/interchaintest/upgrade_argon_test.go +++ b/interchaintest/upgrade_argon_test.go @@ -119,7 +119,7 @@ func testPostArgonUpgrade( attesters[i] = p - pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) //public key + pubKey := elliptic.Marshal(p.PublicKey, p.PublicKey.X, p.PublicKey.Y) // public key attesterPub := hex.EncodeToString(pubKey) @@ -188,7 +188,7 @@ func testPostArgonUpgrade( ) require.NoError(t, err, "failed to execute configure minter tx") - const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" //account + const receiver = "9B6CA0C13EB603EF207C4657E1E619EF531A4D27" // account receiverBz, err := hex.DecodeString(receiver) require.NoError(t, err) @@ -209,7 +209,7 @@ func testPostArgonUpgrade( depositForBurnBz, err := depositForBurn.Bytes() require.NoError(t, err) - var sender = []byte("12345678901234567890123456789012") + sender := []byte("12345678901234567890123456789012") const destinationCallerKeyName = "destination-caller" destinationCallerUser := interchaintest.GetAndFundTestUsers(t, ctx, destinationCallerKeyName, 1, noble) @@ -233,7 +233,7 @@ func testPostArgonUpgrade( digestBurn := crypto.Keccak256(wrappedDepositForBurnBz) // hashed message is the key to the attestation - attestationBurn := make([]byte, 0, len(attesters)*65) //65 byte + attestationBurn := make([]byte, 0, len(attesters)*65) // 65 byte // CCTP requires attestations to have signatures sorted by address sort.Slice(attesters, func(i, j int) bool { @@ -258,7 +258,7 @@ func testPostArgonUpgrade( bCtx, broadcaster, destinationCallerUser[0], - &cctptypes.MsgReceiveMessage{ //note: all messages that go to noble go through MsgReceiveMessage + &cctptypes.MsgReceiveMessage{ // note: all messages that go to noble go through MsgReceiveMessage From: destinationCallerUser[0].FormattedAddress(), Message: wrappedDepositForBurnBz, Attestation: attestationBurn, diff --git a/proto/tariff/params.proto b/proto/tariff/params.proto index f1e1bc08..5747d3c2 100644 --- a/proto/tariff/params.proto +++ b/proto/tariff/params.proto @@ -9,6 +9,12 @@ option (gogoproto.equal_all) = true; // Params defines the set of params for the distribution module. message Params { option (gogoproto.goproto_stringer) = false; + // share is % of tx fees or rewards allocated to distribution_entities + string share = 1 [ + (gogoproto.moretags) = "yaml:\"share\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; // % of tx fees or rewards allocated to a set of global distribution entities // these shares must add up to 1 diff --git a/x/tariff/keeper/allocation.go b/x/tariff/keeper/allocation.go index bf324cd7..0dd70549 100644 --- a/x/tariff/keeper/allocation.go +++ b/x/tariff/keeper/allocation.go @@ -5,7 +5,7 @@ import ( ) func (k Keeper) AllocateTokens(ctx sdk.Context) { - feeCollector := k.authKeeper.GetModuleAccount(ctx, k.feeCollectorName) + feeCollector := k.authKeeper.GetModuleAccount(ctx, k.consumerRedistributeName) feesCollectedInt := k.bankKeeper.GetAllBalances(ctx, feeCollector.GetAddress()) foundAmountGreaterThanZero := false for _, coin := range feesCollectedInt { @@ -54,7 +54,7 @@ func (k Keeper) AllocateTokens(ctx sdk.Context) { acc := sdk.MustAccAddressFromBech32(d.Address) // transfer collected fees to the distribution entity account - err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, k.feeCollectorName, acc, coins) + err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, k.consumerRedistributeName, acc, coins) if err != nil { ctx.Logger().Error("Error allocating tokens to distribution entity: %s "+err.Error(), d.Address) } diff --git a/x/tariff/keeper/keeper.go b/x/tariff/keeper/keeper.go index 0fcc1ed1..ce05af40 100644 --- a/x/tariff/keeper/keeper.go +++ b/x/tariff/keeper/keeper.go @@ -17,11 +17,12 @@ var _ porttypes.ICS4Wrapper = Keeper{} type ( Keeper struct { - paramstore paramtypes.Subspace - authKeeper types.AccountKeeper - bankKeeper types.BankKeeper - feeCollectorName string // name of the FeeCollector ModuleAccount - ics4Wrapper porttypes.ICS4Wrapper + paramstore paramtypes.Subspace + authKeeper types.AccountKeeper + bankKeeper types.BankKeeper + feeCollectorName string // name of the FeeCollector ModuleAccount + consumerRedistributeName string // name of the ConsumerRedistribute ModuleAccount + ics4Wrapper porttypes.ICS4Wrapper } ) @@ -31,6 +32,7 @@ func NewKeeper( authKeeper types.AccountKeeper, bankKeeper types.BankKeeper, feeCollectorName string, + consumerRedistributeName string, ics4Wrapper porttypes.ICS4Wrapper, ) Keeper { // set KeyTable if it has not already been set @@ -39,11 +41,12 @@ func NewKeeper( } return Keeper{ - paramstore: ps, - authKeeper: authKeeper, - bankKeeper: bankKeeper, - feeCollectorName: feeCollectorName, - ics4Wrapper: ics4Wrapper, + paramstore: ps, + authKeeper: authKeeper, + bankKeeper: bankKeeper, + feeCollectorName: feeCollectorName, + consumerRedistributeName: consumerRedistributeName, + ics4Wrapper: ics4Wrapper, } } diff --git a/x/tariff/types/params.go b/x/tariff/types/params.go index c84c0341..a522291e 100644 --- a/x/tariff/types/params.go +++ b/x/tariff/types/params.go @@ -9,6 +9,7 @@ import ( ) var ( + KeyShare = []byte("Share") KeyDistributionEntities = []byte("DistributionEntities") KeyTransferFeeBPS = []byte("TransferFeeBPS") KeyTransferFeeMax = []byte("TransferFeeMax") @@ -30,6 +31,7 @@ func DefaultParams() Params { // ParamSetPairs get the params.ParamSet func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(KeyShare, &p.Share, validateShare), paramtypes.NewParamSetPair(KeyDistributionEntities, &p.DistributionEntities, validateDistributionEntityParams), paramtypes.NewParamSetPair(KeyTransferFeeBPS, &p.TransferFeeBps, validateTransferFeeBPS), paramtypes.NewParamSetPair(KeyTransferFeeMax, &p.TransferFeeMax, validateTransferFeeMax), @@ -73,6 +75,17 @@ func validateDistributionEntityParams(i interface{}) error { return nil } +func validateShare(i interface{}) error { + share, ok := i.(sdk.Dec) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + if share.LT(sdk.ZeroDec()) || share.GT(sdk.OneDec()) { + return fmt.Errorf("share is outside of the range of 0 to 100%%: %s", share.String()) + } + return nil +} + func validateTransferFeeBPS(i interface{}) error { transferFeeBPS, ok := i.(sdk.Int) if !ok { @@ -108,6 +121,10 @@ func validateTransferFeeDenom(i interface{}) error { // Validate validates the set of params func (p Params) Validate() error { + if err := validateShare(p.Share); err != nil { + return err + } + if err := validateDistributionEntityParams(p.DistributionEntities); err != nil { return err } diff --git a/x/tariff/types/params.pb.go b/x/tariff/types/params.pb.go index 021c8935..8d68537f 100644 --- a/x/tariff/types/params.pb.go +++ b/x/tariff/types/params.pb.go @@ -26,6 +26,8 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package // Params defines the set of params for the distribution module. type Params struct { + // share is % of tx fees or rewards allocated to distribution_entities + Share github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=share,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"share" yaml:"share"` // % of tx fees or rewards allocated to a set of global distribution entities // these shares must add up to 1 DistributionEntities []DistributionEntity `protobuf:"bytes,2,rep,name=distribution_entities,json=distributionEntities,proto3" json:"distribution_entities" yaml:"distribution_entities"` @@ -134,33 +136,34 @@ func init() { func init() { proto.RegisterFile("tariff/params.proto", fileDescriptor_8101061d71eef07f) } var fileDescriptor_8101061d71eef07f = []byte{ - // 410 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0x4f, 0x8b, 0xd3, 0x40, - 0x18, 0x87, 0x93, 0xed, 0xee, 0x8a, 0xe3, 0x22, 0xcb, 0xb8, 0x62, 0x14, 0x4d, 0x4a, 0x10, 0xd9, - 0xcb, 0x66, 0x40, 0xf1, 0xd2, 0x83, 0x87, 0x50, 0x85, 0x22, 0x05, 0x09, 0x9e, 0xbc, 0x94, 0x49, - 0x33, 0x69, 0x07, 0x9b, 0x4c, 0x98, 0x77, 0x2a, 0x29, 0x5e, 0xfd, 0x00, 0x1e, 0x3d, 0x7a, 0xf4, - 0x73, 0x78, 0xea, 0xb1, 0x47, 0xf1, 0x10, 0x24, 0xfd, 0x06, 0xf9, 0x04, 0x92, 0x49, 0x0b, 0xe9, - 0x9f, 0x8b, 0xe0, 0x29, 0x99, 0xf7, 0xfd, 0xbd, 0xcf, 0x93, 0x30, 0x2f, 0xba, 0xa7, 0xa8, 0xe4, - 0x71, 0x4c, 0x32, 0x2a, 0x69, 0x02, 0x5e, 0x26, 0x85, 0x12, 0xf8, 0x22, 0x15, 0xe1, 0x8c, 0x79, - 0x4d, 0xeb, 0xd1, 0xd5, 0x44, 0x4c, 0x84, 0x6e, 0x90, 0xfa, 0xad, 0xc9, 0xb8, 0x3f, 0x3b, 0xe8, - 0xfc, 0x9d, 0x1e, 0xc2, 0x9f, 0xd1, 0xfd, 0x88, 0x83, 0x92, 0x3c, 0x9c, 0x2b, 0x2e, 0xd2, 0x11, - 0x4b, 0x15, 0x57, 0x9c, 0x81, 0x75, 0xd2, 0xed, 0x5c, 0xdf, 0x79, 0xde, 0xf5, 0xda, 0x38, 0xaf, - 0xdf, 0x8a, 0xbe, 0xae, 0x93, 0x0b, 0xff, 0xe9, 0xb2, 0x70, 0x8c, 0xaa, 0x70, 0x1e, 0x2f, 0x68, - 0x32, 0xeb, 0xb9, 0x47, 0x61, 0x6e, 0x70, 0x15, 0xed, 0x4f, 0x72, 0x06, 0x18, 0xd0, 0xa5, 0x92, - 0x34, 0x85, 0x98, 0xc9, 0x51, 0xcc, 0xd8, 0x28, 0xcc, 0xc0, 0xea, 0x74, 0xcd, 0xeb, 0xdb, 0xfe, - 0xa0, 0xa6, 0xfe, 0x2e, 0x9c, 0x67, 0x13, 0xae, 0xa6, 0xf3, 0xd0, 0x1b, 0x8b, 0x84, 0x8c, 0x05, - 0x24, 0x02, 0x36, 0x8f, 0x1b, 0x88, 0x3e, 0x12, 0xb5, 0xc8, 0x18, 0x78, 0x83, 0x54, 0x55, 0x85, - 0xf3, 0xa0, 0xf1, 0xef, 0xf3, 0xdc, 0xe0, 0xee, 0xb6, 0xf4, 0x86, 0x31, 0x3f, 0x3b, 0x94, 0x26, - 0x34, 0xb7, 0x4e, 0xff, 0xa3, 0x34, 0xa1, 0xf9, 0xae, 0x74, 0x48, 0x73, 0xfc, 0x16, 0xe1, 0x9d, - 0x50, 0xc4, 0x52, 0x91, 0x58, 0x67, 0x5a, 0xfb, 0xa4, 0x2a, 0x9c, 0x87, 0x47, 0x40, 0x3a, 0xe3, - 0x06, 0x97, 0x2d, 0x54, 0xbf, 0x2e, 0xf5, 0x4e, 0xbf, 0x7d, 0x77, 0x0c, 0xf7, 0x8b, 0x89, 0xf0, - 0xe1, 0x7d, 0x60, 0x0b, 0xdd, 0xa2, 0x51, 0x24, 0x19, 0x80, 0x65, 0xd6, 0xf8, 0x60, 0x7b, 0xc4, - 0xef, 0xd1, 0x19, 0x4c, 0xa9, 0x64, 0xd6, 0x89, 0xd6, 0xbe, 0xfa, 0x87, 0xbf, 0xed, 0xb3, 0x71, - 0x55, 0x38, 0x17, 0xcd, 0x47, 0x6a, 0x88, 0x1b, 0x34, 0x30, 0x7f, 0xf8, 0xa3, 0xb4, 0xcd, 0x65, - 0x69, 0x9b, 0xab, 0xd2, 0x36, 0xff, 0x94, 0xb6, 0xf9, 0x75, 0x6d, 0x1b, 0xab, 0xb5, 0x6d, 0xfc, - 0x5a, 0xdb, 0xc6, 0x07, 0xd2, 0x82, 0xeb, 0x4d, 0xba, 0xa1, 0x00, 0x4c, 0x41, 0x73, 0x20, 0x9f, - 0x5e, 0x92, 0x9c, 0x6c, 0xb6, 0x58, 0x9b, 0xc2, 0x73, 0xbd, 0xa1, 0x2f, 0xfe, 0x06, 0x00, 0x00, - 0xff, 0xff, 0xe1, 0xf4, 0x2a, 0x5c, 0xdc, 0x02, 0x00, 0x00, + // 417 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0x4f, 0x8b, 0xd3, 0x40, + 0x18, 0xc6, 0x93, 0xdd, 0xee, 0x8a, 0xe3, 0x22, 0xcb, 0xb8, 0x62, 0x14, 0x4d, 0x4a, 0x10, 0xd9, + 0xcb, 0x66, 0x40, 0xf1, 0xb2, 0x07, 0x0f, 0xa1, 0x0a, 0x8b, 0x2c, 0x48, 0xf0, 0xe4, 0xa5, 0x4c, + 0x9a, 0x49, 0x3b, 0xd8, 0x64, 0xc2, 0xbc, 0x53, 0x49, 0xf1, 0xea, 0x07, 0xf0, 0xd8, 0xa3, 0x47, + 0x3f, 0x4a, 0x8f, 0x3d, 0x8a, 0x87, 0x20, 0xe9, 0x37, 0xc8, 0x27, 0x90, 0x4c, 0x5a, 0x4c, 0xff, + 0x5c, 0x84, 0x9e, 0x92, 0x99, 0xf7, 0x79, 0x7f, 0xcf, 0xfb, 0x92, 0x27, 0xe8, 0x81, 0xa2, 0x92, + 0xc7, 0x31, 0xc9, 0xa8, 0xa4, 0x09, 0x78, 0x99, 0x14, 0x4a, 0xe0, 0xb3, 0x54, 0x84, 0x63, 0xe6, + 0x35, 0xa5, 0x27, 0x17, 0x43, 0x31, 0x14, 0xba, 0x40, 0xea, 0xb7, 0x46, 0xe3, 0xce, 0x3a, 0xe8, + 0xf4, 0x83, 0x6e, 0xc2, 0x1f, 0xd1, 0x09, 0x8c, 0xa8, 0x64, 0x96, 0xd9, 0x35, 0x2f, 0xef, 0xfa, + 0x6f, 0xe6, 0x85, 0x63, 0xfc, 0x2e, 0x9c, 0x17, 0x43, 0xae, 0x46, 0x93, 0xd0, 0x1b, 0x88, 0x84, + 0x0c, 0x04, 0x24, 0x02, 0x56, 0x8f, 0x2b, 0x88, 0x3e, 0x13, 0x35, 0xcd, 0x18, 0x78, 0x3d, 0x36, + 0xa8, 0x0a, 0xe7, 0x6c, 0x4a, 0x93, 0xf1, 0xb5, 0xab, 0x21, 0x6e, 0xd0, 0xc0, 0xf0, 0x57, 0xf4, + 0x30, 0xe2, 0xa0, 0x24, 0x0f, 0x27, 0x8a, 0x8b, 0xb4, 0xcf, 0x52, 0xc5, 0x15, 0x67, 0x60, 0x1d, + 0x75, 0x8f, 0x2f, 0xef, 0xbd, 0xec, 0x7a, 0xed, 0x21, 0xbd, 0x5e, 0x4b, 0xfa, 0xb6, 0x56, 0x4e, + 0xfd, 0xe7, 0xf5, 0x1c, 0x55, 0xe1, 0x3c, 0x6d, 0xe8, 0x7b, 0x61, 0x6e, 0x70, 0x11, 0x6d, 0x77, + 0x72, 0x06, 0x18, 0xd0, 0xb9, 0x92, 0x34, 0x85, 0x98, 0xc9, 0x7e, 0xcc, 0x58, 0x3f, 0xcc, 0xc0, + 0x3a, 0xd6, 0xdb, 0xdd, 0xfc, 0xc7, 0x76, 0x37, 0xa9, 0xaa, 0x0a, 0xe7, 0x51, 0xe3, 0xbf, 0xcd, + 0x73, 0x83, 0xfb, 0xeb, 0xab, 0x77, 0x8c, 0xf9, 0xd9, 0xae, 0x69, 0x42, 0x73, 0xab, 0x73, 0x40, + 0xd3, 0x84, 0xe6, 0x9b, 0xa6, 0xb7, 0x34, 0xc7, 0xef, 0x11, 0xde, 0x10, 0x45, 0x2c, 0x15, 0x89, + 0x75, 0xa2, 0x6d, 0x9f, 0x55, 0x85, 0xf3, 0x78, 0x0f, 0x48, 0x6b, 0xdc, 0xe0, 0xbc, 0x85, 0xea, + 0xd5, 0x57, 0xd7, 0x9d, 0xd9, 0x0f, 0xc7, 0x70, 0xbf, 0x99, 0x08, 0xef, 0x7e, 0x0f, 0x6c, 0xa1, + 0x3b, 0x34, 0x8a, 0x24, 0x03, 0x68, 0x82, 0x12, 0xac, 0x8f, 0xff, 0x02, 0x74, 0x74, 0xc0, 0x00, + 0xf9, 0xb7, 0x3f, 0x4b, 0xdb, 0x9c, 0x97, 0xb6, 0xb9, 0x28, 0x6d, 0xf3, 0x4f, 0x69, 0x9b, 0xdf, + 0x97, 0xb6, 0xb1, 0x58, 0xda, 0xc6, 0xaf, 0xa5, 0x6d, 0x7c, 0x22, 0x2d, 0xb8, 0x4e, 0xd2, 0x15, + 0x05, 0x60, 0x0a, 0x9a, 0x03, 0xf9, 0xf2, 0x9a, 0xe4, 0x64, 0xf5, 0x6f, 0x68, 0xa7, 0xf0, 0x54, + 0xe7, 0xfe, 0xd5, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x13, 0x64, 0x99, 0x32, 0x03, 0x00, + 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -182,6 +185,9 @@ func (this *Params) Equal(that interface{}) bool { } else if this == nil { return false } + if !this.Share.Equal(that1.Share) { + return false + } if len(this.DistributionEntities) != len(that1.DistributionEntities) { return false } @@ -289,6 +295,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x12 } } + { + size := m.Share.Size() + i -= size + if _, err := m.Share.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -349,6 +365,8 @@ func (m *Params) Size() (n int) { } var l int _ = l + l = m.Share.Size() + n += 1 + l + sovParams(uint64(l)) if len(m.DistributionEntities) > 0 { for _, e := range m.DistributionEntities { l = e.Size() @@ -416,6 +434,40 @@ func (m *Params) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Share", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Share.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DistributionEntities", wireType) diff --git a/x/tokenfactory/client/cli/query_blacklisted_test.go b/x/tokenfactory/client/cli/query_blacklisted_test.go deleted file mode 100644 index 603b81aa..00000000 --- a/x/tokenfactory/client/cli/query_blacklisted_test.go +++ /dev/null @@ -1,165 +0,0 @@ -package cli_test - -import ( - "fmt" - "strconv" - "testing" - - "github.com/cosmos/cosmos-sdk/client/flags" - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/noble-assets/noble/v5/testutil/sample" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -// Prevent strconv unused error -var _ = strconv.IntSize - -func networkWithBlacklistedObjects(t *testing.T, n int) (*network.Network, []types.Blacklisted, []sample.Account) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - accounts := make([]sample.Account, n) - for i := 0; i < n; i++ { - account := sample.TestAccount() - blacklisted := types.Blacklisted{ - AddressBz: account.AddressBz, - } - state.BlacklistedList = append(state.BlacklistedList, blacklisted) - accounts[i] = account - } - - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), state.BlacklistedList, accounts -} - -func TestShowBlacklisted(t *testing.T) { - net, _, objs := networkWithBlacklistedObjects(t, 2) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - address string - - args []string - err error - obj sample.Account - }{ - { - desc: "found", - address: objs[0].Address, - - args: common, - obj: objs[0], - }, - { - desc: "not found", - address: sample.TestAccount().Address, - - args: common, - err: status.Error(codes.NotFound, "not found"), - }, - } { - t.Run(tc.desc, func(t *testing.T) { - args := []string{ - tc.address, - } - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowBlacklisted(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetBlacklistedResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.Blacklisted) - require.Equal(t, - nullify.Fill(&tc.obj.AddressBz), - nullify.Fill(&resp.Blacklisted.AddressBz), - ) - } - }) - } -} - -func TestListBlacklisted(t *testing.T) { - net, objs, _ := networkWithBlacklistedObjects(t, 5) - - ctx := net.Validators[0].ClientCtx - request := func(next []byte, offset, limit uint64, total bool) []string { - args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - if next == nil { - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) - } else { - args = append(args, fmt.Sprintf("--%s=%s", flags.FlagPageKey, next)) - } - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagLimit, limit)) - if total { - args = append(args, fmt.Sprintf("--%s", flags.FlagCountTotal)) - } - return args - } - t.Run("ByOffset", func(t *testing.T) { - step := 2 - for i := 0; i < len(objs); i += step { - args := request(nil, uint64(i), uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListBlacklisted(), args) - require.NoError(t, err) - var resp types.QueryAllBlacklistedResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.LessOrEqual(t, len(resp.Blacklisted), step) - require.Subset(t, - nullify.Fill(objs), - nullify.Fill(resp.Blacklisted), - ) - } - }) - t.Run("ByKey", func(t *testing.T) { - step := 2 - var next []byte - for i := 0; i < len(objs); i += step { - args := request(next, 0, uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListBlacklisted(), args) - require.NoError(t, err) - var resp types.QueryAllBlacklistedResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.LessOrEqual(t, len(resp.Blacklisted), step) - require.Subset(t, - nullify.Fill(objs), - nullify.Fill(resp.Blacklisted), - ) - next = resp.Pagination.NextKey - } - }) - t.Run("Total", func(t *testing.T) { - args := request(nil, 0, uint64(len(objs)), true) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListBlacklisted(), args) - require.NoError(t, err) - var resp types.QueryAllBlacklistedResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NoError(t, err) - require.Equal(t, len(objs), int(resp.Pagination.Total)) - require.ElementsMatch(t, - nullify.Fill(objs), - nullify.Fill(resp.Blacklisted), - ) - }) -} diff --git a/x/tokenfactory/client/cli/query_blacklister_test.go b/x/tokenfactory/client/cli/query_blacklister_test.go deleted file mode 100644 index 560b482f..00000000 --- a/x/tokenfactory/client/cli/query_blacklister_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -func networkWithBlacklisterObjects(t *testing.T) (*network.Network, types.Blacklister) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - blacklister := &types.Blacklister{} - nullify.Fill(&blacklister) - state.Blacklister = blacklister - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), *state.Blacklister -} - -func TestShowBlacklister(t *testing.T) { - net, obj := networkWithBlacklisterObjects(t) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - args []string - err error - obj types.Blacklister - }{ - { - desc: "get", - args: common, - obj: obj, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - var args []string - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowBlacklister(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetBlacklisterResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.Blacklister) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.Blacklister), - ) - } - }) - } -} diff --git a/x/tokenfactory/client/cli/query_master_minter_test.go b/x/tokenfactory/client/cli/query_master_minter_test.go deleted file mode 100644 index ecb8c47a..00000000 --- a/x/tokenfactory/client/cli/query_master_minter_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -func networkWithMasterMinterObjects(t *testing.T) (*network.Network, types.MasterMinter) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - masterMinter := &types.MasterMinter{} - nullify.Fill(&masterMinter) - state.MasterMinter = masterMinter - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), *state.MasterMinter -} - -func TestShowMasterMinter(t *testing.T) { - net, obj := networkWithMasterMinterObjects(t) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - args []string - err error - obj types.MasterMinter - }{ - { - desc: "get", - args: common, - obj: obj, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - var args []string - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowMasterMinter(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetMasterMinterResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.MasterMinter) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.MasterMinter), - ) - } - }) - } -} diff --git a/x/tokenfactory/client/cli/query_minter_controller_test.go b/x/tokenfactory/client/cli/query_minter_controller_test.go deleted file mode 100644 index 80f222fe..00000000 --- a/x/tokenfactory/client/cli/query_minter_controller_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package cli_test - -import ( - "fmt" - "strconv" - "testing" - - "github.com/cosmos/cosmos-sdk/client/flags" - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -// Prevent strconv unused error -var _ = strconv.IntSize - -func networkWithMinterControllerObjects(t *testing.T, n int) (*network.Network, []types.MinterController) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - for i := 0; i < n; i++ { - minterController := types.MinterController{ - Controller: strconv.Itoa(i), - } - nullify.Fill(&minterController) - state.MinterControllerList = append(state.MinterControllerList, minterController) - } - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), state.MinterControllerList -} - -func TestShowMinterController(t *testing.T) { - net, objs := networkWithMinterControllerObjects(t, 2) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - idMinterAddress string - - args []string - err error - obj types.MinterController - }{ - { - desc: "found", - idMinterAddress: objs[0].Controller, - - args: common, - obj: objs[0], - }, - { - desc: "not found", - idMinterAddress: strconv.Itoa(100000), - - args: common, - err: status.Error(codes.NotFound, "not found"), - }, - } { - t.Run(tc.desc, func(t *testing.T) { - args := []string{ - tc.idMinterAddress, - } - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowMinterController(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetMinterControllerResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.MinterController) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.MinterController), - ) - } - }) - } -} - -func TestListMinterController(t *testing.T) { - net, objs := networkWithMinterControllerObjects(t, 5) - - ctx := net.Validators[0].ClientCtx - request := func(next []byte, offset, limit uint64, total bool) []string { - args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - if next == nil { - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) - } else { - args = append(args, fmt.Sprintf("--%s=%s", flags.FlagPageKey, next)) - } - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagLimit, limit)) - if total { - args = append(args, fmt.Sprintf("--%s", flags.FlagCountTotal)) - } - return args - } - t.Run("ByOffset", func(t *testing.T) { - step := 2 - for i := 0; i < len(objs); i += step { - args := request(nil, uint64(i), uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListMinterController(), args) - require.NoError(t, err) - var resp types.QueryAllMinterControllerResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.LessOrEqual(t, len(resp.MinterController), step) - require.Subset(t, - nullify.Fill(objs), - nullify.Fill(resp.MinterController), - ) - } - }) - t.Run("ByKey", func(t *testing.T) { - step := 2 - var next []byte - for i := 0; i < len(objs); i += step { - args := request(next, 0, uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListMinterController(), args) - require.NoError(t, err) - var resp types.QueryAllMinterControllerResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.LessOrEqual(t, len(resp.MinterController), step) - require.Subset(t, - nullify.Fill(objs), - nullify.Fill(resp.MinterController), - ) - next = resp.Pagination.NextKey - } - }) - t.Run("Total", func(t *testing.T) { - args := request(nil, 0, uint64(len(objs)), true) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListMinterController(), args) - require.NoError(t, err) - var resp types.QueryAllMinterControllerResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NoError(t, err) - require.Equal(t, len(objs), int(resp.Pagination.Total)) - require.ElementsMatch(t, - nullify.Fill(objs), - nullify.Fill(resp.MinterController), - ) - }) -} diff --git a/x/tokenfactory/client/cli/query_minters_test.go b/x/tokenfactory/client/cli/query_minters_test.go deleted file mode 100644 index a7ba0c69..00000000 --- a/x/tokenfactory/client/cli/query_minters_test.go +++ /dev/null @@ -1,161 +0,0 @@ -package cli_test - -import ( - "fmt" - "strconv" - "testing" - - "github.com/cosmos/cosmos-sdk/client/flags" - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -// Prevent strconv unused error -var _ = strconv.IntSize - -func networkWithMintersObjects(t *testing.T, n int) (*network.Network, []types.Minters) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - for i := 0; i < n; i++ { - minters := types.Minters{ - Address: strconv.Itoa(i), - } - nullify.Fill(&minters) - state.MintersList = append(state.MintersList, minters) - } - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), state.MintersList -} - -func TestShowMinters(t *testing.T) { - net, objs := networkWithMintersObjects(t, 2) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - idAddress string - - args []string - err error - obj types.Minters - }{ - { - desc: "found", - idAddress: objs[0].Address, - - args: common, - obj: objs[0], - }, - { - desc: "not found", - idAddress: strconv.Itoa(100000), - - args: common, - err: status.Error(codes.NotFound, "not found"), - }, - } { - t.Run(tc.desc, func(t *testing.T) { - args := []string{ - tc.idAddress, - } - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowMinters(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetMintersResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.Minters) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.Minters), - ) - } - }) - } -} - -func TestListMinters(t *testing.T) { - net, objs := networkWithMintersObjects(t, 5) - - ctx := net.Validators[0].ClientCtx - request := func(next []byte, offset, limit uint64, total bool) []string { - args := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - if next == nil { - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagOffset, offset)) - } else { - args = append(args, fmt.Sprintf("--%s=%s", flags.FlagPageKey, next)) - } - args = append(args, fmt.Sprintf("--%s=%d", flags.FlagLimit, limit)) - if total { - args = append(args, fmt.Sprintf("--%s", flags.FlagCountTotal)) - } - return args - } - t.Run("ByOffset", func(t *testing.T) { - step := 2 - for i := 0; i < len(objs); i += step { - args := request(nil, uint64(i), uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListMinters(), args) - require.NoError(t, err) - var resp types.QueryAllMintersResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.LessOrEqual(t, len(resp.Minters), step) - require.Subset(t, - nullify.Fill(objs), - nullify.Fill(resp.Minters), - ) - } - }) - t.Run("ByKey", func(t *testing.T) { - step := 2 - var next []byte - for i := 0; i < len(objs); i += step { - args := request(next, 0, uint64(step), false) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListMinters(), args) - require.NoError(t, err) - var resp types.QueryAllMintersResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.LessOrEqual(t, len(resp.Minters), step) - require.Subset(t, - nullify.Fill(objs), - nullify.Fill(resp.Minters), - ) - next = resp.Pagination.NextKey - } - }) - t.Run("Total", func(t *testing.T) { - args := request(nil, 0, uint64(len(objs)), true) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdListMinters(), args) - require.NoError(t, err) - var resp types.QueryAllMintersResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NoError(t, err) - require.Equal(t, len(objs), int(resp.Pagination.Total)) - require.ElementsMatch(t, - nullify.Fill(objs), - nullify.Fill(resp.Minters), - ) - }) -} diff --git a/x/tokenfactory/client/cli/query_minting_denom_test.go b/x/tokenfactory/client/cli/query_minting_denom_test.go deleted file mode 100644 index 905c23d2..00000000 --- a/x/tokenfactory/client/cli/query_minting_denom_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -func networkWithMintingDenomObjects(t *testing.T) (*network.Network, types.MintingDenom) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - testDenom := "test" - - state.MintingDenom = &types.MintingDenom{ - Denom: testDenom, - } - - bankState := banktypes.DefaultGenesisState() - bankState.DenomMetadata = []banktypes.Metadata{{ - Base: testDenom, - }} - - buf, err := cfg.Codec.MarshalJSON(bankState) - require.NoError(t, err) - cfg.GenesisState[banktypes.ModuleName] = buf - - buf, err = cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - - return network.New(t, cfg), *state.MintingDenom -} - -func TestShowMintingDenom(t *testing.T) { - net, obj := networkWithMintingDenomObjects(t) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - args []string - err error - obj types.MintingDenom - }{ - { - desc: "get", - args: common, - obj: obj, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - var args []string - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowMintingDenom(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetMintingDenomResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.MintingDenom) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.MintingDenom), - ) - } - }) - } -} diff --git a/x/tokenfactory/client/cli/query_owner_test.go b/x/tokenfactory/client/cli/query_owner_test.go deleted file mode 100644 index 7234097c..00000000 --- a/x/tokenfactory/client/cli/query_owner_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -func networkWithOwnerObjects(t *testing.T) (*network.Network, types.Owner) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - owner := &types.Owner{} - nullify.Fill(&owner) - state.Owner = owner - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), *state.Owner -} - -func TestShowOwner(t *testing.T) { - net, obj := networkWithOwnerObjects(t) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - args []string - err error - obj types.Owner - }{ - { - desc: "get", - args: common, - obj: obj, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - var args []string - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowOwner(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetOwnerResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.Owner) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.Owner), - ) - } - }) - } -} diff --git a/x/tokenfactory/client/cli/query_paused_test.go b/x/tokenfactory/client/cli/query_paused_test.go deleted file mode 100644 index dfde5cb1..00000000 --- a/x/tokenfactory/client/cli/query_paused_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -func networkWithPausedObjects(t *testing.T) (*network.Network, types.Paused) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - paused := &types.Paused{} - nullify.Fill(&paused) - state.Paused = paused - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), *state.Paused -} - -func TestShowPaused(t *testing.T) { - net, obj := networkWithPausedObjects(t) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - args []string - err error - obj types.Paused - }{ - { - desc: "get", - args: common, - obj: obj, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - var args []string - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowPaused(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetPausedResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.Paused) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.Paused), - ) - } - }) - } -} diff --git a/x/tokenfactory/client/cli/query_pauser_test.go b/x/tokenfactory/client/cli/query_pauser_test.go deleted file mode 100644 index 37e2c227..00000000 --- a/x/tokenfactory/client/cli/query_pauser_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - "github.com/stretchr/testify/require" - tmcli "github.com/tendermint/tendermint/libs/cli" - "google.golang.org/grpc/status" - - "github.com/noble-assets/noble/v5/testutil/network" - "github.com/noble-assets/noble/v5/testutil/nullify" - "github.com/noble-assets/noble/v5/x/tokenfactory/client/cli" - "github.com/noble-assets/noble/v5/x/tokenfactory/types" -) - -func networkWithPauserObjects(t *testing.T) (*network.Network, types.Pauser) { - t.Helper() - cfg := network.DefaultConfig() - state := types.GenesisState{} - require.NoError(t, cfg.Codec.UnmarshalJSON(cfg.GenesisState[types.ModuleName], &state)) - - pauser := &types.Pauser{} - nullify.Fill(&pauser) - state.Pauser = pauser - buf, err := cfg.Codec.MarshalJSON(&state) - require.NoError(t, err) - cfg.GenesisState[types.ModuleName] = buf - return network.New(t, cfg), *state.Pauser -} - -func TestShowPauser(t *testing.T) { - net, obj := networkWithPauserObjects(t) - - ctx := net.Validators[0].ClientCtx - common := []string{ - fmt.Sprintf("--%s=json", tmcli.OutputFlag), - } - for _, tc := range []struct { - desc string - args []string - err error - obj types.Pauser - }{ - { - desc: "get", - args: common, - obj: obj, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - var args []string - args = append(args, tc.args...) - out, err := clitestutil.ExecTestCLICmd(ctx, cli.CmdShowPauser(), args) - if tc.err != nil { - stat, ok := status.FromError(tc.err) - require.True(t, ok) - require.ErrorIs(t, stat.Err(), tc.err) - } else { - require.NoError(t, err) - var resp types.QueryGetPauserResponse - require.NoError(t, net.Config.Codec.UnmarshalJSON(out.Bytes(), &resp)) - require.NotNil(t, resp.Pauser) - require.Equal(t, - nullify.Fill(&tc.obj), - nullify.Fill(&resp.Pauser), - ) - } - }) - } -}