From b028777a67708b480a89b145460b0e60eb01394c Mon Sep 17 00:00:00 2001 From: Sishir Giri Date: Thu, 3 Aug 2023 01:10:57 -0700 Subject: [PATCH 01/18] feat: CreateCLPool & LinkCFMMtoCL pool into one gov-prop (#5890) * feat: CreateCLPool & LinkCFMMtoCL pool into one gov-prop * adams suggestion * cleanup * fixed test * finally fixed test * rebased * nit --- CHANGELOG.md | 1 + app/keepers/modules.go | 1 + app/upgrades/v16/upgrades_test.go | 6 +- proto/osmosis/gamm/v1beta1/gov.proto | 39 ++ x/concentrated-liquidity/genesis.go | 1 + x/gamm/client/cli/flags.go | 2 + x/gamm/client/cli/tx.go | 132 +++++ x/gamm/client/proposal_handler.go | 5 +- x/gamm/client/rest/tx.go | 7 + x/gamm/handler.go | 12 + x/gamm/keeper/migrate.go | 4 + x/gamm/keeper/migrate_test.go | 76 ++- x/gamm/types/codec.go | 2 + x/gamm/types/errors.go | 1 + x/gamm/types/expected_keepers.go | 1 + x/gamm/types/gov.go | 87 ++- x/gamm/types/gov.pb.go | 798 ++++++++++++++++++++++++++- 17 files changed, 1099 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 034411997db..d78d7d99a3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#5870] (https://github.com/osmosis-labs/osmosis/pull/5870) Remove v14/ separator in protorev rest endpoints * [#5923] (https://github.com/osmosis-labs/osmosis/pull/5923) CL: Lower gas for initializing ticks * [#5927] (https://github.com/osmosis-labs/osmosis/pull/5927) Add gas metering to x/tokenfactory trackBeforeSend hook +* [#5890](https://github.com/osmosis-labs/osmosis/pull/5890) feat: CreateCLPool & LinkCFMMtoCL pool into one gov-prop ### Minor improvements & Bug Fixes diff --git a/app/keepers/modules.go b/app/keepers/modules.go index 69068f1f5df..4a67045df1f 100644 --- a/app/keepers/modules.go +++ b/app/keepers/modules.go @@ -82,6 +82,7 @@ var AppModuleBasics = []module.AppModuleBasic{ superfluidclient.UpdateUnpoolWhitelistProposalHandler, gammclient.ReplaceMigrationRecordsProposalHandler, gammclient.UpdateMigrationRecordsProposalHandler, + gammclient.CreateCLPoolAndLinkToCFMMProposalHandler, clclient.CreateConcentratedLiquidityPoolProposalHandler, clclient.TickSpacingDecreaseProposalHandler, cwpoolclient.UploadCodeIdAndWhitelistProposalHandler, diff --git a/app/upgrades/v16/upgrades_test.go b/app/upgrades/v16/upgrades_test.go index 4b78c29521b..86c1d8846cf 100644 --- a/app/upgrades/v16/upgrades_test.go +++ b/app/upgrades/v16/upgrades_test.go @@ -74,7 +74,7 @@ func (suite *UpgradeTestSuite) TestUpgrade() { multiplicativeTolerance := osmomath.ErrTolerance{ MultiplicativeTolerance: sdk.MustNewDecFromStr("0.0001"), } - + defaultDaiAmount, _ := sdk.NewIntFromString("73000000000000000000000") testCases := []struct { name string pre_upgrade func() @@ -88,11 +88,11 @@ func (suite *UpgradeTestSuite) TestUpgrade() { // Create earlier pools for i := uint64(1); i < v16.DaiOsmoPoolId; i++ { - suite.PrepareBalancerPoolWithCoins(desiredDenom0Coin, daiCoin) + suite.PrepareBalancerPoolWithCoins(sdk.NewCoin("uosmo", sdk.NewInt(10000000000)), sdk.NewCoin("ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7", defaultDaiAmount)) } // Create DAI / OSMO pool - suite.PrepareBalancerPoolWithCoins(daiCoin, desiredDenom0Coin) + suite.PrepareBalancerPoolWithCoins(sdk.NewCoin("ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7", defaultDaiAmount), sdk.NewCoin("uosmo", sdk.NewInt(10000000000))) }, func() { diff --git a/proto/osmosis/gamm/v1beta1/gov.proto b/proto/osmosis/gamm/v1beta1/gov.proto index 9ba81f96e58..0a88c347623 100644 --- a/proto/osmosis/gamm/v1beta1/gov.proto +++ b/proto/osmosis/gamm/v1beta1/gov.proto @@ -58,3 +58,42 @@ message UpdateMigrationRecordsProposal { repeated BalancerToConcentratedPoolLink records = 3 [ (gogoproto.nullable) = false ]; } + +message PoolRecordWithCFMMLink { + option (gogoproto.equal) = true; + + string denom0 = 1 [ (gogoproto.moretags) = "yaml:\"denom0\"" ]; + string denom1 = 2 [ (gogoproto.moretags) = "yaml:\"denom1\"" ]; + uint64 tick_spacing = 3 [ (gogoproto.moretags) = "yaml:\"tick_spacing\"" ]; + string exponent_at_price_one = 4 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + (gogoproto.moretags) = "yaml:\"exponent_at_price_one\"", + (gogoproto.nullable) = false + ]; + string spread_factor = 5 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.moretags) = "yaml:\"spread_factor\"", + (gogoproto.nullable) = false + ]; + uint64 balancer_pool_id = 6 + [ (gogoproto.moretags) = "yaml:\"balancer_pool_id\"" ]; +} + +// CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal is a gov Content type +// for creating concentrated liquidity pools and linking it to a CFMM pool. +message CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal { + option (gogoproto.equal) = true; + option (gogoproto.goproto_getters) = false; + option (gogoproto.goproto_stringer) = false; + option (amino.name) = + "osmosis/CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal"; + option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; + + string title = 1; + string description = 2; + + repeated PoolRecordWithCFMMLink pool_records_with_cfmm_link = 3 [ + (gogoproto.moretags) = "yaml:\"create_cl_pool_and_link_to_cfmm\"", + (gogoproto.nullable) = false + ]; +} \ No newline at end of file diff --git a/x/concentrated-liquidity/genesis.go b/x/concentrated-liquidity/genesis.go index f88b0d05ef5..f933a9f3913 100644 --- a/x/concentrated-liquidity/genesis.go +++ b/x/concentrated-liquidity/genesis.go @@ -154,6 +154,7 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *genesis.GenesisState { incentivesAccumObject := make([]genesis.AccumObject, len(incentivesAccum)) for i, incentiveAccum := range incentivesAccum { incentiveAccumTotalShares := incentiveAccum.GetTotalShares() + genesisAccum := genesis.AccumObject{ Name: incentiveAccum.GetName(), AccumContent: &accum.AccumulatorContent{ diff --git a/x/gamm/client/cli/flags.go b/x/gamm/client/cli/flags.go index 29d6d610758..1b0b84536ab 100644 --- a/x/gamm/client/cli/flags.go +++ b/x/gamm/client/cli/flags.go @@ -42,6 +42,8 @@ const ( FlagScalingFactors = "scaling-factors" FlagMigrationRecords = "migration-records" + + FlagPoolRecords = "pool-records" ) type createBalancerPoolInputs struct { diff --git a/x/gamm/client/cli/tx.go b/x/gamm/client/cli/tx.go index 107a368d088..c0f3f910bef 100644 --- a/x/gamm/client/cli/tx.go +++ b/x/gamm/client/cli/tx.go @@ -295,6 +295,57 @@ Ex) 2,4,1,5 -> [(Balancer 2, CL 4), (Balancer 1, CL 5)] return cmd } +// NewCmdSubmitUpdateMigrationRecordsProposal implements a command handler for update migration records proposal +func NewCmdSubmitCreateCLPoolAndLinkToCFMMProposal() *cobra.Command { + cmd := &cobra.Command{ + Use: "create-cl-pool-and-cfmm-link [flags]", + Args: cobra.ExactArgs(0), + Short: "Submit a create clpool and link to cfmm proposal", + Long: strings.TrimSpace(`submit a proposal to create CL pool and link to Balancer pool.`), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + content, err := parseCreateConcentratedLiquidityPoolArgsToContent(cmd) + if err != nil { + return err + } + + from := clientCtx.GetFromAddress() + + depositStr, err := cmd.Flags().GetString(govcli.FlagDeposit) + if err != nil { + return err + } + deposit, err := sdk.ParseCoinsNormalized(depositStr) + if err != nil { + return err + } + + msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + if err != nil { + return err + } + + if err = msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().String(govcli.FlagTitle, "", "title of proposal") + cmd.Flags().String(govcli.FlagDescription, "", "description of proposal") + cmd.Flags().String(govcli.FlagDeposit, "", "deposit of proposal") + cmd.Flags().Bool(govcli.FlagIsExpedited, false, "If true, makes the proposal an expedited one") + cmd.Flags().String(govcli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") + cmd.Flags().String(FlagPoolRecords, "", "The pool records array") + + return cmd +} + func BuildCreatePoolCmd(clientCtx client.Context, args []string, fs *flag.FlagSet) (sdk.Msg, error) { poolType, err := fs.GetString(FlagPoolType) if err != nil { @@ -714,3 +765,84 @@ func parseUpdateMigrationRecordsArgsToContent(cmd *cobra.Command) (govtypes.Cont } return content, nil } + +func parseCreateConcentratedLiquidityPoolArgsToContent(cmd *cobra.Command) (govtypes.Content, error) { + title, err := cmd.Flags().GetString(govcli.FlagTitle) + if err != nil { + return nil, err + } + + description, err := cmd.Flags().GetString(govcli.FlagDescription) + if err != nil { + return nil, err + } + + poolRecordsWithCFMMLink, err := parsePoolRecordsWithCFMMLink(cmd) + if err != nil { + return nil, err + } + + content := &types.CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{ + Title: title, + Description: description, + PoolRecordsWithCfmmLink: poolRecordsWithCFMMLink, + } + + return content, nil +} + +func parsePoolRecordsWithCFMMLink(cmd *cobra.Command) ([]types.PoolRecordWithCFMMLink, error) { + poolRecordsStr, err := cmd.Flags().GetString(FlagPoolRecords) + if err != nil { + return nil, err + } + + poolRecordsWithCFMMLink := strings.Split(poolRecordsStr, ",") + + if len(poolRecordsWithCFMMLink)%6 != 0 { + return nil, fmt.Errorf("poolRecordswithCFMMLink must be a list of denom0, denom1, tickSpacing, exponentAtPriceOne, spreadFactor and balancerPoolId") + } + + finalPoolRecords := []types.PoolRecordWithCFMMLink{} + i := 0 + for i < len(poolRecordsWithCFMMLink) { + denom0 := poolRecordsWithCFMMLink[i] + denom1 := poolRecordsWithCFMMLink[i+1] + + tickSpacing, err := strconv.Atoi(poolRecordsWithCFMMLink[i+2]) + if err != nil { + return nil, err + } + + exponentAtPriceOneStr := poolRecordsWithCFMMLink[i+3] + exponentAtPriceOne, ok := sdk.NewIntFromString(exponentAtPriceOneStr) + if !ok { + return nil, fmt.Errorf("invalid exponentAtPriceOne: %s", exponentAtPriceOneStr) + } + + spreadFactorStr := poolRecordsWithCFMMLink[i+4] + spreadFactor, err := sdk.NewDecFromStr(spreadFactorStr) + if err != nil { + return nil, err + } + + balancerPoolId, err := strconv.Atoi(poolRecordsWithCFMMLink[i+5]) + if err != nil { + return nil, err + } + + finalPoolRecords = append(finalPoolRecords, types.PoolRecordWithCFMMLink{ + Denom0: denom0, + Denom1: denom1, + TickSpacing: uint64(tickSpacing), + ExponentAtPriceOne: exponentAtPriceOne, + SpreadFactor: spreadFactor, + BalancerPoolId: uint64(balancerPoolId), + }) + + // increase counter by the next 6 + i = i + 6 + } + + return finalPoolRecords, nil +} diff --git a/x/gamm/client/proposal_handler.go b/x/gamm/client/proposal_handler.go index 053da15248a..a180114a474 100644 --- a/x/gamm/client/proposal_handler.go +++ b/x/gamm/client/proposal_handler.go @@ -8,6 +8,7 @@ import ( ) var ( - ReplaceMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitReplaceMigrationRecordsProposal, rest.ProposalReplaceMigrationRecordsRESTHandler) - UpdateMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitUpdateMigrationRecordsProposal, rest.ProposalUpdateMigrationRecordsRESTHandler) + ReplaceMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitReplaceMigrationRecordsProposal, rest.ProposalReplaceMigrationRecordsRESTHandler) + UpdateMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitUpdateMigrationRecordsProposal, rest.ProposalUpdateMigrationRecordsRESTHandler) + CreateCLPoolAndLinkToCFMMProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitCreateCLPoolAndLinkToCFMMProposal, rest.ProposalCreateConcentratedLiquidityPoolAndLinkToCFMMHandler) ) diff --git a/x/gamm/client/rest/tx.go b/x/gamm/client/rest/tx.go index 29d089b48a3..a8691710a3e 100644 --- a/x/gamm/client/rest/tx.go +++ b/x/gamm/client/rest/tx.go @@ -21,6 +21,13 @@ func ProposalUpdateMigrationRecordsRESTHandler(clientCtx client.Context) govrest } } +func ProposalCreateConcentratedLiquidityPoolAndLinkToCFMMHandler(clientCtx client.Context) govrest.ProposalRESTHandler { + return govrest.ProposalRESTHandler{ + SubRoute: "create-cl-pool-and-cfmm-link", + Handler: emptyHandler(clientCtx), + } +} + func emptyHandler(clientCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { } diff --git a/x/gamm/handler.go b/x/gamm/handler.go index 1cc31858bfd..7993cfe2be1 100644 --- a/x/gamm/handler.go +++ b/x/gamm/handler.go @@ -19,6 +19,8 @@ func NewMigrationRecordHandler(k keeper.Keeper) govtypes.Handler { return handleUpdateMigrationRecordsProposal(ctx, k, c) case *types.ReplaceMigrationRecordsProposal: return handleReplaceMigrationRecordsProposal(ctx, k, c) + case *types.CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal: + return handleCreatingCLPoolAndLinkToCFMMProposal(ctx, k, c) default: return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized migration record proposal content type: %T", c) @@ -35,3 +37,13 @@ func handleReplaceMigrationRecordsProposal(ctx sdk.Context, k keeper.Keeper, p * func handleUpdateMigrationRecordsProposal(ctx sdk.Context, k keeper.Keeper, p *types.UpdateMigrationRecordsProposal) error { return k.HandleUpdateMigrationRecordsProposal(ctx, p) } + +func handleCreatingCLPoolAndLinkToCFMMProposal(ctx sdk.Context, k keeper.Keeper, p *types.CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) error { + for _, record := range p.PoolRecordsWithCfmmLink { + _, err := k.CreateCanonicalConcentratedLiquidityPoolAndMigrationLink(ctx, record.BalancerPoolId, record.Denom0, record.SpreadFactor, record.TickSpacing) + if err != nil { + return err + } + } + return nil +} diff --git a/x/gamm/keeper/migrate.go b/x/gamm/keeper/migrate.go index 5072c1c34f0..0b5edfc304c 100644 --- a/x/gamm/keeper/migrate.go +++ b/x/gamm/keeper/migrate.go @@ -388,6 +388,10 @@ func (k Keeper) CreateConcentratedPoolFromCFMM(ctx sdk.Context, cfmmPoolIdToLink } } + if spreadFactor.IsZero() || spreadFactor.IsNil() { + spreadFactor = cfmmPool.GetSpreadFactor(ctx) + } + createPoolMsg := clmodel.NewMsgCreateConcentratedPool(poolCreatorAddress, desiredDenom0, denom1, tickSpacing, spreadFactor) concentratedPool, err := k.poolManager.CreateConcentratedPoolAsPoolManager(ctx, createPoolMsg) if err != nil { diff --git a/x/gamm/keeper/migrate_test.go b/x/gamm/keeper/migrate_test.go index 4c24bc78162..8d9f9771c6c 100644 --- a/x/gamm/keeper/migrate_test.go +++ b/x/gamm/keeper/migrate_test.go @@ -916,8 +916,8 @@ func (s *KeeperTestSuite) TestGetAllMigrationInfo() { } } -func (suite *KeeperTestSuite) TestRedirectDistributionRecord() { - suite.Setup() +func (s *KeeperTestSuite) TestRedirectDistributionRecord() { + s.Setup() var ( defaultUsdcAmount = sdk.NewInt(7300000000) @@ -926,8 +926,8 @@ func (suite *KeeperTestSuite) TestRedirectDistributionRecord() { osmoCoin = sdk.NewCoin("uosmo", defaultOsmoAmount) ) - longestLockableDuration, err := suite.App.PoolIncentivesKeeper.GetLongestLockableDuration(suite.Ctx) - suite.Require().NoError(err) + longestLockableDuration, err := s.App.PoolIncentivesKeeper.GetLongestLockableDuration(s.Ctx) + s.Require().NoError(err) tests := map[string]struct { poolLiquidity sdk.Coins @@ -956,22 +956,22 @@ func (suite *KeeperTestSuite) TestRedirectDistributionRecord() { for name, tc := range tests { tc := tc - suite.Run(name, func() { - suite.SetupTest() + s.Run(name, func() { + s.SetupTest() // Create primary balancer pool. - balancerId := suite.PrepareBalancerPoolWithCoins(tc.poolLiquidity...) - balancerPool, err := suite.App.PoolManagerKeeper.GetPool(suite.Ctx, balancerId) - suite.Require().NoError(err) + balancerId := s.PrepareBalancerPoolWithCoins(tc.poolLiquidity...) + balancerPool, err := s.App.PoolManagerKeeper.GetPool(s.Ctx, balancerId) + s.Require().NoError(err) // Create another balancer pool to test that its gauge links are unchanged - balancerId2 := suite.PrepareBalancerPoolWithCoins(tc.poolLiquidity...) + balancerId2 := s.PrepareBalancerPoolWithCoins(tc.poolLiquidity...) // Get gauges for both balancer pools. - gaugeToRedirect, err := suite.App.PoolIncentivesKeeper.GetPoolGaugeId(suite.Ctx, balancerPool.GetId(), longestLockableDuration) - suite.Require().NoError(err) - gaugeToNotRedirect, err := suite.App.PoolIncentivesKeeper.GetPoolGaugeId(suite.Ctx, balancerId2, longestLockableDuration) - suite.Require().NoError(err) + gaugeToRedirect, err := s.App.PoolIncentivesKeeper.GetPoolGaugeId(s.Ctx, balancerPool.GetId(), longestLockableDuration) + s.Require().NoError(err) + gaugeToNotRedirect, err := s.App.PoolIncentivesKeeper.GetPoolGaugeId(s.Ctx, balancerId2, longestLockableDuration) + s.Require().NoError(err) // Distribution info prior to redirecting. originalDistrInfo := poolincentivestypes.DistrInfo{ @@ -987,31 +987,31 @@ func (suite *KeeperTestSuite) TestRedirectDistributionRecord() { }, }, } - suite.App.PoolIncentivesKeeper.SetDistrInfo(suite.Ctx, originalDistrInfo) + s.App.PoolIncentivesKeeper.SetDistrInfo(s.Ctx, originalDistrInfo) // Create concentrated pool. - clPool := suite.PrepareCustomConcentratedPool(suite.TestAccs[0], tc.poolLiquidity[1].Denom, tc.poolLiquidity[0].Denom, 100, sdk.MustNewDecFromStr("0.001")) + clPool := s.PrepareCustomConcentratedPool(s.TestAccs[0], tc.poolLiquidity[1].Denom, tc.poolLiquidity[0].Denom, 100, sdk.MustNewDecFromStr("0.001")) // Redirect distribution record from the primary balancer pool to the concentrated pool. - err = suite.App.GAMMKeeper.RedirectDistributionRecord(suite.Ctx, tc.cfmmPoolId, tc.clPoolId) + err = s.App.GAMMKeeper.RedirectDistributionRecord(s.Ctx, tc.cfmmPoolId, tc.clPoolId) if tc.expectError != nil { - suite.Require().Error(err) + s.Require().Error(err) return } - suite.Require().NoError(err) + s.Require().NoError(err) // Validate that the balancer gauge is now linked to the new concentrated pool. - concentratedPoolGaugeId, err := suite.App.PoolIncentivesKeeper.GetPoolGaugeId(suite.Ctx, clPool.GetId(), suite.App.IncentivesKeeper.GetEpochInfo(suite.Ctx).Duration) - suite.Require().NoError(err) - distrInfo := suite.App.PoolIncentivesKeeper.GetDistrInfo(suite.Ctx) - suite.Require().Equal(distrInfo.Records[0].GaugeId, concentratedPoolGaugeId) + concentratedPoolGaugeId, err := s.App.PoolIncentivesKeeper.GetPoolGaugeId(s.Ctx, clPool.GetId(), s.App.IncentivesKeeper.GetEpochInfo(s.Ctx).Duration) + s.Require().NoError(err) + distrInfo := s.App.PoolIncentivesKeeper.GetDistrInfo(s.Ctx) + s.Require().Equal(distrInfo.Records[0].GaugeId, concentratedPoolGaugeId) // Validate that distribution record from another pool is not redirected. - suite.Require().Equal(distrInfo.Records[1].GaugeId, gaugeToNotRedirect) + s.Require().Equal(distrInfo.Records[1].GaugeId, gaugeToNotRedirect) // Validate that old gauge still exist - _, err = suite.App.IncentivesKeeper.GetGaugeByID(suite.Ctx, gaugeToRedirect) - suite.Require().NoError(err) + _, err = s.App.IncentivesKeeper.GetGaugeByID(s.Ctx, gaugeToRedirect) + s.Require().NoError(err) }) } } @@ -1022,7 +1022,6 @@ func (s *KeeperTestSuite) TestCreateConcentratedPoolFromCFMM() { cfmmPoolIdToLinkWith uint64 desiredDenom0 string - spreadFactor sdk.Dec expectedDenoms []string expectError error }{ @@ -1030,22 +1029,19 @@ func (s *KeeperTestSuite) TestCreateConcentratedPoolFromCFMM() { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin), cfmmPoolIdToLinkWith: validPoolId, desiredDenom0: desiredDenom0, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), expectedDenoms: []string{desiredDenom0, daiCoin.Denom}, }, "error: invalid denom 0": { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin), cfmmPoolIdToLinkWith: validPoolId, desiredDenom0: USDCIBCDenom, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), - expectError: types.NoDesiredDenomInPoolError{DesiredDenom: USDCIBCDenom}, + expectError: types.NoDesiredDenomInPoolError{USDCIBCDenom}, }, "error: pool with 3 assets, must have two": { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin, usdcCoin), cfmmPoolIdToLinkWith: validPoolId, desiredDenom0: USDCIBCDenom, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), - expectError: types.MustHaveTwoDenomsError{NumDenoms: 3}, + expectError: types.ErrMustHaveTwoDenoms, }, } @@ -1059,7 +1055,7 @@ func (s *KeeperTestSuite) TestCreateConcentratedPoolFromCFMM() { balancerPool, err := s.App.PoolManagerKeeper.GetPool(s.Ctx, balancerId) s.Require().NoError(err) - clPoolReturned, err := s.App.GAMMKeeper.CreateConcentratedPoolFromCFMM(s.Ctx, tc.cfmmPoolIdToLinkWith, tc.desiredDenom0, tc.spreadFactor, defaultTickSpacing) + clPoolReturned, err := s.App.GAMMKeeper.CreateConcentratedPoolFromCFMM(s.Ctx, tc.cfmmPoolIdToLinkWith, tc.desiredDenom0, sdk.ZeroDec(), defaultTickSpacing) if tc.expectError != nil { s.Require().Error(err) @@ -1074,7 +1070,7 @@ func (s *KeeperTestSuite) TestCreateConcentratedPoolFromCFMM() { s.Require().Equal(clPoolReturned, clPoolInState) // Validate CL and balancer pools have the same spread factor. - s.Require().Equal(tc.spreadFactor, clPoolReturned.GetSpreadFactor(s.Ctx)) + s.Require().Equal(balancerPool.GetSpreadFactor(s.Ctx), clPoolReturned.GetSpreadFactor(s.Ctx)) // Validate that CL and balancer pools have the same denoms balancerDenoms, err := s.App.PoolManagerKeeper.RouteGetPoolDenoms(s.Ctx, balancerPool.GetId()) @@ -1101,7 +1097,6 @@ func (s *KeeperTestSuite) TestCreateCanonicalConcentratedLiquidityPoolAndMigrati poolLiquidity sdk.Coins cfmmPoolIdToLinkWith uint64 desiredDenom0 string - spreadFactor sdk.Dec expectedBalancerDenoms []string expectedConcentratedDenoms []string setupInvalidDuraitons bool @@ -1115,7 +1110,6 @@ func (s *KeeperTestSuite) TestCreateCanonicalConcentratedLiquidityPoolAndMigrati // determined by desired denom 0 expectedConcentratedDenoms: []string{desiredDenom0Coin.Denom, daiCoin.Denom}, desiredDenom0: desiredDenom0, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), }, "success - denoms are not reordered relative to balancer": { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin), @@ -1125,27 +1119,23 @@ func (s *KeeperTestSuite) TestCreateCanonicalConcentratedLiquidityPoolAndMigrati // determined by desired denom 0 expectedConcentratedDenoms: []string{daiCoin.Denom, desiredDenom0Coin.Denom}, desiredDenom0: daiCoin.Denom, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), }, "error: invalid denom 0": { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin), cfmmPoolIdToLinkWith: validPoolId, desiredDenom0: USDCIBCDenom, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), - expectError: types.NoDesiredDenomInPoolError{DesiredDenom: USDCIBCDenom}, + expectError: types.NoDesiredDenomInPoolError{USDCIBCDenom}, }, "error: pool with 3 assets, must have two": { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin, usdcCoin), cfmmPoolIdToLinkWith: validPoolId, desiredDenom0: USDCIBCDenom, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), - expectError: types.MustHaveTwoDenomsError{NumDenoms: 3}, + expectError: types.ErrMustHaveTwoDenoms, }, "error: invalid denom durations": { poolLiquidity: sdk.NewCoins(desiredDenom0Coin, daiCoin), cfmmPoolIdToLinkWith: validPoolId, desiredDenom0: desiredDenom0, - spreadFactor: sdk.MustNewDecFromStr("0.0001"), setupInvalidDuraitons: true, expectError: types.ErrNoGaugeToRedirect, }, @@ -1189,7 +1179,7 @@ func (s *KeeperTestSuite) TestCreateCanonicalConcentratedLiquidityPoolAndMigrati } s.App.PoolIncentivesKeeper.SetDistrInfo(s.Ctx, originalDistrInfo) - clPool, err := s.App.GAMMKeeper.CreateCanonicalConcentratedLiquidityPoolAndMigrationLink(s.Ctx, tc.cfmmPoolIdToLinkWith, tc.desiredDenom0, tc.spreadFactor, defaultTickSpacing) + clPool, err := s.App.GAMMKeeper.CreateCanonicalConcentratedLiquidityPoolAndMigrationLink(s.Ctx, tc.cfmmPoolIdToLinkWith, tc.desiredDenom0, sdk.ZeroDec(), defaultTickSpacing) if tc.expectError != nil { s.Require().Error(err) diff --git a/x/gamm/types/codec.go b/x/gamm/types/codec.go index b842641502f..45ad44fbfe9 100644 --- a/x/gamm/types/codec.go +++ b/x/gamm/types/codec.go @@ -23,6 +23,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgExitSwapShareAmountIn{}, "osmosis/gamm/exit-swap-share-amount-in", nil) cdc.RegisterConcrete(&UpdateMigrationRecordsProposal{}, "osmosis/gamm/update-migration-records-proposal", nil) cdc.RegisterConcrete(&ReplaceMigrationRecordsProposal{}, "osmosis/gamm/replace-migration-records-proposal", nil) + cdc.RegisterConcrete(&CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{}, "osmosis/gamm/create-cl-pool-and-cfmm-link", nil) } func RegisterInterfaces(registry types.InterfaceRegistry) { @@ -47,6 +48,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { (*govtypes.Content)(nil), &UpdateMigrationRecordsProposal{}, &ReplaceMigrationRecordsProposal{}, + &CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/gamm/types/errors.go b/x/gamm/types/errors.go index ec82293ea86..2c9781ff2c9 100644 --- a/x/gamm/types/errors.go +++ b/x/gamm/types/errors.go @@ -107,4 +107,5 @@ var ( ErrHitMaxScaledAssets = errorsmod.Register(ModuleName, 65, "post-scaled pool assets can not exceed 10^34") ErrHitMinScaledAssets = errorsmod.Register(ModuleName, 66, "post-scaled pool assets can not be less than 1") ErrNoGaugeToRedirect = errorsmod.Register(ModuleName, 67, "could not find gauge to redirect") + ErrMustHaveTwoDenoms = errorsmod.Register(ModuleName, 68, "can only have 2 denoms in CL pool") ) diff --git a/x/gamm/types/expected_keepers.go b/x/gamm/types/expected_keepers.go index ddc798aa7f6..adce072e991 100644 --- a/x/gamm/types/expected_keepers.go +++ b/x/gamm/types/expected_keepers.go @@ -53,6 +53,7 @@ type CommunityPoolKeeper interface { // ConcentratedLiquidityKeeper defines the contract needed to be fulfilled for the concentrated liquidity keeper. type ConcentratedLiquidityKeeper interface { + SetParams(ctx sdk.Context, params cltypes.Params) GetConcentratedPoolById(ctx sdk.Context, poolId uint64) (cltypes.ConcentratedPoolExtension, error) CreateFullRangePosition(ctx sdk.Context, clPoolId uint64, owner sdk.AccAddress, coins sdk.Coins) (positionId uint64, amount0, amount1 sdk.Int, liquidity sdk.Dec, err error) } diff --git a/x/gamm/types/gov.go b/x/gamm/types/gov.go index 8592d14fa6d..a962515e6f7 100644 --- a/x/gamm/types/gov.go +++ b/x/gamm/types/gov.go @@ -4,13 +4,15 @@ import ( "fmt" "strings" + sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" gammmigration "github.com/osmosis-labs/osmosis/v17/x/gamm/types/migration" ) const ( - ProposalTypeUpdateMigrationRecords = "UpdateMigrationRecords" - ProposalTypeReplaceMigrationRecords = "ReplaceMigrationRecords" + ProposalTypeUpdateMigrationRecords = "UpdateMigrationRecords" + ProposalTypeReplaceMigrationRecords = "ReplaceMigrationRecords" + ProposalTypeCreateConcentratedLiquidityPoolAndLinktoCFMM = "CreateConcentratedLiquidityPoolAndLinktoCFMM" ) // Init registers proposals to update and replace migration records. @@ -19,11 +21,14 @@ func init() { govtypes.RegisterProposalTypeCodec(&UpdateMigrationRecordsProposal{}, "osmosis/UpdateMigrationRecordsProposal") govtypes.RegisterProposalType(ProposalTypeReplaceMigrationRecords) govtypes.RegisterProposalTypeCodec(&ReplaceMigrationRecordsProposal{}, "osmosis/ReplaceMigrationRecordsProposal") + govtypes.RegisterProposalType(ProposalTypeCreateConcentratedLiquidityPoolAndLinktoCFMM) + govtypes.RegisterProposalTypeCodec(&CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{}, "osmosis/CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal") } var ( _ govtypes.Content = &UpdateMigrationRecordsProposal{} _ govtypes.Content = &ReplaceMigrationRecordsProposal{} + _ govtypes.Content = &CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{} ) // NewReplacePoolIncentivesProposal returns a new instance of a replace migration record's proposal struct. @@ -130,3 +135,81 @@ func (p UpdateMigrationRecordsProposal) String() string { `, p.Title, p.Description, recordsStr)) return b.String() } + +func NewCreateConcentratedLiquidityPoolsAndLinktoCFMMProposal(title, description string, records []PoolRecordWithCFMMLink) govtypes.Content { + return &CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{ + Title: title, + Description: description, + PoolRecordsWithCfmmLink: records, + } +} + +// GetTitle gets the title of the proposal +func (p *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) GetTitle() string { return p.Title } + +// GetDescription gets the description of the proposal +func (p *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) GetDescription() string { + return p.Description +} + +// ProposalRoute returns the router key for the proposal +func (p *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) ProposalRoute() string { + return RouterKey +} + +// ProposalType returns the type of the proposal +func (p *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) ProposalType() string { + return ProposalTypeCreateConcentratedLiquidityPoolAndLinktoCFMM +} + +// ValidateBasic validates a governance proposal's abstract and basic contents. +func (p *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) ValidateBasic() error { + err := govtypes.ValidateAbstract(p) + if err != nil { + return err + } + + for _, record := range p.PoolRecordsWithCfmmLink { + if record.TickSpacing <= 0 { + return fmt.Errorf("tick spacing must be positive") + } + + if record.Denom0 == record.Denom1 { + return fmt.Errorf("denom0 and denom1 must be different") + } + + if sdk.ValidateDenom(record.Denom0) != nil { + return fmt.Errorf("denom0 is invalid: %s", sdk.ValidateDenom(record.Denom0)) + } + + if sdk.ValidateDenom(record.Denom1) != nil { + return fmt.Errorf("denom1 is invalid: %s", sdk.ValidateDenom(record.Denom1)) + } + + spreadFactor := record.SpreadFactor + if spreadFactor.IsNegative() || spreadFactor.GTE(sdk.OneDec()) { + return fmt.Errorf("Invalid Spread factor") + } + + if record.BalancerPoolId <= 0 { + return fmt.Errorf("Invalid Balancer Pool Id") + } + } + return nil +} + +// String returns a string containing creating CL pool and linking it to an existing CFMM pool. +func (p CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) String() string { + recordsStr := "" + for _, record := range p.PoolRecordsWithCfmmLink { + recordsStr = recordsStr + fmt.Sprintf("(Denom0: %s, Denom1: %s, TickSpacing: %d, ExponentAtPriceOne: %d, SpreadFactor: %d, BalancerPoolId: %d) ", record.Denom0, record.Denom1, record.TickSpacing, record.ExponentAtPriceOne, record.SpreadFactor, record.BalancerPoolId) + } + + var b strings.Builder + b.WriteString(fmt.Sprintf(`Create Concentrated Liquidity Pool Proposal: +Title: %s +Description: %s +Records: %s +`, p.Title, p.Description, recordsStr)) + return b.String() +} diff --git a/x/gamm/types/gov.pb.go b/x/gamm/types/gov.pb.go index 2a149902eb1..2a9cee5853e 100644 --- a/x/gamm/types/gov.pb.go +++ b/x/gamm/types/gov.pb.go @@ -6,6 +6,7 @@ package types import ( fmt "fmt" _ "github.com/cosmos/cosmos-proto" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" @@ -115,40 +116,175 @@ func (m *UpdateMigrationRecordsProposal) XXX_DiscardUnknown() { var xxx_messageInfo_UpdateMigrationRecordsProposal proto.InternalMessageInfo +type PoolRecordWithCFMMLink struct { + Denom0 string `protobuf:"bytes,1,opt,name=denom0,proto3" json:"denom0,omitempty" yaml:"denom0"` + Denom1 string `protobuf:"bytes,2,opt,name=denom1,proto3" json:"denom1,omitempty" yaml:"denom1"` + TickSpacing uint64 `protobuf:"varint,3,opt,name=tick_spacing,json=tickSpacing,proto3" json:"tick_spacing,omitempty" yaml:"tick_spacing"` + ExponentAtPriceOne github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=exponent_at_price_one,json=exponentAtPriceOne,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"exponent_at_price_one" yaml:"exponent_at_price_one"` + SpreadFactor github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=spread_factor,json=spreadFactor,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"spread_factor" yaml:"spread_factor"` + BalancerPoolId uint64 `protobuf:"varint,6,opt,name=balancer_pool_id,json=balancerPoolId,proto3" json:"balancer_pool_id,omitempty" yaml:"balancer_pool_id"` +} + +func (m *PoolRecordWithCFMMLink) Reset() { *m = PoolRecordWithCFMMLink{} } +func (m *PoolRecordWithCFMMLink) String() string { return proto.CompactTextString(m) } +func (*PoolRecordWithCFMMLink) ProtoMessage() {} +func (*PoolRecordWithCFMMLink) Descriptor() ([]byte, []int) { + return fileDescriptor_f31b9a6c0dbbdfa3, []int{2} +} +func (m *PoolRecordWithCFMMLink) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PoolRecordWithCFMMLink) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PoolRecordWithCFMMLink.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 *PoolRecordWithCFMMLink) XXX_Merge(src proto.Message) { + xxx_messageInfo_PoolRecordWithCFMMLink.Merge(m, src) +} +func (m *PoolRecordWithCFMMLink) XXX_Size() int { + return m.Size() +} +func (m *PoolRecordWithCFMMLink) XXX_DiscardUnknown() { + xxx_messageInfo_PoolRecordWithCFMMLink.DiscardUnknown(m) +} + +var xxx_messageInfo_PoolRecordWithCFMMLink proto.InternalMessageInfo + +func (m *PoolRecordWithCFMMLink) GetDenom0() string { + if m != nil { + return m.Denom0 + } + return "" +} + +func (m *PoolRecordWithCFMMLink) GetDenom1() string { + if m != nil { + return m.Denom1 + } + return "" +} + +func (m *PoolRecordWithCFMMLink) GetTickSpacing() uint64 { + if m != nil { + return m.TickSpacing + } + return 0 +} + +func (m *PoolRecordWithCFMMLink) GetBalancerPoolId() uint64 { + if m != nil { + return m.BalancerPoolId + } + return 0 +} + +// CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal is a gov Content type +// for creating concentrated liquidity pools and linking it to a CFMM pool. +type CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal struct { + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + PoolRecordsWithCfmmLink []PoolRecordWithCFMMLink `protobuf:"bytes,3,rep,name=pool_records_with_cfmm_link,json=poolRecordsWithCfmmLink,proto3" json:"pool_records_with_cfmm_link" yaml:"create_cl_pool_and_link_to_cfmm"` +} + +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Reset() { + *m = CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{} +} +func (*CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) ProtoMessage() {} +func (*CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_f31b9a6c0dbbdfa3, []int{3} +} +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal.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 *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal.Merge(m, src) +} +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) XXX_Size() int { + return m.Size() +} +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) XXX_DiscardUnknown() { + xxx_messageInfo_CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal proto.InternalMessageInfo + func init() { proto.RegisterType((*ReplaceMigrationRecordsProposal)(nil), "osmosis.gamm.v1beta1.ReplaceMigrationRecordsProposal") proto.RegisterType((*UpdateMigrationRecordsProposal)(nil), "osmosis.gamm.v1beta1.UpdateMigrationRecordsProposal") + proto.RegisterType((*PoolRecordWithCFMMLink)(nil), "osmosis.gamm.v1beta1.PoolRecordWithCFMMLink") + proto.RegisterType((*CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal)(nil), "osmosis.gamm.v1beta1.CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal") } func init() { proto.RegisterFile("osmosis/gamm/v1beta1/gov.proto", fileDescriptor_f31b9a6c0dbbdfa3) } var fileDescriptor_f31b9a6c0dbbdfa3 = []byte{ - // 388 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xcb, 0x2f, 0xce, 0xcd, - 0x2f, 0xce, 0x2c, 0xd6, 0x4f, 0x4f, 0xcc, 0xcd, 0xd5, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, 0x34, - 0xd4, 0x4f, 0xcf, 0x2f, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x81, 0xca, 0xeb, 0x81, - 0xe4, 0xf5, 0xa0, 0xf2, 0x52, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, 0x60, 0x05, 0xfa, 0x20, 0x16, 0x44, - 0xad, 0x94, 0x12, 0x76, 0xb3, 0x52, 0xf3, 0x52, 0x41, 0x06, 0x40, 0xd4, 0x28, 0x62, 0x55, 0x53, - 0x9c, 0x91, 0x58, 0x94, 0x9a, 0x02, 0x55, 0x22, 0x99, 0x0c, 0x56, 0x13, 0x0f, 0x31, 0x1f, 0xc2, - 0x81, 0x4a, 0x09, 0x26, 0xe6, 0x66, 0xe6, 0xe5, 0xeb, 0x83, 0x49, 0x88, 0x90, 0x52, 0x3b, 0x13, - 0x97, 0x7c, 0x50, 0x6a, 0x41, 0x4e, 0x62, 0x72, 0xaa, 0x6f, 0x66, 0x7a, 0x51, 0x62, 0x49, 0x66, - 0x7e, 0x5e, 0x50, 0x6a, 0x72, 0x7e, 0x51, 0x4a, 0x71, 0x40, 0x51, 0x7e, 0x41, 0x7e, 0x71, 0x62, - 0x8e, 0x90, 0x08, 0x17, 0x6b, 0x49, 0x66, 0x49, 0x4e, 0xaa, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, - 0x10, 0x84, 0x23, 0xa4, 0xc0, 0xc5, 0x9d, 0x92, 0x5a, 0x9c, 0x5c, 0x94, 0x59, 0x00, 0xd2, 0x23, - 0xc1, 0x04, 0x96, 0x43, 0x16, 0x12, 0x0a, 0xe1, 0x62, 0x2f, 0x82, 0x18, 0x25, 0xc1, 0xac, 0xc0, - 0xac, 0xc1, 0x6d, 0x64, 0xa2, 0x87, 0x2d, 0x38, 0xf4, 0x9c, 0x12, 0x73, 0x12, 0xf3, 0x92, 0x53, - 0x8b, 0x42, 0xf2, 0x9d, 0xf3, 0xf3, 0x92, 0x53, 0xf3, 0x4a, 0x8a, 0x12, 0x4b, 0x52, 0x53, 0x02, - 0xf2, 0xf3, 0x73, 0x7c, 0x32, 0xf3, 0xb2, 0x9d, 0x58, 0x4e, 0xdc, 0x93, 0x67, 0x08, 0x82, 0x19, - 0x65, 0x15, 0xd6, 0xb1, 0x40, 0x9e, 0x61, 0xc6, 0x02, 0x79, 0x86, 0x17, 0x0b, 0xe4, 0x19, 0x4f, - 0x6d, 0xd1, 0x95, 0x82, 0x7a, 0x11, 0x14, 0xe8, 0x30, 0x13, 0x9d, 0xf3, 0xf3, 0x4a, 0x52, 0xf3, - 0x4a, 0xba, 0x9e, 0x6f, 0xd0, 0x52, 0x87, 0x85, 0x18, 0x01, 0x5f, 0x2a, 0xb5, 0x32, 0x71, 0xc9, - 0x85, 0x16, 0xa4, 0x24, 0x96, 0x0c, 0x95, 0x80, 0x08, 0x25, 0x2d, 0x20, 0xd4, 0x60, 0x01, 0x81, - 0xdf, 0x93, 0x4e, 0x5e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, - 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, 0x65, 0x90, - 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0x0f, 0x35, 0x4c, 0x37, 0x27, 0x31, - 0xa9, 0x18, 0xc6, 0xd1, 0x2f, 0x33, 0x34, 0xd7, 0xaf, 0x80, 0x24, 0xcd, 0x92, 0xca, 0x82, 0xd4, - 0xe2, 0x24, 0x36, 0x70, 0x22, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x8c, 0xe5, 0x3d, 0x03, - 0x27, 0x03, 0x00, 0x00, + // 731 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x55, 0xbf, 0x6f, 0xd3, 0x40, + 0x14, 0x8e, 0x93, 0xb4, 0x08, 0xb7, 0x45, 0xd4, 0x04, 0x1a, 0x5a, 0x64, 0x07, 0x0f, 0xa5, 0x20, + 0x6a, 0x37, 0xfc, 0x10, 0x52, 0x24, 0x86, 0x26, 0x50, 0xa9, 0xa8, 0x85, 0xca, 0xb4, 0x20, 0xb1, + 0x58, 0x97, 0xf3, 0xd5, 0x39, 0xc5, 0xbe, 0x33, 0xf6, 0xb5, 0xb4, 0x23, 0x03, 0x02, 0x31, 0x31, + 0x22, 0xa6, 0xfe, 0x09, 0x0c, 0xfc, 0x11, 0x15, 0x53, 0x47, 0xc4, 0x60, 0xa1, 0x76, 0xa0, 0x73, + 0x46, 0x26, 0x74, 0x77, 0x76, 0x15, 0x20, 0x02, 0x15, 0x26, 0x96, 0x24, 0xef, 0xbd, 0xcf, 0xdf, + 0xbb, 0xf7, 0xdd, 0xf7, 0x62, 0x55, 0xa7, 0x49, 0x48, 0x13, 0x9c, 0xd8, 0x3e, 0x08, 0x43, 0x7b, + 0xb3, 0xde, 0x46, 0x0c, 0xd4, 0x6d, 0x9f, 0x6e, 0x5a, 0x51, 0x4c, 0x19, 0xd5, 0x2a, 0x59, 0xdd, + 0xe2, 0x75, 0x2b, 0xab, 0x4f, 0x56, 0x7c, 0xea, 0x53, 0x01, 0xb0, 0xf9, 0x2f, 0x89, 0x9d, 0x34, + 0x07, 0x73, 0x21, 0x82, 0x38, 0x81, 0xc4, 0x5c, 0x1c, 0x88, 0x49, 0x3a, 0x20, 0x46, 0x5e, 0x06, + 0x39, 0x0f, 0x05, 0xc6, 0x95, 0xfc, 0x32, 0xc8, 0x4a, 0xe3, 0x20, 0xc4, 0x84, 0xda, 0xe2, 0x53, + 0xa6, 0xcc, 0x97, 0x45, 0xd5, 0x70, 0x50, 0x14, 0x00, 0x88, 0x96, 0xb1, 0x1f, 0x03, 0x86, 0x29, + 0x71, 0x10, 0xa4, 0xb1, 0x97, 0xac, 0xc4, 0x34, 0xa2, 0x09, 0x08, 0xb4, 0x8a, 0x3a, 0xc4, 0x30, + 0x0b, 0x50, 0x55, 0xa9, 0x29, 0x33, 0x27, 0x1d, 0x19, 0x68, 0x35, 0x75, 0xc4, 0x43, 0x09, 0x8c, + 0x71, 0xc4, 0x9f, 0xa9, 0x16, 0x45, 0xad, 0x3f, 0xa5, 0xad, 0xaa, 0x27, 0x62, 0x49, 0x55, 0x2d, + 0xd5, 0x4a, 0x33, 0x23, 0xd7, 0x6e, 0x58, 0x83, 0xe4, 0xb0, 0x9a, 0x20, 0x00, 0x04, 0xa2, 0x78, + 0x95, 0xb6, 0x28, 0x81, 0x88, 0xb0, 0x18, 0x30, 0xe4, 0xad, 0x50, 0x1a, 0x2c, 0x61, 0xd2, 0x6d, + 0x96, 0x77, 0x53, 0xa3, 0xe0, 0xe4, 0x54, 0x8d, 0x47, 0xaf, 0x76, 0x8c, 0xc2, 0xdb, 0x1d, 0xa3, + 0x70, 0xb8, 0x63, 0x28, 0x1f, 0x3f, 0xcc, 0x4e, 0x66, 0x23, 0x72, 0xd1, 0x73, 0xc6, 0x16, 0x25, + 0x0c, 0x11, 0xf6, 0xfa, 0xeb, 0xfb, 0x2b, 0x97, 0x72, 0xc5, 0xfe, 0x30, 0xa5, 0xf9, 0xa2, 0xa8, + 0xea, 0x6b, 0x91, 0x07, 0xd8, 0xff, 0x22, 0xc4, 0xda, 0xf1, 0x84, 0x98, 0xce, 0x85, 0xf8, 0xfd, + 0x90, 0xe6, 0x61, 0x49, 0x3d, 0xc7, 0x5b, 0xca, 0xfc, 0x63, 0xcc, 0x3a, 0xad, 0x85, 0xe5, 0x65, + 0x7e, 0x00, 0xed, 0xb2, 0x3a, 0xec, 0x21, 0x42, 0xc3, 0x39, 0x29, 0x40, 0x73, 0xbc, 0x97, 0x1a, + 0x63, 0xdb, 0x20, 0x0c, 0x1a, 0xa6, 0xcc, 0x9b, 0x4e, 0x06, 0x38, 0x82, 0xd6, 0xa5, 0x1e, 0xbf, + 0x40, 0xeb, 0x39, 0xb4, 0xae, 0x35, 0xd4, 0x51, 0x86, 0x61, 0xd7, 0x4d, 0x22, 0x00, 0x31, 0xf1, + 0xab, 0xa5, 0x9a, 0x32, 0x53, 0x6e, 0x4e, 0xf4, 0x52, 0xe3, 0x8c, 0x7c, 0xa0, 0xbf, 0x6a, 0x3a, + 0x23, 0x3c, 0x7c, 0x28, 0x23, 0xed, 0xb9, 0xa2, 0x9e, 0x45, 0x5b, 0x11, 0x25, 0x88, 0x30, 0x17, + 0x30, 0x37, 0x8a, 0x31, 0x44, 0x2e, 0x25, 0xa8, 0x5a, 0x16, 0x6d, 0xef, 0x73, 0xc9, 0x3e, 0xa7, + 0xc6, 0xb4, 0x8f, 0x59, 0x67, 0xa3, 0x6d, 0x41, 0x1a, 0x66, 0x2b, 0x91, 0x7d, 0xcd, 0x26, 0x5e, + 0xd7, 0x66, 0xdb, 0x11, 0x4a, 0xac, 0x45, 0xc2, 0x7a, 0xa9, 0x71, 0x41, 0xf6, 0x1c, 0x48, 0x6a, + 0x3a, 0x5a, 0x9e, 0x9f, 0x67, 0x2b, 0x3c, 0xfb, 0x80, 0x20, 0xad, 0xab, 0x8e, 0x25, 0x51, 0x8c, + 0x80, 0xe7, 0xae, 0x03, 0xc8, 0x68, 0x5c, 0x1d, 0x12, 0xad, 0x17, 0x8e, 0xd1, 0xfa, 0x0e, 0x82, + 0xbd, 0xd4, 0xa8, 0xc8, 0xd6, 0x3f, 0x90, 0x99, 0xce, 0xa8, 0x8c, 0x17, 0x44, 0xa8, 0xdd, 0x55, + 0x4f, 0xb7, 0x33, 0x97, 0xb8, 0x11, 0xa5, 0x81, 0x8b, 0xbd, 0xea, 0xb0, 0x10, 0x6c, 0xaa, 0x97, + 0x1a, 0x13, 0x92, 0xe1, 0x67, 0x84, 0xe9, 0x9c, 0xca, 0x53, 0xfc, 0x66, 0x17, 0xbd, 0x46, 0x99, + 0x7b, 0xc6, 0xfc, 0x56, 0x54, 0x6f, 0xb6, 0x62, 0x04, 0x18, 0xea, 0xf7, 0xdb, 0x12, 0x7e, 0xba, + 0x81, 0x3d, 0xcc, 0xb6, 0x39, 0x36, 0x99, 0x27, 0x1e, 0xbf, 0x7b, 0x46, 0xb9, 0x0b, 0xfe, 0x79, + 0x13, 0xde, 0x29, 0xea, 0x94, 0x38, 0x54, 0x66, 0x62, 0xf7, 0x19, 0x66, 0x1d, 0x17, 0xae, 0x87, + 0xa1, 0x1b, 0x60, 0xd2, 0xcd, 0xd6, 0xe3, 0xea, 0xe0, 0xf5, 0x18, 0xec, 0xca, 0xa6, 0xc5, 0x85, + 0xee, 0xa5, 0xc6, 0xb4, 0x1c, 0x1e, 0x8a, 0x81, 0x5c, 0x18, 0xc8, 0xe9, 0x01, 0xf1, 0x04, 0xb5, + 0xcb, 0xa8, 0xe8, 0x63, 0x3a, 0x13, 0xd1, 0x11, 0x4f, 0x22, 0x88, 0xd6, 0xc3, 0x90, 0x13, 0x35, + 0x82, 0xe3, 0x2d, 0xd4, 0xed, 0x7c, 0xa1, 0xfe, 0x4a, 0xc2, 0xe6, 0xbd, 0xdd, 0x7d, 0x5d, 0xd9, + 0xdb, 0xd7, 0x95, 0x2f, 0xfb, 0xba, 0xf2, 0xe6, 0x40, 0x2f, 0xec, 0x1d, 0xe8, 0x85, 0x4f, 0x07, + 0x7a, 0xe1, 0xc9, 0x5c, 0x9f, 0x63, 0xb2, 0x1e, 0xb3, 0x01, 0x68, 0x27, 0x79, 0x60, 0x6f, 0xd6, + 0x6f, 0xd9, 0x5b, 0xf2, 0x15, 0x20, 0xfc, 0xd3, 0x1e, 0x16, 0x7f, 0xe6, 0xd7, 0xbf, 0x07, 0x00, + 0x00, 0xff, 0xff, 0xa0, 0x4f, 0xff, 0x36, 0x8f, 0x06, 0x00, 0x00, } func (this *ReplaceMigrationRecordsProposal) Equal(that interface{}) bool { @@ -221,6 +357,80 @@ func (this *UpdateMigrationRecordsProposal) Equal(that interface{}) bool { } return true } +func (this *PoolRecordWithCFMMLink) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*PoolRecordWithCFMMLink) + if !ok { + that2, ok := that.(PoolRecordWithCFMMLink) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Denom0 != that1.Denom0 { + return false + } + if this.Denom1 != that1.Denom1 { + return false + } + if this.TickSpacing != that1.TickSpacing { + return false + } + if !this.ExponentAtPriceOne.Equal(that1.ExponentAtPriceOne) { + return false + } + if !this.SpreadFactor.Equal(that1.SpreadFactor) { + return false + } + if this.BalancerPoolId != that1.BalancerPoolId { + return false + } + return true +} +func (this *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) + if !ok { + that2, ok := that.(CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Title != that1.Title { + return false + } + if this.Description != that1.Description { + return false + } + if len(this.PoolRecordsWithCfmmLink) != len(that1.PoolRecordsWithCfmmLink) { + return false + } + for i := range this.PoolRecordsWithCfmmLink { + if !this.PoolRecordsWithCfmmLink[i].Equal(&that1.PoolRecordsWithCfmmLink[i]) { + return false + } + } + return true +} func (m *ReplaceMigrationRecordsProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -323,6 +533,124 @@ func (m *UpdateMigrationRecordsProposal) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *PoolRecordWithCFMMLink) 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 *PoolRecordWithCFMMLink) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PoolRecordWithCFMMLink) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.BalancerPoolId != 0 { + i = encodeVarintGov(dAtA, i, uint64(m.BalancerPoolId)) + i-- + dAtA[i] = 0x30 + } + { + size := m.SpreadFactor.Size() + i -= size + if _, err := m.SpreadFactor.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGov(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size := m.ExponentAtPriceOne.Size() + i -= size + if _, err := m.ExponentAtPriceOne.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGov(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if m.TickSpacing != 0 { + i = encodeVarintGov(dAtA, i, uint64(m.TickSpacing)) + i-- + dAtA[i] = 0x18 + } + if len(m.Denom1) > 0 { + i -= len(m.Denom1) + copy(dAtA[i:], m.Denom1) + i = encodeVarintGov(dAtA, i, uint64(len(m.Denom1))) + i-- + dAtA[i] = 0x12 + } + if len(m.Denom0) > 0 { + i -= len(m.Denom0) + copy(dAtA[i:], m.Denom0) + i = encodeVarintGov(dAtA, i, uint64(len(m.Denom0))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) 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 *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.PoolRecordsWithCfmmLink) > 0 { + for iNdEx := len(m.PoolRecordsWithCfmmLink) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PoolRecordsWithCfmmLink[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGov(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintGov(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintGov(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintGov(dAtA []byte, offset int, v uint64) int { offset -= sovGov(v) base := offset @@ -380,6 +708,56 @@ func (m *UpdateMigrationRecordsProposal) Size() (n int) { return n } +func (m *PoolRecordWithCFMMLink) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Denom0) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + l = len(m.Denom1) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + if m.TickSpacing != 0 { + n += 1 + sovGov(uint64(m.TickSpacing)) + } + l = m.ExponentAtPriceOne.Size() + n += 1 + l + sovGov(uint64(l)) + l = m.SpreadFactor.Size() + n += 1 + l + sovGov(uint64(l)) + if m.BalancerPoolId != 0 { + n += 1 + sovGov(uint64(m.BalancerPoolId)) + } + return n +} + +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + if len(m.PoolRecordsWithCfmmLink) > 0 { + for _, e := range m.PoolRecordsWithCfmmLink { + l = e.Size() + n += 1 + l + sovGov(uint64(l)) + } + } + return n +} + func sovGov(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -682,6 +1060,374 @@ func (m *UpdateMigrationRecordsProposal) Unmarshal(dAtA []byte) error { } return nil } +func (m *PoolRecordWithCFMMLink) 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 ErrIntOverflowGov + } + 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: PoolRecordWithCFMMLink: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PoolRecordWithCFMMLink: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Denom0", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Denom0 = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Denom1", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Denom1 = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TickSpacing", wireType) + } + m.TickSpacing = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TickSpacing |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExponentAtPriceOne", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ExponentAtPriceOne.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SpreadFactor", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SpreadFactor.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BalancerPoolId", wireType) + } + m.BalancerPoolId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BalancerPoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGov(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGov + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) 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 ErrIntOverflowGov + } + 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: CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PoolRecordsWithCfmmLink", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGov + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PoolRecordsWithCfmmLink = append(m.PoolRecordsWithCfmmLink, PoolRecordWithCFMMLink{}) + if err := m.PoolRecordsWithCfmmLink[len(m.PoolRecordsWithCfmmLink)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGov(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGov + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGov(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 322adb0c9a260d792bbf1ccf2fa53b93a67ce887 Mon Sep 17 00:00:00 2001 From: Niccolo Raspa <6024049+niccoloraspa@users.noreply.github.com> Date: Thu, 3 Aug 2023 19:27:51 +0200 Subject: [PATCH 02/18] [CI] Add concurrency options to test workflow (#5955) * Add concurrency options to E2E * test if it cancels job * undo blank line --------- Co-authored-by: Adam Tucker --- .github/workflows/test.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e4b78c66071..9ebe3cf3cce 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,10 @@ on: env: GO_VERSION: '1.20.5' +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: get_diff: runs-on: ubuntu-latest From 74d8aa886be5d2ae1757bea8d76ddb94fcecb53e Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Thu, 3 Aug 2023 12:46:59 -0500 Subject: [PATCH 03/18] feat: self hosted e2e tests (#5951) * attempt self hosted e2e tests * prune docker containers * filter E2E docker container pruning * fix syntax * syntax * syntax * syntax * use mutex to prevent concurrent map writes * stream logs * use wg for run validators * various perf changes * make a standard timeout for all tests --- .github/workflows/test.yml | 95 ++++++++++++-------------- Makefile | 2 +- tests/e2e/configurer/base.go | 24 +++++-- tests/e2e/configurer/chain/chain.go | 12 +++- tests/e2e/configurer/chain/commands.go | 14 +++- tests/e2e/configurer/chain/node.go | 4 +- tests/e2e/configurer/chain/queries.go | 2 +- tests/e2e/containers/containers.go | 4 +- tests/e2e/e2e_setup_test.go | 2 + tests/e2e/e2e_test.go | 10 +-- tests/e2e/helpers_e2e_test.go | 8 ++- tests/e2e/scripts/hermes_bootstrap.sh | 2 +- 12 files changed, 102 insertions(+), 77 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9ebe3cf3cce..77e1ac8fd35 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ on: workflow_dispatch: env: - GO_VERSION: '1.20.5' + GO_VERSION: "1.20.5" concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -22,11 +22,9 @@ jobs: get_diff: runs-on: ubuntu-latest steps: - - - name: Check out repository code + - name: Check out repository code uses: actions/checkout@v3 - - - name: Get git diff + - name: Get git diff uses: technote-space/get-diff-action@v6.1.2 with: PATTERNS: | @@ -45,37 +43,29 @@ jobs: if: needs.get_diff.outputs.git_diff runs-on: ubuntu-latest steps: - - - name: Check out repository code + - name: Check out repository code uses: actions/checkout@v3 - - - name: 🐿 Setup Golang + - name: 🐿 Setup Golang uses: actions/setup-go@v4 with: go-version: ${{env.GO_VERSION}} - - - name: Create a file with all core Cosmos SDK pkgs + - name: Create a file with all core Cosmos SDK pkgs run: go list ./... ./osmomath/... ./osmoutils/... ./x/ibc-hooks/... ./x/epochs | grep -E -v 'tests/simulator|e2e' > pkgs.txt - - - name: Split pkgs into 4 files + - name: Split pkgs into 4 files run: split -d -n l/4 pkgs.txt pkgs.txt.part. - - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v3 with: name: "${{ github.sha }}-00" path: ./pkgs.txt.part.00 - - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v3 with: name: "${{ github.sha }}-01" path: ./pkgs.txt.part.01 - - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v3 with: name: "${{ github.sha }}-02" path: ./pkgs.txt.part.02 - - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v3 with: name: "${{ github.sha }}-03" path: ./pkgs.txt.part.03 @@ -89,23 +79,18 @@ jobs: matrix: part: ["00", "01", "02", "03"] steps: - - - name: Check out repository code + - name: Check out repository code uses: actions/checkout@v3 - - - name: 🐿 Setup Golang + - name: 🐿 Setup Golang uses: actions/setup-go@v4 with: go-version: ${{env.GO_VERSION}} - - - name: Display go version + - name: Display go version run: go version - - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v3 with: name: "${{ github.sha }}-${{ matrix.part }}" - - - name: Test & coverage report creation + - name: Test & coverage report creation run: | VERSION=$(echo $(git describe --tags) | sed 's/^v//') || VERSION=${GITHUB_SHA} TESTS=$(cat pkgs.txt.part.${{ matrix.part }}) @@ -115,59 +100,63 @@ jobs: e2e: needs: get_diff if: needs.get_diff.outputs.git_diff - runs-on: ubuntu-latest + runs-on: self-hosted timeout-minutes: 25 steps: - - - name: Check out repository code + - name: Clean up Pre-Existing E2E Docker containers + run: | + # Remove containers with names starting with "osmo-test-" + docker ps -aqf "name=osmo-test-*" | xargs -r docker rm -f + + # Remove containers with names starting with "hermes-relayer" + docker ps -aqf "name=hermes-relayer*" | xargs -r docker rm -f + - name: Check out repository code uses: actions/checkout@v3 with: fetch-depth: 0 - - - name: 🐿 Setup Golang + - name: 🐿 Setup Golang uses: actions/setup-go@v4 with: go-version: ${{env.GO_VERSION}} - - - name: Set up QEMU + - name: Set up QEMU uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - - - name: Build e2e image + - name: Build e2e image uses: docker/build-push-action@v4 with: load: true context: . tags: osmosis:debug - # Use experimental Cache backend API: + # Use experimental Cache backend API: # https://github.com/docker/build-push-action/blob/master/docs/advanced/cache.md#cache-backend-api cache-from: type=gha cache-to: type=gha,mode=max build-args: | BASE_IMG_TAG=debug - - - name: Test e2e and Upgrade + - name: Test e2e and Upgrade run: make test-e2e-ci - - - name: Dump docker logs on failure + - name: Dump docker logs on failure if: failure() uses: jwalton/gh-docker-logs@v2 with: dest: "./logs" - - - name: Tar logs + - name: Tar logs if: failure() run: tar cvzf ./logs.tgz ./logs - - - name: Upload logs to GitHub + - name: Upload logs to GitHub uses: actions/upload-artifact@v3 with: name: logs.tgz path: ./logs.tgz if: failure() - - - name: 🧹 Clean up Osmosis Home + - name: 🧹 Clean up Osmosis Home if: always() run: rm -rf $HOME/.osmosisd/ || true + - name: Clean up E2E Docker containers + run: | + # Remove containers with names starting with "osmo-test-" + docker ps -aqf "name=osmo-test-*" | xargs -r docker rm -f + + # Remove containers with names starting with "hermes-relayer" + docker ps -aqf "name=hermes-relayer*" | xargs -r docker rm -f diff --git a/Makefile b/Makefile index 3559d6cb182..ff9018b4bcc 100644 --- a/Makefile +++ b/Makefile @@ -282,7 +282,7 @@ run-querygen: ############################################################################### PACKAGES_UNIT=$(shell go list ./... ./osmomath/... ./osmoutils/... ./x/ibc-hooks/... ./x/epochs | grep -E -v 'tests/simulator|e2e') -PACKAGES_E2E=$(shell go list ./... | grep '/e2e') +PACKAGES_E2E := $(shell go list ./... | grep '/e2e' | awk -F'/e2e' '{print $$1 "/e2e"}' | uniq) PACKAGES_SIM=$(shell go list ./... | grep '/tests/simulator') TEST_PACKAGES=./... diff --git a/tests/e2e/configurer/base.go b/tests/e2e/configurer/base.go index b39f0ee5c10..f6c7ecb4b9f 100644 --- a/tests/e2e/configurer/base.go +++ b/tests/e2e/configurer/base.go @@ -8,6 +8,7 @@ import ( "os" "path" "path/filepath" + "sync" "testing" "time" @@ -75,18 +76,29 @@ func (bc *baseConfigurer) RunValidators() error { func (bc *baseConfigurer) runValidators(chainConfig *chain.Config) error { bc.t.Logf("starting %s validator containers...", chainConfig.Id) - errCh := make(chan error) // Channel to collect errors + var wg sync.WaitGroup + errCh := make(chan error, len(chainConfig.NodeConfigs)) // Buffer the channel to avoid blocking + + // Increment the WaitGroup counter for each node + wg.Add(len(chainConfig.NodeConfigs)) // Iterate over each node for _, node := range chainConfig.NodeConfigs { go func(n *chain.NodeConfig) { + defer wg.Done() // Decrement the WaitGroup counter when the goroutine is done errCh <- n.Run() // Run the node and send any error to the channel }(node) } - // Wait for goroutines to finish and collect errors - for range chainConfig.NodeConfigs { - if err := <-errCh; err != nil { + // Wait for all goroutines to finish + wg.Wait() + + // Close the error channel since all goroutines are done sending errors + close(errCh) + + // Collect errors from the channel + for err := range errCh { + if err != nil { return err } } @@ -172,8 +184,8 @@ func (bc *baseConfigurer) runIBCRelayer(chainConfigA *chain.Config, chainConfigB return status == "success" && len(chains) == 2 }, - 5*time.Minute, - time.Second, + time.Minute, + 10*time.Millisecond, "hermes relayer not healthy") bc.t.Logf("started Hermes relayer container: %s", hermesResource.Container.ID) diff --git a/tests/e2e/configurer/chain/chain.go b/tests/e2e/configurer/chain/chain.go index ce318fbc789..268f6674b8e 100644 --- a/tests/e2e/configurer/chain/chain.go +++ b/tests/e2e/configurer/chain/chain.go @@ -193,6 +193,14 @@ func (c *Config) SendIBC(dstChain *Config, recipient string, token sdk.Coin) { _, _, err = c.containerManager.ExecHermesCmd(c.t, cmd, "SUCCESS") require.NoError(c.t, err) + cmd = []string{"hermes", "clear", "packets", "--chain", dstChain.Id, "--port", "transfer", "--channel", "channel-0"} + _, _, err = c.containerManager.ExecHermesCmd(c.t, cmd, "SUCCESS") + require.NoError(c.t, err) + + cmd = []string{"hermes", "clear", "packets", "--chain", c.Id, "--port", "transfer", "--channel", "channel-0"} + _, _, err = c.containerManager.ExecHermesCmd(c.t, cmd, "SUCCESS") + require.NoError(c.t, err) + require.Eventually( c.t, func() bool { @@ -211,8 +219,8 @@ func (c *Config) SendIBC(dstChain *Config, recipient string, token sdk.Coin) { return false } }, - 5*time.Minute, - time.Second, + 1*time.Minute, + 10*time.Millisecond, "tx not received on destination chain", ) diff --git a/tests/e2e/configurer/chain/commands.go b/tests/e2e/configurer/chain/commands.go index 8571855d1f2..f154504db5e 100644 --- a/tests/e2e/configurer/chain/commands.go +++ b/tests/e2e/configurer/chain/commands.go @@ -259,6 +259,14 @@ func (n *NodeConfig) SendIBCTransfer(dstChain *Config, from, recipient, memo str _, _, err := n.containerManager.ExecHermesCmd(n.t, cmd, "SUCCESS") require.NoError(n.t, err) + cmd = []string{"hermes", "clear", "packets", "--chain", dstChain.Id, "--port", "transfer", "--channel", "channel-0"} + _, _, err = n.containerManager.ExecHermesCmd(n.t, cmd, "SUCCESS") + require.NoError(n.t, err) + + cmd = []string{"hermes", "clear", "packets", "--chain", n.chainId, "--port", "transfer", "--channel", "channel-0"} + _, _, err = n.containerManager.ExecHermesCmd(n.t, cmd, "SUCCESS") + require.NoError(n.t, err) + n.LogActionF("successfully submitted sent IBC transfer") } @@ -681,8 +689,8 @@ func (n *NodeConfig) SendIBC(dstChain *Config, recipient string, token sdk.Coin) return false } }, - 5*time.Minute, - time.Second, + time.Minute, + 10*time.Millisecond, "tx not received on destination chain", ) @@ -821,6 +829,6 @@ func (n *NodeConfig) ParamChangeProposal(subspace, key string, value []byte, cha return false } return status == proposalStatusPassed - }, time.Minute*30, time.Millisecond*500) + }, time.Minute, 10*time.Millisecond) return nil } diff --git a/tests/e2e/configurer/chain/node.go b/tests/e2e/configurer/chain/node.go index 7fd6fd1cc63..81d3afbc46e 100644 --- a/tests/e2e/configurer/chain/node.go +++ b/tests/e2e/configurer/chain/node.go @@ -72,8 +72,8 @@ func (n *NodeConfig) Run() error { n.t.Logf("started node container: %s", n.Name) return true }, - 2*time.Minute, - time.Second, + time.Minute, + 10*time.Millisecond, "Osmosis node failed to produce blocks", ) diff --git a/tests/e2e/configurer/chain/queries.go b/tests/e2e/configurer/chain/queries.go index 0fb7a165d98..759dc7a12e1 100644 --- a/tests/e2e/configurer/chain/queries.go +++ b/tests/e2e/configurer/chain/queries.go @@ -231,7 +231,7 @@ func (n *NodeConfig) QueryGRPCGateway(path string, parameters ...string) ([]byte } return resp.StatusCode != http.StatusServiceUnavailable - }, time.Minute, time.Millisecond*10, "failed to execute HTTP request") + }, time.Minute, 10*time.Millisecond, "failed to execute HTTP request") defer resp.Body.Close() diff --git a/tests/e2e/containers/containers.go b/tests/e2e/containers/containers.go index b9f86e8049c..1981aa85da3 100644 --- a/tests/e2e/containers/containers.go +++ b/tests/e2e/containers/containers.go @@ -121,7 +121,7 @@ func (m *Manager) ExecCmd(t *testing.T, containerName string, command []string, errBuf bytes.Buffer ) - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() if m.isDebugLogEnabled { @@ -218,7 +218,7 @@ func (m *Manager) ExecCmd(t *testing.T, containerName string, command []string, return true }, time.Minute, - 50*time.Millisecond, + 10*time.Millisecond, fmt.Sprintf("success condition (%s) was not met.\nstdout:\n %s\nstderr:\n %s\n", success, outBuf.String(), errBuf.String()), ) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 979a88879ba..6662a577f8e 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -3,6 +3,7 @@ package e2e import ( "os" "strconv" + "sync" "testing" "github.com/stretchr/testify/suite" @@ -34,6 +35,7 @@ type IntegrationTestSuite struct { skipUpgrade bool skipIBC bool skipStateSync bool + mutex sync.Mutex } func TestIntegrationTestSuite(t *testing.T) { diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 81f2b06814d..9361cb5a981 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -1195,7 +1195,7 @@ func (s *IntegrationTestSuite) IBCTokenTransferRateLimiting() { s.Eventually(func() bool { val := chainANode.QueryParams(ibcratelimittypes.ModuleName, string(ibcratelimittypes.KeyContractAddress)) return strings.Contains(val, param) - }, time.Second*30, time.Millisecond*500) + }, time.Second*30, time.Second) } } @@ -1228,7 +1228,7 @@ func (s *IntegrationTestSuite) IBCWasmHooks() { // check the balance of the contract denomTrace := transfertypes.ParseDenomTrace(transfertypes.GetPrefixedDenom("transfer", "channel-0", "uosmo")) ibcDenom := denomTrace.IBCDenom() - s.CheckBalance(chainANode, contractAddr, ibcDenom, transferAmount) + s.CallCheckBalance(chainANode, contractAddr, ibcDenom, transferAmount) // sender wasm addr senderBech32, err := ibchookskeeper.DeriveIntermediateSender("channel-0", validatorAddr, "osmo") @@ -1301,7 +1301,7 @@ func (s *IntegrationTestSuite) PacketForwarding() { chainANode.SendIBCTransfer(chainB, validatorAddr, validatorAddr, string(forwardMemo), coin) // check the balance of the contract - s.CheckBalance(chainANode, contractAddr, "uosmo", transferAmount) + s.CallCheckBalance(chainANode, contractAddr, "uosmo", transferAmount) // sender wasm addr senderBech32, err := ibchookskeeper.DeriveIntermediateSender("channel-0", validatorAddr, "osmo") @@ -1615,8 +1615,8 @@ func (s *IntegrationTestSuite) StateSync() { s.Require().NoError(err) return stateSyncNodeHeight == runningNodeHeight }, - 3*time.Minute, - 500*time.Millisecond, + 1*time.Minute, + time.Second, ) // stop the state synching node. diff --git a/tests/e2e/helpers_e2e_test.go b/tests/e2e/helpers_e2e_test.go index 483fdcad15c..728b0223036 100644 --- a/tests/e2e/helpers_e2e_test.go +++ b/tests/e2e/helpers_e2e_test.go @@ -107,6 +107,12 @@ func (s *IntegrationTestSuite) validateCLPosition(position model.Position, poolI s.Require().Equal(position.UpperTick, upperTick) } +func (s *IntegrationTestSuite) CallCheckBalance(node *chain.NodeConfig, addr, denom string, amount int64) { + s.mutex.Lock() + defer s.mutex.Unlock() + s.CheckBalance(node, addr, denom, amount) +} + // CheckBalance Checks the balance of an address func (s *IntegrationTestSuite) CheckBalance(node *chain.NodeConfig, addr, denom string, amount int64) { // check the balance of the contract @@ -125,7 +131,7 @@ func (s *IntegrationTestSuite) CheckBalance(node *chain.NodeConfig, addr, denom } return false }, - 2*time.Minute, + 1*time.Minute, 10*time.Millisecond, ) } diff --git a/tests/e2e/scripts/hermes_bootstrap.sh b/tests/e2e/scripts/hermes_bootstrap.sh index f61feeddee5..dce124221d4 100644 --- a/tests/e2e/scripts/hermes_bootstrap.sh +++ b/tests/e2e/scripts/hermes_bootstrap.sh @@ -17,7 +17,7 @@ enabled = true refresh = true misbehaviour = true [mode.connections] -enabled = false +enabled = true [mode.channels] enabled = true [mode.packets] From 4742ffce81dbb05ce5359699eff8ed9d72bd7784 Mon Sep 17 00:00:00 2001 From: Niccolo Raspa <6024049+niccoloraspa@users.noreply.github.com> Date: Thu, 3 Aug 2023 21:06:58 +0200 Subject: [PATCH 04/18] Add concurrency options to GitHub Actions (#5956) --- .github/workflows/build.yml | 4 ++++ .github/workflows/check-generated.yml | 5 +++++ .github/workflows/check-state-compatibility.yml | 4 ++++ .github/workflows/contracts.yml | 4 ++++ .github/workflows/push-dev-docker-images.yml | 2 +- 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9ae10708ee5..f8948ac863c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,10 @@ on: env: GO_VERSION: '1.20.5' +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: build: name: osmosisd-${{ matrix.targetos }}-${{ matrix.arch }} diff --git a/.github/workflows/check-generated.yml b/.github/workflows/check-generated.yml index ecf3f50662e..3452bbf8eaf 100644 --- a/.github/workflows/check-generated.yml +++ b/.github/workflows/check-generated.yml @@ -4,6 +4,7 @@ # changed, because generated code can change in response to toolchain updates # even if no files in the repository are modified. name: Check generated code + on: workflow_dispatch: pull_request: @@ -13,6 +14,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: check-proto: runs-on: ubuntu-latest diff --git a/.github/workflows/check-state-compatibility.yml b/.github/workflows/check-state-compatibility.yml index e5e3a51cf39..22c90533728 100644 --- a/.github/workflows/check-state-compatibility.yml +++ b/.github/workflows/check-state-compatibility.yml @@ -42,6 +42,10 @@ env: LCD_ENDPOINT: https://lcd.osmosis.zone DELTA_HALT_HEIGHT: 50 +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: compare_versions: # Compare current mainnet osmosis major version with the major version of github branch diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml index f97ac927fc6..d9dc994c981 100644 --- a/.github/workflows/contracts.yml +++ b/.github/workflows/contracts.yml @@ -1,4 +1,5 @@ name: Cosmwasm Contracts + on: pull_request: branches: @@ -9,6 +10,9 @@ on: - "v[0-9]**" workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true jobs: test: diff --git a/.github/workflows/push-dev-docker-images.yml b/.github/workflows/push-dev-docker-images.yml index f9f1a05bf86..94237b0ef9d 100644 --- a/.github/workflows/push-dev-docker-images.yml +++ b/.github/workflows/push-dev-docker-images.yml @@ -21,7 +21,7 @@ on: branches: - main - v[0-9]+.x - + env: RUNNER_BASE_IMAGE_ALPINE: alpine:3.17 OSMOSIS_DEV_IMAGE_REPOSITORY: osmolabs/osmosis-dev From b370ffecc684334adf3ad3aafa9317aa4f56cf80 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Thu, 3 Aug 2023 20:17:00 +0100 Subject: [PATCH 05/18] Update LICENSE owner to Osmosis foundation (#5958) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ea662a3694e..062dfd8c290 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2021 Sikka Research Pte. Ltd. + Copyright 2021 Osmosis Foundation Ltd. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 9a48b4c9b39af36bd9746c85e715a11a56a031bb Mon Sep 17 00:00:00 2001 From: Sishir Giri Date: Thu, 3 Aug 2023 14:32:25 -0700 Subject: [PATCH 06/18] Remove ExponentAtPriceOne From Gov Prop CreateConcentratedPool (#5900) * removed exp at price one from gov prop * cleanup * rebased * fixed e2e * added reserved field --- go.mod | 6 +- go.sum | 12 +- .../osmosis/concentrated-liquidity/gov.proto | 6 +- tests/e2e/configurer/chain/commands.go | 2 +- x/concentrated-liquidity/client/cli/tx.go | 32 ++--- x/concentrated-liquidity/types/gov.go | 2 +- x/concentrated-liquidity/types/gov.pb.go | 131 ++++++------------ x/concentrated-liquidity/types/gov_test.go | 37 +++-- 8 files changed, 84 insertions(+), 144 deletions(-) diff --git a/go.mod b/go.mod index 047631e713a..dfc50e9c9ea 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/tidwall/gjson v1.14.4 go.uber.org/multierr v1.11.0 golang.org/x/exp v0.0.0-20230131160201-f062dba9d201 - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 + google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 google.golang.org/grpc v1.56.2 gopkg.in/yaml.v2 v2.4.0 mvdan.cc/gofumpt v0.5.0 @@ -80,6 +80,8 @@ require ( go.uber.org/goleak v1.1.12 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.3.0 // indirect + google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 // indirect ) require ( @@ -158,7 +160,7 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/flock v0.8.1 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.1.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect diff --git a/go.sum b/go.sum index 95bf93a83f5..fb3f5d58a65 100644 --- a/go.sum +++ b/go.sum @@ -462,8 +462,8 @@ github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.1 h1:jxpi2eWoU84wbX9iIEyAeeoac3FLuifZpY9tcNUD9kw= +github.com/golang/glog v1.1.1/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1773,8 +1773,12 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D 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-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e h1:xIXmWJ303kJCuogpj0bHq+dcjcZHU+XFyc1I0Yl9cRg= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130 h1:XVeBY8d/FaK4848myy41HBqnDwvxeV3zMZhwN1TvAMU= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130 h1:2FZP5XuJY9zQyGM5N0rtovnoXjiMUEIUMvw0m9wlpLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/proto/osmosis/concentrated-liquidity/gov.proto b/proto/osmosis/concentrated-liquidity/gov.proto index 4ae68f117f7..7917d3e61c2 100644 --- a/proto/osmosis/concentrated-liquidity/gov.proto +++ b/proto/osmosis/concentrated-liquidity/gov.proto @@ -51,11 +51,7 @@ message PoolRecord { string denom0 = 1 [ (gogoproto.moretags) = "yaml:\"denom0\"" ]; string denom1 = 2 [ (gogoproto.moretags) = "yaml:\"denom1\"" ]; uint64 tick_spacing = 3 [ (gogoproto.moretags) = "yaml:\"tick_spacing\"" ]; - string exponent_at_price_one = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"exponent_at_price_one\"", - (gogoproto.nullable) = false - ]; + reserved 4; string spread_factor = 5 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.moretags) = "yaml:\"spread_factor\"", diff --git a/tests/e2e/configurer/chain/commands.go b/tests/e2e/configurer/chain/commands.go index f154504db5e..419cde40ada 100644 --- a/tests/e2e/configurer/chain/commands.go +++ b/tests/e2e/configurer/chain/commands.go @@ -341,7 +341,7 @@ func (n *NodeConfig) SubmitSuperfluidProposal(asset string, initialDeposit sdk.C func (n *NodeConfig) SubmitCreateConcentratedPoolProposal(initialDeposit sdk.Coin) int { n.LogActionF("Creating concentrated liquidity pool") - cmd := []string{"osmosisd", "tx", "gov", "submit-proposal", "create-concentratedliquidity-pool-proposal", "--pool-records=stake,uosmo,100,-6,0.001", "--title=\"create concentrated pool\"", "--description=\"create concentrated pool", "--from=val", fmt.Sprintf("--deposit=%s", initialDeposit)} + cmd := []string{"osmosisd", "tx", "gov", "submit-proposal", "create-concentratedliquidity-pool-proposal", "--pool-records=stake,uosmo,100,0.001", "--title=\"create concentrated pool\"", "--description=\"create concentrated pool", "--from=val", fmt.Sprintf("--deposit=%s", initialDeposit)} resp, _, err := n.containerManager.ExecTxCmd(n.t, n.chainId, n.Name, cmd) require.NoError(n.t, err) // Extract the proposal ID from the response diff --git a/x/concentrated-liquidity/client/cli/tx.go b/x/concentrated-liquidity/client/cli/tx.go index 29faf238546..97b838a0d75 100644 --- a/x/concentrated-liquidity/client/cli/tx.go +++ b/x/concentrated-liquidity/client/cli/tx.go @@ -102,9 +102,9 @@ func NewCmdCreateConcentratedLiquidityPoolsProposal() *cobra.Command { Long: strings.TrimSpace(`Submit a create concentrated liquidity pool proposal. Passing in FlagPoolRecords separated by commas would be parsed automatically to pairs of pool records. -Ex) --pool-records=uion,uosmo,100,-6,0.003,stake,uosmo,1000,-6,0.005 -> -[uion<>uosmo, tickSpacing 100, exponentAtPriceOne -6, spreadFactor 0.3%] -[stake<>uosmo, tickSpacing 1000, exponentAtPriceOne -6, spreadFactor 0.5%] +Ex) --pool-records=uion,uosmo,100,0.003,stake,uosmo,1000,0.005 -> +[uion<>uosmo, tickSpacing 100, spreadFactor 0.3%] +[stake<>uosmo, tickSpacing 1000, spreadFactor 0.5%] `), RunE: func(cmd *cobra.Command, args []string) error { @@ -300,8 +300,9 @@ func parsePoolRecords(cmd *cobra.Command) ([]types.PoolRecord, error) { poolRecords := strings.Split(poolRecordsStr, ",") - if len(poolRecords)%5 != 0 { - return nil, fmt.Errorf("poolRecords must be a list of denom0, denom1, tickSpacing, exponentAtPriceOne, and spreadFactor") + if len(poolRecords)%4 != 0 { + return nil, fmt.Errorf("poolRecords must be a list of denom0, denom1, tickSpacing, and spreadFactor") + } finalPoolRecords := []types.PoolRecord{} @@ -315,28 +316,21 @@ func parsePoolRecords(cmd *cobra.Command) ([]types.PoolRecord, error) { return nil, err } - exponentAtPriceOneStr := poolRecords[i+3] - exponentAtPriceOne, ok := sdk.NewIntFromString(exponentAtPriceOneStr) - if !ok { - return nil, fmt.Errorf("invalid exponentAtPriceOne: %s", exponentAtPriceOneStr) - } - - spreadFactorStr := poolRecords[i+4] + spreadFactorStr := poolRecords[i+3] spreadFactor, err := sdk.NewDecFromStr(spreadFactorStr) if err != nil { return nil, err } finalPoolRecords = append(finalPoolRecords, types.PoolRecord{ - Denom0: denom0, - Denom1: denom1, - TickSpacing: uint64(tickSpacing), - ExponentAtPriceOne: exponentAtPriceOne, - SpreadFactor: spreadFactor, + Denom0: denom0, + Denom1: denom1, + TickSpacing: uint64(tickSpacing), + SpreadFactor: spreadFactor, }) - // increase counter by the next 5 - i = i + 5 + // increase counter by the next 4 + i = i + 4 } return finalPoolRecords, nil diff --git a/x/concentrated-liquidity/types/gov.go b/x/concentrated-liquidity/types/gov.go index f6dcf5d3070..cf921b8eb94 100644 --- a/x/concentrated-liquidity/types/gov.go +++ b/x/concentrated-liquidity/types/gov.go @@ -83,7 +83,7 @@ func (p *CreateConcentratedLiquidityPoolsProposal) ValidateBasic() error { func (p CreateConcentratedLiquidityPoolsProposal) String() string { recordsStr := "" for _, record := range p.PoolRecords { - recordsStr = recordsStr + fmt.Sprintf("(Denom0: %s, Denom1: %s, TickSpacing: %d, ExponentAtPriceOne: %d, SpreadFactor: %d) ", record.Denom0, record.Denom1, record.TickSpacing, record.ExponentAtPriceOne, record.SpreadFactor) + recordsStr = recordsStr + fmt.Sprintf("(Denom0: %s, Denom1: %s, TickSpacing: %d, SpreadFactor: %d) ", record.Denom0, record.Denom1, record.TickSpacing, record.SpreadFactor) } var b strings.Builder diff --git a/x/concentrated-liquidity/types/gov.pb.go b/x/concentrated-liquidity/types/gov.pb.go index 51663bbd037..b710c9c83aa 100644 --- a/x/concentrated-liquidity/types/gov.pb.go +++ b/x/concentrated-liquidity/types/gov.pb.go @@ -164,11 +164,10 @@ func (m *PoolIdToTickSpacingRecord) GetNewTickSpacing() uint64 { } type PoolRecord struct { - Denom0 string `protobuf:"bytes,1,opt,name=denom0,proto3" json:"denom0,omitempty" yaml:"denom0"` - Denom1 string `protobuf:"bytes,2,opt,name=denom1,proto3" json:"denom1,omitempty" yaml:"denom1"` - TickSpacing uint64 `protobuf:"varint,3,opt,name=tick_spacing,json=tickSpacing,proto3" json:"tick_spacing,omitempty" yaml:"tick_spacing"` - ExponentAtPriceOne github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=exponent_at_price_one,json=exponentAtPriceOne,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"exponent_at_price_one" yaml:"exponent_at_price_one"` - SpreadFactor github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=spread_factor,json=spreadFactor,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"spread_factor" yaml:"spread_factor"` + Denom0 string `protobuf:"bytes,1,opt,name=denom0,proto3" json:"denom0,omitempty" yaml:"denom0"` + Denom1 string `protobuf:"bytes,2,opt,name=denom1,proto3" json:"denom1,omitempty" yaml:"denom1"` + TickSpacing uint64 `protobuf:"varint,3,opt,name=tick_spacing,json=tickSpacing,proto3" json:"tick_spacing,omitempty" yaml:"tick_spacing"` + SpreadFactor github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=spread_factor,json=spreadFactor,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"spread_factor" yaml:"spread_factor"` } func (m *PoolRecord) Reset() { *m = PoolRecord{} } @@ -237,44 +236,41 @@ func init() { } var fileDescriptor_e6d167276ceeedc2 = []byte{ - // 584 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x41, 0x8b, 0xd3, 0x40, - 0x14, 0x4e, 0x6c, 0xb7, 0xe2, 0xb4, 0x2b, 0x1a, 0x2b, 0x5b, 0x77, 0x25, 0x29, 0x01, 0xa5, 0x1e, - 0x9a, 0x18, 0x3d, 0x08, 0x3d, 0x69, 0x77, 0x59, 0x58, 0x10, 0x2d, 0x71, 0x4f, 0x22, 0x84, 0x74, - 0x32, 0xd6, 0xa1, 0xe9, 0x4c, 0x36, 0x33, 0xdb, 0xdd, 0x1e, 0xbd, 0x09, 0x5e, 0xbc, 0x08, 0x1e, - 0xfb, 0x73, 0xf6, 0xb8, 0x47, 0xf1, 0x10, 0xa4, 0xbd, 0x78, 0xb5, 0xbf, 0x40, 0x32, 0x93, 0xb6, - 0xe9, 0x6a, 0xc1, 0x65, 0x4f, 0xc9, 0x7b, 0xf3, 0xbd, 0xf7, 0x7d, 0xdf, 0x7b, 0xc3, 0x80, 0x06, - 0x65, 0x03, 0xca, 0x30, 0xb3, 0x21, 0x25, 0x10, 0x11, 0x1e, 0xfb, 0x1c, 0x05, 0xcd, 0x10, 0x1f, - 0x1d, 0xe3, 0x00, 0xf3, 0x91, 0xdd, 0xa3, 0x43, 0x2b, 0x8a, 0x29, 0xa7, 0xda, 0x83, 0x0c, 0x69, - 0xe5, 0x91, 0x0b, 0xa0, 0x35, 0x74, 0xba, 0x88, 0xfb, 0xce, 0x76, 0xb5, 0x47, 0x7b, 0x54, 0x54, - 0xd8, 0xe9, 0x9f, 0x2c, 0x36, 0xa7, 0x2a, 0x68, 0xec, 0xc6, 0xc8, 0xe7, 0x68, 0x37, 0x57, 0xfd, - 0x72, 0x5e, 0xdd, 0xa1, 0x34, 0x64, 0x9d, 0x98, 0x46, 0x94, 0xf9, 0xa1, 0x56, 0x05, 0x1b, 0x1c, - 0xf3, 0x10, 0xd5, 0xd4, 0xba, 0xda, 0xb8, 0xe1, 0xca, 0x40, 0xab, 0x83, 0x72, 0x80, 0x18, 0x8c, - 0x71, 0xc4, 0x31, 0x25, 0xb5, 0x6b, 0xe2, 0x2c, 0x9f, 0xd2, 0x8e, 0x40, 0x25, 0xa2, 0x34, 0xf4, - 0x62, 0x04, 0x69, 0x1c, 0xb0, 0x5a, 0xa1, 0x5e, 0x68, 0x94, 0x9f, 0x38, 0xd6, 0x7f, 0x09, 0xb7, - 0x52, 0x0d, 0xae, 0xa8, 0x6c, 0xef, 0x9c, 0x25, 0x86, 0x32, 0x4b, 0x8c, 0x3b, 0x23, 0x7f, 0x10, - 0xb6, 0xcc, 0x7c, 0x53, 0xd3, 0x2d, 0x47, 0x0b, 0x20, 0x6b, 0x55, 0x3e, 0x8d, 0x0d, 0xe5, 0xdb, - 0xd8, 0x50, 0x7e, 0x8d, 0x0d, 0xd5, 0xfc, 0xad, 0x82, 0x9d, 0x43, 0x0c, 0xfb, 0x6f, 0x22, 0x1f, - 0x62, 0xd2, 0xdb, 0x43, 0x30, 0x46, 0x3e, 0x43, 0x57, 0x36, 0xf6, 0x59, 0x05, 0x86, 0x10, 0x81, - 0x03, 0x8f, 0x53, 0x8f, 0x63, 0xd8, 0xf7, 0x98, 0xe4, 0xb8, 0x60, 0xf6, 0xf9, 0x25, 0xcc, 0x1e, - 0x04, 0x87, 0x34, 0xa7, 0x36, 0xf3, 0x5e, 0x4c, 0xbd, 0xbb, 0xdb, 0xd1, 0x3a, 0xc0, 0x45, 0xcf, - 0x01, 0xb8, 0xb7, 0xb6, 0x99, 0xb6, 0x05, 0xae, 0x67, 0xba, 0x85, 0xe5, 0xa2, 0x5b, 0x92, 0x7d, - 0xb5, 0x06, 0xb8, 0x45, 0xd0, 0xc9, 0x8a, 0x13, 0x61, 0xbc, 0xe8, 0xde, 0x24, 0xe8, 0x24, 0xd7, - 0xa8, 0x55, 0x14, 0x2c, 0x5f, 0x0b, 0x00, 0x2c, 0x17, 0xa4, 0x3d, 0x02, 0xa5, 0x00, 0x11, 0x3a, - 0x78, 0x2c, 0x27, 0xd9, 0xbe, 0x3d, 0x4b, 0x8c, 0x4d, 0xb9, 0x2c, 0x99, 0x37, 0xdd, 0x0c, 0xb0, - 0x80, 0x3a, 0x72, 0xb0, 0x7f, 0x41, 0x9d, 0x39, 0xd4, 0xd1, 0x5a, 0xa0, 0xb2, 0x22, 0xa8, 0x90, - 0x0a, 0x6a, 0x6f, 0x2d, 0x2f, 0x42, 0xfe, 0xd4, 0x74, 0xcb, 0x7c, 0x29, 0x53, 0xfb, 0xa8, 0x82, - 0xbb, 0xe8, 0x34, 0xa2, 0x04, 0x11, 0xee, 0xf9, 0xdc, 0x8b, 0x62, 0x0c, 0x91, 0x47, 0x09, 0xaa, - 0x15, 0x05, 0xed, 0xab, 0x74, 0xac, 0x3f, 0x12, 0xe3, 0x61, 0x0f, 0xf3, 0x0f, 0xc7, 0x5d, 0x0b, - 0xd2, 0x81, 0x0d, 0xc5, 0xae, 0xb2, 0x4f, 0x93, 0x05, 0x7d, 0x9b, 0x8f, 0x22, 0xc4, 0xac, 0x03, - 0xc2, 0x67, 0x89, 0x71, 0x5f, 0x72, 0xfe, 0xb3, 0xa9, 0xe9, 0x6a, 0xf3, 0xfc, 0x0b, 0xde, 0x49, - 0xb3, 0xaf, 0x09, 0xd2, 0xfa, 0x60, 0x93, 0x45, 0x31, 0xf2, 0x03, 0xef, 0xbd, 0x0f, 0x39, 0x8d, - 0x6b, 0x1b, 0x82, 0x7a, 0xff, 0x12, 0xd4, 0x7b, 0x08, 0xce, 0x12, 0xa3, 0x2a, 0xa9, 0x57, 0x9a, - 0x99, 0x6e, 0x45, 0xc6, 0xfb, 0x22, 0x94, 0x7b, 0x69, 0xbf, 0x3b, 0x9b, 0xe8, 0xea, 0xf9, 0x44, - 0x57, 0x7f, 0x4e, 0x74, 0xf5, 0xcb, 0x54, 0x57, 0xce, 0xa7, 0xba, 0xf2, 0x7d, 0xaa, 0x2b, 0x6f, - 0xdb, 0x39, 0xb6, 0xec, 0x4e, 0x36, 0x43, 0xbf, 0xcb, 0xe6, 0x81, 0x3d, 0x74, 0x9e, 0xd9, 0xa7, - 0xeb, 0x9e, 0x1d, 0xa1, 0xa6, 0x5b, 0x12, 0x8f, 0xc7, 0xd3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x72, 0xf6, 0xcc, 0xa4, 0xa5, 0x04, 0x00, 0x00, + // 541 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0x4f, 0x8b, 0xd3, 0x4c, + 0x18, 0x4f, 0xb6, 0x69, 0xdf, 0xd7, 0x69, 0x57, 0xd6, 0x58, 0xd8, 0xba, 0x0b, 0x49, 0x09, 0x28, + 0xf5, 0xd0, 0xc4, 0xe8, 0x41, 0xe8, 0x49, 0xba, 0xcb, 0x82, 0xe2, 0x61, 0x89, 0x7b, 0x12, 0xa1, + 0xa4, 0x93, 0xb1, 0x0e, 0x4d, 0xf3, 0x64, 0x67, 0x66, 0xbb, 0xf6, 0x1b, 0x08, 0x5e, 0xbc, 0xe9, + 0xb1, 0x1f, 0x67, 0x8f, 0x7b, 0x14, 0x0f, 0x45, 0xda, 0x8b, 0x57, 0xfb, 0x09, 0xa4, 0x33, 0x69, + 0x9b, 0xae, 0x14, 0x14, 0x4f, 0xc9, 0x33, 0xf3, 0x7b, 0x7e, 0x7f, 0x9e, 0x99, 0x41, 0x0d, 0xe0, + 0x03, 0xe0, 0x94, 0x7b, 0x18, 0x12, 0x4c, 0x12, 0xc1, 0x42, 0x41, 0xa2, 0x66, 0x4c, 0xcf, 0x2f, + 0x68, 0x44, 0xc5, 0xc8, 0xeb, 0xc1, 0xd0, 0x4d, 0x19, 0x08, 0x30, 0xef, 0x67, 0x48, 0x37, 0x8f, + 0x5c, 0x01, 0xdd, 0xa1, 0xdf, 0x25, 0x22, 0xf4, 0x0f, 0xaa, 0x3d, 0xe8, 0x81, 0xec, 0xf0, 0x16, + 0x7f, 0xaa, 0xd9, 0x99, 0xe9, 0xa8, 0x71, 0xc4, 0x48, 0x28, 0xc8, 0x51, 0xae, 0xfb, 0xe5, 0xb2, + 0xfb, 0x14, 0x20, 0xe6, 0xa7, 0x0c, 0x52, 0xe0, 0x61, 0x6c, 0x56, 0x51, 0x51, 0x50, 0x11, 0x93, + 0x9a, 0x5e, 0xd7, 0x1b, 0xb7, 0x02, 0x55, 0x98, 0x75, 0x54, 0x8e, 0x08, 0xc7, 0x8c, 0xa6, 0x82, + 0x42, 0x52, 0xdb, 0x91, 0x7b, 0xf9, 0x25, 0xf3, 0x1c, 0x55, 0x52, 0x80, 0xb8, 0xc3, 0x08, 0x06, + 0x16, 0xf1, 0x5a, 0xa1, 0x5e, 0x68, 0x94, 0x1f, 0xfb, 0xee, 0x1f, 0x19, 0x77, 0x17, 0x1e, 0x02, + 0xd9, 0xd9, 0x3e, 0xbc, 0x9a, 0xd8, 0xda, 0x7c, 0x62, 0xdf, 0x1d, 0x85, 0x83, 0xb8, 0xe5, 0xe4, + 0x49, 0x9d, 0xa0, 0x9c, 0xae, 0x80, 0xbc, 0x55, 0xf9, 0x30, 0xb6, 0xb5, 0x2f, 0x63, 0x5b, 0xfb, + 0x31, 0xb6, 0x75, 0xe7, 0xa7, 0x8e, 0x0e, 0xcf, 0x28, 0xee, 0xbf, 0x4a, 0x43, 0x4c, 0x93, 0xde, + 0x31, 0xc1, 0x8c, 0x84, 0x9c, 0xfc, 0x73, 0xb0, 0x8f, 0x3a, 0xb2, 0xa5, 0x09, 0x1a, 0x75, 0x04, + 0x74, 0x04, 0xc5, 0xfd, 0x0e, 0x57, 0x1a, 0x37, 0xc2, 0x3e, 0xfb, 0x8b, 0xb0, 0xcf, 0xa3, 0x33, + 0xc8, 0xb9, 0xcd, 0xb2, 0x1b, 0x8b, 0xec, 0xc1, 0x41, 0xba, 0x0d, 0x70, 0x33, 0x73, 0x84, 0xee, + 0x6d, 0x25, 0x33, 0xf7, 0xd1, 0x7f, 0x99, 0x6f, 0x19, 0xd9, 0x08, 0x4a, 0x8a, 0xd7, 0x6c, 0xa0, + 0xbd, 0x84, 0x5c, 0x6e, 0x24, 0x91, 0xc1, 0x8d, 0xe0, 0x76, 0x42, 0x2e, 0x73, 0x44, 0x2d, 0x43, + 0xaa, 0x7c, 0xde, 0x41, 0x68, 0x7d, 0x40, 0xe6, 0x43, 0x54, 0x8a, 0x48, 0x02, 0x83, 0x47, 0x6a, + 0x92, 0xed, 0x3b, 0xf3, 0x89, 0xbd, 0xab, 0x0e, 0x4b, 0xad, 0x3b, 0x41, 0x06, 0x58, 0x41, 0x7d, + 0x35, 0xd8, 0xdf, 0xa0, 0xfe, 0x12, 0xea, 0x9b, 0x2d, 0x54, 0xd9, 0x30, 0x54, 0x58, 0x18, 0x6a, + 0xef, 0xaf, 0x2f, 0x42, 0x7e, 0xd7, 0x09, 0xca, 0x62, 0x6d, 0xd3, 0xec, 0xa3, 0x5d, 0x9e, 0x32, + 0x12, 0x46, 0x9d, 0xb7, 0x21, 0x16, 0xc0, 0x6a, 0x45, 0xa9, 0x76, 0xb2, 0x98, 0xe6, 0xb7, 0x89, + 0xfd, 0xa0, 0x47, 0xc5, 0xbb, 0x8b, 0xae, 0x8b, 0x61, 0xe0, 0x61, 0x79, 0x44, 0xd9, 0xa7, 0xc9, + 0xa3, 0xbe, 0x27, 0x46, 0x29, 0xe1, 0xee, 0x31, 0xc1, 0xf3, 0x89, 0x5d, 0x55, 0x52, 0x1b, 0x64, + 0x4e, 0x50, 0x51, 0xf5, 0x89, 0x2c, 0xd5, 0x4c, 0x5e, 0x18, 0xff, 0x1b, 0x7b, 0xc5, 0xf6, 0x9b, + 0xab, 0xa9, 0xa5, 0x5f, 0x4f, 0x2d, 0xfd, 0xfb, 0xd4, 0xd2, 0x3f, 0xcd, 0x2c, 0xed, 0x7a, 0x66, + 0x69, 0x5f, 0x67, 0x96, 0xf6, 0xba, 0x9d, 0xd3, 0xcc, 0x6e, 0x45, 0x33, 0x0e, 0xbb, 0x7c, 0x59, + 0x78, 0x43, 0xff, 0xa9, 0xf7, 0x7e, 0xdb, 0xc3, 0x97, 0x9e, 0xba, 0x25, 0xf9, 0x7c, 0x9f, 0xfc, + 0x0a, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x38, 0xa8, 0xb5, 0x27, 0x04, 0x00, 0x00, } func (this *CreateConcentratedLiquidityPoolsProposal) Equal(that interface{}) bool { @@ -402,9 +398,6 @@ func (this *PoolRecord) Equal(that interface{}) bool { if this.TickSpacing != that1.TickSpacing { return false } - if !this.ExponentAtPriceOne.Equal(that1.ExponentAtPriceOne) { - return false - } if !this.SpreadFactor.Equal(that1.SpreadFactor) { return false } @@ -575,16 +568,6 @@ func (m *PoolRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x2a - { - size := m.ExponentAtPriceOne.Size() - i -= size - if _, err := m.ExponentAtPriceOne.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGov(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 if m.TickSpacing != 0 { i = encodeVarintGov(dAtA, i, uint64(m.TickSpacing)) i-- @@ -696,8 +679,6 @@ func (m *PoolRecord) Size() (n int) { if m.TickSpacing != 0 { n += 1 + sovGov(uint64(m.TickSpacing)) } - l = m.ExponentAtPriceOne.Size() - n += 1 + l + sovGov(uint64(l)) l = m.SpreadFactor.Size() n += 1 + l + sovGov(uint64(l)) return n @@ -1205,40 +1186,6 @@ func (m *PoolRecord) Unmarshal(dAtA []byte) error { break } } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExponentAtPriceOne", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGov - } - 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 ErrInvalidLengthGov - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGov - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExponentAtPriceOne.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SpreadFactor", wireType) diff --git a/x/concentrated-liquidity/types/gov_test.go b/x/concentrated-liquidity/types/gov_test.go index 4a0ad7fade5..d12554289bb 100644 --- a/x/concentrated-liquidity/types/gov_test.go +++ b/x/concentrated-liquidity/types/gov_test.go @@ -13,25 +13,23 @@ import ( func TestCreateConcentratedLiquidityPoolsProposalMarshalUnmarshal(t *testing.T) { records := []types.PoolRecord{ { - Denom0: "uion", - Denom1: "uosmo", - TickSpacing: 100, - ExponentAtPriceOne: sdk.NewInt(-1), - SpreadFactor: sdk.MustNewDecFromStr("0.01"), + Denom0: "uion", + Denom1: "uosmo", + TickSpacing: 100, + SpreadFactor: sdk.MustNewDecFromStr("0.01"), }, { - Denom0: "stake", - Denom1: "uosmo", - TickSpacing: 1000, - ExponentAtPriceOne: sdk.NewInt(-5), - SpreadFactor: sdk.MustNewDecFromStr("0.02"), + Denom0: "stake", + Denom1: "uosmo", + TickSpacing: 1000, + SpreadFactor: sdk.MustNewDecFromStr("0.02"), }, { - Denom0: "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", - Denom1: "uosmo", - TickSpacing: 10, - ExponentAtPriceOne: sdk.NewInt(-3), - SpreadFactor: sdk.MustNewDecFromStr("0.05"), + Denom0: "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", + Denom1: "uosmo", + TickSpacing: 10, + + SpreadFactor: sdk.MustNewDecFromStr("0.05"), }, } @@ -111,11 +109,10 @@ func TestTickSpacingDecreaseProposalMarshalUnmarshal(t *testing.T) { func TestCreateConcentratedLiquidityPoolsProposal_ValidateBasic(t *testing.T) { baseRecord := types.PoolRecord{ - Denom0: "uion", - Denom1: "uosmo", - TickSpacing: 100, - ExponentAtPriceOne: sdk.NewInt(-1), - SpreadFactor: sdk.MustNewDecFromStr("0.01"), + Denom0: "uion", + Denom1: "uosmo", + TickSpacing: 100, + SpreadFactor: sdk.MustNewDecFromStr("0.01"), } withInvalidTickSpacing := func(record types.PoolRecord) types.PoolRecord { From 6b95426312086a2076baba5ed438600b90fc060b Mon Sep 17 00:00:00 2001 From: doggystylez <98429202+doggystylez@users.noreply.github.com> Date: Thu, 3 Aug 2023 17:46:17 -0400 Subject: [PATCH 07/18] fix: `denom not in pool` error message (#5919) --- cosmwasm/contracts/swaprouter/src/helpers.rs | 2 +- .../swaprouter/tests/set_route_test.rs | 10 ++-------- tests/ibc-hooks/bytecode/swaprouter.wasm | Bin 244913 -> 247235 bytes 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/cosmwasm/contracts/swaprouter/src/helpers.rs b/cosmwasm/contracts/swaprouter/src/helpers.rs index 9a15d082116..de4013a010c 100644 --- a/cosmwasm/contracts/swaprouter/src/helpers.rs +++ b/cosmwasm/contracts/swaprouter/src/helpers.rs @@ -58,7 +58,7 @@ pub fn validate_pool_route( return Result::Err(ContractError::InvalidPoolRoute { reason: format!( "denom {} is not in pool id {}", - current_denom, route_part.pool_id + route_part.token_out_denom, route_part.pool_id ), }); } diff --git a/cosmwasm/contracts/swaprouter/tests/set_route_test.rs b/cosmwasm/contracts/swaprouter/tests/set_route_test.rs index 936b2234b54..2697a05059e 100644 --- a/cosmwasm/contracts/swaprouter/tests/set_route_test.rs +++ b/cosmwasm/contracts/swaprouter/tests/set_route_test.rs @@ -96,10 +96,7 @@ test_set_route!( test_set_route!( pool_does_not_have_output_asset should failed_with - r#"Invalid Pool Route: "denom uosmo is not in pool id 1": execute wasm contract failed"#, - // confusing error message from chain, should state that: - // > `denom uatom is not in pool id 1": execute wasm contract failed` - // instead. + r#"Invalid Pool Route: "denom uatom is not in pool id 1": execute wasm contract failed"#, sender = Owner, msg = ExecuteMsg::SetRoute { @@ -117,10 +114,7 @@ test_set_route!( test_set_route!( intermediary_pool_does_not_have_output_asset should failed_with - r#"Invalid Pool Route: "denom uosmo is not in pool id 1": execute wasm contract failed"#, - // confusing error message from chain, should state that: - // > `denom foocoin is not in pool id 1": execute wasm contract failed` - // instead. + r#"Invalid Pool Route: "denom foocoin is not in pool id 1": execute wasm contract failed"#, sender = Owner, msg = ExecuteMsg::SetRoute { diff --git a/tests/ibc-hooks/bytecode/swaprouter.wasm b/tests/ibc-hooks/bytecode/swaprouter.wasm index 29288d42fa0b8a2b9eab53c5cea697e3b81072fb..1c81566618ac9e66c579b9dd02ede8ac3ee5f665 100644 GIT binary patch literal 247235 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 z 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

0IecYjHCSJUf-Odym;}avIfp$-^%S&aLo_E z2kNW5W0#S^PP)MfumzdvObZZ#Bm6`}t!>$+zU?Z~t#>9X>w!ZDyh35XIszjGsR`}T zG<|kLww-bI>Vv{2*X_taXrzi2t8KX;BX-@hb1kc(9TA;1=rh1#Ac^7rWB1pdX%Pss8ns4mJ0 z7Meg7Lu4C3ryV-;IwCoUcBp2KHhx`MLATr525-(AEoWU zG}gd0rRO7Vpj*#Uxfm zX;#b%ZPS7PnYIb}7@mk0M)0I9-eei220YA44?ASu03>@1HVB-DUrA4> zll9QEc;Aw$+C&AO^Y9x=JtahGjIem0ef@yGj_YeN%-c#|_vz~_U$JLu5cBY1y;-O9 zqML|z#8k1ms~mKAOew|~^=4~q(6!?eVn&rP@ffqNG`TJ1w=QI{&Bhs)aWr@i^% z?=CN9ZtKXkL3WnO%V_%OpLD-K@OruLLK(&0P`(~N+#E|KmPwhj#x&(*o~ixu^6j36 zVap}c7~Nz=Y_adg5{siAK%p#FP+Dw54p06A(Eg`k-%~8AeoRanqy65&!~^qVZyBta zulC=|sIR$qfCnXti!|JhR);1vqt7@(Y)v&eS9~|E;PMI&mxS*zU$m4o*1Mfe%(ReA z%)CS!=9V4usHnIV!BZ)+6Yl?sM`Xj3VmA7xR_+?KXT~yZO@#Y|4jy|LTXRmqE7<2x zOtMMy;R{`hUL2-~D^KMt0${A-La1LB3oFct)HJ3kbxxtQtlSBUWxeuc*TVhK%=CyN zcHK0){rfXYNVbK3k0-=yNyAK5;QeA=9Kcv6O0=VJ&%*#thUH`hy;CpD1l$RmcVePv zF2|}K*1G`{4=UaHLVni}t?*SicIcqc+#6%>*Xlh0E@gf$Va1lh4sVJ%*VQRldaF~! z4p|xN>l9@pg&q4G%ebIUK}3kUjCP|P7uG4-jTB>z6dURkV~rFB$ym$AI>mTQ!MS`p zano8m|DxNgHS<^BzOPz0|9pPe&(HCD!Tf;V3yE*Iui7ww;qCiyaoafGmqwb#?xA$}0f34KptM>2Px9>{OPvGt}I^n}W zbO+u~G~N$~K~CRk7$zGjhQlz~NYQPi7!E_Xkz%TmVmJ&_jTF<36vJVdZlsuLq!-?2IfPQIZKN0u!`eoQ zb&V9mVOZBlvA&UFI1Ge$sB5{PkzzOu7c^2_*hn!Ph6@`hHZ)Rb7+ww2D8mM&U>YJV z(UEIbbNPQXs)z%!vC-J(fNW~K9}dW-MmIM%QVa)Vb0fu;MvCEpY-yy}+DI`R5RO)^ z2jrqgis67<)JSo0BgJq)E^ef_q>*AcAeShG4G19~jM`^GvVXh*VIFTHoy!9Dst$@c zRu*g>gOV7!=uzFY2KV6aBw?c!71~bpm3{veiGFF=CpjdE?xtHQ1=452;s^Qs{BVei z3w#$-;lU)xB!m%vg#KZMs+)zuEPgskHkVR0SVKps%K?!+4vG0Qb zhGncKFY#+>q*zT}j{FqUZ<* zOIbuQ2em42L1CF{6ueWTY5ES9y6~umvN^Vg)7U2c=wy0
XY%Kahfoh;ij$jt1h zQUBktr9Xi#2L)(48m)>633UY#)i^>v(M&@_seJ6`DbU*34bWf1l_L6jCS1F=t@UMo z!)L9(7UeN!iukJdJ;K*9SJ@~@x}gxV#g~-`DZ4Qhc;CL2x@bGyBvSL4HHghA>H+^1#sgPSIa3G7CFN7S{ZG0286LP%~ zBd|WNz|m>>YmDEB4O*Xw&mL=uX9&fH!Um?Eqmt(%=!uuD9c!2bSNBqq(GL_i{@0`e;~ z)I?kxb8N4iO2W&0ohSR3U@@CJ49Lic@UlKj#LTW{<&+6BXgPv;B66bYD8!nGsj~%G zO)!HeLLJ!0$FXYmI-U08Q$HPmPQyKI$o>VVx|C3@%Eo}7y76S{MtZStDPdOZ=$+|B zH4`SUg(5Tw)Wj@lI50C2z7?)U&(wuKSZ7^JW?DECu6}*^u3Zl>r`gwEL(Ab`^kCR} zxTRPQofiaGu%scc&|Nh%GttWwdd8yhxXmzQ0Z9u!ZhL6PJ~;Z2j3Ahi&Emm@b$jBb zh9i%-yMpq0)DI5Z;hi~a&v$4|-k*R8&iDM5#{va=e&g_w_-VYTnlBi77D4oSZslt} z$@^-4`|6+gta$efUJ*`efF3b6z|%eT6U;Xp*3$MLs(Bpqx8Id9^#DFGb*uLL0Kv`hA zi7n4y!bZvDjy69Rla)#~wpudWnPi*s(jZWT&}zwGHkuK8GV~I2fsz)bWdXtl zcLf(e;(>67Gn{8N=N7B0s!5yg+a^aDn_$$F4VNIO0*hRZoh&UkPO`#1aKrh+3~pvr zmuo4@+$6Ze)8pz4X)Xhvt(t0|yt~2Z-0c{cftYOnAi5#Ek=ycePR3RwlbjbG!h}0D zQ!jM7Nd;i!Q>xH4^vcR70iaR&DBOftq9<*q-$#W5MhS3wK5{X2E+Bn5(UHks32w4Y$^yM`&@ zJD##>XX`cXY|8cgWw~HO|)LBk^m*_)hl=w=xFdn8Tm;>#@K>(usXw_ppJear_3{JtD+0@=$7?4gR>?D+V8NWysbX4~b(I5*8_U}hRofdQkEXjHgqQ}%TTRDTI^>uZO_?0n6sg~8P z{mkA}xz@0KUQ2$9SBd{8AVuZB%;pz`>9&erM^}i3(tWB;AfJ|W%>%XXG5lR;oie=Y zx$e4*!h!$#TmR#MQ`5c$P!+jeJf(;$JW4N~zOtO-gJwe2)G&*7{UKoZV*5kijAlym z&Y*kq18*LXUxrG;bG%uxeXc5Ya6h$AyS&KoE2gsI{_qiXJmbwHT))pNWT(z8x-+Ny z*K);i;Z`o>*~7&h5Z>S~UeD!(74kaEf-k5dVZDjh=G!SXe2|%olh*7ll+eF)&&Hb| z1Oqdb88$McuLXXsIi@PFG9QcYv$2rZMtHtC zV&KoUCd;Oal9JGp!Kr~Cqk_ z;gVg_YnVrwAu*;T3QrAhhriFE?9Ym05;mLzU)_EwE~iwMx7-EkAKeP?aV<>l)fD7QFJZX(zX zKzXeL1!2+-@4HP-@6UeS3I~GqX*oP3s**LvLNvINRP$L}8l!Qd4EN(@=X<$4#)CF& z83$s1ZD=G(*A{dE_s27-9h_)j0U?6G$%cE@^>p$wSd1(G2{*(It8FoYzB$mvr1qN% zC&l+<)Kj&T1YKYnMCj-cYp#)lc-YAT8&EUsq&VR+>iTVt6p8Uk!EbS@;h(nFWm2;2 z*pap<14L0QTv;P6AX|(x$!qs{{VlOup!7k5MWL-y<}Ies$@QJ=9=K)yo*<~uZd?!x zl2CYq@vIu4G4AA#dR3KkM@Ui;r@FY2-KDy2wJTzVR*H?_v-fPa@5G0ndHZZgXrJIz zw+{^^wU6EjG?8fmnt1o{vO47xhcqX(r1n)cOf24Xf{8Fq1q)bbD)`{?f`1pFpSxsi zbITeU$8~>Qo})ia^I>d^l|;+AI{d_kMuB`@9af|449cuKD_WBIOFri%I+vdPSmBD@ z{8{(W+6g>za5H|Qx|LWf;mb*ppkKgl8C#cJAI5k>k5lN^p{!a#ObmkDu;J{sM_6~X ziiIBo#pO6u!p)SV;DFBg>h}5ZeeMa3MkQx&K7RW51rR0c?418G>9`+wdxuXUmv?;Z zc=z2sHt(6|<1xv0_(B=-m*gjz+l1%8xH!Re{;lLaK_I>3n(#n`kLn|3AB)dNbp`K^ z#OK5D`;x9m1AdV-y}R-uLr8aW=YA+3$n5XITF5e2Je>EwhAFV%<+ki``>4A=!-RY< z)GhMAU#kdZxK}5H-=}xfe>h&vXZ*lXb>AYZa6RP7*<~H$=@7?-Ol-rJB1V<_i#}De z`=CH<(cU6TMrI;0lmit!s0yh3P{H08okzs3H@h>n++sYCfIu$NWQkb@5=33rBO2W& zSSTjW0J*m88G!epsYo}Xs0vpiRvHo}@I#HFhG;T+XMKFI;Di!2o1KvoifvBvLs7*#C*Qnw`0A1Lz;G1Ok+^!G&TRfiL4so< z1jD;1mUSMpFzZ;p5A2i=PabA>hObc2T$a6B8|1)}KW$N?C` z6W~7h=qnp+i-3oMWZ~iWFJ<9*;W$X`>!6}AbM(@XM!v9PfevEHZ~&oC11=UN{P6_p zHSmjHFE3f_LwDWhynv~M@e;j*8xkl@VG)T@sC{lc-lD_VN(lm{%c;Z)I|olQUjFu- z)lB+EqF3wNt69lGWO2ie+RMv1zd@%{Wj0=Dp_iAH0#6bL?G4<>MJaC%*qeukZzvsZdS$u42=_~0eIAJzg>W};4EGC|e}vs59FQrb z9}YYep^I6FW^GsaP5kn19^@SJu1P%YBpS=jG-~QqTNH*`&0s9WEOCa%j>m$SH}@&q z&}mE(MlIfGSm?LLCZEVzK#GhKj&e3WY3tR-DXZ4grwn4b9M0Z}`wmax8$0?Tb_K?=rll;_Kx;TvN)+$ZzR{y0LNq=KJ$87UB`a#8(W9ChzjxCh8 z4c`ctKzs(XB^GH_v(R=uC5L4xdL10HVBnD_0rRp7#&gDYcgO^*-5sn|YO4d~rT%Hs z!IR=M!}>r5c~bVrpxU^mI$#pA*G?3qnvHwyRC1voGyY1`BN*-tI^kOm8YvhF1u`qc zj>{4$T!IfCjD+6MD}$?Ymc)1xR~KwsDKB~K*{n~{jTObt3u^D|!M^g;_%1bM&+e+d zJ4tE?$^t5N*(V!4JRUxlI9q&iKOE0lU8K(YQwldz3P3`a&zJdlj2PZd^Fc!&S_~{o zcE6a42SZ2kq{6unCoubqcMw3-L3lwK0fW;y?Zc@9Fk27hbVH7GlmREjs{?k zjNH4k%y3G4G&K~6lL7mzd(g@N%|K&`t_t~1q1=9t4mX7{0C9^Rfuz%C)=>S#!LrYU z2JkjXPn&y$0T$82lyfs1TVQ8m`cvun^;?7;ZDw+sOmo8o7rND}vC{%)qyV}J9m!4mK#LCYiWt!Z) zjO-chl5JOanmNzuPA(Q^mVS(ERySraosBpBh&{3x{ItyQR2Okd;bZ&`BG4dTRaQsJS{3&2^M?J}gH9_*6Fblv1ld!*jNc~hU`Ib{Khfq zzm@f2WH1(~ls1);2JH@ng)^CmA!m|z;gdBoak^4MCV1fdCmYBlsR%j|Jxp>j;S(tL z4DhKrs^ImrGpfhFDWh6T@woI-a|Hw1$f!d2X%XNVu!WBowP0s3<2c|S0o>87h2wT% z(~I%i;XpC)qE%iy$ucd0fa7-<1WZ{6vzvM@9*bhmcgKw8uL_2yCI+pUE}r*tyyxGz zNoPt#EC*%OzHkPf= zZV7Y1R_@>nqJLArI>rg2ra2_D6D8-eq=+#9b%YvBpgUkkG>0Kz^Hl*`)$Y~_cv3l{ z7BM;KC|tmxoEgtEV3=u@&H5nlMcyilU57L})4+HeY@W?!E2+Rl?2s?3|7c25U|52n zkY@tq`x-!IEbJ6`11MXT;PA9kj8x~(sy2hJ)E?^c>5_qGIohwL&wfiZ`~OgWdk{_c zn@BXrK6y5xInGxnn$@x4$+ME&Qw?m8*mn$g+Jv^)@?p>!E0RQ-ycsiD%B5cQ(D}Gb zVGD@j#n_tZ*v53kUGS?E#z{Xz(6oD=wUR-AwPAKmdDh6#XrdSz7csOb^ykoGP|`i; zb~FTXUeOhNM|JhimtKdWgtYWR^c z?_fRmQ?Zgbe0uXbJVR8_Ctp>p^NkM&u|BmDgC35 zu}h1K%~g868C&tBXW2mU+PP^d^1hVI3w9;nOEzp3wwXUoG~22a%VxSTHCVs zm72+OTN?Ov%-20P|RF$x+LH~k>)O&x)cS& zYMJqKXc#^vKMyvtYX+w5q-tVi_wI*fYW9vOuFd)*`Z{vBvNW`9Ya-MAZh42ynCC+7+}i8)8} zz!?P>qnb6g3xykn&$L0IQwo^K)JglHy9`?gzwH;ul+5N-Jzg{Ye8c{!=VKoPRj0NA zG8H~xm0+(RH45ITD+E%Od{U)-$Bjy;!Q7rgRk)HFhJY8mof*Czfz{`8DciylsoHf{ z1N#v_x@LNAH8lJuw9L`ySDSb;Jva3oqiDzpdm||XUL%azSi;1Rv}#10 zHJ_>V>!!MsXmhP_g0;d4MSRsNKiPl4$NCnH_4H+NfE8f$Qj!@7C=%&};>nWw`wZ}M z=VJh0JD84G`YPdqzTafUT)Y|Lv%?{9J1s55=$f+Ta11gyJQ(-5qT?X5n82i7T5M4x zaojiGvWrp`;MKo@Bt6I@N1A;@ShmStsoD_BC& zuuTmFnjH&uc|qnnl?Y~P)bkL7j9LL8YswYdavXj%tq_fXj!4+}_aRx1KD5$^fo67vU)AtH(TrA_0q$gps=Tc`_*7ew>&m zMyspHRR>rJ>I|9&G@mJ$!E~#&+GAIB2II~SfK+PRI}KdNV?bR{vos5U0S#aQ#BkDI zjddx)Hpp^3Ed@j%EH5CY=CDMAHm4J&GV%CrRqI|{9DsLoKtrp)fo~$ZiQb=DE0Ro0 zY#4bo$|S2v`s6m$$VI2FnSOEA72saXl;|4KkvNQ3s%1?SLaXk0c_qxZn!ILuo0VYv z_-sjC#yL(YRIJ)^+=Q-)%kU@-Pq2~Nsaim z<*`z0^>r(ccq?0)C!a2-E+>GR8Sn%qErLgwzl;4s)0c}XrBWFX^)<$#<}4@=Wi7j=b2lFSq{ zDYgfRn%T}4$DHFa5WaZW3U_d8x;+ZrW16!qf>lwu->+L&* zQ7?~~u50$hr>6)C65*iH@KBunQq*e?mL>{x9t}LnB4%%LJmJ_E%i{v=ZkRH~91um# z6?dT`MSS}iG}gr71lI#9ki~VtxvSqrnl=BT?(Qlldmv(*beC-1TC%kjgQ7r$a)OCR z&bDtR+1d*7Ub0kk_V+uDk*W+i))-EeJ`XSvj& z6*Y={D*{POWm~prokCkp;?2rH%T5_%gT#u;p?EVCM7$Y|G{hSK6BJ#%Mc)Tp4}&85 zU~0{>@E3pZ{$Clpu0JKomG|+f3Fi6VX?}|$NwYNxa}UW2+CF4KY732|`H9qPfn&$F4aL-3KZmGo^_o&fgm5-7#b@Ya zg;XKiS@ds7hAUh$m^SJyZt$8kPdW$VXJ**sHsuK8$KrNYZXJ z2eC-Je=j1V?9(b6Zs=qI#zg87X^=$Om>yJSE%XkU8OJ6O?h1i1=fwzbG^%UpDlT)} zftbqavzbAfQ=NIDfqq#j!{d$q|JhJ)qn(eBz~HOewj^Vg>s~DFQUZ@rA3tHmIQu#& zg$*3%6&QA+AYiMD%Rh#Q#i9g-<8|q2sEjya#gy^C9~@Z(gd%8scrR7%0z%dK^AD_c4^e2R5r;>%kS5A<)8jmFX_@*}ax zBe6)5W04@Jkk>9k8;eW{Yk_HQSPP80nMl)`GzrbGLCf6@H?Y|-gJ~+RCEPDF13)y_ zVB^XF8o6sQXJ2aule4xqLj8+@7@3ca&bL5f6aV}o6tT?Iy4h3cR*%_K#`)1$B+aPQ z8K1&myawhYvFA(bIrzH*UVL}GWF@yT6>*vFYTU$hi6!U$t5`5lkgMwIX zEt)|r3el^G;`dnzj^eoKBj$NQ6YeXB?C$vXOMoD-ty(yD&QS#4FvJ>k8l?^7jIE%AR4}7elq0_N|*ggr1VknwTmNi7PQ2`@0 z))dW(NQC$mS>yAj<&itSh^W)7k_jgvpiDYz7CC+`P3bKAOt&>>OafX3akvU6-YDj> zw^3vhXN$E#E@@0CqGg;by116Dfburpln6@`irAue<>*X>NfA>3vfu!vQ&@wCryX zR96y&_JSJ$z^bJo;)$xtAOhp-~T8H3Rk8x`*3(R4jZOZ!0m`E+c+zrlV!QdyB97PB~K`9+YGxIXo)apKI?Bt_jG#E%Ku_c z3ELO!)JV;YQ4GBfBj2|c=vLdWC&_o-uzPw8chrb_r|@*&fFHU!r85Mlwfh8b9&Xv6 z!nUwf=BF=hBTjYx{fAH(cb+Hq?PbRl7TSz=Bi=Qf>W zSroi6?zG`vOjp9A4uVnOOjT~MskGDrJE@R{yv?iu^kJL3Ppbno{w3L4xzp;+Qzc_D zpZ7Paj1vYL=Wd_P)wgZg3AIYlfX^~vWmXr-3NS%wuE!WRksf2~+Go;ZnAS^=Y3MDH z7|y1+h_a2bTMOCsX>d!7{o@gK$9y2yR5eGR?j=@!#PT>RKWe?wPA-wy5sbN!nLmO> zt!58&dr1X;izZvPyDYZj{j@`1f5r$UKTqK)R%!Y+dXxE*8}8Yhd`hBhlQavf)**COFGK;$+J>@?Ek2iC6tx z7Q>B z=iNc-dclJdfQ89LvOTK{9<8i(wiOR1=>%WNviZOM=d2NMH-os;Jo`8PRNtbSbN1BLE5{1jI|w)!X5Oki>iljyh0>W9?zGp~M}YA`Tn z#sbtETn5Qp*1~b!m-WZR>IckNcgs4oE#vsqq;0xboEwGewbQ<~KWo88wrpYXm03Z` zQt>*=i;FL&4gpjyMi`>6nck{eN8W64w!+(MrU^T0i-lZA(rj9hYhxo9vdnT_82t#= zm`SR(TSU$;wqD2#DpWme@i zyLZbF?k-b}IfMI;oNdaWH4Yh#l4<4Jv56S=+~8zV&FsLe-6i*zi9~Fj$z~Q zSC0!5#wjkWDs;GjQ!OsDLaht5XJ@^nra*VT-di-ppbokLswiAFzr@)_6H~>aJIP#J zh=ArAN3q1+OK7+sH%Dee_6WhxM?2eKl{ z7bWc&P6nUH2*4ruABkQXtgMpdpJ}CaLlKv=!g`&gLZZjafs>mP@-$SNf!ryzk+wde zE6{peRqm(J))}tq%=~_BUMA-9aeX~gBh`VGjm&$0phjlZg}$|tvn(}CoV=%D!UCeD zdj>}vVTjaZE)yE2EUoP_$I)4qJ=#oygDrD^Ok1T536}+8`hy8~iDh@F0x`wq%^?O3 z@3d)>dKPA;-0Ob4GcnoqL%A=DYs-apjsgZyDLnpJEiG5vaoNb_LtKFxZPj+s_1po$ zIbGOis607$8!a|BR_G$ER_M{?g?{+_3q{#jz0muY7fSS_^K2+WYxOekeCA~mxx`{D zDpZmH2^;{F?f|ae0YgPy!b3DXabg*mmCakRb9@w!mowFu{M&Qh}tOX3puLXQ{nje6e2zm3sLVL z^!l5F{xGjJlp_8{%DcRhX3BeFN>Owpt{9`_7TUioWr&@PMkn7lfic~gel z-WV>~+ixk4=D3s`T^is;;)+t$a!-XOXERpgyc$2vm%9Q|6cdwL-rd(+Ex@T-JUQk4h&WitxEvjy2RjUfap@O ztV?CHOL#r2OLBg;j>j&s9L^n66_o~PI1~N`-|NU4cHJcx4t1A+pvK@FT`IjxUnw2g z&aG(|J4XL(?4^0HZ))DtGqb%lYuByE3}1vlKPBNY7Y0-7_4x7lxM^yg9)B}FZk@s; zSA?IBk6WhJ=<%yx_Pm#HC>M`^6d#{!C+39*;^Umw&WrGOU-HCP%2%ieAB&IQVNxLc z$M|@avHI|tzx2dc$(OGP?~9MmmkUl2el9+4H1->QJU-6aqILM%6P|ZU%fm(ZTzuT3 zi74SQ>qk?j{{AmK@yB$s5ublMKEKovZ(n@;PD9>AIu^4A;$#H7eJNsTdua2x@V^4A zmw^*pt{}-%(4`A$E~4oI)00hexJzdafrXmJ@W#{;1qZbq$W9DdcY|J7ep5GE>HXy( zh{hUY1iQJ6hNPPixZ}WIFX>R3r~U>`qv*ijPo$2D*_!D91858dU{G977VffsSt=$U z6sYCsFu|U+u;GS~R~$U>j>W~+E-XO>J8aaforBa6yjh4te1SaVx*sg^_KK;XR|W;D zvQ}MLy98ZC%OF(n>KPdNssSe(B2E0xNz2y$d-v=1jC1IO499I%6xZ2^~7Kz_vwYoB7s zWr1A>YOuGn`;nZe2gQ!`_pOGWSd~FfUVg~n^MGFJ!HPcq-+AY@fVCtX{ePFTK4uzl zRIFHt&=zPpD9LuQ5}*uN+nyI68d|`fbF+1UiV4V=eKg=45mds~WQ73@D7W3$p0yhn`>{Uje;S zYx1sQQNj34mQ~Tr;{7pbwgzK$fAGBP7eLWMWdS8W>bzrH@h~htCiny`Q>iJ=-vAy* zU|_=3ds!)U?r_kuCNJL@lXerGaTKu8nL-v=$f#UfnmdlDw!kU*Euo5+7Nd6q5cS5@TGg<(vLRc~*=a)XLMs(5?=@P=W9--sAp6v+0bO zGd+6+7Dq%o20$~oVk}go_|h3B5q6~snh=Lk=%v$Rh z9n+^p6;vd5g@qf($B8N?cn|wyFXwf5LjlnB_~wEo6R9#NLKWE~qlQ;&_-uN7<@AL- zej?+*U%5n4np&oYr@rY*O9u-xH)pere2kOOn z@McWRqotC@AU#w=E3UT}ilI0=tsxa>`0i+^ z;>Jgd8@J*tM8~*_6H`gWZQScPZ3}a$xCU0MxDl+*BUX>Ab=FUihcYw4t_4eta*?uvQO1s^L3G(vz}yf z&+dTIr2`pg6m3{M3=LaLsMn4z*{ujGJiMHC=ew`Y*4fjTj?VKJYwg9<@C6Qdq+h#N zr=gru7Pz3HeGKj?b4siCsnsZwbiEg6A~79CO22GBxp?Dk)*7ZiZH_{vV#l1tp03U2 z)vY-ZYo;lU#;yt4t~!##n@gG{%Mr{8gCc2n$h$~>Sh_c#K%eA9ES#b7Ow9PE4dSHn z_6v_$erq#P2uo6w`{8~r>8vrShU%h(0(6K(lsrMg5Ca53X#Cu{zv#2-O4`wuzFk_~ z0fIKkJB1}IQS)DjqY7d4nZ_VNX*vN(8efu>%QMA#2myejdIrYtdgXb!H6|*tnIsq$NrFkWl?2PY%U-?IRVllahTFgL z|MD~wBy_r7JPB0_F=`9_^Rn7?S?~(6G~~R+g0W(Vr9Yq)Mg`za0V%W7&^GkAlHK!F zaRrJCpw)3n?wN#|O&P*1osJ7*=%X=kkP;YMhVLgXBXx}Jsm2v4xCli`S&$MAImW`P z(!W7krj9d(iCV(a61KxyMb15y5#)DUR@QkuO=~9`!Cf7dN-_MSoX*0`7UD;Zx5vg; z`6vJMwlpeho>(1_vDk_Yn0l4$Yq6{)1XegfT8f?t0 z0(6FNMg@Ory|x;JHs6FUJUOhvq5Z4_=}W^JG{gTU^x+G`8X(kfMh$;Gtbvm+Z4wV2 zSFWopVu2JzBNt))xQEnIdfJ|nl$%1zeUl*Yx7I%Capz4P+r@9bu^jC%y9=f?c|EM; zTu=upr@U}4%NThOVb&;YiMln}0Ba|i%* zfVQbKq}WM#Hn)s)-1u-tDA&?SpsA%3d^3s_TSj^2GVasDukNC3@YZCv^$=!#R8S^U zkmRKcN)Iz1Ekj9IN)z;qLsriO9uSNO+A?-UVlYbC?HEMEBIeNK4P^J`4P+1)F58j{ z4W)ZJ=YXOVNwGzQHw>RrUJNaIJN+Pl0}kKSttx+Sc0M?t;&-qsFO6hyL= zJ)NmXDV?2YZS#|hgYh~Ky2bp-jAJDF_*fz62)Y47=mypnPzuyP(BAX{LiGy=+HCqv zINebt$gf(F|G6lNdfeNLy8+%zYf&K^qMpbPppVjx6$39oIZs_LP^p+I$vAY5(xT3C zwRP2su64cD#VhUexqzwF!`3W=81!uIlGdki{`_pU^(M^~K&STQSd7N}+zj}Ly+x^X z4>3I{n=PkZ$e4nU1O4a@$Y|N{A_J6`>qwe~<3I5T4XT$T{&ggOjC0I2)KoxXhgFDl zS^F|?3fmycTuB)Lom#fMq}eXhETtCZF2%6Ym>5R<60BJSBrS=Q=j`FkKDSdvO;Xn+u_&8IO5dSwTfOWiYAu z>d=|vj!zpyuHL%8nif+^oic(slos@}Vh0Sw){NFyie_AB)^-_}r|QxuL+eSSg*J;+ zgMg-T?Ylz&P#Y*lxzqqIf6EoR63}TDFP8byp{58ZeUpipWoRVFnUtFJYMl&=D~#K^ zZNt{|-WygK>-xJ`mpUjA$69L`*vtfJ7L<_B0wy@2JEo7Z{JZOptWv5LqExP$>{8JB zRo9@V+IrelHvj$~`@^@t;}<{w*Wy<5@BZ}H{%Gk7pZWOFtouBziK&T9`iyYHSKh-w zw|l>97Kc3ijUHP(cDuh+fZvWoAR>iR|C9t?w0v+i%LiB2BSZzsATvut@%bGZWM=F| zQ**Ev4GRsl*yU&%Yo#jCOy2>01|9pKq`!101EEV!t&lz zyxW!mHcauNSB_FdhZ7csQmP9uZ4Hui#VI&j(=z74I;cBKkVZ-ZUszY=*L;TkLI2IDez0PG>u|t2BZ$RO8o>ME_CL$;UImn7ibSsl{)&>?Z`SEH3 zCk~d*#^dY+28<0rg`kTtK2oA=X>OdAWZ8!E1!MttZS{#m)78$ZEhmhzP@Lskd6sXj zvwUlx<=faDJW>+5nek!pdT1w=@U*O6RM>yPg1EMQON`X<5;f<+zRhe5g3Ogy2)6QhZx-igj+K{@(f4z`iPMOAi; zQUO%8>d8O>dj+o4x~9yF{oG(JRbIJCA0AU~8R&$E<3uutp|e_-wsTMI)IR^JL*wCI z+_hloJh&@7CP^BN@b@ zl!(A5Q6(%C2&(G7pW^-+$r2o6G?+h z$wwsPO`m%<%6)8=a=Tf0>c}G!px3}Ba~W~fS4Tlc&AxCo&epwA3gY=NNpV@qU@X-S z?ix%|tX15y`<`+XSm90vz!eGK8~06#^5Z&w~4vO=a9CA10Ykp4ouDtrdS#)|Nv zcd4e0+>vN2omMl&@BL^!i-vu#kc$)wa-Hr^a&L~e;0?E??_}Y=dsW&kq~-EjF7G1i zOQ|p;h#zOdi%{?e7{P%|JJ=dH0Ei6-DpD@1C06(-72X%yq-fo#P0jZ0J4Z{bP4Zg0 zi55|l{7zqCcT&N2*qxsMjY>})M}GlYkb(aXM|CHmML$D`nbkk)PldV<>oG$al+9hz zo>poxD54aC05%jekqhB6HoWY^?j<*U#wL8xbXgNi3I1nOJ!4>+%{;eyCS?M4K=)(w zP1%yjma5?)Q#ThE@0sILT@h|11@K zcok;yEET;P|N9pJMC=s63u{&zfcjWOVNb#t)_6=9kXIsrBeJ{yPo7K%=(zajfM}Xb zQnKk{j8h@?u#_w#B9qiZP8F4U*pl!y^$^D2svE(BsfVg`unOl>(WV~yFE$`k4@*M> z&>8jc9XhxYa{6<_Wz0f)zbv`NCynSr)w*GeR1!FN zp*d^Td#6QMM<3|Div-jXFF$FMAAz&4%HC6_%fxy3SQ-g`ib#ygA6-M{GgMp^h!x2!!3Pu3%k2&aVI9r^{>N1(l%4kkF%&}B26>71-+hcRMgxjxw{p;g5 zNULWlp8q?0|1C4Wy*M>dP`+m&d>6)LH2po{p$|Qhxj;8JGK3UM)|f5NIM}sAkzr&w z=53LF7RtSYY%jnqqYKq>|8}EXgDE{Wdw`p_@bzHvy3qz`;ME%d{AumsUlDX-P$wAh-`?5BHRTvvDg8E;yxm1;#7~R2bb?-Dn)EU zra4_fPA__33!Xem{(+A$8f3mz0%^RZDt~yFVW^gF%RN0#sc(a3tao>*$y#v9u0gh^ z_lwX)mF?Lj$O+0LwTextRyEi<x-MT%!I2)fq< znY8a!AqD~_m_h6$a+s0cK$d#Txb2qOG%g40aX-@peOWE!1Qfr}Ui>pO7PfEQ#>?%9 zr9*{4HL6RHd}f77FY}ob-Q5YiovyKjwQaV5>HU|AJs?EZH*zRz5Iy+{xs zj%mab(SQJo$-RPV`fxVB7bI#-tD&Ub* zGnASg3ATe=?Gb*fWE5#{8K|Z^dq?*(v4O%7UP_^lg{QH3ty73f07|(=L1`f2mkS3@7~)&3)*@k7WI<1jl;6&P4uN zcp;h4v}DXcT0EHwxrQ=21Pg4-=_2bLDnO*H_r9We&Ry zLEh9g1`_%r4c`!#jw^%Ng|LBP6yjwj&84PbH=(DANG5h-kDJ!;>A3q@(=L)SP_9r0 z3Tqo3?WjzqeWuu{3V5;Nco_OtlhQ;*#%)#~^PMOt8hu%z#8naUu3B&~wBIDO>%)Ld z!vR*v7VKO*QHfgNl!hOlHJdf6mG>0}8fKdPUNu8)Vd=w<*wP90%v3snJsjqZ;zVTO zVckvYPVls2uq=JWvP@Po92nN$%joKiJ=9^@NX*q7curr7gEN;3cP~z=2fptmdZyAk zBheceiMhYk0(vLb}QkG;st4CRJ5vN+BoCWC66qxbY$} zMw-EK#pmP`Xe7g36z@WGhEcsivN%69{+gI9LLD3U-YD0#q%5r&CN2#ZS5?Qg8mkg# zgctgX%Q$rzJ|PB83lW$afT=SWDMl7Sk2682riX!sw2y@o921FRX%?m^xz+~xk^Q-e zwk%gUuwkfvV~Grf)Z1r6VfoV|tM8ss~-`FDLbIJbux&PWFTzPQ)*|*2$jK!{hOb zu644f^l&PE(X~#t@Ar5(9lz*WC%Z#m7Wq-zbgh%!sfYdXi>`ID1I;gY>p^c+z+KIU zd-R|;`f{-OaK9e(Mqlo0K0K%gz0sFL&4-8epf~#RQ1jui9`r_EmYNSo^`JNUa-{k2 zs2=o2UmnxLvG|~C{pF+{j>j*$*2$jG!-@Ds*E-pgdU!m3(X~$YlpapSFS^#r_6e^} z$1l3p$?njXMSj#!UF&3b>S2HUqHCS(Zao}`Uv#aL-J^%Q;ul@(WcTagVEm$Mo$Nt9 z+!w#-S|@v04~OCxUF&3r_3%*qqHCS(s2-N$7hUUQN19*GEN7j+ML9mo3r$!%uQEAq zq8K@zA;-lUpCyKfo*KEXlVAW%pnV9o{%0crw45mf^jk12Z4l4Nux zK_Ea1IS7yu_1vnV8ZCK)YQ3$&(B&=OUz=#T@ly)B zO(do?AgnT|Y?~@l8E90sw)9)&j!K6`NW-Qmv?qO_wU}!7%A=|&QsF56Oh_0CFvA@3 zxmcUF)>f;5G7IV$Yvt#MdsxL;b13H`XqJDIJBB?%h>r>>^g}-MG%i~WA06Lq$%!&- zr-=0+MqD5cfqJi&GS{bM9t1<0qpCJ`yT4KxUE;~8CYU);qZiGA#E4DiKzt?0E^}bv z=D?yh2LiFJAX5=-f<6qzj$%h@@t_rG)t*7y4sD?|XwC(u5>t}G+WDTT5nf8QH0|rtf8*yj^dH(0D@?8XXYlE%qz^DNr>e!frzN6 zs8}CW3rYnah+2NtT2yS&V(Wvpwo+>=DpvZdwX{WRE1KWuyY@ME?o1MVApifbzk!o; z_Bs2p_S$Q&wf0(T?+bSLHXkfv0HGx*tSFf{@RXF|q@u-be#1?+Lb2A;Rc#KkfFx*w zesCj{%|b7XB5aP~on$++_H2lH1d-`lyg7KX{bOt9s8IavywNZQ?G~EU^bN!(eIYSe zb3{JL>OyXAU_OLT3Z9vKl2M{=>HdySs_+ZPCxO~eIi+h7jn{Rj$}N3clGJh$F%%mJ z$JtVDNhpR*42bqQxn)hh+1!$ayySry;~+lJ281bVl;KwjIUz*}Ym^67gY7^}StCIF zLe?m|CuCJ+jfs>J_7x{!Qb43O&9RHNo~E_Pw@rh|8s?ByO&F(E0;U=UR21Vc>pw7Im`_)(lefjA|TUdDcC1Qzkez%5RGl5jq}LBd^x z^@!R|m@8ouOv@I+2vUjFBH4m18rc%q;nYl1hS)ySO($FYqNc2y>c(m$TNq^BU;~BX zXOmEZHQ?hE&ylbD*M%!^luF1^D)0@HA@Ur7V?~*Rcj*{SyW*$b$vAixIxd|feuDH8 z&+GQ+M*R46f@Q272x2S;&`Bw9V`Vk`@vLh2BO#GLH9TN;AMDbc8F?@Yd+cxiln6{IrXDkk)roo@l zpmEnYs>m@9pC{DzUCyWBU?KgUG)=rIH4BcODwKpTO+%z<3W3%5L7BDB$OIv~M)d>3 z=7K?xd-FU`=C**JW5w?Z5!oOpNcdVvB7kHymu)9Sp(R5IlkD#qXE4{c3{+o9aXJDd z3U}fpGRzE$RuUg&IS;5a!haA~yd^&b=&j9Q-%1NU)!-uX^waR6d4bIm9mWs-wnj>k zc={Duk%k3kKxz6FS&>GXPJ)hmptPI#+5@wC5pf=v^&Abx|MJM^6fJ{9k3al*_lQu^ zqlL-GAJr3$31ya``*6LB|U1-_`mjRwyQ#LdhV z!FUHF4rPHgpa|oqAv8@?T>1>Lf{%! zoAv;JD2EhCY^q@F5`q+40D;mZxh01d>c}uKh&pSVq%k>niz`Z9WtFdrZRakXP&k_e z?4$6f_>B0$wyHna|#|OyPa2Xqf*kJ~)1m&Y6C+%v%JBFoePlBdi(9 z{xp6p3zXT&igziyoAAc66pabZN}g-CI7~`%O%lnbu0)U6mlj7%U4=O&Q&k_i=4C)HY@3D zgLT$GrsvgQ=)*+2Fd36*mtPw#MITcCT!e?CBi}}tuG`cwv7$FidErL7l_#4R zUUgy^+f@9XLU+=M5kCSE#HYo#za3imDzp%V%Q$a+nhFy?@UQ|yE!#q%_EhY{}- zJZB0wfxgp^$kU%|l*n+W;YxFi7fdiVstL4oqFrE5im2#>AMy3lY+;xdHc56UB;G6?X9t9x-+Vb=llC zjN05aWyFskW<=cF<)#_?2zMBrbSM}gFVdsbe0GmG&Ib)YrGeC>CWF{!@h<~b!H%gV zb8;55H`ym|dHi-J8pyW0LhHRo-`L+wSt(w6kIRYjtf%;yFFy=a*cp@8fjt>NVs;=( zeuV-C$*dL=aTLExjVY+n!D^F$$?F2EG+W#>bHY=4K(f}+&le&}AbYV==`~e$$&qmh zyF}r5heLTfi8NUZ`Nka{Gh4VS{G?VTd)uWRos&c-{TT57QtR*j=LZdfM>ufoJBd`zpoGsz# z`u`eK90}I-ipJJpA+1C%n1x~SDF*bIVnF>w6Bfph#xpuzJo+&2ZVRZ|O*8gZ+7wIY z8QPq}ay`u@^f?aiauMWd7`X%*iZpQ@aX@&QEVfb-i02TgU|kU#$i|Nv5c>6J$Kng= zd_^s>IyHS6a%vMZakDs?k=UoP0;$VQ^L(|CUBYkOhlO;;QmGUIH+?x{i%e2tuxf*4f?Ug0IX4{gJfTUR0wVN@Ko0(MxpQzqsIAzw}UvGQf#nq)A0lW+*{sea%Gu8YYBV(N;Ed3Gg;JoCq6#Xq48 z$PAsn*PG%=%7;bv2%i;8oPI89D<}!)@l{nu@N_v*RO1^7PP0Z1$&0-+{J$o>eN5)+{iS&3H7rpMV!TY}f!}#@C#glrfnp zXx-j;>w%FC)njcubdy0Xe&(X$&De@K$6nNIZ)~&|v-W^W`K-ZmwUBLZY?xiA9Vg+# zu7y&A6hpqw6L9o#-8AqC$RYFr;kYn&2$)GjSdG)vV(&M#mEc_vphmNHQ_{3z3q4n% ztyOFjXl1JswA#hNc+8H-KY@ONpgSGMW@;Sd#X{J&S9~!n!qJ@ZhQn$)&j6ZRB0XYH zGc}!Od1so=SF%hF>e5yrXYfI75jYbJ0V{&m?hqYbs|5b-*wyr30o01Vpx-ABWBp=R zs68W&o>0tP(|M@-1LVD&SA<{+!qDVW2zHqYciS zivOE8m?30|@&pRoR+DOlo{sL2^-+RR*59C1^?}e(Z9NxC@!N$lC`}OBLa=pwS^28^)OHFvff0X}yn>ghC@*pph}x6xqs{}MU_CR#g6 znxh?~pVT{o9Fa^a2zOFoWF5pN!LyDa&0kBLzbGb;`81ZN&wfHGj|sUMz8n99+#$cH ztxpV>EOr2C`)s*433TrBlY5lhTa$Z7a__M_n@-#xtps%28sKDt9O&W2SwlK+%$=K{ zBmUCnaGEJU2O98I5-(%u)Dn}{8|8}B=5YhQ`ZD(MPhv<39C5Z!-xK$ffjmN^3i>%4sU-S z5H`lozLy&UmQKb$(DQ!1*9$s$8_zXAk}wCB4x}f9Yw$67#V4m%7^Zb=AF@PolTfPYE1gL9{00RUEp1FC>Yh|>O ztiG`SvG7p~cDewhL=hR$o7|BkjGY6TLPGRi&y_nhp+2p(yf!SSFP=zW>~qo+4q*aM z*kuL?G0?7LDb45!t3mR_(H%0)=;hy-1D`LfN1pySAte{ zaT;{8T#`ur#m4sT;|yckp(*;Qu*zKNDjwJPKXQ<;Z6y!o)AeHJ0a4_Z~!m< z>_<40T!g?$k?>UH%MjbEsLY-C=;HGYatKLqi_y}=wv9T;clSp7{YiJE?;))u5DIc0 zZE?ccmE$^6SFO6>geb2?2ivvKT9}4Ni73xEbSO*dL>iO&L|vnUGb^!dPznxDQAgIYfqZ#C zQFV}x&8)BVUkry?=0)1z$#&I+fGrXn66Z1mp$9sck#Kvcj~f<_Jvyp^d}<+GlOp7Z zV1jnbko)1qsRo#<{?cDW`KjPf;4A3LVqmDL`a9xF!#7D{> z42q8g&WJfBm1$ZvlrlKK1tK?_Mi56j|GuUio_jf13`U}?Z!74KJ=3_{G0A9bb^tBr3lC5M{+KA=GM|>-W3bV#Bd_>h8NWU;1v^5*gNeX#{>_YYA31svRY6N4A}!}h z6_QhWq&2tHYt@(N6N)!sNh#d%~O+m&pj8{qj&`hI+>_oG0;y}O>ba)8-84$oh zry~u4iqEE40RkK5l9iAG2&%_WuMF!DKH z-_<5gz;2@Xk^NM*M#;scCP)T(!m#MxP^&OfToc(Ol+pDj%G(N6gQnq(@>YxSEB=`= zgtTn|AnKFT^(Wo@g@vIU6DtL&FtZ;G65FIS1PwY8ArS4!74JA2Dzum#Ds+5%qP|%U zocAIdUYh|&^@z5tQcYNSl8OsxMCiVglJOipC)~F9g#gou8?9u_0(U?a!aq>R12?Qwic=Z~$pJLlt&B z)37QDm`XBUu&%?9QfVpZ_$Gd3Z^l_qG~q}`ISzXo6ru}Mv;YKQZHQYaSPMg%#AM@+ z$+CucvAJN*PP2b6-J?TPn&YQv8>!Ung6v zER(SZ-t!14Di1dq)c?a(i{c0G|K&8Ew!$Fu(fpitn@wfPhA{7H~t2Zy85pot;w z`Q2}NQOD1@Xp<_?a%B#wB_AKSA8|rOaX@?=$^k$46}mnVSeyeH8GiIjx9aOl8d;Wr z3^W@!S3Z71BE}ZZFgz&h0|qu&XG_*@AG1LdA(US@sI^S}zjHy0_xC=<(A zCs6fMW1J_9+|k>Pjg58sd9iH##+zQ;Sg%ck*?8Nv@m)8a&j&bqmdA@56*dTN3-QUW zSc7!A0^W^y6xGnG*3hf!htemTWT?BE3Nk+qt0Z0*=5=F9NlF6N)_A#@avp`CmBL$#Rg=$9p z$c2}5NJ^|(6q12;Tt2C$7AQO1bNlq1nMH5+vXLyokX ztkyuFs|7YZA1Zd<7V+fxXZON{4)RY_w=jm=aEthma3ttkx#%>es@ZSjM^$##2c(75 zLp`tA3|)1S%GT6Rl%4Oh>Y3kcgoa__c*x|NWD=+4lwPwJuyo?>@u-PSdQ;#RCb%^< zLt#;FnHTkXJ$gcW?h01&#P-t;ZpH4fm0P{k2UP$i@I{h_t~C7(9Nu0gU2rd?P-9E7 zt|NEI0k-0wx=!-E$f*L&+Qun63L1reaL9<;;w<@j2D75$e+p4;W+*C7Q}(3sAh?{S zTpLjE;QQ5Y`PDR}+;p~;;+sUpf?V&UEfb=YXv_07E>%e<{q(A;J6Xma36?~H!2;=- zkw8tLB`PW}sXsBLA!!qwS0z{~vv6*@wpwO1cnnZE`rwuzuDInFKrwB*`xO9qt?zK_ zD4a0`Js1N`3FO9HtMPgh4{Y-zTRkE*tB759l2*F`6>kFr&+zoTFQ-v98^ZE9@@cR8>t(^cq()Xsl74EQR8#Z>D1Er-_6glO+XQb=F5`kYF6YHF)v`@rf<0)Up%kiuHzP+NB3syE z1&kRsc2GGSpYvY?oQ$3_Url=&Q~L$lx4}iMN!N1EAm8Maq}O~!>}rh|Gr)l5 zc=4-QG4VS=alqT`LVd7#B|AJ0b7_FWA4jxNXI8w`ioVLN{HAkj-LJz>B)54xKQTIp z$+DN6kuWk%f*G{}4-+O!c%wWS+?pUy^vs0G@{}-HTM*#Fiwa`0_%j^gCyWZPQHnHK z5f=xQw!xr;z8| zRLo)LHNuV|nLe0_#Cii#G+(OOOcp}URg^pt^fBCflefZQCZ}*`MG+2g5AGqt(BjuQ5Iqtgi_g;S@S?qVo4pS53z@epd@}F+`*gqVnj40EG z$ybQf)f;cPS2XozotM2R{wOzh2&!QWEjGcJ;1;&HQvy^z>5alK4pS}0=ONGqrbeFw zM5G2oBX1}uBje#gWNOpIFn&Um7lx1p3ngX_jd;2zh~D@W4+UDHK)eVn0DKGXZ}AdA zLl$nsSXxuKMp;SCtW3qM6;7?PmR;7FnbcxvA25A<*BWKf=NiodqHB~RLTFR}4$I7= z13_kxlww!xb-id=#7aq16MT8GlaDjYn2rvAnwhafM!Djx89#F)8dIosn`u!zDZuIu zvO7g@aaV9VQx9Dt;DE5TQ&SN?fkC>1=GJ;^|KsD2f9^f+`Sh3GdQ;PDWedi!sn>t` z?GJwAU+(?ltAFgd*NT(~4wHS&kiDLr9j`brQC(|t@6nz0FQ7)(6NMFSx&L}rGbGns z&+9Bn#*DpJuAsEQaMSfs!29X!YtOk2n#isVZl%$4ZaX0C2Wywz3dBd>c3|zN-+S}> z-teK!R8jTQ(I-CoiQoOiyME+)KooeCxtg zc)Q3MbE<4TG2jWT7L6nD?}`@_pNLVF;GlJG; z+C?a@2o_DVqu}GJdPI0iJR&?L9ub}rkBGJ~qg$efY3}B2m084S5~74oSAt##I+P7r zIMhs93Spfp^6i34q;1KVJdRPV5LAlTppGM|oklJk*60H7y$uA2q{EgCdh8?*Y7 zW0KV!rZ4F8fXo*I*`o{m@+(b5{B+?W^B>`IqE_VsF6AnI*RL*iU1R|hr-34J-)lBt z-xr^?_(ymDpYmf5SOe&V1$zD_jst%f5l?+HBKqclV+a_EkTIh8k27&;p8|0rg=G9c zgwCrS$vAsEY(X8BMeCP7ft;ME3x~sKCm7Yeh|z#n^1lK@35Cdrap%W-72YzJQP z>3lVez!`)QU4$%RS-24PoZ;v_jZaoTqiJVV;#s)1Sw0m%SR*=@J)ZNyu2txY`htO+ zt;zBdJ66s|d8(BPnFsdMlQJ(N%&R<^r-Uc-l<;J7iYF^J44&+~)cP6AnUypv8*BvL zDpuuUlmUpSWx!zvvj>cMARr(w5eBF!_$LxKLJEStOnnO}G_qgj<6sZ#9_eQmm`1;4 zQ;^>DFi-qL=&_Depo>^-Cz>V9GV!wry}V>Wf&__{V1ghFy`T%uFJ~j)Vn@H`_t25t zo^f+6T)V5v(2nrYyiZ3e=>*E*N`fb;VJ(? zB8TjxlI}=mG%d^qo=#C<1&X-ilL@=W3eHognC2`t9y2(~{0KvV?%jV;Ht|OL@qTUj zrDI?j>pw6s;!}ae%E;4!8O;M54`J2Q)65f}Ol^XSS3{hgC4!BV*sJ7fHmHXAxT}x?5otqBQ-cubrNijrEfevdoM1f3xOU zKN{fz`pnX7HjpfDlAp22#!oRMW>A(W!b4%XF9MV7(ef}budzoN__x`U%+D{iCmkuU z$)040zCdm{e%WdE&k7sZ;}~w8R*F5y=!VWQ6{esvcHM{vPBqyhrWqxsG8-2bn?=vi zi0t0NrM8M%FYGim*Nfy)KgN-Ee>N&Ukf24V_+aw<&_{pSUhlLXs@JantvtE@pTd*t zzrrCeK)WX^VlT>Zz%DS$vXA+nP8hzE$Jv9ELjB=idK_Hqg2=Tlh%OMN$Vf8vG3+*< zM~g55k;a{A`bUy(&3Fc>FHJ3J0wn(oJ(BlcsC>j&W_>cPpr;K{WBkOY z9@aj-X8ADYs8_yj>7G5rEq0mbJt}i%jLKK1d*dXl8eq!QP76ETL0yo14AyhH2vdoq z7#Cu?>2XI-`~+KpaWJ}(ERzvQ6ot|e8SFT5@eaXjp)u6JhyrycYTOn?d|PA`E#2lU z@>&G5Vw=Zpm4G6w*kcQ1R!oG%qE#DCizDW;$390E0+bp@AUkoy zN#|1A^2PXOj3)S{Iu4DK0se5#i*k^I{RJ7{57R{LJqy#tg@x%wytwJ#?TCx8=|6%- zi>uvF0~`3QijZBlJK|tZoUZ_Vh>=>y4P&d-PL_YyJt)RM)E$K?)QX1{7g_>f97Yeq zqvTENLFU(-rKFtSXt=0VQqYuKF=PPx9iu5_QhFx=yu@ULSpS;QBAWvi8-|u|dN_d@ z$@D)6RR~07=IP+UKhf{RU8E6p zRV?KBM|$RchG#V=bf^s$Lm8?fE|UbE;pf?z4GdtaJMcKIJCHEl0d>J`1Hv|?qao{D z1S?K7R(*RE$C~AL%@=B2s=87BF^_RZB-obEN|97X-{^nB3W&n3gHsrHKr|OGGJ_-( z`Wl@0SvgB2Wf`H`6=to%O3mp&Nz-QBk|Cgq>JVVpbIoa{seM!U)d)udeJE+bb3RLltm5-nZljN)Gn+zh zV{_1gEGdmWRW!%i0LhDLo^&?(V%oVJaDE(_8cZ{^Rc+|lJ*!M72OSdKFcd%bsWUe6{mG}=4fA70_KPP!jgxeEet{1I|cH$rZ0sMVw{FP5|d&H05 z{D<8CIBfc<4y6Sl@uz-RKNRcueFvB(=hL@LY_v6F{5Wc1+#28aac=zN$e%vQ{ed7U zTrARgp;VzdUk=$-82fHfET*4}7fWiO)ikx_wH!sG(X`~i42_Cgt#MEOOXTpJ)`Fk> z9g$($cX3UQ(REzY6W26kRe7Y?1KiQq9quS(h&$R4>ISr>u>clB|rx*x)3KBca%FE+(n{oQvaJtoc*UMZ^r8iyt&%$Qvw zs#UGZGeaC332bLTrw1|^U3LaEcp7IHR#i<9F5wk#&tP@5fo{oyMX40Yexy(=K|7GN zw#g{mhDbdZcUp%)hu|C{(ti=D2kxI4SIW|m*|;lyFFFcO*^LV&jvvO?I|bL#_EdH! zAth&JLT5m-7vd+dl_1qvveX2b&Ztf~lg%%TU}0u>XU z0?;z#Eyxr|e-Stmhao$$LM+7=#w^j|qCDNPc5pqUjMP-$a4Zc~0}=ABL3tS*))SI8 zroI~4;G9j#=I;YsiLu{Yr!lUoA^5Q+J>h*n$EjV|)2!ms=^8@_2n3=-u-HPk15dcI z5CbBf?^pUm=DLbvDr$l2v&8s6e!ZI9aYOzQv#3 zuVax~bgwy}PagfI!I~{NfmD}_F@TJ1!C{OLdc?O8vyh0L$!R^88s^Y(L?^wTJiMZafZ+z@_zXK` z6%A11#0EjlDUDbQV<)A+REwlQ5YKa_NaF2@A*feKfmPChB{Sw%dUC|mhK04>Wyk}b zbPhVkMD%=^A8`VZ>=xVPVnm=IJl7J$K(pX&MrDkPqn7ObG*^G)^=KW{{5D&3evsS$ zq$3brWSl+0N!1VV%j|`w+2oyDI>~aK5m`<)%r;(LQ!!l-| zE?-66d{7tFImCg#CWkVqBBUa;K^Y732{ys)mKKY)iwZ*S6->YE)eEN)oM--45hi@- zC{O(gb`{SBwak1Hw@QZ7p*#-^ZUkAzQ90j<;FvuCY^aj!T|Gn`{VGFYyW>9>1X=f6 zjiMhy%@>>d%Tu7%7SU_7wg&(%v_%v0gd`D7WSDBPfG))|Jy%E&ONSx)cjS1W2%ayk zIf+1n<9LuGoabJe`>yAXtbjdeeOt#bL+HJjh+=|%L5vVnj9D*oKr&6&z{+JtERjYA zd0m^q1qH$Et8pU<3gX4^e+7&r2MnCd6qmy1-M^Nn58t3Uelb6T1_v_Tp}IW?ojGPg zRV`hnNKle&j|RoB1TZtJ$+#GCM^nI)ImL4mU%Wz5C=9i2LqxUKHpJlmwFmuMV&9rF z{in+Q5cJg@h{paxV}EW3V#@v`cUnNdSYUW43#5e^JdZkScpmMck$DNbt+v+<#n0OC z_?v3ZSmabKOPIfed258L1#* zK(gbmcR8PZXjabJQy0Y27tm)6SUP-xsVFCZd^^@6S+d}mn4_9~MoQK{Q^mSuOV}h|IyJ>xt+2l66Zij()^bDZ)nM_^{xUL{CM2~i%rg6 zO})97>YqzF;~m4i$Pyi$NXv6?jq+>#+YTVH>bcWKoo;n@ECz4~n}k$4_!os!QW=MvV0K&Lpc(a~|&M1*|!9Exs1iGns!k|!g zfI-O#b+BaJ@`gcr!g|7GrH(Bc14%Ot1bEG;bT%oSCDB}O$P_}SZfZu~&>9hFb8dL+ z1#OT*TQ6vlVh1$-Zk${oTmr2jwF<2vm9Q=wbB*-@2D>0o6>(b~b1f1yWC3C*3e?TD z?302ct+lBY6q_M0Oq9}}yNOsto**HkqC(ko_M}Mn0!Y{Vh>D_9KT-xGU6ZRSsW&!* z9+0{j5j?IziRVh$ri7+393L$ZpE$qwEQ5;sg4CpcgqDhj%7mh@6U3V661S=jK2UzG zLOeF9Ax|`A_p>8&*cRMWqy+~O7qKhHvI^so#ihcX0`#2~<{{1K$4$uT71sf;V1=8I z$%FN&9^JAsV|mgu9B=>;n8KMDtW1Te82WVQ?(Vl@l`SfvD14-#a01B2SLjmJq&a0Nl4Szu`PW8s0{^{pF< z=j)&j!tt1T^h%mj9fmt`R&=Nd`&pGF2$HBD+vcZMHB45mCn~psDkB6RCO5PqJTn5e zjAG1yN~>%e7`mBsPXp_4r|#h(cZk2j_hG5P|1iIfOi4RmM?wYe*ph+Y(4BBdDQKJ8 zqRg$1kkn`6piCXHJ%AGddQkv57I*sD8+i^B-lf4zAG0^A_r}Ot@;CB@A%RJ?6mGn} z1@3k$0m7~#@U`WB>99Ad*)8{1+28d<2uI9{Wgi@!E;ceay48U`d+VwjPEpTP zb1mRHfombxBCZp;YV)2%+J^43^0kvdvA0wi8SLu^obeqchM+XDvwsqtj`WpAhk(!W zCOzIgHaXy zogCdeUfSKdWLq>g8kI()ZR^L!w?%tO!;@w2Wb#wgD!$;x;;16vwy?+3kO?c?Pg z;Erii8Sihm9<=q3gY`<=;MlUR?Va5N%a`}{l{!~-baZZS?`Pg=c$QTr29|ZUEpO|v za^>qZ4wbg?$^~JQw~e;m#3fkMbY)ihhqKa;C+T%Iu_5mrV|ym{?JjSf93QrxoIkdQ zw|mB*hw-u9W0jJorAC^!eUsy(qI-=h$^PMTX&gFd&Q0!S5|rJuy%-tXq27&__ipVU z8z@u9;3$MPIx)!GNx5}Td19>8N0~uh?JHN{ z3>stLe`lu23%I|FdzO27PkD5rvU#!(m<9)Slqy??2S)}cn0*Y}W#!$&`z~Sb?kSH~ zCi|gKy0o{nud;q*_r$*SDysgMn7V^~;wf?Z#IWxkqrcC0DEBgmW85vCo7C* zM_Z?jrY0Oi=^dSQW4VOB9LLUt*TIROTnt2IK#V5FqRM2SO`b@IiN@&3_TjO;>ylY? z1swx#>K`|+nOYjSGF&ZOFXB3ds}!9#SlK;X+7}Iu>>e(U&~dmHlssOZU|b<|NZL>w zO^!ln<^GBC!0^5q9OP8$X&;A2^tZ1r_pK;xFLNue?uU5$dRF#zcXo6vA6U6^`^r*B zd7#w4dR4ijeR!~Myae4dna299-%JChoqFDyYw|9n&VQ=&ygA$xX|olo@9ovFRC;@p zcfGw5LA||+4C?K*S$n7qN=Gf7K{M)FKe}h;`)ei1lDZNOaMsKmj*5UogF#j!n{z6N z2NOZ#y}cuq9lgC9r>R>rBbmN48h?pMZ%26}4DdPoDbZ8Y&zT}B?cN~(oL`s8xKTz%;94QTx zRocL_$TNQsU@#Ie1mi3rOHDjhh6i`=hDw~Qn^u6G@|(`SO8YeR zBpQT?TbS>cY5PUA{aak(y+Tc*L*023JOSJ%dZ*OJ}^5yq6?i8u3rkxAS-> zDV_Gw6#6I{tUwGC(cow#l|N#@$g_>SIquuJOVb@LRVE@=U|_6V8C^UPjg%((cdi?o z93D{0_;yrP@uTe;KGo-W_fUuA-o;~)A)9X~jg})?c249ymbCF*?izcSiLsyPjVSK@ zg!d*t8{OE59Y<$J-h9$|zAL?T_xNCcxi@O%o$^MftE8~vd1vuXbW+vsdZ&i~$=}w& za$_edkug=xw&~A^V#XSx8>0?s@as$+kBmG;i+A!~W3|!I`W8Uxjgo{@M6I6&asp!8 zhbg16`Z{;f+F{FD3Df_8p}#!12X$ck_}GZ1aAeANZ`2lT-YNV?eaz|TJU2<8dFowF zz0Gr)Y;_`_E*_iMAguRBN<{{W4SUU4KmpO7!BRSG-UXD`TpHu9aj9?@ZJFGfMuGQs z-Z%0di95M{`(XbdicGXY>jKaFDBrYN+E5yl=DykRL;6eAGLA=R)f!!v&2{6Nj;YXNvyyxf-$d(LX;Q;()~asK@oo{{1bYW}@q@i6`eS>y zR$%tPSDmsATkB5~y`vn{lZ=6U~3z87oqe?KWNwLR@`Lz9DH2i(iv=^?2gO1>>g z?z8JdDY>LpwV17>Xn<1L3+8tqF^9pH7WgLC^nHe$6LPkWRCWM!jeg8Ba;9p$jPDu; zU2R;yuFl#&HeNQiIXF=sZ-@I1PE^`U{r!_8#tpr1((lWu|E*k_ThDW;(6b%y(z+x%=j^BxIL@2b z1W=+M{ng;>@au_GP_i0#yrehsk8(7beu8AvPaOb;p@X#ogQexj^Xxn7bY)^046?JW z%SkE>04y4{PJks%+TsR|&%zECRqEea9++OHM379h1ESm=0b&ZRv;`KNiC(aG5Isa| z3fO#WRc%?~J)ZROpSf!;{FuAOvIbuxD6E5U=9xrBo;Bos8TURe@q{$Jb5?qER{Hu` z>6>SzZ=03gj6hNSXhpHjJc`IZgKdO(Mk*aKB~2ABwDgu5tc{EYH=s*THkL>~Szj-i;vCBtx(Sq1q3k9$6Xj zDa}{WFT9x7TKb}k(UU0Asfjp6drLJum(ZL+#~d#qIO}14w*!~--;Z-wA0FW@J>+@P zXR_)rgA7!NQZV^p6jkb;|Qr@lBeZ%5`y}nfDKI z@8&YSk$Vr~*4j<9_nPCIyc@Xwpyv7@&%eX< zCa&i>KK(~Dan-CHYWV3P^7>g|=m*Xx5s+=%_aICqaBF*RMMU zhci0fcfw4gT}AFHt~EZ*JWI_ z?>Em%Zz28b;-*TU5M=wv*nsHqk%bO7_l2p#0nMV6r|uJ0EiCy5(E3aVGbt@Lsl{ou zsL4D1Hv!KPlwHPl}mJyPJ~~_u=RcF5_9}9chz+`BUIr;w}?ygq{gqR5ef@e zRga{OrAhv?xoa+L9vdmwj-6nav90!Mk>=Y&`*DDg& zgKJYG?s@kD@73JLxg;#obUlcXP^(R!Qj;$7eMwFFZ%NAymgfJ~tn_zCH`aWAYS#CE zp7s6TW_^EV*7yIO_5EkFzK3XiweaLf*S6m<>-*eU-;bU3eg3TPt+Xd$mG-xjbS*xV zmVq<h3V*L# z1en;~S=v*MIwYohSQ230K<-MV$3A3c!2X>~yrr%t%*g4I#L4uESBaWDalsS|_W)Hb zmL4Eo+pABK7FI4vylBzho#oM}I_X%SIMYg$tZ!XA)AhfbvYI6ulVv3fuAVDN%Y-EE z{Zg*q_;hvaIh(H6G`ra<6;(?%R=DLItiw}QacF;%j#Mygkv}c3rJ6?fc}ox0qV0Gx zB_{-6p{23nB99A8cihUg{EnjxQyY)L8M{49Z4qCkWtVwP>=?YtM^ zd=TWH%l-1Ib2vhA=o9H}j|RpjBudh}caT>)_DsLZ-koE^ntr9aV(F8xV|)^iQBI-;8E zo!Vr+^t4YBHyYCyaEvCI%(#@CSU!vPh4+3gtrgExR2BwOVhJ4g6!l?7(GulB@@mY| zG9{ihxzqG(c@|TY4~zyjC62C1o<)Y1Xd^~G*2 zkB`?x6G8TbmYd zOVgrJ!J5on)&~RFr>&+$wFU33F0v{uBlS|kc*{j+o_ASqk7<`(nN@r2HK*F#^i0IA}ob?BIKTp zTmwiHShDkYCBZtWL3M9=csMmJAX!QTDYXteq{76O;$ZodNh6K$ty(PT5% z3j+hLoFszplrvn^mu!bpP{p4#&vk9%(wyt#690F4v4rNZXjtBEg-&iYO^8vPk#KAE zGR{};G1`#KI#PMab8HkvfIvuBN9~K6dX8DzWKpHo&d$k^(kKOLzW4B5?IgDTEn{Og z*QzslXKDBD@+j0OBH;fLQ+NlIWkY|(OWIya`5wxrI4QuS#k14&sYyCfx-TeIc5WCO zN3WTdgukc>?~}A~W=);vCUrU;#Jmj4v1`CV;9C%Vxk|$k3+Giw2A(<_mZ8+v)P2q@ z__g$^?awQc^koEvGKY8L(A88_Yy_br_qpc>)h6 zZK6!Y>jX{;9^dD;HCa?~T2A_)%B8wBg3O|DH<3@~m2{DW15aw^K55GsXXz_krmC$w z?%T^EQ0%X>jkprZch!`y4DLYjnM4nS^cnX1_%2zK*1r>iNIrRw@=eR!1SW>ppt3O3 z+Br5bUH-BJJoKW{NK)tKv`I&3hfp4-y(Ho?wT)5Vx^}07o;SmQ+#7A1DT*NAv1^+@;UDyjpUIr9w1g=FyBk$#>x+%{Luu;TBwc z@}5ZATbGC==UCJ7wYuP@I_FtberXW76vo9d8bd>?_S_r0P)>@oawMy@LzN@e26EsY8O% zl3cDLSL;>{AVCUJv-MW-^~6l*?Zru83?gwLLB!<~+j~;#Dqoj8orgNo9^K9AmR=;6+o|OV>;?^JyHP zr~J`+7OV5>wpHdUSJG53uXUv}<-Y@EM{-dMM+L8^gLntug}V-}`*=oNdQAE;jr}J` zix<9)J_*Jogr8+-62Q;9T3Xh6DNa9H#O$Cp=CC@OnQugOjgMcVHfqa5wjT6vVMvZN z+?XYe`s?6Y#&tT^Vy;uTu3x2|dESdRUvhDT;6fQfjUFjQrR~xIqzn%$ z{LyG!Iuh#v3vZCBJi-p9YC)|Y_U^=6V$RM;;Yq`i3&iWmPJ*+srcSG_&7$&X5j7H( ze-e7r&L0*4I|pU{($YiA5jAVgXr;y5bT#I}N~GUgoJrdyeY>=>5I>gg!m^~4F!Z*R zZYR+%p>Q*;IZdMaNenT~=1fV|PdMC52*HZxCaPH5`eZ+XTSinnC`e3MpR8l zs~@w^mDxA}a!b*+iSfxYj+<@7o>cT8RXW-xJ!jiMiHtcV6ML2()=FWXhoT+oK8 zjo#tj-EGRRb{ceA_dBRl(&~l8LgL%?-cH+EQJ%t8$CajU;JKwHy`Sf$ zTx(r~A2WNqtxA^mI?4Ki!OB>sj_C7fs~;Hto=dRW0_m4@M1PX9r&C6MHRE;2_&(2m z9O_lAanm%M>D)AL28P94lhTf>w)Vp~Y1o>Ox|-6mq7AJO()1tj9Mz;h!E^7dw5U7H z|18gP^VFuLiKpqG@vK!=ZMwN8eKcZMxKF zo|mMj{e)P#6x&LK={;vTO+Kybbn;5;Pt#|nWs}v4iO|Zvkv@12On&=z*$vxR1ts-7 z!(Fidj5|e>Xsv;0qI_Ld;+bc%6m>1@vzXHak~VMt*)F0!m0j{zM$~Z;@1=Rot~=F+ z4;}Ss2a0()&FN{jn%_8S&T#kxr@TCW!X^4@Zh6rur=GUBb;;>xEM3;oxqQXSRbAaZ ztJlP9*PXY1!}%9%eDQ@Bz2xFemtMAc%jH+R^s1|0wyo6HKTzH|xNB&5WcRh>GxJ@N zWW17`mT&tGmveNCyp@T`J$tX)_sZ#J&RE*k{`_iaYoD&|*Qx2(DKp*TvaQdr{2A>! zo#Z+HJU<9C*<8L*S6^&6c(8HK+@^U)9evEP$GK9+&tGuD!bK;ZbaG@Pc`zBugUdjS za<~yac#tveJ@c%C2hTp|Tvzaa-oFO9BTu?=cG7_v_?gBIcySqOv6IrdBbxtt7&z$p znw;u=br@@?V@B^!Sm^pUO&c?NzjD?8$o@}vHvzw4RoUyl^&trSAB2W;4j%j! z>Hpk=|L@R0y+3&Fuh{>C|F`#l%em+_Twgn<$-9$l3)eAvK96f1*IKTaYYi9q_9C;> zkecgw-p5t@?vuk5b3bnj- z$rRbrx?jh0>dF5lf=|6?=$HP|lMp!Fz-=lU)9x-gh6gw$fjxH|KVutzlig+4pO5v3 za@v8hg!|+u*6s2Rw?)xe_RMXXJYuS0z@2kv*48NAZ)eG0W3a3mW#vV{?l?(s`T%xn zV$*R&Yw3<{#km^?6O~#uD70Sh@c`~4*XR%%BZ%o+Ho);U{TQxzBf|);ZZZylb)9YF zwz^uZuNa>fuQss1vRapX>!+Hvx8C`WmyS|34y zsn6aFVTMKvi;=?@PqQ{+o2@sJku!aEK2eMy&LM>v3D8Dy&5w-_8MZLajSdjSI1SG5 z7(Q~k$BKmQ97$+{?MQ1ax9w=-ESeF+fbuO7%`LMC$C?@_oWcrdgOek!BHVFiJu~0E z`A4hool&itoF2EmZZEDOn81Pwf(H^hHxpi^Z(L_7MY{*_ye7S3FY2h-nJbC0ZVwhi z;W2%QRR;g3n#AlqN)O8e$%BluB_^~Z0cwHaVwzCkmj#V6CN22|74t?Oo&XWBgcg^3!%qgbV;Fv5vkCA5~dA4;q1~%{6tGk3x1C_g2)(4qizquA zhcLf(*)rSP+OS|&qgr*G)KH~;dI0aFyzDok5%nFBzf3F-{xnFW5kVbp6h{cN(Y(Tj z&9oD>!WCQi<13m8){Q&!65j|zQkSd z=vkNMn!YLTX>R37@AOUiRi|*Lu@#?KcR`c4g6l-C0@u%wzu)Kj z2G>`)9^!fjyyAttZlnG^T-&*>;9AGk$#n|Xaa=yvk2W@W|C{TtxgO^F7}xu_?%>+R zwVZ1KSHSgS`tdJZ-{tx%u7|kZ$MsgO+qfpUhPf`~dKWkl-RpWc*L%2rm#g;uU8GZb zo!(r<8E%}{)z5syZBs&_Bd#k6bs+z?O>QI2dE7NuwGl&}yHXOe;h3>D*Z;z!sSFm1 z+Pssk^H5l}kI2dR7;TCF4A54@{a-)(=_QBe1?EH(T@qEQhg+cdq3J}e2;yy}iER<5 zW(hQ%I%hB2FLgX{K6la6PiafC=-H%y=Ri=Rty;X@P1^P~I1w@9+k5%80T!r806dU( z#@Vl+UnWMxL?3Vg!NM$aesr0lgDplR$t5j|v-XJULHcdCZn0%v@d>kY4eRaUbEPVj z#b77my6VtLxSsR7Nx9VS1mo~7GSRtxmbA5buer?0+qI^bzhrX4b>1Nwi7R!sPsfN< zdYxO8L19cR{8MgHmytK%?|syz`=4+Zzv$(~6&F=d= z?udNvLn_3d%6ynBt;dd_DOZ}$KKtxLR}9-)ZNp2%DHb~?mTaq!Yy%9TKiihpyO(Ar&qvC04|xQaDoWvcly{K1!JW#s`$>O<>jADvf4^0~ zw03shv`Cgt*km}Ar=2AO^!+bh%i_@jbAxUPeP3Okl} ztms(Tv8to1qr0Q0V|8aoXJ_Z~&J~?2J6Cmfb#{05bgo|BvAlEn^5rX*uUx)rdDrsp z6)RS*Shb>SMfZxH6{}Zvtn6I5eC3LjD_5>s*|oBJWzWjht2$P7 zu3Elo#j2I7R;}t<)xD}`)#|Q}uFkIIT`Rg)cCG5_>gw+5=~~_0(cRg-yn99W%I;O& zUEST?J>9E&I(j;LmiMgaS=qCyr>m#Cr>AH2YCv2~^Q)d>J)9eF(-ofCDg z<_yiG-`@l2;#s1N6lWjf`Qu!_&vjVTxkau#&gN}?>E#ZGHzAOuo22PmNlVTiQU?dS z^s`hhkM!>xXAIs&`G|Zwx#Uwy(>L>cLQPtHTd<-FGJ~Ce+|3oOg*2<&7x4&dLa&_j zDf$6zh$er|y`@@*j@NKCbX?&gGt%#_y!$pCHfU3nLKZ{lZK90&x1GEAqW}N%pBI1O zBcJn%EBNt_=lBa}{blsW)};q1`u$^H*4Ebca&!D7n1v0^U|GWHHtY{qy7kJP+=YX5 z{`L|1IVux_P}{19CC)u0glcg@*+(cNJ>@UCi{}1@yEs}}$8^kvyz7ota`N1nk=VL? zNfqs4k6PV+x+Mlt3QyssF1oLcyY!zf?zx(}52Z!6c_ohI0rE;;$}=ZUt zR$5wLLcHX=gL0DD(#50)q-oJ^7nkRU*=#Nsn; zy5s!gGxPlg;R*SL{-WUIcuYbdv-u!`&ed>=s|AjC9**`q_ zy@Ot6-cd_BS9bTFdG^K^zx==(`1s(b{^$#T_LZ+b`8_YwILE&Bp1FR*#uvY0pnTv> zzw_=de≀^Oo>x7&;VWO=c=07yUiFHtuX)28KlTTo`0VGt@TXs& zciizWyXMFL`SXKQBiH`Jx8|HYI=1M$*A_}E`O{(RVV)m!3B!g=HZ11+Imc!% z&M(YgnGbTuH*CtR3zvm{W?pV?LvQB9Q@2JVnO&z&J(|7wqu~j;n|~Hwl|Qa-e%&z* z$29E9)#pygU6ns0yPcf0$?|ex(bx+}}aBg^3zNc_T_U420 z<`>%MEeo6HHqV{9J#+Kh78H-Y?apj__RM@RXMWw(XIds2rvB!HhV0bA?9{g!{{7uy zcisMLj+y#oVd~Gb_4CgR>vKJY4TXl>MDe8X>daMjQ@6}tRDWFEMVYDB=00>!!||EU zyEFU0aaz71o1J=p)BYdj{pj=@Utgb@`b@YmoZIN}>y~sb$ma7wp->mpXN$p{Op`w^ zI4XPeykq=hgX4n*jf=7;7Ebn0@pom0f(OEn1rG&Z4gMndTEk!0{Y~)o;2ZuE*>4Bm z&pZ|UFnT)kliei3t@^xKjpL4~3JoXov zW9D~tUvcG4AN$>lF(|!5+Gtb#R_{KNS8{7KXAO7prea}35aPyXT{!Ux_;?~RGeb?RZyXW5f?*G(7 zkK~FC$DY`G?)ppLfA5#Rd{=(K2`#6dbME(l@UI6y|AkESqEk<6UD4Bf!HX~2v>Deg zw70FlynU#0-3>Rr_MQ(u@X?1K`^W>MW1o4;D_VXl8)lY;+e5#-ZR+L|!_K*jGN;s? zlszMRUS`heQy4gcxD!rWbjn4k9&pADJX0|?eY0l3!h1sds^__GQ9uV`6ctj{$b-J7fLTADe2>JQHv z*xYbIUHyjj3oj^aZrqr!pZf8J`V+(RH+F|}3iY|w`TG4`3-V`%i>~nJE^oZ$ceYO! zryhCjMg5HjI+~7q;|Fg(|L#A$d3FBu%r&{w>NnK4W{+(%+-gbW7#9326uCEk!AG_g|nhICeEtq=s z{`13Et(|-9flVjpa#MeOM)sU$fA_NRgiNr1&B^n6v;O|aPQUpdr~Y%vMVb0caLc^& zE;@VakI%~anai^aR|fm%EX@owTv0#uk)9J9muBji5xJ>%-tu^6Uf3A!&1}svzveb% zdgxqhq2=QJTN+LTmaf7avexCN{`}PX1Gyve@PwCdmFW~Vt_@FwIF)Plpa)^yrn*-b zFlKGtI=Or6#F(vjwxV6k)SdnpWwyMc$!uhscy6spU&FIxrIhhoGLiSD>^AS^N8jZg zb$oPkL$vMWe_eXl8K-wdOUK^-#M0otZOcyj>9#iS=TX;t4sPrEng8uBzrMNql*Vs& ze`ro=b^H9gS9dHbUGN_#-F?xTm8DHj@4EZaOU9Znd-p?kU*>(aw7L8jcW?H-(Y(cb z;@g*hgY5Z@SvsO|b4V6qbPh{0oX5$2R$8xLpwVnHTvd zEqqzAx312gpYiKp4%supvkIrr_oHqKWD0P#e0^}D->c%80$J*V6Z{}p4HwA-a8duH zAmrDQe+LqPHm@3kLasjWJ5KJ*bdb*a zt#u9jgaR4D9zIeq>@5Vr+e5$6&#S>O_`({`|C44fe7(Od@^XWLm+|>A+)V*m0I)9z zvi{qG6OL;1Pb(}awuK$^EeIC->%e@#k5Ux;c7Fx6@{?Bd`}CmT|4?Z2SsXPrX*uM7 z$A4?q3+ZL1HO%0($HFpX9tPeY>Gw+`ro|5$o=kPn3E9;nE{?<^a z1S$Tz{jhMXVb=GL^XKHl?4K0Wnd603#!C78;Gcml$9-XNc|mV>2_JkdhYV`gtMh{& zG4fD^e+TVl{HVS)XCsvh!Zr|&B1P`Yjsp~Gd1a0Uz&X^WrhI-XE?Ak(>dDW|^$>WT ze{SYd-g|Aq@hH=Th7<}x{-n&Eq1T;RUhwDm$7TJw)H=^<%ntZ>QReIn7|4(0y=_xZ dJ3E7c-ydyihA*N`5zmTW_L^4j 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�Q^m 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 From a81cfe3ddde78b38faa2114b32b622fd173ce2fc Mon Sep 17 00:00:00 2001 From: Nicolas Lara Date: Fri, 4 Aug 2023 16:20:26 +0200 Subject: [PATCH 08/18] Nicolas/swaprouter lints and bytecode (#5962) * fixed bytecode * remove redundant borrow * updated bytecode --- tests/ibc-hooks/bytecode/swaprouter.wasm | Bin 247235 -> 244908 bytes x/ibc-rate-limit/bytecode/rate_limiter.wasm | Bin 264433 -> 264325 bytes .../contracts/rate-limiter/src/sudo.rs | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ibc-hooks/bytecode/swaprouter.wasm b/tests/ibc-hooks/bytecode/swaprouter.wasm index 1c81566618ac9e66c579b9dd02ede8ac3ee5f665..124d0313572dea4ae216f5f37eaa3e76b752092a 100644 GIT binary patch literal 244908 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 z�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
-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 literal 247235 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 z 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

0IecYjHCSJUf-Odym;}avIfp$-^%S&aLo_E z2kNW5W0#S^PP)MfumzdvObZZ#Bm6`}t!>$+zU?Z~t#>9X>w!ZDyh35XIszjGsR`}T zG<|kLww-bI>Vv{2*X_taXrzi2t8KX;BX-@hb1kc(9TA;1=rh1#Ac^7rWB1pdX%Pss8ns4mJ0 z7Meg7Lu4C3ryV-;IwCoUcBp2KHhx`MLATr525-(AEoWU zG}gd0rRO7Vpj*#Uxfm zX;#b%ZPS7PnYIb}7@mk0M)0I9-eei220YA44?ASu03>@1HVB-DUrA4> zll9QEc;Aw$+C&AO^Y9x=JtahGjIem0ef@yGj_YeN%-c#|_vz~_U$JLu5cBY1y;-O9 zqML|z#8k1ms~mKAOew|~^=4~q(6!?eVn&rP@ffqNG`TJ1w=QI{&Bhs)aWr@i^% z?=CN9ZtKXkL3WnO%V_%OpLD-K@OruLLK(&0P`(~N+#E|KmPwhj#x&(*o~ixu^6j36 zVap}c7~Nz=Y_adg5{siAK%p#FP+Dw54p06A(Eg`k-%~8AeoRanqy65&!~^qVZyBta zulC=|sIR$qfCnXti!|JhR);1vqt7@(Y)v&eS9~|E;PMI&mxS*zU$m4o*1Mfe%(ReA z%)CS!=9V4usHnIV!BZ)+6Yl?sM`Xj3VmA7xR_+?KXT~yZO@#Y|4jy|LTXRmqE7<2x zOtMMy;R{`hUL2-~D^KMt0${A-La1LB3oFct)HJ3kbxxtQtlSBUWxeuc*TVhK%=CyN zcHK0){rfXYNVbK3k0-=yNyAK5;QeA=9Kcv6O0=VJ&%*#thUH`hy;CpD1l$RmcVePv zF2|}K*1G`{4=UaHLVni}t?*SicIcqc+#6%>*Xlh0E@gf$Va1lh4sVJ%*VQRldaF~! z4p|xN>l9@pg&q4G%ebIUK}3kUjCP|P7uG4-jTB>z6dURkV~rFB$ym$AI>mTQ!MS`p zano8m|DxNgHS<^BzOPz0|9pPe&(HCD!Tf;V3yE*Iui7ww;qCiyaoafGmqwb#?xA$}0f34KptM>2Px9>{OPvGt}I^n}W zbO+u~G~N$~K~CRk7$zGjhQlz~NYQPi7!E_Xkz%TmVmJ&_jTF<36vJVdZlsuLq!-?2IfPQIZKN0u!`eoQ zb&V9mVOZBlvA&UFI1Ge$sB5{PkzzOu7c^2_*hn!Ph6@`hHZ)Rb7+ww2D8mM&U>YJV z(UEIbbNPQXs)z%!vC-J(fNW~K9}dW-MmIM%QVa)Vb0fu;MvCEpY-yy}+DI`R5RO)^ z2jrqgis67<)JSo0BgJq)E^ef_q>*AcAeShG4G19~jM`^GvVXh*VIFTHoy!9Dst$@c zRu*g>gOV7!=uzFY2KV6aBw?c!71~bpm3{veiGFF=CpjdE?xtHQ1=452;s^Qs{BVei z3w#$-;lU)xB!m%vg#KZMs+)zuEPgskHkVR0SVKps%K?!+4vG0Qb zhGncKFY#+>q*zT}j{FqUZ<* zOIbuQ2em42L1CF{6ueWTY5ES9y6~umvN^Vg)7U2c=wy0
XY%Kahfoh;ij$jt1h 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≀^Oo>x7&;VWO=c=07yUiFHtuX)28KlTTo`0VGt@TXs& zciizWyXMFL`SXKQBiH`Jx8|HYI=1M$*A_}E`O{(RVV)m!3B!g=HZ11+Imc!% z&M(YgnGbTuH*CtR3zvm{W?pV?LvQB9Q@2JVnO&z&J(|7wqu~j;n|~Hwl|Qa-e%&z* z$29E9)#pygU6ns0yPcf0$?|ex(bx+}}aBg^3zNc_T_U420 z<`>%MEeo6HHqV{9J#+Kh78H-Y?apj__RM@RXMWw(XIds2rvB!HhV0bA?9{g!{{7uy zcisMLj+y#oVd~Gb_4CgR>vKJY4TXl>MDe8X>daMjQ@6}tRDWFEMVYDB=00>!!||EU zyEFU0aaz71o1J=p)BYdj{pj=@Utgb@`b@YmoZIN}>y~sb$ma7wp->mpXN$p{Op`w^ zI4XPeykq=hgX4n*jf=7;7Ebn0@pom0f(OEn1rG&Z4gMndTEk!0{Y~)o;2ZuE*>4Bm z&pZ|UFnT)kliei3t@^xKjpL4~3JoXov zW9D~tUvcG4AN$>lF(|!5+Gtb#R_{KNS8{7KXAO7prea}35aPyXT{!Ux_;?~RGeb?RZyXW5f?*G(7 zkK~FC$DY`G?)ppLfA5#Rd{=(K2`#6dbME(l@UI6y|AkESqEk<6UD4Bf!HX~2v>Deg zw70FlynU#0-3>Rr_MQ(u@X?1K`^W>MW1o4;D_VXl8)lY;+e5#-ZR+L|!_K*jGN;s? zlszMRUS`heQy4gcxD!rWbjn4k9&pADJX0|?eY0l3!h1sds^__GQ9uV`6ctj{$b-J7fLTADe2>JQHv z*xYbIUHyjj3oj^aZrqr!pZf8J`V+(RH+F|}3iY|w`TG4`3-V`%i>~nJE^oZ$ceYO! zryhCjMg5HjI+~7q;|Fg(|L#A$d3FBu%r&{w>NnK4W{+(%+-gbW7#9326uCEk!AG_g|nhICeEtq=s z{`13Et(|-9flVjpa#MeOM)sU$fA_NRgiNr1&B^n6v;O|aPQUpdr~Y%vMVb0caLc^& zE;@VakI%~anai^aR|fm%EX@owTv0#uk)9J9muBji5xJ>%-tu^6Uf3A!&1}svzveb% zdgxqhq2=QJTN+LTmaf7avexCN{`}PX1Gyve@PwCdmFW~Vt_@FwIF)Plpa)^yrn*-b zFlKGtI=Or6#F(vjwxV6k)SdnpWwyMc$!uhscy6spU&FIxrIhhoGLiSD>^AS^N8jZg zb$oPkL$vMWe_eXl8K-wdOUK^-#M0otZOcyj>9#iS=TX;t4sPrEng8uBzrMNql*Vs& ze`ro=b^H9gS9dHbUGN_#-F?xTm8DHj@4EZaOU9Znd-p?kU*>(aw7L8jcW?H-(Y(cb z;@g*hgY5Z@SvsO|b4V6qbPh{0oX5$2R$8xLpwVnHTvd zEqqzAx312gpYiKp4%supvkIrr_oHqKWD0P#e0^}D->c%80$J*V6Z{}p4HwA-a8duH zAmrDQe+LqPHm@3kLasjWJ5KJ*bdb*a zt#u9jgaR4D9zIeq>@5Vr+e5$6&#S>O_`({`|C44fe7(Od@^XWLm+|>A+)V*m0I)9z zvi{qG6OL;1Pb(}awuK$^EeIC->%e@#k5Ux;c7Fx6@{?Bd`}CmT|4?Z2SsXPrX*uM7 z$A4?q3+ZL1HO%0($HFpX9tPeY>Gw+`ro|5$o=kPn3E9;nE{?<^a z1S$Tz{jhMXVb=GL^XKHl?4K0Wnd603#!C78;Gcml$9-XNc|mV>2_JkdhYV`gtMh{& zG4fD^e+TVl{HVS)XCsvh!Zr|&B1P`Yjsp~Gd1a0Uz&X^WrhI-XE?Ak(>dDW|^$>WT ze{SYd-g|Aq@hH=Th7<}x{-n&Eq1T;RUhwDm$7TJw)H=^<%ntZ>QReIn7|4(0y=_xZ dJ3Eg4OgxKVaww6DsmyAtm_xpF6X= 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 EC%DR;TL1t6 delta 4886 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 diff --git a/x/ibc-rate-limit/contracts/rate-limiter/src/sudo.rs b/x/ibc-rate-limit/contracts/rate-limiter/src/sudo.rs index 36a16f638d4..80e6985d578 100644 --- a/x/ibc-rate-limit/contracts/rate-limiter/src/sudo.rs +++ b/x/ibc-rate-limit/contracts/rate-limiter/src/sudo.rs @@ -21,7 +21,7 @@ pub fn process_packet( #[cfg(test)] channel_value_mock: Option, ) -> Result { let (channel_id, denom) = packet.path_data(&direction); - let path = &Path::new(&channel_id, &denom); + let path = &Path::new(channel_id, denom); let funds = packet.get_funds(); #[cfg(test)] @@ -144,7 +144,7 @@ fn add_rate_limit_attributes(response: Response, result: &RateLimit) -> Response pub fn undo_send(deps: DepsMut, packet: Packet) -> Result { // Sudo call. Only go modules should be allowed to access this let (channel_id, denom) = packet.path_data(&FlowType::Out); // Sends have direction out. - let path = &Path::new(&channel_id, &denom); + let path = &Path::new(channel_id, &denom); let any_path = Path::new("any", &denom); let funds = packet.get_funds(); From edd182268a5f3efbbd03e63fe2a52c93c9de29d2 Mon Sep 17 00:00:00 2001 From: David Terpay <35130517+davidterpay@users.noreply.github.com> Date: Fri, 4 Aug 2023 19:11:32 -0400 Subject: [PATCH 09/18] fix(ProtoRev): Updating Binary Search Range with CL Pools (#5930) * init * testing update * changelog * comments * nit * refactor * clean up * nit * comment * cr * cl are not symetric * smh more symetric changes * simpler safe swap * more stuff * more testing * adding comments * updating max range wit pool liq * updating readme --- CHANGELOG.md | 1 + app/keepers/keepers.go | 8 +- x/protorev/keeper/epoch_hook_test.go | 6 +- x/protorev/keeper/hooks_test.go | 6 +- x/protorev/keeper/keeper.go | 29 +++-- x/protorev/keeper/keeper_test.go | 31 ++++- x/protorev/keeper/posthandler_test.go | 29 ----- x/protorev/keeper/rebalance.go | 180 +++++++++++++++++++++++--- x/protorev/keeper/rebalance_test.go | 171 ++++++++++++++++++++++++ x/protorev/keeper/routes_test.go | 4 +- x/protorev/protorev.md | 2 +- x/protorev/types/constants.go | 4 + x/protorev/types/expected_keepers.go | 16 +++ 13 files changed, 418 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d78d7d99a3c..c7556ace890 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#5831](https://github.com/osmosis-labs/osmosis/pull/5831) Fix superfluid_delegations query * [#5835](https://github.com/osmosis-labs/osmosis/pull/5835) Fix println's for "amountZeroInRemainingBigDec before fee" making it into production * [#5841] (https://github.com/osmosis-labs/osmosis/pull/5841) Fix protorev's out of gas erroring of the user's transcation. +* [#5930] (https://github.com/osmosis-labs/osmosis/pull/5930) Updating Protorev Binary Search Range Logic with CL Pools ### Misc Improvements diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index 38709d660f2..c46085b0648 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -357,7 +357,13 @@ func (appKeepers *AppKeepers) InitNormalKeepers( protorevKeeper := protorevkeeper.NewKeeper( appCodec, appKeepers.keys[protorevtypes.StoreKey], appKeepers.GetSubspace(protorevtypes.ModuleName), - appKeepers.AccountKeeper, appKeepers.BankKeeper, appKeepers.GAMMKeeper, appKeepers.EpochsKeeper, appKeepers.PoolManagerKeeper) + appKeepers.AccountKeeper, + appKeepers.BankKeeper, + appKeepers.GAMMKeeper, + appKeepers.EpochsKeeper, + appKeepers.PoolManagerKeeper, + appKeepers.ConcentratedLiquidityKeeper, + ) appKeepers.ProtoRevKeeper = &protorevKeeper txFeesKeeper := txfeeskeeper.NewKeeper( diff --git a/x/protorev/keeper/epoch_hook_test.go b/x/protorev/keeper/epoch_hook_test.go index d3f135514be..81b8f44ce66 100644 --- a/x/protorev/keeper/epoch_hook_test.go +++ b/x/protorev/keeper/epoch_hook_test.go @@ -152,8 +152,8 @@ func (s *KeeperTestSuite) TestUpdateHighestLiquidityPools() { // There are 2 pools with epochTwo and uosmo as denoms, // One in the GAMM module and one in the Concentrated Liquidity module. // pool with ID 48 has a liquidity value of 1,000,000 - // pool with ID 49 has a liquidity value of 2,000,000 - // pool with ID 49 should be returned as the highest liquidity pool + // pool with ID 50 has a liquidity value of 2,000,000 + // pool with ID 50 should be returned as the highest liquidity pool // We provide epochTwo as the input base denom, to test the method chooses the correct pool // across the GAMM and Concentrated Liquidity modules name: "Get highest liquidity pools for one GAMM pool and one Concentrated Liquidity pool", @@ -162,7 +162,7 @@ func (s *KeeperTestSuite) TestUpdateHighestLiquidityPools() { }, expectedBaseDenomPools: map[string]map[string]keeper.LiquidityPoolStruct{ "epochTwo": { - "uosmo": {Liquidity: sdk.Int(sdk.NewUintFromString("999999000000000001000000000000000000")), PoolId: 49}, + "uosmo": {Liquidity: sdk.Int(sdk.NewUintFromString("999999000000000001000000000000000000")), PoolId: 50}, }, }, }, diff --git a/x/protorev/keeper/hooks_test.go b/x/protorev/keeper/hooks_test.go index 76f620c45cb..17c3e683147 100644 --- a/x/protorev/keeper/hooks_test.go +++ b/x/protorev/keeper/hooks_test.go @@ -108,14 +108,14 @@ func (s *KeeperTestSuite) TestSwapping() { param: param{ expectedTrades: []types.Trade{ { - Pool: 49, + Pool: 50, TokenIn: "uosmo", TokenOut: "epochTwo", }, }, executeSwap: func() { - route := []poolmanagertypes.SwapAmountInRoute{{PoolId: 49, TokenOutDenom: "epochTwo"}} + route := []poolmanagertypes.SwapAmountInRoute{{PoolId: 50, TokenOutDenom: "epochTwo"}} _, err := s.App.PoolManagerKeeper.RouteExactAmountIn(s.Ctx, s.TestAccs[0], route, sdk.NewCoin("uosmo", sdk.NewInt(10)), sdk.NewInt(1)) s.Require().NoError(err) @@ -606,7 +606,7 @@ func (s *KeeperTestSuite) TestStoreJoinExitPoolSwaps() { { name: "Non-Gamm Pool, Return Early Do Not Store Any Swaps", param: param{ - poolId: 49, + poolId: 50, denom: "uosmo", isJoin: true, expectedSwap: types.Trade{}, diff --git a/x/protorev/keeper/keeper.go b/x/protorev/keeper/keeper.go index 7145aba4e58..ef7f0e75f59 100644 --- a/x/protorev/keeper/keeper.go +++ b/x/protorev/keeper/keeper.go @@ -19,11 +19,12 @@ type ( storeKey storetypes.StoreKey paramstore paramtypes.Subspace - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - gammKeeper types.GAMMKeeper - epochKeeper types.EpochKeeper - poolmanagerKeeper types.PoolManagerKeeper + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + gammKeeper types.GAMMKeeper + epochKeeper types.EpochKeeper + poolmanagerKeeper types.PoolManagerKeeper + concentratedLiquidityKeeper types.ConcentratedLiquidityKeeper } ) @@ -36,6 +37,7 @@ func NewKeeper( gammKeeper types.GAMMKeeper, epochKeeper types.EpochKeeper, poolmanagerKeeper types.PoolManagerKeeper, + concentratedLiquidityKeeper types.ConcentratedLiquidityKeeper, ) Keeper { // set KeyTable if it has not already been set if !ps.HasKeyTable() { @@ -43,14 +45,15 @@ func NewKeeper( } return Keeper{ - cdc: cdc, - storeKey: storeKey, - paramstore: ps, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - gammKeeper: gammKeeper, - epochKeeper: epochKeeper, - poolmanagerKeeper: poolmanagerKeeper, + cdc: cdc, + storeKey: storeKey, + paramstore: ps, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + gammKeeper: gammKeeper, + epochKeeper: epochKeeper, + poolmanagerKeeper: poolmanagerKeeper, + concentratedLiquidityKeeper: concentratedLiquidityKeeper, } } diff --git a/x/protorev/keeper/keeper_test.go b/x/protorev/keeper/keeper_test.go index 1c378d5a025..0cb50715022 100644 --- a/x/protorev/keeper/keeper_test.go +++ b/x/protorev/keeper/keeper_test.go @@ -888,6 +888,17 @@ func (s *KeeperTestSuite) setUpPools() { }, scalingFactors: []uint64{1, 1}, }, + { // Pool 49 - Used for CL testing + initialLiquidity: sdk.NewCoins( + sdk.NewCoin("uosmo", sdk.NewInt(10_000_000_000_000)), + sdk.NewCoin("epochTwo", sdk.NewInt(8_000_000_000_000)), + ), + poolParams: stableswap.PoolParams{ + SwapFee: sdk.NewDecWithPrec(0, 2), + ExitFee: sdk.NewDecWithPrec(0, 2), + }, + scalingFactors: []uint64{1, 1}, + }, } for _, pool := range s.stableSwapPools { @@ -895,13 +906,29 @@ func (s *KeeperTestSuite) setUpPools() { } // Create a concentrated liquidity pool for epoch_hook testing - // Pool 49 + // Pool 50 s.PrepareConcentratedPoolWithCoinsAndFullRangePosition("epochTwo", "uosmo") // Create a cosmwasm pool for testing - // Pool 50 + // Pool 51 s.PrepareCosmWasmPool() + // Create a concentrated liquidity pool for range testing + // Pool 52 + // Create the CL pool + clPool := s.PrepareCustomConcentratedPool(s.TestAccs[0], "epochTwo", "uosmo", apptesting.DefaultTickSpacing, sdk.ZeroDec()) + fundCoins := sdk.NewCoins(sdk.NewCoin("epochTwo", sdk.NewInt(10_000_000_000_000)), sdk.NewCoin("uosmo", sdk.NewInt(10_000_000_000_000))) + s.FundAcc(s.TestAccs[0], fundCoins) + s.CreateFullRangePosition(clPool, fundCoins) + + // Create a concentrated liquidity pool for range testing + // Pool 53 + // Create the CL pool + clPool = s.PrepareCustomConcentratedPool(s.TestAccs[0], "epochTwo", "uosmo", apptesting.DefaultTickSpacing, sdk.ZeroDec()) + fundCoins = sdk.NewCoins(sdk.NewCoin("epochTwo", sdk.NewInt(2_000_000_000)), sdk.NewCoin("uosmo", sdk.NewInt(1_000_000_000))) + s.FundAcc(s.TestAccs[0], fundCoins) + s.CreateFullRangePosition(clPool, fundCoins) + // Set all of the pool info into the stores err := s.App.ProtoRevKeeper.UpdatePools(s.Ctx) s.Require().NoError(err) diff --git a/x/protorev/keeper/posthandler_test.go b/x/protorev/keeper/posthandler_test.go index 725652e7e66..1897f807669 100644 --- a/x/protorev/keeper/posthandler_test.go +++ b/x/protorev/keeper/posthandler_test.go @@ -335,35 +335,6 @@ func (s *KeeperTestSuite) TestAnteHandle() { }, expectPass: true, }, - { - name: "Concentrated Liquidity - Many Ticks Run Out of Gas While Rebalacing, Ensure Doesn't Fail User Tx", - params: param{ - trades: []types.Trade{ - { - Pool: 51, - TokenOut: "ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7", - TokenIn: "uosmo", - }, - }, - expectedNumOfTrades: sdk.NewInt(5), - expectedProfits: []sdk.Coin{ - { - Denom: "Atom", - Amount: sdk.NewInt(15_767_231), - }, - { - Denom: "ibc/0CD3A0285E1341859B5E86B6AB7682F023D03E97607CCC1DC95706411D866DF7", - Amount: sdk.NewInt(218_149_058), - }, - { - Denom: types.OsmosisDenomination, - Amount: sdk.NewInt(56_609_900), - }, - }, - expectedPoolPoints: 37, - }, - expectPass: true, - }, } // Ensure that the max points per tx is enough for the test suite diff --git a/x/protorev/keeper/rebalance.go b/x/protorev/keeper/rebalance.go index e3b658929ae..f1df9655f2f 100644 --- a/x/protorev/keeper/rebalance.go +++ b/x/protorev/keeper/rebalance.go @@ -24,19 +24,16 @@ func (k Keeper) IterateRoutes(ctx sdk.Context, routes []RouteMetaData, remaining // Find the max profit for the route if it exists inputCoin, profit, err := k.FindMaxProfitForRoute(ctx, routes[index], remainingTxPoolPoints, remainingBlockPoolPoints) if err != nil { - k.Logger(ctx).Error("Error finding max profit for route: ", err) + k.Logger(ctx).Error("Error finding max profit for route: " + err.Error()) continue } // If the profit is greater than zero, then we convert the profits to uosmo and compare profits in terms of uosmo if profit.GT(sdk.ZeroInt()) { - if inputCoin.Denom != types.OsmosisDenomination { - uosmoProfit, err := k.ConvertProfits(ctx, inputCoin, profit) - if err != nil { - k.Logger(ctx).Error("Error converting profits: ", err) - continue - } - profit = uosmoProfit + profit, err := k.ConvertProfits(ctx, inputCoin, profit) + if err != nil { + k.Logger(ctx).Error("Error converting profits: " + err.Error()) + continue } // Select the optimal route King of the Hill style (route with the highest profit will be executed) @@ -52,7 +49,13 @@ func (k Keeper) IterateRoutes(ctx sdk.Context, routes []RouteMetaData, remaining } // ConvertProfits converts the profit denom to uosmo to allow for a fair comparison of profits +// +// NOTE: This does not check the underlying pool before swapping so this may go over the MaxTicksCrossed. func (k Keeper) ConvertProfits(ctx sdk.Context, inputCoin sdk.Coin, profit sdk.Int) (sdk.Int, error) { + if inputCoin.Denom == types.OsmosisDenomination { + return profit, nil + } + // Get highest liquidity pool ID for the input coin and uosmo conversionPoolID, err := k.GetPoolForDenomPair(ctx, types.OsmosisDenomination, inputCoin.Denom) if err != nil { @@ -132,8 +135,11 @@ func (k Keeper) FindMaxProfitForRoute(ctx sdk.Context, route RouteMetaData, rema return sdk.Coin{}, sdk.ZeroInt(), err } - // Extend the search range if the max input amount is too small - curLeft, curRight = k.ExtendSearchRangeIfNeeded(ctx, route, inputDenom, curLeft, curRight) + // Update the search range if the max input amount is too small/large + curLeft, curRight, err = k.UpdateSearchRangeIfNeeded(ctx, route, inputDenom, curLeft, curRight) + if err != nil { + return sdk.Coin{}, sdk.ZeroInt(), err + } // Binary search to find the max profit for iteration := 0; curLeft.LT(curRight) && iteration < types.MaxIterations; iteration++ { @@ -167,12 +173,156 @@ func (k Keeper) FindMaxProfitForRoute(ctx sdk.Context, route RouteMetaData, rema return tokenIn, profit, nil } +// UpdateSearchRangeIfNeeded updates the search range for the binary search. First, we check if there are any +// concentrated liquidity pools in the route. If there are, then we may need to reduce the upper bound of the +// binary search since it is gas intensive to move across several ticks. Next, we determine if the current bound +// includes the optimal amount in. If it does not, then we can extend the search range to capture more profits. +func (k Keeper) UpdateSearchRangeIfNeeded( + ctx sdk.Context, + route RouteMetaData, + inputDenom string, + curLeft, curRight sdk.Int, +) (sdk.Int, sdk.Int, error) { + // If there are concentrated liquidity pools in the route, then we may need to reduce the upper bound of the binary search. + updatedMax, err := k.CalculateUpperBoundForSearch(ctx, route, inputDenom) + if err != nil { + return sdk.ZeroInt(), sdk.ZeroInt(), err + } + + // In the case where the updated upper bound is less than the current upper bound, we know we will not extend + // the search range so we can short-circuit return. + if updatedMax.LT(curRight) { + return curLeft, updatedMax, nil + } + + return k.ExtendSearchRangeIfNeeded(ctx, route, inputDenom, curLeft, curRight, updatedMax) +} + +// CalculateUpperBoundForSearch returns the max amount in that can be used for the binary search +// respecting the max ticks moved across all concentrated liquidity pools in the route. +func (k Keeper) CalculateUpperBoundForSearch( + ctx sdk.Context, + route RouteMetaData, + inputDenom string, +) (sdk.Int, error) { + var intermidiateCoin sdk.Coin + + // Iterate through all CL pools and determine the maximal amount of input that can be used + // respecting the max ticks moved. + for index := route.Route.Length() - 1; index >= 0; index-- { + hop := route.Route[index] + pool, err := k.poolmanagerKeeper.GetPool(ctx, hop.PoolId) + if err != nil { + return sdk.ZeroInt(), err + } + + tokenInDenom := inputDenom + if index > 0 { + tokenInDenom = route.Route[index-1].TokenOutDenom + } + + switch { + case pool.GetType() == poolmanagertypes.Concentrated: + // If the pool is a concentrated liquidity pool, then check the maximum amount in that can be used + // and determine what this amount is as an input at the previous pool (working all the way up to the + // beginning of the route). + maxTokenIn, maxTokenOut, err := k.concentratedLiquidityKeeper.ComputeMaxInAmtGivenMaxTicksCrossed( + ctx, + pool.GetId(), + tokenInDenom, + types.MaxTicksCrossed, + ) + if err != nil { + return sdk.ZeroInt(), err + } + + // if there have been no other CL pools in the route, then we can set the intermediate coin to the max input amount. + // Additionally, if the amount of the previous token is greater than the possible amount from this pool, then we + // can set the intermediate coin to the max input amount (from the current pool). Otherwise we have to do a + // safe swap given the previous max amount. + if intermidiateCoin.IsNil() || maxTokenOut.Amount.LT(intermidiateCoin.Amount) { + intermidiateCoin = maxTokenIn + continue + } + + // In the scenario where there are multiple CL pools in a route, we select the one that inputs + // the smaller amount to ensure we do not overstep the max ticks moved. + intermidiateCoin, err = k.executeSafeSwap(ctx, pool.GetId(), intermidiateCoin, tokenInDenom, route.StepSize) + if err != nil { + return sdk.ZeroInt(), err + } + case !intermidiateCoin.IsNil(): + // If we have already seen a CL pool in the route, then simply propagate the intermediate coin up + // the route. + intermidiateCoin, err = k.executeSafeSwap(ctx, pool.GetId(), intermidiateCoin, tokenInDenom, route.StepSize) + if err != nil { + return sdk.ZeroInt(), err + } + } + } + + // In the case where there are no CL pools, we want to return the extended max input amount + if intermidiateCoin.IsNil() { + return types.ExtendedMaxInputAmount, nil + } + + // Ensure that the normalized upper bound is not greater than the extended max input amount + upperBound := intermidiateCoin.Amount.Quo(route.StepSize) + if upperBound.GT(types.ExtendedMaxInputAmount) { + return types.ExtendedMaxInputAmount, nil + } + + return upperBound, nil +} + +// executeSafeSwap executes a safe swap by first ensuring the swap amount is less than the +// amount of total liquidity in the pool. +func (k Keeper) executeSafeSwap( + ctx sdk.Context, + poolID uint64, + outputCoin sdk.Coin, + tokenInDenom string, + stepSize sdk.Int, +) (sdk.Coin, error) { + liquidity, err := k.poolmanagerKeeper.GetTotalPoolLiquidity(ctx, poolID) + if err != nil { + return sdk.NewCoin(tokenInDenom, sdk.ZeroInt()), err + } + + // At most we can swap half of the liquidity in the pool + liquidTokenAmt := liquidity.AmountOf(outputCoin.Denom).Quo(sdk.NewInt(4)) + if liquidTokenAmt.LT(outputCoin.Amount) { + outputCoin.Amount = liquidTokenAmt + } + + amt, err := k.poolmanagerKeeper.MultihopEstimateInGivenExactAmountOut( + ctx, + poolmanagertypes.SwapAmountOutRoutes{ + { + PoolId: poolID, + TokenInDenom: tokenInDenom, + }, + }, + outputCoin, + ) + if err != nil { + return sdk.NewCoin(tokenInDenom, sdk.ZeroInt()), err + } + + return sdk.NewCoin(tokenInDenom, amt), nil +} + // Determine if the binary search range needs to be extended -func (k Keeper) ExtendSearchRangeIfNeeded(ctx sdk.Context, route RouteMetaData, inputDenom string, curLeft, curRight sdk.Int) (sdk.Int, sdk.Int) { +func (k Keeper) ExtendSearchRangeIfNeeded( + ctx sdk.Context, + route RouteMetaData, + inputDenom string, + curLeft, curRight, updatedMax sdk.Int, +) (sdk.Int, sdk.Int, error) { // Get the profit for the maximum amount in _, maxInProfit, err := k.EstimateMultihopProfit(ctx, inputDenom, curRight.Mul(route.StepSize), route.Route) if err != nil { - return curLeft, curRight + return sdk.ZeroInt(), sdk.ZeroInt(), err } // If the profit for the maximum amount in is still increasing, then we can increase the range of the binary search @@ -180,17 +330,17 @@ func (k Keeper) ExtendSearchRangeIfNeeded(ctx sdk.Context, route RouteMetaData, // Get the profit for the maximum amount in + 1 _, maxInProfitPlusOne, err := k.EstimateMultihopProfit(ctx, inputDenom, curRight.Add(sdk.OneInt()).Mul(route.StepSize), route.Route) if err != nil { - return curLeft, curRight + return sdk.ZeroInt(), sdk.ZeroInt(), err } // Change the range of the binary search if the profit is still increasing if maxInProfitPlusOne.GT(maxInProfit) { curLeft = curRight - curRight = types.ExtendedMaxInputAmount + curRight = updatedMax } } - return curLeft, curRight + return curLeft, curRight, nil } // ExecuteTrade inputs a route, amount in, and rebalances the pool diff --git a/x/protorev/keeper/rebalance_test.go b/x/protorev/keeper/rebalance_test.go index 26c83e835c5..c6753381326 100644 --- a/x/protorev/keeper/rebalance_test.go +++ b/x/protorev/keeper/rebalance_test.go @@ -4,7 +4,9 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/osmosis-labs/osmosis/v17/app/apptesting" + "github.com/osmosis-labs/osmosis/v17/x/gamm/pool-models/stableswap" poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" + "github.com/osmosis-labs/osmosis/v17/x/protorev/keeper" protorevtypes "github.com/osmosis-labs/osmosis/v17/x/protorev/keeper" "github.com/osmosis-labs/osmosis/v17/x/protorev/types" ) @@ -165,6 +167,42 @@ var extendedRangeRoute = poolmanagertypes.SwapAmountInRoutes{ }, } +// Tests the binary search range for CL pools +var clPoolRouteExtended = poolmanagertypes.SwapAmountInRoutes{ + poolmanagertypes.SwapAmountInRoute{ + PoolId: 49, + TokenOutDenom: "uosmo", + }, + poolmanagertypes.SwapAmountInRoute{ + PoolId: 50, + TokenOutDenom: "epochTwo", + }, +} + +// Tests multiple CL pools in the same route +var clPoolRouteMulti = poolmanagertypes.SwapAmountInRoutes{ + poolmanagertypes.SwapAmountInRoute{ + PoolId: 52, + TokenOutDenom: "uosmo", + }, + poolmanagertypes.SwapAmountInRoute{ + PoolId: 53, + TokenOutDenom: "epochTwo", + }, +} + +// Tests reducing the binary search range +var clPoolRoute = poolmanagertypes.SwapAmountInRoutes{ + poolmanagertypes.SwapAmountInRoute{ + PoolId: 49, + TokenOutDenom: "uosmo", + }, + poolmanagertypes.SwapAmountInRoute{ + PoolId: 52, + TokenOutDenom: "epochTwo", + }, +} + // EstimateMultiHopSwap Panic catching test var panicRoute = poolmanagertypes.SwapAmountInRoutes{ poolmanagertypes.SwapAmountInRoute{ @@ -290,6 +328,36 @@ func (s *KeeperTestSuite) TestFindMaxProfitRoute() { }, expectPass: false, }, + { + name: "CL Route (extended range)", // This will search up to 131072 * stepsize + param: param{ + route: clPoolRouteExtended, + expectedAmtIn: sdk.NewInt(131_072_000_000), + expectedProfit: sdk.NewInt(295_125_808), + routePoolPoints: 7, + }, + expectPass: true, + }, + { + name: "CL Route", // This will search up to 131072 * stepsize + param: param{ + route: clPoolRoute, + expectedAmtIn: sdk.NewInt(13_159_000_000), + expectedProfit: sdk.NewInt(18_055_586), + routePoolPoints: 7, + }, + expectPass: true, + }, + { + name: "CL Route Multi", // This will search up to 131072 * stepsize + param: param{ + route: clPoolRouteMulti, + expectedAmtIn: sdk.NewInt(414_000_000), + expectedProfit: sdk.NewInt(171_555_698), + routePoolPoints: 12, + }, + expectPass: true, + }, } for _, test := range tests { @@ -667,3 +735,106 @@ func (s *KeeperTestSuite) TestRemainingPoolPointsForTx() { }) } } + +func (s *KeeperTestSuite) TestUpdateSearchRangeIfNeeded() { + s.Run("Extended search on stable pools", func() { + route := keeper.RouteMetaData{ + Route: extendedRangeRoute, + StepSize: sdk.NewInt(1_000_000), + } + + curLeft, curRight, err := s.App.ProtoRevKeeper.UpdateSearchRangeIfNeeded( + s.Ctx, + route, + "usdx", + sdk.OneInt(), + types.MaxInputAmount, + ) + s.Require().NoError(err) + s.Require().Equal(types.MaxInputAmount, curLeft) + s.Require().Equal(types.ExtendedMaxInputAmount, curRight) + }) + + s.Run("Extended search on CL pools", func() { + // Create two massive CL pools with a massive arb + clPool := s.PrepareCustomConcentratedPool(s.TestAccs[0], "atom", "uosmo", apptesting.DefaultTickSpacing, sdk.ZeroDec()) + fundCoins := sdk.NewCoins(sdk.NewCoin("atom", sdk.NewInt(10_000_000_000_000)), sdk.NewCoin("uosmo", sdk.NewInt(10_000_000_000_000))) + s.FundAcc(s.TestAccs[0], fundCoins) + s.CreateFullRangePosition(clPool, fundCoins) + + clPool2 := s.PrepareCustomConcentratedPool(s.TestAccs[0], "atom", "uosmo", apptesting.DefaultTickSpacing, sdk.ZeroDec()) + fundCoins = sdk.NewCoins(sdk.NewCoin("atom", sdk.NewInt(20_000_000_000_000)), sdk.NewCoin("uosmo", sdk.NewInt(10_000_000_000_000))) + s.FundAcc(s.TestAccs[0], fundCoins) + s.CreateFullRangePosition(clPool2, fundCoins) + + route := keeper.RouteMetaData{ + Route: poolmanagertypes.SwapAmountInRoutes{ + poolmanagertypes.SwapAmountInRoute{ + PoolId: clPool.GetId(), + TokenOutDenom: "uosmo", + }, + poolmanagertypes.SwapAmountInRoute{ + PoolId: clPool2.GetId(), + TokenOutDenom: "atom", + }, + }, + StepSize: sdk.NewInt(1_000_000), + } + + curLeft, curRight, err := s.App.ProtoRevKeeper.UpdateSearchRangeIfNeeded( + s.Ctx, + route, + "atom", + sdk.OneInt(), + types.MaxInputAmount, + ) + s.Require().NoError(err) + s.Require().Equal(types.MaxInputAmount, curLeft) + s.Require().Equal(types.ExtendedMaxInputAmount, curRight) + }) + + s.Run("Reduced search on CL pools", func() { + stablePool := s.createStableswapPool( + sdk.NewCoins( + sdk.NewCoin("uosmo", sdk.NewInt(25_000_000_000)), + sdk.NewCoin("eth", sdk.NewInt(20_000_000_000)), + ), + stableswap.PoolParams{ + SwapFee: sdk.NewDecWithPrec(0, 2), + ExitFee: sdk.NewDecWithPrec(0, 2), + }, + []uint64{1, 1}, + ) + + // Create two massive CL pools with a massive arb + clPool := s.PrepareCustomConcentratedPool(s.TestAccs[0], "eth", "uosmo", apptesting.DefaultTickSpacing, sdk.ZeroDec()) + fundCoins := sdk.NewCoins(sdk.NewCoin("eth", sdk.NewInt(10_000_000_000_000)), sdk.NewCoin("uosmo", sdk.NewInt(10_000_000_000_000))) + s.FundAcc(s.TestAccs[0], fundCoins) + s.CreateFullRangePosition(clPool, fundCoins) + + route := keeper.RouteMetaData{ + Route: poolmanagertypes.SwapAmountInRoutes{ + poolmanagertypes.SwapAmountInRoute{ + PoolId: stablePool, + TokenOutDenom: "eth", + }, + poolmanagertypes.SwapAmountInRoute{ + PoolId: clPool.GetId(), + TokenOutDenom: "uosmo", + }, + }, + StepSize: sdk.NewInt(1_000_000), + } + + curLeft, curRight, err := s.App.ProtoRevKeeper.UpdateSearchRangeIfNeeded( + s.Ctx, + route, + "uosmo", + sdk.OneInt(), + types.MaxInputAmount, + ) + s.Require().NoError(err) + s.Require().Equal(sdk.OneInt(), curLeft) + s.Require().Equal(sdk.NewInt(5141), curRight) + }) +} diff --git a/x/protorev/keeper/routes_test.go b/x/protorev/keeper/routes_test.go index 296b52d3a2f..70ac96276a0 100644 --- a/x/protorev/keeper/routes_test.go +++ b/x/protorev/keeper/routes_test.go @@ -349,13 +349,13 @@ func (s *KeeperTestSuite) TestCalculateRoutePoolPoints() { }, { description: "Valid route with a cosmwasm pool", - route: []poolmanagertypes.SwapAmountInRoute{{PoolId: 1, TokenOutDenom: ""}, {PoolId: 50, TokenOutDenom: ""}, {PoolId: 2, TokenOutDenom: ""}}, + route: []poolmanagertypes.SwapAmountInRoute{{PoolId: 1, TokenOutDenom: ""}, {PoolId: 51, TokenOutDenom: ""}, {PoolId: 2, TokenOutDenom: ""}}, expectedRoutePoolPoints: 8, expectedPass: true, }, { description: "Valid route with cw pool, balancer, stable swap and cl pool", - route: []poolmanagertypes.SwapAmountInRoute{{PoolId: 1, TokenOutDenom: ""}, {PoolId: 50, TokenOutDenom: ""}, {PoolId: 40, TokenOutDenom: ""}, {PoolId: 49, TokenOutDenom: ""}}, + route: []poolmanagertypes.SwapAmountInRoute{{PoolId: 1, TokenOutDenom: ""}, {PoolId: 51, TokenOutDenom: ""}, {PoolId: 40, TokenOutDenom: ""}, {PoolId: 50, TokenOutDenom: ""}}, expectedRoutePoolPoints: 10, expectedPass: true, }, diff --git a/x/protorev/protorev.md b/x/protorev/protorev.md index f63e824841c..f1b023b6c79 100644 --- a/x/protorev/protorev.md +++ b/x/protorev/protorev.md @@ -314,7 +314,7 @@ IterateRoutes iterates through a list of routes, determining the route and input ### FindMaxProfitForRoute -This will take in a route and determine the optimal amount to swap in to maximize profits, given the reserves of all of the pools that are swapped against in the route. +This will take in a route and determine the optimal amount to swap in to maximize profits, given the reserves of all of the pools that are swapped against in the route. The bounds of the binary search are dynamic and update per route (see `UpdateSearchRangeIfNeeded`) based on how computationally expensive (in terms of gas) swapping can be on that route. For instance, moving across several ticks on a concentrated pool is relatively expensive, so the bounds of the binary search with a route that includes that pool type may be smaller than a route that does not include that pool type. ### ExecuteTrade diff --git a/x/protorev/types/constants.go b/x/protorev/types/constants.go index 254eefb8013..ffdc56c2a7f 100644 --- a/x/protorev/types/constants.go +++ b/x/protorev/types/constants.go @@ -27,6 +27,10 @@ const MaxPoolPointsPerTx uint64 = 50 // to the maximum execution time (in ms) of protorev per block const MaxPoolPointsPerBlock uint64 = 200 +// Max number of ticks we can move in a concentrated pool swap. This will be parameterized in a +// follow up PR. +const MaxTicksCrossed uint64 = 5 + // ---------------- Module Profit Splitting Constants ---------------- // // Year 1 (20% of total profit) diff --git a/x/protorev/types/expected_keepers.go b/x/protorev/types/expected_keepers.go index 03b7ba41eb3..4e80c5acdd2 100644 --- a/x/protorev/types/expected_keepers.go +++ b/x/protorev/types/expected_keepers.go @@ -44,6 +44,11 @@ type PoolManagerKeeper interface { tokenIn sdk.Coin, ) (tokenOutAmount sdk.Int, err error) + MultihopEstimateInGivenExactAmountOut( + ctx sdk.Context, + routes []poolmanagertypes.SwapAmountOutRoute, + tokenOut sdk.Coin) (tokenInAmount sdk.Int, err error) + AllPools( ctx sdk.Context, ) ([]poolmanagertypes.PoolI, error) @@ -61,3 +66,14 @@ type PoolManagerKeeper interface { type EpochKeeper interface { GetEpochInfo(ctx sdk.Context, identifier string) epochtypes.EpochInfo } + +// ConcentratedLiquidityKeeper defines the ConcentratedLiquidity contract that must be fulfilled when +// creating a x/protorev keeper. +type ConcentratedLiquidityKeeper interface { + ComputeMaxInAmtGivenMaxTicksCrossed( + ctx sdk.Context, + poolId uint64, + tokenInDenom string, + maxTicksCrossed uint64, + ) (maxTokenIn, resultingTokenOut sdk.Coin, err error) +} From 7bbcc9f6be670f369fd5ce2f6657f5b60b43c9b3 Mon Sep 17 00:00:00 2001 From: Adam Tucker Date: Fri, 4 Aug 2023 18:29:50 -0500 Subject: [PATCH 10/18] fix[e2e]: e2e failure fixes (#5964) * prevent concurrent map write error e2e * propper mutex * add a retry loop to starting a node * retry node if fails to start * update changelog --------- Co-authored-by: devbot-wizard <141283918+devbot-wizard@users.noreply.github.com> --- CHANGELOG.md | 1 + tests/e2e/configurer/chain/node.go | 76 ++++++++++++++++++++---------- tests/e2e/containers/containers.go | 4 ++ 3 files changed, 57 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7556ace890..2066f4a0427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#5923] (https://github.com/osmosis-labs/osmosis/pull/5923) CL: Lower gas for initializing ticks * [#5927] (https://github.com/osmosis-labs/osmosis/pull/5927) Add gas metering to x/tokenfactory trackBeforeSend hook * [#5890](https://github.com/osmosis-labs/osmosis/pull/5890) feat: CreateCLPool & LinkCFMMtoCL pool into one gov-prop +* [#5964](https://github.com/osmosis-labs/osmosis/pull/5964) fix e2e test concurrency bugs ### Minor improvements & Bug Fixes diff --git a/tests/e2e/configurer/chain/node.go b/tests/e2e/configurer/chain/node.go index 81d3afbc46e..50cbbb50333 100644 --- a/tests/e2e/configurer/chain/node.go +++ b/tests/e2e/configurer/chain/node.go @@ -47,35 +47,63 @@ func NewNodeConfig(t *testing.T, initNode *initialization.Node, initConfig *init // The node configuration must be already added to the chain config prior to calling this // method. func (n *NodeConfig) Run() error { - n.t.Logf("starting node container: %s", n.Name) - resource, err := n.containerManager.RunNodeResource(n.chainId, n.Name, n.ConfigDir) - if err != nil { - return err - } + maxRetries := 3 + currentRetry := 0 + + for currentRetry < maxRetries { + n.t.Logf("starting node container: %s", n.Name) + resource, err := n.containerManager.RunNodeResource(n.chainId, n.Name, n.ConfigDir) + if err != nil { + return err + } - hostPort := resource.GetHostPort("26657/tcp") - rpcClient, err := rpchttp.New("tcp://"+hostPort, "/websocket") - if err != nil { - return err - } + hostPort := resource.GetHostPort("26657/tcp") + rpcClient, err := rpchttp.New("tcp://"+hostPort, "/websocket") + if err != nil { + return err + } - n.rpcClient = rpcClient + n.rpcClient = rpcClient + + success := false + timeout := time.After(time.Second * 20) + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-timeout: + n.t.Logf("Osmosis node failed to produce blocks") + break + case <-ticker.C: + _, err := n.QueryCurrentHeight() + if err == nil { + n.t.Logf("started node container: %s", n.Name) + success = true + break + } + } + + if success { + break + } + } - require.Eventually( - n.t, - func() bool { - // This fails if unsuccessful. - _, err := n.QueryCurrentHeight() + if success { + break + } else { + n.t.Logf("failed to start node container, retrying... (%d/%d)", currentRetry+1, maxRetries) + err := n.containerManager.RemoveNodeResource(n.Name) if err != nil { - return false + return err } - n.t.Logf("started node container: %s", n.Name) - return true - }, - time.Minute, - 10*time.Millisecond, - "Osmosis node failed to produce blocks", - ) + currentRetry++ + } + } + + if currentRetry >= maxRetries { + return fmt.Errorf("failed to start node container after %d retries", maxRetries) + } if err := n.extractOperatorAddressIfValidator(); err != nil { return err diff --git a/tests/e2e/containers/containers.go b/tests/e2e/containers/containers.go index 1981aa85da3..93a9242eb29 100644 --- a/tests/e2e/containers/containers.go +++ b/tests/e2e/containers/containers.go @@ -8,6 +8,7 @@ import ( "regexp" "strconv" "strings" + "sync" "testing" "time" @@ -49,6 +50,7 @@ type Manager struct { pool *dockertest.Pool network *dockertest.Network resources map[string]*dockertest.Resource + resourcesMutex sync.RWMutex isDebugLogEnabled bool } @@ -297,7 +299,9 @@ func (m *Manager) RunNodeResource(chainId string, containerName, valCondifDir st return nil, err } + m.resourcesMutex.Lock() m.resources[containerName] = resource + m.resourcesMutex.Unlock() return resource, nil } From e5b8273496adc84cb54699b5ac0668ff83219443 Mon Sep 17 00:00:00 2001 From: sampocs Date: Sat, 5 Aug 2023 12:26:43 -0500 Subject: [PATCH 11/18] feat: add SetScalingFactorController gov prop (#5937) * added SetScalingFactorControllerProposal to protos * implemented gov content type * added setStableSwapScalingFactorController keeper * added unit test for setStableSwapScalingFactorController * wired up handler * added changelog entry * Update x/gamm/handler.go Co-authored-by: Adam Tucker * added cli command * shortened message name for ledger support --------- Co-authored-by: Adam Tucker --- CHANGELOG.md | 1 + app/keepers/keepers.go | 2 +- app/keepers/modules.go | 1 + proto/osmosis/gamm/v1beta1/gov.proto | 16 +- x/gamm/client/cli/flags.go | 3 +- x/gamm/client/cli/tx.go | 123 ++++++++ x/gamm/client/proposal_handler.go | 7 +- x/gamm/client/rest/tx.go | 7 + x/gamm/handler.go | 12 +- x/gamm/keeper/export_test.go | 4 + x/gamm/keeper/gov.go | 4 + x/gamm/keeper/pool.go | 17 ++ x/gamm/keeper/pool_test.go | 77 +++++ x/gamm/types/codec.go | 2 + x/gamm/types/gov.go | 55 ++++ x/gamm/types/gov.pb.go | 412 ++++++++++++++++++++++++--- 16 files changed, 688 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2066f4a0427..30a8f46f185 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#5883](https://github.com/osmosis-labs/osmosis/pull/5883) feat: Uninitialize empty ticks * [#5874](https://github.com/osmosis-labs/osmosis/pull/5874) Remove Partial Migration from superfluid migration to CL * [#5901](https://github.com/osmosis-labs/osmosis/pull/5901) Adding support for CW pools in ProtoRev +* [#5937](https://github.com/osmosis-labs/osmosis/pull/5937) feat: add SetScalingFactorController gov prop ### BugFix diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index c46085b0648..10f6f726ed8 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -499,7 +499,7 @@ func (appKeepers *AppKeepers) InitNormalKeepers( AddRoute(txfeestypes.RouterKey, txfees.NewUpdateFeeTokenProposalHandler(*appKeepers.TxFeesKeeper)). AddRoute(superfluidtypes.RouterKey, superfluid.NewSuperfluidProposalHandler(*appKeepers.SuperfluidKeeper, *appKeepers.EpochsKeeper, *appKeepers.GAMMKeeper)). AddRoute(protorevtypes.RouterKey, protorev.NewProtoRevProposalHandler(*appKeepers.ProtoRevKeeper)). - AddRoute(gammtypes.RouterKey, gamm.NewMigrationRecordHandler(*appKeepers.GAMMKeeper)). + AddRoute(gammtypes.RouterKey, gamm.NewGammProposalHandler(*appKeepers.GAMMKeeper)). AddRoute(concentratedliquiditytypes.RouterKey, concentratedliquidity.NewConcentratedLiquidityProposalHandler(*appKeepers.ConcentratedLiquidityKeeper)). AddRoute(cosmwasmpooltypes.RouterKey, cosmwasmpool.NewCosmWasmPoolProposalHandler(*appKeepers.CosmwasmPoolKeeper)) diff --git a/app/keepers/modules.go b/app/keepers/modules.go index 4a67045df1f..9a7460d4bbe 100644 --- a/app/keepers/modules.go +++ b/app/keepers/modules.go @@ -83,6 +83,7 @@ var AppModuleBasics = []module.AppModuleBasic{ gammclient.ReplaceMigrationRecordsProposalHandler, gammclient.UpdateMigrationRecordsProposalHandler, gammclient.CreateCLPoolAndLinkToCFMMProposalHandler, + gammclient.SetScalingFactorControllerProposalHandler, clclient.CreateConcentratedLiquidityPoolProposalHandler, clclient.TickSpacingDecreaseProposalHandler, cwpoolclient.UploadCodeIdAndWhitelistProposalHandler, diff --git a/proto/osmosis/gamm/v1beta1/gov.proto b/proto/osmosis/gamm/v1beta1/gov.proto index 0a88c347623..87599a8d578 100644 --- a/proto/osmosis/gamm/v1beta1/gov.proto +++ b/proto/osmosis/gamm/v1beta1/gov.proto @@ -58,7 +58,6 @@ message UpdateMigrationRecordsProposal { repeated BalancerToConcentratedPoolLink records = 3 [ (gogoproto.nullable) = false ]; } - message PoolRecordWithCFMMLink { option (gogoproto.equal) = true; @@ -96,4 +95,19 @@ message CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal { (gogoproto.moretags) = "yaml:\"create_cl_pool_and_link_to_cfmm\"", (gogoproto.nullable) = false ]; +} + +// SetScalingFactorControllerProposal is a gov Content type for updating the +// scaling factor controller address of a stableswap pool +message SetScalingFactorControllerProposal { + option (gogoproto.equal) = true; + option (gogoproto.goproto_getters) = false; + option (gogoproto.goproto_stringer) = false; + option (amino.name) = "osmosis/SetScalingFactorControllerProposal"; + option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content"; + + string title = 1; + string description = 2; + uint64 pool_id = 3; + string controller_address = 4; } \ No newline at end of file diff --git a/x/gamm/client/cli/flags.go b/x/gamm/client/cli/flags.go index 1b0b84536ab..24a71f1f571 100644 --- a/x/gamm/client/cli/flags.go +++ b/x/gamm/client/cli/flags.go @@ -39,7 +39,8 @@ const ( // Will be parsed to []string. FlagSwapRouteDenoms = "swap-route-denoms" // FlagScalingFactors represents the flag name for the scaling factors. - FlagScalingFactors = "scaling-factors" + FlagScalingFactors = "scaling-factors" + FlagScalingFactorControllerAddress = "scaling-factor-controller-address" FlagMigrationRecords = "migration-records" diff --git a/x/gamm/client/cli/tx.go b/x/gamm/client/cli/tx.go index c0f3f910bef..7d781345748 100644 --- a/x/gamm/client/cli/tx.go +++ b/x/gamm/client/cli/tx.go @@ -1,8 +1,10 @@ package cli import ( + "encoding/json" "errors" "fmt" + "os" "strconv" "strings" "time" @@ -346,6 +348,78 @@ func NewCmdSubmitCreateCLPoolAndLinkToCFMMProposal() *cobra.Command { return cmd } +// NewCmdSubmitSetScalingFactorControllerProposal implements a command handler for the set scaling factor controller proposal +func NewCmdSubmitSetScalingFactorControllerProposal() *cobra.Command { + cmd := &cobra.Command{ + Use: "set-scaling-factor-controller-proposal [flags]", + Args: cobra.ExactArgs(0), + Short: "Submit a set scaling factor controller proposal", + Long: strings.TrimSpace(`Submit a set scaling factor controller proposal. + +Sample proposal file: +{ + "title": "Set Scaling Factor Controller Proposal", + "description": "Change scaling factor controller address from osmoXXX to osmoYYY" + "pool-id": 1, + "controller-address": "osmoYYY" +} +>>> osmosisd tx gov submit-proposal set-scaling-factor-controller-proposal \ + --proposal proposal.json \ + --deposit 1600000000uosmo \ + +Sample proposal with flags +>>> osmosisd tx gov submit-proposal set-scaling-factor-controller-proposal \ + --title "Set Scaling Factor Controller Proposal" \ + --description "Change scaling factor controller address from osmoXXX to osmoYYY" + --deposit 1600000000uosmo + --pool-id 1 + --controller-address osmoYYY + `), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + content, err := parseSetScalingFactorControllerArgsToContent(cmd) + if err != nil { + return err + } + + from := clientCtx.GetFromAddress() + + depositStr, err := cmd.Flags().GetString(govcli.FlagDeposit) + if err != nil { + return err + } + deposit, err := sdk.ParseCoinsNormalized(depositStr) + if err != nil { + return err + } + + msg, err := govtypes.NewMsgSubmitProposal(content, deposit, from) + if err != nil { + return err + } + + if err = msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().String(govcli.FlagTitle, "", "title of proposal") + cmd.Flags().String(govcli.FlagDescription, "", "description of proposal") + cmd.Flags().String(govcli.FlagDeposit, "", "deposit of proposal") + cmd.Flags().Uint64(FlagPoolId, 0, "stableswap pool-id") + cmd.Flags().String(FlagScalingFactorControllerAddress, "", "target scaling factor controller address") + cmd.Flags().Bool(govcli.FlagIsExpedited, false, "If true, makes the proposal an expedited one") + cmd.Flags().String(govcli.FlagProposal, "", "Proposal file path (if this path is given, other proposal flags are ignored)") + + return cmd +} + func BuildCreatePoolCmd(clientCtx client.Context, args []string, fs *flag.FlagSet) (sdk.Msg, error) { poolType, err := fs.GetString(FlagPoolType) if err != nil { @@ -846,3 +920,52 @@ func parsePoolRecordsWithCFMMLink(cmd *cobra.Command) ([]types.PoolRecordWithCFM return finalPoolRecords, nil } + +func parseSetScalingFactorControllerArgsToContent(cmd *cobra.Command) (govtypes.Content, error) { + proposalFile, err := cmd.Flags().GetString(govcli.FlagProposal) + if err != nil { + return nil, err + } + + if proposalFile != "" { + contents, err := os.ReadFile(proposalFile) + if err != nil { + return nil, err + } + + var proposal types.SetScalingFactorControllerProposal + if err := json.Unmarshal(contents, &proposal); err != nil { + return nil, err + } + return &proposal, nil + } + + title, err := cmd.Flags().GetString(govcli.FlagTitle) + if err != nil { + return nil, err + } + + description, err := cmd.Flags().GetString(govcli.FlagDescription) + if err != nil { + return nil, err + } + + poolId, err := cmd.Flags().GetUint64(FlagPoolId) + if err != nil { + return nil, err + } + + controllerAddress, err := cmd.Flags().GetString(FlagScalingFactorControllerAddress) + if err != nil { + return nil, err + } + + content := &types.SetScalingFactorControllerProposal{ + Title: title, + Description: description, + PoolId: poolId, + ControllerAddress: controllerAddress, + } + + return content, nil +} diff --git a/x/gamm/client/proposal_handler.go b/x/gamm/client/proposal_handler.go index a180114a474..916aa9777c9 100644 --- a/x/gamm/client/proposal_handler.go +++ b/x/gamm/client/proposal_handler.go @@ -8,7 +8,8 @@ import ( ) var ( - ReplaceMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitReplaceMigrationRecordsProposal, rest.ProposalReplaceMigrationRecordsRESTHandler) - UpdateMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitUpdateMigrationRecordsProposal, rest.ProposalUpdateMigrationRecordsRESTHandler) - CreateCLPoolAndLinkToCFMMProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitCreateCLPoolAndLinkToCFMMProposal, rest.ProposalCreateConcentratedLiquidityPoolAndLinkToCFMMHandler) + ReplaceMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitReplaceMigrationRecordsProposal, rest.ProposalReplaceMigrationRecordsRESTHandler) + UpdateMigrationRecordsProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitUpdateMigrationRecordsProposal, rest.ProposalUpdateMigrationRecordsRESTHandler) + CreateCLPoolAndLinkToCFMMProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitCreateCLPoolAndLinkToCFMMProposal, rest.ProposalCreateConcentratedLiquidityPoolAndLinkToCFMMHandler) + SetScalingFactorControllerProposalHandler = govclient.NewProposalHandler(cli.NewCmdSubmitSetScalingFactorControllerProposal, rest.ProposalSetScalingFactorController) ) diff --git a/x/gamm/client/rest/tx.go b/x/gamm/client/rest/tx.go index a8691710a3e..419bbcdb589 100644 --- a/x/gamm/client/rest/tx.go +++ b/x/gamm/client/rest/tx.go @@ -28,6 +28,13 @@ func ProposalCreateConcentratedLiquidityPoolAndLinkToCFMMHandler(clientCtx clien } } +func ProposalSetScalingFactorController(clientCtx client.Context) govrest.ProposalRESTHandler { + return govrest.ProposalRESTHandler{ + SubRoute: "set-scaling-factor-controller", + Handler: emptyHandler(clientCtx), + } +} + func emptyHandler(clientCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { } diff --git a/x/gamm/handler.go b/x/gamm/handler.go index 7993cfe2be1..9daae7ed5bd 100644 --- a/x/gamm/handler.go +++ b/x/gamm/handler.go @@ -11,8 +11,8 @@ import ( "github.com/osmosis-labs/osmosis/v17/x/gamm/types" ) -// NewMigrationRecordHandler is a handler for governance proposals on new migration records. -func NewMigrationRecordHandler(k keeper.Keeper) govtypes.Handler { +// NewGammProposalHandler is a handler for governance proposals for the GAMM module. +func NewGammProposalHandler(k keeper.Keeper) govtypes.Handler { return func(ctx sdk.Context, content govtypes.Content) error { switch c := content.(type) { case *types.UpdateMigrationRecordsProposal: @@ -21,6 +21,8 @@ func NewMigrationRecordHandler(k keeper.Keeper) govtypes.Handler { return handleReplaceMigrationRecordsProposal(ctx, k, c) case *types.CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal: return handleCreatingCLPoolAndLinkToCFMMProposal(ctx, k, c) + case *types.SetScalingFactorControllerProposal: + return handleSetScalingFactorControllerProposal(ctx, k, c) default: return errorsmod.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized migration record proposal content type: %T", c) @@ -47,3 +49,9 @@ func handleCreatingCLPoolAndLinkToCFMMProposal(ctx sdk.Context, k keeper.Keeper, } return nil } + +// handleSetScalingFactorControllerProposal is a handler for gov proposals to set a stableswap pool's +// scaling factor controller address +func handleSetScalingFactorControllerProposal(ctx sdk.Context, k keeper.Keeper, p *types.SetScalingFactorControllerProposal) error { + return k.HandleSetScalingFactorControllerProposal(ctx, p) +} diff --git a/x/gamm/keeper/export_test.go b/x/gamm/keeper/export_test.go index 7730b538448..3b4036de523 100644 --- a/x/gamm/keeper/export_test.go +++ b/x/gamm/keeper/export_test.go @@ -21,6 +21,10 @@ func (k Keeper) SetStableSwapScalingFactors(ctx sdk.Context, poolId uint64, scal return k.setStableSwapScalingFactors(ctx, poolId, scalingFactors, sender) } +func (k Keeper) SetStableSwapScalingFactorController(ctx sdk.Context, poolId uint64, controllerAddress string) error { + return k.setStableSwapScalingFactorController(ctx, poolId, controllerAddress) +} + func AsCFMMPool(pool poolmanagertypes.PoolI) (types.CFMMPoolI, error) { return asCFMMPool(pool) } diff --git a/x/gamm/keeper/gov.go b/x/gamm/keeper/gov.go index b45516233c2..b6523ad5251 100644 --- a/x/gamm/keeper/gov.go +++ b/x/gamm/keeper/gov.go @@ -13,3 +13,7 @@ func (k Keeper) HandleReplaceMigrationRecordsProposal(ctx sdk.Context, p *types. func (k Keeper) HandleUpdateMigrationRecordsProposal(ctx sdk.Context, p *types.UpdateMigrationRecordsProposal) error { return k.UpdateMigrationRecords(ctx, p.Records) } + +func (k Keeper) HandleSetScalingFactorControllerProposal(ctx sdk.Context, p *types.SetScalingFactorControllerProposal) error { + return k.setStableSwapScalingFactorController(ctx, p.PoolId, p.ControllerAddress) +} diff --git a/x/gamm/keeper/pool.go b/x/gamm/keeper/pool.go index 98a05b2e837..cfbc8149ee7 100644 --- a/x/gamm/keeper/pool.go +++ b/x/gamm/keeper/pool.go @@ -327,6 +327,23 @@ func (k Keeper) setStableSwapScalingFactors(ctx sdk.Context, poolId uint64, scal return k.setPool(ctx, stableswapPool) } +// setStableSwapScalingFactorController updates the scaling factor controller address for a stable swap pool +// errors if the pool does not exist or is not a stable swap pool +func (k Keeper) setStableSwapScalingFactorController(ctx sdk.Context, poolId uint64, controllerAddress string) error { + pool, err := k.GetPoolAndPoke(ctx, poolId) + if err != nil { + return err + } + stableswapPool, ok := pool.(*stableswap.Pool) + if !ok { + return fmt.Errorf("pool id %d is not of type stableswap pool", poolId) + } + + stableswapPool.ScalingFactorController = controllerAddress + + return k.setPool(ctx, stableswapPool) +} + // asCFMMPool converts PoolI to CFMMPoolI by casting the input. // Returns the pool of the CFMMPoolI or error if the given pool does not implement // CFMMPoolI. diff --git a/x/gamm/keeper/pool_test.go b/x/gamm/keeper/pool_test.go index 4e75034de0e..4ec3b17d63c 100644 --- a/x/gamm/keeper/pool_test.go +++ b/x/gamm/keeper/pool_test.go @@ -518,6 +518,83 @@ func (s *KeeperTestSuite) TestSetStableSwapScalingFactors() { } } +func (s *KeeperTestSuite) TestSetStableSwapScalingFactorController() { + initialControllerAddr := s.TestAccs[0].String() + updatedControllerAddr := s.TestAccs[1].String() + + testcases := []struct { + name string + poolId uint64 + expError error + isStableSwapPool bool + }{ + { + name: "Error: Pool does not exist", + poolId: 2, + expError: types.PoolDoesNotExistError{PoolId: defaultPoolId + 1}, + isStableSwapPool: false, + }, + { + name: "Error: Pool id is not of type stableswap pool", + poolId: 1, + expError: fmt.Errorf("pool id 1 is not of type stableswap pool"), + isStableSwapPool: false, + }, + { + name: "Valid case", + poolId: 1, + isStableSwapPool: true, + }, + } + for _, tc := range testcases { + s.Run(tc.name, func() { + s.SetupTest() + if tc.isStableSwapPool == true { + poolId := s.prepareCustomStableswapPool( + defaultAcctFunds, + stableswap.PoolParams{ + SwapFee: defaultSpreadFactor, + ExitFee: defaultZeroExitFee, + }, + sdk.NewCoins(sdk.NewCoin(defaultAcctFunds[0].Denom, defaultAcctFunds[0].Amount.QuoRaw(2)), sdk.NewCoin(defaultAcctFunds[1].Denom, defaultAcctFunds[1].Amount.QuoRaw(2))), + []uint64{1, 1}, + ) + pool, _ := s.App.GAMMKeeper.GetPoolAndPoke(s.Ctx, poolId) + stableswapPool, _ := pool.(*stableswap.Pool) + stableswapPool.ScalingFactorController = initialControllerAddr + err := s.App.GAMMKeeper.SetPool(s.Ctx, stableswapPool) + s.Require().NoError(err) + + // attempt to adjust the scaling factor from the new address - it should fail + err = s.App.GAMMKeeper.SetStableSwapScalingFactors(s.Ctx, tc.poolId, []uint64{1, 2}, updatedControllerAddr) + s.Require().ErrorIs(err, types.ErrNotScalingFactorGovernor) + } else { + s.prepareCustomBalancerPool( + defaultAcctFunds, + defaultPoolAssets, + defaultPoolParams) + } + + err := s.App.GAMMKeeper.SetStableSwapScalingFactorController(s.Ctx, tc.poolId, updatedControllerAddr) + if tc.expError != nil { + s.Require().Error(err) + s.Require().EqualError(err, tc.expError.Error()) + } else { + s.Require().NoError(err) + + // confirm the scaling factor controller has been updated + pool, _ := s.App.GAMMKeeper.GetPoolAndPoke(s.Ctx, tc.poolId) + stableswapPool, _ := pool.(*stableswap.Pool) + s.Require().Equal(updatedControllerAddr, stableswapPool.ScalingFactorController) + + // confirm the new controller can update the scaling factor + err = s.App.GAMMKeeper.SetStableSwapScalingFactors(s.Ctx, tc.poolId, []uint64{1, 2}, updatedControllerAddr) + s.Require().NoError(err) + } + }) + } +} + func (suite *KeeperTestSuite) TestGetMaximalNoSwapLPAmount() { tests := map[string]struct { poolId uint64 diff --git a/x/gamm/types/codec.go b/x/gamm/types/codec.go index 45ad44fbfe9..416d235d0bd 100644 --- a/x/gamm/types/codec.go +++ b/x/gamm/types/codec.go @@ -24,6 +24,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&UpdateMigrationRecordsProposal{}, "osmosis/gamm/update-migration-records-proposal", nil) cdc.RegisterConcrete(&ReplaceMigrationRecordsProposal{}, "osmosis/gamm/replace-migration-records-proposal", nil) cdc.RegisterConcrete(&CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{}, "osmosis/gamm/create-cl-pool-and-cfmm-link", nil) + cdc.RegisterConcrete(&SetScalingFactorControllerProposal{}, "osmosis/gamm/scaling-factor-controller", nil) } func RegisterInterfaces(registry types.InterfaceRegistry) { @@ -49,6 +50,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &UpdateMigrationRecordsProposal{}, &ReplaceMigrationRecordsProposal{}, &CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{}, + &SetScalingFactorControllerProposal{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/gamm/types/gov.go b/x/gamm/types/gov.go index a962515e6f7..2424c395b6d 100644 --- a/x/gamm/types/gov.go +++ b/x/gamm/types/gov.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + gammmigration "github.com/osmosis-labs/osmosis/v17/x/gamm/types/migration" ) @@ -13,6 +14,7 @@ const ( ProposalTypeUpdateMigrationRecords = "UpdateMigrationRecords" ProposalTypeReplaceMigrationRecords = "ReplaceMigrationRecords" ProposalTypeCreateConcentratedLiquidityPoolAndLinktoCFMM = "CreateConcentratedLiquidityPoolAndLinktoCFMM" + ProposalTypeSetScalingFactorController = "SetScalingFactorController" ) // Init registers proposals to update and replace migration records. @@ -23,12 +25,15 @@ func init() { govtypes.RegisterProposalTypeCodec(&ReplaceMigrationRecordsProposal{}, "osmosis/ReplaceMigrationRecordsProposal") govtypes.RegisterProposalType(ProposalTypeCreateConcentratedLiquidityPoolAndLinktoCFMM) govtypes.RegisterProposalTypeCodec(&CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{}, "osmosis/CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal") + govtypes.RegisterProposalType(ProposalTypeSetScalingFactorController) + govtypes.RegisterProposalTypeCodec(&SetScalingFactorControllerProposal{}, "osmosis/SetScalingFactorControllerProposal") } var ( _ govtypes.Content = &UpdateMigrationRecordsProposal{} _ govtypes.Content = &ReplaceMigrationRecordsProposal{} _ govtypes.Content = &CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal{} + _ govtypes.Content = &SetScalingFactorControllerProposal{} ) // NewReplacePoolIncentivesProposal returns a new instance of a replace migration record's proposal struct. @@ -213,3 +218,53 @@ Records: %s `, p.Title, p.Description, recordsStr)) return b.String() } + +// NewSetScalingFactorControllerProposal returns a new instance of a replace migration record's proposal struct. +func NewSetScalingFactorControllerProposal(title, description string, poolId uint64, controllerAddress string) govtypes.Content { + return &SetScalingFactorControllerProposal{ + Title: title, + Description: description, + PoolId: poolId, + ControllerAddress: controllerAddress, + } +} + +// GetTitle gets the title of the proposal +func (p *SetScalingFactorControllerProposal) GetTitle() string { return p.Title } + +// GetDescription gets the description of the proposal +func (p *SetScalingFactorControllerProposal) GetDescription() string { return p.Description } + +// ProposalRoute returns the router key for the proposal +func (p *SetScalingFactorControllerProposal) ProposalRoute() string { return RouterKey } + +// ProposalType returns the type of the proposal +func (p *SetScalingFactorControllerProposal) ProposalType() string { + return ProposalTypeReplaceMigrationRecords +} + +// ValidateBasic validates a governance proposal's abstract and basic contents +func (p *SetScalingFactorControllerProposal) ValidateBasic() error { + err := govtypes.ValidateAbstract(p) + if err != nil { + return err + } + _, err = sdk.AccAddressFromBech32(p.ControllerAddress) + if err != nil { + return fmt.Errorf("Invalid controller address (%s)", err) + } + + return nil +} + +// String returns a string containing the migration record's proposal. +func (p SetScalingFactorControllerProposal) String() string { + var b strings.Builder + b.WriteString(fmt.Sprintf(`Set Scaling Factor Controller Address Proposal: + Title: %s + Description: %s + PoolId: %d + ControllerAddress: %s +`, p.Title, p.Description, p.PoolId, p.ControllerAddress)) + return b.String() +} diff --git a/x/gamm/types/gov.pb.go b/x/gamm/types/gov.pb.go index 2a9cee5853e..2a0dec0b3cd 100644 --- a/x/gamm/types/gov.pb.go +++ b/x/gamm/types/gov.pb.go @@ -228,63 +228,110 @@ func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) XXX_DiscardUnkno var xxx_messageInfo_CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal proto.InternalMessageInfo +// SetScalingFactorControllerProposal is a gov Content type for updating the +// scaling factor controller address of a stableswap pool +type SetScalingFactorControllerProposal struct { + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + PoolId uint64 `protobuf:"varint,3,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` + ControllerAddress string `protobuf:"bytes,4,opt,name=controller_address,json=controllerAddress,proto3" json:"controller_address,omitempty"` +} + +func (m *SetScalingFactorControllerProposal) Reset() { *m = SetScalingFactorControllerProposal{} } +func (*SetScalingFactorControllerProposal) ProtoMessage() {} +func (*SetScalingFactorControllerProposal) Descriptor() ([]byte, []int) { + return fileDescriptor_f31b9a6c0dbbdfa3, []int{4} +} +func (m *SetScalingFactorControllerProposal) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetScalingFactorControllerProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetScalingFactorControllerProposal.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 *SetScalingFactorControllerProposal) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetScalingFactorControllerProposal.Merge(m, src) +} +func (m *SetScalingFactorControllerProposal) XXX_Size() int { + return m.Size() +} +func (m *SetScalingFactorControllerProposal) XXX_DiscardUnknown() { + xxx_messageInfo_SetScalingFactorControllerProposal.DiscardUnknown(m) +} + +var xxx_messageInfo_SetScalingFactorControllerProposal proto.InternalMessageInfo + func init() { proto.RegisterType((*ReplaceMigrationRecordsProposal)(nil), "osmosis.gamm.v1beta1.ReplaceMigrationRecordsProposal") proto.RegisterType((*UpdateMigrationRecordsProposal)(nil), "osmosis.gamm.v1beta1.UpdateMigrationRecordsProposal") proto.RegisterType((*PoolRecordWithCFMMLink)(nil), "osmosis.gamm.v1beta1.PoolRecordWithCFMMLink") proto.RegisterType((*CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal)(nil), "osmosis.gamm.v1beta1.CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal") + proto.RegisterType((*SetScalingFactorControllerProposal)(nil), "osmosis.gamm.v1beta1.SetScalingFactorControllerProposal") } func init() { proto.RegisterFile("osmosis/gamm/v1beta1/gov.proto", fileDescriptor_f31b9a6c0dbbdfa3) } var fileDescriptor_f31b9a6c0dbbdfa3 = []byte{ - // 731 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x55, 0xbf, 0x6f, 0xd3, 0x40, - 0x14, 0x8e, 0x93, 0xb4, 0x08, 0xb7, 0x45, 0xd4, 0x04, 0x1a, 0x5a, 0x64, 0x07, 0x0f, 0xa5, 0x20, - 0x6a, 0x37, 0xfc, 0x10, 0x52, 0x24, 0x86, 0x26, 0x50, 0xa9, 0xa8, 0x85, 0xca, 0xb4, 0x20, 0xb1, - 0x58, 0x97, 0xf3, 0xd5, 0x39, 0xc5, 0xbe, 0x33, 0xf6, 0xb5, 0xb4, 0x23, 0x03, 0x02, 0x31, 0x31, - 0x22, 0xa6, 0xfe, 0x09, 0x0c, 0xfc, 0x11, 0x15, 0x53, 0x47, 0xc4, 0x60, 0xa1, 0x76, 0xa0, 0x73, - 0x46, 0x26, 0x74, 0x77, 0x76, 0x15, 0x20, 0x02, 0x15, 0x26, 0x96, 0x24, 0xef, 0xbd, 0xcf, 0xdf, - 0xbb, 0xf7, 0xdd, 0xf7, 0x62, 0x55, 0xa7, 0x49, 0x48, 0x13, 0x9c, 0xd8, 0x3e, 0x08, 0x43, 0x7b, - 0xb3, 0xde, 0x46, 0x0c, 0xd4, 0x6d, 0x9f, 0x6e, 0x5a, 0x51, 0x4c, 0x19, 0xd5, 0x2a, 0x59, 0xdd, - 0xe2, 0x75, 0x2b, 0xab, 0x4f, 0x56, 0x7c, 0xea, 0x53, 0x01, 0xb0, 0xf9, 0x2f, 0x89, 0x9d, 0x34, - 0x07, 0x73, 0x21, 0x82, 0x38, 0x81, 0xc4, 0x5c, 0x1c, 0x88, 0x49, 0x3a, 0x20, 0x46, 0x5e, 0x06, - 0x39, 0x0f, 0x05, 0xc6, 0x95, 0xfc, 0x32, 0xc8, 0x4a, 0xe3, 0x20, 0xc4, 0x84, 0xda, 0xe2, 0x53, - 0xa6, 0xcc, 0x97, 0x45, 0xd5, 0x70, 0x50, 0x14, 0x00, 0x88, 0x96, 0xb1, 0x1f, 0x03, 0x86, 0x29, - 0x71, 0x10, 0xa4, 0xb1, 0x97, 0xac, 0xc4, 0x34, 0xa2, 0x09, 0x08, 0xb4, 0x8a, 0x3a, 0xc4, 0x30, - 0x0b, 0x50, 0x55, 0xa9, 0x29, 0x33, 0x27, 0x1d, 0x19, 0x68, 0x35, 0x75, 0xc4, 0x43, 0x09, 0x8c, - 0x71, 0xc4, 0x9f, 0xa9, 0x16, 0x45, 0xad, 0x3f, 0xa5, 0xad, 0xaa, 0x27, 0x62, 0x49, 0x55, 0x2d, - 0xd5, 0x4a, 0x33, 0x23, 0xd7, 0x6e, 0x58, 0x83, 0xe4, 0xb0, 0x9a, 0x20, 0x00, 0x04, 0xa2, 0x78, - 0x95, 0xb6, 0x28, 0x81, 0x88, 0xb0, 0x18, 0x30, 0xe4, 0xad, 0x50, 0x1a, 0x2c, 0x61, 0xd2, 0x6d, - 0x96, 0x77, 0x53, 0xa3, 0xe0, 0xe4, 0x54, 0x8d, 0x47, 0xaf, 0x76, 0x8c, 0xc2, 0xdb, 0x1d, 0xa3, - 0x70, 0xb8, 0x63, 0x28, 0x1f, 0x3f, 0xcc, 0x4e, 0x66, 0x23, 0x72, 0xd1, 0x73, 0xc6, 0x16, 0x25, - 0x0c, 0x11, 0xf6, 0xfa, 0xeb, 0xfb, 0x2b, 0x97, 0x72, 0xc5, 0xfe, 0x30, 0xa5, 0xf9, 0xa2, 0xa8, - 0xea, 0x6b, 0x91, 0x07, 0xd8, 0xff, 0x22, 0xc4, 0xda, 0xf1, 0x84, 0x98, 0xce, 0x85, 0xf8, 0xfd, - 0x90, 0xe6, 0x61, 0x49, 0x3d, 0xc7, 0x5b, 0xca, 0xfc, 0x63, 0xcc, 0x3a, 0xad, 0x85, 0xe5, 0x65, - 0x7e, 0x00, 0xed, 0xb2, 0x3a, 0xec, 0x21, 0x42, 0xc3, 0x39, 0x29, 0x40, 0x73, 0xbc, 0x97, 0x1a, - 0x63, 0xdb, 0x20, 0x0c, 0x1a, 0xa6, 0xcc, 0x9b, 0x4e, 0x06, 0x38, 0x82, 0xd6, 0xa5, 0x1e, 0xbf, - 0x40, 0xeb, 0x39, 0xb4, 0xae, 0x35, 0xd4, 0x51, 0x86, 0x61, 0xd7, 0x4d, 0x22, 0x00, 0x31, 0xf1, - 0xab, 0xa5, 0x9a, 0x32, 0x53, 0x6e, 0x4e, 0xf4, 0x52, 0xe3, 0x8c, 0x7c, 0xa0, 0xbf, 0x6a, 0x3a, - 0x23, 0x3c, 0x7c, 0x28, 0x23, 0xed, 0xb9, 0xa2, 0x9e, 0x45, 0x5b, 0x11, 0x25, 0x88, 0x30, 0x17, - 0x30, 0x37, 0x8a, 0x31, 0x44, 0x2e, 0x25, 0xa8, 0x5a, 0x16, 0x6d, 0xef, 0x73, 0xc9, 0x3e, 0xa7, - 0xc6, 0xb4, 0x8f, 0x59, 0x67, 0xa3, 0x6d, 0x41, 0x1a, 0x66, 0x2b, 0x91, 0x7d, 0xcd, 0x26, 0x5e, - 0xd7, 0x66, 0xdb, 0x11, 0x4a, 0xac, 0x45, 0xc2, 0x7a, 0xa9, 0x71, 0x41, 0xf6, 0x1c, 0x48, 0x6a, - 0x3a, 0x5a, 0x9e, 0x9f, 0x67, 0x2b, 0x3c, 0xfb, 0x80, 0x20, 0xad, 0xab, 0x8e, 0x25, 0x51, 0x8c, - 0x80, 0xe7, 0xae, 0x03, 0xc8, 0x68, 0x5c, 0x1d, 0x12, 0xad, 0x17, 0x8e, 0xd1, 0xfa, 0x0e, 0x82, - 0xbd, 0xd4, 0xa8, 0xc8, 0xd6, 0x3f, 0x90, 0x99, 0xce, 0xa8, 0x8c, 0x17, 0x44, 0xa8, 0xdd, 0x55, - 0x4f, 0xb7, 0x33, 0x97, 0xb8, 0x11, 0xa5, 0x81, 0x8b, 0xbd, 0xea, 0xb0, 0x10, 0x6c, 0xaa, 0x97, - 0x1a, 0x13, 0x92, 0xe1, 0x67, 0x84, 0xe9, 0x9c, 0xca, 0x53, 0xfc, 0x66, 0x17, 0xbd, 0x46, 0x99, - 0x7b, 0xc6, 0xfc, 0x56, 0x54, 0x6f, 0xb6, 0x62, 0x04, 0x18, 0xea, 0xf7, 0xdb, 0x12, 0x7e, 0xba, - 0x81, 0x3d, 0xcc, 0xb6, 0x39, 0x36, 0x99, 0x27, 0x1e, 0xbf, 0x7b, 0x46, 0xb9, 0x0b, 0xfe, 0x79, - 0x13, 0xde, 0x29, 0xea, 0x94, 0x38, 0x54, 0x66, 0x62, 0xf7, 0x19, 0x66, 0x1d, 0x17, 0xae, 0x87, - 0xa1, 0x1b, 0x60, 0xd2, 0xcd, 0xd6, 0xe3, 0xea, 0xe0, 0xf5, 0x18, 0xec, 0xca, 0xa6, 0xc5, 0x85, - 0xee, 0xa5, 0xc6, 0xb4, 0x1c, 0x1e, 0x8a, 0x81, 0x5c, 0x18, 0xc8, 0xe9, 0x01, 0xf1, 0x04, 0xb5, - 0xcb, 0xa8, 0xe8, 0x63, 0x3a, 0x13, 0xd1, 0x11, 0x4f, 0x22, 0x88, 0xd6, 0xc3, 0x90, 0x13, 0x35, - 0x82, 0xe3, 0x2d, 0xd4, 0xed, 0x7c, 0xa1, 0xfe, 0x4a, 0xc2, 0xe6, 0xbd, 0xdd, 0x7d, 0x5d, 0xd9, - 0xdb, 0xd7, 0x95, 0x2f, 0xfb, 0xba, 0xf2, 0xe6, 0x40, 0x2f, 0xec, 0x1d, 0xe8, 0x85, 0x4f, 0x07, - 0x7a, 0xe1, 0xc9, 0x5c, 0x9f, 0x63, 0xb2, 0x1e, 0xb3, 0x01, 0x68, 0x27, 0x79, 0x60, 0x6f, 0xd6, - 0x6f, 0xd9, 0x5b, 0xf2, 0x15, 0x20, 0xfc, 0xd3, 0x1e, 0x16, 0x7f, 0xe6, 0xd7, 0xbf, 0x07, 0x00, - 0x00, 0xff, 0xff, 0xa0, 0x4f, 0xff, 0x36, 0x8f, 0x06, 0x00, 0x00, + // 801 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x55, 0xcf, 0x6f, 0xe3, 0x44, + 0x14, 0x8e, 0x93, 0x6c, 0x56, 0x4c, 0x77, 0x11, 0x35, 0x81, 0x84, 0x2e, 0xb2, 0x83, 0x0f, 0xa5, + 0xac, 0x88, 0xbd, 0xe1, 0x87, 0x90, 0x22, 0x71, 0x68, 0x02, 0x95, 0x16, 0x6d, 0xa1, 0x72, 0x77, + 0x41, 0x70, 0xb1, 0x26, 0xe3, 0xa9, 0x33, 0x8a, 0x3d, 0x63, 0x66, 0x66, 0xcb, 0xf6, 0xc8, 0x01, + 0x81, 0x38, 0x71, 0x44, 0x9c, 0xfa, 0x27, 0x70, 0xe0, 0x8f, 0xa8, 0x38, 0xf5, 0x88, 0x38, 0x58, + 0xa8, 0x3d, 0xd0, 0x73, 0x8e, 0x5c, 0x40, 0x33, 0x63, 0x97, 0x00, 0x11, 0x55, 0xe8, 0x89, 0x4b, + 0xe2, 0xf7, 0xde, 0xe7, 0xef, 0xf9, 0x7d, 0xf3, 0x3e, 0x0d, 0x70, 0x98, 0xc8, 0x98, 0x20, 0x22, + 0x48, 0x60, 0x96, 0x05, 0x87, 0x83, 0x09, 0x96, 0x70, 0x10, 0x24, 0xec, 0xd0, 0xcf, 0x39, 0x93, + 0xcc, 0x6e, 0x97, 0x75, 0x5f, 0xd5, 0xfd, 0xb2, 0xbe, 0xd1, 0x4e, 0x58, 0xc2, 0x34, 0x20, 0x50, + 0x4f, 0x06, 0xbb, 0xe1, 0x2d, 0xe7, 0xc2, 0x14, 0x2b, 0x02, 0x83, 0x79, 0x69, 0x29, 0x46, 0x4c, + 0x21, 0xc7, 0x71, 0x09, 0x79, 0x01, 0x69, 0x4c, 0x64, 0xf8, 0x4d, 0x50, 0x96, 0xd6, 0x61, 0x46, + 0x28, 0x0b, 0xf4, 0xaf, 0x49, 0x79, 0x5f, 0xd6, 0x81, 0x1b, 0xe2, 0x3c, 0x85, 0x08, 0xef, 0x92, + 0x84, 0x43, 0x49, 0x18, 0x0d, 0x31, 0x62, 0x3c, 0x16, 0x7b, 0x9c, 0xe5, 0x4c, 0xc0, 0xd4, 0x6e, + 0x83, 0x1b, 0x92, 0xc8, 0x14, 0x77, 0xad, 0x9e, 0xb5, 0xf5, 0x54, 0x68, 0x02, 0xbb, 0x07, 0xd6, + 0x62, 0x2c, 0x10, 0x27, 0xb9, 0x7a, 0xa7, 0x5b, 0xd7, 0xb5, 0xc5, 0x94, 0xfd, 0x10, 0xdc, 0xe4, + 0x86, 0xaa, 0xdb, 0xe8, 0x35, 0xb6, 0xd6, 0x5e, 0x7b, 0xc3, 0x5f, 0x26, 0x87, 0x3f, 0x82, 0x29, + 0xa4, 0x08, 0xf3, 0x87, 0x6c, 0xcc, 0x28, 0xc2, 0x54, 0x72, 0x28, 0x71, 0xbc, 0xc7, 0x58, 0xfa, + 0x80, 0xd0, 0xd9, 0xa8, 0x79, 0x52, 0xb8, 0xb5, 0xb0, 0xa2, 0x1a, 0x7e, 0xf8, 0xd5, 0xb1, 0x5b, + 0xfb, 0xf6, 0xd8, 0xad, 0x5d, 0x1c, 0xbb, 0xd6, 0x8f, 0x3f, 0xf4, 0x37, 0xca, 0x11, 0x95, 0xe8, + 0x15, 0xe3, 0x98, 0x51, 0x89, 0xa9, 0xfc, 0xfa, 0xd7, 0xef, 0xef, 0xbe, 0x5c, 0x29, 0x76, 0xc5, + 0x94, 0xde, 0x17, 0x75, 0xe0, 0x3c, 0xca, 0x63, 0x28, 0xff, 0x2f, 0x42, 0x3c, 0x5a, 0x4d, 0x88, + 0xcd, 0x4a, 0x88, 0x7f, 0x1f, 0xd2, 0xbb, 0x68, 0x80, 0xe7, 0x55, 0x4b, 0x93, 0xff, 0x88, 0xc8, + 0xe9, 0x78, 0x67, 0x77, 0x57, 0x7d, 0x80, 0xfd, 0x0a, 0x68, 0xc5, 0x98, 0xb2, 0xec, 0x9e, 0x11, + 0x60, 0xb4, 0x3e, 0x2f, 0xdc, 0xdb, 0x47, 0x30, 0x4b, 0x87, 0x9e, 0xc9, 0x7b, 0x61, 0x09, 0xb8, + 0x84, 0x0e, 0x8c, 0x1e, 0xff, 0x80, 0x0e, 0x2a, 0xe8, 0xc0, 0x1e, 0x82, 0x5b, 0x92, 0xa0, 0x59, + 0x24, 0x72, 0x88, 0x08, 0x4d, 0xba, 0x8d, 0x9e, 0xb5, 0xd5, 0x1c, 0x75, 0xe6, 0x85, 0xfb, 0xac, + 0x79, 0x61, 0xb1, 0xea, 0x85, 0x6b, 0x2a, 0xdc, 0x37, 0x91, 0xfd, 0xb9, 0x05, 0x9e, 0xc3, 0x4f, + 0x72, 0x46, 0x31, 0x95, 0x11, 0x94, 0x51, 0xce, 0x09, 0xc2, 0x11, 0xa3, 0xb8, 0xdb, 0xd4, 0x6d, + 0xdf, 0x57, 0x92, 0xfd, 0x5c, 0xb8, 0x9b, 0x09, 0x91, 0xd3, 0xc7, 0x13, 0x1f, 0xb1, 0xac, 0xb4, + 0x44, 0xf9, 0xd7, 0x17, 0xf1, 0x2c, 0x90, 0x47, 0x39, 0x16, 0xfe, 0x7d, 0x2a, 0xe7, 0x85, 0xfb, + 0xa2, 0xe9, 0xb9, 0x94, 0xd4, 0x0b, 0xed, 0x2a, 0xbf, 0x2d, 0xf7, 0x54, 0xf6, 0x03, 0x8a, 0xed, + 0x19, 0xb8, 0x2d, 0x72, 0x8e, 0x61, 0x1c, 0x1d, 0x40, 0x24, 0x19, 0xef, 0xde, 0xd0, 0xad, 0x77, + 0x56, 0x68, 0xfd, 0x0e, 0x46, 0xf3, 0xc2, 0x6d, 0x9b, 0xd6, 0x7f, 0x21, 0xf3, 0xc2, 0x5b, 0x26, + 0xde, 0xd1, 0xa1, 0xfd, 0x2e, 0x78, 0x66, 0x52, 0x6e, 0x49, 0x94, 0x33, 0x96, 0x46, 0x24, 0xee, + 0xb6, 0xb4, 0x60, 0x77, 0xe6, 0x85, 0xdb, 0x31, 0x0c, 0x7f, 0x47, 0x78, 0xe1, 0xd3, 0x55, 0x4a, + 0x9d, 0xec, 0xfd, 0x78, 0xd8, 0x54, 0x3b, 0xe3, 0xfd, 0x56, 0x07, 0x6f, 0x8e, 0x39, 0x86, 0x12, + 0x2f, 0xee, 0xdb, 0x03, 0xf2, 0xe9, 0x63, 0x12, 0x13, 0x79, 0xa4, 0xb0, 0x62, 0x9b, 0xc6, 0xea, + 0xec, 0x25, 0x53, 0x5b, 0x70, 0x6d, 0x27, 0x7c, 0x67, 0x81, 0x3b, 0xfa, 0xa3, 0xca, 0x25, 0x8e, + 0x3e, 0x23, 0x72, 0x1a, 0xa1, 0x83, 0x2c, 0x8b, 0x52, 0x42, 0x67, 0xa5, 0x3d, 0x5e, 0x5d, 0x6e, + 0x8f, 0xe5, 0x5b, 0x39, 0xf2, 0x95, 0xd0, 0xf3, 0xc2, 0xdd, 0x34, 0xc3, 0x23, 0x3d, 0x50, 0x84, + 0x52, 0x33, 0x3d, 0xa4, 0xb1, 0xa6, 0x8e, 0x24, 0xd3, 0x7d, 0xbc, 0xb0, 0x93, 0x5f, 0xf2, 0x08, + 0x4d, 0x74, 0x90, 0x65, 0x8a, 0x68, 0x98, 0xae, 0x66, 0xa8, 0xb7, 0x2b, 0x43, 0xfd, 0x27, 0x09, + 0xbd, 0xdf, 0x2d, 0xe0, 0xed, 0x63, 0xb9, 0x8f, 0x60, 0x4a, 0x68, 0x62, 0x8e, 0x57, 0xb1, 0x73, + 0x96, 0xa6, 0x98, 0x5f, 0x5b, 0xe9, 0x0e, 0xb8, 0x59, 0xed, 0x87, 0x36, 0x54, 0xd8, 0xca, 0xf5, + 0xd1, 0xdb, 0x7d, 0x60, 0xa3, 0xcb, 0x36, 0x11, 0x8c, 0x63, 0x8e, 0x85, 0x30, 0x76, 0x09, 0xd7, + 0xff, 0xac, 0x6c, 0x9b, 0xc2, 0xf0, 0xe3, 0xd5, 0x44, 0xb9, 0x5b, 0x89, 0x72, 0xf5, 0x68, 0xa3, + 0xf7, 0x4e, 0xce, 0x1c, 0xeb, 0xf4, 0xcc, 0xb1, 0x7e, 0x39, 0x73, 0xac, 0x6f, 0xce, 0x9d, 0xda, + 0xe9, 0xb9, 0x53, 0xfb, 0xe9, 0xdc, 0xa9, 0x7d, 0x72, 0x6f, 0xc1, 0x33, 0x25, 0x61, 0x3f, 0x85, + 0x13, 0x51, 0x05, 0xc1, 0xe1, 0xe0, 0xad, 0xe0, 0x89, 0xb9, 0x04, 0xb5, 0x83, 0x26, 0x2d, 0x7d, + 0x9d, 0xbd, 0xfe, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x68, 0x7c, 0x85, 0x26, 0x91, 0x07, 0x00, + 0x00, } func (this *ReplaceMigrationRecordsProposal) Equal(that interface{}) bool { @@ -431,6 +478,39 @@ func (this *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Equal(that in } return true } +func (this *SetScalingFactorControllerProposal) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*SetScalingFactorControllerProposal) + if !ok { + that2, ok := that.(SetScalingFactorControllerProposal) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Title != that1.Title { + return false + } + if this.Description != that1.Description { + return false + } + if this.PoolId != that1.PoolId { + return false + } + if this.ControllerAddress != that1.ControllerAddress { + return false + } + return true +} func (m *ReplaceMigrationRecordsProposal) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -651,6 +731,55 @@ func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) MarshalToSizedBu return len(dAtA) - i, nil } +func (m *SetScalingFactorControllerProposal) 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 *SetScalingFactorControllerProposal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetScalingFactorControllerProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ControllerAddress) > 0 { + i -= len(m.ControllerAddress) + copy(dAtA[i:], m.ControllerAddress) + i = encodeVarintGov(dAtA, i, uint64(len(m.ControllerAddress))) + i-- + dAtA[i] = 0x22 + } + if m.PoolId != 0 { + i = encodeVarintGov(dAtA, i, uint64(m.PoolId)) + i-- + dAtA[i] = 0x18 + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintGov(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Title) > 0 { + i -= len(m.Title) + copy(dAtA[i:], m.Title) + i = encodeVarintGov(dAtA, i, uint64(len(m.Title))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintGov(dAtA []byte, offset int, v uint64) int { offset -= sovGov(v) base := offset @@ -758,6 +887,30 @@ func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Size() (n int) { return n } +func (m *SetScalingFactorControllerProposal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Title) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + if m.PoolId != 0 { + n += 1 + sovGov(uint64(m.PoolId)) + } + l = len(m.ControllerAddress) + if l > 0 { + n += 1 + l + sovGov(uint64(l)) + } + return n +} + func sovGov(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1428,6 +1581,171 @@ func (m *CreateConcentratedLiquidityPoolsAndLinktoCFMMProposal) Unmarshal(dAtA [ } return nil } +func (m *SetScalingFactorControllerProposal) 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 ErrIntOverflowGov + } + 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: SetScalingFactorControllerProposal: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetScalingFactorControllerProposal: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Title", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Title = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + 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 ErrIntOverflowGov + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PoolId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ControllerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGov + } + 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 ErrInvalidLengthGov + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGov + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ControllerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGov(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGov + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipGov(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 962220f29879ae0245da0beddea0303ffeef5ecc Mon Sep 17 00:00:00 2001 From: alpo <62043214+AlpinYukseloglu@users.noreply.github.com> Date: Sat, 5 Aug 2023 10:36:22 -0700 Subject: [PATCH 12/18] add range test covering both neg accum cases (spread and incentives) (#5934) --- x/concentrated-liquidity/position_test.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/x/concentrated-liquidity/position_test.go b/x/concentrated-liquidity/position_test.go index 81df02c09d2..9a3c33b5547 100644 --- a/x/concentrated-liquidity/position_test.go +++ b/x/concentrated-liquidity/position_test.go @@ -2462,6 +2462,15 @@ func (s *KeeperTestSuite) TestMultipleRanges() { }, rangeTestParams: DefaultRangeTestParams, }, + "two adjacent ranges (flipped order)": { + // Note: this setup covers both edge cases where initial interval accumulation is negative + // for spread rewards and incentives + tickRanges: [][]int64{ + {10000, 20000}, + {-10000, 10000}, + }, + rangeTestParams: DefaultRangeTestParams, + }, "two adjacent ranges with current tick smaller than both": { tickRanges: [][]int64{ {-10000, 10000}, From af47f40b1221bb0960c3624e0415a4f5445b8f68 Mon Sep 17 00:00:00 2001 From: Sishir Giri Date: Sun, 6 Aug 2023 12:40:40 -0700 Subject: [PATCH 13/18] enabled valset sim (#5966) --- x/valset-pref/simulation/sim_msgs.go | 2 +- x/valset-pref/valpref-module/module.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index b41d4ba3b4d..ec4a93b94dc 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -73,7 +73,7 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC return nil, fmt.Errorf("Validator not found") } - // check if the user has delegated tokens to the valset + // check if the user has delegated tokens to the valset or existing delegation del, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) if !found { return nil, fmt.Errorf("user hasn't delegated tokens to the validator, %s", val.String()) diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index b29a145be1c..41a503003ff 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -23,6 +23,7 @@ import ( valsetprefcli "github.com/osmosis-labs/osmosis/v17/x/valset-pref/client/cli" "github.com/osmosis-labs/osmosis/v17/x/valset-pref/client/grpc" "github.com/osmosis-labs/osmosis/v17/x/valset-pref/client/queryproto" + "github.com/osmosis-labs/osmosis/v17/x/valset-pref/simulation" "github.com/osmosis-labs/osmosis/v17/x/valset-pref/types" ) @@ -169,9 +170,9 @@ func (AppModule) ConsensusVersion() uint64 { return 1 } // WeightedOperations returns the all the valset module operations with their respective weights. func (am AppModule) Actions() []simtypes.Action { return []simtypes.Action{ - // simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), - // simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), - // simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), - // simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), + simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), + simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), + simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), + simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), } } From 7bbeb1bdd23e4ac7203cc6f77541282ac5393ea3 Mon Sep 17 00:00:00 2001 From: Sishir Giri Date: Sun, 6 Aug 2023 14:46:06 -0700 Subject: [PATCH 14/18] Revert "enabled valset sim (#5966)" (#5968) This reverts commit af47f40b1221bb0960c3624e0415a4f5445b8f68. --- x/valset-pref/simulation/sim_msgs.go | 2 +- x/valset-pref/valpref-module/module.go | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index ec4a93b94dc..b41d4ba3b4d 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -73,7 +73,7 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC return nil, fmt.Errorf("Validator not found") } - // check if the user has delegated tokens to the valset or existing delegation + // check if the user has delegated tokens to the valset del, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) if !found { return nil, fmt.Errorf("user hasn't delegated tokens to the validator, %s", val.String()) diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index 41a503003ff..b29a145be1c 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -23,7 +23,6 @@ import ( valsetprefcli "github.com/osmosis-labs/osmosis/v17/x/valset-pref/client/cli" "github.com/osmosis-labs/osmosis/v17/x/valset-pref/client/grpc" "github.com/osmosis-labs/osmosis/v17/x/valset-pref/client/queryproto" - "github.com/osmosis-labs/osmosis/v17/x/valset-pref/simulation" "github.com/osmosis-labs/osmosis/v17/x/valset-pref/types" ) @@ -170,9 +169,9 @@ func (AppModule) ConsensusVersion() uint64 { return 1 } // WeightedOperations returns the all the valset module operations with their respective weights. func (am AppModule) Actions() []simtypes.Action { return []simtypes.Action{ - simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), - simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), - simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), - simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), + // simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), + // simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), + // simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), + // simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), } } From 766a311d68648e434521b9ae0d4f37d99017d0ae Mon Sep 17 00:00:00 2001 From: doggystylez <98429202+doggystylez@users.noreply.github.com> Date: Mon, 7 Aug 2023 03:02:36 -0400 Subject: [PATCH 15/18] fix: spot price for cosmwasm pools (#5950) * fix spot price for cosmwasm pools * Update CHANGELOG.md --------- Co-authored-by: Adam Tucker --- CHANGELOG.md | 5 +++-- app/apptesting/cosmwasmpool.go | 2 +- x/cosmwasmpool/model/pool.go | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30a8f46f185..7ce9634072e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,8 +57,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#5831](https://github.com/osmosis-labs/osmosis/pull/5831) Fix superfluid_delegations query * [#5835](https://github.com/osmosis-labs/osmosis/pull/5835) Fix println's for "amountZeroInRemainingBigDec before fee" making it into production -* [#5841] (https://github.com/osmosis-labs/osmosis/pull/5841) Fix protorev's out of gas erroring of the user's transcation. -* [#5930] (https://github.com/osmosis-labs/osmosis/pull/5930) Updating Protorev Binary Search Range Logic with CL Pools +* [#5841](https://github.com/osmosis-labs/osmosis/pull/5841) Fix protorev's out of gas erroring of the user's transcation. +* [#5930](https://github.com/osmosis-labs/osmosis/pull/5930) Updating Protorev Binary Search Range Logic with CL Pools +* [#5950](https://github.com/osmosis-labs/osmosis/pull/5950) fix: spot price for cosmwasm pool types ### Misc Improvements diff --git a/app/apptesting/cosmwasmpool.go b/app/apptesting/cosmwasmpool.go index bc17512accb..94251291fa6 100644 --- a/app/apptesting/cosmwasmpool.go +++ b/app/apptesting/cosmwasmpool.go @@ -29,7 +29,7 @@ func (s *KeeperTestHelper) PrepareCosmWasmPool() cosmwasmpooltypes.CosmWasmExten return s.PrepareCustomTransmuterPool(s.TestAccs[0], []string{DefaultTransmuterDenomA, DefaultTransmuterDenomB}) } -// PrepareCustomConcentratedPool sets up a concentrated liquidity pool with the custom parameters. +// PrepareCustomTransmuterPool sets up a transmuter pool with the custom parameters. func (s *KeeperTestHelper) PrepareCustomTransmuterPool(owner sdk.AccAddress, denoms []string) cosmwasmpooltypes.CosmWasmExtension { // Mint some assets to the account. s.FundAcc(s.TestAccs[0], DefaultAcctFunds) diff --git a/x/cosmwasmpool/model/pool.go b/x/cosmwasmpool/model/pool.go index 10014ca1a25..79b833a9196 100644 --- a/x/cosmwasmpool/model/pool.go +++ b/x/cosmwasmpool/model/pool.go @@ -71,7 +71,7 @@ func (p Pool) IsActive(ctx sdk.Context) bool { } // SpotPrice returns the spot price of the pool. -func (p Pool) SpotPrice(ctx sdk.Context, baseAssetDenom string, quoteAssetDenom string) (sdk.Dec, error) { +func (p Pool) SpotPrice(ctx sdk.Context, quoteAssetDenom string, baseAssetDenom string) (sdk.Dec, error) { request := msg.SpotPriceQueryMsg{ SpotPrice: msg.SpotPrice{ QuoteAssetDenom: quoteAssetDenom, From ece091abb161e27cf0f66b9dd866ad8f77950026 Mon Sep 17 00:00:00 2001 From: Nicolas Lara Date: Mon, 7 Aug 2023 16:15:07 +0200 Subject: [PATCH 16/18] Updated pfm and async icq (#5954) * updated pfm and async icq * updated to the correct version * updated pfm * fixed e2e for new pfm * go mod tidy * updated osmoutils and osmomath * updated again to the latest main * removed unnecessary prints --- app/keepers/keepers.go | 8 ++++---- app/keepers/modules.go | 2 +- app/modules.go | 4 ++-- app/upgrades/v15/constants.go | 2 +- app/upgrades/v15/upgrades.go | 2 +- go.mod | 11 ++++++----- go.sum | 23 +++++++++++------------ tests/e2e/e2e_test.go | 14 ++++++++++++-- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index 10f6f726ed8..b2195f036b3 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -62,9 +62,9 @@ import ( ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - packetforward "github.com/strangelove-ventures/packet-forward-middleware/v4/router" - packetforwardkeeper "github.com/strangelove-ventures/packet-forward-middleware/v4/router/keeper" - packetforwardtypes "github.com/strangelove-ventures/packet-forward-middleware/v4/router/types" + packetforward "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router" + packetforwardkeeper "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router/keeper" + packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router/types" // IBC Transfer: Defines the "transfer" IBC port transfer "github.com/cosmos/ibc-go/v4/modules/apps/transfer" @@ -524,7 +524,7 @@ func (appKeepers *AppKeepers) InitNormalKeepers( // // Note that the forward middleware is only integrated on the "reveive" direction. It can be safely skipped when sending. // Note also that the forward middleware is called "router", but we are using the name "forward" for clarity -// This may later be renamed upstream: https://github.com/strangelove-ventures/packet-forward-middleware/issues/10 +// This may later be renamed upstream: https://github.com/ibc-apps/middleware/packet-forward-middleware/issues/10 // // After this, the wasm keeper is required to be set on both // appkeepers.WasmHooks AND appKeepers.RateLimitingICS4Wrapper diff --git a/app/keepers/modules.go b/app/keepers/modules.go index 9a7460d4bbe..a52bc234f7f 100644 --- a/app/keepers/modules.go +++ b/app/keepers/modules.go @@ -3,10 +3,10 @@ package keepers import ( "github.com/CosmWasm/wasmd/x/wasm" wasmclient "github.com/CosmWasm/wasmd/x/wasm/client" + "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router" transfer "github.com/cosmos/ibc-go/v4/modules/apps/transfer" ibc "github.com/cosmos/ibc-go/v4/modules/core" ibcclientclient "github.com/cosmos/ibc-go/v4/modules/core/02-client/client" - "github.com/strangelove-ventures/packet-forward-middleware/v4/router" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" diff --git a/app/modules.go b/app/modules.go index 88c9765f2d9..c163cc18d41 100644 --- a/app/modules.go +++ b/app/modules.go @@ -12,8 +12,8 @@ import ( ibchost "github.com/cosmos/ibc-go/v4/modules/core/24-host" ibckeeper "github.com/cosmos/ibc-go/v4/modules/core/keeper" - packetforward "github.com/strangelove-ventures/packet-forward-middleware/v4/router" - packetforwardtypes "github.com/strangelove-ventures/packet-forward-middleware/v4/router/types" + packetforward "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router" + packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router/types" ibchookstypes "github.com/osmosis-labs/osmosis/x/ibc-hooks/types" diff --git a/app/upgrades/v15/constants.go b/app/upgrades/v15/constants.go index 2338b59a01d..509f367b25a 100644 --- a/app/upgrades/v15/constants.go +++ b/app/upgrades/v15/constants.go @@ -2,8 +2,8 @@ package v15 import ( store "github.com/cosmos/cosmos-sdk/store/types" + packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router/types" icqtypes "github.com/cosmos/ibc-apps/modules/async-icq/v4/types" - packetforwardtypes "github.com/strangelove-ventures/packet-forward-middleware/v4/router/types" "github.com/osmosis-labs/osmosis/v17/app/upgrades" poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" diff --git a/app/upgrades/v15/upgrades.go b/app/upgrades/v15/upgrades.go index d2f0ba48893..7e050a47974 100644 --- a/app/upgrades/v15/upgrades.go +++ b/app/upgrades/v15/upgrades.go @@ -1,7 +1,7 @@ package v15 import ( - packetforwardtypes "github.com/strangelove-ventures/packet-forward-middleware/v4/router/types" + packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router/types" poolmanagertypes "github.com/osmosis-labs/osmosis/v17/x/poolmanager/types" diff --git a/go.mod b/go.mod index dfc50e9c9ea..22f594aa2c4 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,8 @@ require ( github.com/cosmos/cosmos-proto v1.0.0-beta.2 github.com/cosmos/cosmos-sdk v0.47.4 github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/ibc-apps/modules/async-icq/v4 v4.0.0-20230524151648-c02fa46c2860 + github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.0.0-20230803185752-97c9635dd74a + github.com/cosmos/ibc-apps/modules/async-icq/v4 v4.0.0-20230803151532-5c60ac789ef7 github.com/cosmos/ibc-go/v4 v4.3.1 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 @@ -20,17 +21,16 @@ require ( github.com/mattn/go-sqlite3 v1.14.17 github.com/ory/dockertest/v3 v3.10.0 github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 - github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230629191111-f375469de8b6 - github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230801224523-e85e9a9cf445 + github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230804142026-a81cfe3ddde7 + github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230804142026-a81cfe3ddde7 github.com/osmosis-labs/osmosis/x/epochs v0.0.0-20230328024000-175ec88e4304 - github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230602130523-f9a94d8bbd10 + github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.6 github.com/pkg/errors v0.9.1 github.com/rakyll/statik v0.1.7 github.com/spf13/cast v1.5.1 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 - github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.5 github.com/stretchr/testify v1.8.4 github.com/tendermint/tendermint v0.37.0-rc1 github.com/tendermint/tm-db v0.6.8-0.20220506192307-f628bb5dc95b @@ -65,6 +65,7 @@ require ( github.com/kkHAIKE/contextcheck v1.1.4 // indirect github.com/maratori/testableexamples v1.0.0 // indirect github.com/nunnatsa/ginkgolinter v0.9.0 // indirect + github.com/nxadm/tail v1.4.8 // indirect github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.23.0 // indirect diff --git a/go.sum b/go.sum index fb3f5d58a65..a57c409861e 100644 --- a/go.sum +++ b/go.sum @@ -258,8 +258,10 @@ github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4 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/ibc-apps/modules/async-icq/v4 v4.0.0-20230524151648-c02fa46c2860 h1:25/KpA4WJqdFjKFsa3VEL0ctWRovkEsqIn2phCAi9v0= -github.com/cosmos/ibc-apps/modules/async-icq/v4 v4.0.0-20230524151648-c02fa46c2860/go.mod h1:X/dLZ6QxTImzno7qvD6huLhh6ZZBcRt2URn4YCLcXFY= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.0.0-20230803185752-97c9635dd74a h1:FKEtbHE+kULYf6ghxa3FvEfyR7BNde0940gAyuWborE= +github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4 v4.0.0-20230803185752-97c9635dd74a/go.mod h1:Mn/jr9pIYr1ofFuptLEi9N6MjcshTT0cpoOY4ln1DeA= +github.com/cosmos/ibc-apps/modules/async-icq/v4 v4.0.0-20230803151532-5c60ac789ef7 h1:q6OzbGXmWRbMedDejhuctDbb3M6fWyJg3DY3bzJbYVs= +github.com/cosmos/ibc-apps/modules/async-icq/v4 v4.0.0-20230803151532-5c60ac789ef7/go.mod h1:X/dLZ6QxTImzno7qvD6huLhh6ZZBcRt2URn4YCLcXFY= github.com/cosmos/ibc-go/v4 v4.3.1 h1:xbg0CaCdxK3lvgGvSaI91ROOLd7s30UqEcexH6Ba4Ys= github.com/cosmos/ibc-go/v4 v4.3.1/go.mod h1:89E+K9CxpkS/etLEcG026jPM/RSnVMcfesvRYp/0aKI= github.com/cosmos/interchain-accounts v0.2.6 h1:TV2M2g1/Rb9MCNw1YePdBKE0rcEczNj1RGHT+2iRYas= @@ -905,6 +907,7 @@ github.com/nunnatsa/ginkgolinter v0.9.0 h1:Sm0zX5QfjJzkeCjEp+t6d3Ha0jwvoDjleP9XC github.com/nunnatsa/ginkgolinter v0.9.0/go.mod h1:FHaMLURXP7qImeH6bvxWJUpyH+2tuqe5j4rW1gxJRmI= 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= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -948,16 +951,14 @@ github.com/osmosis-labs/cosmos-sdk v0.45.0-rc1.0.20230703010110-ed4eb883f2a6 h1: github.com/osmosis-labs/cosmos-sdk v0.45.0-rc1.0.20230703010110-ed4eb883f2a6/go.mod h1:9KGhMg+7ZWgZ50Wa/x8w/jN19O0TSqYLlqUj+2wwxLU= github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3 h1:YlmchqTmlwdWSmrRmXKR+PcU96ntOd8u10vTaTZdcNY= github.com/osmosis-labs/go-mutesting v0.0.0-20221208041716-b43bcd97b3b3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI= -github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230629191111-f375469de8b6 h1:Kmkx5Rh72+LB8AL6dc6fZA+IVR0INu0YIiMF2ScDhaQ= -github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230629191111-f375469de8b6/go.mod h1:JTym95/bqrSnG5MPcXr1YDhv43JdCeo3p+iDbazoX68= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230728163612-426afac90c44 h1:UOaBVxEMMv2FS1znU7kHBdtSeZQIjnmXL4r9r19XyBo= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230728163612-426afac90c44/go.mod h1:Pl8Nzx6O6ow/+aqfMoMSz4hX+zz6RrnDYsooptECGxM= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230801224523-e85e9a9cf445 h1:V942btb00oVXHox7hEN8FrPfEaMTiVuInM7Tr00eOMU= -github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230801224523-e85e9a9cf445/go.mod h1:Pl8Nzx6O6ow/+aqfMoMSz4hX+zz6RrnDYsooptECGxM= +github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230804142026-a81cfe3ddde7 h1:NTR4zfrPMP4pJ5T60zyZumBAnTWmTAQX/JSZLGrM9jI= +github.com/osmosis-labs/osmosis/osmomath v0.0.3-dev.0.20230804142026-a81cfe3ddde7/go.mod h1:UlftwozB+QObT3o0YfkuuyL9fsVdgoWt0dm6J7MLYnU= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230804142026-a81cfe3ddde7 h1:uwP/LzPE/edqNKf/Tpn8y9L6EO3JHOVwb+zq1gjL1hE= +github.com/osmosis-labs/osmosis/osmoutils v0.0.0-20230804142026-a81cfe3ddde7/go.mod h1:Pl8Nzx6O6ow/+aqfMoMSz4hX+zz6RrnDYsooptECGxM= github.com/osmosis-labs/osmosis/x/epochs v0.0.0-20230328024000-175ec88e4304 h1:RIrWLzIiZN5Xd2JOfSOtGZaf6V3qEQYg6EaDTAkMnCo= github.com/osmosis-labs/osmosis/x/epochs v0.0.0-20230328024000-175ec88e4304/go.mod h1:yPWoJTj5RKrXKUChAicp+G/4Ni/uVEpp27mi/FF/L9c= -github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230602130523-f9a94d8bbd10 h1:XrES5AHZMZ/Y78boW35PTignkhN9h8VvJ1sP8EJDIu8= -github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.0-20230602130523-f9a94d8bbd10/go.mod h1:Ln6CKcXg/CJLSBE6Fd96/MIKPyA4iHuQTKSbl9q7vYo= +github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.6 h1:PjfLL5rwwm44CeLnNQssrFgmj4BdeIS5DriKYhGz7IM= +github.com/osmosis-labs/osmosis/x/ibc-hooks v0.0.6/go.mod h1:2Aqs0L6JnMfo+P+It8q7hJsP1YB+Is5DJc4nRSiBF/U= github.com/osmosis-labs/wasmd v0.31.0-osmo-v16 h1:X747cZYdnqc/+RV48iPVeGprpVb/fUWSaKGsZUWrdbg= github.com/osmosis-labs/wasmd v0.31.0-osmo-v16/go.mod h1:Rf8zW/GgBQyFRRB4s62VQHWA6sTlMFSjoDQQpoq64iI= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -1149,8 +1150,6 @@ github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRk github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.5 h1:KKUqeGhVBK38+1LwThC8IeIcsJZ6COX5kvhiJroFqCM= -github.com/strangelove-ventures/packet-forward-middleware/v4 v4.0.5/go.mod h1:4zAtg449/JISRmf+sbmqolqSLP+QJBh+EtWkWtt/AKE= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 9361cb5a981..b67d061d20e 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -3,6 +3,7 @@ package e2e import ( "encoding/json" "fmt" + "github.com/cosmos/cosmos-sdk/types/address" "os" "path/filepath" "strconv" @@ -14,7 +15,7 @@ import ( transfertypes "github.com/cosmos/ibc-go/v4/modules/apps/transfer/types" "github.com/iancoleman/orderedmap" - packetforwardingtypes "github.com/strangelove-ventures/packet-forward-middleware/v4/router/types" + packetforwardingtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v4/router/types" "github.com/osmosis-labs/osmosis/osmomath" ibchookskeeper "github.com/osmosis-labs/osmosis/x/ibc-hooks/keeper" @@ -1303,9 +1304,18 @@ func (s *IntegrationTestSuite) PacketForwarding() { // check the balance of the contract s.CallCheckBalance(chainANode, contractAddr, "uosmo", transferAmount) + // Getting the sender as set by PFM + senderStr := fmt.Sprintf("channel-0/%s", validatorAddr) + senderHash32 := address.Hash(packetforwardingtypes.ModuleName, []byte(senderStr)) // typo intended + sender := sdk.AccAddress(senderHash32[:20]) + bech32Prefix := "osmo" + pfmSender, err := sdk.Bech32ifyAddressBytes(bech32Prefix, sender) + s.Require().NoError(err) + // sender wasm addr - senderBech32, err := ibchookskeeper.DeriveIntermediateSender("channel-0", validatorAddr, "osmo") + senderBech32, err := ibchookskeeper.DeriveIntermediateSender("channel-0", pfmSender, "osmo") s.Require().NoError(err) + s.Require().Eventually(func() bool { response, err := chainANode.QueryWasmSmartObject(contractAddr, fmt.Sprintf(`{"get_count": {"addr": "%s"}}`, senderBech32)) if err != nil { From 1497d5b7d0284c3236ae143846e7ab19d4d4f93f Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 7 Aug 2023 18:09:31 +0200 Subject: [PATCH 17/18] docs: Osmosis protocol book (#5971) --- .github/workflows/protocol-docs.yml | 52 +++++++++++++++++++++++++++ .gitignore | 5 ++- docs/protocol/book.toml | 16 +++++++++ docs/protocol/src/SUMMARY.md | 12 +++++++ docs/protocol/src/core_dex.md | 12 +++++++ docs/protocol/src/dex/concentrated.md | 1 + docs/protocol/src/dex/cosmwams.md | 1 + docs/protocol/src/dex/cosmwasm.md | 1 + docs/protocol/src/dex/stableswap.md | 1 + docs/protocol/src/dex/weighted.md | 7 ++++ docs/protocol/src/ecosystem.md | 1 + docs/protocol/src/governance.md | 17 +++++++++ docs/protocol/src/osmosis.md | 31 ++++++++++++++++ docs/protocol/src/smartcontracts.md | 1 + docs/protocol/src/staking.md | 1 + 15 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/protocol-docs.yml create mode 100644 docs/protocol/book.toml create mode 100644 docs/protocol/src/SUMMARY.md create mode 100644 docs/protocol/src/core_dex.md create mode 100644 docs/protocol/src/dex/concentrated.md create mode 100644 docs/protocol/src/dex/cosmwams.md create mode 100644 docs/protocol/src/dex/cosmwasm.md create mode 100644 docs/protocol/src/dex/stableswap.md create mode 100644 docs/protocol/src/dex/weighted.md create mode 100644 docs/protocol/src/ecosystem.md create mode 100644 docs/protocol/src/governance.md create mode 100644 docs/protocol/src/osmosis.md create mode 100644 docs/protocol/src/smartcontracts.md create mode 100644 docs/protocol/src/staking.md diff --git a/.github/workflows/protocol-docs.yml b/.github/workflows/protocol-docs.yml new file mode 100644 index 00000000000..499829768c3 --- /dev/null +++ b/.github/workflows/protocol-docs.yml @@ -0,0 +1,52 @@ +name: Render and Deploy Docs + +on: + workflow_dispatch: + push: + branches: + - main + +jobs: + + build: + name: Render and deploy protocol and API docs + timeout-minutes: 30 + runs-on: ubuntu-latest + steps: + - name: Checkout the source code + uses: actions/checkout@v3 + with: + lfs: true + - name: Install rust toolchain + uses: dtolnay/rust-toolchain@nightly + - name: Load Rust caching + uses: astriaorg/buildjet-rust-cache@v2.5.1 + - name: Load get-version action to grab version component of deployment path + uses: battila7/get-version-action@v2 + id: get_version + - name: Print version component of deployment path + run: echo ${{ steps.get_version.outputs.version }} + - name: Install mdbook + run: cargo install mdbook mdbook-katex mdbook-mermaid + - name: Build protocol spec + run: cd docs/protocol && mdbook build + - name: Move protocol spec to subdirectory & Deploy + env: + DO_DOCS_PK: ${{ secrets.DO_DOCS_PK }} + DO_DOCS_IP: ${{ secrets.DO_DOCS_IP }} + run: | + cd docs/protocol + if [ -d "do-tmp" ]; then rm -rf do-tmp; fi + mkdir do-tmp + mv book do-tmp/${{ steps.get_version.outputs.version }} + tree do-tmp + which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y ) + which rsync || ( apt-get update -y && apt-get install rsync -y ) + eval $(ssh-agent -s) + ssh-add <(echo "$DO_DOCS_PK" ) + mkdir -p ~/.ssh + chmod 700 ~/.ssh + ssh-keyscan $DO_DOCS_IP >> ~/.ssh/known_hosts + chmod 644 ~/.ssh/known_hosts + cd do-tmp/main + scp -r * root@$DO_DOCS_IP:/var/www/html diff --git a/.gitignore b/.gitignore index 4313d719db8..84f981a2f3a 100644 --- a/.gitignore +++ b/.gitignore @@ -250,5 +250,8 @@ blocks.db tests/cl-genesis-positions/script tests/cl-genesis-positions/*.json +# Docs +docs/protocol/book + # Release folder -dist/ \ No newline at end of file +dist/ diff --git a/docs/protocol/book.toml b/docs/protocol/book.toml new file mode 100644 index 00000000000..c94f58c7ffe --- /dev/null +++ b/docs/protocol/book.toml @@ -0,0 +1,16 @@ +[book] +authors = ["Osmosis Labs"] +language = "en" +multilingual = false +src = "src" +title = "The Osmosis Protocol" + +[preprocessor.katex] + +[preprocessor.mermaid] +command = "mdbook-mermaid" + +[output.html] +curly-quotes = true +fold = { enable = true, level = 1 } +git-repository-url = "https://github.com/osmosis-labs/osmosis" diff --git a/docs/protocol/src/SUMMARY.md b/docs/protocol/src/SUMMARY.md new file mode 100644 index 00000000000..88f1c283c13 --- /dev/null +++ b/docs/protocol/src/SUMMARY.md @@ -0,0 +1,12 @@ +# Summary + +[Osmosis](./osmosis.md) +- [Decentralized Exchange](./core_dex.md) + - [Weighted Pool](./dex/weighted.md) + - [Stableswap Pool](./dex/stableswap.md) + - [Concentrated Pool](./dex/concentrated.md) + - [Cosmwasm Pool](./dex/cosmwasm.md) +- [Governance](./governance.md) +- [Staking](./staking.md) +- [Smart Contracts](./smartcontracts.md) +- [Ecosystem](./ecosystem.md) diff --git a/docs/protocol/src/core_dex.md b/docs/protocol/src/core_dex.md new file mode 100644 index 00000000000..8a32582c463 --- /dev/null +++ b/docs/protocol/src/core_dex.md @@ -0,0 +1,12 @@ +# Decentralized Exchange + +Osmosis is a decentralized automated market maker (AMM) protocol built using Cosmos SDK that represents a flexible building block for programmable liquidity. + +By separating the AMM curve logic and math from the core swapping functionality, Osmosis becomes an extensible AMM that can incorporate any number of swap curves and pool types. This includes: + +- Traditional 50/50 weighted pools +- Custom weights like 80/20 for controlled exposure +- Solidly-style Stableswap curve +- Concentrated Liquidity pools +- CosmWasm pools + diff --git a/docs/protocol/src/dex/concentrated.md b/docs/protocol/src/dex/concentrated.md new file mode 100644 index 00000000000..d319e9e23c8 --- /dev/null +++ b/docs/protocol/src/dex/concentrated.md @@ -0,0 +1 @@ +# Concentrated Pool diff --git a/docs/protocol/src/dex/cosmwams.md b/docs/protocol/src/dex/cosmwams.md new file mode 100644 index 00000000000..a0361e071aa --- /dev/null +++ b/docs/protocol/src/dex/cosmwams.md @@ -0,0 +1 @@ +# CosmWasm Pool diff --git a/docs/protocol/src/dex/cosmwasm.md b/docs/protocol/src/dex/cosmwasm.md new file mode 100644 index 00000000000..8f9da51e6be --- /dev/null +++ b/docs/protocol/src/dex/cosmwasm.md @@ -0,0 +1 @@ +# Cosmwasm Pool diff --git a/docs/protocol/src/dex/stableswap.md b/docs/protocol/src/dex/stableswap.md new file mode 100644 index 00000000000..76fe3b47606 --- /dev/null +++ b/docs/protocol/src/dex/stableswap.md @@ -0,0 +1 @@ +# Stableswap Pool diff --git a/docs/protocol/src/dex/weighted.md b/docs/protocol/src/dex/weighted.md new file mode 100644 index 00000000000..cfdde988e32 --- /dev/null +++ b/docs/protocol/src/dex/weighted.md @@ -0,0 +1,7 @@ +# Weighted Pool + +Liquidity pools are clusters of tokens with pre-determined weights. A token's weight is how much its value accounts for the total value within the pool. For example, Uniswap pools involve two tokens with 50-50 weights. The total value of Asset A must remain equal to the total value of Asset B. Other token weights are possible, such as 90-10. It is also possible to have a liquidity pool with more than two assets. + +In Osmosis, pool creators are allowed to choose the tokens within the pool and their respective weights. The parameters chosen by the pool creator cannot be changed. Other users can create separate pools with different parameters. + +Weighted Pools are an extension of the classical AMM pools popularized by Uniswap v1. Weighted Pools are great for general cases, including tokens that don't necessarily have any price correlation (ex. DAI/WETH). Unlike pools in other AMMs that only provide 50/50 weightings, Osmosis Weighted Pools enable users to build pools with more than two tokens and custom weightings, such as pools with 80/20 or 60/20/20 weightings. diff --git a/docs/protocol/src/ecosystem.md b/docs/protocol/src/ecosystem.md new file mode 100644 index 00000000000..e46e912ed82 --- /dev/null +++ b/docs/protocol/src/ecosystem.md @@ -0,0 +1 @@ +# Ecosystem diff --git a/docs/protocol/src/governance.md b/docs/protocol/src/governance.md new file mode 100644 index 00000000000..66109a0f3d8 --- /dev/null +++ b/docs/protocol/src/governance.md @@ -0,0 +1,17 @@ +# Governance + +Osmosis is a sovereign delegated Proof-of-Stake chain with its own validator set. +Users delegate their stake to validators to secure the network while keeping the +opportunity to overwrite validator's decision with their own vote. + +The decisions are made through the governance process consisting of proposals. + +A proposal can be created by anyone. Once created with the required deposit, the +voting period begins. + +The proposal is either accepted or rejected. + +There are two types of proposals that determine the length of the voting period, +deposit amount and quorum: +1. Standard proposal +2. Expedited proposal diff --git a/docs/protocol/src/osmosis.md b/docs/protocol/src/osmosis.md new file mode 100644 index 00000000000..d558c222eb7 --- /dev/null +++ b/docs/protocol/src/osmosis.md @@ -0,0 +1,31 @@ +# Introduction to Osmosis + +Osmosis is a fair-launched, customizable automated market maker for +interchain assets that allows the creation and management of +non-custodial, self-balancing, interchain token index similar to one of +Balancer. + +Inspired by [Balancer](http://balancer.finance/whitepaper) and Sunny +Aggarwal's '[DAOfying Uniswap Automated Market Maker +Pools](https://www.sunnya97.com/blog/daoifying-uniswap-automated-market-maker-pools)', +the goal for Osmosis is to provide the best-in-class tools that extend +the use of AMMs within the Cosmos ecosystem beyond traditional token +swap-type use cases. Bonding curves, while have found its primary use +case in decentralized exchange mechanisms, its potential use case can be +further extended through the customizability that Osmosis offers. +Through the customizability offered by Osmosis such as custom-curve AMMs, +dynamic adjustments of spread factors, multi-token liquidity pools--the AMM +can offer decentralized formation of token fundraisers, interchain +staking, options market, and more for the Cosmos ecosystem. + +Whereas most Cosmos zones have focused their incentive scheme on the +delegators, Osmosis attempts to align the interests of multiple +stakeholders of the ecosystem such as LPs, DAO members, as well as +delegators. One mechanism that is introduced is how staked liquidity +providers have sovereign ownership over their pools, and through the +pool governance process allow them to adjust the parameters depending on +the pool's competition and market conditions. Osmosis is a sovereign +Cosmos zone that derives its sovereignty not only from its +application-specific blockchain architecture but also the collective +sovereignty of the LPs that has aligned interest to different tokens +that they are providing liquidity for. diff --git a/docs/protocol/src/smartcontracts.md b/docs/protocol/src/smartcontracts.md new file mode 100644 index 00000000000..95badcb05e1 --- /dev/null +++ b/docs/protocol/src/smartcontracts.md @@ -0,0 +1 @@ +# Smart Contracts (CosmWasm) diff --git a/docs/protocol/src/staking.md b/docs/protocol/src/staking.md new file mode 100644 index 00000000000..abe5cd84eb4 --- /dev/null +++ b/docs/protocol/src/staking.md @@ -0,0 +1 @@ +# Staking From e1552a3bb3f6799bb4b65033ec9f4f2096005c0d Mon Sep 17 00:00:00 2001 From: "Matt, Park" <45252226+mattverse@users.noreply.github.com> Date: Tue, 8 Aug 2023 01:19:47 +0900 Subject: [PATCH 18/18] Fix token factory (#5497) --- app/keepers/keepers.go | 2 +- x/tokenfactory/keeper/admins_test.go | 18 ++++++++++++++++++ x/tokenfactory/types/denoms.go | 16 ---------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/keepers/keepers.go b/app/keepers/keepers.go index b2195f036b3..ba63d28cbac 100644 --- a/app/keepers/keepers.go +++ b/app/keepers/keepers.go @@ -428,7 +428,7 @@ func (appKeepers *AppKeepers) InitNormalKeepers( appKeepers.keys[tokenfactorytypes.StoreKey], appKeepers.GetSubspace(tokenfactorytypes.ModuleName), appKeepers.AccountKeeper, - appKeepers.BankKeeper.WithMintCoinsRestriction(tokenfactorytypes.NewTokenFactoryDenomMintCoinsRestriction()), + appKeepers.BankKeeper, appKeepers.DistrKeeper, ) appKeepers.TokenFactoryKeeper = &tokenFactoryKeeper diff --git a/x/tokenfactory/keeper/admins_test.go b/x/tokenfactory/keeper/admins_test.go index 30582a094e2..043e385f5b6 100644 --- a/x/tokenfactory/keeper/admins_test.go +++ b/x/tokenfactory/keeper/admins_test.go @@ -129,6 +129,15 @@ func (s *KeeperTestSuite) TestMintDenom() { ), expectPass: true, }, + { + desc: "error: try minting non-tokenfactory denom", + mintMsg: *types.NewMsgMintTo( + s.TestAccs[0].String(), + sdk.NewInt64Coin("uosmo", 10), + s.TestAccs[1].String(), + ), + expectPass: false, + }, } { s.Run(fmt.Sprintf("Case %s", tc.desc), func() { _, err := s.msgServer.Mint(sdk.WrapSDKContext(s.Ctx), &tc.mintMsg) @@ -217,6 +226,15 @@ func (s *KeeperTestSuite) TestBurnDenom() { ), expectPass: false, }, + { + desc: "fail case - burn non-tokenfactory denom", + burnMsg: *types.NewMsgBurnFrom( + s.TestAccs[0].String(), + sdk.NewInt64Coin("uosmo", 10), + moduleAdress.String(), + ), + expectPass: false, + }, } { s.Run(fmt.Sprintf("Case %s", tc.desc), func() { _, err := s.msgServer.Burn(sdk.WrapSDKContext(s.Ctx), &tc.burnMsg) diff --git a/x/tokenfactory/types/denoms.go b/x/tokenfactory/types/denoms.go index c705a9b95c5..658399856ef 100644 --- a/x/tokenfactory/types/denoms.go +++ b/x/tokenfactory/types/denoms.go @@ -1,12 +1,10 @@ package types import ( - fmt "fmt" "strings" errorsmod "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" ) const ( @@ -68,17 +66,3 @@ func DeconstructDenom(denom string) (creator string, subdenom string, err error) return creatorAddr.String(), subdenom, nil } - -// NewTokenFactoryDenomMintCoinsRestriction creates and returns a BankMintingRestrictionFn that only allows minting of -// valid tokenfactory denoms -func NewTokenFactoryDenomMintCoinsRestriction() bankkeeper.BankMintingRestrictionFn { - return func(ctx sdk.Context, coinsToMint sdk.Coins) error { - for _, coin := range coinsToMint { - _, _, err := DeconstructDenom(coin.Denom) - if err != nil { - return fmt.Errorf("does not have permission to mint %s", coin.Denom) - } - } - return nil - } -}