From 743a2e668f1ac584432c30edd6b2c5dcc16a5c36 Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Thu, 13 Apr 2023 13:51:23 +0700 Subject: [PATCH 01/50] init --- go.work.sum | 2 + tests/interchaintest/ibc_transfer_test.go | 107 ++++++++++++++++++---- tests/interchaintest/setup.go | 2 + 3 files changed, 95 insertions(+), 16 deletions(-) diff --git a/go.work.sum b/go.work.sum index b905cb3..e6a3075 100644 --- a/go.work.sum +++ b/go.work.sum @@ -886,6 +886,8 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= +github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= +github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= diff --git a/tests/interchaintest/ibc_transfer_test.go b/tests/interchaintest/ibc_transfer_test.go index 2366821..a4789ad 100644 --- a/tests/interchaintest/ibc_transfer_test.go +++ b/tests/interchaintest/ibc_transfer_test.go @@ -39,7 +39,13 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { }, { Name: "gaia", - Version: "v9.0.0", + Version: "v9.0.2", + NumValidators: &numVals, + NumFullNodes: &numFullNodes, + }, + { + Name: "osmosis", + Version: "v15.0.0", NumValidators: &numVals, NumFullNodes: &numFullNodes, }, @@ -49,29 +55,71 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { chains, err := cf.Chains(t.Name()) require.NoError(t, err) - feeabs, gaia := chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain) + feeabs, gaia, osmosis := chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain), chains[2].(*cosmos.CosmosChain) // Create relayer factory to utilize the go-relayer client, network := interchaintest.DockerSetup(t) - r := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) - + r1 := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) + r2 := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) + r3 := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) // Create a new Interchain object which describes the chains, relayers, and IBC connections we want to use - ic := interchaintest.NewInterchain(). + ic1 := interchaintest.NewInterchain(). AddChain(feeabs). AddChain(gaia). - AddRelayer(r, "rly"). + AddRelayer(r1, "rly1"). AddLink(interchaintest.InterchainLink{ Chain1: feeabs, Chain2: gaia, - Relayer: r, + Relayer: r1, Path: pathFeeabsGaia, }) - + ic2 := interchaintest.NewInterchain(). + AddChain(feeabs). + AddChain(osmosis). + AddRelayer(r2, "rly2"). + AddLink(interchaintest.InterchainLink{ + Chain1: feeabs, + Chain2: osmosis, + Relayer: r2, + Path: pathFeeabsOsmosis, + }) + ic3 := interchaintest.NewInterchain(). + AddChain(osmosis). + AddChain(gaia). + AddRelayer(r3, "rly3"). + AddLink(interchaintest.InterchainLink{ + Chain1: osmosis, + Chain2: gaia, + Relayer: r3, + Path: pathOsmosisGaia, + }) rep := testreporter.NewNopReporter() eRep := rep.RelayerExecReporter(t) - err = ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ + err = ic1.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ + TestName: t.Name(), + Client: client, + NetworkID: network, + SkipPathCreation: false, + + // This can be used to write to the block database which will index all block data e.g. txs, msgs, events, etc. + // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), + }) + require.NoError(t, err) + + err = ic2.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ + TestName: t.Name(), + Client: client, + NetworkID: network, + SkipPathCreation: false, + + // This can be used to write to the block database which will index all block data e.g. txs, msgs, events, etc. + // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), + }) + require.NoError(t, err) + + err = ic3.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ TestName: t.Name(), Client: client, NetworkID: network, @@ -83,14 +131,36 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { require.NoError(t, err) t.Cleanup(func() { - _ = ic.Close() + _ = ic1.Close() + _ = ic2.Close() + _ = ic3.Close() }) // Start the relayer - require.NoError(t, r.StartRelayer(ctx, eRep, pathFeeabsGaia)) + require.NoError(t, r1.StartRelayer(ctx, eRep, pathFeeabsGaia)) + t.Cleanup( + func() { + err := r1.StopRelayer(ctx, eRep) + if err != nil { + panic(fmt.Errorf("an error occurred while stopping the relayer: %s", err)) + } + }, + ) + + require.NoError(t, r2.StartRelayer(ctx, eRep, pathFeeabsOsmosis)) t.Cleanup( func() { - err := r.StopRelayer(ctx, eRep) + err := r2.StopRelayer(ctx, eRep) + if err != nil { + panic(fmt.Errorf("an error occurred while stopping the relayer: %s", err)) + } + }, + ) + + require.NoError(t, r3.StartRelayer(ctx, eRep, pathOsmosisGaia)) + t.Cleanup( + func() { + err := r3.StopRelayer(ctx, eRep) if err != nil { panic(fmt.Errorf("an error occurred while stopping the relayer: %s", err)) } @@ -98,17 +168,18 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { ) // Create some user accounts on both chains - users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), genesisWalletAmount, feeabs, gaia) + users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), genesisWalletAmount, feeabs, gaia, osmosis) // Wait a few blocks for relayer to start and for user accounts to be created - err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia) + err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia, osmosis) require.NoError(t, err) // Get our Bech32 encoded user addresses - feeabsUser, gaiaUser := users[0], users[1] + feeabsUser, gaiaUser, osmosisUser := users[0], users[1], users[2] feeabsUserAddr := feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) gaiaUserAddr := gaiaUser.Bech32Address(gaia.Config().Bech32Prefix) + osmosisUserAddr := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) // Get original account balances feeabsOrigBal, err := feeabs.GetBalance(ctx, feeabsUserAddr, feeabs.Config().Denom) @@ -119,6 +190,10 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { require.NoError(t, err) require.Equal(t, genesisWalletAmount, gaiaOrigBal) + osmosisOrigBal, err := osmosis.GetBalance(ctx, osmosisUserAddr, osmosis.Config().Denom) + require.NoError(t, err) + require.Equal(t, genesisWalletAmount, osmosisOrigBal) + // Compose an IBC transfer and send from feeabs -> Gaia const transferAmount = int64(1_000) transfer := ibc.WalletAmount{ @@ -127,7 +202,7 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { Amount: transferAmount, } - channel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) + channel, err := ibc.GetTransferChannel(ctx, r1, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) require.NoError(t, err) transferTx, err := feeabs.SendIBCTransfer(ctx, channel.ChannelID, feeabsUserAddr, transfer, ibc.TransferOptions{}) diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 6b58014..b62fd64 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -37,6 +37,8 @@ var ( } pathFeeabsGaia = "feeabs-gaia" + pathFeeabsOsmosis = "feeabs-osmosis" + pathOsmosisGaia = "osmosis-gaia" genesisWalletAmount = int64(10_000_000) ) From 9d50feaaf4c28d5ff48b4cd900dba6fd382e2264 Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Thu, 13 Apr 2023 16:09:17 +0700 Subject: [PATCH 02/50] add packet foward test --- tests/interchaintest/ibc_transfer_test.go | 105 +--- tests/interchaintest/packet_foward_test.go | 672 +++++++++++++++++++++ 2 files changed, 687 insertions(+), 90 deletions(-) create mode 100644 tests/interchaintest/packet_foward_test.go diff --git a/tests/interchaintest/ibc_transfer_test.go b/tests/interchaintest/ibc_transfer_test.go index a4789ad..ed51801 100644 --- a/tests/interchaintest/ibc_transfer_test.go +++ b/tests/interchaintest/ibc_transfer_test.go @@ -43,83 +43,35 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { NumValidators: &numVals, NumFullNodes: &numFullNodes, }, - { - Name: "osmosis", - Version: "v15.0.0", - NumValidators: &numVals, - NumFullNodes: &numFullNodes, - }, }) // Get chains from the chain factory chains, err := cf.Chains(t.Name()) require.NoError(t, err) - feeabs, gaia, osmosis := chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain), chains[2].(*cosmos.CosmosChain) + feeabs, gaia := chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain) // Create relayer factory to utilize the go-relayer client, network := interchaintest.DockerSetup(t) - r1 := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) - r2 := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) - r3 := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) + r := interchaintest.NewBuiltinRelayerFactory(ibc.CosmosRly, zaptest.NewLogger(t)).Build(t, client, network) + // Create a new Interchain object which describes the chains, relayers, and IBC connections we want to use - ic1 := interchaintest.NewInterchain(). + ic := interchaintest.NewInterchain(). AddChain(feeabs). AddChain(gaia). - AddRelayer(r1, "rly1"). + AddRelayer(r, "rly"). AddLink(interchaintest.InterchainLink{ Chain1: feeabs, Chain2: gaia, - Relayer: r1, + Relayer: r, Path: pathFeeabsGaia, }) - ic2 := interchaintest.NewInterchain(). - AddChain(feeabs). - AddChain(osmosis). - AddRelayer(r2, "rly2"). - AddLink(interchaintest.InterchainLink{ - Chain1: feeabs, - Chain2: osmosis, - Relayer: r2, - Path: pathFeeabsOsmosis, - }) - ic3 := interchaintest.NewInterchain(). - AddChain(osmosis). - AddChain(gaia). - AddRelayer(r3, "rly3"). - AddLink(interchaintest.InterchainLink{ - Chain1: osmosis, - Chain2: gaia, - Relayer: r3, - Path: pathOsmosisGaia, - }) + rep := testreporter.NewNopReporter() eRep := rep.RelayerExecReporter(t) - err = ic1.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - SkipPathCreation: false, - - // This can be used to write to the block database which will index all block data e.g. txs, msgs, events, etc. - // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - }) - require.NoError(t, err) - - err = ic2.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ - TestName: t.Name(), - Client: client, - NetworkID: network, - SkipPathCreation: false, - - // This can be used to write to the block database which will index all block data e.g. txs, msgs, events, etc. - // BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - }) - require.NoError(t, err) - - err = ic3.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ + err = ic.Build(ctx, eRep, interchaintest.InterchainBuildOptions{ TestName: t.Name(), Client: client, NetworkID: network, @@ -131,36 +83,14 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { require.NoError(t, err) t.Cleanup(func() { - _ = ic1.Close() - _ = ic2.Close() - _ = ic3.Close() + _ = ic.Close() }) // Start the relayer - require.NoError(t, r1.StartRelayer(ctx, eRep, pathFeeabsGaia)) - t.Cleanup( - func() { - err := r1.StopRelayer(ctx, eRep) - if err != nil { - panic(fmt.Errorf("an error occurred while stopping the relayer: %s", err)) - } - }, - ) - - require.NoError(t, r2.StartRelayer(ctx, eRep, pathFeeabsOsmosis)) + require.NoError(t, r.StartRelayer(ctx, eRep, pathFeeabsGaia)) t.Cleanup( func() { - err := r2.StopRelayer(ctx, eRep) - if err != nil { - panic(fmt.Errorf("an error occurred while stopping the relayer: %s", err)) - } - }, - ) - - require.NoError(t, r3.StartRelayer(ctx, eRep, pathOsmosisGaia)) - t.Cleanup( - func() { - err := r3.StopRelayer(ctx, eRep) + err := r.StopRelayer(ctx, eRep) if err != nil { panic(fmt.Errorf("an error occurred while stopping the relayer: %s", err)) } @@ -168,18 +98,17 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { ) // Create some user accounts on both chains - users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), genesisWalletAmount, feeabs, gaia, osmosis) + users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), genesisWalletAmount, feeabs, gaia) // Wait a few blocks for relayer to start and for user accounts to be created - err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia, osmosis) + err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia) require.NoError(t, err) // Get our Bech32 encoded user addresses - feeabsUser, gaiaUser, osmosisUser := users[0], users[1], users[2] + feeabsUser, gaiaUser := users[0], users[1] feeabsUserAddr := feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) gaiaUserAddr := gaiaUser.Bech32Address(gaia.Config().Bech32Prefix) - osmosisUserAddr := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) // Get original account balances feeabsOrigBal, err := feeabs.GetBalance(ctx, feeabsUserAddr, feeabs.Config().Denom) @@ -190,10 +119,6 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { require.NoError(t, err) require.Equal(t, genesisWalletAmount, gaiaOrigBal) - osmosisOrigBal, err := osmosis.GetBalance(ctx, osmosisUserAddr, osmosis.Config().Denom) - require.NoError(t, err) - require.Equal(t, genesisWalletAmount, osmosisOrigBal) - // Compose an IBC transfer and send from feeabs -> Gaia const transferAmount = int64(1_000) transfer := ibc.WalletAmount{ @@ -202,7 +127,7 @@ func TestFeeabsGaiaIBCTransfer(t *testing.T) { Amount: transferAmount, } - channel, err := ibc.GetTransferChannel(ctx, r1, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) + channel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) require.NoError(t, err) transferTx, err := feeabs.SendIBCTransfer(ctx, channel.ChannelID, feeabsUserAddr, transfer, ibc.TransferOptions{}) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go new file mode 100644 index 0000000..405516d --- /dev/null +++ b/tests/interchaintest/packet_foward_test.go @@ -0,0 +1,672 @@ +package interchaintest + +import ( + "context" + "encoding/json" + "testing" + "time" + + transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" + interchaintest "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"` +} + +func TestPacketForwardMiddleware(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + + client, network := interchaintest.DockerSetup(t) + + rep := testreporter.NewNopReporter() + eRep := rep.RelayerExecReporter(t) + + ctx := context.Background() + + // Create chain factory with Feeabs and Gaia + numVals := 1 + numFullNodes := 1 + + cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ + { + Name: "feeabs", + ChainConfig: feeabsConfig, + NumValidators: &numVals, + NumFullNodes: &numFullNodes, + }, + { + Name: "gaia", + Version: "v9.0.2", + NumValidators: &numVals, + NumFullNodes: &numFullNodes, + }, + { + Name: "osmosis", + Version: "v15.0.0", + NumValidators: &numVals, + NumFullNodes: &numFullNodes, + }, + }) + + chains, err := cf.Chains(t.Name()) + require.NoError(t, err) + + feeabs, gaia, osmosis := chains[0].(*cosmos.CosmosChain), chains[1].(*cosmos.CosmosChain), chains[2].(*cosmos.CosmosChain) + + r := interchaintest.NewBuiltinRelayerFactory( + ibc.CosmosRly, + zaptest.NewLogger(t), + ).Build(t, client, network) + + ic := interchaintest.NewInterchain(). + AddChain(feeabs). + AddChain(gaia). + AddChain(osmosis). + AddRelayer(r, "relayer"). + AddLink(interchaintest.InterchainLink{ + Chain1: feeabs, + Chain2: gaia, + Relayer: r, + Path: pathFeeabsGaia, + }). + AddLink(interchaintest.InterchainLink{ + Chain1: feeabs, + Chain2: osmosis, + Relayer: r, + Path: pathFeeabsOsmosis, + }). + AddLink(interchaintest.InterchainLink{ + Chain1: osmosis, + Chain2: gaia, + Relayer: r, + Path: pathOsmosisGaia, + }) + + 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, feeabs, gaia, osmosis) + + feeabsgaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) + require.NoError(t, err) + + gaiafeeabsChannel := feeabsgaiaChannel.Counterparty + + feeabsosmosisChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, osmosis.Config().ChainID) + require.NoError(t, err) + + osmosisfeeabsChannel := feeabsosmosisChannel.Counterparty + + osmosisgaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, osmosis.Config().ChainID, gaia.Config().ChainID) + require.NoError(t, err) + + gaiaosmosisChannel := osmosisgaiaChannel.Counterparty + + // Start the relayer on both paths + err = r.StartRelayer(ctx, eRep, pathFeeabsGaia, pathFeeabsOsmosis, pathOsmosisGaia) + 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 + feeabsUser, gaiaUser, osmosisUser := users[0], users[1], users[2] + + const transferAmount int64 = 100000 + + // Compose the prefixed denoms and ibc denom for asserting balances + firstHopDenom := transfertypes.GetPrefixedDenom(gaiafeeabsChannel.PortID, gaiafeeabsChannel.ChannelID, feeabs.Config().Denom) + secondHopDenom := transfertypes.GetPrefixedDenom(osmosisfeeabsChannel.PortID, osmosisfeeabsChannel.ChannelID, firstHopDenom) + thirdHopDenom := transfertypes.GetPrefixedDenom(gaiaosmosisChannel.PortID, gaiaosmosisChannel.ChannelID, secondHopDenom) + + firstHopDenomTrace := transfertypes.ParseDenomTrace(firstHopDenom) + secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) + thirdHopDenomTrace := transfertypes.ParseDenomTrace(thirdHopDenom) + + firstHopIBCDenom := firstHopDenomTrace.IBCDenom() + secondHopIBCDenom := secondHopDenomTrace.IBCDenom() + thirdHopIBCDenom := thirdHopDenomTrace.IBCDenom() + + firstHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsgaiaChannel.PortID, feeabsgaiaChannel.ChannelID).String() + secondHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsosmosisChannel.PortID, feeabsosmosisChannel.ChannelID).String() + thirdHopEscrowAccount := transfertypes.GetEscrowAddress(osmosisgaiaChannel.PortID, osmosisgaiaChannel.ChannelID).String() + + t.Run("multi-hop feeabs->gaia->osmosis", func(t *testing.T) { + // Send packet from Chain A->Chain B->Chain C->Chain D + + transfer := ibc.WalletAmount{ + Address: feeabsUser.FormattedAddress(), + Denom: feeabs.Config().Denom, + Amount: transferAmount, + } + + secondHopMetadata := &PacketMetadata{ + Forward: &ForwardMetadata{ + Receiver: gaia.FormattedAddress(), + Channel: feeabsgaiaChannel.ChannelID, + Port: feeabsgaiaChannel.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, transfertypes.GetEscrowAddress(baChan.PortID, baChan.ChannelID).String(), 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, transfertypes.GetEscrowAddress(cdChan.PortID, cdChan.ChannelID).String(), bcIBCDenom) + require.NoError(t, err) + + bcEscrowBalance, err := chainB.GetBalance(ctx, transfertypes.GetEscrowAddress(bcChan.PortID, bcChan.ChannelID).String(), chainB.Config().Denom) + require.NoError(t, err) + + baEscrowBalance, err = chainB.GetBalance(ctx, transfertypes.GetEscrowAddress(baChan.PortID, baChan.ChannelID).String(), chainB.Config().Denom) + require.NoError(t, err) + + require.Equal(t, transferAmount, baEscrowBalance) + require.Equal(t, int64(0), bcEscrowBalance) + require.Equal(t, int64(0), cdEscrowBalance) + }) + + t.Run("forward a->b->a", func(t *testing.T) { + // Send packet from Chain A->Chain B->Chain A + + userABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) + require.NoError(t, err, "failed to get user a balance") + + userBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopDenom) + require.NoError(t, err, "failed to get user a balance") + + transfer := ibc.WalletAmount{ + Address: userB.FormattedAddress(), + Denom: chainA.Config().Denom, + Amount: transferAmount, + } + + firstHopMetadata := &PacketMetadata{ + Forward: &ForwardMetadata{ + Receiver: userA.FormattedAddress(), + Channel: baChan.ChannelID, + Port: baChan.PortID, + }, + } + + 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) + + require.Equal(t, userABalance, chainABalance) + require.Equal(t, userBBalance, chainBBalance) + }) +} From fe5558023e327d49ebce083674fb7d3589bb5216 Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Thu, 13 Apr 2023 16:22:07 +0700 Subject: [PATCH 03/50] add makefile and CI jobs --- .github/workflows/interchaintest.yaml | 12 ++++++++++++ Makefile | 10 +++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/interchaintest.yaml b/.github/workflows/interchaintest.yaml index 3d84c75..88362a9 100644 --- a/.github/workflows/interchaintest.yaml +++ b/.github/workflows/interchaintest.yaml @@ -32,4 +32,16 @@ jobs: uses: actions/checkout@v3 - run: make ictest-ibc + test-packet-forward: + runs-on: ubuntu-latest + steps: + - name: Set up Go 1.19 + uses: actions/setup-go@v3 + with: + go-version: 1.19 + + - name: checkout code + uses: actions/checkout@v3 + + - run: make ictest-packet-forward diff --git a/Makefile b/Makefile index 9ee24e4..b1d0d94 100644 --- a/Makefile +++ b/Makefile @@ -103,12 +103,16 @@ ictest-basic: # Executes IBC tests via interchaintest ictest-ibc: - cd tests/interchaintest && go test -race -v -run TestFeeabsGaiaIBCTransfer . + cd tests/interchaintest && go test -timeout=25m -race -v -run TestFeeabsGaiaIBCTransfer . + +# Executes IBC tests via interchaintest +ictest-packet-forward: + cd tests/interchaintest && go test -timeout=25m -race -v -run TestPacketForwardMiddleware . # Executes all tests via interchaintest after compling a local image as juno:local -ictest-all: ictest-basic ictest-ibc +ictest-all: ictest-basic ictest-ibc ictest-packet-forward -.PHONY: ictest-basic ictest-ibc ictest-all +.PHONY: ictest-basic ictest-ibc ictest-packet-forward ictest-all ############################################################################### ### Proto ### From 57f30cfb60302455f57d7a167308c75b4cde04d1 Mon Sep 17 00:00:00 2001 From: GnaD Date: Fri, 14 Apr 2023 17:07:09 +0700 Subject: [PATCH 04/50] add bytecode and code structure --- .../bytecode/crosschain_registry.wasm | Bin 0 -> 377257 bytes .../bytecode/crosschain_swaps.wasm | Bin 0 -> 437302 bytes tests/interchaintest/bytecode/swaprouter.wasm | Bin 0 -> 244913 bytes tests/interchaintest/packet_foward_test.go | 553 ++---------------- 4 files changed, 34 insertions(+), 519 deletions(-) create mode 100644 tests/interchaintest/bytecode/crosschain_registry.wasm create mode 100644 tests/interchaintest/bytecode/crosschain_swaps.wasm create mode 100644 tests/interchaintest/bytecode/swaprouter.wasm diff --git a/tests/interchaintest/bytecode/crosschain_registry.wasm b/tests/interchaintest/bytecode/crosschain_registry.wasm new file mode 100644 index 0000000000000000000000000000000000000000..4248452bd5a6e3a509f1e01d5104c917eaa31cfc GIT binary patch literal 377257 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⪚Y?q*@Y!&CVKD4lD)CvXWfXm6k8)is13` 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 literal 0 HcmV?d00001 diff --git a/tests/interchaintest/bytecode/crosschain_swaps.wasm b/tests/interchaintest/bytecode/crosschain_swaps.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7d32608b8b598faccac5bcd16d5b1e777590c443 GIT binary patch literal 437302 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·Ssm@jP-t>bk` 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 z�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 EA6JQ|YXATM literal 0 HcmV?d00001 diff --git a/tests/interchaintest/bytecode/swaprouter.wasm b/tests/interchaintest/bytecode/swaprouter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..29288d42fa0b8a2b9eab53c5cea697e3b81072fb GIT binary patch literal 244913 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�Q^m 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 literal 0 HcmV?d00001 diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 405516d..a245887 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -2,16 +2,13 @@ package interchaintest import ( "context" - "encoding/json" "testing" "time" - transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" interchaintest "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" ) @@ -116,20 +113,20 @@ func TestPacketForwardMiddleware(t *testing.T) { const userFunds = int64(10_000_000_000) users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), userFunds, feeabs, gaia, osmosis) - feeabsgaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) + feeabsGaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) require.NoError(t, err) + gaiaFeeabsChannel := feeabsGaiaChannel.Counterparty + _ = gaiaFeeabsChannel - gaiafeeabsChannel := feeabsgaiaChannel.Counterparty - - feeabsosmosisChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, osmosis.Config().ChainID) + feeabsOsmosisChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, osmosis.Config().ChainID) require.NoError(t, err) + osmosisFeeabsChannel := feeabsOsmosisChannel.Counterparty + _ = osmosisFeeabsChannel - osmosisfeeabsChannel := feeabsosmosisChannel.Counterparty - - osmosisgaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, osmosis.Config().ChainID, gaia.Config().ChainID) + osmosisGaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, osmosis.Config().ChainID, gaia.Config().ChainID) require.NoError(t, err) - - gaiaosmosisChannel := osmosisgaiaChannel.Counterparty + gaiaOsmosisChannel := osmosisGaiaChannel.Counterparty + _ = gaiaOsmosisChannel // Start the relayer on both paths err = r.StartRelayer(ctx, eRep, pathFeeabsGaia, pathFeeabsOsmosis, pathOsmosisGaia) @@ -146,527 +143,45 @@ func TestPacketForwardMiddleware(t *testing.T) { // Get original account balances feeabsUser, gaiaUser, osmosisUser := users[0], users[1], users[2] + _ = feeabsUser + _ = gaiaUser const transferAmount int64 = 100000 // Compose the prefixed denoms and ibc denom for asserting balances - firstHopDenom := transfertypes.GetPrefixedDenom(gaiafeeabsChannel.PortID, gaiafeeabsChannel.ChannelID, feeabs.Config().Denom) - secondHopDenom := transfertypes.GetPrefixedDenom(osmosisfeeabsChannel.PortID, osmosisfeeabsChannel.ChannelID, firstHopDenom) - thirdHopDenom := transfertypes.GetPrefixedDenom(gaiaosmosisChannel.PortID, gaiaosmosisChannel.ChannelID, secondHopDenom) - - firstHopDenomTrace := transfertypes.ParseDenomTrace(firstHopDenom) - secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) - thirdHopDenomTrace := transfertypes.ParseDenomTrace(thirdHopDenom) - - firstHopIBCDenom := firstHopDenomTrace.IBCDenom() - secondHopIBCDenom := secondHopDenomTrace.IBCDenom() - thirdHopIBCDenom := thirdHopDenomTrace.IBCDenom() - - firstHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsgaiaChannel.PortID, feeabsgaiaChannel.ChannelID).String() - secondHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsosmosisChannel.PortID, feeabsosmosisChannel.ChannelID).String() - thirdHopEscrowAccount := transfertypes.GetEscrowAddress(osmosisgaiaChannel.PortID, osmosisgaiaChannel.ChannelID).String() - - t.Run("multi-hop feeabs->gaia->osmosis", func(t *testing.T) { - // Send packet from Chain A->Chain B->Chain C->Chain D - - transfer := ibc.WalletAmount{ - Address: feeabsUser.FormattedAddress(), - Denom: feeabs.Config().Denom, - Amount: transferAmount, - } - - secondHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: gaia.FormattedAddress(), - Channel: feeabsgaiaChannel.ChannelID, - Port: feeabsgaiaChannel.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) + // firstHopDenom := transfertypes.GetPrefixedDenom(gaiafeeabsChannel.PortID, gaiafeeabsChannel.ChannelID, feeabs.Config().Denom) + // secondHopDenom := transfertypes.GetPrefixedDenom(osmosisfeeabsChannel.PortID, osmosisfeeabsChannel.ChannelID, firstHopDenom) + // thirdHopDenom := transfertypes.GetPrefixedDenom(gaiaosmosisChannel.PortID, gaiaosmosisChannel.ChannelID, secondHopDenom) - 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, transfertypes.GetEscrowAddress(baChan.PortID, baChan.ChannelID).String(), 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) + // firstHopDenomTrace := transfertypes.ParseDenomTrace(firstHopDenom) + // secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) + // thirdHopDenomTrace := transfertypes.ParseDenomTrace(thirdHopDenom) - 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) + // firstHopIBCDenom := firstHopDenomTrace.IBCDenom() + // secondHopIBCDenom := secondHopDenomTrace.IBCDenom() + // thirdHopIBCDenom := thirdHopDenomTrace.IBCDenom() - 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, transfertypes.GetEscrowAddress(cdChan.PortID, cdChan.ChannelID).String(), bcIBCDenom) - require.NoError(t, err) - - bcEscrowBalance, err := chainB.GetBalance(ctx, transfertypes.GetEscrowAddress(bcChan.PortID, bcChan.ChannelID).String(), chainB.Config().Denom) - require.NoError(t, err) - - baEscrowBalance, err = chainB.GetBalance(ctx, transfertypes.GetEscrowAddress(baChan.PortID, baChan.ChannelID).String(), chainB.Config().Denom) - require.NoError(t, err) - - require.Equal(t, transferAmount, baEscrowBalance) - require.Equal(t, int64(0), bcEscrowBalance) - require.Equal(t, int64(0), cdEscrowBalance) - }) + // firstHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsgaiaChannel.PortID, feeabsgaiaChannel.ChannelID).String() + // secondHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsosmosisChannel.PortID, feeabsosmosisChannel.ChannelID).String() + // thirdHopEscrowAccount := transfertypes.GetEscrowAddress(osmosisgaiaChannel.PortID, osmosisgaiaChannel.ChannelID).String() t.Run("forward a->b->a", func(t *testing.T) { - // Send packet from Chain A->Chain B->Chain A - - userABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err, "failed to get user a balance") - - userBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopDenom) - require.NoError(t, err, "failed to get user a balance") - - transfer := ibc.WalletAmount{ - Address: userB.FormattedAddress(), - Denom: chainA.Config().Denom, - Amount: transferAmount, - } - - firstHopMetadata := &PacketMetadata{ - Forward: &ForwardMetadata{ - Receiver: userA.FormattedAddress(), - Channel: baChan.ChannelID, - Port: baChan.PortID, - }, - } - - memo, err := json.Marshal(firstHopMetadata) + // Setup contract on Osmosis + // Store code + crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") require.NoError(t, err) + _ = crossChainRegistryContractID + // Instatiate + // Execute - chainAHeight, err := chainA.Height(ctx) - require.NoError(t, err) + // Send Gaia uatom to Osmosis - 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) + // Send Gaia uatom to Feeabs - chainABalance, err := chainA.GetBalance(ctx, userA.FormattedAddress(), chainA.Config().Denom) - require.NoError(t, err) + // Send Feeabs stake to Osmosis - chainBBalance, err := chainB.GetBalance(ctx, userB.FormattedAddress(), firstHopIBCDenom) - require.NoError(t, err) + // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis - require.Equal(t, userABalance, chainABalance) - require.Equal(t, userBBalance, chainBBalance) + // Swap Feeabs(uatom) to Osmosis }) } From 3c529ead9583e47ee7a0c7db345b0595e126290f Mon Sep 17 00:00:00 2001 From: ducnt131 Date: Sun, 16 Apr 2023 11:17:39 +0700 Subject: [PATCH 05/50] Use interchaintest folk from notional-labs but need bump cosmossdk to v47.0.1 --- tests/interchaintest/chain_start_test.go | 6 +++--- tests/interchaintest/go.mod | 7 +++++-- tests/interchaintest/ibc_transfer_test.go | 12 ++++++------ tests/interchaintest/packet_foward_test.go | 8 ++++---- tests/interchaintest/setup.go | 4 ++-- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/tests/interchaintest/chain_start_test.go b/tests/interchaintest/chain_start_test.go index aae8287..67c4ac8 100644 --- a/tests/interchaintest/chain_start_test.go +++ b/tests/interchaintest/chain_start_test.go @@ -4,9 +4,9 @@ import ( "context" "testing" - "github.com/strangelove-ventures/interchaintest/v4" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v4/testreporter" + "github.com/strangelove-ventures/interchaintest/v7" + "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v7/testreporter" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index 06c8398..fe29c59 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -4,9 +4,9 @@ go 1.19 require ( github.com/cosmos/cosmos-sdk v0.45.14 - github.com/cosmos/ibc-go/v4 v4.3.0 + github.com/cosmos/ibc-go/v7 v7.0.0 github.com/notional-labs/fee-abstraction/v2 v2.0.1 - github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20230331040355-5d08aab13017 + github.com/strangelove-ventures/interchaintest/v7 v7.0.0 github.com/stretchr/testify v1.8.2 go.uber.org/zap v1.23.0 ) @@ -188,6 +188,9 @@ replace ( github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.45.13-ics github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + // Use folk from notional-labs + github.com/strangelove-ventures/interchaintest/v7 v7.0.0 => github.com/notional-labs/interchaintest/v7 v7.0.7 + // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ diff --git a/tests/interchaintest/ibc_transfer_test.go b/tests/interchaintest/ibc_transfer_test.go index ed51801..2fdf044 100644 --- a/tests/interchaintest/ibc_transfer_test.go +++ b/tests/interchaintest/ibc_transfer_test.go @@ -5,12 +5,12 @@ import ( "fmt" "testing" - 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" + transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + "github.com/strangelove-ventures/interchaintest/v7" + "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v7/ibc" + "github.com/strangelove-ventures/interchaintest/v7/testreporter" + "github.com/strangelove-ventures/interchaintest/v7/testutil" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index a245887..4569161 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" - interchaintest "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" + interchaintest "github.com/strangelove-ventures/interchaintest/v7" + "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v7/ibc" + "github.com/strangelove-ventures/interchaintest/v7/testreporter" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index b62fd64..720984a 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -3,8 +3,8 @@ package interchaintest import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" feeabstype "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v4/ibc" + "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v7/ibc" ) var ( From 7c89df7be30c734457a45d19a480f1640215b48f Mon Sep 17 00:00:00 2001 From: GnaD Date: Mon, 17 Apr 2023 00:54:48 +0700 Subject: [PATCH 06/50] nit --- tests/interchaintest/packet_foward_test.go | 36 ++++++++++++++++------ 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index a245887..ac67d6e 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -51,14 +51,20 @@ func TestPacketForwardMiddleware(t *testing.T) { NumFullNodes: &numFullNodes, }, { - Name: "gaia", - Version: "v9.0.2", + Name: "gaia", + Version: "v9.0.2", + ChainConfig: ibc.ChainConfig{ + GasPrices: "0.0uatom", + }, NumValidators: &numVals, NumFullNodes: &numFullNodes, }, { - Name: "osmosis", - Version: "v15.0.0", + Name: "osmosis", + Version: "v15.0.0", + ChainConfig: ibc.ChainConfig{ + GasPrices: "0.005uosmo", + }, NumValidators: &numVals, NumFullNodes: &numFullNodes, }, @@ -145,8 +151,9 @@ func TestPacketForwardMiddleware(t *testing.T) { feeabsUser, gaiaUser, osmosisUser := users[0], users[1], users[2] _ = feeabsUser _ = gaiaUser + _ = osmosisUser - const transferAmount int64 = 100000 + // const transferAmount int64 = 100000 // Compose the prefixed denoms and ibc denom for asserting balances // firstHopDenom := transfertypes.GetPrefixedDenom(gaiafeeabsChannel.PortID, gaiafeeabsChannel.ChannelID, feeabs.Config().Denom) @@ -167,12 +174,23 @@ func TestPacketForwardMiddleware(t *testing.T) { t.Run("forward a->b->a", func(t *testing.T) { // Setup contract on Osmosis - // Store code - crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") + // Store code crosschain Registry + crossChainRegistryContractID, err := feeabs.StoreContract(ctx, feeabsUser.KeyName, "./bytecode/crosschain_registry.wasm") require.NoError(t, err) _ = crossChainRegistryContractID - // Instatiate - // Execute + // // Instatiate + // owner := feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) + // swapRegistryInitMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) + // address, err := feeabs.InstantiateContract(ctx, feeabsUser.KeyName, crossChainRegistryContractID, swapRegistryInitMsg, true) + // require.NoError(t, err) + // feeabs.FullNodes + // // Execute + // msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", feeabsOsmosisChannel, osmosisFeeabsChannel, feeabsGaiaChannel, gaiaFeeabsChannel, osmosisGaiaChannel, gaiaOsmosisChannel) + // txHash, err := feeabs.ExecuteContract(ctx, feeabsUser.KeyName, address, msg) + // require.NoError(t, err) + // fmt.Printf("Hash----------------: %s", txHash) + // tx, err := feeabs.GetTransaction(txHash) + // fmt.Printf("tx----------------: %v", tx) // Send Gaia uatom to Osmosis From df8b1a0133902cd233202d37c89af5f5f288d13f Mon Sep 17 00:00:00 2001 From: ducnt131 Date: Mon, 17 Apr 2023 11:27:20 +0700 Subject: [PATCH 07/50] Revert "Use interchaintest folk from notional-labs but need bump cosmossdk to v47.0.1" This reverts commit 3c529ead9583e47ee7a0c7db345b0595e126290f. --- tests/interchaintest/chain_start_test.go | 6 +++--- tests/interchaintest/go.mod | 7 ++----- tests/interchaintest/ibc_transfer_test.go | 12 ++++++------ tests/interchaintest/packet_foward_test.go | 8 ++++---- tests/interchaintest/setup.go | 4 ++-- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/tests/interchaintest/chain_start_test.go b/tests/interchaintest/chain_start_test.go index 67c4ac8..aae8287 100644 --- a/tests/interchaintest/chain_start_test.go +++ b/tests/interchaintest/chain_start_test.go @@ -4,9 +4,9 @@ import ( "context" "testing" - "github.com/strangelove-ventures/interchaintest/v7" - "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v7/testreporter" + "github.com/strangelove-ventures/interchaintest/v4" + "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v4/testreporter" "github.com/stretchr/testify/require" "go.uber.org/zap/zaptest" ) diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index fe29c59..06c8398 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -4,9 +4,9 @@ go 1.19 require ( github.com/cosmos/cosmos-sdk v0.45.14 - github.com/cosmos/ibc-go/v7 v7.0.0 + github.com/cosmos/ibc-go/v4 v4.3.0 github.com/notional-labs/fee-abstraction/v2 v2.0.1 - github.com/strangelove-ventures/interchaintest/v7 v7.0.0 + github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20230331040355-5d08aab13017 github.com/stretchr/testify v1.8.2 go.uber.org/zap v1.23.0 ) @@ -188,9 +188,6 @@ replace ( github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.45.13-ics github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - // Use folk from notional-labs - github.com/strangelove-ventures/interchaintest/v7 v7.0.0 => github.com/notional-labs/interchaintest/v7 v7.0.7 - // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ diff --git a/tests/interchaintest/ibc_transfer_test.go b/tests/interchaintest/ibc_transfer_test.go index 2fdf044..ed51801 100644 --- a/tests/interchaintest/ibc_transfer_test.go +++ b/tests/interchaintest/ibc_transfer_test.go @@ -5,12 +5,12 @@ import ( "fmt" "testing" - transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - "github.com/strangelove-ventures/interchaintest/v7" - "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v7/ibc" - "github.com/strangelove-ventures/interchaintest/v7/testreporter" - "github.com/strangelove-ventures/interchaintest/v7/testutil" + 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" ) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 4569161..a245887 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -5,10 +5,10 @@ import ( "testing" "time" - interchaintest "github.com/strangelove-ventures/interchaintest/v7" - "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v7/ibc" - "github.com/strangelove-ventures/interchaintest/v7/testreporter" + interchaintest "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/stretchr/testify/require" "go.uber.org/zap/zaptest" ) diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 720984a..b62fd64 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -3,8 +3,8 @@ package interchaintest import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" feeabstype "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" - "github.com/strangelove-ventures/interchaintest/v7/chain/cosmos" - "github.com/strangelove-ventures/interchaintest/v7/ibc" + "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v4/ibc" ) var ( From 1e0c8815fc4b4f0784e7d713cc22d22009221a51 Mon Sep 17 00:00:00 2001 From: GnaD Date: Mon, 17 Apr 2023 23:12:43 +0700 Subject: [PATCH 08/50] add setup rly ictest --- go.work.sum | 9 +- tests/interchaintest/go.mod | 14 +- tests/interchaintest/go.sum | 7 +- .../osmosistypes/gamm/types/codec.go | 35 + .../osmosistypes/gamm/types/genesis.pb.go | 620 ++ .../osmosistypes/gamm/types/msgs.go | 206 + .../osmosistypes/gamm/types/query.pb.go | 6727 +++++++++++++++++ .../osmosistypes/gamm/types/query.pb.gw.go | 1484 ++++ .../osmosistypes/gamm/types/tx.pb.go | 4972 ++++++++++++ tests/interchaintest/packet_foward_test.go | 188 +- tests/interchaintest/setup.go | 15 +- 11 files changed, 14237 insertions(+), 40 deletions(-) create mode 100644 tests/interchaintest/osmosistypes/gamm/types/codec.go create mode 100644 tests/interchaintest/osmosistypes/gamm/types/genesis.pb.go create mode 100644 tests/interchaintest/osmosistypes/gamm/types/msgs.go create mode 100644 tests/interchaintest/osmosistypes/gamm/types/query.pb.go create mode 100644 tests/interchaintest/osmosistypes/gamm/types/query.pb.gw.go create mode 100644 tests/interchaintest/osmosistypes/gamm/types/tx.pb.go diff --git a/go.work.sum b/go.work.sum index e6a3075..a26fd13 100644 --- a/go.work.sum +++ b/go.work.sum @@ -298,10 +298,6 @@ github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EF github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/CosmWasm/wasmd v0.31.0 h1:xACf6A/SkCeGWQWrKGsR4X9PQb5G4XYuNfnrl+HQ1mE= -github.com/CosmWasm/wasmd v0.31.0/go.mod h1:VcyDGk/ISVlMUeW+1GGL0zdHWBS2FPwLEV2qZ86l7l8= -github.com/CosmWasm/wasmvm v1.2.1 h1:si0tRsRDdUShV0k51Wn6zRKlmj3/WWP9Yr4cLmDTf+8= -github.com/CosmWasm/wasmvm v1.2.1/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= @@ -418,8 +414,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32/go.mod h1:kwMlEC4wWvB48zAShGKVqboJL6w4zCLesaNQ3YLU2BQ= github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= -github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= -github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= github.com/cosmos/cosmos-sdk v0.45.12/go.mod h1:ZAdIs09zttoA3aSwQCTK9gecOThUVNnzBSVj3DiS6UY= github.com/cosmos/cosmos-sdk v0.47.0 h1:GKYtBpvjwuDEVix1vdnQpq7PuEOnItuEK0vdAL2cZ5g= github.com/cosmos/cosmos-sdk v0.47.0/go.mod h1:FTtZbqiHCZ2vun9WrPq6qLQafNKkAuIhLAxzLjr2TiI= @@ -435,6 +429,7 @@ github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XH github.com/cosmos/ibc-go/v7 v7.0.0 h1:j4kyywlG0hhDmT9FmSaR5iCIka7Pz7kJTxGWY1nlV9Q= github.com/cosmos/ibc-go/v7 v7.0.0/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= +github.com/cosmos/interchain-accounts v0.2.6 h1:TV2M2g1/Rb9MCNw1YePdBKE0rcEczNj1RGHT+2iRYas= github.com/cosmos/interchain-accounts v0.2.6/go.mod h1:lUzWNzCiCtIEYZefac5+YgEBz2aR39nMS374jIv1c7o= github.com/cosmos/interchain-accounts v0.5.1/go.mod h1:JB3gKbX8geQhxEIrBQtpDco0cyKMUDpVhugb78e5z6U= github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= @@ -1282,7 +1277,9 @@ gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index 06c8398..1096536 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -3,12 +3,18 @@ module github.com/notional-labs/fee-abstraction/tests/interchaintest go 1.19 require ( + github.com/cosmos/cosmos-proto v1.0.0-beta.2 github.com/cosmos/cosmos-sdk v0.45.14 github.com/cosmos/ibc-go/v4 v4.3.0 + github.com/gogo/protobuf v1.3.3 + github.com/golang/protobuf v1.5.2 + github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/notional-labs/fee-abstraction/v2 v2.0.1 github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20230331040355-5d08aab13017 github.com/stretchr/testify v1.8.2 go.uber.org/zap v1.23.0 + google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa + google.golang.org/grpc v1.53.0 ) require ( @@ -18,6 +24,8 @@ require ( github.com/BurntSushi/toml v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/ChainSafe/go-schnorrkel/1 v0.0.0-00010101000000-000000000000 // indirect + github.com/CosmWasm/wasmd v0.31.0 // indirect + github.com/CosmWasm/wasmvm v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.0 // indirect github.com/StirlingMarketingGroup/go-namecase v1.0.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect @@ -62,10 +70,8 @@ require ( github.com/go-stack/stack v1.8.1 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/gateway v1.1.0 // indirect - github.com/gogo/protobuf v1.3.3 // indirect github.com/golang/glog v1.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/flatbuffers v1.12.1 // indirect @@ -75,7 +81,6 @@ require ( github.com/gorilla/mux v1.8.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect @@ -158,14 +163,11 @@ require ( golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect golang.org/x/tools v0.6.0 // indirect - google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa // indirect - google.golang.org/grpc v1.53.0 // indirect google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.4.0 // indirect lukechampine.com/blake3 v1.1.6 // indirect lukechampine.com/uint128 v1.1.1 // indirect modernc.org/cc/v3 v3.36.0 // indirect diff --git a/tests/interchaintest/go.sum b/tests/interchaintest/go.sum index c72abad..c28dc55 100644 --- a/tests/interchaintest/go.sum +++ b/tests/interchaintest/go.sum @@ -58,6 +58,10 @@ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= +github.com/CosmWasm/wasmd v0.31.0 h1:xACf6A/SkCeGWQWrKGsR4X9PQb5G4XYuNfnrl+HQ1mE= +github.com/CosmWasm/wasmd v0.31.0/go.mod h1:VcyDGk/ISVlMUeW+1GGL0zdHWBS2FPwLEV2qZ86l7l8= +github.com/CosmWasm/wasmvm v1.2.1 h1:si0tRsRDdUShV0k51Wn6zRKlmj3/WWP9Yr4cLmDTf+8= +github.com/CosmWasm/wasmvm v1.2.1/go.mod h1:vW/E3h8j9xBQs9bCoijDuawKo9kCtxOaS8N8J7KFtkc= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= @@ -147,6 +151,8 @@ github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8Nz github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-proto v1.0.0-beta.2 h1:X3OKvWgK9Gsejo0F1qs5l8Qn6xJV/AzgIWR2wZ8Nua8= +github.com/cosmos/cosmos-proto v1.0.0-beta.2/go.mod h1:+XRCLJ14pr5HFEHIUcn51IKXD1Fy3rkEQqt4WqmN4V0= github.com/cosmos/cosmos-sdk v0.45.13-ics h1:EuBiwr9UO/s+dcjCXrrmwrZPowEhBYguIdMcr5fH3dg= github.com/cosmos/cosmos-sdk v0.45.13-ics/go.mod h1:tpDFgc98sgRcLLRiosBSyos8EZoDHv1xab9HPLGLQJ4= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= @@ -1244,7 +1250,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/tests/interchaintest/osmosistypes/gamm/types/codec.go b/tests/interchaintest/osmosistypes/gamm/types/codec.go new file mode 100644 index 0000000..4ae7aa2 --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/types/codec.go @@ -0,0 +1,35 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + types "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterInterfaces(registry types.InterfaceRegistry) { + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgJoinPool{}, + &MsgExitPool{}, + &MsgSwapExactAmountIn{}, + &MsgSwapExactAmountOut{}, + &MsgJoinSwapExternAmountIn{}, + &MsgJoinSwapShareAmountOut{}, + &MsgExitSwapExternAmountOut{}, + &MsgExitSwapShareAmountIn{}, + ) + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} + +var ( + amino = codec.NewLegacyAmino() + + // ModuleCdc references the global x/bank module codec. Note, the codec should + // ONLY be used in certain instances of tests and for JSON encoding as Amino is + // still used for that purpose. + // + // The actual codec used for serialization should be provided to x/staking and + // defined at the application level. + ModuleCdc = codec.NewAminoCodec(amino) +) diff --git a/tests/interchaintest/osmosistypes/gamm/types/genesis.pb.go b/tests/interchaintest/osmosistypes/gamm/types/genesis.pb.go new file mode 100644 index 0000000..16628a6 --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/types/genesis.pb.go @@ -0,0 +1,620 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/gamm/v1beta1/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + types1 "github.com/cosmos/cosmos-sdk/codec/types" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Params holds parameters for the incentives module +type Params struct { + PoolCreationFee github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=pool_creation_fee,json=poolCreationFee,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"pool_creation_fee" yaml:"pool_creation_fee"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_5a324eb7f1dd793e, []int{0} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *Params) GetPoolCreationFee() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.PoolCreationFee + } + return nil +} + +// GenesisState defines the gamm module's genesis state. +type GenesisState struct { + Pools []*types1.Any `protobuf:"bytes,1,rep,name=pools,proto3" json:"pools,omitempty"` + // will be renamed to next_pool_id in an upcoming version + NextPoolNumber uint64 `protobuf:"varint,2,opt,name=next_pool_number,json=nextPoolNumber,proto3" json:"next_pool_number,omitempty"` + Params Params `protobuf:"bytes,3,opt,name=params,proto3" json:"params"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_5a324eb7f1dd793e, []int{1} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetPools() []*types1.Any { + if m != nil { + return m.Pools + } + return nil +} + +func (m *GenesisState) GetNextPoolNumber() uint64 { + if m != nil { + return m.NextPoolNumber + } + return 0 +} + +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func init() { + proto.RegisterType((*Params)(nil), "osmosis.gamm.v1beta1.Params") + proto.RegisterType((*GenesisState)(nil), "osmosis.gamm.v1beta1.GenesisState") +} + +func init() { + proto.RegisterFile("osmosis/gamm/v1beta1/genesis.proto", fileDescriptor_5a324eb7f1dd793e) +} + +var fileDescriptor_5a324eb7f1dd793e = []byte{ + // 401 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xcf, 0xaa, 0xd3, 0x40, + 0x18, 0xc5, 0x33, 0xde, 0x7b, 0x0b, 0xe6, 0x8a, 0x7f, 0x42, 0x17, 0xb9, 0x17, 0x49, 0x4b, 0x56, + 0xd9, 0x74, 0xc6, 0x56, 0xdd, 0x74, 0x67, 0x0a, 0x8a, 0x22, 0x52, 0xe2, 0xce, 0x4d, 0x98, 0xc4, + 0x69, 0x0c, 0x26, 0xf3, 0x85, 0xcc, 0xb4, 0x34, 0x6f, 0x21, 0xb8, 0xf7, 0x01, 0x74, 0xeb, 0x43, + 0x14, 0x57, 0x5d, 0xba, 0xaa, 0xd2, 0xbe, 0x81, 0x4f, 0x20, 0xf3, 0x27, 0x22, 0xe8, 0x2a, 0xf9, + 0xe6, 0xfb, 0x9d, 0xc3, 0x99, 0x93, 0xb8, 0x21, 0x88, 0x1a, 0x44, 0x29, 0x48, 0x41, 0xeb, 0x9a, + 0x6c, 0xa6, 0x19, 0x93, 0x74, 0x4a, 0x0a, 0xc6, 0x99, 0x28, 0x05, 0x6e, 0x5a, 0x90, 0xe0, 0x0d, + 0x2d, 0x83, 0x15, 0x83, 0x2d, 0x73, 0x3d, 0x2c, 0xa0, 0x00, 0x0d, 0x10, 0xf5, 0x66, 0xd8, 0xeb, + 0xab, 0x02, 0xa0, 0xa8, 0x18, 0xd1, 0x53, 0xb6, 0x5e, 0x11, 0xca, 0xbb, 0x7e, 0x95, 0x6b, 0x9f, + 0xd4, 0x68, 0xcc, 0x60, 0x57, 0x81, 0x99, 0x48, 0x46, 0x05, 0xfb, 0x13, 0x22, 0x87, 0x92, 0x9b, + 0x7d, 0xf8, 0x09, 0xb9, 0x83, 0x25, 0x6d, 0x69, 0x2d, 0xbc, 0x8f, 0xc8, 0xbd, 0xd7, 0x00, 0x54, + 0x69, 0xde, 0x32, 0x2a, 0x4b, 0xe0, 0xe9, 0x8a, 0x31, 0x1f, 0x8d, 0xcf, 0xa2, 0xcb, 0xd9, 0x15, + 0xb6, 0xae, 0xca, 0xa7, 0x0f, 0x8a, 0x17, 0x50, 0xf2, 0xf8, 0xe5, 0xee, 0x30, 0x72, 0x7e, 0x1d, + 0x46, 0x7e, 0x47, 0xeb, 0x6a, 0x1e, 0xfe, 0xe3, 0x10, 0x7e, 0xfe, 0x31, 0x8a, 0x8a, 0x52, 0xbe, + 0x5b, 0x67, 0x38, 0x87, 0xda, 0xc6, 0xb3, 0x8f, 0x89, 0x78, 0xfb, 0x9e, 0xc8, 0xae, 0x61, 0x42, + 0x9b, 0x89, 0xe4, 0x8e, 0xd2, 0x2f, 0xac, 0xfc, 0x29, 0x63, 0xe1, 0x17, 0xe4, 0xde, 0x7a, 0x66, + 0x4a, 0x7b, 0x2d, 0xa9, 0x64, 0xde, 0x63, 0xf7, 0x42, 0x31, 0xc2, 0x26, 0x1b, 0x62, 0xd3, 0x0b, + 0xee, 0x7b, 0xc1, 0x4f, 0x78, 0x17, 0xdf, 0xfc, 0xf6, 0x75, 0x72, 0xb1, 0x04, 0xa8, 0x9e, 0x27, + 0x86, 0xf6, 0x22, 0xf7, 0x2e, 0x67, 0x5b, 0x99, 0xea, 0x7c, 0x7c, 0x5d, 0x67, 0xac, 0xf5, 0x6f, + 0x8c, 0x51, 0x74, 0x9e, 0xdc, 0x56, 0xe7, 0x8a, 0x7d, 0xa5, 0x4f, 0xbd, 0xb9, 0x3b, 0x68, 0x74, + 0x23, 0xfe, 0xd9, 0x18, 0x45, 0x97, 0xb3, 0xfb, 0xf8, 0x7f, 0x5f, 0x09, 0x9b, 0xd6, 0xe2, 0x73, + 0x75, 0xfd, 0xc4, 0x2a, 0xe2, 0x17, 0xbb, 0x63, 0x80, 0xf6, 0xc7, 0x00, 0xfd, 0x3c, 0x06, 0xe8, + 0xc3, 0x29, 0x70, 0xf6, 0xa7, 0xc0, 0xf9, 0x7e, 0x0a, 0x9c, 0x37, 0x0f, 0xfe, 0xaa, 0xc0, 0xfa, + 0x4d, 0x2a, 0x9a, 0x89, 0x7e, 0x20, 0x9b, 0xe9, 0x23, 0xb2, 0x35, 0x3f, 0x8b, 0x2e, 0x24, 0x1b, + 0xe8, 0x1b, 0x3d, 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x03, 0x26, 0x4b, 0x36, 0x49, 0x02, 0x00, + 0x00, +} + +func (m *Params) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PoolCreationFee) > 0 { + for iNdEx := len(m.PoolCreationFee) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PoolCreationFee[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if m.NextPoolNumber != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.NextPoolNumber)) + i-- + dAtA[i] = 0x10 + } + if len(m.Pools) > 0 { + for iNdEx := len(m.Pools) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Pools[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.PoolCreationFee) > 0 { + for _, e := range m.PoolCreationFee { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Pools) > 0 { + for _, e := range m.Pools { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if m.NextPoolNumber != 0 { + n += 1 + sovGenesis(uint64(m.NextPoolNumber)) + } + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Params) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + 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 PoolCreationFee", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolCreationFee = append(m.PoolCreationFee, types.Coin{}) + if err := m.PoolCreationFee[len(m.PoolCreationFee)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pools", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pools = append(m.Pools, &types1.Any{}) + if err := m.Pools[len(m.Pools)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NextPoolNumber", wireType) + } + m.NextPoolNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NextPoolNumber |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/tests/interchaintest/osmosistypes/gamm/types/msgs.go b/tests/interchaintest/osmosistypes/gamm/types/msgs.go new file mode 100644 index 0000000..ef62968 --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/types/msgs.go @@ -0,0 +1,206 @@ +package types + +import ( + "fmt" + "strings" + "time" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +// constants. +const ( + RouterKey = "gamm" + TypeMsgSwapExactAmountIn = "swap_exact_amount_in" + TypeMsgSwapExactAmountOut = "swap_exact_amount_out" + TypeMsgJoinPool = "join_pool" + TypeMsgExitPool = "exit_pool" + TypeMsgJoinSwapExternAmountIn = "join_swap_extern_amount_in" + TypeMsgJoinSwapShareAmountOut = "join_swap_share_amount_out" + TypeMsgExitSwapExternAmountOut = "exit_swap_extern_amount_out" + TypeMsgExitSwapShareAmountIn = "exit_swap_share_amount_in" +) + +func ValidateFutureGovernor(governor string) error { + // allow empty governor + if governor == "" { + return nil + } + + // validation for future owner + // "osmo1fqlr98d45v5ysqgp6h56kpujcj4cvsjnjq9nck" + _, err := sdk.AccAddressFromBech32(governor) + if err == nil { + return nil + } + + lockTimeStr := "" + splits := strings.Split(governor, ",") + if len(splits) > 2 { + return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, fmt.Sprintf("invalid future governor: %s", governor)) + } + + // token,100h + if len(splits) == 2 { + lpTokenStr := splits[0] + if sdk.ValidateDenom(lpTokenStr) != nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, fmt.Sprintf("invalid future governor: %s", governor)) + } + lockTimeStr = splits[1] + } + + // 100h + if len(splits) == 1 { + lockTimeStr = splits[0] + } + + // Note that a duration of 0 is allowed + _, err = time.ParseDuration(lockTimeStr) + if err != nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, fmt.Sprintf("invalid future governor: %s", governor)) + } + return nil +} + +var _ sdk.Msg = &MsgSwapExactAmountIn{} + +func (msg MsgSwapExactAmountIn) Route() string { return RouterKey } +func (msg MsgSwapExactAmountIn) Type() string { return TypeMsgSwapExactAmountIn } +func (msg MsgSwapExactAmountIn) ValidateBasic() error { return nil } + +func (msg MsgSwapExactAmountIn) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgSwapExactAmountIn) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgSwapExactAmountOut{} + +func (msg MsgSwapExactAmountOut) Route() string { return RouterKey } +func (msg MsgSwapExactAmountOut) Type() string { return TypeMsgSwapExactAmountOut } +func (msg MsgSwapExactAmountOut) ValidateBasic() error { return nil } + +func (msg MsgSwapExactAmountOut) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgSwapExactAmountOut) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgJoinPool{} + +func (msg MsgJoinPool) Route() string { return RouterKey } +func (msg MsgJoinPool) Type() string { return TypeMsgJoinPool } +func (msg MsgJoinPool) ValidateBasic() error { return nil } +func (msg MsgJoinPool) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} +func (msg MsgJoinPool) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgExitPool{} + +func (msg MsgExitPool) Route() string { return RouterKey } +func (msg MsgExitPool) Type() string { return TypeMsgExitPool } +func (msg MsgExitPool) ValidateBasic() error { return nil } + +func (msg MsgExitPool) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgExitPool) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgJoinSwapExternAmountIn{} + +func (msg MsgJoinSwapExternAmountIn) Route() string { return RouterKey } +func (msg MsgJoinSwapExternAmountIn) Type() string { return TypeMsgJoinSwapExternAmountIn } +func (msg MsgJoinSwapExternAmountIn) ValidateBasic() error { return nil } + +func (msg MsgJoinSwapExternAmountIn) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgJoinSwapExternAmountIn) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgJoinSwapShareAmountOut{} + +func (msg MsgJoinSwapShareAmountOut) Route() string { return RouterKey } +func (msg MsgJoinSwapShareAmountOut) Type() string { return TypeMsgJoinSwapShareAmountOut } +func (msg MsgJoinSwapShareAmountOut) ValidateBasic() error { return nil } + +func (msg MsgJoinSwapShareAmountOut) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgJoinSwapShareAmountOut) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgExitSwapExternAmountOut{} + +func (msg MsgExitSwapExternAmountOut) Route() string { return RouterKey } +func (msg MsgExitSwapExternAmountOut) Type() string { return TypeMsgExitSwapExternAmountOut } +func (msg MsgExitSwapExternAmountOut) ValidateBasic() error { return nil } + +func (msg MsgExitSwapExternAmountOut) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgExitSwapExternAmountOut) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgExitSwapShareAmountIn{} + +func (msg MsgExitSwapShareAmountIn) Route() string { return RouterKey } +func (msg MsgExitSwapShareAmountIn) Type() string { return TypeMsgExitSwapShareAmountIn } +func (msg MsgExitSwapShareAmountIn) ValidateBasic() error { return nil } + +func (msg MsgExitSwapShareAmountIn) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgExitSwapShareAmountIn) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} diff --git a/tests/interchaintest/osmosistypes/gamm/types/query.pb.go b/tests/interchaintest/osmosistypes/gamm/types/query.pb.go new file mode 100644 index 0000000..8914073 --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/types/query.pb.go @@ -0,0 +1,6727 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/gamm/v1beta1/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + types "github.com/cosmos/cosmos-sdk/codec/types" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types1 "github.com/cosmos/cosmos-sdk/types" + query "github.com/cosmos/cosmos-sdk/types/query" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// =============================== Pool +type QueryPoolRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` +} + +func (m *QueryPoolRequest) Reset() { *m = QueryPoolRequest{} } +func (m *QueryPoolRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPoolRequest) ProtoMessage() {} +func (*QueryPoolRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{0} +} +func (m *QueryPoolRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolRequest.Merge(m, src) +} +func (m *QueryPoolRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolRequest proto.InternalMessageInfo + +func (m *QueryPoolRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +type QueryPoolResponse struct { + Pool *types.Any `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` +} + +func (m *QueryPoolResponse) Reset() { *m = QueryPoolResponse{} } +func (m *QueryPoolResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPoolResponse) ProtoMessage() {} +func (*QueryPoolResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{1} +} +func (m *QueryPoolResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolResponse.Merge(m, src) +} +func (m *QueryPoolResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolResponse proto.InternalMessageInfo + +func (m *QueryPoolResponse) GetPool() *types.Any { + if m != nil { + return m.Pool + } + return nil +} + +// =============================== Pools +type QueryPoolsRequest struct { + // pagination defines an optional pagination for the request. + Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryPoolsRequest) Reset() { *m = QueryPoolsRequest{} } +func (m *QueryPoolsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPoolsRequest) ProtoMessage() {} +func (*QueryPoolsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{2} +} +func (m *QueryPoolsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolsRequest.Merge(m, src) +} +func (m *QueryPoolsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolsRequest proto.InternalMessageInfo + +func (m *QueryPoolsRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +type QueryPoolsResponse struct { + Pools []*types.Any `protobuf:"bytes,1,rep,name=pools,proto3" json:"pools,omitempty"` + // pagination defines the pagination in the response. + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryPoolsResponse) Reset() { *m = QueryPoolsResponse{} } +func (m *QueryPoolsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPoolsResponse) ProtoMessage() {} +func (*QueryPoolsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{3} +} +func (m *QueryPoolsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolsResponse.Merge(m, src) +} +func (m *QueryPoolsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolsResponse proto.InternalMessageInfo + +func (m *QueryPoolsResponse) GetPools() []*types.Any { + if m != nil { + return m.Pools + } + return nil +} + +func (m *QueryPoolsResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +// =============================== NumPools +type QueryNumPoolsRequest struct { +} + +func (m *QueryNumPoolsRequest) Reset() { *m = QueryNumPoolsRequest{} } +func (m *QueryNumPoolsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryNumPoolsRequest) ProtoMessage() {} +func (*QueryNumPoolsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{4} +} +func (m *QueryNumPoolsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryNumPoolsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryNumPoolsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryNumPoolsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryNumPoolsRequest.Merge(m, src) +} +func (m *QueryNumPoolsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryNumPoolsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryNumPoolsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryNumPoolsRequest proto.InternalMessageInfo + +type QueryNumPoolsResponse struct { + NumPools uint64 `protobuf:"varint,1,opt,name=num_pools,json=numPools,proto3" json:"num_pools,omitempty" yaml:"num_pools"` +} + +func (m *QueryNumPoolsResponse) Reset() { *m = QueryNumPoolsResponse{} } +func (m *QueryNumPoolsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryNumPoolsResponse) ProtoMessage() {} +func (*QueryNumPoolsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{5} +} +func (m *QueryNumPoolsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryNumPoolsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryNumPoolsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryNumPoolsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryNumPoolsResponse.Merge(m, src) +} +func (m *QueryNumPoolsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryNumPoolsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryNumPoolsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryNumPoolsResponse proto.InternalMessageInfo + +func (m *QueryNumPoolsResponse) GetNumPools() uint64 { + if m != nil { + return m.NumPools + } + return 0 +} + +// =============================== PoolType +type QueryPoolTypeRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` +} + +func (m *QueryPoolTypeRequest) Reset() { *m = QueryPoolTypeRequest{} } +func (m *QueryPoolTypeRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPoolTypeRequest) ProtoMessage() {} +func (*QueryPoolTypeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{6} +} +func (m *QueryPoolTypeRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolTypeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolTypeRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolTypeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolTypeRequest.Merge(m, src) +} +func (m *QueryPoolTypeRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolTypeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolTypeRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolTypeRequest proto.InternalMessageInfo + +func (m *QueryPoolTypeRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +type QueryPoolTypeResponse struct { + PoolType string `protobuf:"bytes,1,opt,name=pool_type,json=poolType,proto3" json:"pool_type,omitempty" yaml:"pool_type"` +} + +func (m *QueryPoolTypeResponse) Reset() { *m = QueryPoolTypeResponse{} } +func (m *QueryPoolTypeResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPoolTypeResponse) ProtoMessage() {} +func (*QueryPoolTypeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{7} +} +func (m *QueryPoolTypeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolTypeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolTypeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolTypeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolTypeResponse.Merge(m, src) +} +func (m *QueryPoolTypeResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolTypeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolTypeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolTypeResponse proto.InternalMessageInfo + +func (m *QueryPoolTypeResponse) GetPoolType() string { + if m != nil { + return m.PoolType + } + return "" +} + +// =============================== CalcJoinPoolShares +type QueryCalcJoinPoolSharesRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokensIn github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=tokens_in,json=tokensIn,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_in"` +} + +func (m *QueryCalcJoinPoolSharesRequest) Reset() { *m = QueryCalcJoinPoolSharesRequest{} } +func (m *QueryCalcJoinPoolSharesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCalcJoinPoolSharesRequest) ProtoMessage() {} +func (*QueryCalcJoinPoolSharesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{8} +} +func (m *QueryCalcJoinPoolSharesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCalcJoinPoolSharesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCalcJoinPoolSharesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCalcJoinPoolSharesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCalcJoinPoolSharesRequest.Merge(m, src) +} +func (m *QueryCalcJoinPoolSharesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCalcJoinPoolSharesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCalcJoinPoolSharesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCalcJoinPoolSharesRequest proto.InternalMessageInfo + +func (m *QueryCalcJoinPoolSharesRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *QueryCalcJoinPoolSharesRequest) GetTokensIn() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.TokensIn + } + return nil +} + +type QueryCalcJoinPoolSharesResponse struct { + ShareOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=share_out_amount,json=shareOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_out_amount" yaml:"share_out_amount"` + TokensOut github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=tokens_out,json=tokensOut,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_out"` +} + +func (m *QueryCalcJoinPoolSharesResponse) Reset() { *m = QueryCalcJoinPoolSharesResponse{} } +func (m *QueryCalcJoinPoolSharesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCalcJoinPoolSharesResponse) ProtoMessage() {} +func (*QueryCalcJoinPoolSharesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{9} +} +func (m *QueryCalcJoinPoolSharesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCalcJoinPoolSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCalcJoinPoolSharesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCalcJoinPoolSharesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCalcJoinPoolSharesResponse.Merge(m, src) +} +func (m *QueryCalcJoinPoolSharesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCalcJoinPoolSharesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCalcJoinPoolSharesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCalcJoinPoolSharesResponse proto.InternalMessageInfo + +func (m *QueryCalcJoinPoolSharesResponse) GetTokensOut() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.TokensOut + } + return nil +} + +// =============================== CalcExitPoolCoinsFromShares +type QueryCalcExitPoolCoinsFromSharesRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` + ShareInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=share_in_amount,json=shareInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_in_amount"` +} + +func (m *QueryCalcExitPoolCoinsFromSharesRequest) Reset() { + *m = QueryCalcExitPoolCoinsFromSharesRequest{} +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCalcExitPoolCoinsFromSharesRequest) ProtoMessage() {} +func (*QueryCalcExitPoolCoinsFromSharesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{10} +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesRequest.Merge(m, src) +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesRequest proto.InternalMessageInfo + +func (m *QueryCalcExitPoolCoinsFromSharesRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +type QueryCalcExitPoolCoinsFromSharesResponse struct { + TokensOut github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=tokens_out,json=tokensOut,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_out"` +} + +func (m *QueryCalcExitPoolCoinsFromSharesResponse) Reset() { + *m = QueryCalcExitPoolCoinsFromSharesResponse{} +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCalcExitPoolCoinsFromSharesResponse) ProtoMessage() {} +func (*QueryCalcExitPoolCoinsFromSharesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{11} +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesResponse.Merge(m, src) +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCalcExitPoolCoinsFromSharesResponse proto.InternalMessageInfo + +func (m *QueryCalcExitPoolCoinsFromSharesResponse) GetTokensOut() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.TokensOut + } + return nil +} + +// =============================== PoolParams +type QueryPoolParamsRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` +} + +func (m *QueryPoolParamsRequest) Reset() { *m = QueryPoolParamsRequest{} } +func (m *QueryPoolParamsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPoolParamsRequest) ProtoMessage() {} +func (*QueryPoolParamsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{12} +} +func (m *QueryPoolParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolParamsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolParamsRequest.Merge(m, src) +} +func (m *QueryPoolParamsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolParamsRequest proto.InternalMessageInfo + +func (m *QueryPoolParamsRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +type QueryPoolParamsResponse struct { + Params *types.Any `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +} + +func (m *QueryPoolParamsResponse) Reset() { *m = QueryPoolParamsResponse{} } +func (m *QueryPoolParamsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPoolParamsResponse) ProtoMessage() {} +func (*QueryPoolParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{13} +} +func (m *QueryPoolParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolParamsResponse.Merge(m, src) +} +func (m *QueryPoolParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolParamsResponse proto.InternalMessageInfo + +func (m *QueryPoolParamsResponse) GetParams() *types.Any { + if m != nil { + return m.Params + } + return nil +} + +// =============================== PoolLiquidity +type QueryTotalPoolLiquidityRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` +} + +func (m *QueryTotalPoolLiquidityRequest) Reset() { *m = QueryTotalPoolLiquidityRequest{} } +func (m *QueryTotalPoolLiquidityRequest) String() string { return proto.CompactTextString(m) } +func (*QueryTotalPoolLiquidityRequest) ProtoMessage() {} +func (*QueryTotalPoolLiquidityRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{14} +} +func (m *QueryTotalPoolLiquidityRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryTotalPoolLiquidityRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryTotalPoolLiquidityRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryTotalPoolLiquidityRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryTotalPoolLiquidityRequest.Merge(m, src) +} +func (m *QueryTotalPoolLiquidityRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryTotalPoolLiquidityRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryTotalPoolLiquidityRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryTotalPoolLiquidityRequest proto.InternalMessageInfo + +func (m *QueryTotalPoolLiquidityRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +type QueryTotalPoolLiquidityResponse struct { + Liquidity github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=liquidity,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"liquidity" yaml:"liquidity"` +} + +func (m *QueryTotalPoolLiquidityResponse) Reset() { *m = QueryTotalPoolLiquidityResponse{} } +func (m *QueryTotalPoolLiquidityResponse) String() string { return proto.CompactTextString(m) } +func (*QueryTotalPoolLiquidityResponse) ProtoMessage() {} +func (*QueryTotalPoolLiquidityResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{15} +} +func (m *QueryTotalPoolLiquidityResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryTotalPoolLiquidityResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryTotalPoolLiquidityResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryTotalPoolLiquidityResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryTotalPoolLiquidityResponse.Merge(m, src) +} +func (m *QueryTotalPoolLiquidityResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryTotalPoolLiquidityResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryTotalPoolLiquidityResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryTotalPoolLiquidityResponse proto.InternalMessageInfo + +func (m *QueryTotalPoolLiquidityResponse) GetLiquidity() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.Liquidity + } + return nil +} + +// =============================== TotalShares +type QueryTotalSharesRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` +} + +func (m *QueryTotalSharesRequest) Reset() { *m = QueryTotalSharesRequest{} } +func (m *QueryTotalSharesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryTotalSharesRequest) ProtoMessage() {} +func (*QueryTotalSharesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{16} +} +func (m *QueryTotalSharesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryTotalSharesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryTotalSharesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryTotalSharesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryTotalSharesRequest.Merge(m, src) +} +func (m *QueryTotalSharesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryTotalSharesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryTotalSharesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryTotalSharesRequest proto.InternalMessageInfo + +func (m *QueryTotalSharesRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +type QueryTotalSharesResponse struct { + TotalShares types1.Coin `protobuf:"bytes,1,opt,name=total_shares,json=totalShares,proto3" json:"total_shares" yaml:"total_shares"` +} + +func (m *QueryTotalSharesResponse) Reset() { *m = QueryTotalSharesResponse{} } +func (m *QueryTotalSharesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryTotalSharesResponse) ProtoMessage() {} +func (*QueryTotalSharesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{17} +} +func (m *QueryTotalSharesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryTotalSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryTotalSharesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryTotalSharesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryTotalSharesResponse.Merge(m, src) +} +func (m *QueryTotalSharesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryTotalSharesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryTotalSharesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryTotalSharesResponse proto.InternalMessageInfo + +func (m *QueryTotalSharesResponse) GetTotalShares() types1.Coin { + if m != nil { + return m.TotalShares + } + return types1.Coin{} +} + +// =============================== CalcJoinPoolNoSwapShares +type QueryCalcJoinPoolNoSwapSharesRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokensIn github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=tokens_in,json=tokensIn,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_in"` +} + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) Reset() { *m = QueryCalcJoinPoolNoSwapSharesRequest{} } +func (m *QueryCalcJoinPoolNoSwapSharesRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCalcJoinPoolNoSwapSharesRequest) ProtoMessage() {} +func (*QueryCalcJoinPoolNoSwapSharesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{18} +} +func (m *QueryCalcJoinPoolNoSwapSharesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCalcJoinPoolNoSwapSharesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCalcJoinPoolNoSwapSharesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesRequest.Merge(m, src) +} +func (m *QueryCalcJoinPoolNoSwapSharesRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCalcJoinPoolNoSwapSharesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesRequest proto.InternalMessageInfo + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) GetTokensIn() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.TokensIn + } + return nil +} + +type QueryCalcJoinPoolNoSwapSharesResponse struct { + TokensOut github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=tokens_out,json=tokensOut,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_out" yaml:"tokens_out"` + SharesOut github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=shares_out,json=sharesOut,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"shares_out"` +} + +func (m *QueryCalcJoinPoolNoSwapSharesResponse) Reset() { *m = QueryCalcJoinPoolNoSwapSharesResponse{} } +func (m *QueryCalcJoinPoolNoSwapSharesResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCalcJoinPoolNoSwapSharesResponse) ProtoMessage() {} +func (*QueryCalcJoinPoolNoSwapSharesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{19} +} +func (m *QueryCalcJoinPoolNoSwapSharesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCalcJoinPoolNoSwapSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCalcJoinPoolNoSwapSharesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesResponse.Merge(m, src) +} +func (m *QueryCalcJoinPoolNoSwapSharesResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCalcJoinPoolNoSwapSharesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCalcJoinPoolNoSwapSharesResponse proto.InternalMessageInfo + +func (m *QueryCalcJoinPoolNoSwapSharesResponse) GetTokensOut() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.TokensOut + } + return nil +} + +// QuerySpotPriceRequest defines the gRPC request structure for a SpotPrice +// query. +// +// Deprecated: Do not use. +type QuerySpotPriceRequest struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + BaseAssetDenom string `protobuf:"bytes,2,opt,name=base_asset_denom,json=baseAssetDenom,proto3" json:"base_asset_denom,omitempty" yaml:"base_asset_denom"` + QuoteAssetDenom string `protobuf:"bytes,3,opt,name=quote_asset_denom,json=quoteAssetDenom,proto3" json:"quote_asset_denom,omitempty" yaml:"quote_asset_denom"` +} + +func (m *QuerySpotPriceRequest) Reset() { *m = QuerySpotPriceRequest{} } +func (m *QuerySpotPriceRequest) String() string { return proto.CompactTextString(m) } +func (*QuerySpotPriceRequest) ProtoMessage() {} +func (*QuerySpotPriceRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{20} +} +func (m *QuerySpotPriceRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySpotPriceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySpotPriceRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySpotPriceRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySpotPriceRequest.Merge(m, src) +} +func (m *QuerySpotPriceRequest) XXX_Size() int { + return m.Size() +} +func (m *QuerySpotPriceRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySpotPriceRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySpotPriceRequest proto.InternalMessageInfo + +func (m *QuerySpotPriceRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *QuerySpotPriceRequest) GetBaseAssetDenom() string { + if m != nil { + return m.BaseAssetDenom + } + return "" +} + +func (m *QuerySpotPriceRequest) GetQuoteAssetDenom() string { + if m != nil { + return m.QuoteAssetDenom + } + return "" +} + +type QueryPoolsWithFilterRequest struct { + // String of the coins in single string seperated by comma. Ex) + // 10uatom,100uosmo + MinLiquidity string `protobuf:"bytes,1,opt,name=min_liquidity,json=minLiquidity,proto3" json:"min_liquidity,omitempty" yaml:"min_liquidity"` + PoolType string `protobuf:"bytes,2,opt,name=pool_type,json=poolType,proto3" json:"pool_type,omitempty"` + Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryPoolsWithFilterRequest) Reset() { *m = QueryPoolsWithFilterRequest{} } +func (m *QueryPoolsWithFilterRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPoolsWithFilterRequest) ProtoMessage() {} +func (*QueryPoolsWithFilterRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{21} +} +func (m *QueryPoolsWithFilterRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolsWithFilterRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolsWithFilterRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolsWithFilterRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolsWithFilterRequest.Merge(m, src) +} +func (m *QueryPoolsWithFilterRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolsWithFilterRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolsWithFilterRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolsWithFilterRequest proto.InternalMessageInfo + +func (m *QueryPoolsWithFilterRequest) GetMinLiquidity() string { + if m != nil { + return m.MinLiquidity + } + return "" +} + +func (m *QueryPoolsWithFilterRequest) GetPoolType() string { + if m != nil { + return m.PoolType + } + return "" +} + +func (m *QueryPoolsWithFilterRequest) GetPagination() *query.PageRequest { + if m != nil { + return m.Pagination + } + return nil +} + +type QueryPoolsWithFilterResponse struct { + Pools []*types.Any `protobuf:"bytes,1,rep,name=pools,proto3" json:"pools,omitempty"` + // pagination defines the pagination in the response. + Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (m *QueryPoolsWithFilterResponse) Reset() { *m = QueryPoolsWithFilterResponse{} } +func (m *QueryPoolsWithFilterResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPoolsWithFilterResponse) ProtoMessage() {} +func (*QueryPoolsWithFilterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{22} +} +func (m *QueryPoolsWithFilterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoolsWithFilterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoolsWithFilterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPoolsWithFilterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoolsWithFilterResponse.Merge(m, src) +} +func (m *QueryPoolsWithFilterResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPoolsWithFilterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoolsWithFilterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoolsWithFilterResponse proto.InternalMessageInfo + +func (m *QueryPoolsWithFilterResponse) GetPools() []*types.Any { + if m != nil { + return m.Pools + } + return nil +} + +func (m *QueryPoolsWithFilterResponse) GetPagination() *query.PageResponse { + if m != nil { + return m.Pagination + } + return nil +} + +// QuerySpotPriceResponse defines the gRPC response structure for a SpotPrice +// query. +// +// Deprecated: Do not use. +type QuerySpotPriceResponse struct { + // String of the Dec. Ex) 10.203uatom + SpotPrice string `protobuf:"bytes,1,opt,name=spot_price,json=spotPrice,proto3" json:"spot_price,omitempty" yaml:"spot_price"` +} + +func (m *QuerySpotPriceResponse) Reset() { *m = QuerySpotPriceResponse{} } +func (m *QuerySpotPriceResponse) String() string { return proto.CompactTextString(m) } +func (*QuerySpotPriceResponse) ProtoMessage() {} +func (*QuerySpotPriceResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{23} +} +func (m *QuerySpotPriceResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySpotPriceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySpotPriceResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySpotPriceResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySpotPriceResponse.Merge(m, src) +} +func (m *QuerySpotPriceResponse) XXX_Size() int { + return m.Size() +} +func (m *QuerySpotPriceResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySpotPriceResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySpotPriceResponse proto.InternalMessageInfo + +func (m *QuerySpotPriceResponse) GetSpotPrice() string { + if m != nil { + return m.SpotPrice + } + return "" +} + +// =============================== EstimateSwapExactAmountIn +type QuerySwapExactAmountInRequest struct { + // TODO: CHANGE THIS TO RESERVED IN A PATCH RELEASE + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenIn string `protobuf:"bytes,3,opt,name=token_in,json=tokenIn,proto3" json:"token_in,omitempty" yaml:"token_in"` + Routes []SwapAmountInRoute `protobuf:"bytes,4,rep,name=routes,proto3" json:"routes" yaml:"routes"` +} + +func (m *QuerySwapExactAmountInRequest) Reset() { *m = QuerySwapExactAmountInRequest{} } +func (m *QuerySwapExactAmountInRequest) String() string { return proto.CompactTextString(m) } +func (*QuerySwapExactAmountInRequest) ProtoMessage() {} +func (*QuerySwapExactAmountInRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{24} +} +func (m *QuerySwapExactAmountInRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySwapExactAmountInRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySwapExactAmountInRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySwapExactAmountInRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySwapExactAmountInRequest.Merge(m, src) +} +func (m *QuerySwapExactAmountInRequest) XXX_Size() int { + return m.Size() +} +func (m *QuerySwapExactAmountInRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySwapExactAmountInRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySwapExactAmountInRequest proto.InternalMessageInfo + +func (m *QuerySwapExactAmountInRequest) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *QuerySwapExactAmountInRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *QuerySwapExactAmountInRequest) GetTokenIn() string { + if m != nil { + return m.TokenIn + } + return "" +} + +func (m *QuerySwapExactAmountInRequest) GetRoutes() []SwapAmountInRoute { + if m != nil { + return m.Routes + } + return nil +} + +type QuerySwapExactAmountInResponse struct { + TokenOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=token_out_amount,json=tokenOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_out_amount" yaml:"token_out_amount"` +} + +func (m *QuerySwapExactAmountInResponse) Reset() { *m = QuerySwapExactAmountInResponse{} } +func (m *QuerySwapExactAmountInResponse) String() string { return proto.CompactTextString(m) } +func (*QuerySwapExactAmountInResponse) ProtoMessage() {} +func (*QuerySwapExactAmountInResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{25} +} +func (m *QuerySwapExactAmountInResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySwapExactAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySwapExactAmountInResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySwapExactAmountInResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySwapExactAmountInResponse.Merge(m, src) +} +func (m *QuerySwapExactAmountInResponse) XXX_Size() int { + return m.Size() +} +func (m *QuerySwapExactAmountInResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySwapExactAmountInResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySwapExactAmountInResponse proto.InternalMessageInfo + +// =============================== EstimateSwapExactAmountOut +type QuerySwapExactAmountOutRequest struct { + // TODO: CHANGE THIS TO RESERVED IN A PATCH RELEASE + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + Routes []SwapAmountOutRoute `protobuf:"bytes,3,rep,name=routes,proto3" json:"routes" yaml:"routes"` + TokenOut string `protobuf:"bytes,4,opt,name=token_out,json=tokenOut,proto3" json:"token_out,omitempty" yaml:"token_out"` +} + +func (m *QuerySwapExactAmountOutRequest) Reset() { *m = QuerySwapExactAmountOutRequest{} } +func (m *QuerySwapExactAmountOutRequest) String() string { return proto.CompactTextString(m) } +func (*QuerySwapExactAmountOutRequest) ProtoMessage() {} +func (*QuerySwapExactAmountOutRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{26} +} +func (m *QuerySwapExactAmountOutRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySwapExactAmountOutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySwapExactAmountOutRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySwapExactAmountOutRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySwapExactAmountOutRequest.Merge(m, src) +} +func (m *QuerySwapExactAmountOutRequest) XXX_Size() int { + return m.Size() +} +func (m *QuerySwapExactAmountOutRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySwapExactAmountOutRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySwapExactAmountOutRequest proto.InternalMessageInfo + +func (m *QuerySwapExactAmountOutRequest) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *QuerySwapExactAmountOutRequest) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *QuerySwapExactAmountOutRequest) GetRoutes() []SwapAmountOutRoute { + if m != nil { + return m.Routes + } + return nil +} + +func (m *QuerySwapExactAmountOutRequest) GetTokenOut() string { + if m != nil { + return m.TokenOut + } + return "" +} + +type QuerySwapExactAmountOutResponse struct { + TokenInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=token_in_amount,json=tokenInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_in_amount" yaml:"token_in_amount"` +} + +func (m *QuerySwapExactAmountOutResponse) Reset() { *m = QuerySwapExactAmountOutResponse{} } +func (m *QuerySwapExactAmountOutResponse) String() string { return proto.CompactTextString(m) } +func (*QuerySwapExactAmountOutResponse) ProtoMessage() {} +func (*QuerySwapExactAmountOutResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{27} +} +func (m *QuerySwapExactAmountOutResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySwapExactAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySwapExactAmountOutResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySwapExactAmountOutResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySwapExactAmountOutResponse.Merge(m, src) +} +func (m *QuerySwapExactAmountOutResponse) XXX_Size() int { + return m.Size() +} +func (m *QuerySwapExactAmountOutResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySwapExactAmountOutResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySwapExactAmountOutResponse proto.InternalMessageInfo + +type QueryTotalLiquidityRequest struct { +} + +func (m *QueryTotalLiquidityRequest) Reset() { *m = QueryTotalLiquidityRequest{} } +func (m *QueryTotalLiquidityRequest) String() string { return proto.CompactTextString(m) } +func (*QueryTotalLiquidityRequest) ProtoMessage() {} +func (*QueryTotalLiquidityRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{28} +} +func (m *QueryTotalLiquidityRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryTotalLiquidityRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryTotalLiquidityRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryTotalLiquidityRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryTotalLiquidityRequest.Merge(m, src) +} +func (m *QueryTotalLiquidityRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryTotalLiquidityRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryTotalLiquidityRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryTotalLiquidityRequest proto.InternalMessageInfo + +type QueryTotalLiquidityResponse struct { + Liquidity github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=liquidity,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"liquidity" yaml:"liquidity"` +} + +func (m *QueryTotalLiquidityResponse) Reset() { *m = QueryTotalLiquidityResponse{} } +func (m *QueryTotalLiquidityResponse) String() string { return proto.CompactTextString(m) } +func (*QueryTotalLiquidityResponse) ProtoMessage() {} +func (*QueryTotalLiquidityResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d9a717df9ca609ef, []int{29} +} +func (m *QueryTotalLiquidityResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryTotalLiquidityResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryTotalLiquidityResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryTotalLiquidityResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryTotalLiquidityResponse.Merge(m, src) +} +func (m *QueryTotalLiquidityResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryTotalLiquidityResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryTotalLiquidityResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryTotalLiquidityResponse proto.InternalMessageInfo + +func (m *QueryTotalLiquidityResponse) GetLiquidity() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.Liquidity + } + return nil +} + +func init() { + proto.RegisterType((*QueryPoolRequest)(nil), "osmosis.gamm.v1beta1.QueryPoolRequest") + proto.RegisterType((*QueryPoolResponse)(nil), "osmosis.gamm.v1beta1.QueryPoolResponse") + proto.RegisterType((*QueryPoolsRequest)(nil), "osmosis.gamm.v1beta1.QueryPoolsRequest") + proto.RegisterType((*QueryPoolsResponse)(nil), "osmosis.gamm.v1beta1.QueryPoolsResponse") + proto.RegisterType((*QueryNumPoolsRequest)(nil), "osmosis.gamm.v1beta1.QueryNumPoolsRequest") + proto.RegisterType((*QueryNumPoolsResponse)(nil), "osmosis.gamm.v1beta1.QueryNumPoolsResponse") + proto.RegisterType((*QueryPoolTypeRequest)(nil), "osmosis.gamm.v1beta1.QueryPoolTypeRequest") + proto.RegisterType((*QueryPoolTypeResponse)(nil), "osmosis.gamm.v1beta1.QueryPoolTypeResponse") + proto.RegisterType((*QueryCalcJoinPoolSharesRequest)(nil), "osmosis.gamm.v1beta1.QueryCalcJoinPoolSharesRequest") + proto.RegisterType((*QueryCalcJoinPoolSharesResponse)(nil), "osmosis.gamm.v1beta1.QueryCalcJoinPoolSharesResponse") + proto.RegisterType((*QueryCalcExitPoolCoinsFromSharesRequest)(nil), "osmosis.gamm.v1beta1.QueryCalcExitPoolCoinsFromSharesRequest") + proto.RegisterType((*QueryCalcExitPoolCoinsFromSharesResponse)(nil), "osmosis.gamm.v1beta1.QueryCalcExitPoolCoinsFromSharesResponse") + proto.RegisterType((*QueryPoolParamsRequest)(nil), "osmosis.gamm.v1beta1.QueryPoolParamsRequest") + proto.RegisterType((*QueryPoolParamsResponse)(nil), "osmosis.gamm.v1beta1.QueryPoolParamsResponse") + proto.RegisterType((*QueryTotalPoolLiquidityRequest)(nil), "osmosis.gamm.v1beta1.QueryTotalPoolLiquidityRequest") + proto.RegisterType((*QueryTotalPoolLiquidityResponse)(nil), "osmosis.gamm.v1beta1.QueryTotalPoolLiquidityResponse") + proto.RegisterType((*QueryTotalSharesRequest)(nil), "osmosis.gamm.v1beta1.QueryTotalSharesRequest") + proto.RegisterType((*QueryTotalSharesResponse)(nil), "osmosis.gamm.v1beta1.QueryTotalSharesResponse") + proto.RegisterType((*QueryCalcJoinPoolNoSwapSharesRequest)(nil), "osmosis.gamm.v1beta1.QueryCalcJoinPoolNoSwapSharesRequest") + proto.RegisterType((*QueryCalcJoinPoolNoSwapSharesResponse)(nil), "osmosis.gamm.v1beta1.QueryCalcJoinPoolNoSwapSharesResponse") + proto.RegisterType((*QuerySpotPriceRequest)(nil), "osmosis.gamm.v1beta1.QuerySpotPriceRequest") + proto.RegisterType((*QueryPoolsWithFilterRequest)(nil), "osmosis.gamm.v1beta1.QueryPoolsWithFilterRequest") + proto.RegisterType((*QueryPoolsWithFilterResponse)(nil), "osmosis.gamm.v1beta1.QueryPoolsWithFilterResponse") + proto.RegisterType((*QuerySpotPriceResponse)(nil), "osmosis.gamm.v1beta1.QuerySpotPriceResponse") + proto.RegisterType((*QuerySwapExactAmountInRequest)(nil), "osmosis.gamm.v1beta1.QuerySwapExactAmountInRequest") + proto.RegisterType((*QuerySwapExactAmountInResponse)(nil), "osmosis.gamm.v1beta1.QuerySwapExactAmountInResponse") + proto.RegisterType((*QuerySwapExactAmountOutRequest)(nil), "osmosis.gamm.v1beta1.QuerySwapExactAmountOutRequest") + proto.RegisterType((*QuerySwapExactAmountOutResponse)(nil), "osmosis.gamm.v1beta1.QuerySwapExactAmountOutResponse") + proto.RegisterType((*QueryTotalLiquidityRequest)(nil), "osmosis.gamm.v1beta1.QueryTotalLiquidityRequest") + proto.RegisterType((*QueryTotalLiquidityResponse)(nil), "osmosis.gamm.v1beta1.QueryTotalLiquidityResponse") +} + +func init() { proto.RegisterFile("osmosis/gamm/v1beta1/query.proto", fileDescriptor_d9a717df9ca609ef) } + +var fileDescriptor_d9a717df9ca609ef = []byte{ + // 1788 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x6c, 0x54, 0xd5, + 0x1b, 0xef, 0x99, 0x3e, 0xe8, 0x9c, 0xd2, 0xd7, 0xa1, 0xc0, 0x30, 0x2d, 0x33, 0xfc, 0xcf, 0x1f, + 0xda, 0x02, 0xed, 0x1d, 0x5a, 0x4a, 0x34, 0x55, 0x1e, 0x2d, 0xb4, 0x30, 0x8d, 0xd0, 0x7a, 0x21, + 0x10, 0x75, 0x31, 0xb9, 0x6d, 0x2f, 0xd3, 0x0b, 0x33, 0xf7, 0xdc, 0xce, 0x3d, 0x97, 0xb6, 0x31, + 0x84, 0x84, 0x18, 0xe3, 0xc2, 0x85, 0x09, 0xc2, 0xc2, 0x18, 0x75, 0x61, 0x8c, 0x61, 0x6d, 0xe2, + 0xca, 0x85, 0x31, 0x26, 0xc4, 0xc4, 0x04, 0xe3, 0xc6, 0xb8, 0x18, 0x0d, 0xe8, 0xce, 0x55, 0x37, + 0x2e, 0x35, 0xe7, 0x71, 0x1f, 0xf3, 0x7e, 0x28, 0x09, 0xae, 0x66, 0xee, 0xf9, 0x5e, 0xbf, 0xef, + 0x71, 0xbe, 0xf3, 0x9d, 0x03, 0x0f, 0x10, 0x3b, 0x4b, 0x6c, 0xc3, 0x4e, 0xa4, 0xb5, 0x6c, 0x36, + 0x71, 0x6b, 0x62, 0x59, 0xa7, 0xda, 0x44, 0x62, 0xdd, 0xd1, 0x73, 0x5b, 0x8a, 0x95, 0x23, 0x94, + 0xa0, 0x01, 0xc9, 0xa1, 0x30, 0x0e, 0x45, 0x72, 0x44, 0x07, 0xd2, 0x24, 0x4d, 0x38, 0x43, 0x82, + 0xfd, 0x13, 0xbc, 0xd1, 0xfd, 0x65, 0xb5, 0xd1, 0x4d, 0x49, 0x8e, 0xad, 0x70, 0x7a, 0x62, 0x59, + 0xb3, 0x75, 0x8f, 0xba, 0x42, 0x0c, 0x53, 0xd2, 0x8f, 0x04, 0xe9, 0x1c, 0x83, 0xc7, 0x65, 0x69, + 0x69, 0xc3, 0xd4, 0xa8, 0x41, 0x5c, 0xde, 0xa1, 0x34, 0x21, 0xe9, 0x8c, 0x9e, 0xd0, 0x2c, 0x23, + 0xa1, 0x99, 0x26, 0xa1, 0x9c, 0x68, 0x4b, 0xea, 0x3e, 0x49, 0xe5, 0x5f, 0xcb, 0xce, 0xf5, 0x84, + 0x66, 0x6e, 0xb9, 0x24, 0x61, 0x24, 0x25, 0xc0, 0x8b, 0x0f, 0x41, 0xc2, 0xa7, 0x61, 0xdf, 0xab, + 0xcc, 0xea, 0x12, 0x21, 0x19, 0x55, 0x5f, 0x77, 0x74, 0x9b, 0xa2, 0xa3, 0x70, 0x87, 0x45, 0x48, + 0x26, 0x65, 0xac, 0x46, 0xc0, 0x01, 0x30, 0xda, 0x36, 0x8b, 0xb6, 0xf3, 0xf1, 0x9e, 0x2d, 0x2d, + 0x9b, 0x99, 0xc6, 0x92, 0x80, 0xd5, 0x0e, 0xf6, 0x2f, 0xb9, 0x8a, 0x2f, 0xc0, 0xfe, 0x80, 0x02, + 0xdb, 0x22, 0xa6, 0xad, 0xa3, 0xe3, 0xb0, 0x8d, 0x91, 0xb9, 0x78, 0xd7, 0xe4, 0x80, 0x22, 0xa0, + 0x29, 0x2e, 0x34, 0x65, 0xc6, 0xdc, 0x9a, 0x0d, 0x7f, 0xf7, 0xc5, 0x78, 0x3b, 0x93, 0x4a, 0xaa, + 0x9c, 0x19, 0xbf, 0x11, 0xd0, 0x64, 0xbb, 0x58, 0xe6, 0x21, 0xf4, 0xe3, 0x10, 0x09, 0x71, 0x7d, + 0xc3, 0x8a, 0x74, 0x81, 0x05, 0x4d, 0x11, 0x89, 0x93, 0x41, 0x53, 0x96, 0xb4, 0xb4, 0x2e, 0x65, + 0xd5, 0x80, 0x24, 0x7e, 0x1f, 0x40, 0x14, 0xd4, 0x2e, 0x81, 0x9e, 0x80, 0xed, 0xcc, 0xb6, 0x1d, + 0x01, 0x07, 0x5a, 0xeb, 0x41, 0x2a, 0xb8, 0xd1, 0xf9, 0x32, 0xa8, 0x46, 0x6a, 0xa2, 0x12, 0x36, + 0x0b, 0x60, 0xed, 0x81, 0x03, 0x1c, 0xd5, 0x25, 0x27, 0x1b, 0x74, 0x1b, 0x2f, 0xc0, 0xdd, 0x45, + 0xeb, 0x12, 0xf0, 0x04, 0x0c, 0x9b, 0x4e, 0x36, 0xe5, 0x82, 0x66, 0xd9, 0x19, 0xd8, 0xce, 0xc7, + 0xfb, 0x44, 0x76, 0x3c, 0x12, 0x56, 0x3b, 0x4d, 0x29, 0x8a, 0xcf, 0x4a, 0x1b, 0xec, 0xeb, 0xca, + 0x96, 0xa5, 0x37, 0x95, 0x66, 0x17, 0x90, 0xaf, 0xc4, 0x07, 0xc4, 0x99, 0xe9, 0x96, 0xa5, 0x73, + 0x3d, 0xe1, 0x20, 0x20, 0x8f, 0x84, 0xd5, 0x4e, 0x4b, 0x8a, 0xe2, 0x2f, 0x01, 0x8c, 0x71, 0x65, + 0x67, 0xb5, 0xcc, 0xca, 0x02, 0x31, 0x4c, 0xa6, 0xf4, 0xf2, 0x9a, 0x96, 0xd3, 0xed, 0x66, 0xb0, + 0xa1, 0x35, 0x18, 0xa6, 0xe4, 0xa6, 0x6e, 0xda, 0x29, 0x83, 0x25, 0x83, 0x25, 0x72, 0x5f, 0x41, + 0x32, 0xdc, 0x34, 0x9c, 0x25, 0x86, 0x39, 0x7b, 0xec, 0x51, 0x3e, 0xde, 0xf2, 0xf0, 0x97, 0xf8, + 0x68, 0xda, 0xa0, 0x6b, 0xce, 0xb2, 0xb2, 0x42, 0xb2, 0x72, 0x4b, 0xc8, 0x9f, 0x71, 0x7b, 0xf5, + 0x66, 0x82, 0x61, 0xb6, 0xb9, 0x80, 0xad, 0x76, 0x0a, 0xed, 0x49, 0x13, 0xdf, 0x0d, 0xc1, 0x78, + 0x45, 0xe4, 0x32, 0x20, 0x36, 0xec, 0xb3, 0xd9, 0x4a, 0x8a, 0x38, 0x34, 0xa5, 0x65, 0x89, 0x63, + 0x52, 0x19, 0x97, 0x24, 0xb3, 0xfc, 0x73, 0x3e, 0x3e, 0x5c, 0x87, 0xe5, 0xa4, 0x49, 0xb7, 0xf3, + 0xf1, 0xbd, 0xc2, 0xe3, 0x62, 0x7d, 0x58, 0xed, 0xe1, 0x4b, 0x8b, 0x0e, 0x9d, 0xe1, 0x0b, 0xe8, + 0x06, 0x84, 0x32, 0x04, 0xc4, 0xa1, 0xcf, 0x22, 0x06, 0x32, 0xc2, 0x8b, 0x0e, 0xc5, 0x1f, 0x00, + 0x38, 0xe2, 0x05, 0x61, 0x6e, 0xd3, 0xa0, 0x2c, 0x08, 0x9c, 0x6b, 0x3e, 0x47, 0xb2, 0x85, 0x79, + 0xdc, 0x5b, 0x94, 0x47, 0x2f, 0x67, 0x57, 0x61, 0xaf, 0xf0, 0xca, 0x30, 0xdd, 0x20, 0x85, 0x78, + 0x90, 0x94, 0xc6, 0x82, 0xa4, 0x76, 0x73, 0x35, 0x49, 0x53, 0x04, 0x02, 0x3f, 0x00, 0x70, 0xb4, + 0x36, 0x38, 0x99, 0xaa, 0xc2, 0xa8, 0x81, 0x67, 0x1a, 0xb5, 0x39, 0xb8, 0xc7, 0xdb, 0x40, 0x4b, + 0x5a, 0x4e, 0xcb, 0x36, 0x55, 0xeb, 0xf8, 0x3c, 0xdc, 0x5b, 0xa2, 0x46, 0x7a, 0x33, 0x06, 0x3b, + 0x2c, 0xbe, 0x52, 0xad, 0xed, 0xaa, 0x92, 0x07, 0x5f, 0x94, 0x7b, 0xf0, 0x0a, 0xa1, 0x5a, 0x86, + 0x69, 0x7b, 0xc5, 0x58, 0x77, 0x8c, 0x55, 0x83, 0x6e, 0x35, 0x85, 0xeb, 0x13, 0x20, 0x77, 0x46, + 0x39, 0x7d, 0x12, 0xe0, 0x6d, 0x18, 0xce, 0xb8, 0x8b, 0xb5, 0xa3, 0x7d, 0x8e, 0x45, 0xdb, 0xef, + 0x24, 0x9e, 0x24, 0x6e, 0x2c, 0x03, 0xbe, 0xdc, 0xbc, 0x0c, 0x1d, 0x47, 0xd8, 0x7c, 0xbb, 0xc1, + 0x0e, 0x8c, 0x94, 0xea, 0x91, 0x2e, 0xbe, 0x06, 0x77, 0x52, 0xb6, 0x9c, 0xe2, 0x55, 0xe9, 0x66, + 0xa2, 0x8a, 0x97, 0x83, 0xd2, 0xcb, 0x5d, 0xc2, 0x58, 0x50, 0x18, 0xab, 0x5d, 0xd4, 0x37, 0x81, + 0xbf, 0x02, 0xf0, 0x60, 0x49, 0xef, 0xb9, 0x44, 0x2e, 0x6f, 0x68, 0xd6, 0x7f, 0xa2, 0x77, 0xfe, + 0x09, 0xe0, 0xa1, 0x1a, 0xf8, 0x65, 0x10, 0xef, 0x34, 0xb6, 0x2d, 0xe7, 0x64, 0x08, 0xfb, 0xdd, + 0x10, 0xba, 0xa2, 0xb8, 0xc9, 0xbd, 0x8a, 0x2e, 0x42, 0x28, 0x52, 0x20, 0xbb, 0x69, 0x33, 0x7d, + 0x29, 0x2c, 0x34, 0xb0, 0xad, 0xff, 0x07, 0x90, 0x87, 0xe7, 0x65, 0x8b, 0xd0, 0xa5, 0x9c, 0xb1, + 0xd2, 0xd4, 0x11, 0x8c, 0xe6, 0x60, 0x1f, 0x73, 0x3e, 0xa5, 0xd9, 0xb6, 0x4e, 0x53, 0xab, 0xba, + 0x49, 0xb2, 0x12, 0xdb, 0xa0, 0x7f, 0x54, 0x14, 0x73, 0x60, 0xb5, 0x87, 0x2d, 0xcd, 0xb0, 0x95, + 0x73, 0x6c, 0x01, 0x5d, 0x80, 0xfd, 0xeb, 0x0e, 0xa1, 0x85, 0x7a, 0x5a, 0xb9, 0x9e, 0xa1, 0xed, + 0x7c, 0x3c, 0x22, 0xf4, 0x94, 0xb0, 0x60, 0xb5, 0x97, 0xaf, 0xf9, 0x9a, 0xa6, 0x43, 0x11, 0xb0, + 0xd0, 0xd6, 0xd9, 0xd6, 0xd7, 0xae, 0x76, 0x6d, 0x18, 0x74, 0x8d, 0x65, 0x72, 0x5e, 0xd7, 0xf1, + 0xd7, 0x00, 0x0e, 0xfa, 0xa3, 0xd6, 0x35, 0x83, 0xae, 0xcd, 0x1b, 0x19, 0xaa, 0xe7, 0x5c, 0xa7, + 0x4f, 0xc2, 0xee, 0xac, 0x61, 0xa6, 0x82, 0xad, 0x80, 0x19, 0x8f, 0x6c, 0xe7, 0xe3, 0x03, 0xc2, + 0x78, 0x01, 0x19, 0xab, 0x3b, 0xb3, 0x86, 0xe9, 0x75, 0x13, 0x34, 0x18, 0x1c, 0x38, 0xb8, 0xff, + 0xfe, 0x68, 0x51, 0x34, 0x2e, 0xb6, 0x36, 0x3d, 0x2e, 0x7e, 0x04, 0xe0, 0x50, 0x79, 0x1f, 0x9e, + 0x93, 0xc1, 0x51, 0x95, 0xc7, 0x49, 0xa0, 0xa4, 0x24, 0xb2, 0x29, 0x08, 0x6d, 0x8b, 0xd0, 0x94, + 0xc5, 0x56, 0x65, 0x6c, 0x77, 0xfb, 0xdb, 0xc3, 0xa7, 0x61, 0x35, 0x6c, 0xbb, 0xd2, 0x2c, 0x97, + 0xf8, 0x2f, 0x00, 0xf7, 0x0b, 0xa5, 0x1b, 0x9a, 0x35, 0xb7, 0xa9, 0xad, 0xc8, 0xe9, 0x22, 0x69, + 0xba, 0xa9, 0x3b, 0x0c, 0x3b, 0x6c, 0xdd, 0x5c, 0xd5, 0x73, 0x52, 0x6f, 0xff, 0x76, 0x3e, 0xde, + 0x2d, 0xf5, 0xf2, 0x75, 0xac, 0x4a, 0x86, 0x60, 0x69, 0x87, 0x6a, 0x96, 0xb6, 0x02, 0x45, 0x9f, + 0x60, 0x4d, 0x48, 0x94, 0xe2, 0xae, 0xed, 0x7c, 0xbc, 0x37, 0xb0, 0xa1, 0x53, 0x86, 0x89, 0xd5, + 0x1d, 0xfc, 0x6f, 0xd2, 0x44, 0x57, 0x61, 0x47, 0x8e, 0x38, 0x54, 0xb7, 0x23, 0x6d, 0x3c, 0xfc, + 0x23, 0x4a, 0xb9, 0x1b, 0x9b, 0xc2, 0xfc, 0xf0, 0x5c, 0x60, 0xfc, 0xb3, 0xbb, 0x65, 0xaf, 0x90, + 0xa0, 0x85, 0x12, 0xac, 0x4a, 0x6d, 0xf8, 0xbe, 0x3b, 0x99, 0x96, 0x89, 0x80, 0x3f, 0xde, 0x09, + 0x40, 0xff, 0xde, 0x78, 0x57, 0xac, 0x0f, 0xab, 0x3d, 0x7c, 0xc9, 0x1b, 0xef, 0xf0, 0x5b, 0xa1, + 0xf2, 0xb8, 0x16, 0x1d, 0xfa, 0xac, 0x53, 0x73, 0xcd, 0x0b, 0x75, 0x2b, 0x0f, 0xf5, 0x68, 0xad, + 0x50, 0x33, 0x4c, 0x75, 0xc4, 0x9a, 0x5d, 0x1c, 0x3c, 0xc7, 0x23, 0x6d, 0xc5, 0x17, 0x07, 0x8f, + 0x84, 0xe5, 0x11, 0xc2, 0x1a, 0xe9, 0x3d, 0x77, 0xc8, 0x28, 0x17, 0x06, 0x99, 0x1f, 0x0b, 0xf6, + 0xba, 0x05, 0x53, 0x98, 0x9e, 0x0b, 0x0d, 0xa7, 0x67, 0x4f, 0x61, 0xfd, 0x79, 0xd9, 0xe9, 0x96, + 0x65, 0x28, 0x93, 0x33, 0x04, 0xa3, 0xfe, 0x3c, 0x50, 0x3c, 0x45, 0xe1, 0x0f, 0xdd, 0x6e, 0x58, + 0x4c, 0x7e, 0x2e, 0x86, 0xa2, 0xc9, 0x87, 0x03, 0xb0, 0x9d, 0xc3, 0x43, 0x77, 0x20, 0x6f, 0x55, + 0x36, 0xaa, 0xb0, 0x99, 0x4a, 0xee, 0xe6, 0xd1, 0xd1, 0xda, 0x8c, 0xc2, 0x49, 0xfc, 0xff, 0xbb, + 0x3f, 0xfe, 0x76, 0x2f, 0xb4, 0x1f, 0x0d, 0x26, 0xca, 0xbe, 0x96, 0x88, 0xde, 0xf8, 0x2e, 0x80, + 0x9d, 0xee, 0x7d, 0x17, 0x1d, 0xa9, 0xa2, 0xbb, 0xe8, 0xb2, 0x1c, 0x3d, 0x5a, 0x17, 0xaf, 0x84, + 0x32, 0xc2, 0xa1, 0xfc, 0x0f, 0xc5, 0xcb, 0x43, 0xf1, 0x6e, 0xd0, 0xe8, 0x53, 0x00, 0x7b, 0x0a, + 0x73, 0x86, 0x8e, 0x55, 0x31, 0x54, 0x36, 0xfb, 0xd1, 0x89, 0x06, 0x24, 0x24, 0xc0, 0x71, 0x0e, + 0x70, 0x04, 0x1d, 0x2a, 0x0f, 0x50, 0x4c, 0x88, 0x5e, 0x02, 0xd1, 0x67, 0x00, 0xf6, 0x16, 0x1d, + 0x52, 0x68, 0xa2, 0x56, 0x62, 0x4a, 0x0e, 0xe5, 0xe8, 0x64, 0x23, 0x22, 0x12, 0xe9, 0x18, 0x47, + 0x3a, 0x8c, 0x0e, 0x96, 0x47, 0x7a, 0x9d, 0x73, 0xeb, 0xab, 0x32, 0x9e, 0x6f, 0x03, 0xd8, 0xc6, + 0x34, 0xa1, 0xe1, 0x1a, 0xa6, 0x5c, 0x48, 0x23, 0x35, 0xf9, 0xea, 0x8b, 0x18, 0x37, 0x9f, 0x78, + 0x53, 0x76, 0xb6, 0xdb, 0xe8, 0x01, 0x80, 0x9d, 0xee, 0x33, 0x46, 0xd5, 0x3a, 0x2b, 0x7a, 0x30, + 0xa9, 0x5a, 0x67, 0xc5, 0xef, 0x22, 0x78, 0x82, 0x83, 0x3a, 0x8a, 0x0e, 0x57, 0x06, 0xc5, 0x47, + 0x98, 0x00, 0xb0, 0xfb, 0x00, 0x46, 0x2a, 0x0d, 0xc7, 0x68, 0xba, 0x8a, 0xf1, 0x1a, 0x37, 0x82, + 0xe8, 0x4b, 0x4d, 0xc9, 0x4a, 0x47, 0x5a, 0xd0, 0x37, 0x00, 0xa2, 0xd2, 0x07, 0x0f, 0x34, 0x55, + 0xa7, 0xd6, 0x42, 0x2c, 0x27, 0x1a, 0x94, 0x92, 0x28, 0xce, 0xf0, 0x70, 0x4e, 0xa3, 0x17, 0xeb, + 0xca, 0x71, 0xe2, 0x06, 0x31, 0xcc, 0x94, 0xbd, 0xa1, 0x59, 0x29, 0x9d, 0x1d, 0x13, 0x29, 0xc3, + 0x44, 0xbf, 0x03, 0x38, 0x58, 0xe5, 0x51, 0x00, 0x9d, 0xac, 0x01, 0xac, 0xfa, 0x4b, 0x47, 0xf4, + 0x54, 0xb3, 0xe2, 0xd2, 0xc1, 0xf3, 0xdc, 0xc1, 0x19, 0x74, 0xba, 0x3e, 0x07, 0xf5, 0x4d, 0x83, + 0x0a, 0x07, 0xc5, 0x33, 0x8a, 0x38, 0x9b, 0x98, 0x9f, 0x1f, 0x03, 0x08, 0xfd, 0xd7, 0x01, 0x34, + 0x56, 0xa3, 0x68, 0x0b, 0xde, 0x22, 0xa2, 0xe3, 0x75, 0x72, 0x4b, 0xd0, 0x53, 0x1c, 0xb4, 0x82, + 0xc6, 0xea, 0x03, 0x2d, 0x9e, 0x1e, 0xd0, 0xb7, 0x00, 0xa2, 0xd2, 0x67, 0x82, 0xaa, 0xf5, 0x54, + 0xf1, 0x95, 0xa2, 0x6a, 0x3d, 0x55, 0x7e, 0x8b, 0xc0, 0xb3, 0x1c, 0xf9, 0xcb, 0x68, 0xba, 0x3e, + 0xe4, 0xa2, 0xeb, 0xf2, 0x4f, 0xbf, 0xf5, 0x7e, 0x0e, 0x60, 0x57, 0xe0, 0x11, 0x00, 0x8d, 0xd7, + 0x82, 0x52, 0x58, 0x31, 0x4a, 0xbd, 0xec, 0x12, 0xf2, 0x34, 0x87, 0x3c, 0x85, 0x26, 0x1b, 0x81, + 0x2c, 0x6e, 0xa1, 0xac, 0x28, 0xc2, 0xde, 0x55, 0x01, 0x55, 0x6b, 0x64, 0xc5, 0x77, 0xd4, 0xe8, + 0x58, 0x7d, 0xcc, 0x12, 0xe4, 0x0b, 0x0d, 0x56, 0x04, 0x13, 0xb6, 0xdf, 0x09, 0x01, 0xf4, 0x3d, + 0x80, 0xfb, 0xe6, 0x6c, 0x6a, 0x64, 0x35, 0xaa, 0x97, 0x4c, 0xdf, 0xe8, 0x78, 0x35, 0x10, 0x15, + 0x6e, 0x2b, 0xd1, 0xa9, 0xc6, 0x84, 0xa4, 0x07, 0x73, 0xdc, 0x83, 0xd3, 0xe8, 0x64, 0x79, 0x0f, + 0x02, 0x5b, 0x50, 0xa2, 0x4d, 0x04, 0xfa, 0x8c, 0xbf, 0x0d, 0x7f, 0x00, 0x30, 0x5a, 0xc1, 0x9f, + 0x45, 0x87, 0xa2, 0x06, 0xb0, 0xf9, 0x43, 0x7e, 0xd5, 0x62, 0xaf, 0x3c, 0x13, 0xe3, 0x79, 0xee, + 0xd2, 0x19, 0x74, 0xea, 0x1f, 0xb8, 0x44, 0x1c, 0x3a, 0xbb, 0xf0, 0xe8, 0x49, 0x0c, 0x3c, 0x7e, + 0x12, 0x03, 0xbf, 0x3e, 0x89, 0x81, 0xf7, 0x9e, 0xc6, 0x5a, 0x1e, 0x3f, 0x8d, 0xb5, 0xfc, 0xf4, + 0x34, 0xd6, 0xf2, 0xfa, 0xb1, 0xc0, 0xec, 0x29, 0x6d, 0x8c, 0x67, 0xb4, 0x65, 0xdb, 0x33, 0x78, + 0x6b, 0x62, 0x2a, 0xb1, 0x29, 0xcc, 0xf2, 0x49, 0x74, 0xb9, 0x83, 0xdf, 0x94, 0x8f, 0xff, 0x1d, + 0x00, 0x00, 0xff, 0xff, 0xa7, 0x83, 0x77, 0x41, 0x8e, 0x1b, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + Pools(ctx context.Context, in *QueryPoolsRequest, opts ...grpc.CallOption) (*QueryPoolsResponse, error) + NumPools(ctx context.Context, in *QueryNumPoolsRequest, opts ...grpc.CallOption) (*QueryNumPoolsResponse, error) + TotalLiquidity(ctx context.Context, in *QueryTotalLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalLiquidityResponse, error) + // PoolsWithFilter allows you to query specific pools with requested + // parameters + PoolsWithFilter(ctx context.Context, in *QueryPoolsWithFilterRequest, opts ...grpc.CallOption) (*QueryPoolsWithFilterResponse, error) + // Per Pool gRPC Endpoints + Pool(ctx context.Context, in *QueryPoolRequest, opts ...grpc.CallOption) (*QueryPoolResponse, error) + // PoolType returns the type of the pool. + // Returns "Balancer" as a string literal when the pool is a balancer pool. + // Errors if the pool is failed to be type caseted. + PoolType(ctx context.Context, in *QueryPoolTypeRequest, opts ...grpc.CallOption) (*QueryPoolTypeResponse, error) + // Simulates joining pool without a swap. Returns the amount of shares you'd + // get and tokens needed to provide + CalcJoinPoolNoSwapShares(ctx context.Context, in *QueryCalcJoinPoolNoSwapSharesRequest, opts ...grpc.CallOption) (*QueryCalcJoinPoolNoSwapSharesResponse, error) + CalcJoinPoolShares(ctx context.Context, in *QueryCalcJoinPoolSharesRequest, opts ...grpc.CallOption) (*QueryCalcJoinPoolSharesResponse, error) + CalcExitPoolCoinsFromShares(ctx context.Context, in *QueryCalcExitPoolCoinsFromSharesRequest, opts ...grpc.CallOption) (*QueryCalcExitPoolCoinsFromSharesResponse, error) + PoolParams(ctx context.Context, in *QueryPoolParamsRequest, opts ...grpc.CallOption) (*QueryPoolParamsResponse, error) + TotalPoolLiquidity(ctx context.Context, in *QueryTotalPoolLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalPoolLiquidityResponse, error) + TotalShares(ctx context.Context, in *QueryTotalSharesRequest, opts ...grpc.CallOption) (*QueryTotalSharesResponse, error) + // SpotPrice defines a gRPC query handler that returns the spot price given + // a base denomination and a quote denomination. + SpotPrice(ctx context.Context, in *QuerySpotPriceRequest, opts ...grpc.CallOption) (*QuerySpotPriceResponse, error) + // Estimate the swap. + EstimateSwapExactAmountIn(ctx context.Context, in *QuerySwapExactAmountInRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountInResponse, error) + EstimateSwapExactAmountOut(ctx context.Context, in *QuerySwapExactAmountOutRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountOutResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) Pools(ctx context.Context, in *QueryPoolsRequest, opts ...grpc.CallOption) (*QueryPoolsResponse, error) { + out := new(QueryPoolsResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/Pools", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) NumPools(ctx context.Context, in *QueryNumPoolsRequest, opts ...grpc.CallOption) (*QueryNumPoolsResponse, error) { + out := new(QueryNumPoolsResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/NumPools", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) TotalLiquidity(ctx context.Context, in *QueryTotalLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalLiquidityResponse, error) { + out := new(QueryTotalLiquidityResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/TotalLiquidity", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) PoolsWithFilter(ctx context.Context, in *QueryPoolsWithFilterRequest, opts ...grpc.CallOption) (*QueryPoolsWithFilterResponse, error) { + out := new(QueryPoolsWithFilterResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/PoolsWithFilter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Pool(ctx context.Context, in *QueryPoolRequest, opts ...grpc.CallOption) (*QueryPoolResponse, error) { + out := new(QueryPoolResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/Pool", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) PoolType(ctx context.Context, in *QueryPoolTypeRequest, opts ...grpc.CallOption) (*QueryPoolTypeResponse, error) { + out := new(QueryPoolTypeResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/PoolType", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CalcJoinPoolNoSwapShares(ctx context.Context, in *QueryCalcJoinPoolNoSwapSharesRequest, opts ...grpc.CallOption) (*QueryCalcJoinPoolNoSwapSharesResponse, error) { + out := new(QueryCalcJoinPoolNoSwapSharesResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/CalcJoinPoolNoSwapShares", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CalcJoinPoolShares(ctx context.Context, in *QueryCalcJoinPoolSharesRequest, opts ...grpc.CallOption) (*QueryCalcJoinPoolSharesResponse, error) { + out := new(QueryCalcJoinPoolSharesResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/CalcJoinPoolShares", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CalcExitPoolCoinsFromShares(ctx context.Context, in *QueryCalcExitPoolCoinsFromSharesRequest, opts ...grpc.CallOption) (*QueryCalcExitPoolCoinsFromSharesResponse, error) { + out := new(QueryCalcExitPoolCoinsFromSharesResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/CalcExitPoolCoinsFromShares", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) PoolParams(ctx context.Context, in *QueryPoolParamsRequest, opts ...grpc.CallOption) (*QueryPoolParamsResponse, error) { + out := new(QueryPoolParamsResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/PoolParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) TotalPoolLiquidity(ctx context.Context, in *QueryTotalPoolLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalPoolLiquidityResponse, error) { + out := new(QueryTotalPoolLiquidityResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/TotalPoolLiquidity", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) TotalShares(ctx context.Context, in *QueryTotalSharesRequest, opts ...grpc.CallOption) (*QueryTotalSharesResponse, error) { + out := new(QueryTotalSharesResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/TotalShares", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Deprecated: Do not use. +func (c *queryClient) SpotPrice(ctx context.Context, in *QuerySpotPriceRequest, opts ...grpc.CallOption) (*QuerySpotPriceResponse, error) { + out := new(QuerySpotPriceResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/SpotPrice", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) EstimateSwapExactAmountIn(ctx context.Context, in *QuerySwapExactAmountInRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountInResponse, error) { + out := new(QuerySwapExactAmountInResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/EstimateSwapExactAmountIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) EstimateSwapExactAmountOut(ctx context.Context, in *QuerySwapExactAmountOutRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountOutResponse, error) { + out := new(QuerySwapExactAmountOutResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Query/EstimateSwapExactAmountOut", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + Pools(context.Context, *QueryPoolsRequest) (*QueryPoolsResponse, error) + NumPools(context.Context, *QueryNumPoolsRequest) (*QueryNumPoolsResponse, error) + TotalLiquidity(context.Context, *QueryTotalLiquidityRequest) (*QueryTotalLiquidityResponse, error) + // PoolsWithFilter allows you to query specific pools with requested + // parameters + PoolsWithFilter(context.Context, *QueryPoolsWithFilterRequest) (*QueryPoolsWithFilterResponse, error) + // Per Pool gRPC Endpoints + Pool(context.Context, *QueryPoolRequest) (*QueryPoolResponse, error) + // PoolType returns the type of the pool. + // Returns "Balancer" as a string literal when the pool is a balancer pool. + // Errors if the pool is failed to be type caseted. + PoolType(context.Context, *QueryPoolTypeRequest) (*QueryPoolTypeResponse, error) + // Simulates joining pool without a swap. Returns the amount of shares you'd + // get and tokens needed to provide + CalcJoinPoolNoSwapShares(context.Context, *QueryCalcJoinPoolNoSwapSharesRequest) (*QueryCalcJoinPoolNoSwapSharesResponse, error) + CalcJoinPoolShares(context.Context, *QueryCalcJoinPoolSharesRequest) (*QueryCalcJoinPoolSharesResponse, error) + CalcExitPoolCoinsFromShares(context.Context, *QueryCalcExitPoolCoinsFromSharesRequest) (*QueryCalcExitPoolCoinsFromSharesResponse, error) + PoolParams(context.Context, *QueryPoolParamsRequest) (*QueryPoolParamsResponse, error) + TotalPoolLiquidity(context.Context, *QueryTotalPoolLiquidityRequest) (*QueryTotalPoolLiquidityResponse, error) + TotalShares(context.Context, *QueryTotalSharesRequest) (*QueryTotalSharesResponse, error) + // SpotPrice defines a gRPC query handler that returns the spot price given + // a base denomination and a quote denomination. + SpotPrice(context.Context, *QuerySpotPriceRequest) (*QuerySpotPriceResponse, error) + // Estimate the swap. + EstimateSwapExactAmountIn(context.Context, *QuerySwapExactAmountInRequest) (*QuerySwapExactAmountInResponse, error) + EstimateSwapExactAmountOut(context.Context, *QuerySwapExactAmountOutRequest) (*QuerySwapExactAmountOutResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) Pools(ctx context.Context, req *QueryPoolsRequest) (*QueryPoolsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Pools not implemented") +} +func (*UnimplementedQueryServer) NumPools(ctx context.Context, req *QueryNumPoolsRequest) (*QueryNumPoolsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NumPools not implemented") +} +func (*UnimplementedQueryServer) TotalLiquidity(ctx context.Context, req *QueryTotalLiquidityRequest) (*QueryTotalLiquidityResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TotalLiquidity not implemented") +} +func (*UnimplementedQueryServer) PoolsWithFilter(ctx context.Context, req *QueryPoolsWithFilterRequest) (*QueryPoolsWithFilterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PoolsWithFilter not implemented") +} +func (*UnimplementedQueryServer) Pool(ctx context.Context, req *QueryPoolRequest) (*QueryPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Pool not implemented") +} +func (*UnimplementedQueryServer) PoolType(ctx context.Context, req *QueryPoolTypeRequest) (*QueryPoolTypeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PoolType not implemented") +} +func (*UnimplementedQueryServer) CalcJoinPoolNoSwapShares(ctx context.Context, req *QueryCalcJoinPoolNoSwapSharesRequest) (*QueryCalcJoinPoolNoSwapSharesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CalcJoinPoolNoSwapShares not implemented") +} +func (*UnimplementedQueryServer) CalcJoinPoolShares(ctx context.Context, req *QueryCalcJoinPoolSharesRequest) (*QueryCalcJoinPoolSharesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CalcJoinPoolShares not implemented") +} +func (*UnimplementedQueryServer) CalcExitPoolCoinsFromShares(ctx context.Context, req *QueryCalcExitPoolCoinsFromSharesRequest) (*QueryCalcExitPoolCoinsFromSharesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CalcExitPoolCoinsFromShares not implemented") +} +func (*UnimplementedQueryServer) PoolParams(ctx context.Context, req *QueryPoolParamsRequest) (*QueryPoolParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PoolParams not implemented") +} +func (*UnimplementedQueryServer) TotalPoolLiquidity(ctx context.Context, req *QueryTotalPoolLiquidityRequest) (*QueryTotalPoolLiquidityResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TotalPoolLiquidity not implemented") +} +func (*UnimplementedQueryServer) TotalShares(ctx context.Context, req *QueryTotalSharesRequest) (*QueryTotalSharesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TotalShares not implemented") +} +func (*UnimplementedQueryServer) SpotPrice(ctx context.Context, req *QuerySpotPriceRequest) (*QuerySpotPriceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SpotPrice not implemented") +} +func (*UnimplementedQueryServer) EstimateSwapExactAmountIn(ctx context.Context, req *QuerySwapExactAmountInRequest) (*QuerySwapExactAmountInResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateSwapExactAmountIn not implemented") +} +func (*UnimplementedQueryServer) EstimateSwapExactAmountOut(ctx context.Context, req *QuerySwapExactAmountOutRequest) (*QuerySwapExactAmountOutResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateSwapExactAmountOut not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_Pools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoolsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Pools(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/Pools", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Pools(ctx, req.(*QueryPoolsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_NumPools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryNumPoolsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).NumPools(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/NumPools", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).NumPools(ctx, req.(*QueryNumPoolsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_TotalLiquidity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTotalLiquidityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TotalLiquidity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/TotalLiquidity", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TotalLiquidity(ctx, req.(*QueryTotalLiquidityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_PoolsWithFilter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoolsWithFilterRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PoolsWithFilter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/PoolsWithFilter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PoolsWithFilter(ctx, req.(*QueryPoolsWithFilterRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Pool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoolRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Pool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/Pool", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Pool(ctx, req.(*QueryPoolRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_PoolType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoolTypeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PoolType(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/PoolType", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PoolType(ctx, req.(*QueryPoolTypeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CalcJoinPoolNoSwapShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCalcJoinPoolNoSwapSharesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CalcJoinPoolNoSwapShares(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/CalcJoinPoolNoSwapShares", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CalcJoinPoolNoSwapShares(ctx, req.(*QueryCalcJoinPoolNoSwapSharesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CalcJoinPoolShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCalcJoinPoolSharesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CalcJoinPoolShares(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/CalcJoinPoolShares", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CalcJoinPoolShares(ctx, req.(*QueryCalcJoinPoolSharesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CalcExitPoolCoinsFromShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCalcExitPoolCoinsFromSharesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CalcExitPoolCoinsFromShares(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/CalcExitPoolCoinsFromShares", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CalcExitPoolCoinsFromShares(ctx, req.(*QueryCalcExitPoolCoinsFromSharesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_PoolParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoolParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PoolParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/PoolParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PoolParams(ctx, req.(*QueryPoolParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_TotalPoolLiquidity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTotalPoolLiquidityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TotalPoolLiquidity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/TotalPoolLiquidity", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TotalPoolLiquidity(ctx, req.(*QueryTotalPoolLiquidityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_TotalShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTotalSharesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TotalShares(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/TotalShares", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TotalShares(ctx, req.(*QueryTotalSharesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_SpotPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuerySpotPriceRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).SpotPrice(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/SpotPrice", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).SpotPrice(ctx, req.(*QuerySpotPriceRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_EstimateSwapExactAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuerySwapExactAmountInRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).EstimateSwapExactAmountIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/EstimateSwapExactAmountIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).EstimateSwapExactAmountIn(ctx, req.(*QuerySwapExactAmountInRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_EstimateSwapExactAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuerySwapExactAmountOutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).EstimateSwapExactAmountOut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Query/EstimateSwapExactAmountOut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).EstimateSwapExactAmountOut(ctx, req.(*QuerySwapExactAmountOutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "osmosis.gamm.v1beta1.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Pools", + Handler: _Query_Pools_Handler, + }, + { + MethodName: "NumPools", + Handler: _Query_NumPools_Handler, + }, + { + MethodName: "TotalLiquidity", + Handler: _Query_TotalLiquidity_Handler, + }, + { + MethodName: "PoolsWithFilter", + Handler: _Query_PoolsWithFilter_Handler, + }, + { + MethodName: "Pool", + Handler: _Query_Pool_Handler, + }, + { + MethodName: "PoolType", + Handler: _Query_PoolType_Handler, + }, + { + MethodName: "CalcJoinPoolNoSwapShares", + Handler: _Query_CalcJoinPoolNoSwapShares_Handler, + }, + { + MethodName: "CalcJoinPoolShares", + Handler: _Query_CalcJoinPoolShares_Handler, + }, + { + MethodName: "CalcExitPoolCoinsFromShares", + Handler: _Query_CalcExitPoolCoinsFromShares_Handler, + }, + { + MethodName: "PoolParams", + Handler: _Query_PoolParams_Handler, + }, + { + MethodName: "TotalPoolLiquidity", + Handler: _Query_TotalPoolLiquidity_Handler, + }, + { + MethodName: "TotalShares", + Handler: _Query_TotalShares_Handler, + }, + { + MethodName: "SpotPrice", + Handler: _Query_SpotPrice_Handler, + }, + { + MethodName: "EstimateSwapExactAmountIn", + Handler: _Query_EstimateSwapExactAmountIn_Handler, + }, + { + MethodName: "EstimateSwapExactAmountOut", + Handler: _Query_EstimateSwapExactAmountOut_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "osmosis/gamm/v1beta1/query.proto", +} + +func (m *QueryPoolRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pool != nil { + { + size, err := m.Pool.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Pools) > 0 { + for iNdEx := len(m.Pools) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Pools[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryNumPoolsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryNumPoolsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryNumPoolsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryNumPoolsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryNumPoolsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryNumPoolsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.NumPools != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.NumPools)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolTypeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolTypeRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolTypeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolTypeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolTypeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolTypeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PoolType) > 0 { + i -= len(m.PoolType) + copy(dAtA[i:], m.PoolType) + i = encodeVarintQuery(dAtA, i, uint64(len(m.PoolType))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryCalcJoinPoolSharesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCalcJoinPoolSharesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCalcJoinPoolSharesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokensIn) > 0 { + for iNdEx := len(m.TokensIn) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokensIn[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryCalcJoinPoolSharesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCalcJoinPoolSharesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCalcJoinPoolSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokensOut) > 0 { + for iNdEx := len(m.TokensOut) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokensOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size := m.ShareOutAmount.Size() + i -= size + if _, err := m.ShareOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryCalcExitPoolCoinsFromSharesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCalcExitPoolCoinsFromSharesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCalcExitPoolCoinsFromSharesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.ShareInAmount.Size() + i -= size + if _, err := m.ShareInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryCalcExitPoolCoinsFromSharesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCalcExitPoolCoinsFromSharesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCalcExitPoolCoinsFromSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokensOut) > 0 { + for iNdEx := len(m.TokensOut) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokensOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolParamsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Params != nil { + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryTotalPoolLiquidityRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryTotalPoolLiquidityRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryTotalPoolLiquidityRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryTotalPoolLiquidityResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryTotalPoolLiquidityResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryTotalPoolLiquidityResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Liquidity) > 0 { + for iNdEx := len(m.Liquidity) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Liquidity[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QueryTotalSharesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryTotalSharesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryTotalSharesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryTotalSharesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryTotalSharesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryTotalSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.TotalShares.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokensIn) > 0 { + for iNdEx := len(m.TokensIn) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokensIn[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryCalcJoinPoolNoSwapSharesResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCalcJoinPoolNoSwapSharesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCalcJoinPoolNoSwapSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.SharesOut.Size() + i -= size + if _, err := m.SharesOut.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.TokensOut) > 0 { + for iNdEx := len(m.TokensOut) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokensOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QuerySpotPriceRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySpotPriceRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySpotPriceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.QuoteAssetDenom) > 0 { + i -= len(m.QuoteAssetDenom) + copy(dAtA[i:], m.QuoteAssetDenom) + i = encodeVarintQuery(dAtA, i, uint64(len(m.QuoteAssetDenom))) + i-- + dAtA[i] = 0x1a + } + if len(m.BaseAssetDenom) > 0 { + i -= len(m.BaseAssetDenom) + copy(dAtA[i:], m.BaseAssetDenom) + i = encodeVarintQuery(dAtA, i, uint64(len(m.BaseAssetDenom))) + i-- + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolsWithFilterRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolsWithFilterRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolsWithFilterRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.PoolType) > 0 { + i -= len(m.PoolType) + copy(dAtA[i:], m.PoolType) + i = encodeVarintQuery(dAtA, i, uint64(len(m.PoolType))) + i-- + dAtA[i] = 0x12 + } + if len(m.MinLiquidity) > 0 { + i -= len(m.MinLiquidity) + copy(dAtA[i:], m.MinLiquidity) + i = encodeVarintQuery(dAtA, i, uint64(len(m.MinLiquidity))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryPoolsWithFilterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPoolsWithFilterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoolsWithFilterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Pagination != nil { + { + size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Pools) > 0 { + for iNdEx := len(m.Pools) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Pools[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *QuerySpotPriceResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySpotPriceResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySpotPriceResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.SpotPrice) > 0 { + i -= len(m.SpotPrice) + copy(dAtA[i:], m.SpotPrice) + i = encodeVarintQuery(dAtA, i, uint64(len(m.SpotPrice))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QuerySwapExactAmountInRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySwapExactAmountInRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySwapExactAmountInRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Routes) > 0 { + for iNdEx := len(m.Routes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Routes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.TokenIn) > 0 { + i -= len(m.TokenIn) + copy(dAtA[i:], m.TokenIn) + i = encodeVarintQuery(dAtA, i, uint64(len(m.TokenIn))) + i-- + dAtA[i] = 0x1a + } + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QuerySwapExactAmountInResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySwapExactAmountInResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySwapExactAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenOutAmount.Size() + i -= size + if _, err := m.TokenOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QuerySwapExactAmountOutRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySwapExactAmountOutRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySwapExactAmountOutRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenOut) > 0 { + i -= len(m.TokenOut) + copy(dAtA[i:], m.TokenOut) + i = encodeVarintQuery(dAtA, i, uint64(len(m.TokenOut))) + i-- + dAtA[i] = 0x22 + } + if len(m.Routes) > 0 { + for iNdEx := len(m.Routes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Routes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.PoolId != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QuerySwapExactAmountOutResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySwapExactAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySwapExactAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenInAmount.Size() + i -= size + if _, err := m.TokenInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryTotalLiquidityRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryTotalLiquidityRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryTotalLiquidityRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryTotalLiquidityResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryTotalLiquidityResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryTotalLiquidityResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Liquidity) > 0 { + for iNdEx := len(m.Liquidity) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Liquidity[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryPoolRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + return n +} + +func (m *QueryPoolResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pool != nil { + l = m.Pool.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryPoolsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryPoolsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Pools) > 0 { + for _, e := range m.Pools { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryNumPoolsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryNumPoolsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.NumPools != 0 { + n += 1 + sovQuery(uint64(m.NumPools)) + } + return n +} + +func (m *QueryPoolTypeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + return n +} + +func (m *QueryPoolTypeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PoolType) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryCalcJoinPoolSharesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + if len(m.TokensIn) > 0 { + for _, e := range m.TokensIn { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryCalcJoinPoolSharesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ShareOutAmount.Size() + n += 1 + l + sovQuery(uint64(l)) + if len(m.TokensOut) > 0 { + for _, e := range m.TokensOut { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryCalcExitPoolCoinsFromSharesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + l = m.ShareInAmount.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryCalcExitPoolCoinsFromSharesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TokensOut) > 0 { + for _, e := range m.TokensOut { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryPoolParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + return n +} + +func (m *QueryPoolParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Params != nil { + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryTotalPoolLiquidityRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + return n +} + +func (m *QueryTotalPoolLiquidityResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Liquidity) > 0 { + for _, e := range m.Liquidity { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryTotalSharesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + return n +} + +func (m *QueryTotalSharesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TotalShares.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryCalcJoinPoolNoSwapSharesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + if len(m.TokensIn) > 0 { + for _, e := range m.TokensIn { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryCalcJoinPoolNoSwapSharesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TokensOut) > 0 { + for _, e := range m.TokensOut { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + l = m.SharesOut.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QuerySpotPriceRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + l = len(m.BaseAssetDenom) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.QuoteAssetDenom) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryPoolsWithFilterRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.MinLiquidity) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.PoolType) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryPoolsWithFilterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Pools) > 0 { + for _, e := range m.Pools { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + if m.Pagination != nil { + l = m.Pagination.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QuerySpotPriceResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SpotPrice) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QuerySwapExactAmountInRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + l = len(m.TokenIn) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if len(m.Routes) > 0 { + for _, e := range m.Routes { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QuerySwapExactAmountInResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TokenOutAmount.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QuerySwapExactAmountOutRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovQuery(uint64(m.PoolId)) + } + if len(m.Routes) > 0 { + for _, e := range m.Routes { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + l = len(m.TokenOut) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QuerySwapExactAmountOutResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TokenInAmount.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryTotalLiquidityRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryTotalLiquidityResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Liquidity) > 0 { + for _, e := range m.Liquidity { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryPoolRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pool == nil { + m.Pool = &types.Any{} + } + if err := m.Pool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pools", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pools = append(m.Pools, &types.Any{}) + if err := m.Pools[len(m.Pools)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryNumPoolsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryNumPoolsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryNumPoolsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryNumPoolsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryNumPoolsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryNumPoolsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumPools", wireType) + } + m.NumPools = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumPools |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolTypeRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolTypeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolTypeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolTypeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolTypeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolTypeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCalcJoinPoolSharesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCalcJoinPoolSharesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCalcJoinPoolSharesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokensIn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokensIn = append(m.TokensIn, types1.Coin{}) + if err := m.TokensIn[len(m.TokensIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCalcJoinPoolSharesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCalcJoinPoolSharesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCalcJoinPoolSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokensOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokensOut = append(m.TokensOut, types1.Coin{}) + if err := m.TokensOut[len(m.TokensOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCalcExitPoolCoinsFromSharesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCalcExitPoolCoinsFromSharesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCalcExitPoolCoinsFromSharesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCalcExitPoolCoinsFromSharesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCalcExitPoolCoinsFromSharesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCalcExitPoolCoinsFromSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokensOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokensOut = append(m.TokensOut, types1.Coin{}) + if err := m.TokensOut[len(m.TokensOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolParamsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Params == nil { + m.Params = &types.Any{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryTotalPoolLiquidityRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryTotalPoolLiquidityRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryTotalPoolLiquidityRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryTotalPoolLiquidityResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryTotalPoolLiquidityResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryTotalPoolLiquidityResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Liquidity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Liquidity = append(m.Liquidity, types1.Coin{}) + if err := m.Liquidity[len(m.Liquidity)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryTotalSharesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryTotalSharesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryTotalSharesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryTotalSharesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryTotalSharesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryTotalSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalShares", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TotalShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCalcJoinPoolNoSwapSharesRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCalcJoinPoolNoSwapSharesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCalcJoinPoolNoSwapSharesRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokensIn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokensIn = append(m.TokensIn, types1.Coin{}) + if err := m.TokensIn[len(m.TokensIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCalcJoinPoolNoSwapSharesResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCalcJoinPoolNoSwapSharesResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCalcJoinPoolNoSwapSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokensOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokensOut = append(m.TokensOut, types1.Coin{}) + if err := m.TokensOut[len(m.TokensOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SharesOut", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SharesOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySpotPriceRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySpotPriceRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySpotPriceRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BaseAssetDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.BaseAssetDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QuoteAssetDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.QuoteAssetDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolsWithFilterRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolsWithFilterRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolsWithFilterRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinLiquidity", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MinLiquidity = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageRequest{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoolsWithFilterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoolsWithFilterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoolsWithFilterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pools", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pools = append(m.Pools, &types.Any{}) + if err := m.Pools[len(m.Pools)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pagination == nil { + m.Pagination = &query.PageResponse{} + } + if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySpotPriceResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySpotPriceResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySpotPriceResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpotPrice", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SpotPrice = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySwapExactAmountInRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySwapExactAmountInRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySwapExactAmountInRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenIn = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Routes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Routes = append(m.Routes, SwapAmountInRoute{}) + if err := m.Routes[len(m.Routes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySwapExactAmountInResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySwapExactAmountInResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySwapExactAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySwapExactAmountOutRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySwapExactAmountOutRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySwapExactAmountOutRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Routes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Routes = append(m.Routes, SwapAmountOutRoute{}) + if err := m.Routes[len(m.Routes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenOut = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySwapExactAmountOutResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySwapExactAmountOutResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySwapExactAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + 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 ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryTotalLiquidityRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryTotalLiquidityRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryTotalLiquidityRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryTotalLiquidityResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryTotalLiquidityResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryTotalLiquidityResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Liquidity", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Liquidity = append(m.Liquidity, types1.Coin{}) + if err := m.Liquidity[len(m.Liquidity)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/tests/interchaintest/osmosistypes/gamm/types/query.pb.gw.go b/tests/interchaintest/osmosistypes/gamm/types/query.pb.gw.go new file mode 100644 index 0000000..c1b4f7c --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/types/query.pb.gw.go @@ -0,0 +1,1484 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: osmosis/gamm/v1beta1/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +var ( + filter_Query_Pools_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_Pools_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Pools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Pools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Pools_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Pools_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Pools(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_NumPools_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNumPoolsRequest + var metadata runtime.ServerMetadata + + msg, err := client.NumPools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_NumPools_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryNumPoolsRequest + var metadata runtime.ServerMetadata + + msg, err := server.NumPools(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_TotalLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalLiquidityRequest + var metadata runtime.ServerMetadata + + msg, err := client.TotalLiquidity(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_TotalLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalLiquidityRequest + var metadata runtime.ServerMetadata + + msg, err := server.TotalLiquidity(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_PoolsWithFilter_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_PoolsWithFilter_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolsWithFilterRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PoolsWithFilter_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.PoolsWithFilter(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PoolsWithFilter_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolsWithFilterRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_PoolsWithFilter_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.PoolsWithFilter(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := client.Pool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := server.Pool(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_PoolType_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolTypeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := client.PoolType(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PoolType_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolTypeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := server.PoolType(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_CalcJoinPoolShares_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_CalcJoinPoolShares_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCalcJoinPoolSharesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CalcJoinPoolShares_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CalcJoinPoolShares(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CalcJoinPoolShares_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCalcJoinPoolSharesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CalcJoinPoolShares_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CalcJoinPoolShares(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_CalcExitPoolCoinsFromShares_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_CalcExitPoolCoinsFromShares_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCalcExitPoolCoinsFromSharesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CalcExitPoolCoinsFromShares_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CalcExitPoolCoinsFromShares(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CalcExitPoolCoinsFromShares_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCalcExitPoolCoinsFromSharesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_CalcExitPoolCoinsFromShares_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CalcExitPoolCoinsFromShares(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_PoolParams_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolParamsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := client.PoolParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PoolParams_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoolParamsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := server.PoolParams(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_TotalPoolLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalPoolLiquidityRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := client.TotalPoolLiquidity(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_TotalPoolLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalPoolLiquidityRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := server.TotalPoolLiquidity(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_TotalShares_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalSharesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := client.TotalShares(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_TotalShares_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryTotalSharesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + msg, err := server.TotalShares(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_SpotPrice_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_SpotPrice_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySpotPriceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_SpotPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SpotPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_SpotPrice_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySpotPriceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_SpotPrice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SpotPrice(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_EstimateSwapExactAmountIn_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_EstimateSwapExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySwapExactAmountInRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountIn_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EstimateSwapExactAmountIn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_EstimateSwapExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySwapExactAmountInRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountIn_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EstimateSwapExactAmountIn(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_EstimateSwapExactAmountOut_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Query_EstimateSwapExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySwapExactAmountOutRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountOut_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EstimateSwapExactAmountOut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_EstimateSwapExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySwapExactAmountOutRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pool_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") + } + + protoReq.PoolId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountOut_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EstimateSwapExactAmountOut(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Pools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Pools_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Pools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_NumPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_NumPools_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_NumPools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_TotalLiquidity_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PoolsWithFilter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PoolsWithFilter_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoolsWithFilter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Pool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Pool_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Pool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PoolType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PoolType_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoolType_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CalcJoinPoolShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CalcJoinPoolShares_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CalcJoinPoolShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CalcExitPoolCoinsFromShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CalcExitPoolCoinsFromShares_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CalcExitPoolCoinsFromShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PoolParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PoolParams_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoolParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalPoolLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_TotalPoolLiquidity_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalPoolLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_TotalShares_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SpotPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SpotPrice_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SpotPrice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_EstimateSwapExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_EstimateSwapExactAmountIn_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_EstimateSwapExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_EstimateSwapExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_EstimateSwapExactAmountOut_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_EstimateSwapExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_Pools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Pools_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Pools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_NumPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_NumPools_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_NumPools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_TotalLiquidity_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PoolsWithFilter_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_PoolsWithFilter_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoolsWithFilter_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Pool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Pool_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Pool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PoolType_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_PoolType_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoolType_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CalcJoinPoolShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_CalcJoinPoolShares_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CalcJoinPoolShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CalcExitPoolCoinsFromShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_CalcExitPoolCoinsFromShares_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CalcExitPoolCoinsFromShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_PoolParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_PoolParams_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoolParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalPoolLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_TotalPoolLiquidity_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalPoolLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_TotalShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_TotalShares_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TotalShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SpotPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_SpotPrice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SpotPrice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_EstimateSwapExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_EstimateSwapExactAmountIn_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_EstimateSwapExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_EstimateSwapExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_EstimateSwapExactAmountOut_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_EstimateSwapExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_Pools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"osmosis", "gamm", "v1beta1", "pools"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_NumPools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"osmosis", "gamm", "v1beta1", "num_pools"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_TotalLiquidity_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"osmosis", "gamm", "v1beta1", "total_liquidity"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_PoolsWithFilter_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"osmosis", "gamm", "v1beta1", "filtered_pools"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_Pool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_PoolType_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"osmosis", "gamm", "v1beta1", "pool_type", "pool_id"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_CalcJoinPoolShares_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id", "join_swap_exact_in"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_CalcExitPoolCoinsFromShares_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id", "exit_swap_share_amount_in"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_PoolParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id", "params"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_TotalPoolLiquidity_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id", "total_pool_liquidity"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_TotalShares_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id", "total_shares"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_SpotPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pools", "pool_id", "prices"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_EstimateSwapExactAmountIn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pool_id", "estimate", "swap_exact_amount_in"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_EstimateSwapExactAmountOut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4, 2, 5}, []string{"osmosis", "gamm", "v1beta1", "pool_id", "estimate", "swap_exact_amount_out"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Query_Pools_0 = runtime.ForwardResponseMessage + + forward_Query_NumPools_0 = runtime.ForwardResponseMessage + + forward_Query_TotalLiquidity_0 = runtime.ForwardResponseMessage + + forward_Query_PoolsWithFilter_0 = runtime.ForwardResponseMessage + + forward_Query_Pool_0 = runtime.ForwardResponseMessage + + forward_Query_PoolType_0 = runtime.ForwardResponseMessage + + forward_Query_CalcJoinPoolShares_0 = runtime.ForwardResponseMessage + + forward_Query_CalcExitPoolCoinsFromShares_0 = runtime.ForwardResponseMessage + + forward_Query_PoolParams_0 = runtime.ForwardResponseMessage + + forward_Query_TotalPoolLiquidity_0 = runtime.ForwardResponseMessage + + forward_Query_TotalShares_0 = runtime.ForwardResponseMessage + + forward_Query_SpotPrice_0 = runtime.ForwardResponseMessage + + forward_Query_EstimateSwapExactAmountIn_0 = runtime.ForwardResponseMessage + + forward_Query_EstimateSwapExactAmountOut_0 = runtime.ForwardResponseMessage +) diff --git a/tests/interchaintest/osmosistypes/gamm/types/tx.pb.go b/tests/interchaintest/osmosistypes/gamm/types/tx.pb.go new file mode 100644 index 0000000..8fc4ac6 --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/types/tx.pb.go @@ -0,0 +1,4972 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/gamm/v1beta1/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// ===================== MsgJoinPool +// This is really MsgJoinPoolNoSwap +type MsgJoinPool struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + ShareOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=share_out_amount,json=shareOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_out_amount" yaml:"pool_amount_out"` + TokenInMaxs []types.Coin `protobuf:"bytes,4,rep,name=token_in_maxs,json=tokenInMaxs,proto3" json:"token_in_maxs" yaml:"token_in_max_amounts"` +} + +func (m *MsgJoinPool) Reset() { *m = MsgJoinPool{} } +func (m *MsgJoinPool) String() string { return proto.CompactTextString(m) } +func (*MsgJoinPool) ProtoMessage() {} +func (*MsgJoinPool) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{0} +} +func (m *MsgJoinPool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgJoinPool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgJoinPool.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgJoinPool) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgJoinPool.Merge(m, src) +} +func (m *MsgJoinPool) XXX_Size() int { + return m.Size() +} +func (m *MsgJoinPool) XXX_DiscardUnknown() { + xxx_messageInfo_MsgJoinPool.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgJoinPool proto.InternalMessageInfo + +func (m *MsgJoinPool) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgJoinPool) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgJoinPool) GetTokenInMaxs() []types.Coin { + if m != nil { + return m.TokenInMaxs + } + return nil +} + +type MsgJoinPoolResponse struct { + ShareOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=share_out_amount,json=shareOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_out_amount" yaml:"share_out_amount"` + TokenIn []types.Coin `protobuf:"bytes,2,rep,name=token_in,json=tokenIn,proto3" json:"token_in" yaml:"token_in"` +} + +func (m *MsgJoinPoolResponse) Reset() { *m = MsgJoinPoolResponse{} } +func (m *MsgJoinPoolResponse) String() string { return proto.CompactTextString(m) } +func (*MsgJoinPoolResponse) ProtoMessage() {} +func (*MsgJoinPoolResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{1} +} +func (m *MsgJoinPoolResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgJoinPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgJoinPoolResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgJoinPoolResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgJoinPoolResponse.Merge(m, src) +} +func (m *MsgJoinPoolResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgJoinPoolResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgJoinPoolResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgJoinPoolResponse proto.InternalMessageInfo + +func (m *MsgJoinPoolResponse) GetTokenIn() []types.Coin { + if m != nil { + return m.TokenIn + } + return nil +} + +// ===================== MsgExitPool +type MsgExitPool struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + ShareInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=share_in_amount,json=shareInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_in_amount" yaml:"share_in_amount"` + TokenOutMins []types.Coin `protobuf:"bytes,4,rep,name=token_out_mins,json=tokenOutMins,proto3" json:"token_out_mins" yaml:"token_out_min_amounts"` +} + +func (m *MsgExitPool) Reset() { *m = MsgExitPool{} } +func (m *MsgExitPool) String() string { return proto.CompactTextString(m) } +func (*MsgExitPool) ProtoMessage() {} +func (*MsgExitPool) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{2} +} +func (m *MsgExitPool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExitPool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExitPool.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgExitPool) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExitPool.Merge(m, src) +} +func (m *MsgExitPool) XXX_Size() int { + return m.Size() +} +func (m *MsgExitPool) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExitPool.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExitPool proto.InternalMessageInfo + +func (m *MsgExitPool) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgExitPool) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgExitPool) GetTokenOutMins() []types.Coin { + if m != nil { + return m.TokenOutMins + } + return nil +} + +type MsgExitPoolResponse struct { + TokenOut []types.Coin `protobuf:"bytes,1,rep,name=token_out,json=tokenOut,proto3" json:"token_out" yaml:"token_out"` +} + +func (m *MsgExitPoolResponse) Reset() { *m = MsgExitPoolResponse{} } +func (m *MsgExitPoolResponse) String() string { return proto.CompactTextString(m) } +func (*MsgExitPoolResponse) ProtoMessage() {} +func (*MsgExitPoolResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{3} +} +func (m *MsgExitPoolResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExitPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExitPoolResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgExitPoolResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExitPoolResponse.Merge(m, src) +} +func (m *MsgExitPoolResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgExitPoolResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExitPoolResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExitPoolResponse proto.InternalMessageInfo + +func (m *MsgExitPoolResponse) GetTokenOut() []types.Coin { + if m != nil { + return m.TokenOut + } + return nil +} + +// ===================== MsgSwapExactAmountIn +type SwapAmountInRoute struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenOutDenom string `protobuf:"bytes,2,opt,name=token_out_denom,json=tokenOutDenom,proto3" json:"token_out_denom,omitempty" yaml:"token_out_denom"` +} + +func (m *SwapAmountInRoute) Reset() { *m = SwapAmountInRoute{} } +func (m *SwapAmountInRoute) String() string { return proto.CompactTextString(m) } +func (*SwapAmountInRoute) ProtoMessage() {} +func (*SwapAmountInRoute) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{4} +} +func (m *SwapAmountInRoute) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SwapAmountInRoute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SwapAmountInRoute.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SwapAmountInRoute) XXX_Merge(src proto.Message) { + xxx_messageInfo_SwapAmountInRoute.Merge(m, src) +} +func (m *SwapAmountInRoute) XXX_Size() int { + return m.Size() +} +func (m *SwapAmountInRoute) XXX_DiscardUnknown() { + xxx_messageInfo_SwapAmountInRoute.DiscardUnknown(m) +} + +var xxx_messageInfo_SwapAmountInRoute proto.InternalMessageInfo + +func (m *SwapAmountInRoute) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *SwapAmountInRoute) GetTokenOutDenom() string { + if m != nil { + return m.TokenOutDenom + } + return "" +} + +type MsgSwapExactAmountIn struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + Routes []SwapAmountInRoute `protobuf:"bytes,2,rep,name=routes,proto3" json:"routes"` + TokenIn types.Coin `protobuf:"bytes,3,opt,name=token_in,json=tokenIn,proto3" json:"token_in" yaml:"token_in"` + TokenOutMinAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=token_out_min_amount,json=tokenOutMinAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_out_min_amount" yaml:"token_out_min_amount"` +} + +func (m *MsgSwapExactAmountIn) Reset() { *m = MsgSwapExactAmountIn{} } +func (m *MsgSwapExactAmountIn) String() string { return proto.CompactTextString(m) } +func (*MsgSwapExactAmountIn) ProtoMessage() {} +func (*MsgSwapExactAmountIn) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{5} +} +func (m *MsgSwapExactAmountIn) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSwapExactAmountIn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSwapExactAmountIn.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSwapExactAmountIn) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSwapExactAmountIn.Merge(m, src) +} +func (m *MsgSwapExactAmountIn) XXX_Size() int { + return m.Size() +} +func (m *MsgSwapExactAmountIn) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSwapExactAmountIn.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSwapExactAmountIn proto.InternalMessageInfo + +func (m *MsgSwapExactAmountIn) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgSwapExactAmountIn) GetRoutes() []SwapAmountInRoute { + if m != nil { + return m.Routes + } + return nil +} + +func (m *MsgSwapExactAmountIn) GetTokenIn() types.Coin { + if m != nil { + return m.TokenIn + } + return types.Coin{} +} + +type MsgSwapExactAmountInResponse struct { + TokenOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=token_out_amount,json=tokenOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_out_amount" yaml:"token_out_amount"` +} + +func (m *MsgSwapExactAmountInResponse) Reset() { *m = MsgSwapExactAmountInResponse{} } +func (m *MsgSwapExactAmountInResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSwapExactAmountInResponse) ProtoMessage() {} +func (*MsgSwapExactAmountInResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{6} +} +func (m *MsgSwapExactAmountInResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSwapExactAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSwapExactAmountInResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSwapExactAmountInResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSwapExactAmountInResponse.Merge(m, src) +} +func (m *MsgSwapExactAmountInResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSwapExactAmountInResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSwapExactAmountInResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSwapExactAmountInResponse proto.InternalMessageInfo + +// ===================== MsgSwapExactAmountOut +type SwapAmountOutRoute struct { + PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenInDenom string `protobuf:"bytes,2,opt,name=token_in_denom,json=tokenInDenom,proto3" json:"token_in_denom,omitempty" yaml:"token_out_denom"` +} + +func (m *SwapAmountOutRoute) Reset() { *m = SwapAmountOutRoute{} } +func (m *SwapAmountOutRoute) String() string { return proto.CompactTextString(m) } +func (*SwapAmountOutRoute) ProtoMessage() {} +func (*SwapAmountOutRoute) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{7} +} +func (m *SwapAmountOutRoute) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SwapAmountOutRoute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SwapAmountOutRoute.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SwapAmountOutRoute) XXX_Merge(src proto.Message) { + xxx_messageInfo_SwapAmountOutRoute.Merge(m, src) +} +func (m *SwapAmountOutRoute) XXX_Size() int { + return m.Size() +} +func (m *SwapAmountOutRoute) XXX_DiscardUnknown() { + xxx_messageInfo_SwapAmountOutRoute.DiscardUnknown(m) +} + +var xxx_messageInfo_SwapAmountOutRoute proto.InternalMessageInfo + +func (m *SwapAmountOutRoute) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *SwapAmountOutRoute) GetTokenInDenom() string { + if m != nil { + return m.TokenInDenom + } + return "" +} + +type MsgSwapExactAmountOut struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + Routes []SwapAmountOutRoute `protobuf:"bytes,2,rep,name=routes,proto3" json:"routes"` + TokenInMaxAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=token_in_max_amount,json=tokenInMaxAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_in_max_amount" yaml:"token_in_max_amount"` + TokenOut types.Coin `protobuf:"bytes,4,opt,name=token_out,json=tokenOut,proto3" json:"token_out" yaml:"token_out"` +} + +func (m *MsgSwapExactAmountOut) Reset() { *m = MsgSwapExactAmountOut{} } +func (m *MsgSwapExactAmountOut) String() string { return proto.CompactTextString(m) } +func (*MsgSwapExactAmountOut) ProtoMessage() {} +func (*MsgSwapExactAmountOut) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{8} +} +func (m *MsgSwapExactAmountOut) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSwapExactAmountOut) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSwapExactAmountOut.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSwapExactAmountOut) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSwapExactAmountOut.Merge(m, src) +} +func (m *MsgSwapExactAmountOut) XXX_Size() int { + return m.Size() +} +func (m *MsgSwapExactAmountOut) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSwapExactAmountOut.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSwapExactAmountOut proto.InternalMessageInfo + +func (m *MsgSwapExactAmountOut) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgSwapExactAmountOut) GetRoutes() []SwapAmountOutRoute { + if m != nil { + return m.Routes + } + return nil +} + +func (m *MsgSwapExactAmountOut) GetTokenOut() types.Coin { + if m != nil { + return m.TokenOut + } + return types.Coin{} +} + +type MsgSwapExactAmountOutResponse struct { + TokenInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=token_in_amount,json=tokenInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_in_amount" yaml:"token_in_amount"` +} + +func (m *MsgSwapExactAmountOutResponse) Reset() { *m = MsgSwapExactAmountOutResponse{} } +func (m *MsgSwapExactAmountOutResponse) String() string { return proto.CompactTextString(m) } +func (*MsgSwapExactAmountOutResponse) ProtoMessage() {} +func (*MsgSwapExactAmountOutResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{9} +} +func (m *MsgSwapExactAmountOutResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgSwapExactAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgSwapExactAmountOutResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgSwapExactAmountOutResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgSwapExactAmountOutResponse.Merge(m, src) +} +func (m *MsgSwapExactAmountOutResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgSwapExactAmountOutResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgSwapExactAmountOutResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgSwapExactAmountOutResponse proto.InternalMessageInfo + +// ===================== MsgJoinSwapExternAmountIn +// TODO: Rename to MsgJoinSwapExactAmountIn +type MsgJoinSwapExternAmountIn struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenIn types.Coin `protobuf:"bytes,3,opt,name=token_in,json=tokenIn,proto3" json:"token_in" yaml:"token_in"` + ShareOutMinAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=share_out_min_amount,json=shareOutMinAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_out_min_amount" yaml:"share_out_min_amount"` +} + +func (m *MsgJoinSwapExternAmountIn) Reset() { *m = MsgJoinSwapExternAmountIn{} } +func (m *MsgJoinSwapExternAmountIn) String() string { return proto.CompactTextString(m) } +func (*MsgJoinSwapExternAmountIn) ProtoMessage() {} +func (*MsgJoinSwapExternAmountIn) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{10} +} +func (m *MsgJoinSwapExternAmountIn) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgJoinSwapExternAmountIn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgJoinSwapExternAmountIn.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgJoinSwapExternAmountIn) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgJoinSwapExternAmountIn.Merge(m, src) +} +func (m *MsgJoinSwapExternAmountIn) XXX_Size() int { + return m.Size() +} +func (m *MsgJoinSwapExternAmountIn) XXX_DiscardUnknown() { + xxx_messageInfo_MsgJoinSwapExternAmountIn.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgJoinSwapExternAmountIn proto.InternalMessageInfo + +func (m *MsgJoinSwapExternAmountIn) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgJoinSwapExternAmountIn) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgJoinSwapExternAmountIn) GetTokenIn() types.Coin { + if m != nil { + return m.TokenIn + } + return types.Coin{} +} + +type MsgJoinSwapExternAmountInResponse struct { + ShareOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=share_out_amount,json=shareOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_out_amount" yaml:"share_out_amount"` +} + +func (m *MsgJoinSwapExternAmountInResponse) Reset() { *m = MsgJoinSwapExternAmountInResponse{} } +func (m *MsgJoinSwapExternAmountInResponse) String() string { return proto.CompactTextString(m) } +func (*MsgJoinSwapExternAmountInResponse) ProtoMessage() {} +func (*MsgJoinSwapExternAmountInResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{11} +} +func (m *MsgJoinSwapExternAmountInResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgJoinSwapExternAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgJoinSwapExternAmountInResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgJoinSwapExternAmountInResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgJoinSwapExternAmountInResponse.Merge(m, src) +} +func (m *MsgJoinSwapExternAmountInResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgJoinSwapExternAmountInResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgJoinSwapExternAmountInResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgJoinSwapExternAmountInResponse proto.InternalMessageInfo + +// ===================== MsgJoinSwapShareAmountOut +type MsgJoinSwapShareAmountOut struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenInDenom string `protobuf:"bytes,3,opt,name=token_in_denom,json=tokenInDenom,proto3" json:"token_in_denom,omitempty" yaml:"token_in_denom"` + ShareOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=share_out_amount,json=shareOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_out_amount" yaml:"share_out_amount"` + TokenInMaxAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=token_in_max_amount,json=tokenInMaxAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_in_max_amount" yaml:"token_in_max_amount"` +} + +func (m *MsgJoinSwapShareAmountOut) Reset() { *m = MsgJoinSwapShareAmountOut{} } +func (m *MsgJoinSwapShareAmountOut) String() string { return proto.CompactTextString(m) } +func (*MsgJoinSwapShareAmountOut) ProtoMessage() {} +func (*MsgJoinSwapShareAmountOut) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{12} +} +func (m *MsgJoinSwapShareAmountOut) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgJoinSwapShareAmountOut) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgJoinSwapShareAmountOut.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgJoinSwapShareAmountOut) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgJoinSwapShareAmountOut.Merge(m, src) +} +func (m *MsgJoinSwapShareAmountOut) XXX_Size() int { + return m.Size() +} +func (m *MsgJoinSwapShareAmountOut) XXX_DiscardUnknown() { + xxx_messageInfo_MsgJoinSwapShareAmountOut.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgJoinSwapShareAmountOut proto.InternalMessageInfo + +func (m *MsgJoinSwapShareAmountOut) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgJoinSwapShareAmountOut) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgJoinSwapShareAmountOut) GetTokenInDenom() string { + if m != nil { + return m.TokenInDenom + } + return "" +} + +type MsgJoinSwapShareAmountOutResponse struct { + TokenInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=token_in_amount,json=tokenInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_in_amount" yaml:"token_in_amount"` +} + +func (m *MsgJoinSwapShareAmountOutResponse) Reset() { *m = MsgJoinSwapShareAmountOutResponse{} } +func (m *MsgJoinSwapShareAmountOutResponse) String() string { return proto.CompactTextString(m) } +func (*MsgJoinSwapShareAmountOutResponse) ProtoMessage() {} +func (*MsgJoinSwapShareAmountOutResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{13} +} +func (m *MsgJoinSwapShareAmountOutResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgJoinSwapShareAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgJoinSwapShareAmountOutResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgJoinSwapShareAmountOutResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgJoinSwapShareAmountOutResponse.Merge(m, src) +} +func (m *MsgJoinSwapShareAmountOutResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgJoinSwapShareAmountOutResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgJoinSwapShareAmountOutResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgJoinSwapShareAmountOutResponse proto.InternalMessageInfo + +// ===================== MsgExitSwapShareAmountIn +type MsgExitSwapShareAmountIn struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenOutDenom string `protobuf:"bytes,3,opt,name=token_out_denom,json=tokenOutDenom,proto3" json:"token_out_denom,omitempty" yaml:"token_out_denom"` + ShareInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=share_in_amount,json=shareInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_in_amount" yaml:"share_in_amount"` + TokenOutMinAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=token_out_min_amount,json=tokenOutMinAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_out_min_amount" yaml:"token_out_min_amount"` +} + +func (m *MsgExitSwapShareAmountIn) Reset() { *m = MsgExitSwapShareAmountIn{} } +func (m *MsgExitSwapShareAmountIn) String() string { return proto.CompactTextString(m) } +func (*MsgExitSwapShareAmountIn) ProtoMessage() {} +func (*MsgExitSwapShareAmountIn) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{14} +} +func (m *MsgExitSwapShareAmountIn) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExitSwapShareAmountIn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExitSwapShareAmountIn.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgExitSwapShareAmountIn) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExitSwapShareAmountIn.Merge(m, src) +} +func (m *MsgExitSwapShareAmountIn) XXX_Size() int { + return m.Size() +} +func (m *MsgExitSwapShareAmountIn) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExitSwapShareAmountIn.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExitSwapShareAmountIn proto.InternalMessageInfo + +func (m *MsgExitSwapShareAmountIn) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgExitSwapShareAmountIn) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgExitSwapShareAmountIn) GetTokenOutDenom() string { + if m != nil { + return m.TokenOutDenom + } + return "" +} + +type MsgExitSwapShareAmountInResponse struct { + TokenOutAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=token_out_amount,json=tokenOutAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"token_out_amount" yaml:"token_out_amount"` +} + +func (m *MsgExitSwapShareAmountInResponse) Reset() { *m = MsgExitSwapShareAmountInResponse{} } +func (m *MsgExitSwapShareAmountInResponse) String() string { return proto.CompactTextString(m) } +func (*MsgExitSwapShareAmountInResponse) ProtoMessage() {} +func (*MsgExitSwapShareAmountInResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{15} +} +func (m *MsgExitSwapShareAmountInResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExitSwapShareAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExitSwapShareAmountInResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgExitSwapShareAmountInResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExitSwapShareAmountInResponse.Merge(m, src) +} +func (m *MsgExitSwapShareAmountInResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgExitSwapShareAmountInResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExitSwapShareAmountInResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExitSwapShareAmountInResponse proto.InternalMessageInfo + +// ===================== MsgExitSwapExternAmountOut +type MsgExitSwapExternAmountOut struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` + TokenOut types.Coin `protobuf:"bytes,3,opt,name=token_out,json=tokenOut,proto3" json:"token_out" yaml:"token_out"` + ShareInMaxAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=share_in_max_amount,json=shareInMaxAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_in_max_amount" yaml:"share_in_max_amount"` +} + +func (m *MsgExitSwapExternAmountOut) Reset() { *m = MsgExitSwapExternAmountOut{} } +func (m *MsgExitSwapExternAmountOut) String() string { return proto.CompactTextString(m) } +func (*MsgExitSwapExternAmountOut) ProtoMessage() {} +func (*MsgExitSwapExternAmountOut) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{16} +} +func (m *MsgExitSwapExternAmountOut) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExitSwapExternAmountOut) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExitSwapExternAmountOut.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgExitSwapExternAmountOut) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExitSwapExternAmountOut.Merge(m, src) +} +func (m *MsgExitSwapExternAmountOut) XXX_Size() int { + return m.Size() +} +func (m *MsgExitSwapExternAmountOut) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExitSwapExternAmountOut.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExitSwapExternAmountOut proto.InternalMessageInfo + +func (m *MsgExitSwapExternAmountOut) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgExitSwapExternAmountOut) GetPoolId() uint64 { + if m != nil { + return m.PoolId + } + return 0 +} + +func (m *MsgExitSwapExternAmountOut) GetTokenOut() types.Coin { + if m != nil { + return m.TokenOut + } + return types.Coin{} +} + +type MsgExitSwapExternAmountOutResponse struct { + ShareInAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=share_in_amount,json=shareInAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"share_in_amount" yaml:"share_in_amount"` +} + +func (m *MsgExitSwapExternAmountOutResponse) Reset() { *m = MsgExitSwapExternAmountOutResponse{} } +func (m *MsgExitSwapExternAmountOutResponse) String() string { return proto.CompactTextString(m) } +func (*MsgExitSwapExternAmountOutResponse) ProtoMessage() {} +func (*MsgExitSwapExternAmountOutResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cfc8fd3ac7df3247, []int{17} +} +func (m *MsgExitSwapExternAmountOutResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgExitSwapExternAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgExitSwapExternAmountOutResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgExitSwapExternAmountOutResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgExitSwapExternAmountOutResponse.Merge(m, src) +} +func (m *MsgExitSwapExternAmountOutResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgExitSwapExternAmountOutResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgExitSwapExternAmountOutResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgExitSwapExternAmountOutResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgJoinPool)(nil), "osmosis.gamm.v1beta1.MsgJoinPool") + proto.RegisterType((*MsgJoinPoolResponse)(nil), "osmosis.gamm.v1beta1.MsgJoinPoolResponse") + proto.RegisterType((*MsgExitPool)(nil), "osmosis.gamm.v1beta1.MsgExitPool") + proto.RegisterType((*MsgExitPoolResponse)(nil), "osmosis.gamm.v1beta1.MsgExitPoolResponse") + proto.RegisterType((*SwapAmountInRoute)(nil), "osmosis.gamm.v1beta1.SwapAmountInRoute") + proto.RegisterType((*MsgSwapExactAmountIn)(nil), "osmosis.gamm.v1beta1.MsgSwapExactAmountIn") + proto.RegisterType((*MsgSwapExactAmountInResponse)(nil), "osmosis.gamm.v1beta1.MsgSwapExactAmountInResponse") + proto.RegisterType((*SwapAmountOutRoute)(nil), "osmosis.gamm.v1beta1.SwapAmountOutRoute") + proto.RegisterType((*MsgSwapExactAmountOut)(nil), "osmosis.gamm.v1beta1.MsgSwapExactAmountOut") + proto.RegisterType((*MsgSwapExactAmountOutResponse)(nil), "osmosis.gamm.v1beta1.MsgSwapExactAmountOutResponse") + proto.RegisterType((*MsgJoinSwapExternAmountIn)(nil), "osmosis.gamm.v1beta1.MsgJoinSwapExternAmountIn") + proto.RegisterType((*MsgJoinSwapExternAmountInResponse)(nil), "osmosis.gamm.v1beta1.MsgJoinSwapExternAmountInResponse") + proto.RegisterType((*MsgJoinSwapShareAmountOut)(nil), "osmosis.gamm.v1beta1.MsgJoinSwapShareAmountOut") + proto.RegisterType((*MsgJoinSwapShareAmountOutResponse)(nil), "osmosis.gamm.v1beta1.MsgJoinSwapShareAmountOutResponse") + proto.RegisterType((*MsgExitSwapShareAmountIn)(nil), "osmosis.gamm.v1beta1.MsgExitSwapShareAmountIn") + proto.RegisterType((*MsgExitSwapShareAmountInResponse)(nil), "osmosis.gamm.v1beta1.MsgExitSwapShareAmountInResponse") + proto.RegisterType((*MsgExitSwapExternAmountOut)(nil), "osmosis.gamm.v1beta1.MsgExitSwapExternAmountOut") + proto.RegisterType((*MsgExitSwapExternAmountOutResponse)(nil), "osmosis.gamm.v1beta1.MsgExitSwapExternAmountOutResponse") +} + +func init() { proto.RegisterFile("osmosis/gamm/v1beta1/tx.proto", fileDescriptor_cfc8fd3ac7df3247) } + +var fileDescriptor_cfc8fd3ac7df3247 = []byte{ + // 1121 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0x4d, 0x6f, 0x1b, 0x45, + 0x18, 0xce, 0xd8, 0x6e, 0x9a, 0x4c, 0x9a, 0xaf, 0x6d, 0xd2, 0x38, 0xdb, 0xd6, 0x4e, 0x07, 0x04, + 0x29, 0x55, 0x77, 0x9b, 0x14, 0x01, 0xe2, 0x02, 0x18, 0x82, 0x70, 0x85, 0xe5, 0x6a, 0x7b, 0xa9, + 0xb8, 0x58, 0xeb, 0x78, 0xe5, 0xae, 0x9a, 0x9d, 0xb1, 0x3c, 0xb3, 0xc1, 0x15, 0x12, 0x48, 0x7c, + 0xdc, 0x41, 0x88, 0x8f, 0x5f, 0x80, 0xf8, 0x0b, 0x1c, 0xe0, 0x00, 0x97, 0x1e, 0x7b, 0x83, 0x72, + 0xb0, 0x50, 0xf2, 0x0f, 0xfc, 0x0b, 0xd0, 0xee, 0xcc, 0x7e, 0x7a, 0x37, 0xf6, 0x26, 0x76, 0x73, + 0x4a, 0xbc, 0xf3, 0x7e, 0xbf, 0xcf, 0x3c, 0xef, 0xbb, 0x0b, 0xaf, 0x13, 0x6a, 0x11, 0x6a, 0x52, + 0xb5, 0xad, 0x5b, 0x96, 0x7a, 0xb8, 0xd3, 0x34, 0x98, 0xbe, 0xa3, 0xb2, 0x9e, 0xd2, 0xe9, 0x12, + 0x46, 0xa4, 0x35, 0x71, 0xac, 0x38, 0xc7, 0x8a, 0x38, 0x96, 0xd7, 0xda, 0xa4, 0x4d, 0x5c, 0x01, + 0xd5, 0xf9, 0x8f, 0xcb, 0xca, 0xa5, 0x7d, 0x57, 0x58, 0x6d, 0xea, 0xd4, 0xf0, 0x2d, 0xed, 0x13, + 0x13, 0xf3, 0x73, 0xf4, 0x7b, 0x0e, 0x2e, 0xd4, 0x68, 0xfb, 0x1e, 0x31, 0xf1, 0x7d, 0x42, 0x0e, + 0xa4, 0x9b, 0x70, 0x96, 0x1a, 0xb8, 0x65, 0x74, 0x8b, 0x60, 0x0b, 0x6c, 0xcf, 0x57, 0x56, 0x07, + 0xfd, 0xf2, 0xe2, 0x13, 0xdd, 0x3a, 0x78, 0x1b, 0xf1, 0xe7, 0x48, 0x13, 0x02, 0xd2, 0x2d, 0x78, + 0xb1, 0x43, 0xc8, 0x41, 0xc3, 0x6c, 0x15, 0x73, 0x5b, 0x60, 0xbb, 0x50, 0x91, 0x06, 0xfd, 0xf2, + 0x12, 0x97, 0x15, 0x07, 0x48, 0x9b, 0x75, 0xfe, 0xab, 0xb6, 0xa4, 0x2e, 0x5c, 0xa1, 0x8f, 0xf4, + 0xae, 0xd1, 0x20, 0x36, 0x6b, 0xe8, 0x16, 0xb1, 0x31, 0x2b, 0xe6, 0x5d, 0x0f, 0x1f, 0x3d, 0xed, + 0x97, 0x67, 0xfe, 0xed, 0x97, 0x5f, 0x69, 0x9b, 0xec, 0x91, 0xdd, 0x54, 0xf6, 0x89, 0xa5, 0x8a, + 0xa0, 0xf9, 0x9f, 0xdb, 0xb4, 0xf5, 0x58, 0x65, 0x4f, 0x3a, 0x06, 0x55, 0xaa, 0x98, 0x0d, 0xfa, + 0xe5, 0x2b, 0x21, 0x1f, 0xdc, 0x94, 0x63, 0x15, 0x69, 0x4b, 0xae, 0x87, 0xba, 0xcd, 0xde, 0x73, + 0x1f, 0x4a, 0x4d, 0xb8, 0xc8, 0xc8, 0x63, 0x03, 0x37, 0x4c, 0xdc, 0xb0, 0xf4, 0x1e, 0x2d, 0x16, + 0xb6, 0xf2, 0xdb, 0x0b, 0xbb, 0x9b, 0x0a, 0xb7, 0xab, 0x38, 0x35, 0xf1, 0xca, 0xa7, 0xbc, 0x4f, + 0x4c, 0x5c, 0x79, 0xc9, 0x89, 0x65, 0xd0, 0x2f, 0x5f, 0xe5, 0x1e, 0xc2, 0xda, 0xc2, 0x13, 0x45, + 0xda, 0x82, 0xfb, 0xb8, 0x8a, 0x6b, 0x7a, 0x8f, 0xa2, 0xe7, 0x00, 0x5e, 0x0e, 0xd5, 0x4f, 0x33, + 0x68, 0x87, 0x60, 0x6a, 0x48, 0x34, 0x21, 0x5f, 0x5e, 0xd1, 0x6a, 0xe6, 0x7c, 0x37, 0x44, 0xfd, + 0x63, 0xf6, 0x86, 0x13, 0xae, 0xc1, 0x39, 0x2f, 0xe4, 0x62, 0x6e, 0x54, 0xae, 0x1b, 0x22, 0xd7, + 0xe5, 0x68, 0xae, 0x48, 0xbb, 0x28, 0xf2, 0x43, 0x7f, 0x70, 0x6c, 0xec, 0xf5, 0x4c, 0x36, 0x55, + 0x6c, 0x74, 0xe0, 0x32, 0xcf, 0xcd, 0xc4, 0x13, 0x82, 0x46, 0xcc, 0x1c, 0xd2, 0x16, 0xdd, 0x27, + 0x55, 0x2c, 0x0a, 0x65, 0xc0, 0x25, 0x9e, 0xaf, 0x53, 0x4d, 0xcb, 0xc4, 0x63, 0x40, 0xe3, 0x65, + 0x51, 0xae, 0x6b, 0xe1, 0x72, 0x09, 0xf5, 0x00, 0x1b, 0x97, 0xdc, 0xe7, 0x75, 0x9b, 0xd5, 0x4c, + 0x4c, 0x51, 0xdb, 0xc5, 0x86, 0x57, 0x3f, 0x1f, 0x1b, 0xf7, 0xe1, 0xbc, 0xaf, 0x5e, 0x04, 0xa3, + 0x1c, 0x17, 0x85, 0xe3, 0x95, 0x98, 0x63, 0xa4, 0xcd, 0x79, 0xce, 0xd0, 0xd7, 0x00, 0xae, 0x3e, + 0xf8, 0x54, 0xef, 0xf0, 0xf4, 0xaa, 0x58, 0x23, 0x36, 0x33, 0xc2, 0x4d, 0x00, 0x23, 0x9b, 0x50, + 0x81, 0xcb, 0x41, 0x4e, 0x2d, 0x03, 0x13, 0xcb, 0xed, 0xdc, 0x7c, 0x45, 0x0e, 0xca, 0x1a, 0x13, + 0x40, 0xda, 0xa2, 0x17, 0xc1, 0x07, 0xee, 0xef, 0xbf, 0x73, 0x70, 0xad, 0x46, 0xdb, 0x4e, 0x24, + 0x7b, 0x3d, 0x7d, 0x9f, 0x79, 0xe1, 0x64, 0x41, 0xce, 0x1e, 0x9c, 0xed, 0x3a, 0xd1, 0x53, 0x81, + 0xe0, 0x57, 0x95, 0x24, 0xb6, 0x53, 0x86, 0xb2, 0xad, 0x14, 0x9c, 0x3a, 0x69, 0x42, 0x39, 0x72, + 0x15, 0x1c, 0x30, 0x9d, 0xed, 0x2a, 0x48, 0x9f, 0xc3, 0xb5, 0xa4, 0x8e, 0x17, 0x0b, 0x6e, 0x3a, + 0xb5, 0xcc, 0x38, 0xbd, 0x9a, 0x8e, 0x22, 0xa4, 0xad, 0x86, 0x40, 0xc4, 0x73, 0x44, 0xdf, 0x03, + 0x78, 0x2d, 0xa9, 0xb2, 0x61, 0xbe, 0x09, 0x8c, 0x4d, 0x86, 0x6f, 0xe2, 0xf6, 0x90, 0xb6, 0xe4, + 0x05, 0x26, 0xa2, 0xfa, 0x0a, 0x40, 0x29, 0x68, 0x44, 0xdd, 0x66, 0xa7, 0xc0, 0xdd, 0xbb, 0xde, + 0x55, 0x34, 0xf1, 0xd8, 0xb0, 0xbb, 0x24, 0xda, 0xc2, 0x51, 0xf7, 0x3c, 0x07, 0xd7, 0x87, 0x6b, + 0x53, 0xb7, 0x59, 0x16, 0xd8, 0x7d, 0x18, 0x83, 0xdd, 0xf6, 0x28, 0xd8, 0x79, 0xd9, 0xc6, 0x70, + 0xf7, 0x19, 0xbc, 0x9c, 0x30, 0x35, 0x04, 0x9f, 0x7d, 0x9c, 0xb9, 0x15, 0x72, 0xea, 0x20, 0x42, + 0xda, 0x4a, 0x30, 0x87, 0x04, 0xad, 0x45, 0x88, 0xa5, 0x30, 0x0a, 0xf5, 0xe3, 0x10, 0xcb, 0x77, + 0x00, 0x5e, 0x4f, 0xac, 0xad, 0x0f, 0xbc, 0x8e, 0xc7, 0x1b, 0xc1, 0xa5, 0x00, 0x67, 0x23, 0xef, + 0x98, 0x39, 0x8f, 0x65, 0x3c, 0xf2, 0x46, 0x7f, 0xe6, 0xe0, 0xa6, 0x18, 0xb9, 0x3c, 0x2e, 0x66, + 0x74, 0xf1, 0x69, 0xa8, 0x26, 0xd3, 0x90, 0x9a, 0x3c, 0xa1, 0x04, 0xf3, 0x7c, 0x72, 0x84, 0x92, + 0x64, 0x13, 0x69, 0xab, 0xde, 0x9e, 0x10, 0x10, 0xca, 0xcf, 0x00, 0xde, 0x48, 0x2d, 0xe2, 0xb9, + 0x6e, 0x31, 0xe8, 0x97, 0x7c, 0xa4, 0xbf, 0x0f, 0x9c, 0xd3, 0x53, 0xdd, 0xe9, 0x4c, 0xfd, 0x7d, + 0x67, 0x88, 0x87, 0xf8, 0x9d, 0xdd, 0x1c, 0xf4, 0xcb, 0xeb, 0x31, 0x60, 0x26, 0xd1, 0x50, 0x62, + 0xad, 0x0a, 0xd3, 0xde, 0xf8, 0x52, 0xe8, 0xe6, 0xc2, 0x8b, 0xa0, 0x1b, 0xf4, 0x43, 0x14, 0x43, + 0xd1, 0x46, 0x9d, 0x23, 0x41, 0xfc, 0x9a, 0x87, 0x45, 0xb1, 0x77, 0xc5, 0xe2, 0x9a, 0x22, 0x3f, + 0x24, 0xec, 0x4f, 0xf9, 0x8c, 0xfb, 0x53, 0xd2, 0x22, 0x5c, 0x98, 0xee, 0x22, 0x9c, 0xb6, 0xd7, + 0x5c, 0x78, 0x41, 0x7b, 0xcd, 0x4f, 0x00, 0x6e, 0xa5, 0xb5, 0xea, 0x7c, 0x77, 0x9b, 0xbf, 0x72, + 0x50, 0x0e, 0x45, 0x16, 0x26, 0xc8, 0x69, 0xd2, 0x50, 0x64, 0x84, 0xe7, 0x27, 0x30, 0xc2, 0x1d, + 0x8a, 0xf0, 0x51, 0x10, 0xa2, 0x88, 0xc2, 0xd9, 0x28, 0x22, 0xc1, 0x24, 0xd2, 0x56, 0x04, 0xb8, + 0x02, 0x8a, 0xf8, 0x11, 0x40, 0x94, 0x5e, 0xc5, 0x30, 0x47, 0xc4, 0x81, 0x0f, 0xa6, 0x0a, 0xfc, + 0xdd, 0xdf, 0x2e, 0xc2, 0x7c, 0x8d, 0xb6, 0xa5, 0x87, 0x70, 0xce, 0xff, 0xf6, 0x71, 0x23, 0x79, + 0xe7, 0x0b, 0xbd, 0xde, 0xcb, 0x37, 0x47, 0x8a, 0xf8, 0x39, 0x3d, 0x84, 0x73, 0xfe, 0x9b, 0x73, + 0xba, 0x65, 0x4f, 0xe4, 0x04, 0xcb, 0x43, 0xef, 0x8f, 0x94, 0xbf, 0xec, 0x45, 0x5f, 0xb1, 0x5e, + 0x4b, 0xd5, 0x1f, 0x92, 0x95, 0x77, 0xc7, 0x97, 0xf5, 0x9d, 0x1e, 0xf2, 0x55, 0x3f, 0xb6, 0x61, + 0xdf, 0x1a, 0xd7, 0x52, 0xdd, 0x66, 0xf2, 0xdd, 0x0c, 0xc2, 0xbe, 0xdf, 0x2f, 0x01, 0xbc, 0x92, + 0xb2, 0xea, 0xa9, 0x27, 0x36, 0x63, 0x58, 0x41, 0x7e, 0x33, 0xa3, 0x42, 0x62, 0x10, 0xb1, 0x7d, + 0x64, 0x74, 0x10, 0x51, 0x85, 0x31, 0x82, 0x48, 0x19, 0xa4, 0xdf, 0x00, 0xb8, 0x91, 0x46, 0x47, + 0x77, 0x4e, 0x44, 0x4f, 0x82, 0x86, 0xfc, 0x56, 0x56, 0x0d, 0x3f, 0x8e, 0x2f, 0xe0, 0x7a, 0xf2, + 0x68, 0x55, 0x46, 0x9a, 0x8c, 0xc8, 0xcb, 0x6f, 0x64, 0x93, 0xf7, 0x02, 0xa8, 0xdc, 0x7b, 0x7a, + 0x54, 0x02, 0xcf, 0x8e, 0x4a, 0xe0, 0xbf, 0xa3, 0x12, 0xf8, 0xf6, 0xb8, 0x34, 0xf3, 0xec, 0xb8, + 0x34, 0xf3, 0xcf, 0x71, 0x69, 0xe6, 0x93, 0x3b, 0x21, 0x9a, 0x10, 0xb6, 0x6f, 0x1f, 0xe8, 0x4d, + 0xea, 0xfd, 0x50, 0x0f, 0x77, 0x5e, 0x57, 0x7b, 0xfc, 0xb3, 0xaa, 0x4b, 0x1a, 0xcd, 0x59, 0xf7, + 0x33, 0xe8, 0xdd, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x26, 0xaf, 0xfa, 0x83, 0x73, 0x15, 0x00, + 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + JoinPool(ctx context.Context, in *MsgJoinPool, opts ...grpc.CallOption) (*MsgJoinPoolResponse, error) + ExitPool(ctx context.Context, in *MsgExitPool, opts ...grpc.CallOption) (*MsgExitPoolResponse, error) + SwapExactAmountIn(ctx context.Context, in *MsgSwapExactAmountIn, opts ...grpc.CallOption) (*MsgSwapExactAmountInResponse, error) + SwapExactAmountOut(ctx context.Context, in *MsgSwapExactAmountOut, opts ...grpc.CallOption) (*MsgSwapExactAmountOutResponse, error) + JoinSwapExternAmountIn(ctx context.Context, in *MsgJoinSwapExternAmountIn, opts ...grpc.CallOption) (*MsgJoinSwapExternAmountInResponse, error) + JoinSwapShareAmountOut(ctx context.Context, in *MsgJoinSwapShareAmountOut, opts ...grpc.CallOption) (*MsgJoinSwapShareAmountOutResponse, error) + ExitSwapExternAmountOut(ctx context.Context, in *MsgExitSwapExternAmountOut, opts ...grpc.CallOption) (*MsgExitSwapExternAmountOutResponse, error) + ExitSwapShareAmountIn(ctx context.Context, in *MsgExitSwapShareAmountIn, opts ...grpc.CallOption) (*MsgExitSwapShareAmountInResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) JoinPool(ctx context.Context, in *MsgJoinPool, opts ...grpc.CallOption) (*MsgJoinPoolResponse, error) { + out := new(MsgJoinPoolResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/JoinPool", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) ExitPool(ctx context.Context, in *MsgExitPool, opts ...grpc.CallOption) (*MsgExitPoolResponse, error) { + out := new(MsgExitPoolResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/ExitPool", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SwapExactAmountIn(ctx context.Context, in *MsgSwapExactAmountIn, opts ...grpc.CallOption) (*MsgSwapExactAmountInResponse, error) { + out := new(MsgSwapExactAmountInResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/SwapExactAmountIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) SwapExactAmountOut(ctx context.Context, in *MsgSwapExactAmountOut, opts ...grpc.CallOption) (*MsgSwapExactAmountOutResponse, error) { + out := new(MsgSwapExactAmountOutResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/SwapExactAmountOut", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) JoinSwapExternAmountIn(ctx context.Context, in *MsgJoinSwapExternAmountIn, opts ...grpc.CallOption) (*MsgJoinSwapExternAmountInResponse, error) { + out := new(MsgJoinSwapExternAmountInResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/JoinSwapExternAmountIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) JoinSwapShareAmountOut(ctx context.Context, in *MsgJoinSwapShareAmountOut, opts ...grpc.CallOption) (*MsgJoinSwapShareAmountOutResponse, error) { + out := new(MsgJoinSwapShareAmountOutResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/JoinSwapShareAmountOut", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) ExitSwapExternAmountOut(ctx context.Context, in *MsgExitSwapExternAmountOut, opts ...grpc.CallOption) (*MsgExitSwapExternAmountOutResponse, error) { + out := new(MsgExitSwapExternAmountOutResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/ExitSwapExternAmountOut", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) ExitSwapShareAmountIn(ctx context.Context, in *MsgExitSwapShareAmountIn, opts ...grpc.CallOption) (*MsgExitSwapShareAmountInResponse, error) { + out := new(MsgExitSwapShareAmountInResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.v1beta1.Msg/ExitSwapShareAmountIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + JoinPool(context.Context, *MsgJoinPool) (*MsgJoinPoolResponse, error) + ExitPool(context.Context, *MsgExitPool) (*MsgExitPoolResponse, error) + SwapExactAmountIn(context.Context, *MsgSwapExactAmountIn) (*MsgSwapExactAmountInResponse, error) + SwapExactAmountOut(context.Context, *MsgSwapExactAmountOut) (*MsgSwapExactAmountOutResponse, error) + JoinSwapExternAmountIn(context.Context, *MsgJoinSwapExternAmountIn) (*MsgJoinSwapExternAmountInResponse, error) + JoinSwapShareAmountOut(context.Context, *MsgJoinSwapShareAmountOut) (*MsgJoinSwapShareAmountOutResponse, error) + ExitSwapExternAmountOut(context.Context, *MsgExitSwapExternAmountOut) (*MsgExitSwapExternAmountOutResponse, error) + ExitSwapShareAmountIn(context.Context, *MsgExitSwapShareAmountIn) (*MsgExitSwapShareAmountInResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) JoinPool(ctx context.Context, req *MsgJoinPool) (*MsgJoinPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method JoinPool not implemented") +} +func (*UnimplementedMsgServer) ExitPool(ctx context.Context, req *MsgExitPool) (*MsgExitPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExitPool not implemented") +} +func (*UnimplementedMsgServer) SwapExactAmountIn(ctx context.Context, req *MsgSwapExactAmountIn) (*MsgSwapExactAmountInResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SwapExactAmountIn not implemented") +} +func (*UnimplementedMsgServer) SwapExactAmountOut(ctx context.Context, req *MsgSwapExactAmountOut) (*MsgSwapExactAmountOutResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SwapExactAmountOut not implemented") +} +func (*UnimplementedMsgServer) JoinSwapExternAmountIn(ctx context.Context, req *MsgJoinSwapExternAmountIn) (*MsgJoinSwapExternAmountInResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method JoinSwapExternAmountIn not implemented") +} +func (*UnimplementedMsgServer) JoinSwapShareAmountOut(ctx context.Context, req *MsgJoinSwapShareAmountOut) (*MsgJoinSwapShareAmountOutResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method JoinSwapShareAmountOut not implemented") +} +func (*UnimplementedMsgServer) ExitSwapExternAmountOut(ctx context.Context, req *MsgExitSwapExternAmountOut) (*MsgExitSwapExternAmountOutResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExitSwapExternAmountOut not implemented") +} +func (*UnimplementedMsgServer) ExitSwapShareAmountIn(ctx context.Context, req *MsgExitSwapShareAmountIn) (*MsgExitSwapShareAmountInResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExitSwapShareAmountIn not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_JoinPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgJoinPool) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).JoinPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/JoinPool", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).JoinPool(ctx, req.(*MsgJoinPool)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_ExitPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgExitPool) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ExitPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/ExitPool", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ExitPool(ctx, req.(*MsgExitPool)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SwapExactAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSwapExactAmountIn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SwapExactAmountIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/SwapExactAmountIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SwapExactAmountIn(ctx, req.(*MsgSwapExactAmountIn)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_SwapExactAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgSwapExactAmountOut) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).SwapExactAmountOut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/SwapExactAmountOut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).SwapExactAmountOut(ctx, req.(*MsgSwapExactAmountOut)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_JoinSwapExternAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgJoinSwapExternAmountIn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).JoinSwapExternAmountIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/JoinSwapExternAmountIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).JoinSwapExternAmountIn(ctx, req.(*MsgJoinSwapExternAmountIn)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_JoinSwapShareAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgJoinSwapShareAmountOut) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).JoinSwapShareAmountOut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/JoinSwapShareAmountOut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).JoinSwapShareAmountOut(ctx, req.(*MsgJoinSwapShareAmountOut)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_ExitSwapExternAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgExitSwapExternAmountOut) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ExitSwapExternAmountOut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/ExitSwapExternAmountOut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ExitSwapExternAmountOut(ctx, req.(*MsgExitSwapExternAmountOut)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_ExitSwapShareAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgExitSwapShareAmountIn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ExitSwapShareAmountIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.v1beta1.Msg/ExitSwapShareAmountIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ExitSwapShareAmountIn(ctx, req.(*MsgExitSwapShareAmountIn)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "osmosis.gamm.v1beta1.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "JoinPool", + Handler: _Msg_JoinPool_Handler, + }, + { + MethodName: "ExitPool", + Handler: _Msg_ExitPool_Handler, + }, + { + MethodName: "SwapExactAmountIn", + Handler: _Msg_SwapExactAmountIn_Handler, + }, + { + MethodName: "SwapExactAmountOut", + Handler: _Msg_SwapExactAmountOut_Handler, + }, + { + MethodName: "JoinSwapExternAmountIn", + Handler: _Msg_JoinSwapExternAmountIn_Handler, + }, + { + MethodName: "JoinSwapShareAmountOut", + Handler: _Msg_JoinSwapShareAmountOut_Handler, + }, + { + MethodName: "ExitSwapExternAmountOut", + Handler: _Msg_ExitSwapExternAmountOut_Handler, + }, + { + MethodName: "ExitSwapShareAmountIn", + Handler: _Msg_ExitSwapShareAmountIn_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "osmosis/gamm/v1beta1/tx.proto", +} + +func (m *MsgJoinPool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgJoinPool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgJoinPool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenInMaxs) > 0 { + for iNdEx := len(m.TokenInMaxs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokenInMaxs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + { + size := m.ShareOutAmount.Size() + i -= size + if _, err := m.ShareOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgJoinPoolResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgJoinPoolResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgJoinPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenIn) > 0 { + for iNdEx := len(m.TokenIn) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokenIn[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size := m.ShareOutAmount.Size() + i -= size + if _, err := m.ShareOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MsgExitPool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgExitPool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExitPool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenOutMins) > 0 { + for iNdEx := len(m.TokenOutMins) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokenOutMins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + { + size := m.ShareInAmount.Size() + i -= size + if _, err := m.ShareInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgExitPoolResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgExitPoolResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExitPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenOut) > 0 { + for iNdEx := len(m.TokenOut) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokenOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *SwapAmountInRoute) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SwapAmountInRoute) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SwapAmountInRoute) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenOutDenom) > 0 { + i -= len(m.TokenOutDenom) + copy(dAtA[i:], m.TokenOutDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.TokenOutDenom))) + i-- + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgSwapExactAmountIn) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSwapExactAmountIn) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSwapExactAmountIn) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenOutMinAmount.Size() + i -= size + if _, err := m.TokenOutMinAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.TokenIn.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Routes) > 0 { + for iNdEx := len(m.Routes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Routes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSwapExactAmountInResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSwapExactAmountInResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSwapExactAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenOutAmount.Size() + i -= size + if _, err := m.TokenOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *SwapAmountOutRoute) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SwapAmountOutRoute) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SwapAmountOutRoute) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TokenInDenom) > 0 { + i -= len(m.TokenInDenom) + copy(dAtA[i:], m.TokenInDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.TokenInDenom))) + i-- + dAtA[i] = 0x12 + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgSwapExactAmountOut) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSwapExactAmountOut) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSwapExactAmountOut) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.TokenOut.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size := m.TokenInMaxAmount.Size() + i -= size + if _, err := m.TokenInMaxAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.Routes) > 0 { + for iNdEx := len(m.Routes) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Routes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgSwapExactAmountOutResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgSwapExactAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgSwapExactAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenInAmount.Size() + i -= size + if _, err := m.TokenInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MsgJoinSwapExternAmountIn) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgJoinSwapExternAmountIn) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgJoinSwapExternAmountIn) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.ShareOutMinAmount.Size() + i -= size + if _, err := m.ShareOutMinAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.TokenIn.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgJoinSwapExternAmountInResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgJoinSwapExternAmountInResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgJoinSwapExternAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.ShareOutAmount.Size() + i -= size + if _, err := m.ShareOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MsgJoinSwapShareAmountOut) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgJoinSwapShareAmountOut) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgJoinSwapShareAmountOut) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenInMaxAmount.Size() + i -= size + if _, err := m.TokenInMaxAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size := m.ShareOutAmount.Size() + i -= size + if _, err := m.ShareOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.TokenInDenom) > 0 { + i -= len(m.TokenInDenom) + copy(dAtA[i:], m.TokenInDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.TokenInDenom))) + i-- + dAtA[i] = 0x1a + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgJoinSwapShareAmountOutResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgJoinSwapShareAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgJoinSwapShareAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenInAmount.Size() + i -= size + if _, err := m.TokenInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MsgExitSwapShareAmountIn) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgExitSwapShareAmountIn) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExitSwapShareAmountIn) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenOutMinAmount.Size() + i -= size + if _, err := m.TokenOutMinAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size := m.ShareInAmount.Size() + i -= size + if _, err := m.ShareInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.TokenOutDenom) > 0 { + i -= len(m.TokenOutDenom) + copy(dAtA[i:], m.TokenOutDenom) + i = encodeVarintTx(dAtA, i, uint64(len(m.TokenOutDenom))) + i-- + dAtA[i] = 0x1a + } + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgExitSwapShareAmountInResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgExitSwapShareAmountInResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExitSwapShareAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TokenOutAmount.Size() + i -= size + if _, err := m.TokenOutAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MsgExitSwapExternAmountOut) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgExitSwapExternAmountOut) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExitSwapExternAmountOut) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.ShareInMaxAmount.Size() + i -= size + if _, err := m.ShareInMaxAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.TokenOut.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if m.PoolId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgExitSwapExternAmountOutResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgExitSwapExternAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgExitSwapExternAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.ShareInAmount.Size() + i -= size + if _, err := m.ShareInAmount.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgJoinPool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = m.ShareOutAmount.Size() + n += 1 + l + sovTx(uint64(l)) + if len(m.TokenInMaxs) > 0 { + for _, e := range m.TokenInMaxs { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgJoinPoolResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ShareOutAmount.Size() + n += 1 + l + sovTx(uint64(l)) + if len(m.TokenIn) > 0 { + for _, e := range m.TokenIn { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgExitPool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = m.ShareInAmount.Size() + n += 1 + l + sovTx(uint64(l)) + if len(m.TokenOutMins) > 0 { + for _, e := range m.TokenOutMins { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *MsgExitPoolResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TokenOut) > 0 { + for _, e := range m.TokenOut { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + return n +} + +func (m *SwapAmountInRoute) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.TokenOutDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSwapExactAmountIn) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Routes) > 0 { + for _, e := range m.Routes { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + l = m.TokenIn.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.TokenOutMinAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgSwapExactAmountInResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TokenOutAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *SwapAmountOutRoute) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.TokenInDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgSwapExactAmountOut) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Routes) > 0 { + for _, e := range m.Routes { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + l = m.TokenInMaxAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.TokenOut.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgSwapExactAmountOutResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TokenInAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgJoinSwapExternAmountIn) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = m.TokenIn.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.ShareOutMinAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgJoinSwapExternAmountInResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ShareOutAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgJoinSwapShareAmountOut) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.TokenInDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.ShareOutAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.TokenInMaxAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgJoinSwapShareAmountOutResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TokenInAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgExitSwapShareAmountIn) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = len(m.TokenOutDenom) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.ShareInAmount.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.TokenOutMinAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgExitSwapShareAmountInResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.TokenOutAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgExitSwapExternAmountOut) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovTx(uint64(m.PoolId)) + } + l = m.TokenOut.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.ShareInMaxAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgExitSwapExternAmountOutResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ShareInAmount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgJoinPool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgJoinPool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgJoinPool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInMaxs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenInMaxs = append(m.TokenInMaxs, types.Coin{}) + if err := m.TokenInMaxs[len(m.TokenInMaxs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgJoinPoolResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgJoinPoolResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgJoinPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenIn = append(m.TokenIn, types.Coin{}) + if err := m.TokenIn[len(m.TokenIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExitPool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgExitPool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExitPool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutMins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenOutMins = append(m.TokenOutMins, types.Coin{}) + if err := m.TokenOutMins[len(m.TokenOutMins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExitPoolResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgExitPoolResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExitPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenOut = append(m.TokenOut, types.Coin{}) + if err := m.TokenOut[len(m.TokenOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SwapAmountInRoute) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SwapAmountInRoute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SwapAmountInRoute: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenOutDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSwapExactAmountIn) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgSwapExactAmountIn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSwapExactAmountIn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Routes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Routes = append(m.Routes, SwapAmountInRoute{}) + if err := m.Routes[len(m.Routes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutMinAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOutMinAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSwapExactAmountInResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgSwapExactAmountInResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSwapExactAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SwapAmountOutRoute) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SwapAmountOutRoute: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SwapAmountOutRoute: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenInDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSwapExactAmountOut) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgSwapExactAmountOut: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSwapExactAmountOut: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Routes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Routes = append(m.Routes, SwapAmountOutRoute{}) + if err := m.Routes[len(m.Routes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInMaxAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenInMaxAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgSwapExactAmountOutResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgSwapExactAmountOutResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgSwapExactAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgJoinSwapExternAmountIn) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgJoinSwapExternAmountIn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgJoinSwapExternAmountIn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareOutMinAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareOutMinAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgJoinSwapExternAmountInResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgJoinSwapExternAmountInResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgJoinSwapExternAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgJoinSwapShareAmountOut) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgJoinSwapShareAmountOut: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgJoinSwapShareAmountOut: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenInDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInMaxAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenInMaxAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgJoinSwapShareAmountOutResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgJoinSwapShareAmountOutResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgJoinSwapShareAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExitSwapShareAmountIn) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgExitSwapShareAmountIn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExitSwapShareAmountIn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenOutDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutMinAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOutMinAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExitSwapShareAmountInResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgExitSwapShareAmountInResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExitSwapShareAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOutAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOutAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExitSwapExternAmountOut) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgExitSwapExternAmountOut: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExitSwapExternAmountOut: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) + } + m.PoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TokenOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareInMaxAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareInMaxAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgExitSwapExternAmountOutResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgExitSwapExternAmountOutResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgExitSwapExternAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareInAmount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ShareInAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index ac67d6e..f3b721e 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -2,6 +2,7 @@ package interchaintest import ( "context" + "fmt" "testing" "time" @@ -9,6 +10,7 @@ import ( "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" ) @@ -63,7 +65,8 @@ func TestPacketForwardMiddleware(t *testing.T) { Name: "osmosis", Version: "v15.0.0", ChainConfig: ibc.ChainConfig{ - GasPrices: "0.005uosmo", + GasPrices: "0.005uosmo", + EncodingConfig: osmosisEncoding(), }, NumValidators: &numVals, NumFullNodes: &numFullNodes, @@ -78,6 +81,7 @@ func TestPacketForwardMiddleware(t *testing.T) { r := interchaintest.NewBuiltinRelayerFactory( ibc.CosmosRly, zaptest.NewLogger(t), + // relayer.CustomDockerImage("ghcr.io/cosmos/relayer", "main", rly.RlyDefaultUidGid), ).Build(t, client, network) ic := interchaintest.NewInterchain(). @@ -110,7 +114,7 @@ func TestPacketForwardMiddleware(t *testing.T) { NetworkID: network, BlockDatabaseFile: interchaintest.DefaultBlockDatabaseFilepath(), - SkipPathCreation: false, + SkipPathCreation: true, })) t.Cleanup(func() { _ = ic.Close() @@ -119,20 +123,150 @@ func TestPacketForwardMiddleware(t *testing.T) { const userFunds = int64(10_000_000_000) users := interchaintest.GetAndFundTestUsers(t, ctx, t.Name(), userFunds, feeabs, gaia, osmosis) - feeabsGaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, gaia.Config().ChainID) + // rly feeabs-osmo + // Generate new path + err = r.GeneratePath(ctx, eRep, feeabs.Config().ChainID, osmosis.Config().ChainID, pathFeeabsOsmosis) + require.NoError(t, err) + // Create client + err = r.CreateClients(ctx, eRep, pathFeeabsOsmosis, ibc.DefaultClientOpts()) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 5, feeabs, osmosis) + require.NoError(t, err) + + // Create connection + err = r.CreateConnections(ctx, eRep, pathFeeabsOsmosis) require.NoError(t, err) - gaiaFeeabsChannel := feeabsGaiaChannel.Counterparty - _ = gaiaFeeabsChannel - feeabsOsmosisChannel, err := ibc.GetTransferChannel(ctx, r, eRep, feeabs.Config().ChainID, osmosis.Config().ChainID) + err = testutil.WaitForBlocks(ctx, 5, feeabs, osmosis) + require.NoError(t, err) + // Create channel + err = r.CreateChannel(ctx, eRep, pathFeeabsOsmosis, ibc.CreateChannelOptions{ + SourcePortName: "transfer", + DestPortName: "transfer", + Order: ibc.Unordered, + Version: "ics20-1", + }) require.NoError(t, err) - osmosisFeeabsChannel := feeabsOsmosisChannel.Counterparty - _ = osmosisFeeabsChannel - osmosisGaiaChannel, err := ibc.GetTransferChannel(ctx, r, eRep, osmosis.Config().ChainID, gaia.Config().ChainID) + err = testutil.WaitForBlocks(ctx, 5, feeabs, osmosis) + require.NoError(t, err) + + channsFeeabs, err := r.GetChannels(ctx, eRep, feeabs.Config().ChainID) + require.NoError(t, err) + + channsOsmosis, err := r.GetChannels(ctx, eRep, osmosis.Config().ChainID) + require.NoError(t, err) + + require.Len(t, channsFeeabs, 1) + require.Len(t, channsOsmosis, 1) + + channFeeabsOsmosis := channsFeeabs[0] + require.NotEmpty(t, channFeeabsOsmosis.ChannelID) + channOsmosisFeeabs := channsOsmosis[0] + require.NotEmpty(t, channOsmosisFeeabs.ChannelID) + // rly feeabs-gaia + // Generate new path + err = r.GeneratePath(ctx, eRep, feeabs.Config().ChainID, gaia.Config().ChainID, pathFeeabsGaia) + require.NoError(t, err) + // Create clients + err = r.CreateClients(ctx, eRep, pathFeeabsGaia, ibc.DefaultClientOpts()) require.NoError(t, err) - gaiaOsmosisChannel := osmosisGaiaChannel.Counterparty - _ = gaiaOsmosisChannel + + err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia) + require.NoError(t, err) + + // Create connection + err = r.CreateConnections(ctx, eRep, pathFeeabsGaia) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia) + require.NoError(t, err) + + //Create channel + err = r.CreateChannel(ctx, eRep, pathFeeabsGaia, ibc.CreateChannelOptions{ + SourcePortName: "transfer", + DestPortName: "transfer", + Order: ibc.Unordered, + Version: "ics20-1", + }) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 5, feeabs, gaia) + require.NoError(t, err) + + channsFeeabs, err = r.GetChannels(ctx, eRep, feeabs.Config().ChainID) + require.NoError(t, err) + + channsGaia, err := r.GetChannels(ctx, eRep, gaia.Config().ChainID) + require.NoError(t, err) + + require.Len(t, channsFeeabs, 2) + require.Len(t, channsGaia, 1) + + var channFeeabsGaia ibc.ChannelOutput + for _, chann := range channsFeeabs { + if chann.ChannelID != channFeeabsOsmosis.ChannelID { + channFeeabsGaia = chann + } + } + require.NotEmpty(t, channFeeabsGaia.ChannelID) + + channGaiaFeeabs := channsGaia[0] + require.NotEmpty(t, channGaiaFeeabs.ChannelID) + //rly osmo-gaia + // Generate new path + err = r.GeneratePath(ctx, eRep, osmosis.Config().ChainID, gaia.Config().ChainID, pathOsmosisGaia) + require.NoError(t, err) + // Create clients + err = r.CreateClients(ctx, eRep, pathOsmosisGaia, ibc.DefaultClientOpts()) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 5, osmosis, gaia) + require.NoError(t, err) + // Create connection + err = r.CreateConnections(ctx, eRep, pathOsmosisGaia) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 5, osmosis, gaia) + require.NoError(t, err) + // Create channel + err = r.CreateChannel(ctx, eRep, pathOsmosisGaia, ibc.CreateChannelOptions{ + SourcePortName: "transfer", + DestPortName: "transfer", + Order: ibc.Unordered, + Version: "ics20-1", + }) + require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 5, osmosis, gaia) + require.NoError(t, err) + + channsOsmosis, err = r.GetChannels(ctx, eRep, osmosis.Config().ChainID) + require.NoError(t, err) + + channsGaia, err = r.GetChannels(ctx, eRep, gaia.Config().ChainID) + require.NoError(t, err) + + require.Len(t, channsOsmosis, 2) + require.Len(t, channsGaia, 2) + + var channOsmosisGaia ibc.ChannelOutput + var channGaiaOsmosis ibc.ChannelOutput + + for _, chann := range channsOsmosis { + if chann.ChannelID != channOsmosisFeeabs.ChannelID { + channOsmosisGaia = chann + } + } + require.NotEmpty(t, channOsmosisGaia) + + for _, chann := range channsGaia { + if chann.ChannelID != channGaiaFeeabs.ChannelID { + channGaiaOsmosis = chann + } + } + require.NotEmpty(t, channGaiaOsmosis) // Start the relayer on both paths err = r.StartRelayer(ctx, eRep, pathFeeabsGaia, pathFeeabsOsmosis, pathOsmosisGaia) @@ -175,22 +309,28 @@ func TestPacketForwardMiddleware(t *testing.T) { t.Run("forward a->b->a", func(t *testing.T) { // Setup contract on Osmosis // Store code crosschain Registry - crossChainRegistryContractID, err := feeabs.StoreContract(ctx, feeabsUser.KeyName, "./bytecode/crosschain_registry.wasm") + crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") require.NoError(t, err) _ = crossChainRegistryContractID // // Instatiate - // owner := feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) - // swapRegistryInitMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) - // address, err := feeabs.InstantiateContract(ctx, feeabsUser.KeyName, crossChainRegistryContractID, swapRegistryInitMsg, true) - // require.NoError(t, err) - // feeabs.FullNodes - // // Execute - // msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", feeabsOsmosisChannel, osmosisFeeabsChannel, feeabsGaiaChannel, gaiaFeeabsChannel, osmosisGaiaChannel, gaiaOsmosisChannel) - // txHash, err := feeabs.ExecuteContract(ctx, feeabsUser.KeyName, address, msg) - // require.NoError(t, err) - // fmt.Printf("Hash----------------: %s", txHash) - // tx, err := feeabs.GetTransaction(txHash) - // fmt.Printf("tx----------------: %v", tx) + owner := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) + swapRegistryInitMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) + address, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, crossChainRegistryContractID, swapRegistryInitMsg, true) + fmt.Printf("xcrAddress: %s\n", address) + require.NoError(t, err) + // Execute + msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", + channFeeabsOsmosis.ChannelID, + channOsmosisFeeabs.ChannelID, + channFeeabsGaia.ChannelID, + channGaiaFeeabs.ChannelID, + channOsmosisGaia.ChannelID, + channGaiaOsmosis.ChannelID) + txHash, err := osmosis.ExecuteContract(ctx, osmosisUser.KeyName, address, msg) + require.NoError(t, err) + _ = txHash + tx, _ := osmosis.GetTransaction(txHash) + fmt.Printf("tx----------------: %v", tx) // Send Gaia uatom to Osmosis diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index b62fd64..189239f 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -2,8 +2,9 @@ package interchaintest import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + gammtypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/types" feeabstype "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" - "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" + "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos/wasm" "github.com/strangelove-ventures/interchaintest/v4/ibc" ) @@ -45,10 +46,18 @@ var ( // feeabsEncoding registers the feeabs specific module codecs so that the associated types and msgs // will be supported when writing to the blocksdb sqlite database. func feeabsEncoding() *simappparams.EncodingConfig { - cfg := cosmos.DefaultEncoding() + cfg := wasm.WasmEncoding() // register custom types feeabstype.RegisterInterfaces(cfg.InterfaceRegistry) - return &cfg + return cfg +} + +func osmosisEncoding() *simappparams.EncodingConfig { + cfg := wasm.WasmEncoding() + + gammtypes.RegisterInterfaces(cfg.InterfaceRegistry) + + return cfg } From ac40ec56642685e46bcf82ce6d1486856b8373b7 Mon Sep 17 00:00:00 2001 From: GnaD Date: Tue, 18 Apr 2023 01:16:37 +0700 Subject: [PATCH 09/50] add balancer types and create pool msg --- .../gamm/balancer/balancerPool.pb.go | 1519 +++++++++++++++++ .../osmosistypes/gamm/balancer/codec.go | 30 + .../osmosistypes/gamm/balancer/msgs.go | 49 + .../osmosistypes/gamm/balancer/pool.go | 45 + .../osmosistypes/gamm/balancer/tx.pb.go | 1352 +++++++++++++++ tests/interchaintest/packet_foward_test.go | 72 +- tests/interchaintest/setup.go | 2 + 7 files changed, 3057 insertions(+), 12 deletions(-) create mode 100644 tests/interchaintest/osmosistypes/gamm/balancer/balancerPool.pb.go create mode 100644 tests/interchaintest/osmosistypes/gamm/balancer/codec.go create mode 100644 tests/interchaintest/osmosistypes/gamm/balancer/msgs.go create mode 100644 tests/interchaintest/osmosistypes/gamm/balancer/pool.go create mode 100644 tests/interchaintest/osmosistypes/gamm/balancer/tx.pb.go diff --git a/tests/interchaintest/osmosistypes/gamm/balancer/balancerPool.pb.go b/tests/interchaintest/osmosistypes/gamm/balancer/balancerPool.pb.go new file mode 100644 index 0000000..c0835cf --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/balancer/balancerPool.pb.go @@ -0,0 +1,1519 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/gamm/pool-models/balancer/balancerPool.proto + +// this is a legacy package that requires additional migration logic +// in order to use the correct packge. Decision made to use legacy package path +// until clear steps for migration logic and the unknowns for state breaking are +// investigated for changing proto package. + +package balancer + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types1 "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/cosmos-sdk/x/auth/types" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + io "io" + math "math" + math_bits "math/bits" + time "time" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Parameters for changing the weights in a balancer pool smoothly from +// a start weight and end weight over a period of time. +// Currently, the only smooth change supported is linear changing between +// the two weights, but more types may be added in the future. +// When these parameters are set, the weight w(t) for pool time `t` is the +// following: +// +// t <= start_time: w(t) = initial_pool_weights +// start_time < t <= start_time + duration: +// w(t) = initial_pool_weights + (t - start_time) * +// (target_pool_weights - initial_pool_weights) / (duration) +// t > start_time + duration: w(t) = target_pool_weights +type SmoothWeightChangeParams struct { + // The start time for beginning the weight change. + // If a parameter change / pool instantiation leaves this blank, + // it should be generated by the state_machine as the current time. + StartTime time.Time `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time" yaml:"start_time"` + // Duration for the weights to change over + Duration time.Duration `protobuf:"bytes,2,opt,name=duration,proto3,stdduration" json:"duration,omitempty" yaml:"duration"` + // The initial pool weights. These are copied from the pool's settings + // at the time of weight change instantiation. + // The amount PoolAsset.token.amount field is ignored if present, + // future type refactorings should just have a type with the denom & weight + // here. + InitialPoolWeights []PoolAsset `protobuf:"bytes,3,rep,name=initial_pool_weights,json=initialPoolWeights,proto3" json:"initial_pool_weights" yaml:"initial_pool_weights"` + // The target pool weights. The pool weights will change linearly with respect + // to time between start_time, and start_time + duration. The amount + // PoolAsset.token.amount field is ignored if present, future type + // refactorings should just have a type with the denom & weight here. + TargetPoolWeights []PoolAsset `protobuf:"bytes,4,rep,name=target_pool_weights,json=targetPoolWeights,proto3" json:"target_pool_weights" yaml:"target_pool_weights"` +} + +func (m *SmoothWeightChangeParams) Reset() { *m = SmoothWeightChangeParams{} } +func (m *SmoothWeightChangeParams) String() string { return proto.CompactTextString(m) } +func (*SmoothWeightChangeParams) ProtoMessage() {} +func (*SmoothWeightChangeParams) Descriptor() ([]byte, []int) { + return fileDescriptor_7e991f749f68c2a4, []int{0} +} +func (m *SmoothWeightChangeParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SmoothWeightChangeParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SmoothWeightChangeParams.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SmoothWeightChangeParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_SmoothWeightChangeParams.Merge(m, src) +} +func (m *SmoothWeightChangeParams) XXX_Size() int { + return m.Size() +} +func (m *SmoothWeightChangeParams) XXX_DiscardUnknown() { + xxx_messageInfo_SmoothWeightChangeParams.DiscardUnknown(m) +} + +var xxx_messageInfo_SmoothWeightChangeParams proto.InternalMessageInfo + +func (m *SmoothWeightChangeParams) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *SmoothWeightChangeParams) GetDuration() time.Duration { + if m != nil { + return m.Duration + } + return 0 +} + +func (m *SmoothWeightChangeParams) GetInitialPoolWeights() []PoolAsset { + if m != nil { + return m.InitialPoolWeights + } + return nil +} + +func (m *SmoothWeightChangeParams) GetTargetPoolWeights() []PoolAsset { + if m != nil { + return m.TargetPoolWeights + } + return nil +} + +// PoolParams defined the parameters that will be managed by the pool +// governance in the future. This params are not managed by the chain +// governance. Instead they will be managed by the token holders of the pool. +// The pool's token holders are specified in future_pool_governor. +type PoolParams struct { + SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` + // N.B.: exit fee is disabled during pool creation in x/poolmanager. While old + // pools can maintain a non-zero fee. No new pool can be created with non-zero + // fee anymore + ExitFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=exit_fee,json=exitFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exit_fee" yaml:"exit_fee"` + SmoothWeightChangeParams *SmoothWeightChangeParams `protobuf:"bytes,3,opt,name=smooth_weight_change_params,json=smoothWeightChangeParams,proto3" json:"smooth_weight_change_params,omitempty" yaml:"smooth_weight_change_params"` +} + +func (m *PoolParams) Reset() { *m = PoolParams{} } +func (m *PoolParams) String() string { return proto.CompactTextString(m) } +func (*PoolParams) ProtoMessage() {} +func (*PoolParams) Descriptor() ([]byte, []int) { + return fileDescriptor_7e991f749f68c2a4, []int{1} +} +func (m *PoolParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PoolParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PoolParams.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PoolParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_PoolParams.Merge(m, src) +} +func (m *PoolParams) XXX_Size() int { + return m.Size() +} +func (m *PoolParams) XXX_DiscardUnknown() { + xxx_messageInfo_PoolParams.DiscardUnknown(m) +} + +var xxx_messageInfo_PoolParams proto.InternalMessageInfo + +func (m *PoolParams) GetSmoothWeightChangeParams() *SmoothWeightChangeParams { + if m != nil { + return m.SmoothWeightChangeParams + } + return nil +} + +// Pool asset is an internal struct that combines the amount of the +// token in the pool, and its balancer weight. +// This is an awkward packaging of data, +// and should be revisited in a future state migration. +type PoolAsset struct { + // Coins we are talking about, + // the denomination must be unique amongst all PoolAssets for this pool. + Token types1.Coin `protobuf:"bytes,1,opt,name=token,proto3" json:"token" yaml:"token"` + // Weight that is not normalized. This weight must be less than 2^50 + Weight github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=weight,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"weight" yaml:"weight"` +} + +func (m *PoolAsset) Reset() { *m = PoolAsset{} } +func (m *PoolAsset) String() string { return proto.CompactTextString(m) } +func (*PoolAsset) ProtoMessage() {} +func (*PoolAsset) Descriptor() ([]byte, []int) { + return fileDescriptor_7e991f749f68c2a4, []int{2} +} +func (m *PoolAsset) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PoolAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PoolAsset.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PoolAsset) XXX_Merge(src proto.Message) { + xxx_messageInfo_PoolAsset.Merge(m, src) +} +func (m *PoolAsset) XXX_Size() int { + return m.Size() +} +func (m *PoolAsset) XXX_DiscardUnknown() { + xxx_messageInfo_PoolAsset.DiscardUnknown(m) +} + +var xxx_messageInfo_PoolAsset proto.InternalMessageInfo + +func (m *PoolAsset) GetToken() types1.Coin { + if m != nil { + return m.Token + } + return types1.Coin{} +} + +type Pool struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty" yaml:"address"` + Id uint64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + PoolParams PoolParams `protobuf:"bytes,3,opt,name=pool_params,json=poolParams,proto3" json:"pool_params" yaml:"balancer_pool_params"` + // This string specifies who will govern the pool in the future. + // Valid forms of this are: + // {token name},{duration} + // {duration} + // where {token name} if specified is the token which determines the + // governor, and if not specified is the LP token for this pool.duration is + // a time specified as 0w,1w,2w, etc. which specifies how long the token + // would need to be locked up to count in governance. 0w means no lockup. + // TODO: Further improve these docs + FuturePoolGovernor string `protobuf:"bytes,4,opt,name=future_pool_governor,json=futurePoolGovernor,proto3" json:"future_pool_governor,omitempty" yaml:"future_pool_governor"` + // sum of all LP tokens sent out + TotalShares types1.Coin `protobuf:"bytes,5,opt,name=total_shares,json=totalShares,proto3" json:"total_shares" yaml:"total_shares"` + // These are assumed to be sorted by denomiation. + // They contain the pool asset and the information about the weight + PoolAssets []PoolAsset `protobuf:"bytes,6,rep,name=pool_assets,json=poolAssets,proto3" json:"pool_assets" yaml:"pool_assets"` + // sum of all non-normalized pool weights + TotalWeight github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=total_weight,json=totalWeight,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"total_weight" yaml:"total_weight"` +} + +func (m *Pool) Reset() { *m = Pool{} } +func (*Pool) ProtoMessage() {} +func (*Pool) Descriptor() ([]byte, []int) { + return fileDescriptor_7e991f749f68c2a4, []int{3} +} +func (m *Pool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Pool.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Pool) XXX_Merge(src proto.Message) { + xxx_messageInfo_Pool.Merge(m, src) +} +func (m *Pool) XXX_Size() int { + return m.Size() +} +func (m *Pool) XXX_DiscardUnknown() { + xxx_messageInfo_Pool.DiscardUnknown(m) +} + +var xxx_messageInfo_Pool proto.InternalMessageInfo + +func init() { + proto.RegisterType((*SmoothWeightChangeParams)(nil), "osmosis.gamm.v1beta1.SmoothWeightChangeParams") + proto.RegisterType((*PoolParams)(nil), "osmosis.gamm.v1beta1.PoolParams") + proto.RegisterType((*PoolAsset)(nil), "osmosis.gamm.v1beta1.PoolAsset") + proto.RegisterType((*Pool)(nil), "osmosis.gamm.v1beta1.Pool") +} + +func init() { + proto.RegisterFile("osmosis/gamm/pool-models/balancer/balancerPool.proto", fileDescriptor_7e991f749f68c2a4) +} + +var fileDescriptor_7e991f749f68c2a4 = []byte{ + // 831 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0x93, 0xb4, 0xd9, 0x4e, 0x96, 0x45, 0x9d, 0xcd, 0xc1, 0x4d, 0x45, 0x5c, 0x0d, 0x12, + 0x5a, 0xa1, 0x8d, 0xad, 0x2c, 0x70, 0xd9, 0xcb, 0x6a, 0xd3, 0x16, 0xd4, 0x5b, 0x71, 0x91, 0x4a, + 0x51, 0x25, 0x6b, 0x92, 0x4c, 0x6c, 0xab, 0xb6, 0xc7, 0xf2, 0x4c, 0xd2, 0xf6, 0x1b, 0x70, 0xec, + 0xb1, 0xdc, 0x7a, 0xe7, 0x0a, 0xdf, 0xa1, 0x82, 0x4b, 0x8f, 0x88, 0x83, 0x41, 0x2d, 0x27, 0x8e, + 0xf9, 0x04, 0x68, 0xfe, 0x38, 0x49, 0x4b, 0x22, 0x5a, 0x71, 0xca, 0xbc, 0x37, 0xef, 0xfd, 0xde, + 0xef, 0xbd, 0xf7, 0x1b, 0x07, 0x7c, 0x4e, 0x59, 0x4c, 0x59, 0xc8, 0x1c, 0x1f, 0xc7, 0xb1, 0x93, + 0x52, 0x1a, 0xb5, 0x63, 0x3a, 0x20, 0x11, 0x73, 0x7a, 0x38, 0xc2, 0x49, 0x9f, 0x64, 0xd3, 0xc3, + 0x3e, 0xa5, 0x91, 0x9d, 0x66, 0x94, 0x53, 0xd8, 0xd0, 0x59, 0xb6, 0xc8, 0xb2, 0xc7, 0x9d, 0x1e, + 0xe1, 0xb8, 0xd3, 0xdc, 0xe8, 0x4b, 0xb7, 0x27, 0x63, 0x1c, 0x65, 0xa8, 0x84, 0x66, 0xc3, 0xa7, + 0x3e, 0x55, 0x7e, 0x71, 0xd2, 0xde, 0x96, 0x4f, 0xa9, 0x1f, 0x11, 0x47, 0x5a, 0xbd, 0xd1, 0xd0, + 0x19, 0x8c, 0x32, 0xcc, 0x43, 0x9a, 0xe8, 0x7b, 0xeb, 0xe1, 0x3d, 0x0f, 0x63, 0xc2, 0x38, 0x8e, + 0xd3, 0x02, 0x40, 0x15, 0x71, 0xf0, 0x88, 0x07, 0x8e, 0xa6, 0x21, 0x8d, 0x07, 0xf7, 0x3d, 0xcc, + 0xc8, 0xf4, 0xbe, 0x4f, 0x43, 0x5d, 0x00, 0xfd, 0x5a, 0x01, 0xe6, 0x41, 0x4c, 0x29, 0x0f, 0x0e, + 0x49, 0xe8, 0x07, 0x7c, 0x3b, 0xc0, 0x89, 0x4f, 0xf6, 0x71, 0x86, 0x63, 0x06, 0xbf, 0x05, 0x80, + 0x71, 0x9c, 0x71, 0x4f, 0x54, 0x35, 0x8d, 0x2d, 0xe3, 0x55, 0xfd, 0x4d, 0xd3, 0x56, 0x94, 0xec, + 0x82, 0x92, 0xfd, 0x4d, 0x41, 0xa9, 0xfb, 0xd1, 0x75, 0x6e, 0x95, 0x26, 0xb9, 0xb5, 0x7e, 0x8e, + 0xe3, 0xe8, 0x2d, 0x9a, 0xe5, 0xa2, 0x8b, 0x3f, 0x2c, 0xc3, 0x5d, 0x93, 0x0e, 0x11, 0x0e, 0x03, + 0xf0, 0xac, 0xe8, 0xd4, 0x2c, 0x4b, 0xdc, 0x8d, 0x7f, 0xe1, 0xee, 0xe8, 0x80, 0x6e, 0x47, 0xc0, + 0xfe, 0x9d, 0x5b, 0xb0, 0x48, 0x79, 0x4d, 0xe3, 0x90, 0x93, 0x38, 0xe5, 0xe7, 0x93, 0xdc, 0xfa, + 0x50, 0x15, 0x2b, 0xee, 0xd0, 0xa5, 0x28, 0x35, 0x45, 0x87, 0x63, 0xd0, 0x08, 0x93, 0x90, 0x87, + 0x38, 0xf2, 0xc4, 0x6e, 0xbd, 0x53, 0xd9, 0x26, 0x33, 0x2b, 0x5b, 0x95, 0x57, 0xf5, 0x37, 0x96, + 0xbd, 0x68, 0x8f, 0xb6, 0x58, 0xf4, 0x7b, 0xc6, 0x08, 0xef, 0x7e, 0xac, 0x5b, 0xda, 0x54, 0x55, + 0x16, 0x41, 0x21, 0x17, 0x6a, 0xb7, 0x48, 0x53, 0x63, 0x64, 0x90, 0x81, 0x97, 0x1c, 0x67, 0x3e, + 0xe1, 0xf7, 0xcb, 0x56, 0x1f, 0x57, 0x16, 0xe9, 0xb2, 0x4d, 0x55, 0x76, 0x01, 0x12, 0x72, 0xd7, + 0x95, 0x77, 0xae, 0x28, 0xfa, 0xab, 0x0c, 0x80, 0xb0, 0xf5, 0xfe, 0x8e, 0xc1, 0x33, 0x76, 0x8a, + 0x53, 0x6f, 0x48, 0xd4, 0xf6, 0xd6, 0xba, 0xef, 0x05, 0xee, 0xef, 0xb9, 0xf5, 0x89, 0x1f, 0xf2, + 0x60, 0xd4, 0xb3, 0xfb, 0x34, 0xd6, 0x32, 0xd5, 0x3f, 0x6d, 0x36, 0x38, 0x71, 0xf8, 0x79, 0x4a, + 0x98, 0xbd, 0x43, 0xfa, 0xb3, 0xf1, 0x16, 0x38, 0xc8, 0xad, 0x89, 0xe3, 0x97, 0x84, 0x08, 0x74, + 0x72, 0x16, 0x72, 0x89, 0x5e, 0xfe, 0x7f, 0xe8, 0x05, 0x0e, 0x72, 0x6b, 0xe2, 0x28, 0xd0, 0x7f, + 0x30, 0xc0, 0x26, 0x93, 0xc2, 0xd4, 0x1d, 0x7b, 0x7d, 0x29, 0x4d, 0x2f, 0x95, 0xbd, 0x99, 0x15, + 0xa9, 0x1a, 0x7b, 0xf1, 0x20, 0x97, 0x29, 0xba, 0xfb, 0xe9, 0x75, 0x6e, 0x19, 0x93, 0xdc, 0x42, + 0xba, 0xab, 0xe5, 0x05, 0x90, 0x6b, 0xb2, 0x25, 0x28, 0xe8, 0x47, 0x03, 0xac, 0x4d, 0x77, 0x05, + 0x77, 0xc1, 0x0a, 0xa7, 0x27, 0x24, 0xd1, 0x0f, 0x64, 0xc3, 0xd6, 0xef, 0x5e, 0x3c, 0xb9, 0x29, + 0xa3, 0x6d, 0x1a, 0x26, 0xdd, 0x86, 0xde, 0xea, 0x73, 0xbd, 0x55, 0x91, 0x85, 0x5c, 0x95, 0x0d, + 0x0f, 0xc1, 0xaa, 0xe2, 0xa1, 0x87, 0xf9, 0xee, 0x09, 0xc3, 0xdc, 0x4b, 0xf8, 0x24, 0xb7, 0x3e, + 0x50, 0xb0, 0x0a, 0x05, 0xb9, 0x1a, 0x0e, 0xfd, 0x5c, 0x05, 0x55, 0xc1, 0x16, 0xbe, 0x06, 0x35, + 0x3c, 0x18, 0x64, 0x84, 0x31, 0xad, 0x06, 0x38, 0xc9, 0xad, 0x17, 0x2a, 0x49, 0x5f, 0x20, 0xb7, + 0x08, 0x81, 0x2f, 0x40, 0x39, 0x1c, 0x48, 0x2e, 0x55, 0xb7, 0x1c, 0x0e, 0xe0, 0x10, 0xd4, 0xa5, + 0xfe, 0xee, 0xcd, 0x7f, 0x6b, 0xb9, 0x90, 0xf5, 0xc4, 0x1f, 0x3c, 0xa0, 0xe2, 0x53, 0xea, 0xcd, + 0x61, 0x21, 0x17, 0xa4, 0x33, 0xd1, 0x7e, 0x0d, 0x1a, 0xc3, 0x11, 0x1f, 0x65, 0x44, 0x85, 0xf8, + 0x74, 0x4c, 0xb2, 0x84, 0x66, 0x66, 0x55, 0x52, 0xb6, 0x66, 0x50, 0x8b, 0xa2, 0x90, 0x0b, 0x95, + 0x5b, 0x30, 0xf8, 0x4a, 0x3b, 0xe1, 0x11, 0x78, 0xce, 0x29, 0xc7, 0x91, 0xc7, 0x02, 0x9c, 0x11, + 0x66, 0xae, 0xfc, 0xd7, 0xa2, 0x36, 0x35, 0xe9, 0x97, 0xc5, 0xa2, 0x66, 0xc9, 0xc8, 0xad, 0x4b, + 0xf3, 0x40, 0x5a, 0xf0, 0x58, 0x4f, 0x05, 0x0b, 0x29, 0x30, 0x73, 0xf5, 0x71, 0xcf, 0xbb, 0xa9, + 0xf1, 0xa1, 0xc2, 0x9f, 0x43, 0xd0, 0xb3, 0x90, 0x61, 0x0c, 0x06, 0x05, 0x71, 0xad, 0x8c, 0x9a, + 0x9c, 0xc1, 0xee, 0x93, 0x95, 0x71, 0xaf, 0x8f, 0x42, 0x1f, 0xaa, 0x0f, 0x25, 0xef, 0xb7, 0xeb, + 0xdf, 0x5f, 0x59, 0xa5, 0xcb, 0x2b, 0xab, 0xf4, 0xcb, 0x4f, 0xed, 0x15, 0x41, 0x74, 0xaf, 0x7b, + 0x74, 0x7d, 0xdb, 0x32, 0x6e, 0x6e, 0x5b, 0xc6, 0x9f, 0xb7, 0x2d, 0xe3, 0xe2, 0xae, 0x55, 0xba, + 0xb9, 0x6b, 0x95, 0x7e, 0xbb, 0x6b, 0x95, 0xbe, 0x7b, 0x37, 0x57, 0x58, 0x77, 0xda, 0x8e, 0x70, + 0x8f, 0x15, 0x86, 0x33, 0xee, 0x7c, 0xe1, 0x9c, 0x2d, 0xff, 0x43, 0xed, 0xad, 0xca, 0x8f, 0xfc, + 0x67, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xc4, 0xe9, 0x0d, 0x7c, 0x07, 0x00, 0x00, +} + +func (m *SmoothWeightChangeParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SmoothWeightChangeParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SmoothWeightChangeParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.TargetPoolWeights) > 0 { + for iNdEx := len(m.TargetPoolWeights) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TargetPoolWeights[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.InitialPoolWeights) > 0 { + for iNdEx := len(m.InitialPoolWeights) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InitialPoolWeights[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + n1, err1 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintBalancerPool(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x12 + n2, err2 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintBalancerPool(dAtA, i, uint64(n2)) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PoolParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PoolParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PoolParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SmoothWeightChangeParams != nil { + { + size, err := m.SmoothWeightChangeParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + { + size := m.ExitFee.Size() + i -= size + if _, err := m.ExitFee.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size := m.SwapFee.Size() + i -= size + if _, err := m.SwapFee.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *PoolAsset) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PoolAsset) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PoolAsset) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.Weight.Size() + i -= size + if _, err := m.Weight.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Token.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Pool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Pool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.TotalWeight.Size() + i -= size + if _, err := m.TotalWeight.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + if len(m.PoolAssets) > 0 { + for iNdEx := len(m.PoolAssets) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PoolAssets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + } + { + size, err := m.TotalShares.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + if len(m.FuturePoolGovernor) > 0 { + i -= len(m.FuturePoolGovernor) + copy(dAtA[i:], m.FuturePoolGovernor) + i = encodeVarintBalancerPool(dAtA, i, uint64(len(m.FuturePoolGovernor))) + i-- + dAtA[i] = 0x22 + } + { + size, err := m.PoolParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintBalancerPool(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if m.Id != 0 { + i = encodeVarintBalancerPool(dAtA, i, uint64(m.Id)) + i-- + dAtA[i] = 0x10 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintBalancerPool(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintBalancerPool(dAtA []byte, offset int, v uint64) int { + offset -= sovBalancerPool(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *SmoothWeightChangeParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovBalancerPool(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration) + n += 1 + l + sovBalancerPool(uint64(l)) + if len(m.InitialPoolWeights) > 0 { + for _, e := range m.InitialPoolWeights { + l = e.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + } + } + if len(m.TargetPoolWeights) > 0 { + for _, e := range m.TargetPoolWeights { + l = e.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + } + } + return n +} + +func (m *PoolParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.SwapFee.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + l = m.ExitFee.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + if m.SmoothWeightChangeParams != nil { + l = m.SmoothWeightChangeParams.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + } + return n +} + +func (m *PoolAsset) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Token.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + l = m.Weight.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + return n +} + +func (m *Pool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovBalancerPool(uint64(l)) + } + if m.Id != 0 { + n += 1 + sovBalancerPool(uint64(m.Id)) + } + l = m.PoolParams.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + l = len(m.FuturePoolGovernor) + if l > 0 { + n += 1 + l + sovBalancerPool(uint64(l)) + } + l = m.TotalShares.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + if len(m.PoolAssets) > 0 { + for _, e := range m.PoolAssets { + l = e.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + } + } + l = m.TotalWeight.Size() + n += 1 + l + sovBalancerPool(uint64(l)) + return n +} + +func sovBalancerPool(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozBalancerPool(x uint64) (n int) { + return sovBalancerPool(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *SmoothWeightChangeParams) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SmoothWeightChangeParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SmoothWeightChangeParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InitialPoolWeights", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InitialPoolWeights = append(m.InitialPoolWeights, PoolAsset{}) + if err := m.InitialPoolWeights[len(m.InitialPoolWeights)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetPoolWeights", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TargetPoolWeights = append(m.TargetPoolWeights, PoolAsset{}) + if err := m.TargetPoolWeights[len(m.TargetPoolWeights)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipBalancerPool(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBalancerPool + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PoolParams) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PoolParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PoolParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SwapFee", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + 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 ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SwapFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExitFee", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + 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 ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ExitFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SmoothWeightChangeParams", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SmoothWeightChangeParams == nil { + m.SmoothWeightChangeParams = &SmoothWeightChangeParams{} + } + if err := m.SmoothWeightChangeParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipBalancerPool(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBalancerPool + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PoolAsset) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PoolAsset: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PoolAsset: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Token", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Token.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + 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 ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Weight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipBalancerPool(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBalancerPool + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Pool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Pool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Pool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + 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 ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + m.Id = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Id |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolParams", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.PoolParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FuturePoolGovernor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + 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 ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FuturePoolGovernor = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalShares", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TotalShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolAssets", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolAssets = append(m.PoolAssets, PoolAsset{}) + if err := m.PoolAssets[len(m.PoolAssets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalWeight", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowBalancerPool + } + 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 ErrInvalidLengthBalancerPool + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthBalancerPool + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.TotalWeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipBalancerPool(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthBalancerPool + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipBalancerPool(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowBalancerPool + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthBalancerPool + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupBalancerPool + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthBalancerPool + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthBalancerPool = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowBalancerPool = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupBalancerPool = fmt.Errorf("proto: unexpected end of group") +) diff --git a/tests/interchaintest/osmosistypes/gamm/balancer/codec.go b/tests/interchaintest/osmosistypes/gamm/balancer/codec.go new file mode 100644 index 0000000..0d7673f --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/balancer/codec.go @@ -0,0 +1,30 @@ +package balancer + +import ( + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgCreateBalancerPool{}, + &MsgMigrateSharesToFullRangeConcentratedPosition{}, + ) + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} + +var ( + amino = codec.NewLegacyAmino() + + // ModuleCdc references the global x/bank module codec. Note, the codec should + // ONLY be used in certain instances of tests and for JSON encoding as Amino is + // still used for that purpose. + // + // The actual codec used for serialization should be provided to x/staking and + // defined at the application level. + ModuleCdc = codec.NewAminoCodec(amino) +) diff --git a/tests/interchaintest/osmosistypes/gamm/balancer/msgs.go b/tests/interchaintest/osmosistypes/gamm/balancer/msgs.go new file mode 100644 index 0000000..75c7a7a --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/balancer/msgs.go @@ -0,0 +1,49 @@ +package balancer + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/types" +) + +const ( + TypeMsgCreateBalancerPool = "create_balancer_pool" + TypeMsgMigrateShares = "migrate_shares" +) + +var ( + _ sdk.Msg = &MsgCreateBalancerPool{} +) + +func (msg MsgCreateBalancerPool) Route() string { return types.RouterKey } +func (msg MsgCreateBalancerPool) Type() string { return TypeMsgCreateBalancerPool } +func (msg MsgCreateBalancerPool) ValidateBasic() error { return nil } + +func (msg MsgCreateBalancerPool) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgCreateBalancerPool) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} + +var _ sdk.Msg = &MsgMigrateSharesToFullRangeConcentratedPosition{} + +func (msg MsgMigrateSharesToFullRangeConcentratedPosition) Route() string { return types.RouterKey } +func (msg MsgMigrateSharesToFullRangeConcentratedPosition) Type() string { return TypeMsgMigrateShares } +func (msg MsgMigrateSharesToFullRangeConcentratedPosition) ValidateBasic() error { return nil } + +func (msg MsgMigrateSharesToFullRangeConcentratedPosition) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +func (msg MsgMigrateSharesToFullRangeConcentratedPosition) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + return []sdk.AccAddress{sender} +} diff --git a/tests/interchaintest/osmosistypes/gamm/balancer/pool.go b/tests/interchaintest/osmosistypes/gamm/balancer/pool.go new file mode 100644 index 0000000..9f8c589 --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/balancer/pool.go @@ -0,0 +1,45 @@ +package balancer + +import ( + "encoding/json" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type balancerPoolPretty struct { + Address sdk.AccAddress `json:"address" yaml:"address"` + Id uint64 `json:"id" yaml:"id"` + PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` + FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` + TotalWeight sdk.Dec `json:"total_weight" yaml:"total_weight"` + TotalShares sdk.Coin `json:"total_shares" yaml:"total_shares"` + PoolAssets []PoolAsset `json:"pool_assets" yaml:"pool_assets"` +} + +func (p Pool) String() string { + out, err := p.MarshalJSON() + if err != nil { + panic(err) + } + return string(out) +} + +// MarshalJSON returns the JSON representation of a Pool. +func (p Pool) MarshalJSON() ([]byte, error) { + accAddr, err := sdk.AccAddressFromBech32(p.Address) + if err != nil { + return nil, err + } + + decTotalWeight := sdk.NewDecFromInt(p.TotalWeight) + + return json.Marshal(balancerPoolPretty{ + Address: accAddr, + Id: p.Id, + PoolParams: p.PoolParams, + FuturePoolGovernor: p.FuturePoolGovernor, + TotalWeight: decTotalWeight, + TotalShares: p.TotalShares, + PoolAssets: p.PoolAssets, + }) +} diff --git a/tests/interchaintest/osmosistypes/gamm/balancer/tx.pb.go b/tests/interchaintest/osmosistypes/gamm/balancer/tx.pb.go new file mode 100644 index 0000000..4429aeb --- /dev/null +++ b/tests/interchaintest/osmosistypes/gamm/balancer/tx.pb.go @@ -0,0 +1,1352 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: osmosis/gamm/pool-models/balancer/tx/tx.proto + +package balancer + +import ( + context "context" + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" + time "time" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// ===================== MsgCreatePool +type MsgCreateBalancerPool struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + PoolParams *PoolParams `protobuf:"bytes,2,opt,name=pool_params,json=poolParams,proto3" json:"pool_params,omitempty" yaml:"pool_params"` + PoolAssets []PoolAsset `protobuf:"bytes,3,rep,name=pool_assets,json=poolAssets,proto3" json:"pool_assets"` + FuturePoolGovernor string `protobuf:"bytes,4,opt,name=future_pool_governor,json=futurePoolGovernor,proto3" json:"future_pool_governor,omitempty" yaml:"future_pool_governor"` +} + +func (m *MsgCreateBalancerPool) Reset() { *m = MsgCreateBalancerPool{} } +func (m *MsgCreateBalancerPool) String() string { return proto.CompactTextString(m) } +func (*MsgCreateBalancerPool) ProtoMessage() {} +func (*MsgCreateBalancerPool) Descriptor() ([]byte, []int) { + return fileDescriptor_0647ee155de97433, []int{0} +} +func (m *MsgCreateBalancerPool) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateBalancerPool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateBalancerPool.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateBalancerPool) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateBalancerPool.Merge(m, src) +} +func (m *MsgCreateBalancerPool) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateBalancerPool) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateBalancerPool.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateBalancerPool proto.InternalMessageInfo + +func (m *MsgCreateBalancerPool) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgCreateBalancerPool) GetPoolParams() *PoolParams { + if m != nil { + return m.PoolParams + } + return nil +} + +func (m *MsgCreateBalancerPool) GetPoolAssets() []PoolAsset { + if m != nil { + return m.PoolAssets + } + return nil +} + +func (m *MsgCreateBalancerPool) GetFuturePoolGovernor() string { + if m != nil { + return m.FuturePoolGovernor + } + return "" +} + +// Returns the poolID +type MsgCreateBalancerPoolResponse struct { + PoolID uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` +} + +func (m *MsgCreateBalancerPoolResponse) Reset() { *m = MsgCreateBalancerPoolResponse{} } +func (m *MsgCreateBalancerPoolResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateBalancerPoolResponse) ProtoMessage() {} +func (*MsgCreateBalancerPoolResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0647ee155de97433, []int{1} +} +func (m *MsgCreateBalancerPoolResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateBalancerPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateBalancerPoolResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateBalancerPoolResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateBalancerPoolResponse.Merge(m, src) +} +func (m *MsgCreateBalancerPoolResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateBalancerPoolResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateBalancerPoolResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateBalancerPoolResponse proto.InternalMessageInfo + +func (m *MsgCreateBalancerPoolResponse) GetPoolID() uint64 { + if m != nil { + return m.PoolID + } + return 0 +} + +// ===================== MsgMigrateSharesToFullRangeConcentratedPosition +type MsgMigrateSharesToFullRangeConcentratedPosition struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + SharesToMigrate types.Coin `protobuf:"bytes,2,opt,name=shares_to_migrate,json=sharesToMigrate,proto3" json:"shares_to_migrate" yaml:"shares_to_migrate"` +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) Reset() { + *m = MsgMigrateSharesToFullRangeConcentratedPosition{} +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) String() string { + return proto.CompactTextString(m) +} +func (*MsgMigrateSharesToFullRangeConcentratedPosition) ProtoMessage() {} +func (*MsgMigrateSharesToFullRangeConcentratedPosition) Descriptor() ([]byte, []int) { + return fileDescriptor_0647ee155de97433, []int{2} +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPosition.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPosition.Merge(m, src) +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) XXX_Size() int { + return m.Size() +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) XXX_DiscardUnknown() { + xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPosition.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPosition proto.InternalMessageInfo + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) GetSharesToMigrate() types.Coin { + if m != nil { + return m.SharesToMigrate + } + return types.Coin{} +} + +type MsgMigrateSharesToFullRangeConcentratedPositionResponse struct { + Amount0 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount0,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount0" yaml:"amount0"` + Amount1 github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=amount1,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount1" yaml:"amount1"` + LiquidityCreated github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=liquidity_created,json=liquidityCreated,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_created" yaml:"liquidity_created"` + JoinTime time.Time `protobuf:"bytes,4,opt,name=join_time,json=joinTime,proto3,stdtime" json:"join_time" yaml:"join_time"` +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) Reset() { + *m = MsgMigrateSharesToFullRangeConcentratedPositionResponse{} +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) String() string { + return proto.CompactTextString(m) +} +func (*MsgMigrateSharesToFullRangeConcentratedPositionResponse) ProtoMessage() {} +func (*MsgMigrateSharesToFullRangeConcentratedPositionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0647ee155de97433, []int{3} +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPositionResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPositionResponse.Merge(m, src) +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPositionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgMigrateSharesToFullRangeConcentratedPositionResponse proto.InternalMessageInfo + +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) GetJoinTime() time.Time { + if m != nil { + return m.JoinTime + } + return time.Time{} +} + +func init() { + proto.RegisterType((*MsgCreateBalancerPool)(nil), "osmosis.gamm.poolmodels.balancer.v1beta1.MsgCreateBalancerPool") + proto.RegisterType((*MsgCreateBalancerPoolResponse)(nil), "osmosis.gamm.poolmodels.balancer.v1beta1.MsgCreateBalancerPoolResponse") + proto.RegisterType((*MsgMigrateSharesToFullRangeConcentratedPosition)(nil), "osmosis.gamm.poolmodels.balancer.v1beta1.MsgMigrateSharesToFullRangeConcentratedPosition") + proto.RegisterType((*MsgMigrateSharesToFullRangeConcentratedPositionResponse)(nil), "osmosis.gamm.poolmodels.balancer.v1beta1.MsgMigrateSharesToFullRangeConcentratedPositionResponse") +} + +func init() { + proto.RegisterFile("osmosis/gamm/pool-models/balancer/tx/tx.proto", fileDescriptor_0647ee155de97433) +} + +var fileDescriptor_0647ee155de97433 = []byte{ + // 721 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x95, 0xcf, 0x6e, 0xd3, 0x4a, + 0x14, 0xc6, 0xe3, 0xa6, 0x4a, 0x6f, 0x27, 0xba, 0xf7, 0xb6, 0x56, 0xef, 0x55, 0x08, 0x10, 0x47, + 0x46, 0x42, 0x41, 0x22, 0x33, 0x24, 0x80, 0x90, 0xd8, 0x14, 0xdc, 0xaa, 0x55, 0x91, 0x22, 0x15, + 0x53, 0x16, 0xed, 0x26, 0x9a, 0xc4, 0x53, 0xd7, 0x60, 0x7b, 0x82, 0x67, 0x52, 0xda, 0xb7, 0xe8, + 0x86, 0x2d, 0xcf, 0xc1, 0x96, 0x05, 0x52, 0x97, 0x5d, 0x22, 0x16, 0x06, 0xa5, 0x5b, 0x56, 0x79, + 0x02, 0x34, 0x7f, 0xec, 0x16, 0x48, 0x05, 0x51, 0xc5, 0x2a, 0xf6, 0xcc, 0x77, 0x7e, 0xdf, 0x99, + 0x33, 0xe7, 0x38, 0xa0, 0x49, 0x59, 0x44, 0x59, 0xc0, 0x90, 0x8f, 0xa3, 0x08, 0x0d, 0x28, 0x0d, + 0x9b, 0x11, 0xf5, 0x48, 0xc8, 0x50, 0x0f, 0x87, 0x38, 0xee, 0x93, 0x04, 0xf1, 0x03, 0xc4, 0x0f, + 0xe0, 0x20, 0xa1, 0x9c, 0x9a, 0x0d, 0x2d, 0x87, 0x42, 0x0e, 0x85, 0x5c, 0xa9, 0x61, 0xa6, 0x86, + 0xfb, 0xad, 0x1e, 0xe1, 0xb8, 0x55, 0x5d, 0xf2, 0xa9, 0x4f, 0x65, 0x10, 0x12, 0x4f, 0x2a, 0xbe, + 0x7a, 0xef, 0xd7, 0x76, 0xd9, 0xc3, 0x26, 0xa5, 0xa1, 0x8e, 0xaa, 0xf5, 0x65, 0x18, 0xea, 0x61, + 0x46, 0x90, 0x36, 0x40, 0x7d, 0x1a, 0xc4, 0x7a, 0xdf, 0xf2, 0x29, 0xf5, 0x43, 0x82, 0xe4, 0x5b, + 0x6f, 0xb8, 0x8b, 0x78, 0x10, 0x11, 0xc6, 0x71, 0x34, 0x50, 0x02, 0xfb, 0xdd, 0x0c, 0xf8, 0xaf, + 0xc3, 0xfc, 0x95, 0x84, 0x60, 0x4e, 0x9c, 0x73, 0x06, 0xe6, 0x2d, 0x50, 0x62, 0x24, 0xf6, 0x48, + 0x52, 0x31, 0xea, 0x46, 0x63, 0xde, 0x59, 0x1c, 0xa7, 0xd6, 0xdf, 0x87, 0x38, 0x0a, 0x1f, 0xda, + 0x6a, 0xdd, 0x76, 0xb5, 0xc0, 0xdc, 0x06, 0x65, 0x91, 0x70, 0x77, 0x80, 0x13, 0x1c, 0xb1, 0xca, + 0x4c, 0xdd, 0x68, 0x94, 0xdb, 0x75, 0xf8, 0x5d, 0x45, 0x74, 0x72, 0x50, 0xb0, 0x37, 0xa5, 0xce, + 0xf9, 0x7f, 0x9c, 0x5a, 0xa6, 0x22, 0x9e, 0x0b, 0xb7, 0x5d, 0x30, 0xc8, 0x35, 0xe6, 0x9a, 0x46, + 0x63, 0xc6, 0x08, 0x67, 0x95, 0x62, 0xbd, 0xd8, 0x28, 0xb7, 0xad, 0x8b, 0xd1, 0x8f, 0x85, 0xce, + 0x99, 0x3d, 0x4e, 0xad, 0x82, 0xe2, 0xc8, 0x05, 0x66, 0x3e, 0x05, 0x4b, 0xbb, 0x43, 0x3e, 0x4c, + 0x48, 0x57, 0xe2, 0x7c, 0xba, 0x4f, 0x92, 0x98, 0x26, 0x95, 0x59, 0x79, 0x36, 0x6b, 0x9c, 0x5a, + 0x57, 0x55, 0x26, 0x93, 0x54, 0xb6, 0x6b, 0xaa, 0x65, 0xe1, 0xb0, 0x9e, 0x2d, 0xae, 0x82, 0xeb, + 0x13, 0x2b, 0xe7, 0x12, 0x36, 0xa0, 0x31, 0x23, 0xe6, 0x0d, 0x30, 0x27, 0x31, 0x81, 0x27, 0x4b, + 0x38, 0xeb, 0x80, 0x51, 0x6a, 0x95, 0x84, 0x64, 0x63, 0xd5, 0x2d, 0x89, 0xad, 0x0d, 0xcf, 0xfe, + 0x60, 0x00, 0xd4, 0x61, 0x7e, 0x27, 0xf0, 0x13, 0xcc, 0xc9, 0xb3, 0x3d, 0x9c, 0x10, 0xb6, 0x45, + 0xd7, 0x86, 0x61, 0xe8, 0xe2, 0xd8, 0x27, 0x2b, 0x34, 0xee, 0x93, 0x98, 0x8b, 0x3d, 0x6f, 0x93, + 0xb2, 0x80, 0x07, 0x34, 0x9e, 0xe6, 0x6a, 0x7c, 0xb0, 0xc8, 0x24, 0xb3, 0xcb, 0x69, 0x37, 0x52, + 0x26, 0xfa, 0x82, 0xae, 0x40, 0xd5, 0x3c, 0x50, 0x34, 0x4f, 0x5e, 0xc4, 0x15, 0x1a, 0xc4, 0x4e, + 0x5d, 0xd4, 0x6f, 0x9c, 0x5a, 0x15, 0x0d, 0xfd, 0x91, 0x60, 0xbb, 0xff, 0x32, 0x9d, 0xa9, 0x4e, + 0xdc, 0x7e, 0x5f, 0x04, 0x0f, 0xa6, 0x3c, 0x47, 0x5e, 0xa8, 0x1d, 0x30, 0x87, 0x23, 0x3a, 0x8c, + 0xf9, 0x1d, 0x7d, 0xa0, 0x47, 0xc2, 0xff, 0x53, 0x6a, 0xdd, 0xf4, 0x03, 0xbe, 0x37, 0xec, 0xc1, + 0x3e, 0x8d, 0x90, 0xee, 0x74, 0xf5, 0xd3, 0x64, 0xde, 0x4b, 0xc4, 0x0f, 0x07, 0x84, 0xc1, 0x8d, + 0x98, 0x8f, 0x53, 0xeb, 0x1f, 0x95, 0xa9, 0xc6, 0xd8, 0x6e, 0x06, 0x3c, 0x63, 0xb7, 0xe4, 0xb1, + 0x2f, 0xcd, 0x6e, 0xe5, 0xec, 0x96, 0xf9, 0x1a, 0x2c, 0x86, 0xc1, 0xab, 0x61, 0xe0, 0x05, 0xfc, + 0xb0, 0xdb, 0x97, 0x8d, 0xe0, 0x55, 0x8a, 0xd2, 0xe5, 0xc9, 0x14, 0x2e, 0xab, 0xa4, 0x7f, 0x56, + 0xeb, 0x9f, 0x80, 0xb6, 0xbb, 0x90, 0xaf, 0xa9, 0x66, 0xf3, 0xcc, 0xe7, 0x60, 0xfe, 0x05, 0x0d, + 0xe2, 0xae, 0x98, 0x66, 0xd9, 0xc2, 0xe5, 0x76, 0x15, 0xaa, 0x51, 0x87, 0xd9, 0xa8, 0xc3, 0xad, + 0x6c, 0xd4, 0x9d, 0x6b, 0xfa, 0x3a, 0x17, 0x94, 0x45, 0x1e, 0x6a, 0x1f, 0x7d, 0xb6, 0x0c, 0xf7, + 0x2f, 0xf1, 0x2e, 0xc4, 0xed, 0x37, 0x45, 0x50, 0xec, 0x30, 0xdf, 0x7c, 0x6b, 0x00, 0x73, 0xc2, + 0x17, 0x61, 0x19, 0xfe, 0xee, 0x37, 0x0e, 0x4e, 0x1c, 0x8c, 0xea, 0xfa, 0x25, 0x01, 0x79, 0xc3, + 0x7c, 0x35, 0xc0, 0xed, 0xa9, 0x26, 0x66, 0x7b, 0x2a, 0xe7, 0x69, 0xd0, 0x55, 0xfc, 0xc7, 0xd0, + 0xd9, 0x71, 0x9d, 0xed, 0xe3, 0x51, 0xcd, 0x38, 0x19, 0xd5, 0x8c, 0x2f, 0xa3, 0x9a, 0x71, 0x74, + 0x5a, 0x2b, 0x9c, 0x9c, 0xd6, 0x0a, 0x1f, 0x4f, 0x6b, 0x85, 0x9d, 0xe5, 0x73, 0xed, 0xa5, 0xd3, + 0x68, 0x86, 0xb8, 0xc7, 0xb2, 0x17, 0xb4, 0xdf, 0xba, 0x8f, 0x0e, 0x2e, 0xfe, 0x4f, 0xe9, 0x95, + 0x64, 0xbb, 0xdc, 0xfd, 0x16, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x46, 0x01, 0x17, 0xee, 0x06, 0x00, + 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + CreateBalancerPool(ctx context.Context, in *MsgCreateBalancerPool, opts ...grpc.CallOption) (*MsgCreateBalancerPoolResponse, error) + MigrateSharesToFullRangeConcentratedPosition(ctx context.Context, in *MsgMigrateSharesToFullRangeConcentratedPosition, opts ...grpc.CallOption) (*MsgMigrateSharesToFullRangeConcentratedPositionResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) CreateBalancerPool(ctx context.Context, in *MsgCreateBalancerPool, opts ...grpc.CallOption) (*MsgCreateBalancerPoolResponse, error) { + out := new(MsgCreateBalancerPoolResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.poolmodels.balancer.v1beta1.Msg/CreateBalancerPool", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) MigrateSharesToFullRangeConcentratedPosition(ctx context.Context, in *MsgMigrateSharesToFullRangeConcentratedPosition, opts ...grpc.CallOption) (*MsgMigrateSharesToFullRangeConcentratedPositionResponse, error) { + out := new(MsgMigrateSharesToFullRangeConcentratedPositionResponse) + err := c.cc.Invoke(ctx, "/osmosis.gamm.poolmodels.balancer.v1beta1.Msg/MigrateSharesToFullRangeConcentratedPosition", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + CreateBalancerPool(context.Context, *MsgCreateBalancerPool) (*MsgCreateBalancerPoolResponse, error) + MigrateSharesToFullRangeConcentratedPosition(context.Context, *MsgMigrateSharesToFullRangeConcentratedPosition) (*MsgMigrateSharesToFullRangeConcentratedPositionResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) CreateBalancerPool(ctx context.Context, req *MsgCreateBalancerPool) (*MsgCreateBalancerPoolResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateBalancerPool not implemented") +} +func (*UnimplementedMsgServer) MigrateSharesToFullRangeConcentratedPosition(ctx context.Context, req *MsgMigrateSharesToFullRangeConcentratedPosition) (*MsgMigrateSharesToFullRangeConcentratedPositionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method MigrateSharesToFullRangeConcentratedPosition not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_CreateBalancerPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCreateBalancerPool) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).CreateBalancerPool(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.poolmodels.balancer.v1beta1.Msg/CreateBalancerPool", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).CreateBalancerPool(ctx, req.(*MsgCreateBalancerPool)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_MigrateSharesToFullRangeConcentratedPosition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgMigrateSharesToFullRangeConcentratedPosition) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).MigrateSharesToFullRangeConcentratedPosition(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/osmosis.gamm.poolmodels.balancer.v1beta1.Msg/MigrateSharesToFullRangeConcentratedPosition", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).MigrateSharesToFullRangeConcentratedPosition(ctx, req.(*MsgMigrateSharesToFullRangeConcentratedPosition)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "osmosis.gamm.poolmodels.balancer.v1beta1.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateBalancerPool", + Handler: _Msg_CreateBalancerPool_Handler, + }, + { + MethodName: "MigrateSharesToFullRangeConcentratedPosition", + Handler: _Msg_MigrateSharesToFullRangeConcentratedPosition_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "osmosis/gamm/pool-models/balancer/tx/tx.proto", +} + +func (m *MsgCreateBalancerPool) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateBalancerPool) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateBalancerPool) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.FuturePoolGovernor) > 0 { + i -= len(m.FuturePoolGovernor) + copy(dAtA[i:], m.FuturePoolGovernor) + i = encodeVarintTx(dAtA, i, uint64(len(m.FuturePoolGovernor))) + i-- + dAtA[i] = 0x22 + } + if len(m.PoolAssets) > 0 { + for iNdEx := len(m.PoolAssets) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PoolAssets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.PoolParams != nil { + { + size, err := m.PoolParams.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateBalancerPoolResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateBalancerPoolResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateBalancerPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PoolID != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.PoolID)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.SharesToMigrate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.JoinTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime):]) + if err3 != nil { + return 0, err3 + } + i -= n3 + i = encodeVarintTx(dAtA, i, uint64(n3)) + i-- + dAtA[i] = 0x22 + { + size := m.LiquidityCreated.Size() + i -= size + if _, err := m.LiquidityCreated.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.Amount1.Size() + i -= size + if _, err := m.Amount1.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size := m.Amount0.Size() + i -= size + if _, err := m.Amount0.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateBalancerPool) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.PoolParams != nil { + l = m.PoolParams.Size() + n += 1 + l + sovTx(uint64(l)) + } + if len(m.PoolAssets) > 0 { + for _, e := range m.PoolAssets { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + l = len(m.FuturePoolGovernor) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgCreateBalancerPoolResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PoolID != 0 { + n += 1 + sovTx(uint64(m.PoolID)) + } + return n +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.SharesToMigrate.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Amount0.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.Amount1.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.LiquidityCreated.Size() + n += 1 + l + sovTx(uint64(l)) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.JoinTime) + n += 1 + l + sovTx(uint64(l)) + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateBalancerPool) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateBalancerPool: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateBalancerPool: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolParams", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PoolParams == nil { + m.PoolParams = &PoolParams{} + } + if err := m.PoolParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolAssets", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolAssets = append(m.PoolAssets, PoolAsset{}) + if err := m.PoolAssets[len(m.PoolAssets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FuturePoolGovernor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FuturePoolGovernor = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateBalancerPoolResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateBalancerPoolResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateBalancerPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolID", wireType) + } + m.PoolID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolID |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgMigrateSharesToFullRangeConcentratedPosition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgMigrateSharesToFullRangeConcentratedPosition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgMigrateSharesToFullRangeConcentratedPosition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SharesToMigrate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SharesToMigrate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgMigrateSharesToFullRangeConcentratedPositionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgMigrateSharesToFullRangeConcentratedPositionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgMigrateSharesToFullRangeConcentratedPositionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount0", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Amount0.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount1", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Amount1.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LiquidityCreated", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + 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 ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LiquidityCreated.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field JoinTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.JoinTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index f3b721e..fc38743 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" interchaintest "github.com/strangelove-ventures/interchaintest/v4" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/ibc" @@ -306,7 +307,63 @@ func TestPacketForwardMiddleware(t *testing.T) { // secondHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsosmosisChannel.PortID, feeabsosmosisChannel.ChannelID).String() // thirdHopEscrowAccount := transfertypes.GetEscrowAddress(osmosisgaiaChannel.PortID, osmosisgaiaChannel.ChannelID).String() - t.Run("forward a->b->a", func(t *testing.T) { + t.Run("xcs", func(t *testing.T) { + amountToSend := int64(1_000_000_000) + // Send Gaia uatom to Osmosis + gaiaUserBalance, err := gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) + require.NoError(t, err) + require.Equal(t, userFunds, gaiaUserBalance) + dstAddress := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) + transfer := ibc.WalletAmount{ + Address: dstAddress, + Denom: gaia.Config().Denom, + Amount: amountToSend, + } + + tx, err := gaia.SendIBCTransfer(ctx, channGaiaOsmosis.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) + require.NoError(t, err) + require.NoError(t, tx.Validate()) + + require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) + require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) + + expectedBalance := gaiaUserBalance - amountToSend + gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) + require.NoError(t, err) + require.Equal(t, expectedBalance, gaiaUserBalance) + // Send Gaia uatom to Feeabs + + // gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) + // require.NoError(t, err) + + // dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) + // transfer = ibc.WalletAmount{ + // Address: dstAddress, + // Denom: gaia.Config().Denom, + // Amount: amountToSend, + // } + + // tx, err := gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID) + + // Send Feeabs stake to Osmosis + + // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis + denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisGaia.PortID, channOsmosisGaia.ChannelID, gaia.Config().Denom)) + ibcDenom := denomTrace.IBCDenom() + + poolID, err := cosmos.OsmosisCreatePool(osmosis, ctx, osmosisUser.KeyName, cosmos.OsmosisPoolParams{ + Weights: fmt.Sprintf("5%s,5%s", ibcDenom, osmosis.Config().Denom), + InitialDeposit: fmt.Sprintf("500000000%s,500000000%s", ibcDenom, osmosis.Config().Denom), + SwapFee: "0.01", + ExitFee: "0", + FutureGovernor: "", + }) + require.NoError(t, err) + require.Equal(t, poolID, "1") + + ibcToken, err := osmosis.GetBalance(ctx, osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix), ibcDenom) + require.NoError(t, err) + require.Equal(t, int64(500_000_000), ibcToken) // Setup contract on Osmosis // Store code crosschain Registry crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") @@ -329,17 +386,8 @@ func TestPacketForwardMiddleware(t *testing.T) { txHash, err := osmosis.ExecuteContract(ctx, osmosisUser.KeyName, address, msg) require.NoError(t, err) _ = txHash - tx, _ := osmosis.GetTransaction(txHash) - fmt.Printf("tx----------------: %v", tx) - - // Send Gaia uatom to Osmosis - - // Send Gaia uatom to Feeabs - - // Send Feeabs stake to Osmosis - - // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis - + // txs, _ := osmosis.GetTransaction(txHash) + // fmt.Printf("txs----------------: %v", txs) // Swap Feeabs(uatom) to Osmosis }) } diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 189239f..cf16c26 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -2,6 +2,7 @@ package interchaintest import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + balancertypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/balancer" gammtypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/types" feeabstype "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos/wasm" @@ -58,6 +59,7 @@ func osmosisEncoding() *simappparams.EncodingConfig { cfg := wasm.WasmEncoding() gammtypes.RegisterInterfaces(cfg.InterfaceRegistry) + balancertypes.RegisterInterfaces(cfg.InterfaceRegistry) return cfg } From 0c09bafb6b7359aff8b69bffa42feff732a5b1ed Mon Sep 17 00:00:00 2001 From: GnaD Date: Tue, 18 Apr 2023 17:36:42 +0700 Subject: [PATCH 10/50] add setup contract --- tests/interchaintest/packet_foward_test.go | 72 +++++++++++++--------- tests/interchaintest/setup.go | 2 +- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index fc38743..c5051ac 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -215,6 +215,11 @@ func TestPacketForwardMiddleware(t *testing.T) { channGaiaFeeabs := channsGaia[0] require.NotEmpty(t, channGaiaFeeabs.ChannelID) + fmt.Println("-----------------------------------") + fmt.Printf("channFeeabsOsmosis: %s\n", channFeeabsOsmosis.ChannelID) + fmt.Printf("channFeeabsGaia: %s\n", channFeeabsGaia.ChannelID) + fmt.Printf("channGaiaFeeabs: %s - %s\n", channGaiaFeeabs.ChannelID, channGaiaFeeabs.Counterparty.ChannelID) + fmt.Println("-----------------------------------") //rly osmo-gaia // Generate new path err = r.GeneratePath(ctx, eRep, osmosis.Config().ChainID, gaia.Config().ChainID, pathOsmosisGaia) @@ -288,27 +293,9 @@ func TestPacketForwardMiddleware(t *testing.T) { _ = gaiaUser _ = osmosisUser - // const transferAmount int64 = 100000 - - // Compose the prefixed denoms and ibc denom for asserting balances - // firstHopDenom := transfertypes.GetPrefixedDenom(gaiafeeabsChannel.PortID, gaiafeeabsChannel.ChannelID, feeabs.Config().Denom) - // secondHopDenom := transfertypes.GetPrefixedDenom(osmosisfeeabsChannel.PortID, osmosisfeeabsChannel.ChannelID, firstHopDenom) - // thirdHopDenom := transfertypes.GetPrefixedDenom(gaiaosmosisChannel.PortID, gaiaosmosisChannel.ChannelID, secondHopDenom) - - // firstHopDenomTrace := transfertypes.ParseDenomTrace(firstHopDenom) - // secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) - // thirdHopDenomTrace := transfertypes.ParseDenomTrace(thirdHopDenom) - - // firstHopIBCDenom := firstHopDenomTrace.IBCDenom() - // secondHopIBCDenom := secondHopDenomTrace.IBCDenom() - // thirdHopIBCDenom := thirdHopDenomTrace.IBCDenom() - - // firstHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsgaiaChannel.PortID, feeabsgaiaChannel.ChannelID).String() - // secondHopEscrowAccount := transfertypes.GetEscrowAddress(feeabsosmosisChannel.PortID, feeabsosmosisChannel.ChannelID).String() - // thirdHopEscrowAccount := transfertypes.GetEscrowAddress(osmosisgaiaChannel.PortID, osmosisgaiaChannel.ChannelID).String() + const amountToSend = int64(1_000_000_000) t.Run("xcs", func(t *testing.T) { - amountToSend := int64(1_000_000_000) // Send Gaia uatom to Osmosis gaiaUserBalance, err := gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) require.NoError(t, err) @@ -332,20 +319,49 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.Equal(t, expectedBalance, gaiaUserBalance) // Send Gaia uatom to Feeabs + gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) + require.NoError(t, err) - // gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) - // require.NoError(t, err) + dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) + transfer = ibc.WalletAmount{ + Address: dstAddress, + Denom: gaia.Config().Denom, + Amount: amountToSend, + } - // dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) - // transfer = ibc.WalletAmount{ - // Address: dstAddress, - // Denom: gaia.Config().Denom, - // Amount: amountToSend, - // } + tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) + require.NoError(t, err) + require.NoError(t, tx.Validate()) - // tx, err := gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID) + require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + expectedBalance = gaiaUserBalance - amountToSend + gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) + require.NoError(t, err) + require.Equal(t, expectedBalance, gaiaUserBalance) // Send Feeabs stake to Osmosis + feeabsUserBalance, err := feeabs.GetBalance(ctx, feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix), feeabs.Config().Denom) + require.NoError(t, err) + + dstAddress = osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) + transfer = ibc.WalletAmount{ + Address: dstAddress, + Denom: feeabs.Config().Denom, + Amount: amountToSend, + } + + tx, err = feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{}) + require.NoError(t, err) + require.NoError(t, tx.Validate()) + + require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) + require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) + + expectedBalance = feeabsUserBalance - amountToSend + feeabsUserBalance, err = feeabs.GetBalance(ctx, feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix), feeabs.Config().Denom) + require.NoError(t, err) + require.Equal(t, expectedBalance, feeabsUserBalance) // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisGaia.PortID, channOsmosisGaia.ChannelID, gaia.Config().Denom)) diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index cf16c26..4681c6e 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -14,7 +14,7 @@ var ( feeabsImage = ibc.DockerImage{ Repository: "ghcr.io/notional-labs/fee-abstraction", - Version: "2.0.1", + Version: "2.0.3", UidGid: "1025:1025", } From c4b171816eee63f3278aa329dda3d563d4c535e7 Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 01:33:04 +0700 Subject: [PATCH 11/50] add create pool --- go.work.sum | 2 ++ tests/interchaintest/go.mod | 2 +- tests/interchaintest/go.sum | 5 +-- tests/interchaintest/packet_foward_test.go | 42 ++++++++-------------- 4 files changed, 20 insertions(+), 31 deletions(-) diff --git a/go.work.sum b/go.work.sum index a26fd13..8fd9825 100644 --- a/go.work.sum +++ b/go.work.sum @@ -779,6 +779,8 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJ github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/notional-labs/interchaintest/v4 v4.0.0 h1:tIR5AkZwhjmzZjm+gXPodFZFP6rSzBDbJZjRMMbjDbM= +github.com/notional-labs/interchaintest/v4 v4.0.0/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index 1096536..f04402d 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -189,9 +189,9 @@ replace ( // interchaintest supports ICS features so we need this for now github.com/cosmos/cosmos-sdk => github.com/cosmos/cosmos-sdk v0.45.13-ics github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 - // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ + github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.0 // use informal system fork of tendermint github.com/tendermint/tendermint => github.com/informalsystems/tendermint v0.34.26 diff --git a/tests/interchaintest/go.sum b/tests/interchaintest/go.sum index c28dc55..ce08e7b 100644 --- a/tests/interchaintest/go.sum +++ b/tests/interchaintest/go.sum @@ -583,6 +583,8 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/notional-labs/fee-abstraction/v2 v2.0.1 h1:w++wIzSIoMQk5scVGud96ZLU6IJLlectE13dN6eX9AY= github.com/notional-labs/fee-abstraction/v2 v2.0.1/go.mod h1:6xlQD2XVfVxYc6xJ9AGFkIE4b/b+cGbs3/D0jHhRyXw= +github.com/notional-labs/interchaintest/v4 v4.0.0 h1:tIR5AkZwhjmzZjm+gXPodFZFP6rSzBDbJZjRMMbjDbM= +github.com/notional-labs/interchaintest/v4 v4.0.0/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -730,8 +732,6 @@ github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jH github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/strangelove-ventures/go-subkey v1.0.7 h1:cOP/Lajg3uxV/tvspu0m6+0Cu+DJgygkEAbx/s+f35I= github.com/strangelove-ventures/go-subkey v1.0.7/go.mod h1:E34izOIEm+sZ1YmYawYRquqBQWeZBjVB4pF7bMuhc1c= -github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20230331040355-5d08aab13017 h1:ipXOC0b0g2652lmTn+E453sbWtpzqPrGa+jP50ymR3A= -github.com/strangelove-ventures/interchaintest/v4 v4.0.0-20230331040355-5d08aab13017/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1248,6 +1248,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index c5051ac..efab18e 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -45,6 +45,7 @@ func TestPacketForwardMiddleware(t *testing.T) { // Create chain factory with Feeabs and Gaia numVals := 1 numFullNodes := 1 + gasAdjustment := 2.0 cf := interchaintest.NewBuiltinChainFactory(zaptest.NewLogger(t), []*interchaintest.ChainSpec{ { @@ -69,6 +70,7 @@ func TestPacketForwardMiddleware(t *testing.T) { GasPrices: "0.005uosmo", EncodingConfig: osmosisEncoding(), }, + GasAdjustment: &gasAdjustment, NumValidators: &numVals, NumFullNodes: &numFullNodes, }, @@ -314,14 +316,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) - expectedBalance := gaiaUserBalance - amountToSend - gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) - require.NoError(t, err) - require.Equal(t, expectedBalance, gaiaUserBalance) // Send Gaia uatom to Feeabs - gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) - require.NoError(t, err) - dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) transfer = ibc.WalletAmount{ Address: dstAddress, @@ -335,15 +330,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - - expectedBalance = gaiaUserBalance - amountToSend - gaiaUserBalance, err = gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) - require.NoError(t, err) - require.Equal(t, expectedBalance, gaiaUserBalance) // Send Feeabs stake to Osmosis - feeabsUserBalance, err := feeabs.GetBalance(ctx, feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix), feeabs.Config().Denom) - require.NoError(t, err) - dstAddress = osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) transfer = ibc.WalletAmount{ Address: dstAddress, @@ -357,29 +344,28 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) - - expectedBalance = feeabsUserBalance - amountToSend - feeabsUserBalance, err = feeabs.GetBalance(ctx, feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix), feeabs.Config().Denom) - require.NoError(t, err) - require.Equal(t, expectedBalance, feeabsUserBalance) - // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisGaia.PortID, channOsmosisGaia.ChannelID, gaia.Config().Denom)) - ibcDenom := denomTrace.IBCDenom() + uatomOnOsmosis := denomTrace.IBCDenom() + osmosisUserBalance, err := osmosis.GetBalance(ctx, osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix), uatomOnOsmosis) + require.NoError(t, err) + require.Equal(t, amountToSend, osmosisUserBalance) + + denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisFeeabs.PortID, channOsmosisFeeabs.ChannelID, feeabs.Config().Denom)) + stakeOnOsmosis := denomTrace.IBCDenom() + osmosisUserBalance, err = osmosis.GetBalance(ctx, osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix), stakeOnOsmosis) + require.NoError(t, err) + require.Equal(t, amountToSend, osmosisUserBalance) poolID, err := cosmos.OsmosisCreatePool(osmosis, ctx, osmosisUser.KeyName, cosmos.OsmosisPoolParams{ - Weights: fmt.Sprintf("5%s,5%s", ibcDenom, osmosis.Config().Denom), - InitialDeposit: fmt.Sprintf("500000000%s,500000000%s", ibcDenom, osmosis.Config().Denom), + Weights: fmt.Sprintf("5%s,5%s", stakeOnOsmosis, uatomOnOsmosis), + InitialDeposit: fmt.Sprintf("100000000%s,100000000%s", stakeOnOsmosis, uatomOnOsmosis), SwapFee: "0.01", ExitFee: "0", FutureGovernor: "", }) require.NoError(t, err) require.Equal(t, poolID, "1") - - ibcToken, err := osmosis.GetBalance(ctx, osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix), ibcDenom) - require.NoError(t, err) - require.Equal(t, int64(500_000_000), ibcToken) // Setup contract on Osmosis // Store code crosschain Registry crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") From abedf44267365fde86f62b129aee3960a4098fa8 Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 10:44:24 +0700 Subject: [PATCH 12/50] add contract for xcs --- tests/interchaintest/packet_foward_test.go | 110 ++++++++++++++------- tests/interchaintest/setup.go | 6 ++ 2 files changed, 80 insertions(+), 36 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index efab18e..46541e1 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -299,9 +299,6 @@ func TestPacketForwardMiddleware(t *testing.T) { t.Run("xcs", func(t *testing.T) { // Send Gaia uatom to Osmosis - gaiaUserBalance, err := gaia.GetBalance(ctx, gaiaUser.Bech32Address(gaia.Config().Bech32Prefix), gaia.Config().Denom) - require.NoError(t, err) - require.Equal(t, userFunds, gaiaUserBalance) dstAddress := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) transfer := ibc.WalletAmount{ Address: dstAddress, @@ -315,35 +312,69 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) + testutil.WaitForBlocks(ctx, 5, gaia, osmosis) + // Setup contract on Osmosis + // Store code crosschain Registry + crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") + require.NoError(t, err) + _ = crossChainRegistryContractID + // // Instatiate + owner := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) + initMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) + registryContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, crossChainRegistryContractID, initMsg, true) + require.NoError(t, err) + // Execute + msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", + channFeeabsOsmosis.ChannelID, + channOsmosisFeeabs.ChannelID, + channFeeabsGaia.ChannelID, + channGaiaFeeabs.ChannelID, + channOsmosisGaia.ChannelID, + channGaiaOsmosis.ChannelID) + _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) + require.NoError(t, err) - // Send Gaia uatom to Feeabs - dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) + // Send Feeabs stake to Osmosis + dstAddress = osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) transfer = ibc.WalletAmount{ Address: dstAddress, - Denom: gaia.Config().Denom, + Denom: feeabs.Config().Denom, Amount: amountToSend, } - tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) + tx, err = feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{}) require.NoError(t, err) require.NoError(t, tx.Validate()) - require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - // Send Feeabs stake to Osmosis - dstAddress = osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) + require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) + require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) + testutil.WaitForBlocks(ctx, 5, osmosis, feeabs) + + // Execute + msg = fmt.Sprintf("{\"modify_bech32_prefixes\": {\"operations\": [{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"feeabs\"},{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"osmo\"},{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"cosmos\"}]}}", + feeabs.Config().ChainID, + osmosis.Config().ChainID, + gaia.Config().ChainID, + ) + _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) + require.NoError(t, err) + + // Send Gaia uatom to Feeabs + dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) transfer = ibc.WalletAmount{ Address: dstAddress, - Denom: feeabs.Config().Denom, + Denom: gaia.Config().Denom, Amount: amountToSend, } - tx, err = feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{}) + tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) require.NoError(t, err) require.NoError(t, tx.Validate()) - require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) - require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) + require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 5, gaia, feeabs) + // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisGaia.PortID, channOsmosisGaia.ChannelID, gaia.Config().Denom)) uatomOnOsmosis := denomTrace.IBCDenom() @@ -359,37 +390,44 @@ func TestPacketForwardMiddleware(t *testing.T) { poolID, err := cosmos.OsmosisCreatePool(osmosis, ctx, osmosisUser.KeyName, cosmos.OsmosisPoolParams{ Weights: fmt.Sprintf("5%s,5%s", stakeOnOsmosis, uatomOnOsmosis), - InitialDeposit: fmt.Sprintf("100000000%s,100000000%s", stakeOnOsmosis, uatomOnOsmosis), + InitialDeposit: fmt.Sprintf("1000000000%s,1000000000%s", stakeOnOsmosis, uatomOnOsmosis), SwapFee: "0.01", ExitFee: "0", FutureGovernor: "", }) require.NoError(t, err) require.Equal(t, poolID, "1") - // Setup contract on Osmosis - // Store code crosschain Registry - crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") + + // store swaprouter + swapRouterContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/swaprouter.wasm") require.NoError(t, err) - _ = crossChainRegistryContractID - // // Instatiate - owner := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) - swapRegistryInitMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) - address, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, crossChainRegistryContractID, swapRegistryInitMsg, true) - fmt.Printf("xcrAddress: %s\n", address) + // instantiate + swapRouterContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, swapRouterContractID, initMsg, true) require.NoError(t, err) - // Execute - msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", - channFeeabsOsmosis.ChannelID, - channOsmosisFeeabs.ChannelID, - channFeeabsGaia.ChannelID, - channGaiaFeeabs.ChannelID, - channOsmosisGaia.ChannelID, - channGaiaOsmosis.ChannelID) - txHash, err := osmosis.ExecuteContract(ctx, osmosisUser.KeyName, address, msg) + fmt.Printf("swapRouterContractAddress: %s", swapRouterContractAddress) + + // execute + msg = fmt.Sprintf("{\"set_route\":{\"input_denom\":\"%s\",\"output_denom\":\"%s\",\"pool_route\":[{\"pool_id\":\"%s\",\"token_out_denom\":\"%s\"}]}}", + uatomOnOsmosis, + stakeOnOsmosis, + poolID, + stakeOnOsmosis, + ) + txHash, err := osmosis.ExecuteContract(ctx, osmosisUser.KeyName, swapRouterContractAddress, msg) require.NoError(t, err) _ = txHash - // txs, _ := osmosis.GetTransaction(txHash) - // fmt.Printf("txs----------------: %v", txs) + txs, _ := osmosis.GetTransaction(txHash) + fmt.Printf("txs----------------: %v", txs) + + // store xcs + xcsContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_swaps.wasm") + require.NoError(t, err) + // instantiate + initMsg = fmt.Sprintf("{\"swap_contract\":\"%s\",\"governor\": \"%s\"}", swapRouterContractAddress, owner) + xcsContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, xcsContractID, initMsg, true) + require.NoError(t, err) + fmt.Printf("--------------------xcsContractAddress %s", xcsContractAddress) // Swap Feeabs(uatom) to Osmosis + // Get feeabs module account }) } diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 4681c6e..b26ca95 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -2,6 +2,7 @@ package interchaintest import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" + "github.com/cosmos/cosmos-sdk/types" balancertypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/balancer" gammtypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/types" feeabstype "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" @@ -9,6 +10,11 @@ import ( "github.com/strangelove-ventures/interchaintest/v4/ibc" ) +type QueryFeeabsModuleBalacesResponse struct { + Balances types.Coins + Address string +} + var ( FeeabsMainRepo = "ghcr.io/notional-labs/fee-abstraction" From c48caea158c5d067bc1f54e4f1e3fef3bcdfbdfd Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 15:27:33 +0700 Subject: [PATCH 13/50] add xcs --- go.work.sum | 5 +-- tests/interchaintest/go.mod | 2 +- tests/interchaintest/go.sum | 4 +- tests/interchaintest/packet_foward_test.go | 50 ++++++++++++++++++++-- 4 files changed, 52 insertions(+), 9 deletions(-) diff --git a/go.work.sum b/go.work.sum index 8fd9825..a317470 100644 --- a/go.work.sum +++ b/go.work.sum @@ -779,8 +779,8 @@ github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJ github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/notional-labs/interchaintest/v4 v4.0.0 h1:tIR5AkZwhjmzZjm+gXPodFZFP6rSzBDbJZjRMMbjDbM= -github.com/notional-labs/interchaintest/v4 v4.0.0/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2 h1:VUeAkXDqL21yF1mCdTOOYf2E7HYfWXG2T+c9nv09Z30= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= @@ -1279,7 +1279,6 @@ gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index f04402d..77c36a0 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -191,7 +191,7 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ - github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.0 + github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2 // use informal system fork of tendermint github.com/tendermint/tendermint => github.com/informalsystems/tendermint v0.34.26 diff --git a/tests/interchaintest/go.sum b/tests/interchaintest/go.sum index ce08e7b..7686c67 100644 --- a/tests/interchaintest/go.sum +++ b/tests/interchaintest/go.sum @@ -583,8 +583,8 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/notional-labs/fee-abstraction/v2 v2.0.1 h1:w++wIzSIoMQk5scVGud96ZLU6IJLlectE13dN6eX9AY= github.com/notional-labs/fee-abstraction/v2 v2.0.1/go.mod h1:6xlQD2XVfVxYc6xJ9AGFkIE4b/b+cGbs3/D0jHhRyXw= -github.com/notional-labs/interchaintest/v4 v4.0.0 h1:tIR5AkZwhjmzZjm+gXPodFZFP6rSzBDbJZjRMMbjDbM= -github.com/notional-labs/interchaintest/v4 v4.0.0/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2 h1:VUeAkXDqL21yF1mCdTOOYf2E7HYfWXG2T+c9nv09Z30= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 46541e1..d693d8c 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -2,6 +2,7 @@ package interchaintest import ( "context" + "encoding/json" "fmt" "testing" "time" @@ -310,7 +311,9 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) testutil.WaitForBlocks(ctx, 5, gaia, osmosis) // Setup contract on Osmosis @@ -346,7 +349,9 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) testutil.WaitForBlocks(ctx, 5, osmosis, feeabs) @@ -371,7 +376,9 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) testutil.WaitForBlocks(ctx, 5, gaia, feeabs) @@ -416,8 +423,8 @@ func TestPacketForwardMiddleware(t *testing.T) { txHash, err := osmosis.ExecuteContract(ctx, osmosisUser.KeyName, swapRouterContractAddress, msg) require.NoError(t, err) _ = txHash - txs, _ := osmosis.GetTransaction(txHash) - fmt.Printf("txs----------------: %v", txs) + // txs, _ := osmosis.GetTransaction(txHash) + // fmt.Printf("txs----------------: %v", txs) // store xcs xcsContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_swaps.wasm") @@ -428,6 +435,43 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) fmt.Printf("--------------------xcsContractAddress %s", xcsContractAddress) // Swap Feeabs(uatom) to Osmosis - // Get feeabs module account + // send ibc token to feeabs module account + feeabsModule, err := QueryFeeabsModuleAccountBalances(feeabs, ctx) + require.NoError(t, err) + fmt.Printf("Ibc Denom: %s\n", feeabsModule.Balances[0].Denom) + dstAddress = feeabsModule.Address + transfer = ibc.WalletAmount{ + Address: dstAddress, + Denom: gaia.Config().Denom, + Amount: amountToSend, + } + + tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) + require.NoError(t, err) + require.NoError(t, tx.Validate()) + + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) + require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) + require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + + // xcs + cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, feeabsModule.Balances[0].Denom) }) } + +func QueryFeeabsModuleAccountBalances(c *cosmos.CosmosChain, ctx context.Context) (*QueryFeeabsModuleBalacesResponse, error) { + cmd := []string{"feeabs", "module-balances"} + stdout, _, err := c.ExecQuery(ctx, cmd) + if err != nil { + return &QueryFeeabsModuleBalacesResponse{}, err + } + + var feeabsModule QueryFeeabsModuleBalacesResponse + err = json.Unmarshal(stdout, &feeabsModule) + if err != nil { + return &QueryFeeabsModuleBalacesResponse{}, err + } + + return &feeabsModule, nil +} From f064cc76b8fd980b058646bfa0aab1a9d57e50ba Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 15:42:13 +0700 Subject: [PATCH 14/50] add check --- tests/interchaintest/packet_foward_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index d693d8c..cba30ac 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -455,8 +455,21 @@ func TestPacketForwardMiddleware(t *testing.T) { testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channFeeabsGaia.PortID, channFeeabsGaia.ChannelID, gaia.Config().Denom)) + uatomOnFeeabs := denomTrace.IBCDenom() + + moduleBalace, err := feeabs.GetBalance(ctx, feeabsModule.Address, uatomOnFeeabs) + require.NoError(t, err) + fmt.Printf("----------------moduleBalace %v\n", moduleBalace) + // xcs cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, feeabsModule.Balances[0].Denom) + err = testutil.WaitForBlocks(ctx, 30, feeabs) + require.NoError(t, err) + moduleBalace, err = feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) + require.NoError(t, err) + fmt.Printf("----------------moduleBalace %v\n", moduleBalace) + require.Greater(t, moduleBalace, 1) }) } From a1c453f9c7d7ee5c6d4be5235254dc3086d0a2a2 Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 15:46:33 +0700 Subject: [PATCH 15/50] nit --- tests/interchaintest/packet_foward_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index cba30ac..5141026 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -438,7 +438,6 @@ func TestPacketForwardMiddleware(t *testing.T) { // send ibc token to feeabs module account feeabsModule, err := QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) - fmt.Printf("Ibc Denom: %s\n", feeabsModule.Balances[0].Denom) dstAddress = feeabsModule.Address transfer = ibc.WalletAmount{ Address: dstAddress, From cb512b268f3b2adc709e551ea1e153539174e80a Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 15:58:20 +0700 Subject: [PATCH 16/50] add log check --- tests/interchaintest/packet_foward_test.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 5141026..f840a41 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -311,9 +311,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) testutil.WaitForBlocks(ctx, 5, gaia, osmosis) // Setup contract on Osmosis @@ -349,9 +347,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) testutil.WaitForBlocks(ctx, 5, osmosis, feeabs) @@ -376,9 +372,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) testutil.WaitForBlocks(ctx, 5, gaia, feeabs) @@ -449,9 +443,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channFeeabsGaia.PortID, channFeeabsGaia.ChannelID, gaia.Config().Denom)) @@ -462,8 +454,11 @@ func TestPacketForwardMiddleware(t *testing.T) { fmt.Printf("----------------moduleBalace %v\n", moduleBalace) // xcs - cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, feeabsModule.Balances[0].Denom) + fmt.Printf("----------------testttttttttttttttttttttttttttt\n") + cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + fmt.Printf("----------------testttttttttttttttttttttttttttt\n") err = testutil.WaitForBlocks(ctx, 30, feeabs) + fmt.Printf("----------------testttttttttttttttttttttttttttt\n") require.NoError(t, err) moduleBalace, err = feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) require.NoError(t, err) From cb1e491ca59f5cb52ce956df8a67385c9039c4cf Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 19 Apr 2023 16:08:22 +0700 Subject: [PATCH 17/50] add wait for block --- tests/interchaintest/packet_foward_test.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index f840a41..982b295 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -311,9 +311,11 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) - testutil.WaitForBlocks(ctx, 5, gaia, osmosis) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) // Setup contract on Osmosis // Store code crosschain Registry crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") @@ -347,10 +349,11 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) - testutil.WaitForBlocks(ctx, 5, osmosis, feeabs) - + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) // Execute msg = fmt.Sprintf("{\"modify_bech32_prefixes\": {\"operations\": [{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"feeabs\"},{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"osmo\"},{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"cosmos\"}]}}", feeabs.Config().ChainID, @@ -372,9 +375,11 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 5, gaia, feeabs) + testutil.WaitForBlocks(ctx, 1, gaia, feeabs) // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisGaia.PortID, channOsmosisGaia.ChannelID, gaia.Config().Denom)) @@ -443,8 +448,11 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) + testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channFeeabsGaia.PortID, channFeeabsGaia.ChannelID, gaia.Config().Denom)) uatomOnFeeabs := denomTrace.IBCDenom() From 2eb189db378e57afd681e3388a9a95585a62240a Mon Sep 17 00:00:00 2001 From: GnaD Date: Thu, 20 Apr 2023 00:56:34 +0700 Subject: [PATCH 18/50] add proposl --- scripts/host_zone.json | 12 +- scripts/proposal.json | 8 +- tests/interchaintest/packet_foward_test.go | 140 ++++++++++++------- tests/interchaintest/proposal/host_zone.json | 12 ++ tests/interchaintest/proposal/proposal.json | 32 +++++ tests/interchaintest/setup.go | 8 +- 6 files changed, 146 insertions(+), 66 deletions(-) create mode 100644 tests/interchaintest/proposal/host_zone.json create mode 100644 tests/interchaintest/proposal/proposal.json diff --git a/scripts/host_zone.json b/scripts/host_zone.json index 3a89016..e9c66af 100644 --- a/scripts/host_zone.json +++ b/scripts/host_zone.json @@ -3,16 +3,10 @@ "description": "Add Fee Abbtraction Host Zone", "host_chain_fee_abs_config": { - "ibc_denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", - "osmosis_pool_token_denom_in": "uosmo", - "middleware_address": "", - "ibc_transfer_channel":"channel-0", - "host_zone_ibc_transfer_channel":"", - "crosschain_swap_address":"", + "ibc_denom": "ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", + "osmosis_pool_token_denom_in": "ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", "pool_id": "1", - "is_osmosis": true, - "frozen": false, - "osmosis_query_channel": "channel-1" + "frozen": false }, "deposit": "100000000stake" } \ No newline at end of file diff --git a/scripts/proposal.json b/scripts/proposal.json index 1a76eda..27fbebf 100644 --- a/scripts/proposal.json +++ b/scripts/proposal.json @@ -2,7 +2,11 @@ "title": "Enable Fee Abtraction", "description": "Change params for enable fee abstraction", "changes": [ - + { + "subspace": "feeabs", + "key": "chainname", + "value": "feeabs" + }, { "subspace": "feeabs", "key": "nativeibcedinosmosis", @@ -11,7 +15,7 @@ { "subspace": "feeabs", "key": "chainname", - "value": "feeappd-t1" + "value": "feeabs-2" }, { "subspace": "feeabs", diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 982b295..6c8325e 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -4,6 +4,8 @@ import ( "context" "encoding/json" "fmt" + "os" + "path" "testing" "time" @@ -300,6 +302,8 @@ func TestPacketForwardMiddleware(t *testing.T) { t.Run("xcs", func(t *testing.T) { // Send Gaia uatom to Osmosis + gaiaHeight, err := gaia.Height(ctx) + require.NoError(t, err) dstAddress := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) transfer := ibc.WalletAmount{ Address: dstAddress, @@ -311,33 +315,14 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushPackets(ctx, eRep, pathOsmosisGaia, channOsmosisGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathOsmosisGaia, channGaiaOsmosis.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - // Setup contract on Osmosis - // Store code crosschain Registry - crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") + _, err = testutil.PollForAck(ctx, gaia, gaiaHeight, gaiaHeight+30, tx.Packet) require.NoError(t, err) - _ = crossChainRegistryContractID - // // Instatiate - owner := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) - initMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) - registryContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, crossChainRegistryContractID, initMsg, true) - require.NoError(t, err) - // Execute - msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", - channFeeabsOsmosis.ChannelID, - channOsmosisFeeabs.ChannelID, - channFeeabsGaia.ChannelID, - channGaiaFeeabs.ChannelID, - channOsmosisGaia.ChannelID, - channGaiaOsmosis.ChannelID) - _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) + err = testutil.WaitForBlocks(ctx, 1, feeabs, gaia, osmosis) require.NoError(t, err) // Send Feeabs stake to Osmosis + feeabsHeight, err := feeabs.Height(ctx) + require.NoError(t, err) dstAddress = osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) transfer = ibc.WalletAmount{ Address: dstAddress, @@ -349,21 +334,14 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsOsmosis, channOsmosisFeeabs.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsOsmosis, channFeeabsOsmosis.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - // Execute - msg = fmt.Sprintf("{\"modify_bech32_prefixes\": {\"operations\": [{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"feeabs\"},{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"osmo\"},{\"operation\": \"set\", \"chain_name\": \"%s\", \"prefix\": \"cosmos\"}]}}", - feeabs.Config().ChainID, - osmosis.Config().ChainID, - gaia.Config().ChainID, - ) - _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) + _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+30, tx.Packet) + require.NoError(t, err) + err = testutil.WaitForBlocks(ctx, 1, feeabs, gaia, osmosis) require.NoError(t, err) // Send Gaia uatom to Feeabs + gaiaHeight, err = gaia.Height(ctx) + require.NoError(t, err) dstAddress = feeabsUser.Bech32Address(feeabs.Config().Bech32Prefix) transfer = ibc.WalletAmount{ Address: dstAddress, @@ -375,11 +353,34 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, gaia, feeabs) + _, err = testutil.PollForAck(ctx, gaia, gaiaHeight, gaiaHeight+30, tx.Packet) + require.NoError(t, err) + err = testutil.WaitForBlocks(ctx, 1, feeabs, gaia, osmosis) + require.NoError(t, err) + // Setup contract on Osmosis + // Store code crosschain Registry + crossChainRegistryContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_registry.wasm") + require.NoError(t, err) + _ = crossChainRegistryContractID + // // Instatiate + owner := osmosisUser.Bech32Address(osmosis.Config().Bech32Prefix) + initMsg := fmt.Sprintf("{\"owner\":\"%s\"}", owner) + registryContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, crossChainRegistryContractID, initMsg, true) + require.NoError(t, err) + // Execute + msg := fmt.Sprintf("{\"modify_chain_channel_links\": {\"operations\": [{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"feeabs\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"feeabs\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"osmosis\",\"destination_chain\": \"gaia\",\"channel_id\": \"%s\"},{\"operation\": \"set\",\"source_chain\": \"gaia\",\"destination_chain\": \"osmosis\",\"channel_id\": \"%s\"}]}}", + channFeeabsOsmosis.ChannelID, + channOsmosisFeeabs.ChannelID, + channFeeabsGaia.ChannelID, + channGaiaFeeabs.ChannelID, + channOsmosisGaia.ChannelID, + channGaiaOsmosis.ChannelID) + _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) + require.NoError(t, err) + // Execute + msg = fmt.Sprintf("{\"modify_bech32_prefixes\": {\"operations\": [{\"operation\": \"set\", \"chain_name\": \"feeabs\", \"prefix\": \"feeabs\"},{\"operation\": \"set\", \"chain_name\": \"osmosis\", \"prefix\": \"osmo\"},{\"operation\": \"set\", \"chain_name\": \"gaia\", \"prefix\": \"cosmos\"}]}}") + _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) + require.NoError(t, err) // Create pool Osmosis(uatom)/Osmosis(stake) on Osmosis denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channOsmosisGaia.PortID, channOsmosisGaia.ChannelID, gaia.Config().Denom)) @@ -422,8 +423,6 @@ func TestPacketForwardMiddleware(t *testing.T) { txHash, err := osmosis.ExecuteContract(ctx, osmosisUser.KeyName, swapRouterContractAddress, msg) require.NoError(t, err) _ = txHash - // txs, _ := osmosis.GetTransaction(txHash) - // fmt.Printf("txs----------------: %v", txs) // store xcs xcsContractID, err := osmosis.StoreContract(ctx, osmosisUser.KeyName, "./bytecode/crosschain_swaps.wasm") @@ -435,6 +434,8 @@ func TestPacketForwardMiddleware(t *testing.T) { fmt.Printf("--------------------xcsContractAddress %s", xcsContractAddress) // Swap Feeabs(uatom) to Osmosis // send ibc token to feeabs module account + gaiaHeight, err = gaia.Height(ctx) + require.NoError(t, err) feeabsModule, err := QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) dstAddress = feeabsModule.Address @@ -448,30 +449,61 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) require.NoError(t, tx.Validate()) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushPackets(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) - require.NoError(t, r.FlushAcknowledgements(ctx, eRep, pathFeeabsGaia, channFeeabsGaia.ChannelID)) - testutil.WaitForBlocks(ctx, 1, osmosis, feeabs) + _, err = testutil.PollForAck(ctx, gaia, gaiaHeight, gaiaHeight+30, tx.Packet) + require.NoError(t, err) + err = testutil.WaitForBlocks(ctx, 1, feeabs, gaia, osmosis) + require.NoError(t, err) denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channFeeabsGaia.PortID, channFeeabsGaia.ChannelID, gaia.Config().Denom)) uatomOnFeeabs := denomTrace.IBCDenom() - moduleBalace, err := feeabs.GetBalance(ctx, feeabsModule.Address, uatomOnFeeabs) + fmt.Printf("-----------------------------uatomOnFeeabs: %s\n", uatomOnFeeabs) + fmt.Printf("-----------------------------uatomOnOsmosis: %s\n", uatomOnOsmosis) + fmt.Printf("-----------------------------stakeOnOsmosis: %s\n", stakeOnOsmosis) + + feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) + require.NoError(t, err) + fmt.Printf("----------------moduleBalace %v\n", feeabsModule.Balances) + + current_directory, _ := os.Getwd() + param_change_path := path.Join(current_directory, "proposal", "proposal.json") + + paramTx, err := feeabs.ParamChangeProposal(ctx, feeabsUser.KeyName, param_change_path) + require.NoError(t, err, "error submitting param change proposal tx") + + err = feeabs.VoteOnProposalAllValidators(ctx, paramTx.ProposalID, cosmos.ProposalVoteYes) + require.NoError(t, err, "failed to submit votes") + + height, _ := feeabs.Height(ctx) + _, err = cosmos.PollForProposalStatus(ctx, feeabs, height, height+10, paramTx.ProposalID, cosmos.ProposalStatusPassed) + require.NoError(t, err, "proposal status did not change to passed in expected number of blocks") + + _, err = cosmos.FeeabsAddHostZoneProposal(feeabs, ctx, feeabsUser.KeyName, "./proposal/host_zone.json") require.NoError(t, err) - fmt.Printf("----------------moduleBalace %v\n", moduleBalace) + + err = feeabs.VoteOnProposalAllValidators(ctx, "2", cosmos.ProposalVoteYes) + require.NoError(t, err, "failed to submit votes") + + height, _ = feeabs.Height(ctx) + _, err = cosmos.PollForProposalStatus(ctx, feeabs, height, height+10, paramTx.ProposalID, cosmos.ProposalStatusPassed) + require.NoError(t, err, "proposal status did not change to passed in expected number of blocks") // xcs fmt.Printf("----------------testttttttttttttttttttttttttttt\n") - cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + txhash, _ := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + + txRes, err := feeabs.GetTransaction(txhash) + fmt.Printf("-------------------txRes: %v", txRes) + require.NoError(t, err) + fmt.Printf("----------------testttttttttttttttttttttttttttt\n") - err = testutil.WaitForBlocks(ctx, 30, feeabs) + err = testutil.WaitForBlocks(ctx, 30, feeabs, gaia, osmosis) fmt.Printf("----------------testttttttttttttttttttttttttttt\n") require.NoError(t, err) - moduleBalace, err = feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) + feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) - fmt.Printf("----------------moduleBalace %v\n", moduleBalace) - require.Greater(t, moduleBalace, 1) + fmt.Printf("----------------moduleBalace %v\n", feeabsModule.Balances) + // require.Greater(t, moduleBalace, 1) }) } diff --git a/tests/interchaintest/proposal/host_zone.json b/tests/interchaintest/proposal/host_zone.json new file mode 100644 index 0000000..47f4654 --- /dev/null +++ b/tests/interchaintest/proposal/host_zone.json @@ -0,0 +1,12 @@ +{ + "title": "Add Fee Abbtraction Host Zone Proposal", + "description": "Add Fee Abbtraction Host Zone", + "host_chain_fee_abs_config": + { + "ibc_denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", + "osmosis_pool_token_denom_in": "uosmo", + "pool_id": "1", + "frozen": false + }, + "deposit": "100000000stake" +} \ No newline at end of file diff --git a/tests/interchaintest/proposal/proposal.json b/tests/interchaintest/proposal/proposal.json new file mode 100644 index 0000000..fd7c1f4 --- /dev/null +++ b/tests/interchaintest/proposal/proposal.json @@ -0,0 +1,32 @@ +{ + "title": "Enable Fee Abtraction", + "description": "Change params for enable fee abstraction", + "changes": [ + { + "subspace": "feeabs", + "key": "nativeibcedinosmosis", + "value": "ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878" + }, + { + "subspace": "feeabs", + "key": "chainname", + "value": "feeabs-2" + }, + { + "subspace": "feeabs", + "key": "ibctransferchannel", + "value": "channel-0" + }, + { + "subspace": "feeabs", + "key": "ibcqueryicqchannel", + "value": "channel-1" + }, + { + "subspace": "feeabs", + "key": "osmosiscrosschainswapaddress", + "value": "osmo17p9rzwnnfxcjp32un9ug7yhhzgtkhvl9jfksztgw5uh69wac2pgs5yczr8" + } + ], + "deposit": "5000000000stake" + } \ No newline at end of file diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index b26ca95..1519a9a 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -6,6 +6,7 @@ import ( balancertypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/balancer" gammtypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/types" feeabstype "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" + "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos" "github.com/strangelove-ventures/interchaintest/v4/chain/cosmos/wasm" "github.com/strangelove-ventures/interchaintest/v4/ibc" ) @@ -15,6 +16,11 @@ type QueryFeeabsModuleBalacesResponse struct { Address string } +const ( + votingPeriod = "10s" + maxDepositPeriod = "10s" +) + var ( FeeabsMainRepo = "ghcr.io/notional-labs/fee-abstraction" @@ -39,7 +45,7 @@ var ( NoHostMount: false, SkipGenTx: false, PreGenesis: nil, - ModifyGenesis: nil, + ModifyGenesis: cosmos.ModifyGenesisProposalTime(votingPeriod, maxDepositPeriod), ConfigFileOverrides: nil, EncodingConfig: feeabsEncoding(), } From a6d97c19beaefcd478841fee02b59196b2d7c14d Mon Sep 17 00:00:00 2001 From: GnaD Date: Thu, 20 Apr 2023 03:45:27 +0700 Subject: [PATCH 19/50] add setup --- tests/interchaintest/go.mod | 2 +- tests/interchaintest/go.sum | 4 +- tests/interchaintest/packet_foward_test.go | 125 ++++++++++++++++--- tests/interchaintest/proposal/host_zone.json | 4 +- tests/interchaintest/proposal/proposal.json | 2 +- tests/interchaintest/setup.go | 4 + 6 files changed, 117 insertions(+), 24 deletions(-) diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index 77c36a0..5287217 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -191,7 +191,7 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ - github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2 + github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419203226-62f4ab72a646 // use informal system fork of tendermint github.com/tendermint/tendermint => github.com/informalsystems/tendermint v0.34.26 diff --git a/tests/interchaintest/go.sum b/tests/interchaintest/go.sum index 7686c67..45d4531 100644 --- a/tests/interchaintest/go.sum +++ b/tests/interchaintest/go.sum @@ -583,8 +583,8 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/notional-labs/fee-abstraction/v2 v2.0.1 h1:w++wIzSIoMQk5scVGud96ZLU6IJLlectE13dN6eX9AY= github.com/notional-labs/fee-abstraction/v2 v2.0.1/go.mod h1:6xlQD2XVfVxYc6xJ9AGFkIE4b/b+cGbs3/D0jHhRyXw= -github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2 h1:VUeAkXDqL21yF1mCdTOOYf2E7HYfWXG2T+c9nv09Z30= -github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419203226-62f4ab72a646 h1:D6eUZPmagbBFZBbVDCpxcj5M35SNt1GPrrwGkah5oH0= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419203226-62f4ab72a646/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 6c8325e..adbef68 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -220,11 +220,6 @@ func TestPacketForwardMiddleware(t *testing.T) { channGaiaFeeabs := channsGaia[0] require.NotEmpty(t, channGaiaFeeabs.ChannelID) - fmt.Println("-----------------------------------") - fmt.Printf("channFeeabsOsmosis: %s\n", channFeeabsOsmosis.ChannelID) - fmt.Printf("channFeeabsGaia: %s\n", channFeeabsGaia.ChannelID) - fmt.Printf("channGaiaFeeabs: %s - %s\n", channGaiaFeeabs.ChannelID, channGaiaFeeabs.Counterparty.ChannelID) - fmt.Println("-----------------------------------") //rly osmo-gaia // Generate new path err = r.GeneratePath(ctx, eRep, osmosis.Config().ChainID, gaia.Config().ChainID, pathOsmosisGaia) @@ -279,6 +274,15 @@ func TestPacketForwardMiddleware(t *testing.T) { } require.NotEmpty(t, channGaiaOsmosis) + fmt.Println("-----------------------------------") + fmt.Printf("channFeeabsOsmosis: %s - %s\n", channFeeabsOsmosis.ChannelID, channFeeabsOsmosis.Counterparty.ChannelID) + fmt.Printf("channOsmosisFeeabs: %s - %s\n", channOsmosisFeeabs.ChannelID, channOsmosisFeeabs.Counterparty.ChannelID) + fmt.Printf("channFeeabsGaia: %s - %s\n", channFeeabsGaia.ChannelID, channFeeabsGaia.Counterparty.ChannelID) + fmt.Printf("channGaiaFeeabs: %s - %s\n", channGaiaFeeabs.ChannelID, channGaiaFeeabs.Counterparty.ChannelID) + fmt.Printf("channOsmosisGaia: %s - %s\n", channOsmosisGaia.ChannelID, channOsmosisGaia.Counterparty.ChannelID) + fmt.Printf("channGaiaOsmosis: %s - %s\n", channGaiaOsmosis.ChannelID, channGaiaOsmosis.Counterparty.ChannelID) + fmt.Println("-----------------------------------") + // Start the relayer on both paths err = r.StartRelayer(ctx, eRep, pathFeeabsGaia, pathFeeabsOsmosis, pathOsmosisGaia) require.NoError(t, err) @@ -378,7 +382,17 @@ func TestPacketForwardMiddleware(t *testing.T) { _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) require.NoError(t, err) // Execute - msg = fmt.Sprintf("{\"modify_bech32_prefixes\": {\"operations\": [{\"operation\": \"set\", \"chain_name\": \"feeabs\", \"prefix\": \"feeabs\"},{\"operation\": \"set\", \"chain_name\": \"osmosis\", \"prefix\": \"osmo\"},{\"operation\": \"set\", \"chain_name\": \"gaia\", \"prefix\": \"cosmos\"}]}}") + msg = `{ + "modify_bech32_prefixes": + { + "operations": + [ + {"operation": "set", "chain_name": "feeabs", "prefix": "feeabs"}, + {"operation": "set", "chain_name": "osmosis", "prefix": "osmo"}, + {"operation": "set", "chain_name": "gaia", "prefix": "cosmos"} + ] + } + }` _, err = osmosis.ExecuteContract(ctx, osmosisUser.KeyName, registryContractAddress, msg) require.NoError(t, err) @@ -457,10 +471,6 @@ func TestPacketForwardMiddleware(t *testing.T) { denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channFeeabsGaia.PortID, channFeeabsGaia.ChannelID, gaia.Config().Denom)) uatomOnFeeabs := denomTrace.IBCDenom() - fmt.Printf("-----------------------------uatomOnFeeabs: %s\n", uatomOnFeeabs) - fmt.Printf("-----------------------------uatomOnOsmosis: %s\n", uatomOnOsmosis) - fmt.Printf("-----------------------------stakeOnOsmosis: %s\n", stakeOnOsmosis) - feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) fmt.Printf("----------------moduleBalace %v\n", feeabsModule.Balances) @@ -485,21 +495,84 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err, "failed to submit votes") height, _ = feeabs.Height(ctx) - _, err = cosmos.PollForProposalStatus(ctx, feeabs, height, height+10, paramTx.ProposalID, cosmos.ProposalStatusPassed) + _, err = cosmos.PollForProposalStatus(ctx, feeabs, height, height+10, "2", cosmos.ProposalStatusPassed) require.NoError(t, err, "proposal status did not change to passed in expected number of blocks") + hostZoneConfig, err := QueryFeeabsHostZoneConfig(feeabs, ctx) + require.NoError(t, err) + fmt.Printf("---------------------hostZoneConfig: %v\n", hostZoneConfig) // xcs - fmt.Printf("----------------testttttttttttttttttttttttttttt\n") - txhash, _ := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + // memo := ` + // { + // "wasm": + // { + // "contract":"osmo17p9rzwnnfxcjp32un9ug7yhhzgtkhvl9jfksztgw5uh69wac2pgs5yczr8", + // "msg": + // { + // "osmosis_swap": + // { + // "output_denom":"ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878", + // "slippage": + // { + // "twap": + // { + // "slippage_percentage":"20", + // "window_seconds":10 + // } + // }, + // "receiver":"feeabs/feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", + // "on_failed_delivery":"do_nothing", + // "next_memo":{} + // } + // } + // } + // }` + + // feeabsHeight, err = feeabs.Height(ctx) + // require.NoError(t, err) + + // transfer = ibc.WalletAmount{ + // Address: xcsContractAddress, + // Denom: uatomOnFeeabs, + // Amount: 1_000_000, + // } + + // transferTx, err := feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{Memo: string(memo)}) + // require.NoError(t, err) + // _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) + // require.NoError(t, err) + // err = testutil.WaitForBlocks(ctx, 1, feeabs) + // require.NoError(t, err) + + secondHopDenom := transfertypes.GetPrefixedDenom(channFeeabsOsmosis.PortID, channFeeabsOsmosis.ChannelID, uatomOnFeeabs) + secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) + secondHopIBCDenom := secondHopDenomTrace.IBCDenom() + + contractBalance, err := osmosis.GetBalance(ctx, xcsContractAddress, secondHopIBCDenom) + require.NoError(t, err) + fmt.Printf("---------------contractBalance %v\n", contractBalance) - txRes, err := feeabs.GetTransaction(txhash) - fmt.Printf("-------------------txRes: %v", txRes) + feeabsHeight, err = feeabs.Height(ctx) require.NoError(t, err) - fmt.Printf("----------------testttttttttttttttttttttttttttt\n") - err = testutil.WaitForBlocks(ctx, 30, feeabs, gaia, osmosis) - fmt.Printf("----------------testttttttttttttttttttttttttttt\n") + transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) require.NoError(t, err) + _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) + require.NoError(t, err) + err = testutil.WaitForBlocks(ctx, 1, feeabs) + require.NoError(t, err) + + // txRes, err := feeabs.GetTransaction(txhash) + // fmt.Printf("-------------------txRes: %v", txRes) + // require.NoError(t, err) + + err = testutil.WaitForBlocks(ctx, 50, feeabs, gaia, osmosis) + require.NoError(t, err) + + // balace, err := feeabs.GetBalance(ctx, "feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", feeabs.Config().Denom) + // require.NoError(t, err) + // fmt.Printf("---------------balace %v\n", balace) + feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) fmt.Printf("----------------moduleBalace %v\n", feeabsModule.Balances) @@ -507,6 +580,22 @@ func TestPacketForwardMiddleware(t *testing.T) { }) } +func QueryFeeabsHostZoneConfig(c *cosmos.CosmosChain, ctx context.Context) (*QueryHostChainConfigRespone, error) { + cmd := []string{"feeabs", "all-host-chain-config"} + stdout, _, err := c.ExecQuery(ctx, cmd) + if err != nil { + return &QueryHostChainConfigRespone{}, err + } + + var hostZoneConfig QueryHostChainConfigRespone + err = json.Unmarshal(stdout, &hostZoneConfig) + if err != nil { + return &QueryHostChainConfigRespone{}, err + } + + return &hostZoneConfig, nil +} + func QueryFeeabsModuleAccountBalances(c *cosmos.CosmosChain, ctx context.Context) (*QueryFeeabsModuleBalacesResponse, error) { cmd := []string{"feeabs", "module-balances"} stdout, _, err := c.ExecQuery(ctx, cmd) diff --git a/tests/interchaintest/proposal/host_zone.json b/tests/interchaintest/proposal/host_zone.json index 47f4654..e9c66af 100644 --- a/tests/interchaintest/proposal/host_zone.json +++ b/tests/interchaintest/proposal/host_zone.json @@ -3,8 +3,8 @@ "description": "Add Fee Abbtraction Host Zone", "host_chain_fee_abs_config": { - "ibc_denom": "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518", - "osmosis_pool_token_denom_in": "uosmo", + "ibc_denom": "ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", + "osmosis_pool_token_denom_in": "ibc/C4CFF46FD6DE35CA4CF4CE031E643C8FDC9BA4B99AE598E9B0ED98FE3A2319F9", "pool_id": "1", "frozen": false }, diff --git a/tests/interchaintest/proposal/proposal.json b/tests/interchaintest/proposal/proposal.json index fd7c1f4..f3ebee3 100644 --- a/tests/interchaintest/proposal/proposal.json +++ b/tests/interchaintest/proposal/proposal.json @@ -10,7 +10,7 @@ { "subspace": "feeabs", "key": "chainname", - "value": "feeabs-2" + "value": "feeabs" }, { "subspace": "feeabs", diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 1519a9a..a2b705e 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -16,6 +16,10 @@ type QueryFeeabsModuleBalacesResponse struct { Address string } +type QueryHostChainConfigRespone struct { + HostChainConfig cosmos.HostChainFeeAbsConfig `protobuf:"bytes,1,opt,name=host_chain_config,json=hostChainConfig,proto3" json:"host_chain_config" yaml:"host_chain_config"` +} + const ( votingPeriod = "10s" maxDepositPeriod = "10s" From a3f65e84a74c8d2d8baaf61efcc526a648615eb5 Mon Sep 17 00:00:00 2001 From: GnaD Date: Thu, 20 Apr 2023 11:06:15 +0700 Subject: [PATCH 20/50] nit --- tests/interchaintest/packet_foward_test.go | 104 ++++++++++----------- tests/interchaintest/setup.go | 2 +- 2 files changed, 51 insertions(+), 55 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index adbef68..6bc72a8 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -502,66 +502,58 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) fmt.Printf("---------------------hostZoneConfig: %v\n", hostZoneConfig) // xcs - // memo := ` - // { - // "wasm": - // { - // "contract":"osmo17p9rzwnnfxcjp32un9ug7yhhzgtkhvl9jfksztgw5uh69wac2pgs5yczr8", - // "msg": - // { - // "osmosis_swap": - // { - // "output_denom":"ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878", - // "slippage": - // { - // "twap": - // { - // "slippage_percentage":"20", - // "window_seconds":10 - // } - // }, - // "receiver":"feeabs/feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", - // "on_failed_delivery":"do_nothing", - // "next_memo":{} - // } - // } - // } - // }` - - // feeabsHeight, err = feeabs.Height(ctx) - // require.NoError(t, err) - - // transfer = ibc.WalletAmount{ - // Address: xcsContractAddress, - // Denom: uatomOnFeeabs, - // Amount: 1_000_000, - // } - - // transferTx, err := feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{Memo: string(memo)}) - // require.NoError(t, err) - // _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) - // require.NoError(t, err) - // err = testutil.WaitForBlocks(ctx, 1, feeabs) - // require.NoError(t, err) - - secondHopDenom := transfertypes.GetPrefixedDenom(channFeeabsOsmosis.PortID, channFeeabsOsmosis.ChannelID, uatomOnFeeabs) - secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) - secondHopIBCDenom := secondHopDenomTrace.IBCDenom() - - contractBalance, err := osmosis.GetBalance(ctx, xcsContractAddress, secondHopIBCDenom) - require.NoError(t, err) - fmt.Printf("---------------contractBalance %v\n", contractBalance) - + memo := ` + { + "wasm": + { + "contract":"osmo17p9rzwnnfxcjp32un9ug7yhhzgtkhvl9jfksztgw5uh69wac2pgs5yczr8", + "msg": + { + "osmosis_swap": + { + "output_denom":"ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878", + "slippage": + { + "twap": + { + "slippage_percentage":"20", + "window_seconds":10 + } + }, + "receiver":"feeabs/feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", + "on_failed_delivery":"do_nothing", + "next_memo":{} + } + } + } + }` + // "next_memo":{} feeabsHeight, err = feeabs.Height(ctx) require.NoError(t, err) - transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + transfer = ibc.WalletAmount{ + Address: xcsContractAddress, + Denom: uatomOnFeeabs, + Amount: 1_000_000, + } + + transferTx, err := feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{Memo: string(memo)}) require.NoError(t, err) _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) require.NoError(t, err) err = testutil.WaitForBlocks(ctx, 1, feeabs) require.NoError(t, err) + // feeabsHeight, err = feeabs.Height(ctx) + // require.NoError(t, err) + + // transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + // require.NoError(t, err) + // _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+50, transferTx.Packet) + // require.NoError(t, err) + // err = testutil.WaitForBlocks(ctx, 1, feeabs) + // require.NoError(t, err) + // txRes, err := feeabs.GetTransaction(txhash) // fmt.Printf("-------------------txRes: %v", txRes) // require.NoError(t, err) @@ -569,9 +561,13 @@ func TestPacketForwardMiddleware(t *testing.T) { err = testutil.WaitForBlocks(ctx, 50, feeabs, gaia, osmosis) require.NoError(t, err) - // balace, err := feeabs.GetBalance(ctx, "feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", feeabs.Config().Denom) - // require.NoError(t, err) - // fmt.Printf("---------------balace %v\n", balace) + // secondHopDenom := transfertypes.GetPrefixedDenom(channFeeabsOsmosis.PortID, channFeeabsOsmosis.ChannelID, uatomOnFeeabs) + // secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) + // secondHopIBCDenom := secondHopDenomTrace.IBCDenom() + + contractBalance, err := feeabs.GetBalance(ctx, "feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", feeabs.Config().Denom) + require.NoError(t, err) + fmt.Printf("---------------contractBalance %v\n", contractBalance) feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index a2b705e..192eda1 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -30,7 +30,7 @@ var ( feeabsImage = ibc.DockerImage{ Repository: "ghcr.io/notional-labs/fee-abstraction", - Version: "2.0.3", + Version: "2.0.4", UidGid: "1025:1025", } From cf836b23d4dbac42947e725f3dc702cbc948255a Mon Sep 17 00:00:00 2001 From: GnaD Date: Thu, 20 Apr 2023 13:38:24 +0700 Subject: [PATCH 21/50] done --- tests/interchaintest/packet_foward_test.go | 75 +++------------------- 1 file changed, 8 insertions(+), 67 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 6bc72a8..a3611e1 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -87,7 +87,6 @@ func TestPacketForwardMiddleware(t *testing.T) { r := interchaintest.NewBuiltinRelayerFactory( ibc.CosmosRly, zaptest.NewLogger(t), - // relayer.CustomDockerImage("ghcr.io/cosmos/relayer", "main", rly.RlyDefaultUidGid), ).Build(t, client, network) ic := interchaintest.NewInterchain(). @@ -425,7 +424,6 @@ func TestPacketForwardMiddleware(t *testing.T) { // instantiate swapRouterContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, swapRouterContractID, initMsg, true) require.NoError(t, err) - fmt.Printf("swapRouterContractAddress: %s", swapRouterContractAddress) // execute msg = fmt.Sprintf("{\"set_route\":{\"input_denom\":\"%s\",\"output_denom\":\"%s\",\"pool_route\":[{\"pool_id\":\"%s\",\"token_out_denom\":\"%s\"}]}}", @@ -444,8 +442,8 @@ func TestPacketForwardMiddleware(t *testing.T) { // instantiate initMsg = fmt.Sprintf("{\"swap_contract\":\"%s\",\"governor\": \"%s\"}", swapRouterContractAddress, owner) xcsContractAddress, err := osmosis.InstantiateContract(ctx, osmosisUser.KeyName, xcsContractID, initMsg, true) + _ = xcsContractAddress require.NoError(t, err) - fmt.Printf("--------------------xcsContractAddress %s", xcsContractAddress) // Swap Feeabs(uatom) to Osmosis // send ibc token to feeabs module account gaiaHeight, err = gaia.Height(ctx) @@ -456,7 +454,7 @@ func TestPacketForwardMiddleware(t *testing.T) { transfer = ibc.WalletAmount{ Address: dstAddress, Denom: gaia.Config().Denom, - Amount: amountToSend, + Amount: 1_000_000, } tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) @@ -473,7 +471,6 @@ func TestPacketForwardMiddleware(t *testing.T) { feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) - fmt.Printf("----------------moduleBalace %v\n", feeabsModule.Balances) current_directory, _ := os.Getwd() param_change_path := path.Join(current_directory, "proposal", "proposal.json") @@ -498,81 +495,25 @@ func TestPacketForwardMiddleware(t *testing.T) { _, err = cosmos.PollForProposalStatus(ctx, feeabs, height, height+10, "2", cosmos.ProposalStatusPassed) require.NoError(t, err, "proposal status did not change to passed in expected number of blocks") - hostZoneConfig, err := QueryFeeabsHostZoneConfig(feeabs, ctx) + _, err = QueryFeeabsHostZoneConfig(feeabs, ctx) require.NoError(t, err) - fmt.Printf("---------------------hostZoneConfig: %v\n", hostZoneConfig) // xcs - memo := ` - { - "wasm": - { - "contract":"osmo17p9rzwnnfxcjp32un9ug7yhhzgtkhvl9jfksztgw5uh69wac2pgs5yczr8", - "msg": - { - "osmosis_swap": - { - "output_denom":"ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878", - "slippage": - { - "twap": - { - "slippage_percentage":"20", - "window_seconds":10 - } - }, - "receiver":"feeabs/feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", - "on_failed_delivery":"do_nothing", - "next_memo":{} - } - } - } - }` - // "next_memo":{} feeabsHeight, err = feeabs.Height(ctx) require.NoError(t, err) - transfer = ibc.WalletAmount{ - Address: xcsContractAddress, - Denom: uatomOnFeeabs, - Amount: 1_000_000, - } - - transferTx, err := feeabs.SendIBCTransfer(ctx, channFeeabsOsmosis.ChannelID, feeabsUser.KeyName, transfer, ibc.TransferOptions{Memo: string(memo)}) + transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) require.NoError(t, err) - _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) + _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+100, transferTx.Packet) require.NoError(t, err) err = testutil.WaitForBlocks(ctx, 1, feeabs) require.NoError(t, err) - // feeabsHeight, err = feeabs.Height(ctx) - // require.NoError(t, err) - - // transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) - // require.NoError(t, err) - // _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+50, transferTx.Packet) - // require.NoError(t, err) - // err = testutil.WaitForBlocks(ctx, 1, feeabs) - // require.NoError(t, err) - - // txRes, err := feeabs.GetTransaction(txhash) - // fmt.Printf("-------------------txRes: %v", txRes) - // require.NoError(t, err) - - err = testutil.WaitForBlocks(ctx, 50, feeabs, gaia, osmosis) - require.NoError(t, err) - - // secondHopDenom := transfertypes.GetPrefixedDenom(channFeeabsOsmosis.PortID, channFeeabsOsmosis.ChannelID, uatomOnFeeabs) - // secondHopDenomTrace := transfertypes.ParseDenomTrace(secondHopDenom) - // secondHopIBCDenom := secondHopDenomTrace.IBCDenom() - - contractBalance, err := feeabs.GetBalance(ctx, "feeabs1efd63aw40lxf3n4mhf7dzhjkr453axurwrhrrw", feeabs.Config().Denom) + err = testutil.WaitForBlocks(ctx, 100, feeabs, gaia, osmosis) require.NoError(t, err) - fmt.Printf("---------------contractBalance %v\n", contractBalance) - feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) + balance, err := feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) require.NoError(t, err) - fmt.Printf("----------------moduleBalace %v\n", feeabsModule.Balances) - // require.Greater(t, moduleBalace, 1) + require.Greater(t, balance, 1) }) } From 102d0d97eea3efc3cec93339330d44c2cbba30e1 Mon Sep 17 00:00:00 2001 From: GnaD Date: Thu, 20 Apr 2023 13:50:22 +0700 Subject: [PATCH 22/50] nit --- tests/interchaintest/packet_foward_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index a3611e1..b5c8ac3 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -513,7 +513,7 @@ func TestPacketForwardMiddleware(t *testing.T) { balance, err := feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) require.NoError(t, err) - require.Greater(t, balance, 1) + require.Greater(t, balance, int64(1)) }) } From 0a67206568252f05cf890a50c339da8d2719d658 Mon Sep 17 00:00:00 2001 From: ducnt131 Date: Fri, 21 Apr 2023 10:20:15 +0700 Subject: [PATCH 23/50] delete go.work.sum --- go.work.sum | 1314 --------------------------------------------------- 1 file changed, 1314 deletions(-) delete mode 100644 go.work.sum diff --git a/go.work.sum b/go.work.sum deleted file mode 100644 index a317470..0000000 --- a/go.work.sum +++ /dev/null @@ -1,1314 +0,0 @@ -4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cosmossdk.io/api v0.2.6/go.mod h1:u/d+GAxil0nWpl1XnQL8nkziQDIWuBDhv8VnDm/s6dI= -cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= -cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= -cosmossdk.io/core v0.3.2/go.mod h1:CO7vbe+evrBvHc0setFHL/u7nlY7HJGzdRSBkT/sirc= -cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= -cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= -cosmossdk.io/depinject v1.0.0-alpha.3 h1:6evFIgj//Y3w09bqOUOzEpFj5tsxBqdc5CfkO7z+zfw= -cosmossdk.io/depinject v1.0.0-alpha.3/go.mod h1:eRbcdQ7MRpIPEM5YUJh8k97nxHpYbc3sMUnEtt8HPWU= -cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= -cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= -cosmossdk.io/math v1.0.0-beta.4/go.mod h1:An0MllWJY6PxibUpnwGk8jOm+a/qIxlKmL5Zyp9NnaM= -cosmossdk.io/math v1.0.0-rc.0 h1:ml46ukocrAAoBpYKMidF0R2tQJ1Uxfns0yH8wqgMAFc= -cosmossdk.io/math v1.0.0-rc.0/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= -cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= -cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= -filippo.io/edwards25519 v1.0.0-beta.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o= -filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= -filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= -git.sr.ht/~sircmpwn/getopt v0.0.0-20191230200459-23622cc906b3/go.mod h1:wMEGFFFNuPos7vHmWXfszqImLppbc0wEhh6JBfJIUgw= -git.sr.ht/~sircmpwn/go-bare v0.0.0-20210406120253-ab86bc2846d9/go.mod h1:BVJwbDfVjCjoFiKrhkei6NdGcZYpkDkdyCdg1ukytRA= -github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= -github.com/Abirdcfly/dupword v0.0.7/go.mod h1:K/4M1kj+Zh39d2aotRwypvasonOyAMH1c/IZJzE0dmk= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= -github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= -github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= -github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/avast/retry-go/v4 v4.3.3 h1:G56Bp6mU0b5HE1SkaoVjscZjlQb0oy4mezwY/cGH19w= -github.com/avast/retry-go/v4 v4.3.3/go.mod h1:rg6XFaiuFYII0Xu3RDbZQkxCofFwruZKW8oEF1jpWiU= -github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= -github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.203 h1:pcsP805b9acL3wUqa4JR2vg1k2wnItkDYNvfmcy6F+U= -github.com/aws/aws-sdk-go v1.44.203/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= -github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= -github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= -github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= -github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= -github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= -github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= -github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= -github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= -github.com/bufbuild/buf v1.9.0/go.mod h1:1Q+rMHiMVcfgScEF/GOldxmu4o9TrQ2sQQh58K6MscE= -github.com/bufbuild/connect-go v1.0.0/go.mod h1:9iNvh/NOsfhNBUH5CtvXeVUskQO1xsrEviH7ZArwZ3I= -github.com/bufbuild/protocompile v0.1.0/go.mod h1:ix/MMMdsT3fzxfw91dvbfzKW3fRRnuPCP47kpAm5m/4= -github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.10 h1:HW3XP9G3mXr0gYPfxCAQLD29u+Ys0uIeotv9RWfnhrM= -github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.10/go.mod h1:5g1oM4Zu3BOaLpsKQ+O8PAv2kNuq+kPcA1VzFbsSqxE= -github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= -github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/circl v1.3.1/go.mod h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= -github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20220817183557-09c6e030a677/go.mod h1:890yq1fUb9b6dGNwssgeUO5vQV9qfXnCPxAJhBQfXw0= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= -github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/coinbase/rosetta-sdk-go/types v1.0.0 h1:jpVIwLcPoOeCR6o1tU+Xv7r5bMONNbHU7MuEHboiFuA= -github.com/coinbase/rosetta-sdk-go/types v1.0.0/go.mod h1:eq7W2TMRH22GTW0N0beDnN931DW0/WOI1R2sdHNHG4c= -github.com/cometbft/cometbft v0.37.0 h1:M005vBaSaugvYYmNZwJOopynQSjwLoDTwflnQ/I/eYk= -github.com/cometbft/cometbft v0.37.0/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= -github.com/confio/ics23/go v0.7.0/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= -github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cosmos/btcutil v1.0.4/go.mod h1:Ffqc8Hn6TJUdDgHBwIZLtrLQC1KdJ9jGJl/TvgUaxbU= -github.com/cosmos/cosmos-db v0.0.0-20221226095112-f3c38ecb5e32/go.mod h1:kwMlEC4wWvB48zAShGKVqboJL6w4zCLesaNQ3YLU2BQ= -github.com/cosmos/cosmos-proto v1.0.0-beta.1/go.mod h1:8k2GNZghi5sDRFw/scPL8gMSowT1vDA+5ouxL8GjaUE= -github.com/cosmos/cosmos-sdk v0.45.12/go.mod h1:ZAdIs09zttoA3aSwQCTK9gecOThUVNnzBSVj3DiS6UY= -github.com/cosmos/cosmos-sdk v0.47.0 h1:GKYtBpvjwuDEVix1vdnQpq7PuEOnItuEK0vdAL2cZ5g= -github.com/cosmos/cosmos-sdk v0.47.0/go.mod h1:FTtZbqiHCZ2vun9WrPq6qLQafNKkAuIhLAxzLjr2TiI= -github.com/cosmos/cosmos-sdk/db v1.0.0-beta.1.0.20220726092710-f848e4300a8a/go.mod h1:c8IO23vgNxueCCJlSI9awQtcxsvc+buzaeThB85qfBU= -github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= -github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= -github.com/cosmos/gogoproto v1.4.2/go.mod h1:cLxOsn1ljAHSV527CHOtaIP91kK6cCrZETRBrkzItWU= -github.com/cosmos/gogoproto v1.4.4/go.mod h1:/yl6/nLwsZcZ2JY3OrqjRqvqCG9InUMcXRfRjQiF9DU= -github.com/cosmos/gogoproto v1.4.7 h1:RzYKVnsEC7UIkDnhTIkqEB7LnIQbsySvmNEqPCiPevk= -github.com/cosmos/gogoproto v1.4.7/go.mod h1:gxGePp9qedovvl/StQL2BIJ6qlIBn1+9YxR0IulGBKA= -github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= -github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.0.0 h1:j4kyywlG0hhDmT9FmSaR5iCIka7Pz7kJTxGWY1nlV9Q= -github.com/cosmos/ibc-go/v7 v7.0.0/go.mod h1:BFh8nKWjr5zeR2OZfhkzdgDzj1+KjRn3aJLpwapStj8= -github.com/cosmos/ics23/go v0.9.1-0.20221207100636-b1abd8678aab h1:I9ialKTQo7248V827Bba4OuKPmk+FPzmTVHsLXaIJWw= -github.com/cosmos/interchain-accounts v0.2.6 h1:TV2M2g1/Rb9MCNw1YePdBKE0rcEczNj1RGHT+2iRYas= -github.com/cosmos/interchain-accounts v0.2.6/go.mod h1:lUzWNzCiCtIEYZefac5+YgEBz2aR39nMS374jIv1c7o= -github.com/cosmos/interchain-accounts v0.5.1/go.mod h1:JB3gKbX8geQhxEIrBQtpDco0cyKMUDpVhugb78e5z6U= -github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= -github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= -github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJFxv2Li8= -github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/daixiang0/gci v0.8.1/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= -github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= -github.com/decred/base58 v1.0.4 h1:QJC6B0E0rXOPA8U/kw2rP+qiRJsUaE2Er+pYb3siUeA= -github.com/decred/base58 v1.0.4/go.mod h1:jJswKPEdvpFpvf7dsDvFZyLT22xZ9lWqEByX38oGd9E= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= -github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32PaqRpvoEkKBy5M= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v0.0.0-20200901110807-248326c1351b/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= -github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= -github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= -github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.17.0/go.mod h1:B82dxtBvxG0KaPD8/hfSV+VcHD+Lg/xUS4JuQn1P4cM= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.4.0/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.5.1/go.mod h1:uz5PQ3d0gz7mSgzZhSJToM6ALPaKCdSnl58/Xb5hzr8= -github.com/go-git/go-git/v5 v5.5.2/go.mod h1:BE5hUJ5yaV2YMxhmaP4l6RBQ08kMxKSPD4BlxtH7OjI= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.2/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= -github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= -github.com/golangci/golangci-lint v1.50.1/go.mod h1:AQjHBopYS//oB8xs0y0M/dtxdKHkdhl0RvmjUct0/4w= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= -github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.0 h1:bzrYP+qu/gMrL1au7/aDvkoOVGUJpeKBgbqRHACAFDY= -github.com/hashicorp/go-getter v1.7.0/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= -github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= -github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/informalsystems/tm-load-test v1.3.0/go.mod h1:OQ5AQ9TbT5hKWBNIwsMjn6Bf4O0U4b1kRc+0qZlQJKw= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jhump/protoreflect v1.13.1-0.20220928232736-101791cb1b4c/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/keybase/go-keychain v0.0.0-20190712205309-48d3d31d256d/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= -github.com/kkHAIKE/contextcheck v1.1.3/go.mod h1:PG/cwd6c0705/LM0KTr1acO2gORUxkSVWyLJOFW5qoo= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= -github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= -github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linxGnu/grocksdb v1.7.10/go.mod h1:0hTf+iA+GOr0jDX4CgIYyJZxqOH9XlBh6KVj8+zmF34= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.0/go.mod h1:PeAhzU8qkCwdGEMTEupsHJNlQu2gZopMC6RjbhmHeDc= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/mgechev/revive v1.2.4/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b h1:QrHweqAtyJ9EwCaGHBu1fghwxIPiopAHV06JlXrMHjk= -github.com/mimoo/StrobeGo v0.0.0-20220103164710-9a04d6ca976b/go.mod h1:xxLb2ip6sSUts3g1irPVHyk/DGslwQsNOo9I7smJfNU= -github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/moby/buildkit v0.10.4/go.mod h1:Yajz9vt1Zw5q9Pp4pdb3TCSUXJBIroIQGQ3TTs/sLug= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= -github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= -github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= -github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= -github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= -github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C2S41udRnToE= -github.com/nishanths/exhaustive v0.8.3/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2 h1:VUeAkXDqL21yF1mCdTOOYf2E7HYfWXG2T+c9nv09Z30= -github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419073816-a38fbcca50f2/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= -github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= -github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= -github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= -github.com/petermattis/goid v0.0.0-20221215004737-a150e88a970d/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pjbgf/sha1cd v0.2.3/go.mod h1:HOK9QrgzdHpbc2Kzip0Q1yi3M2MFGPADtR6HjG65m5M= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/polyfloyd/go-errorlint v1.0.5/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= -github.com/prometheus/common v0.40.0 h1:Afz7EVRqGg2Mqqf4JuF9vdvp1pi220m55Pi9T2JnO4Q= -github.com/prometheus/common v0.40.0/go.mod h1:L65ZJPSmfn/UBWLQIHV7dBrKFidB/wPlF1y5TlSt9OE= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/gogrep v0.0.0-20220828223005-86e4605de09f/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= -github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= -github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.20.0/go.mod h1:0GaP+ecfZMXShS0A94CJn6aEuPRILv8h/VuWI9n1ygg= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= -github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= -github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= -github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= -github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/strangelove-ventures/interchaintest/v7 v7.0.0-20230322043324-cb6ba0947fff h1:rXB1n948rKvD2J/IL88ydlmYh1Ow9Oa+8DO1VhojfD8= -github.com/strangelove-ventures/interchaintest/v7 v7.0.0-20230322043324-cb6ba0947fff/go.mod h1:a6/7YH8Mo+a3BG1NQZ8am/FcwHhphyCc2tpHCEvTeJM= -github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= -github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= -github.com/tendermint/btcd v0.1.1 h1:0VcxPfflS2zZ3RiOAHkBiFUcPvbtRj5O7zHmcJWHV7s= -github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 h1:hqAk8riJvK4RMWx1aInLzndwxKalgi5rTqgfXxOxbEI= -github.com/tendermint/tm-db v0.6.6/go.mod h1:wP8d49A85B7/erz/r4YbKssKw6ylsO/hKtFk7E1aWZI= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM= -github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= -github.com/timonwong/loggercheck v0.9.3/go.mod h1:wUqnk9yAOIKtGA39l1KLE9Iz0QiTocu/YZoOf+OzFdw= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tomarrell/wrapcheck/v2 v2.7.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= -github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.36.3/go.mod h1:Dts42MGkzZne2yCru741+bFiTMWkIj/LLRizad7b9tw= -go.opentelemetry.io/otel v1.11.0/go.mod h1:H2KtuEphyMvlhZ+F7tg9GRhAOe60moNx61Ex+WmiKkk= -go.opentelemetry.io/otel/metric v0.32.3/go.mod h1:pgiGmKohxHyTPHGOff+vrtIH39/R9fiO/WoenUQ3kcc= -go.opentelemetry.io/otel/trace v1.11.0/go.mod h1:nyYjis9jy0gytE9LXGU+/m1sHTKbRY0fX0hulNNDP1U= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.12.0/go.mod h1:TsIjwGWIx5VFYv9KGVlOpxoBl5Dy+63SUguV7GGvlSQ= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20221019170559-20944726eadf/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0 h1:LGJsf5LRplCck6jUCH3dBL2dmycNruWNF5xugkSlfXw= -golang.org/x/exp v0.0.0-20230310171629-522b1b587ee0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= -golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0 h1:I2SlFjD8ZWabaIFOfeEDg3pf0BHJDh6iYQ1ic3Yu/UU= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230202175211-008b39050e57/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44 h1:EfLuoKW5WfkgVdDy7dTK8qSbH37AX5mj/MFh+bGPz14= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= -modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= -modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.21.0 h1:4aP4MdUf15i3R3M2mx6Q90WHKz3nZLoz96zlB6tNdow= -modernc.org/sqlite v1.21.0/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= -mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.3 h1:163N50IHFqr1phZens4FQOdPgfJscR7a562mjQqeo4M= -pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= From be9f1dfc73a27b80eb50f9ed81caf0808a9cc1ea Mon Sep 17 00:00:00 2001 From: GnaD Date: Mon, 24 Apr 2023 16:05:42 +0700 Subject: [PATCH 24/50] correct register interface: --- x/feeabs/types/codec.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/feeabs/types/codec.go b/x/feeabs/types/codec.go index bf9ab7b..52e20cf 100644 --- a/x/feeabs/types/codec.go +++ b/x/feeabs/types/codec.go @@ -36,14 +36,14 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &MsgSwapCrossChain{}, ) - msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) - registry.RegisterImplementations( (*govtypes.Content)(nil), &AddHostZoneProposal{}, &DeleteHostZoneProposal{}, &SetHostZoneProposal{}, ) + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } func init() { From 4f0689e8c7721a456240187a7cd9b902839fde56 Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Tue, 25 Apr 2023 16:15:40 +0700 Subject: [PATCH 25/50] clean todo --- x/feeabs/keeper/grpc_query.go | 1 - x/feeabs/keeper/keeper.go | 1 - x/feeabs/module.go | 1 - x/feeabs/types/events.go | 2 -- 4 files changed, 5 deletions(-) diff --git a/x/feeabs/keeper/grpc_query.go b/x/feeabs/keeper/grpc_query.go index 84b213d..9dd90ff 100644 --- a/x/feeabs/keeper/grpc_query.go +++ b/x/feeabs/keeper/grpc_query.go @@ -34,7 +34,6 @@ func (q Querier) OsmosisArithmeticTwap(goCtx context.Context, req *types.QueryOs return nil, err } - // TODO: move to use TWAP response return &types.QueryOsmosisArithmeticTwapResponse{ ArithmeticTwap: twapRate, }, nil diff --git a/x/feeabs/keeper/keeper.go b/x/feeabs/keeper/keeper.go index b14c105..64af8e9 100644 --- a/x/feeabs/keeper/keeper.go +++ b/x/feeabs/keeper/keeper.go @@ -35,7 +35,6 @@ func NewKeeper( sk types.StakingKeeper, ak types.AccountKeeper, bk types.BankKeeper, - //TODO: need to use expected keeper transferKeeper ibctransferkeeper.Keeper, channelKeeper types.ChannelKeeper, diff --git a/x/feeabs/module.go b/x/feeabs/module.go index ed05c7c..4ce3f30 100644 --- a/x/feeabs/module.go +++ b/x/feeabs/module.go @@ -49,7 +49,6 @@ func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { } // RegisterInterfaces registers the module interface -// TODO: need to implement func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { types.RegisterInterfaces(reg) } diff --git a/x/feeabs/types/events.go b/x/feeabs/types/events.go index 4f6b384..824a7ad 100644 --- a/x/feeabs/types/events.go +++ b/x/feeabs/types/events.go @@ -2,11 +2,9 @@ package types const ( EventTypePacket = "receive_feechain_verification_packet" - EventTypeEpochEnd = "epoch_end" // TODO: need to clean up (not use) EventTypeEpochStart = "epoch_start" AttributeKeyAckSuccess = "success" - AttributeKeyClientID = "client_id" AttributeKeyAck = "acknowledgement" AttributeKeyAckError = "ack_error" AttributeEpochNumber = "epoch_number" From fe8c4154648d5e9ac7badc9a07e57fd055d1d4cf Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 26 Apr 2023 16:19:46 +0700 Subject: [PATCH 26/50] update osmosis contract --- .../bytecode/crosschain_swaps.wasm | Bin 437302 -> 437733 bytes tests/interchaintest/packet_foward_test.go | 4 ++++ 2 files changed, 4 insertions(+) diff --git a/tests/interchaintest/bytecode/crosschain_swaps.wasm b/tests/interchaintest/bytecode/crosschain_swaps.wasm index 7d32608b8b598faccac5bcd16d5b1e777590c443..910814081e31ee658db135a1b70ff5d8dbd74121 100644 GIT binary patch delta 23612 zcmc(neUw~hec$i%%*)Qs&a7som9=`a?u><*6}yrkuxn%+>n@gMhlB!$rasgVmv9cr zikyJ!)8-FgmY~FIP=mmbD>!Zu#nemU`YeIQ;@Ax$5oEyv6fA-OQv|g^G(NBawHCpF ze!jow-q~5bSx!iMbhP*0=RU8$_qRKLc4FP*-&i;QfwKSL@4x--@&k95UGu@xpZ|gP zqv>CK+I_Csh>LCiiN5AqT^IVA>vTQZ*IXYLM+?XLn&atxf8i#!jKsxce{s6)qvmDY z?hChE=qV4|Cm=tZde%3eBzQvp(Zqdi9Fr z=k85)7Z>CDgny{Sb!^gqLf6`kXkOR;tD}$EHEI029nr^2Nq^JTHV?!r()&N-b~c}O zSi0h~?pNH3^p?-MXN|0g%Z)o-%?*SN#wB}ZuJ?b|Z5&yhxIKf#{z_lDN{6^S;h)gT zE7C81){S(YcBO2CwWbDNYVRa!MoEz)J>96z$4W_~DMNe<6E71Cv`P3kUnys+;hS>e`y{k8w>F>FeSv!knjgD945HFbfS2rrSU7MqPjUs?WRY z%T-orj-~f}-d(qGY_f2I^TdT6(Q#dwe}QYD{6Bh_LF4I`hu!b6>kmBa#NUUMKIL%$26&l}Td>8bF4IO1B|iX@ELVs@2#}GS4xW zy}rPLQ{@bTVfdVYxWsAC3#?Y#FcAA)^~xpfd(#)(=p}IDZ+*c{44t#7bp8u&{dG$l z$XMOM8xG!JAD05U>KEO2t^sw6;#yETBNWC6r^a!kzc_Jk+65_&O~teKHv8hSdqu?K zQ8W36=myX;khZ_%-rw1p3^Yr%L4h;c5q*!zlIZH_aZP&8#wDc0zVs<~$_9<$^ zm$ds_ybY#1kGb*dkej1$*CgCA1iG33sBx50^ZEDDyLNitF}LLs(DCFkx4j>xZu?WE zCj9Z&uKoXT=_}L9m)&LkCO25Wnm+r>?lxCTKk#L@@up4VQIs@pzpV-LxBc-_vo4Sv zEj7o4vxQQ#Rx6(evdPM`6~`Yv!Wy-FaJuOcx9MzQe(s3@I3_0=Fz3Ap><*;;z+5jQo7;vA1qaJp2W);jX@ z0#vsQ+czC|UqmU7e8p|gmG%h-;Xm-ouOK4Pe((IM8|U)LuevSuOxR^=eetU%-PWCO zv%7PiIjpf6(;RljHO{!ExlKF!w96R=`(Ucn+*&J$Sr$vvjbEQCquRfJ!d+Y5W-OMD zea+p$%Afd}+qH6Bqwg*?`_x^cYCIkIy8G7%*OT9JtJjQYd^rwZ)>f*|oHml)_4TD= z9kgS8>Fdjm_55#M{xc;QO(*c?k9QB^pk}{y5BhA z7j+$<#2n?ieggB9>$>z+kGm_LXJF`?7Rw~F2s@vgh#Gekk^WJ$%Kv`;m-t`d|B5T3 zWPdgNAJhJ_yMAYDHT}xtZuea?TL;pO-*uJF*u9CHP9li4@XGZv=L*gjV4^5F7MVe^ zmfNG@b|tq*!ma0a=N=g>S8#Wg^&H~v`F6J^j@tf4&Uu_YXloc+4iCj35KD-(WJ*P#i2P}emR{%&1YP51*`lf#8BovfAa;xyLM zLn!lwKqzzSf2LpkBVK{FCm59iP#yS&}^ zw0C&n^B0Al7ql1h_TuvPV%}a_-d?hHt;phK?SVR3bl^cToE1-s_BZq zcWVm$xb35V?>2WlG^W07|2l|Qi}vWWFny0gL)w|%xS7ct5@ohV%S)7LErB` z#>2d9`*XRs{b*p@{kA{QvG3jE7Da|KEqfD|us=%on;;On-(wIix(`&;m~gtKOq z9bn$H(8bG$qx?*WqrxO`T&oOmV78r%_O#q)2uLbnnCM_!g}(n3U7i#>6Fvq{6=;eT zxthtq6%rV3e8~BovExNjhwC9OXs{>}DJN#0mW_0Rv=t(eIWCdmWQ2>lVM-@O!QY^) ztU=NM;uNAf>QWZl)062nCR^y5u#kvT_M)iY`a+VBdr!j#H5~700FN$tG{>X%)Yj=Z z0cY84<%^wyp$N5 z7;|MtuF+Kbhd*;`2N6Gn@5D0D!6i`fFI|v|H7RFU#*55eMapdbxobV2ZM^|<0KmTq z+w+8!jR%92=6~Xq6 zpSw*P?cFV{$_;NKbcJQLN5o9GxIEqLf8QD(Usk2Lp9krHw;&P2==c4qf6k6&q7S&9 zNAgMhigJSdliYI%@ap^i)IYZ~95?nf5k0snQiw?P-C)~iIP8~%6b|9m8>JrxW43LQ zsT_CJ1IT8&F0xS%?ACNc6Zs`%pHC(lvNsr-GYXI+WvG^&hrmeR>iqia&!H{$Qt6Q# z(81G6j`W+%^rF>`|0>r?ip*}LtilbVclnJ@qZSV=GTOfDQ#)37kW|G>STBe=KhU_} z76hXG#ykv%bL=*f!?W2qUsBMP&yB7vyX&$>_v5R|=xQ007vgxdQ;4K`X8U-HaUD#r zk=Tr`;mqi2@Q(CIoDHJ;Oc5)C$U$5fj~4rrp&ROBGP3b?`ll!SA)?3$2KGKCVz4zn#tZT|r5N)Uo416r)safE zEKLa!J9#kfs(N*(nEt1Nf58M41W`gM$&+Z~(I}dXBAy%5$q##C^VV(zFgYHdpBB`li=qCrqVLwzsBBKUDPV z6JXZH@gowCj5xVXTlG2Ss|~mDw3^nLB&_N0JI_!-kda5Q`^8lYbV2fcAEd-!I_zk4h@3Os1^U`NreIf{18=6iNc z!fwl}86kBRPxA+?W{)J}j6AlW=6ZpeHiS;GuEb~CR4QLQ! zhP*)st<;`7z+g6jBXkmY4!8{qyA#*pm-NZ3 zGeFwLAq(~>BeudTwI{AN&dO8on3d_-q zO#Yq&aX45I%cYEM#o`Za#fM{L0}Z>je6GU{CSfD-8-xY=2cSs$z>luBjpK>!o7xJ3 zqvaZ>z`EjEf;7|#qX7;>Bxm3ot_!8~rTuO2Qo1)*552!ox0_5+2^ zbaHs#;i&N_uVu=$be<3U`t!o5S;VYH%}Ctlqh^XrgO<9F7TSvWXstQc)To16n^Cyy zgpxS)u@Yj;fPk@JK9gX5k&#U==|Xc!rD{t}Bb=IN;Egf$V3%lIkhy8S&Zgx%>$OfK)EM8*Cx zK<2=EbtNcpM!^7(Im_V{5YYV`_oqsEtWH<8E|jJUZ)uI)3&l?-y@6EkA_S&ss^q}^ zhofYu@ncXv9?kYi2MSHc@RDg#W})Tt?Ia7dvW?^btwY_`!?Y^OfmUvXh!6+1E%p&K zE)w99PNV}GH2J93v&fI48v+aD+xR`B-`PG1d>Y+Rq2!1Zhm(#?DikYgPu>cvf zH%`0Svvj6?v|u8NyYfxo5bPBz4ef|#bY&ZjYkh~iqgE`@k_I*yA2dx5;}qr8-mNDl z+OI3mvI9hVW&;2q@g1>jnf3*RK!KhoBSdF}{#-WrKwozL#!l5b1fYN5Z2)2AGN9|# zFB0fIFz+P)?Vk_mcBb4-1B$ zWm~JVPzZ0bwVd{o5Z`25-IfsG)RuCt>9XE}7#ZFWr7sk)hGvZQR>ec`n?yt#k`>40 zw4zQw{V#OF+sBvbG9`vpU@SZPa^@1AYjzM3fgJlD&a;=z4oQ=xU~3#r{rJR3-hRjZ zCqDkTS+f>go|?rjm_dvQpiFUEG3DwGtnyrzwZ^8rDlcra$@_JdVh_Z2+a~uGgrN8K z1rJkmq2N3F`X>ETzD7LG`1f$8aLm33J}vs0Y+BM%vWTL_oUgxtSErEiz)IcQ{&2DJ zcP6YJDrz%omhGMliSfsyQ{`kxeqsTm#ovd_;oyC^iKv;u^yNdCc+k+)yE*HAGHMLb zVIPv_DMU;rAjfJyXe+PG;~puGL}hvbp99 z298Lp6*_2(!esPL$+8)n=3P*e`4!0uogrDVBeK*&VHABZ8U4i9)@rT*+SBD_pnalj zkR^%Q!$@7)>@rce<#2Iad*+OJQ{W!s9nOjJ-kJ<{iKU+2x6;QQ4lwnHfb8TFecUJ7 z24r&u=ws|TAS7;>VzWBo&^@Y!)%&`E3?5 zhxGgBF8>B(=7Vv%9x%S+#q@v!l5yg8rt&)&7fXTA;J z>84;pG-Ak6PvO=dtC$ReZHRD1MC{`|trEd$TbMLXFnoRDZf_A+jmw?5a?|=&B`Ffy zD858@v+fOw040C-?Z521DJk6EtaCs+Y=X--qP&axDB?p{#*otx$gqfc&6P-JohNeq zL_vg0&jj2E{uoH+OKBtK=y$?Ub7tAz+c?heD)Z;+SA|d^NfHaLC*|7-0|6FA+XSt! zRdS&PpcD^cnkCmvk4IPsH`G0Qv?Ku{&4Ug5!?s zW@}l=oh25CG$3->haJ|EvsihSlojcj8``*+4nemN~vq8wqEvv#9KZ< zn_@2&+Y2uTZ5ni*>Og`7K}=vuhWHeR$s$-;z{(mF^-{uKwud!<8?0S&BtVs(01%)A*V*nYF;XGWVX_j;8Gq?gfjda4iO@n_0d2LAqBZ-# zY7037sgpTl8dtWgS@4h!BD@uD^$BPP-DTK?08^KQAxDeQQW_c0TaVrx3|pkLR?LaG_* zW|SM3>kVb=mHf(1&z%mhRbj&*os8eI+pZQvDxIahVpvi0^&J-8miO!`kMP)fttWu`?B23YeVkFJj!xnIZ5mY@u z0_B!*MW=BNTi9r4d=R3aaFdizC`b}(NX)TB#vLe|N5utjg9(J3TObwV7BV=-EyO-e zE@WKEH1K~1E@5jKTlX@EmEIX+5SPcwQE^_-)-Z~RGzi>GH1=1HSFo|5!7O=m4x?OP zy33jOyz?i;R zsn!Q;4L*cgg2yj{b^a`{&O^GaY`ie8?yA3GMXf$yC6G$1S`D0Tf{Are>z(6U{Iq7C z$^{&Po}izvU6#fp{#hL}wQV)oMY=&?{K9ivraTcEpcs3$?p4Qb%XCaT2X+4o$f4!y zKvbj$`2=MkUX{uB6~x9gm7Nj>5nq>x1Hr7g)jF3j1mF*|&Lgw3 zROcHyg_Q7sO`<_ms5WfS0NF0O?5c0Hs#UGNQPfGCP&8UJ+eKcj!k7Fd3KMFH)wI9w zt`GkEH64p3oiVRY5rNYdH96z;kyjSBkX2VmelLVAe(HO|7C-R{Tg+6&-cNb4_h@0J zUi~S+G(-XD$jq`^s;7aqXXMz=Wp&(ZXThJ*FTi`ddpmtz8(#9A2 z)7P){6P@z()SW1o{Y#OfCnRKv9GxoTA$814BAjrll*bZ+DSrxE;KhpAgp>$wL@?^f z$G3uoO>B%4s;I=knjJas2YOIUaR-4~1f+F>K7^1;!Jt$EA_S@q6yc=R9%if$a~lSLt94nrjiP%i}!t+v>rhl(x6rKgD-VP#wz z0_4L41i%1!JTL5YU!UbbLg0g%T9r?NmjmS>`1hC7@%8>i7CL$ln9+v?AWZi0Qs_u{ zi5)~AoO+xUiv#7@pa`Igjrd~NFb5eT?TK9V5#Hk{qw^}UrtoT)LEVi5U0ewBu z*T6TI8hwR0;ns;rhXkQ#d=`8KNo~&8jlObE@A)`{i1{pnIyEerkh%NvBMW z#L#X^eDd&c0QeJDn0tOC5WNfWC7DyR@cUADiLiZTAfaHwWO8l2RywCgX&_md^+?h? zH~N9jIbDnZenfdVWcjz{7NJQy>9*+m<(9kJsW=?N*RVfYSS)ML8JT9`&0J0pmR7cq z40A@ME{kq5WjDInQJ51=eQ9LMPL_h8w=?7 zmP-i|Gq7@=QzUhg=B z+$HJ$O%MU*;hZpqQ+1E7n2`s$nlr^Pa}noFFdiVKgd4)U86rK(-5;bqYJ7>!up;FY zWOeEiC-bI_4w&x9vv70Pwm-C4oebkMB!tE+F?YZ^&V;t5wA`7B(sKJ%p3%-|Kl8o8 zzZrct-n=9m)u%*V9-j;t{;7Sifx!c6T7i#o7Dq{YvCD|Od0#@wzQ$nG(2}`d)-(9@ zJuVTfus6#a%~;+@%yD-?k`57B2o{8_*vyTUx!w5nuo0-ERRvI|Djhzf?vgCz+oIsX zJ~&v)$wR`lWr2)9>^>kBAho*5bV0Kvx|pSPZFf%Kt_W%Z3C2Z^(P=TfvsTepsM&xZ65M>uOpL(|UQgRY}=Rnu*r9 z+j^jn^KYhkp5}JeETuljbN2C&rh?wO)d(_zTBF^<0yC3ZTjEl8(i6OYPTZ|@&_NDj zw}|a^uVkHN=L{cPVxNWDdK}p~&fE>d5_v8t47)%5RLlQ%r<$!Z6t7rX(fH#$qQ=Sy zk<-L^RaFtp0x8M0@n|-BUA!f`TOU6spHcf%VZ@nAydfURT8HC}7TjX^VCA8 ztmZqWBx>vsksE2iuB~c%-DbaS74?Bc8-v3IkAiHUzHPIAet?-m7#aMt*w{TKs{J(4 zK?U8hl9JI(L8*~%irF8&X;uWZPzuHfesK8KCeEsL^qGwU=c=f&&_Cr&3jOOd8zCTB zgAnAxp;ZzGnebtjBTZGLiYgFA-gNg=t&P;CAS{~BAF*HA+E3?gO78H{atUPy< z===?WnLSa>EY4(wSn4>4YSvvQmS5fq78txqpJjr%lQ|p9C3A2$kR-q*ub2o5^#Xz! z?)paw=A`4Ao|-v6XhQDwL}!f}Gjcr{g19F8l+F*4l_iP5&H|WizhNXNuyA`gLuiu_ z55^1ab=s0doaL#~?YW<)YW}3nOWqxTcXcn;U(`X6L#ITH zl6$YwF^rr#vzR+7w@YRWvIm2W3%7y~7p2FY=Kg==!`@8EZhRBvVO$G?F za(dv0$SZ|9%r1|>gX`p;AZ6w&=AvN98znu|6F0{|_yhzH(%5^gU)#^*TKy1ER1iR7 z&km>h4r5zPuH-%MIUFVWdXhC8&(%U?ElY|;OArycjbF@>4w(OGkyTou(j1qn4&}_4 z$clPc43NLQDOvpN6P5JSujVUYWN5sGQ(R`I2c4HVMM)}59?Q=XxaWnyr6!C2hU|g> zrY1{tAboVdZPJ2=wvW)RIAkcqwUTA1N`jqaNIJL0*E$S9_U2KcJfA}#PSb_1%B)zX zCU4lR21T*+1`F;i<|qiVfkV@4Hg62Do*`d^lgf)Zp_h`FWxxrLD;$(C-INvoQPwGk zLp89*(r|&kd17jUC-=(Op%5F%5fG|vAu_rMPEL`ya4PcRl4l5zheuqOtc_x$a(;BMD#u-pTy%U0gV^igq z>)Tv}D%u5@By1z!KyoG%GW&blBzRIHT!x@<>|WwiMFHpOpk&)q884`H-j2+)H=*sWYy-#Z1|Jd zt?H-X<6L%s3`Jq~EXu4|r6ywD?P>YV(MwoUd2R`MpM+mfC^nw-fozR*`LOn&eT_no zw!g=<5TUoynO`*-kFt=iYR>#!_iecH^)N(W|ClkNlQVNQtGz*5q)h+Fl^}TK2tyb!SBEQ z$v^qVC%sFx1(H{6DBJ$lW=UHZkE*ZJ2@F1W z{qctOu5)0o>Haa0UDfH&fm1yfIE3Q9`LXT?S^9B{>uh4GPEyb{7-*Togk6$@i8Z z)GrAA@ca-8n>dFUJIiVQ0@TQUVATK9?5G^;hqsFaA5$I0pT&#Iy;NvKX?VECrHOV#26beL;KBFcS^XG=zxWr*mGAHL(F zUqFaS>ci9an)ohH0xmg6$~&}|{!C_ciXz>;wukcwjW^fq{Y8Yz(~UPyyYT#0l4W!P z@F=Gu=%nqH!x75)5eVMsm;3fr~l^?`hM zniJsdx4MMW?z99&4~l{K?DWBR!#P{H2VyuU3~pfC@?$7=2&-FMG6H!!jDhPZjAFXD z#^X?*sY_d_n&{WtGVO@{+&D{QRP}XQ&qteh z8~Vyp8`m-Ul1e3y_Q5TCR6U@Tv0&mKwcq3G+Zw*B#Ouk9n|)V_x6^ej%=O?GT4>M* zgzHr*gaOoOb0wnEcr6u{K8b4PQee8#91OQSijC<;TQJ7x>P zjTiQwC>cx-Zt=sfzo6R`?C0Dudd993aw9nWI^nTO`h}}}lP^<)BZgOI(+7B2mQv7Y zIfDmrk*Um>B$krhs?6sg?o&59sv31gN6nYoYtX@QkqHZt6zoGf9D$ye(P0{$#CVPQ;jpe=-XBsXq<&F_egVMppn zhjk^PY;i(7z?S3>!8tCOeD}mUO(?L8`}MLbTOYE21SkNYF=^?1|FEn&0TeT zpSFK9(@TwqY);}7du#@nEl=hoF6Q@rqILXw!aE9y<45{B@e(qT5xd!v+r@crQl0e7Nct-u<43s*gQXbjKiu2gq;jsexmM-z-sa}CXIp%tw>g?W@@H;r`2zf(>$#`7lImP#syRsc1mzXks^*G`xVbC8^0V$W zHzwKtbMI)lv?r~P`J)xeo#Xzn$`!k#8I=P!Mvq#VCI4=B^vO!r*L3x*18I_f;*{VGEHJIuGh=<|b8gGf<(b>NqNlIcTkYqAv^wUW z)67Z!QQ`BJ~mqGpu!u%(OjYCl@ZlBOUvP)?LybfV=wF287xuJO}G zv+DPh|L4#Axf@--Dxgy&R28utt28SEXx;9|;+~Q>{k+kCr3 zTdRG{(A=3n`~`Q*mYw7ADfW}byQ7mT8Gnv4Q2y^cL8sAt`xEZpF#m_2a67iIU?Yu7 zf@Qw&gllaF2Cwhg!@w6Mi~OeJ?%HM(dZD6(f=7H2tHfoo&?#sXEwp{`@{@NGa*x)&f%4fdlHr=wg zfP&Q>yy4&t)^RDI>wnUH>n2dQAg%?a`-H+2;gp;-`b#tSj!8&y=R`XFv1V_&^J607 zk*JydU344h>CcD1*$_4f8>PQehKLK=?S;152haW z^OYw2@fU9RA8_iI<+U%nb$uo`n7=Q->dWpPw<7=Wm)({-t{91;EV=g{3C3Z6veK*z zB*!bwox<5%rMaSBJr88FRm&B}?>xmEE6UFK!?-*hkAl zE^5Y@WwPAS=(AA9Nc883@O$qWXh!+}e9HCKAyEmqN8s5N`H838#5js`BtpTds6nj_ zSW`W8$x>x^rhaZU3Yt?Y4EG7R>?M5Vc_9<$7Bp)!@cd7_GH|L!SwbM+cy zv3$qZ-2Kda_-k%*)u?(uRB86=bBU_aeBkTupCeqG6MpUb(Sk2W;mi6eeRD_)$shds z;Obhm<0GnX z9PH#O-}tP%VkfL3)h$lXrV(~NI~67O_aObFW`%z>{`K>(?}{ip zQOp19vu@pkcR#--pLw_MdGO@_S^Hq}*`0a%ZP(Y{`LWDRWf8<0zhRTixj1qj>U1(j zyb1~HI6D$gr31)SnzfNQ9oXivH)dkqo%U1wor$NCNtGyEpT@)fv~N{Z&NEC_SI@zo z$nR0pOr;e~_Uy@a_h&Bofa9T2$)^YWbo&GbNXit)DYM=&KUbA3i8GLrGVQQGQc1R` zJY1P}fE!WPf+qeVt z)Ca7@Wka@XXAQ@zj8;rI!QSUt;zZAQd|D;X7)0^JKK`5KLHn4f$tsdPm{!->q+_dD%Gal+nW76{rH=o>AfS1?`_r@ z&z6$a#{3Xasp^|CzlN$e{3L=Iw7_f1v_Gx$luRXnQ21m?st5yM3ag!dEF@*Pwu$a2 zAe!a9o9+C@Z2;OgZb&{6BVF0S6zi{K)q9(UUhF=DR#@s()5m*Kmo}z=|4ma;Nj7 zHB)JI82ATlAavnAG}=^CWZ|+sdt2^yv>U`OJe>$^5vm|#&s6G!CO+NEL$>D~O%K7< zz(thSu<^5}BY}&hI%I{awqlndJInTGqABRVd~s&+#lm6-EsC|&Y%Pq|uwi<&)w!yS zuU@bw6jV(%S_2kkoXvMN45{ICR|B|-vr{zOi4$Xe5NgJ)GS$;MItz+vY`FarOcdleT&b%?qiCzS{fnm{LFHjb#*_CrZ)-(Z)w1nD%;_7S;<4Mb$XacN4;*r^AsK%5 zMwV0p{v`u&_Nd?3J}>m@I|qPcow0?00M#9u={b|O+I}xQOv5vv7`0&y!cq2gR|9A= zS>5@F67`E9Z%_W;m+a$MpiQWJNUn+wzqhSbw(*S*` z#tFDTUNw4-)4nnPf{+993|Wv8$ZE%FBVfziC9qj2CgDg@=a=Lo4R+0m=wkuTRAFPF z^K?}c5BpQqCVLQtBHAfWRD&#K8wj8dTMbTvw?0;6I*?&TUeY-E{93=I4fqQ97X%Lz z7)ctNAm;QIj)WXl0}BD}5}1%`B+z#)iN$F}LI*4zB%SeYQSE5NLKC*TRAGvo5WupT zkIhC|HT&?pDOM#nr1i##@f(D6F25o7#agRH))DYAo8*%CP3+eGIrH1<7vVRt+jt@9 zewO@p_0ON*wwL_YGN_~D7dZ~Q$v6(uEy@4F9B18~u^5swbd*Mg4-2l7;HO$J9*lOM zq$GT{ucu7~3SGj9Xk-(cNg*~R_N4eq24o6^p7_0+_b^8bo`VO?Zh;3)Lc)V93m!B} z1|IB7>yUYpyze#8c|%Ot-^GN+gD-JB2Eh)?f3VgMl?;iREZ7jySTG-~Suh{cab<@! z7xfroNlaR@CRi#~s)e#B}53-|05 zH#TVuM%)H!!H8Qce!U6nnqpUTJ&0keGUhDs773@(wm2P+Q(BLQ5ig^9B2+I|zgLP@ zL|jcTA#Q?v0NKQxE4-7!_EOvlg~=%2)t~^T1m=L0Z;eSYS8X|s`O32JaK4dnOuGkjWFi7Bm zHJmL_B+V^vQd#HdfugV?dQcfWMaZ}qaHcDQ4J=&8jNymJV@zJzZGfpTS$QRh(a;HY z0RJLVtI2kXcDG-Wn}Te}3@ zhpeFs+y}jZd;0->egu>CJfNPbWg9zAZh!v#_uR{Yb(C#P4a^dIbe0fXO(423TtrCn zL$k*14H+5O%B{5`kd%iYIgPQ9oUNAHhiI2Yv{erq)EzM<_}_R4Mp{eP$UP;FL0Gl|bJPgoY)t#oRgBD+eVs4+!k7J%4FZAve7R~0BaDv) zZ-!er$=OOZU8&(#FC)DZ1v(zb0&-j&u9MKSD*bj;-0!xjt z2cXYOf(s!DmT|WzZP?$1KSOaRCR8L1)T)5ZfPi0pYrp_hfCw$frTb|&Pms(rJX*tZYGWio^yAG4m)aQGC?AEncB_DBqkHx}**H;l$_K0XI8R9>9 zh;%Y(E8Lp8pDRf@#2~z>S6gh^AO#G$mXQr2ts2ZTy1v*0Su@W~Q(+>}s|+S>)ux0< zVSug%Y&@Tx>}mjSz6jJXuuKq(fB`?^dRq;AUJwHW0&>gexBSFi(XJ|#>Ihdzz6zH{ z*05WF%iEUXQhZa;B1Yo(#nUe}71X6#C znX`WnQV;#kA@yz!MhHqA{j29)>pIr{HYkJ@{%eEUq0i~b;J_Vex5>a&}8H0zjel4y?Y7Wg9CrA*py)qtUL)%2~Cf@@5{e; z#$D51m9E^|L~s$^mqtMg+|Dvfg!f6l3gIyFr1VK6T?uw2*D7g8oj@6VFilArs1w#} zxA_Gz#xJdC<7&CUs-&Vy`PXyKs@fM)41OR)#s%cye<44S zF~+Y^w$H(@#+o$QdP?JNyYwE0BXK_&cP-7q61@h@kZHnV|O-Jen`9f;r+=ink&4MHPG*d zx~$2WSIU`J3I|S~bz89xc=Kws5ydN;>r~td2T<&REh%n-2;LVr@fd5kS^Tjxo|cg_ zY|Yt#fIp1+g*dj>J_)4FP#9nulFHH1K%a7G5(*fgPSLN(KTK#QLtlQ)|8=i#L+NBA z=*Xo%MmvnUZ+nh+sz$2Q56o$sM~RD35RU#XlGIztWSg47=8Ia`CGTEZO+d2+Zr*!4Lbj91IgNGt$vk)W-I{j{S?VO zxR*NB3GQY%cInls%-Jezv*Ijc-W-4H5>_Sx!A%{x) zw1)sgXr^Ey6RH-29U5z+Vr_AdR*3IR$egZUp*2H>z~dPUtanL^B6zezOI{4L!@1jS%8Dm?2BbHKTGo|6KiLaJ9I(DF7l5S}x&$ zH+ZlSY@g}%9B$s_G!`eX`V{X}G-+Z2-;^#A9}qs}f{XL-|DD_Z3ifNLw;+q6<1F2x z<~r2TP8DYfAOb48ItK~Gu>|JKP95}+t^(Yb2QMx)biuKH*pKwD#S;!lUP7+>RT58l zL?!q;q!NSjVU?inAf*sLgA|f5jSo>8kOTp8GqTwSW~1b3NmWEolzh}T*rB?dE_x`0 z(dj`-%7uFnw6Hl8t5BegxrhCANCArW_02@svcP?5Ayi8XfuPT|au^EpUTd4}nMyAg zVB_p4Rm)q5v%^#k+$e#?>LIEGP4w-u*8*KFWJ&XUVaUq_F-_;_ep}j1p!Mn(` z5vnXZ@QK+d8%&-D(3W9|jubxTM9L~FSYG8~vf1L?cb3*7Hpn+5L$o;Lk>+k;7n|p6 z3)Fe=47GM~5Iqx5Wgpjk7Wr1BB?Bn%LGqi-r923UejOTyL9mO8T2$mI0$S~CCNAuO zIg5Ph2=I)nZxNB7lo7y?h6ek#GT!#bwU@!&(VR+_k=*PFyk^H@bFZbL4Z?GxToy8m z0v{uNF0>v|$+PSPqi2->NDNF=LdHz2xGSlAp5!b(#```|be^TO{U>{rhiLXgdD7Dj zbO`ll3-m6SxBuJE59qe1^8vjJ<^uIUIMB6!V7>{M8~n4!1%%!ulx~tb7;y#dN>hMA zQM&%pDq;)@-YA_`(Ybg+s=g%1igZ1+UL;Pqpw2xCpHDa^)mtN*Zh|FX73g8k@UvuT zSc%y_{0d{if(wusTb@{%MAnV3?EI-7>P~&X*BWt zsXu(r{hv7X$!E>ljkEo=sflSFkfI|5P=Lqf63K{NXL+!9HA5N}%!Y5g;UWB+&$X^4EUct^LQ~J4z1u#aVg*q&xzmWCIHS+;q%&d=+o3*)5+gOC&g@#D8#ciZz zZJdh_ygp>ZJVtW7`5D2PX!If9@;AC;>|~fu zP25SPI9l$-K^vTX3ruD%*c!>0(_u>LEGHQw%PzCPAiBvyJHpD86IO{SCnMZKb`_LU zQj6#`R#O|%SR9t1HnU9{Xm44q+I z9X5%%=4~)ZRoa=d%W{(;6eS-Iyk^TJE0WJ;`4+tPoD+uC92{p+dn;<63tb@d5}|8M zC;}*f3oylM9pEzL1%TTYtpv?*Ug+u|KS0+Qpt&jUXOeIxVYVL=ibMa+19 zb%`DU!apY?rO=nQa*1+G-(_O7(k31vw3;DRCz-O;3g>*O5A{KB#>r^uH1Q;tB)BQ1 zYgM02FPpqac3-_jby}i1HL=#@UC67etfjg>Z~qUsamWt8TNX^uD)&OV19)qQz5GXy zx{+6N$4L)-u48W-cttobr)dQt&7x_CzM5=|s7*&AWcOsdp?U?TG9^q>$*)=OH@)Tp zAXx&D7lYlB4_D?NUhl7zS%mo1-?$?mWpmI1m6Z}x(vueSNZDetp)`RH2HjvLutd(m zS`$fF2qPWl#o6x#Vf4{jmoWNBt<^>vJ!I18;aZSJhiWE`n2KI#6PcH0$p2`I ze^uL&f--nJLI2X~3jlwvuwa6%v=j*_Wz+_ON*4VIgma-afHrcrHjwodGOM0yrgOfi z3}l?W2dUPUR+oG`--kv9?+e8Feb+^t-*qi_qnkEq@thM4V3RwovLM#NcInoxCM{|O zt-8{5X)jZ+IL>CfT$ETLuSH8Y$W0uiQbZMU6LHgNDJ<*77Gt7z@A+IYKXp1bFuTx98A%+PxcH2bK^}}ihd?wJF@JmN*R{!XnWd}Z^hZ?^pFToq znKuk<=IDMCp@%GZB*N2`FeP41^EOJpWDGk`Y!$z(AxW|?s11X6=|`Wnk+?kzR!T2= z!4qNS^Uz45l9or1p1)@;w%p}dFI44Nb5hfr4Hsl@;bM!HTa4KHTMnT4+P!kMON%4O z>Cc!og90~HnqR~z5V2s#Dx*(3#wHO+eK1OP=D*kU8`|Nx3PJaDVTqn9EYV^ANYQdA zv<%s)MzCG71ysVD!>r)HB_3C@lI{wJZ9<=|ep;2Plyq8y6CX0_?7Oz$VQ2#)t#HX! zPy%! z4cl-*!g^29d^yd!(6y=@Bs)RtI$Dp=ns!X zycdK>Cw7?4-oe_h?!*DjKx*wsE1f}4@O~sD8k7>}K*87A)oHYmIoAtu{;n(h`gLak zL?_Kt0eW3VI-UQ~75>-TWgs(2`xnP20S#y`6CKQ8hk!`m`D$t*&yG>HI=#B+y(!&M z)HbIh<%n99qLvHQbVItOXkC?FzAbJWq|9(Rx@CtgtuwsMZza9`* zhOjaRi=-8u6m6U(;P7!7OXlI4*itf^u8%Fm1ijf8aoBm?kW)(BTFyPQDA_HoZj>O( ztL59T^rNde`r-gi0UcvMC@jw3cBQ{Az)Z~rw2M0N60 z#gL=AUz`IBjDrw)rK1{*N|}|}5d=tu(+PPg=H#|#0HZn|5;)7wNZPV9t&*1N)Zl1Z zrz2cov?%g(Dw*G+b7&lcIXlrjCIf@5EaAJB%rz6>CU((EVY1{)I#9tLG}-&Qma}ES zle~u6*<~qxgO*$>eS?3oRQLu>c>&>zMp-U=H;D`{Abs=4uR_0s^N-?ElL`1hr^vm6 zrpx0GzAc*J(LrEeNVWD9p#79$pNHWxD5GD`>t3Hj?JxGmuo46G}pb#Dc z0=)UtAqeb(?8rG8vRE5X=Udn_WL|3=NfbFw5bu=09w|$q)`>mxfr75htqo<8N|n^UJRGwf0b9 zQ}8=G%xY``q{yFxyR{ojW)`f}WJkW?mYtxbCOZ#C)TmD0f$0D(BD7m7d(n$~Xk}Q2 zo{I*sA4<^UE)EQmxxj0S!uvwvF?5rff9a zAWik-J%wY^HaT!^WGS9Q_@ycKDp=HUsHN|)ZewdWL5YxN?sDms3Y$}^T3`biVUP|OURvrT$SZ-*Iy-&fM)q#YS@Gi%B*Y?y14*o zvL~B2=IRz&(+&}k0Ir&G+vXpbB)XL@0W$%x5@Fl~ET@gJjRE z=OQMuqiQkF(?&XGACQz+a+|KD%VgC@r^HJ|U6J^M)TPdv{UkQexV^2)tG1FfsLR!n zM193B!|2HGr#=v^5ia@E2c68aN=o%%a?zFUTFG!)M^|dsBH{2?%xpJ6J2{N8EEh~H_}m83iEj=BPj+aG1=OuvX%}b zc!kZ}vdKb+y;<)+qR*h-)RMu)Zh7+>zqW17MF&k|gYC_n`skhS?o!P32WR+6p)i-S z7RkOf_$Z@OYH$%O)?87pZ?VA>27mzY7a&zbLQ?2j3Vuip2=dgfHEX;jnQjTx3KVHZLjZ|_uvrHIRYO1+-Nptn z1p;{087g$xoAn8pdeILsm-dpJ&%W_!SMnuOKg;uIWH7c~B|ev-NAHB5r6W#d1$yjt zH+n3GzM8BrDOliY2Ljd*El%CbZ3Y;L%9al<%C)_e@G2nml7SQE(r+B3(Tjoz&6a&< z5kk7wmHp`a5Gny~)O$(bX)ls53xd4^F^U#ddl=7`g{*@z`8*=wRO&r!r3{?rY)Qm&NAab}z!w4JB?0=ZREkI_5K!{Jji`S^Y4AY=5O4`?uWh_S z)Xd$N3fEP&5~*RSAkzE%8s$KjB9}#Vz4q@!LFwi7$fgHR53Xr*DV8~J1v?ab%y}?H zXejNBiVi-g8ObpJ^ao&^?bP8VJQ{i>7{lDLG-9zl@I|YUw`*h&vs4lGAdiE+reSTS z{;bVSlR~3n1Xi+PSw0~UVcSVV_!r%}hC9Fvx0xtVzkEMC%;;Cf6d^c;O6nANDLoVd zhjuxmYXh>&NCeU^8Nt+cnv98k25XmS#7@hIEq;|$+wINF6XD9I403C*AKBpICk;xB zUDGC|R|6T)&5cfmu|tT!B)>vpANN7blAfFVml=wMi@nyco=ZtzXa{Qx7J zI~zaHnw?)NzCdELKtqgWB6vhPa4D+#kqc!dbRw*B%@koZm+TR2SNy*aDFqE7PZndc ztK}h?ySNfvP5;Tdo#<)_j&N~SZUgB$FSzOYMz?ywOjnC?F>%^tbP|AFbb}29*|E|_ z{->VoP>fJ*iQgQv=-!;1J&g30gc7z3MIrQS#7mb-Dpb+i$bX|SqgzgRi^~`J4LAC? zv`>1t65_S6=s>zbmlZcELfRPM=N+>&BpL`UMtZ7Xz$b4Kd1i1UU6&5gh{Gk#_j-VjMhQPZWKSA2h-J?K`CrQa!WiA}HwG@LqW1rG$cxBax@(bn`r zvADD0^o9fe@afakpiO?mAiOBys!_^U0i^frb}0> zHRPOZ3^aMLWIBptz|+IGc^w^2cA{ oe|-(gg{%Gi6eQlLiFtn7_5O)lJ^y0<_3*Fq*u<^XkN(>K2du~YtpET3 diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index b5c8ac3..aff0bff 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -511,6 +511,10 @@ func TestPacketForwardMiddleware(t *testing.T) { err = testutil.WaitForBlocks(ctx, 100, feeabs, gaia, osmosis) require.NoError(t, err) + feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) + require.NoError(t, err) + fmt.Printf("Module Account Balances: %v\n", feeabsModule.Balances) + balance, err := feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) require.NoError(t, err) require.Greater(t, balance, int64(1)) From edf0919d8e873a725554d6f66fd42bc7a32d9a08 Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 26 Apr 2023 16:24:14 +0700 Subject: [PATCH 27/50] add log --- tests/interchaintest/go.mod | 2 +- tests/interchaintest/go.sum | 4 ++-- tests/interchaintest/packet_foward_test.go | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index 5287217..9f1202b 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -191,7 +191,7 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ - github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419203226-62f4ab72a646 + github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230426092153-0a643db3c6b2 // use informal system fork of tendermint github.com/tendermint/tendermint => github.com/informalsystems/tendermint v0.34.26 diff --git a/tests/interchaintest/go.sum b/tests/interchaintest/go.sum index 45d4531..4282094 100644 --- a/tests/interchaintest/go.sum +++ b/tests/interchaintest/go.sum @@ -583,8 +583,8 @@ github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/notional-labs/fee-abstraction/v2 v2.0.1 h1:w++wIzSIoMQk5scVGud96ZLU6IJLlectE13dN6eX9AY= github.com/notional-labs/fee-abstraction/v2 v2.0.1/go.mod h1:6xlQD2XVfVxYc6xJ9AGFkIE4b/b+cGbs3/D0jHhRyXw= -github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419203226-62f4ab72a646 h1:D6eUZPmagbBFZBbVDCpxcj5M35SNt1GPrrwGkah5oH0= -github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230419203226-62f4ab72a646/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230426092153-0a643db3c6b2 h1:+kAuQXIy2/fHAmMtF2kQOdsrufusbrzQP6jx82S3tKY= +github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230426092153-0a643db3c6b2/go.mod h1:Na9KNE38VWqOKMSTpbIzXCICDkazn+6kFf4BG0ublCk= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index aff0bff..e74eaa3 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -501,6 +501,10 @@ func TestPacketForwardMiddleware(t *testing.T) { feeabsHeight, err = feeabs.Height(ctx) require.NoError(t, err) + feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) + require.NoError(t, err) + fmt.Printf("Module Account Balances before swap: %v\n", feeabsModule.Balances) + transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) require.NoError(t, err) _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+100, transferTx.Packet) @@ -513,7 +517,7 @@ func TestPacketForwardMiddleware(t *testing.T) { feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) require.NoError(t, err) - fmt.Printf("Module Account Balances: %v\n", feeabsModule.Balances) + fmt.Printf("Module Account Balances after swap: %v\n", feeabsModule.Balances) balance, err := feeabs.GetBalance(ctx, feeabsModule.Address, feeabs.Config().Denom) require.NoError(t, err) From 202116958a31645e954b01eb7590ce057edf5c13 Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 26 Apr 2023 16:44:53 +0700 Subject: [PATCH 28/50] nit --- tests/interchaintest/packet_foward_test.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index e74eaa3..687a438 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -454,7 +454,7 @@ func TestPacketForwardMiddleware(t *testing.T) { transfer = ibc.WalletAmount{ Address: dstAddress, Denom: gaia.Config().Denom, - Amount: 1_000_000, + Amount: 1_000_000_000, } tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) @@ -507,12 +507,9 @@ func TestPacketForwardMiddleware(t *testing.T) { transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) require.NoError(t, err) - _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+100, transferTx.Packet) + _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, feeabs) - require.NoError(t, err) - - err = testutil.WaitForBlocks(ctx, 100, feeabs, gaia, osmosis) + err = testutil.WaitForBlocks(ctx, 1, feeabs, gaia, osmosis) require.NoError(t, err) feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) From 3149e26d93eb72c0af344483a61287103622bbaa Mon Sep 17 00:00:00 2001 From: GnaD Date: Wed, 26 Apr 2023 21:23:48 +0700 Subject: [PATCH 29/50] nit --- tests/interchaintest/packet_foward_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 687a438..7a6c082 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -454,7 +454,7 @@ func TestPacketForwardMiddleware(t *testing.T) { transfer = ibc.WalletAmount{ Address: dstAddress, Denom: gaia.Config().Denom, - Amount: 1_000_000_000, + Amount: 1_000_000, } tx, err = gaia.SendIBCTransfer(ctx, channGaiaFeeabs.ChannelID, gaiaUser.KeyName, transfer, ibc.TransferOptions{}) @@ -469,9 +469,6 @@ func TestPacketForwardMiddleware(t *testing.T) { denomTrace = transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom(channFeeabsGaia.PortID, channFeeabsGaia.ChannelID, gaia.Config().Denom)) uatomOnFeeabs := denomTrace.IBCDenom() - feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) - require.NoError(t, err) - current_directory, _ := os.Getwd() param_change_path := path.Join(current_directory, "proposal", "proposal.json") From ddccffb0c71094503106a72fe7773308613b4103 Mon Sep 17 00:00:00 2001 From: GnaD Date: Thu, 27 Apr 2023 10:53:50 +0700 Subject: [PATCH 30/50] nit --- tests/interchaintest/packet_foward_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 7a6c082..40cf517 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -506,7 +506,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) require.NoError(t, err) - err = testutil.WaitForBlocks(ctx, 1, feeabs, gaia, osmosis) + err = testutil.WaitForBlocks(ctx, 25, feeabs, gaia, osmosis) require.NoError(t, err) feeabsModule, err = QueryFeeabsModuleAccountBalances(feeabs, ctx) From 700a764a64390af1dc807748dc95ffdb37d672b8 Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Thu, 27 Apr 2023 10:54:26 +0700 Subject: [PATCH 31/50] use source channel directly from param --- x/feeabs/keeper/ibc.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x/feeabs/keeper/ibc.go b/x/feeabs/keeper/ibc.go index 18bc92d..c0894ef 100644 --- a/x/feeabs/keeper/ibc.go +++ b/x/feeabs/keeper/ibc.go @@ -302,7 +302,6 @@ func (k Keeper) handleOsmosisIbcQuery(ctx sdk.Context) error { params := k.GetParams(ctx) var reqs []types.QueryArithmeticTwapToNowRequest - var queryChannel string k.IterateHostZone(ctx, func(hostZoneConfig types.HostChainFeeAbsConfig) (stop bool) { req := types.NewQueryArithmeticTwapToNowRequest( hostZoneConfig.PoolId, @@ -311,10 +310,9 @@ func (k Keeper) handleOsmosisIbcQuery(ctx sdk.Context) error { startTime, ) reqs = append(reqs, req) - queryChannel = params.IbcQueryIcqChannel return false }) - err := k.SendOsmosisQueryRequest(ctx, reqs, types.IBCPortID, queryChannel) + err := k.SendOsmosisQueryRequest(ctx, reqs, types.IBCPortID, params.IbcQueryIcqChannel) if err != nil { return err } From 172b24635dd16fc4b1ee362e8377920a460108ee Mon Sep 17 00:00:00 2001 From: ducnt131 <62016666+anhductn2001@users.noreply.github.com> Date: Thu, 27 Apr 2023 12:52:17 +0700 Subject: [PATCH 32/50] Implement OnTimeoutPacket (#142) * implement OnTimeoutPacket * add logger and replace src-port src-channel --------- Co-authored-by: vuong <56973102+vuong177@users.noreply.github.com> --- x/feeabs/ibc_module.go | 17 +++++++++++++++-- x/feeabs/keeper/keeper.go | 16 ++++++++++++++++ x/feeabs/proposal_handler.go | 1 - x/feeabs/types/events.go | 5 ++++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/x/feeabs/ibc_module.go b/x/feeabs/ibc_module.go index 627b713..f85c382 100644 --- a/x/feeabs/ibc_module.go +++ b/x/feeabs/ibc_module.go @@ -201,7 +201,20 @@ func (am IBCModule) OnTimeoutPacket( packet channeltypes.Packet, relayer sdk.AccAddress, ) error { - // TODO: Resend request if timeout - // TODO: emit event + params := am.keeper.GetParams(ctx) + chancap := am.keeper.GetCapability(ctx, host.ChannelCapabilityPath(types.IBCPortID, params.IbcQueryIcqChannel)) + // Resend request if timeout + err := am.keeper.OnTimeoutPacket(ctx, chancap, packet) // If there is an error here we should still handle the timeout + if err != nil { + am.keeper.Logger(ctx).Error(fmt.Sprintf("Error OnTimeoutPacket %s", err.Error())) + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeTimeout, + sdk.NewAttribute(sdk.AttributeKeyModule, types.ModuleName), + sdk.NewAttribute(types.AttributeKeyFailureType, "timeout"), + sdk.NewAttribute(types.AttributeKeyPacket, string(packet.GetData())), + ), + ) + } return nil } diff --git a/x/feeabs/keeper/keeper.go b/x/feeabs/keeper/keeper.go index 64af8e9..8db2314 100644 --- a/x/feeabs/keeper/keeper.go +++ b/x/feeabs/keeper/keeper.go @@ -6,8 +6,10 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ibctransferkeeper "github.com/cosmos/ibc-go/v4/modules/apps/transfer/keeper" + "github.com/cosmos/ibc-go/v4/modules/core/exported" "github.com/notional-labs/fee-abstraction/v2/x/feeabs/types" "github.com/tendermint/tendermint/libs/log" ) @@ -124,3 +126,17 @@ func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { k.paramSpace.SetParamSet(ctx, ¶ms) } + +// OnTimeoutPacket resend packet when timeout +func (k Keeper) OnTimeoutPacket(ctx sdk.Context, chanCap *capabilitytypes.Capability, packet exported.PacketI) error { + return k.channelKeeper.SendPacket(ctx, chanCap, packet) +} + +func (k Keeper) GetCapability(ctx sdk.Context, name string) *capabilitytypes.Capability { + cap, ok := k.scopedKeeper.GetCapability(ctx, name) + if !ok { + k.Logger(ctx).Error("Error ErrChannelCapabilityNotFound ") + return nil + } + return cap +} diff --git a/x/feeabs/proposal_handler.go b/x/feeabs/proposal_handler.go index 9697b5c..a67d30c 100644 --- a/x/feeabs/proposal_handler.go +++ b/x/feeabs/proposal_handler.go @@ -38,7 +38,6 @@ func NewHostZoneProposal(k keeper.Keeper) govtypes.Handler { } } -// TODO : support this @Gnad @Ducnt. func emptyRestHandler(client.Context) govrest.ProposalRESTHandler { return govrest.ProposalRESTHandler{ SubRoute: "unsupported", diff --git a/x/feeabs/types/events.go b/x/feeabs/types/events.go index 824a7ad..5e68fd0 100644 --- a/x/feeabs/types/events.go +++ b/x/feeabs/types/events.go @@ -1,12 +1,15 @@ package types const ( + EventTypeTimeout = "timeout" EventTypePacket = "receive_feechain_verification_packet" + EventTypeEpochEnd = "epoch_end" // TODO: need to clean up (not use) EventTypeEpochStart = "epoch_start" - AttributeKeyAckSuccess = "success" AttributeKeyAck = "acknowledgement" AttributeKeyAckError = "ack_error" AttributeEpochNumber = "epoch_number" AttributeEpochStartTime = "start_time" + AttributeKeyFailureType = "failure_type" + AttributeKeyPacket = "packet" ) From 533569aa41d19e0e65f7a53648cc02147b84ce1d Mon Sep 17 00:00:00 2001 From: ducnt131 Date: Mon, 8 May 2023 19:06:21 +0700 Subject: [PATCH 33/50] update proto-builder --- Makefile | 4 ++-- x/feeabs/types/epoch.pb.go | 22 +++++++++++----------- x/feeabs/types/feepool.pb.go | 2 +- x/feeabs/types/genesis.pb.go | 2 +- x/feeabs/types/osmosisibc.pb.go | 10 +++++----- x/feeabs/types/params.pb.go | 2 +- x/feeabs/types/proposal.pb.go | 2 +- x/feeabs/types/query.pb.go | 4 ++-- x/feeabs/types/tx.pb.go | 4 ++-- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index b1d0d94..de880ca 100644 --- a/Makefile +++ b/Makefile @@ -118,8 +118,8 @@ ictest-all: ictest-basic ictest-ibc ictest-packet-forward ### Proto ### ############################################################################### -protoVer=v0.8 -protoImageName=ghcr.io/notional-labs/fa-proto-gen:$(protoVer) +protoVer=0.11.6 +protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) containerProtoGen=fa-proto-gen-$(protoVer) containerProtoFmt=fa-proto-fmt-$(protoVer) diff --git a/x/feeabs/types/epoch.pb.go b/x/feeabs/types/epoch.pb.go index 7165654..77960f6 100644 --- a/x/feeabs/types/epoch.pb.go +++ b/x/feeabs/types/epoch.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -228,7 +228,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime):]) if err1 != nil { return 0, err1 } @@ -241,7 +241,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration):]) if err2 != nil { return 0, err2 } @@ -249,7 +249,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintEpoch(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x1a - n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) if err3 != nil { return 0, err3 } @@ -288,14 +288,14 @@ func (m *EpochInfo) Size() (n int) { if l > 0 { n += 1 + l + sovEpoch(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovEpoch(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration) n += 1 + l + sovEpoch(uint64(l)) if m.CurrentEpoch != 0 { n += 1 + sovEpoch(uint64(m.CurrentEpoch)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime) n += 1 + l + sovEpoch(uint64(l)) if m.EpochCountingStarted { n += 2 @@ -402,7 +402,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -435,7 +435,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -487,7 +487,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/feepool.pb.go b/x/feeabs/types/feepool.pb.go index bef654d..57e4139 100644 --- a/x/feeabs/types/feepool.pb.go +++ b/x/feeabs/types/feepool.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" math "math" ) diff --git a/x/feeabs/types/genesis.pb.go b/x/feeabs/types/genesis.pb.go index 1b928b6..833c285 100644 --- a/x/feeabs/types/genesis.pb.go +++ b/x/feeabs/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" math "math" diff --git a/x/feeabs/types/osmosisibc.pb.go b/x/feeabs/types/osmosisibc.pb.go index 185663f..30f2bbf 100644 --- a/x/feeabs/types/osmosisibc.pb.go +++ b/x/feeabs/types/osmosisibc.pb.go @@ -7,9 +7,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" types1 "github.com/tendermint/tendermint/abci/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" @@ -499,7 +499,7 @@ func (m *QueryArithmeticTwapToNowRequest) MarshalToSizedBuffer(dAtA []byte) (int _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) if err1 != nil { return 0, err1 } @@ -805,7 +805,7 @@ func (m *QueryArithmeticTwapToNowRequest) Size() (n int) { if l > 0 { n += 1 + l + sovOsmosisibc(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovOsmosisibc(uint64(l)) return n } @@ -1060,7 +1060,7 @@ func (m *QueryArithmeticTwapToNowRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/params.pb.go b/x/feeabs/types/params.pb.go index b4e66ab..af09155 100644 --- a/x/feeabs/types/params.pb.go +++ b/x/feeabs/types/params.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/proposal.pb.go b/x/feeabs/types/proposal.pb.go index f5c8034..7ded41d 100644 --- a/x/feeabs/types/proposal.pb.go +++ b/x/feeabs/types/proposal.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/query.pb.go b/x/feeabs/types/query.pb.go index f986eb1..c4b97af 100644 --- a/x/feeabs/types/query.pb.go +++ b/x/feeabs/types/query.pb.go @@ -9,8 +9,8 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/feeabs/types/tx.pb.go b/x/feeabs/types/tx.pb.go index 764f13f..57fec18 100644 --- a/x/feeabs/types/tx.pb.go +++ b/x/feeabs/types/tx.pb.go @@ -10,8 +10,8 @@ import ( types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" From add967c5d9e97df4cce4bea14ac27b0920aaf791 Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Tue, 9 May 2023 10:45:38 +0700 Subject: [PATCH 34/50] minor --- scripts/protocgen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index 394df4f..f941c3d 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -24,7 +24,7 @@ cd .. # move proto files to the right places # # Note: Proto files are suffixed with the current binary version. -cp -r github.com/notional-labs/fee-abstraction/v2/x/feeabs/types/* ./x/feeabs/types/ +cp -r ./github.com/notional-labs/fee-abstraction/v2/x/feeabs/types/* ./x/feeabs/types/ rm -rf github.com go mod tidy -compat=1.18 From 7c790f345c7d7a7d3a183c1f67805ba85b6ea63e Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Tue, 9 May 2023 11:08:27 +0700 Subject: [PATCH 35/50] update image --- Makefile | 4 ++-- x/feeabs/types/epoch.pb.go | 22 +++++++++++----------- x/feeabs/types/feepool.pb.go | 2 +- x/feeabs/types/genesis.pb.go | 2 +- x/feeabs/types/osmosisibc.pb.go | 10 +++++----- x/feeabs/types/params.pb.go | 2 +- x/feeabs/types/proposal.pb.go | 2 +- x/feeabs/types/query.pb.go | 4 ++-- x/feeabs/types/tx.pb.go | 4 ++-- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index de880ca..9c785f9 100644 --- a/Makefile +++ b/Makefile @@ -118,8 +118,8 @@ ictest-all: ictest-basic ictest-ibc ictest-packet-forward ### Proto ### ############################################################################### -protoVer=0.11.6 -protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) +protoVer=v0.9 +protoImageName=ghcr.io/notional-labs/fa-proto-gen:$(protoVer) containerProtoGen=fa-proto-gen-$(protoVer) containerProtoFmt=fa-proto-fmt-$(protoVer) diff --git a/x/feeabs/types/epoch.pb.go b/x/feeabs/types/epoch.pb.go index 77960f6..7165654 100644 --- a/x/feeabs/types/epoch.pb.go +++ b/x/feeabs/types/epoch.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -228,7 +228,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime):]) + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime):]) if err1 != nil { return 0, err1 } @@ -241,7 +241,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration):]) + n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration):]) if err2 != nil { return 0, err2 } @@ -249,7 +249,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintEpoch(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x1a - n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) + n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err3 != nil { return 0, err3 } @@ -288,14 +288,14 @@ func (m *EpochInfo) Size() (n int) { if l > 0 { n += 1 + l + sovEpoch(uint64(l)) } - l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovEpoch(uint64(l)) - l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration) n += 1 + l + sovEpoch(uint64(l)) if m.CurrentEpoch != 0 { n += 1 + sovEpoch(uint64(m.CurrentEpoch)) } - l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime) n += 1 + l + sovEpoch(uint64(l)) if m.EpochCountingStarted { n += 2 @@ -402,7 +402,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -435,7 +435,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -487,7 +487,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/feepool.pb.go b/x/feeabs/types/feepool.pb.go index 57e4139..bef654d 100644 --- a/x/feeabs/types/feepool.pb.go +++ b/x/feeabs/types/feepool.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" math "math" ) diff --git a/x/feeabs/types/genesis.pb.go b/x/feeabs/types/genesis.pb.go index 833c285..1b928b6 100644 --- a/x/feeabs/types/genesis.pb.go +++ b/x/feeabs/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" math "math" diff --git a/x/feeabs/types/osmosisibc.pb.go b/x/feeabs/types/osmosisibc.pb.go index 30f2bbf..185663f 100644 --- a/x/feeabs/types/osmosisibc.pb.go +++ b/x/feeabs/types/osmosisibc.pb.go @@ -7,9 +7,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" types1 "github.com/tendermint/tendermint/abci/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" @@ -499,7 +499,7 @@ func (m *QueryArithmeticTwapToNowRequest) MarshalToSizedBuffer(dAtA []byte) (int _ = i var l int _ = l - n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err1 != nil { return 0, err1 } @@ -805,7 +805,7 @@ func (m *QueryArithmeticTwapToNowRequest) Size() (n int) { if l > 0 { n += 1 + l + sovOsmosisibc(uint64(l)) } - l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovOsmosisibc(uint64(l)) return n } @@ -1060,7 +1060,7 @@ func (m *QueryArithmeticTwapToNowRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/params.pb.go b/x/feeabs/types/params.pb.go index af09155..b4e66ab 100644 --- a/x/feeabs/types/params.pb.go +++ b/x/feeabs/types/params.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/proposal.pb.go b/x/feeabs/types/proposal.pb.go index 7ded41d..f5c8034 100644 --- a/x/feeabs/types/proposal.pb.go +++ b/x/feeabs/types/proposal.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/query.pb.go b/x/feeabs/types/query.pb.go index c4b97af..f986eb1 100644 --- a/x/feeabs/types/query.pb.go +++ b/x/feeabs/types/query.pb.go @@ -9,8 +9,8 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/feeabs/types/tx.pb.go b/x/feeabs/types/tx.pb.go index 57fec18..764f13f 100644 --- a/x/feeabs/types/tx.pb.go +++ b/x/feeabs/types/tx.pb.go @@ -10,8 +10,8 @@ import ( types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" From d61944f8236b0ac72277621130e1dd32fc30dd2b Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Tue, 9 May 2023 11:44:09 +0700 Subject: [PATCH 36/50] update protogenc --- Makefile | 4 ++-- scripts/protocgen.sh | 2 +- x/feeabs/types/epoch.pb.go | 22 +++++++++++----------- x/feeabs/types/feepool.pb.go | 2 +- x/feeabs/types/genesis.pb.go | 2 +- x/feeabs/types/osmosisibc.pb.go | 10 +++++----- x/feeabs/types/params.pb.go | 2 +- x/feeabs/types/proposal.pb.go | 2 +- x/feeabs/types/query.pb.go | 4 ++-- x/feeabs/types/tx.pb.go | 4 ++-- 10 files changed, 27 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index 9c785f9..de880ca 100644 --- a/Makefile +++ b/Makefile @@ -118,8 +118,8 @@ ictest-all: ictest-basic ictest-ibc ictest-packet-forward ### Proto ### ############################################################################### -protoVer=v0.9 -protoImageName=ghcr.io/notional-labs/fa-proto-gen:$(protoVer) +protoVer=0.11.6 +protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) containerProtoGen=fa-proto-gen-$(protoVer) containerProtoFmt=fa-proto-fmt-$(protoVer) diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index f941c3d..394df4f 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -24,7 +24,7 @@ cd .. # move proto files to the right places # # Note: Proto files are suffixed with the current binary version. -cp -r ./github.com/notional-labs/fee-abstraction/v2/x/feeabs/types/* ./x/feeabs/types/ +cp -r github.com/notional-labs/fee-abstraction/v2/x/feeabs/types/* ./x/feeabs/types/ rm -rf github.com go mod tidy -compat=1.18 diff --git a/x/feeabs/types/epoch.pb.go b/x/feeabs/types/epoch.pb.go index 7165654..77960f6 100644 --- a/x/feeabs/types/epoch.pb.go +++ b/x/feeabs/types/epoch.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -228,7 +228,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime):]) if err1 != nil { return 0, err1 } @@ -241,7 +241,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration):]) + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration):]) if err2 != nil { return 0, err2 } @@ -249,7 +249,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintEpoch(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x1a - n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) if err3 != nil { return 0, err3 } @@ -288,14 +288,14 @@ func (m *EpochInfo) Size() (n int) { if l > 0 { n += 1 + l + sovEpoch(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovEpoch(uint64(l)) - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration) n += 1 + l + sovEpoch(uint64(l)) if m.CurrentEpoch != 0 { n += 1 + sovEpoch(uint64(m.CurrentEpoch)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime) n += 1 + l + sovEpoch(uint64(l)) if m.EpochCountingStarted { n += 2 @@ -402,7 +402,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -435,7 +435,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -487,7 +487,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/feepool.pb.go b/x/feeabs/types/feepool.pb.go index bef654d..57e4139 100644 --- a/x/feeabs/types/feepool.pb.go +++ b/x/feeabs/types/feepool.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" math "math" ) diff --git a/x/feeabs/types/genesis.pb.go b/x/feeabs/types/genesis.pb.go index 1b928b6..833c285 100644 --- a/x/feeabs/types/genesis.pb.go +++ b/x/feeabs/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" math "math" diff --git a/x/feeabs/types/osmosisibc.pb.go b/x/feeabs/types/osmosisibc.pb.go index 185663f..30f2bbf 100644 --- a/x/feeabs/types/osmosisibc.pb.go +++ b/x/feeabs/types/osmosisibc.pb.go @@ -7,9 +7,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "github.com/gogo/protobuf/types" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" types1 "github.com/tendermint/tendermint/abci/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" @@ -499,7 +499,7 @@ func (m *QueryArithmeticTwapToNowRequest) MarshalToSizedBuffer(dAtA []byte) (int _ = i var l int _ = l - n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) if err1 != nil { return 0, err1 } @@ -805,7 +805,7 @@ func (m *QueryArithmeticTwapToNowRequest) Size() (n int) { if l > 0 { n += 1 + l + sovOsmosisibc(uint64(l)) } - l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovOsmosisibc(uint64(l)) return n } @@ -1060,7 +1060,7 @@ func (m *QueryArithmeticTwapToNowRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/params.pb.go b/x/feeabs/types/params.pb.go index b4e66ab..af09155 100644 --- a/x/feeabs/types/params.pb.go +++ b/x/feeabs/types/params.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/proposal.pb.go b/x/feeabs/types/proposal.pb.go index f5c8034..7ded41d 100644 --- a/x/feeabs/types/proposal.pb.go +++ b/x/feeabs/types/proposal.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/gogo/protobuf/proto" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/query.pb.go b/x/feeabs/types/query.pb.go index f986eb1..c4b97af 100644 --- a/x/feeabs/types/query.pb.go +++ b/x/feeabs/types/query.pb.go @@ -9,8 +9,8 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/feeabs/types/tx.pb.go b/x/feeabs/types/tx.pb.go index 764f13f..57fec18 100644 --- a/x/feeabs/types/tx.pb.go +++ b/x/feeabs/types/tx.pb.go @@ -10,8 +10,8 @@ import ( types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" From 864a4fbdde2b23566fcd4ebf2df1120b834022ed Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Tue, 9 May 2023 11:53:07 +0700 Subject: [PATCH 37/50] try sleep --- scripts/protocgen.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index 394df4f..bebf224 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -21,6 +21,7 @@ done cd .. +sleep 10 # move proto files to the right places # # Note: Proto files are suffixed with the current binary version. From 9931109165a818513ab9f0e133117916e5b67fba Mon Sep 17 00:00:00 2001 From: ducnt87 Date: Tue, 9 May 2023 12:08:10 +0700 Subject: [PATCH 38/50] revert and remove check-generate proto --- .github/workflows/check-generated.yml | 25 ------------------------- scripts/protocgen.sh | 1 - 2 files changed, 26 deletions(-) delete mode 100644 .github/workflows/check-generated.yml diff --git a/.github/workflows/check-generated.yml b/.github/workflows/check-generated.yml deleted file mode 100644 index 272ca70..0000000 --- a/.github/workflows/check-generated.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Check generated code -on: - workflow_dispatch: - pull_request: - branches: - - '*' - -permissions: - contents: read - -jobs: - check-proto: - runs-on: ubuntu-latest - steps: - - - uses: actions/setup-go@v3 - with: - go-version: '1.19' - - - uses: actions/checkout@v3 - with: - fetch-depth: 1 # we need a .git directory to run git diff - - - name: "Check protobuf generated code" - run: scripts/check-generated.sh \ No newline at end of file diff --git a/scripts/protocgen.sh b/scripts/protocgen.sh index bebf224..394df4f 100644 --- a/scripts/protocgen.sh +++ b/scripts/protocgen.sh @@ -21,7 +21,6 @@ done cd .. -sleep 10 # move proto files to the right places # # Note: Proto files are suffixed with the current binary version. From 89a8bcd69429438d7d0d51bf579218535865ffe0 Mon Sep 17 00:00:00 2001 From: ducnt131 <62016666+anhductn2001@users.noreply.github.com> Date: Tue, 9 May 2023 13:28:14 +0700 Subject: [PATCH 39/50] Revert "Update protogenc for sdk47" --- .github/workflows/check-generated.yml | 25 +++++++++++++++++++++++++ Makefile | 4 ++-- x/feeabs/types/epoch.pb.go | 22 +++++++++++----------- x/feeabs/types/feepool.pb.go | 2 +- x/feeabs/types/genesis.pb.go | 2 +- x/feeabs/types/osmosisibc.pb.go | 10 +++++----- x/feeabs/types/params.pb.go | 2 +- x/feeabs/types/proposal.pb.go | 2 +- x/feeabs/types/query.pb.go | 4 ++-- x/feeabs/types/tx.pb.go | 4 ++-- 10 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 .github/workflows/check-generated.yml diff --git a/.github/workflows/check-generated.yml b/.github/workflows/check-generated.yml new file mode 100644 index 0000000..272ca70 --- /dev/null +++ b/.github/workflows/check-generated.yml @@ -0,0 +1,25 @@ +name: Check generated code +on: + workflow_dispatch: + pull_request: + branches: + - '*' + +permissions: + contents: read + +jobs: + check-proto: + runs-on: ubuntu-latest + steps: + - + uses: actions/setup-go@v3 + with: + go-version: '1.19' + - + uses: actions/checkout@v3 + with: + fetch-depth: 1 # we need a .git directory to run git diff + - + name: "Check protobuf generated code" + run: scripts/check-generated.sh \ No newline at end of file diff --git a/Makefile b/Makefile index de880ca..b1d0d94 100644 --- a/Makefile +++ b/Makefile @@ -118,8 +118,8 @@ ictest-all: ictest-basic ictest-ibc ictest-packet-forward ### Proto ### ############################################################################### -protoVer=0.11.6 -protoImageName=ghcr.io/cosmos/proto-builder:$(protoVer) +protoVer=v0.8 +protoImageName=ghcr.io/notional-labs/fa-proto-gen:$(protoVer) containerProtoGen=fa-proto-gen-$(protoVer) containerProtoFmt=fa-proto-fmt-$(protoVer) diff --git a/x/feeabs/types/epoch.pb.go b/x/feeabs/types/epoch.pb.go index 77960f6..7165654 100644 --- a/x/feeabs/types/epoch.pb.go +++ b/x/feeabs/types/epoch.pb.go @@ -6,9 +6,9 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -228,7 +228,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime):]) + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime):]) if err1 != nil { return 0, err1 } @@ -241,7 +241,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration):]) + n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration):]) if err2 != nil { return 0, err2 } @@ -249,7 +249,7 @@ func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintEpoch(dAtA, i, uint64(n2)) i-- dAtA[i] = 0x1a - n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) + n3, err3 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err3 != nil { return 0, err3 } @@ -288,14 +288,14 @@ func (m *EpochInfo) Size() (n int) { if l > 0 { n += 1 + l + sovEpoch(uint64(l)) } - l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovEpoch(uint64(l)) - l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration) + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration) n += 1 + l + sovEpoch(uint64(l)) if m.CurrentEpoch != 0 { n += 1 + sovEpoch(uint64(m.CurrentEpoch)) } - l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.CurrentEpochStartTime) n += 1 + l + sovEpoch(uint64(l)) if m.EpochCountingStarted { n += 2 @@ -402,7 +402,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -435,7 +435,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -487,7 +487,7 @@ func (m *EpochInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/feepool.pb.go b/x/feeabs/types/feepool.pb.go index 57e4139..bef654d 100644 --- a/x/feeabs/types/feepool.pb.go +++ b/x/feeabs/types/feepool.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" math "math" ) diff --git a/x/feeabs/types/genesis.pb.go b/x/feeabs/types/genesis.pb.go index 833c285..1b928b6 100644 --- a/x/feeabs/types/genesis.pb.go +++ b/x/feeabs/types/genesis.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" math "math" diff --git a/x/feeabs/types/osmosisibc.pb.go b/x/feeabs/types/osmosisibc.pb.go index 30f2bbf..185663f 100644 --- a/x/feeabs/types/osmosisibc.pb.go +++ b/x/feeabs/types/osmosisibc.pb.go @@ -7,9 +7,9 @@ import ( fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" types1 "github.com/tendermint/tendermint/abci/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" @@ -499,7 +499,7 @@ func (m *QueryArithmeticTwapToNowRequest) MarshalToSizedBuffer(dAtA []byte) (int _ = i var l int _ = l - n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) + n1, err1 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) if err1 != nil { return 0, err1 } @@ -805,7 +805,7 @@ func (m *QueryArithmeticTwapToNowRequest) Size() (n int) { if l > 0 { n += 1 + l + sovOsmosisibc(uint64(l)) } - l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime) n += 1 + l + sovOsmosisibc(uint64(l)) return n } @@ -1060,7 +1060,7 @@ func (m *QueryArithmeticTwapToNowRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/x/feeabs/types/params.pb.go b/x/feeabs/types/params.pb.go index af09155..b4e66ab 100644 --- a/x/feeabs/types/params.pb.go +++ b/x/feeabs/types/params.pb.go @@ -7,7 +7,7 @@ import ( fmt "fmt" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/proposal.pb.go b/x/feeabs/types/proposal.pb.go index 7ded41d..f5c8034 100644 --- a/x/feeabs/types/proposal.pb.go +++ b/x/feeabs/types/proposal.pb.go @@ -6,7 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" io "io" diff --git a/x/feeabs/types/query.pb.go b/x/feeabs/types/query.pb.go index c4b97af..f986eb1 100644 --- a/x/feeabs/types/query.pb.go +++ b/x/feeabs/types/query.pb.go @@ -9,8 +9,8 @@ import ( github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" diff --git a/x/feeabs/types/tx.pb.go b/x/feeabs/types/tx.pb.go index 57fec18..764f13f 100644 --- a/x/feeabs/types/tx.pb.go +++ b/x/feeabs/types/tx.pb.go @@ -10,8 +10,8 @@ import ( types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/query" _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" _ "github.com/gogo/protobuf/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" From 66364b0e0c5bf4cf6b7a32ae297df05276a16da8 Mon Sep 17 00:00:00 2001 From: GnaD Date: Tue, 9 May 2023 17:01:15 +0700 Subject: [PATCH 40/50] nit --- x/feeabs/keeper/ibc.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x/feeabs/keeper/ibc.go b/x/feeabs/keeper/ibc.go index c0894ef..b5b1c62 100644 --- a/x/feeabs/keeper/ibc.go +++ b/x/feeabs/keeper/ibc.go @@ -248,8 +248,7 @@ func (k Keeper) transferOsmosisCrosschainSwap(ctx sdk.Context, hostChainConfig t nativeDenomIBCedInOsmosis := params.NativeIbcedInOsmosis chainName := params.ChainName - // TODO: don't use it in product version. - if sdk.NewInt(1).GTE(token.Amount) { + if !token.Amount.IsPositive() { return nil } From e1372d051cea87c90bff311b491482484f3dfb3f Mon Sep 17 00:00:00 2001 From: GnaD Date: Tue, 9 May 2023 17:02:57 +0700 Subject: [PATCH 41/50] move some TODO --- app/sim_test.go | 2 -- x/feeabs/keeper/abci.go | 1 - x/feeabs/keeper/config.go | 1 - x/feeabs/module.go | 3 --- 4 files changed, 7 deletions(-) diff --git a/app/sim_test.go b/app/sim_test.go index 9ca6fd0..a7a3a72 100644 --- a/app/sim_test.go +++ b/app/sim_test.go @@ -78,8 +78,6 @@ func interBlockCacheOpt() func(*baseapp.BaseApp) { return baseapp.SetInterBlockCache(store.NewCommitKVStoreCacheManager()) } -// // TODO: Make another test for the fuzzer itself, which just has noOp txs -// // and doesn't depend on the application. func TestAppStateDeterminism(t *testing.T) { if !simapp.FlagEnabledValue { t.Skip("skipping application simulation") diff --git a/x/feeabs/keeper/abci.go b/x/feeabs/keeper/abci.go index 0de36b3..1a1b344 100644 --- a/x/feeabs/keeper/abci.go +++ b/x/feeabs/keeper/abci.go @@ -29,7 +29,6 @@ func (k Keeper) BeginBlocker(ctx sdk.Context) { return false } epochInfo.CurrentEpochStartHeight = ctx.BlockHeight() - // TODO: need create function to this if shouldInitialEpochStart { epochInfo.EpochCountingStarted = true diff --git a/x/feeabs/keeper/config.go b/x/feeabs/keeper/config.go index 091ab0e..1cec729 100644 --- a/x/feeabs/keeper/config.go +++ b/x/feeabs/keeper/config.go @@ -94,7 +94,6 @@ func (keeper Keeper) FrozenHostZoneByIBCDenom(ctx sdk.Context, ibcDenom string) func (keeper Keeper) UnFrozenHostZoneByIBCDenom(ctx sdk.Context, ibcDenom string) error { hostChainConfig, err := keeper.GetHostZoneConfig(ctx, ibcDenom) if err != nil { - // TODO: registry the error here return sdkerrors.Wrapf(types.ErrHostZoneConfigNotFound, err.Error()) } hostChainConfig.Frozen = false diff --git a/x/feeabs/module.go b/x/feeabs/module.go index 4ce3f30..a3459b8 100644 --- a/x/feeabs/module.go +++ b/x/feeabs/module.go @@ -80,7 +80,6 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, serveM } // GetTxCmd returns the feeabs module's root tx command. -// TODO: need to implement func (a AppModuleBasic) GetTxCmd() *cobra.Command { return cli.NewTxCmd() } @@ -159,14 +158,12 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // BeginBlock returns the begin blocker for the feeabs module. -// TODO: implement if needed func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { am.keeper.BeginBlocker(ctx) } // EndBlock returns the end blocker for the feeabs module. It returns no validator // updates. -// TODO: implement if needed func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } From dd79a95e651b32a3e6a59522d8417310287629b9 Mon Sep 17 00:00:00 2001 From: ducnt131 Date: Thu, 18 May 2023 16:56:34 +0700 Subject: [PATCH 42/50] use latest image of feeabs to test --- .github/workflows/interchaintest.yaml | 29 +++++++++++++++++++++++++++ tests/interchaintest/setup.go | 4 ++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.github/workflows/interchaintest.yaml b/.github/workflows/interchaintest.yaml index 88362a9..ca8272b 100644 --- a/.github/workflows/interchaintest.yaml +++ b/.github/workflows/interchaintest.yaml @@ -7,6 +7,35 @@ on: - main jobs: + build-and-push-image: + runs-on: ubuntu-latest + steps: + - + name: Check out the repo + uses: actions/checkout@v3 + - + name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - + name: Build and push + id: build_push_image + uses: docker/build-push-action@v3 + with: + file: Dockerfile + context: . + push: true + platforms: linux/amd64,linux/arm64 + tags: | + ghcr.io/notional-labs/fee-abstraction-ictest:latest test-basic: runs-on: ubuntu-latest steps: diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 192eda1..9c7467d 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -29,8 +29,8 @@ var ( FeeabsMainRepo = "ghcr.io/notional-labs/fee-abstraction" feeabsImage = ibc.DockerImage{ - Repository: "ghcr.io/notional-labs/fee-abstraction", - Version: "2.0.4", + Repository: "ghcr.io/notional-labs/fee-abstraction-ictest", + Version: "latest", UidGid: "1025:1025", } From c02b055bba47441a7a6f98ca653ebd47c6d0cb2b Mon Sep 17 00:00:00 2001 From: ducnt131 Date: Thu, 18 May 2023 17:14:08 +0700 Subject: [PATCH 43/50] need build and push image --- .github/workflows/interchaintest.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/interchaintest.yaml b/.github/workflows/interchaintest.yaml index ca8272b..a034002 100644 --- a/.github/workflows/interchaintest.yaml +++ b/.github/workflows/interchaintest.yaml @@ -38,6 +38,7 @@ jobs: ghcr.io/notional-labs/fee-abstraction-ictest:latest test-basic: runs-on: ubuntu-latest + needs: build-and-push-image steps: - name: Set up Go 1.19 uses: actions/setup-go@v3 @@ -51,6 +52,7 @@ jobs: test-ibc: runs-on: ubuntu-latest + needs: build-and-push-image steps: - name: Set up Go 1.19 uses: actions/setup-go@v3 @@ -63,6 +65,7 @@ jobs: - run: make ictest-ibc test-packet-forward: runs-on: ubuntu-latest + needs: build-and-push-image steps: - name: Set up Go 1.19 uses: actions/setup-go@v3 From 065178df344d13b0570ebb3e38299711d46ddd27 Mon Sep 17 00:00:00 2001 From: GnaD Date: Tue, 23 May 2023 14:20:25 +0700 Subject: [PATCH 44/50] correct docs --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4b0250a..5cfbfac 100644 --- a/README.md +++ b/README.md @@ -45,11 +45,9 @@ We modified `MempoolFeeDecorator` so that it can handle ibc-osmosis as fee. If t We have an account to manage the ibc-osmosis user used to pay for tx fee. The collected osmosis fee is sent to that account instead of community pool account. #### Swap accumulated ibc-tokens fee -##### Swap with Osmosis's tokens -We use osmosis's ibc hook feature to do this. We basically ibc transfer to the osmosis crosschain swap contract with custom memo to swap the osmosis fee back to customer chain's native-token and ibc transfer back to the customer chain. +Fee-abstraction will use osmosis's Cross chain Swap (XCS) feature to do this. We basically ibc transfer to the osmosis crosschain swap contract with custom memo to swap the osmosis fee back to customer chain's native-token and ibc transfer back to the customer chain. -##### Swap with others ibc-tokens -We use [``packet-forward-middleware``](https://github.com/strangelove-ventures/packet-forward-middleware) to do this. The ibc-tokens will be transferred to the host chain with the specific MEMO to forwarding transfer to osmosis crosschain swap contract. After that, Osmosis chain will swap to customer chain's native-token and ibc transfer back to the customer chain. +Current version of fee-abstraction working with XCSv2 ## Resources - Main repo: https://github.com/notional-labs/fee-abstraction From d6d5b2376aec860571de62105d542d50fe6f4b9e Mon Sep 17 00:00:00 2001 From: ducnt131 <62016666+anhductn2001@users.noreply.github.com> Date: Fri, 26 May 2023 11:08:08 +0700 Subject: [PATCH 45/50] Use feeapp:debug in local test (#157) --- .github/workflows/interchaintest.yaml | 7 +++++++ Makefile | 3 +++ tests/interchaintest/setup.go | 29 ++++++++++++++++++++++++--- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/.github/workflows/interchaintest.yaml b/.github/workflows/interchaintest.yaml index a034002..158d2d9 100644 --- a/.github/workflows/interchaintest.yaml +++ b/.github/workflows/interchaintest.yaml @@ -49,6 +49,8 @@ jobs: uses: actions/checkout@v3 - run: make ictest-basic + env: + BRANCH_CI: "latest" test-ibc: runs-on: ubuntu-latest @@ -63,6 +65,9 @@ jobs: uses: actions/checkout@v3 - run: make ictest-ibc + env: + BRANCH_CI: "latest" + test-packet-forward: runs-on: ubuntu-latest needs: build-and-push-image @@ -76,4 +81,6 @@ jobs: uses: actions/checkout@v3 - run: make ictest-packet-forward + env: + BRANCH_CI: "latest" diff --git a/Makefile b/Makefile index b1d0d94..16eadf1 100644 --- a/Makefile +++ b/Makefile @@ -93,6 +93,9 @@ install: go.sum build: go build $(BUILD_FLAGS) -o bin/feeappd ./cmd/feeappd +docker-build-debug: + @DOCKER_BUILDKIT=1 docker build -t feeapp:debug -f Dockerfile . + ############################################################################### ### Interchain test ### ############################################################################### diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index 9c7467d..f1d9d1b 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -1,6 +1,9 @@ package interchaintest import ( + "os" + "strings" + simappparams "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/types" balancertypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/balancer" @@ -26,11 +29,14 @@ const ( ) var ( - FeeabsMainRepo = "ghcr.io/notional-labs/fee-abstraction" + FeeabsMainRepo = "ghcr.io/notional-labs/fee-abstraction" + FeeabsICTestRepo = "ghcr.io/notional-labs/fee-abstraction-ictest" + + repo, version = GetDockerImageInfo() feeabsImage = ibc.DockerImage{ - Repository: "ghcr.io/notional-labs/fee-abstraction-ictest", - Version: "latest", + Repository: repo, + Version: version, UidGid: "1025:1025", } @@ -79,3 +85,20 @@ func osmosisEncoding() *simappparams.EncodingConfig { return cfg } + +// GetDockerImageInfo returns the appropriate repo and branch version string for integration with the CI pipeline. +// The remote runner sets the BRANCH_CI env var. If present, interchaintest will use the docker image pushed up to the repo. +// If testing locally, user should run `make docker-build-debug` and interchaintest will use the local image. +func GetDockerImageInfo() (repo, version string) { + branchVersion, found := os.LookupEnv("BRANCH_CI") + repo = FeeabsICTestRepo + if !found { + // make local-image + repo = "feeapp" + branchVersion = "debug" + } + + // github converts / to - for pushed docker images + branchVersion = strings.ReplaceAll(branchVersion, "/", "-") + return repo, branchVersion +} From 0f2feb70ef27b31ac118d7e26fa85d0a725df9c0 Mon Sep 17 00:00:00 2001 From: vuong <56973102+vuong177@users.noreply.github.com> Date: Mon, 17 Jul 2023 10:53:27 +0700 Subject: [PATCH 46/50] Update README.md (#158) --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 5cfbfac..9948cdf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Fee Abstraction - +## This repo has been moved to https://github.com/osmosis-labs/fee-abstraction ## Context The concrete use cases which motivated this module include: @@ -49,6 +49,3 @@ Fee-abstraction will use osmosis's Cross chain Swap (XCS) feature to do this. We Current version of fee-abstraction working with XCSv2 -## Resources - - Main repo: https://github.com/notional-labs/fee-abstraction - - Contract repo: https://github.com/notional-labs/feeabstraction-contract From 1ca41a599028bb0df68a3441d2dd19085694f7d2 Mon Sep 17 00:00:00 2001 From: GNaD Date: Sun, 23 Jul 2023 02:49:53 +0700 Subject: [PATCH 47/50] update readme --- README.md | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9948cdf..510aa1a 100644 --- a/README.md +++ b/README.md @@ -17,15 +17,13 @@ The implememtation also uses Osmosis swap router and async-icq module which are ## Prototype -Firstly, we narrow the feature of fee-abs from allowing general ibc token as tx fee to allowing only ibc-ed osmosis as tx fee. If thing goes smoothly , we'll work on developing the full feature of fee-abs. - Fee-abs mechanism in a nutshell: 1. Pulling `twap data` and update exchange rate: - Periodically pulling `twap data` from osmosis by ibc-ing to `async-icq` module on Osmosis, this `twap data` will update the exchange rate of osmosis to customer chain's native token. 2. Handling txs with ibc-osmosis fee: - - The exchange rate is used to calculate the amount of ibc-osmosis needed for tx fee allowing users to pay ibc-osmosis for tx fee instead of chain's native token. - 3. Swap accumulated ibc-osmosis fee: - - The collected ibc-osmosis users use for tx fee is periodically swaped back to customer chain's native token using osmosis. + - The exchange rate is used to calculate the amount of ibc-token needed for tx fee allowing users to pay ibc-token for tx fee instead of chain's native token. + 3. Swap accumulated ibc-token fee: + - The collected ibc-token users use for tx fee is periodically swaped back to customer chain's native token using osmosis. We'll goes into all the details now: @@ -40,12 +38,28 @@ Description : For every `update exchange rate period`, at fee-abs `BeginBlocker()` we submit a `InterchainQueryPacketData` which wrapped `QueryArithmeticTwapToNowRequest` to the querying channel on the customer chain's end. Then relayers will submit `MsgReceivePacket` so that our `QueryTwapPacket` which will be routed to `async-icq` module to be processed. `async-icq` module then unpack `InterchainQueryPacketData` and send query to TWAP module. The correspone response will be wrapped in the ibc acknowledgement. Relayers then submit `MsgAcknowledgement` to the customer chain so that the ibc acknowledgement is routed to fee-abs to be processed. Fee-abs then update exchange rate according to the Twap wrapped in the ibc acknowledgement. #### Handling txs with ibc-token fee -We modified `MempoolFeeDecorator` so that it can handle ibc-osmosis as fee. If the tx has osmosis fee, we basically replace the ibc-osmosis amount with the equivalent native-token amount which is calculated by `exchange rate` * `ibc-osmosis amount`. +We modified `MempoolFeeDecorator` so that it can handle ibc-token as fee. If the tx has ibc-token fee, the AnteHandler will first check if that token is allowed (which is setup by Gov) we basically replace the amount of ibc-token with the equivalent native-token amount which is calculated by `exchange rate` * `ibc-token amount`. -We have an account to manage the ibc-osmosis user used to pay for tx fee. The collected osmosis fee is sent to that account instead of community pool account. +We have an account to manage the ibc-token user used to pay for tx fee. The collected ibc-token fee is sent to that account instead of community pool account. #### Swap accumulated ibc-tokens fee Fee-abstraction will use osmosis's Cross chain Swap (XCS) feature to do this. We basically ibc transfer to the osmosis crosschain swap contract with custom memo to swap the osmosis fee back to customer chain's native-token and ibc transfer back to the customer chain. +##### How XCS work +###### Reverse With Path-unwinding to get Ibc-token on Osmosis: +- Create a ibc transfer message with a specific MEMO to work with ibc [``packet-forward-middleware``](https://github.com/strangelove-ventures/packet-forward-middleware) which is path-unwinding (an ibc feature that allow to automatic define the path and ibc transfer multiple hop follow the defined path) +- Ibc transfer the created packet to get the fee Ibc-token on Osmosis + +Ex: When you sent STARS on Hub to Osmosis, you will get Osmosis(Hub(STARS)) which is different with STARS on Osmosis Osmosis(STARS). It will reverse back Osmosis(Hub(STARS)) to Osmosis(STARS): + +![](https://i.imgur.com/D1wSrMm.png) + +###### Swap Ibc-token: +After reverse the ibc-token, XCS will : +- Swap with the specific pool (which is defined in the transfer packet from Feeabs-chain) to get Feeabs-chain native-token +- Transfer back Feeabs-chain native-token to Feeabs module account (will use to pay fee for other transaction) + +![](https://i.imgur.com/YKOK8mr.png) + Current version of fee-abstraction working with XCSv2 From a9323e868432f32cbd83fd95176170bc48ca93d1 Mon Sep 17 00:00:00 2001 From: GNaD Date: Sun, 23 Jul 2023 02:50:52 +0700 Subject: [PATCH 48/50] nit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 510aa1a..fd771ea 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The implememtation also uses Osmosis swap router and async-icq module which are Fee-abs mechanism in a nutshell: 1. Pulling `twap data` and update exchange rate: - Periodically pulling `twap data` from osmosis by ibc-ing to `async-icq` module on Osmosis, this `twap data` will update the exchange rate of osmosis to customer chain's native token. - 2. Handling txs with ibc-osmosis fee: + 2. Handling txs with ibc-token fee: - The exchange rate is used to calculate the amount of ibc-token needed for tx fee allowing users to pay ibc-token for tx fee instead of chain's native token. 3. Swap accumulated ibc-token fee: - The collected ibc-token users use for tx fee is periodically swaped back to customer chain's native token using osmosis. From 499aed8757d6b67e59b556d9c4c5be899f1b1f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=E1=BA=A1m=20Anh=20Minh?= <1phamminh0811@gmail.com> Date: Wed, 9 Aug 2023 20:30:56 +0700 Subject: [PATCH 49/50] all unit test success --- go.mod | 40 ++-- go.sum | 232 ++++----------------- go.work.example | 12 ++ tests/interchaintest/go.mod | 4 +- tests/interchaintest/go.sum | 4 +- tests/interchaintest/packet_foward_test.go | 12 +- tests/interchaintest/setup.go | 28 ++- 7 files changed, 111 insertions(+), 221 deletions(-) create mode 100644 go.work.example diff --git a/go.mod b/go.mod index f198ff2..386c788 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/CosmWasm/wasmd v0.30.0 github.com/CosmWasm/wasmvm v1.1.1 github.com/cosmos/cosmos-sdk v0.46.7 - github.com/cosmos/gogoproto v1.4.3 + github.com/cosmos/gogoproto v1.4.6 github.com/cosmos/ibc-go/v6 v6.1.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 @@ -18,21 +18,21 @@ require ( github.com/prometheus/client_golang v1.14.0 github.com/rakyll/statik v0.1.7 github.com/spf13/cast v1.5.0 - github.com/spf13/cobra v1.6.1 + github.com/spf13/cobra v1.7.0 github.com/strangelove-ventures/packet-forward-middleware/v6 v6.0.2 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 github.com/tendermint/tendermint v0.34.24 github.com/tendermint/tm-db v0.6.7 - google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e - google.golang.org/grpc v1.50.1 + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f + google.golang.org/grpc v1.53.0 ) require ( - cloud.google.com/go v0.104.0 // indirect - cloud.google.com/go/compute v1.12.1 // indirect + cloud.google.com/go v0.105.0 // indirect + cloud.google.com/go/compute v1.13.0 // indirect cloud.google.com/go/compute/metadata v0.2.1 // indirect - cloud.google.com/go/iam v0.4.0 // indirect - cloud.google.com/go/storage v1.23.0 // indirect + cloud.google.com/go/iam v0.8.0 // indirect + cloud.google.com/go/storage v1.27.0 // indirect filippo.io/edwards25519 v1.0.0-rc.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect @@ -55,7 +55,7 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-alpha8 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect - github.com/cosmos/iavl v0.19.4 // indirect + github.com/cosmos/iavl v0.19.5 // indirect github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect github.com/creachadair/taskgroup v0.3.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect @@ -83,8 +83,7 @@ require ( github.com/google/orderedcode v0.0.1 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.0 // indirect - github.com/googleapis/gax-go/v2 v2.6.0 // indirect - github.com/googleapis/go-type-adapters v1.0.0 // indirect + github.com/googleapis/gax-go/v2 v2.7.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -102,7 +101,7 @@ require ( github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect github.com/iancoleman/orderedmap v0.2.0 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.15.11 // indirect @@ -146,16 +145,16 @@ require ( github.com/zondax/hid v0.9.1 // indirect github.com/zondax/ledger-go v0.14.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect - go.opencensus.io v0.23.0 // indirect + go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.2.0 // indirect - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/net v0.2.0 // indirect + golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 // indirect + golang.org/x/net v0.6.0 // indirect golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect - golang.org/x/sys v0.2.0 // indirect - golang.org/x/term v0.2.0 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.102.0 // indirect + google.golang.org/api v0.103.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -169,6 +168,7 @@ replace ( // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 github.com/CosmWasm/wasmd => github.com/notional-labs/wasmd v0.30.0-sdk46 + github.com/cosmos/iavl => github.com/cosmos/iavl v0.19.4 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 google.golang.org/grpc => google.golang.org/grpc v1.50.1 ) diff --git a/go.sum b/go.sum index 065c777..69a4958 100644 --- a/go.sum +++ b/go.sum @@ -18,22 +18,8 @@ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHOb cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0 h1:gSmWO7DY1vOm0MVU6DNXM11BWHHsTUmsC5cv1fuW5X8= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0 h1:DNtEKRBAAzeS4KyIory52wWHuClNaXJ5x1F7xa4q+5Y= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -41,21 +27,15 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.12.1 h1:gKVJMEyqV5c/UnpzjjQbo3Rjvvqpr9B1DFSbJC4OXr0= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0 h1:AYrLkB8NPdDRslNp4Jxmzrhdr03fUAIDbiGFjLWowoU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute/metadata v0.2.1 h1:efOwf5ymceDhK6PKMnnrTHP4pppY5L22mle96M1yP48= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.4.0 h1:YBYU00SCDzZJdHqVc4I5d6lsklcYIjQZa1YmEz4jlSE= -cloud.google.com/go/iam v0.4.0/go.mod h1:cbaZxyScUhxl7ZAkNWiALgihfP75wS/fUsVNaa1r3vA= +cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -66,9 +46,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0 h1:wWRIaDURQA8xxHguFCshYepGlrWIrbBnAmc7wfg07qY= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0 h1:YOO045NZI9RKfCj1c5A/ZtuuENUc8OAW+gHdGnDgyMQ= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= cosmossdk.io/errors v1.0.0-beta.7 h1:gypHW76pTQGVnHKo6QBkb4yFOJjC+sUGRc5Al3Odj1w= cosmossdk.io/errors v1.0.0-beta.7/go.mod h1:mz6FQMJRku4bY7aqS/Gwfcmr/ue91roMEKAmDUDpBfE= @@ -237,12 +216,12 @@ github.com/cosmos/cosmos-sdk v0.46.7/go.mod h1:fqKqz39U5IlEFb4nbQ72951myztsDzFKK github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.4.3 h1:RP3yyVREh9snv/lsOvmsAPQt8f44LgL281X0IOIhhcI= -github.com/cosmos/gogoproto v1.4.3/go.mod h1:0hLIG5TR7IvV1fme1HCFKjfzW9X2x0Mo+RooWXCnOWU= +github.com/cosmos/gogoproto v1.4.6 h1:Ee7z15dWJaGlgM2rWrK8N2IX7PQcuccu8oG68jp5RL4= +github.com/cosmos/gogoproto v1.4.6/go.mod h1:VS/ASYmPgv6zkPKLjR9EB91lwbLHOzaGCirmKKhncfI= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= -github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= +github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/ibc-go/v6 v6.1.0 h1:o7oXws2vKkKfOFzJI+oNylRn44PCNt5wzHd/zKQKbvQ= github.com/cosmos/ibc-go/v6 v6.1.0/go.mod h1:CY3zh2HLfetRiW8LY6kVHMATe90Wj/UOoY8T6cuB0is= github.com/cosmos/interchain-accounts v0.4.2 h1:BxdzY22uouwe9wGK7h/HbzPNIH89JJ/4+V6n02l3cG4= @@ -398,9 +377,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -417,7 +394,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -442,8 +418,6 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -456,7 +430,6 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -469,11 +442,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -481,21 +449,12 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0 h1:y8Yozv7SZtlU//QXbezB6QkpuE6jMD2/gfzk4AftXjs= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.6.0 h1:SXk3ABtQYDT/OH8jAyvEOQ58mgawq5C4o/4/89qN2ZU= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -585,8 +544,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= @@ -910,8 +869,8 @@ github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -942,8 +901,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -1013,8 +973,8 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1063,8 +1023,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 h1:BEABXpNXLEz0WxtA+6CQIz2xkg80e+1zrhWyMcq8VzE= +golang.org/x/exp v0.0.0-20230131160201-f062dba9d201/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1078,7 +1038,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1090,7 +1049,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1137,9 +1096,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1147,13 +1104,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0 h1:L4ZwwTvKW9gr0ZMS1yrHD9GZhIuVjOBBnaKH+SPQK0Q= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1163,17 +1115,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1187,7 +1130,6 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1248,56 +1190,34 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1307,8 +1227,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1371,19 +1291,12 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -1412,29 +1325,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.102.0 h1:JxJl2qQ85fRMPNvlZY/enexbxpCjLwGhZUtgfGeQ51I= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0 h1:9yuVqlu2JCvcLg9p8S3fcFLZij8EPSyvODIY1rkMizQ= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1487,57 +1379,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1551,7 +1398,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8 h1:KR8+MyP7/qOlV+8Af01LtjL04bu7on42eVsxT4EyBQk= google.golang.org/protobuf v1.28.2-0.20220831092852-f930b1dc76e8/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/go.work.example b/go.work.example new file mode 100644 index 0000000..fb5a995 --- /dev/null +++ b/go.work.example @@ -0,0 +1,12 @@ +go 1.18 + +use ( + ./ + ./tests/interchaintest + +) + +replace ( + github.com/tendermint/tendermint => github.com/informalsystems/tendermint v0.34.24 + github.com/cosmos/iavl => github.com/cosmos/iavl v0.19.4 +) diff --git a/tests/interchaintest/go.mod b/tests/interchaintest/go.mod index 998e680..f83c0d0 100644 --- a/tests/interchaintest/go.mod +++ b/tests/interchaintest/go.mod @@ -9,6 +9,7 @@ require ( github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.2 github.com/grpc-ecosystem/grpc-gateway v1.16.0 + github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 github.com/notional-labs/fee-abstraction/v3 v3.0.0-20230427065305-f8f578f3486b github.com/strangelove-ventures/interchaintest/v6 v6.0.0-20230424212053-d8e473f39379 github.com/stretchr/testify v1.8.2 @@ -100,7 +101,6 @@ require ( github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hdevalence/ed25519consensus v0.0.0-20220222234857-c00d1f31bab3 // indirect - github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/ipfs/go-cid v0.0.7 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect @@ -215,7 +215,7 @@ replace ( github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 // For this nested module, you always want to replace the parent reference with the current worktree. github.com/notional-labs/fee-abstraction => ../../ - github.com/strangelove-ventures/interchaintest/v4 => github.com/notional-labs/interchaintest/v4 v4.0.1-0.20230426092153-0a643db3c6b2 + github.com/strangelove-ventures/interchaintest/v6 => github.com/notional-labs/interchaintest/v6 v6.0.0-20230505100442-9f1cb0b6b5f1 github.com/tendermint/tendermint => github.com/tendermint/tendermint v0.34.24 diff --git a/tests/interchaintest/go.sum b/tests/interchaintest/go.sum index a051de4..e92e1fc 100644 --- a/tests/interchaintest/go.sum +++ b/tests/interchaintest/go.sum @@ -499,6 +499,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/notional-labs/fee-abstraction/v3 v3.0.0-20230427065305-f8f578f3486b h1:qlOpSvMHDuwZHa02tf09erhHmSrDayvh17/QnKWplG8= github.com/notional-labs/fee-abstraction/v3 v3.0.0-20230427065305-f8f578f3486b/go.mod h1:yVo+j+7EUd6uXZxiIGBHKpyruodoeC86VVp2rbuCoas= +github.com/notional-labs/interchaintest/v6 v6.0.0-20230505100442-9f1cb0b6b5f1 h1:LsIFpa7USdzQdBsaEntenuyEJlWkNf4EJdntzYOoa48= +github.com/notional-labs/interchaintest/v6 v6.0.0-20230505100442-9f1cb0b6b5f1/go.mod h1:ja8AvdA1GMOGt0pXUlFNzXHbDgfPidjr5KZUOIxYZ1g= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -620,8 +622,6 @@ 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/strangelove-ventures/go-subkey v1.0.7 h1:cOP/Lajg3uxV/tvspu0m6+0Cu+DJgygkEAbx/s+f35I= github.com/strangelove-ventures/go-subkey v1.0.7/go.mod h1:E34izOIEm+sZ1YmYawYRquqBQWeZBjVB4pF7bMuhc1c= -github.com/strangelove-ventures/interchaintest/v6 v6.0.0-20230424212053-d8e473f39379 h1:PjVwlpSFlRZOZ8tI8pgR6PpiUM/4B7jpneJgDjjbiqg= -github.com/strangelove-ventures/interchaintest/v6 v6.0.0-20230424212053-d8e473f39379/go.mod h1:ja8AvdA1GMOGt0pXUlFNzXHbDgfPidjr5KZUOIxYZ1g= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= diff --git a/tests/interchaintest/packet_foward_test.go b/tests/interchaintest/packet_foward_test.go index 952a3ab..f7f53f7 100644 --- a/tests/interchaintest/packet_foward_test.go +++ b/tests/interchaintest/packet_foward_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + paramsutils "github.com/cosmos/cosmos-sdk/x/params/client/utils" transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types" interchaintest "github.com/strangelove-ventures/interchaintest/v6" "github.com/strangelove-ventures/interchaintest/v6/chain/cosmos" @@ -471,7 +472,12 @@ func TestPacketForwardMiddleware(t *testing.T) { current_directory, _ := os.Getwd() param_change_path := path.Join(current_directory, "proposal", "proposal.json") - paramTx, err := feeabs.ParamChangeProposal(ctx, feeabsUser.KeyName(), param_change_path) + data, err := os.ReadFile(param_change_path) + require.NoError(t, err) + + var proposal *paramsutils.ParamChangeProposalJSON + err = json.Unmarshal(data, &proposal) + paramTx, err := feeabs.ParamChangeProposal(ctx, feeabsUser.KeyName(), proposal) require.NoError(t, err, "error submitting param change proposal tx") err = feeabs.VoteOnProposalAllValidators(ctx, paramTx.ProposalID, cosmos.ProposalVoteYes) @@ -481,7 +487,7 @@ func TestPacketForwardMiddleware(t *testing.T) { _, err = cosmos.PollForProposalStatus(ctx, feeabs, height, height+10, paramTx.ProposalID, cosmos.ProposalStatusPassed) require.NoError(t, err, "proposal status did not change to passed in expected number of blocks") - _, err = cosmos.FeeabsAddHostZoneProposal(feeabs, ctx, feeabsUser.KeyName, "./proposal/host_zone.json") + _, err = cosmos.FeeabsAddHostZoneProposal(feeabs, ctx, feeabsUser.KeyName(), "./proposal/host_zone.json") require.NoError(t, err) err = feeabs.VoteOnProposalAllValidators(ctx, "2", cosmos.ProposalVoteYes) @@ -501,7 +507,7 @@ func TestPacketForwardMiddleware(t *testing.T) { require.NoError(t, err) fmt.Printf("Module Account Balances before swap: %v\n", feeabsModule.Balances) - transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName, uatomOnFeeabs) + transferTx, err := cosmos.FeeabsCrossChainSwap(feeabs, ctx, feeabsUser.KeyName(), uatomOnFeeabs) require.NoError(t, err) _, err = testutil.PollForAck(ctx, feeabs, feeabsHeight, feeabsHeight+25, transferTx.Packet) require.NoError(t, err) diff --git a/tests/interchaintest/setup.go b/tests/interchaintest/setup.go index bfdba36..3fc692b 100644 --- a/tests/interchaintest/setup.go +++ b/tests/interchaintest/setup.go @@ -1,11 +1,14 @@ package interchaintest import ( + "encoding/json" + "fmt" "os" "strings" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" "github.com/cosmos/cosmos-sdk/types" + "github.com/icza/dyno" balancertypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/balancer" gammtypes "github.com/notional-labs/fee-abstraction/tests/interchaintest/osmosistypes/gamm/types" feeabstype "github.com/notional-labs/fee-abstraction/v3/x/feeabs/types" @@ -52,7 +55,7 @@ var ( GasAdjustment: 1.1, TrustingPeriod: "112h", NoHostMount: false, - ModifyGenesis: cosmos.ModifyGenesisProposalTime(votingPeriod, maxDepositPeriod), + ModifyGenesis: modifyGenesisShortProposals(votingPeriod, maxDepositPeriod), ConfigFileOverrides: nil, EncodingConfig: feeabsEncoding(), } @@ -99,3 +102,26 @@ func GetDockerImageInfo() (repo, version string) { branchVersion = strings.ReplaceAll(branchVersion, "/", "-") return repo, branchVersion } + +func modifyGenesisShortProposals(votingPeriod string, maxDepositPeriod string) func(ibc.ChainConfig, []byte) ([]byte, error) { + return func(chainConfig ibc.ChainConfig, genbz []byte) ([]byte, error) { + g := make(map[string]interface{}) + if err := json.Unmarshal(genbz, &g); err != nil { + return nil, fmt.Errorf("failed to unmarshal genesis file: %w", err) + } + if err := dyno.Set(g, votingPeriod, "app_state", "gov", "voting_params", "voting_period"); err != nil { + return nil, fmt.Errorf("failed to set voting period in genesis json: %w", err) + } + if err := dyno.Set(g, maxDepositPeriod, "app_state", "gov", "deposit_params", "max_deposit_period"); err != nil { + return nil, fmt.Errorf("failed to set voting period in genesis json: %w", err) + } + if err := dyno.Set(g, chainConfig.Denom, "app_state", "gov", "deposit_params", "min_deposit", 0, "denom"); err != nil { + return nil, fmt.Errorf("failed to set voting period in genesis json: %w", err) + } + out, err := json.Marshal(g) + if err != nil { + return nil, fmt.Errorf("failed to marshal genesis bytes to json: %w", err) + } + return out, nil + } +} From f1950612296b8def0801ba529f40b8c24b444f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=E1=BA=A1m=20Anh=20Minh?= <1phamminh0811@gmail.com> Date: Wed, 9 Aug 2023 20:40:13 +0700 Subject: [PATCH 50/50] change iavl version --- go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index 69a4958..83c7b19 100644 --- a/go.sum +++ b/go.sum @@ -220,8 +220,8 @@ github.com/cosmos/gogoproto v1.4.6 h1:Ee7z15dWJaGlgM2rWrK8N2IX7PQcuccu8oG68jp5RL github.com/cosmos/gogoproto v1.4.6/go.mod h1:VS/ASYmPgv6zkPKLjR9EB91lwbLHOzaGCirmKKhncfI= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= -github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= -github.com/cosmos/iavl v0.19.5/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= +github.com/cosmos/iavl v0.19.4 h1:t82sN+Y0WeqxDLJRSpNd8YFX5URIrT+p8n6oJbJ2Dok= +github.com/cosmos/iavl v0.19.4/go.mod h1:X9PKD3J0iFxdmgNLa7b2LYWdsGd90ToV5cAONApkEPw= github.com/cosmos/ibc-go/v6 v6.1.0 h1:o7oXws2vKkKfOFzJI+oNylRn44PCNt5wzHd/zKQKbvQ= github.com/cosmos/ibc-go/v6 v6.1.0/go.mod h1:CY3zh2HLfetRiW8LY6kVHMATe90Wj/UOoY8T6cuB0is= github.com/cosmos/interchain-accounts v0.4.2 h1:BxdzY22uouwe9wGK7h/HbzPNIH89JJ/4+V6n02l3cG4=