diff --git a/app/upgrades.go b/app/upgrades.go index df4543c99..a10b2f726 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -11,9 +11,17 @@ import ( // The chain upgrade can be scheduled AFTER the new version (with upgrade strategy implemented) is released, // so `cosmovisor` can automatically pull the binary from GitHub. var allUpgrades = []upgrades.Upgrade{ - upgrades.Upgrade_0_0_4, - upgrades.Upgrade_0_0_10, - upgrades.Upgrade_0_0_11, + // v0.0.4 was the first upgrade we implemented and tested on network that is no longer used. + // upgrades.Upgrade_0_0_4, + + // v0.0.10 was the first upgrade we implemented on Alpha TestNet. + // upgrades.Upgrade_0_0_10, + + // v0.0.11 was the Alpha TestNet exclusive upgrade to bring it on par with Beta TestNet. + // upgrades.Upgrade_0_0_11, + + // v0.0.12 - the first upgrade going live on both Alpha and Beta TestNets. + upgrades.Upgrade_0_0_12, } // setUpgrades sets upgrade handlers for all upgrades and executes KVStore migration if an upgrade plan file exists. diff --git a/app/upgrades/historical.go b/app/upgrades/historical.go index 35393ad02..9b6baba88 100644 --- a/app/upgrades/historical.go +++ b/app/upgrades/historical.go @@ -40,6 +40,9 @@ func defaultUpgradeHandler( // For example, even if `ConsensusVersion` is not modified for any modules, it still might be beneficial to create // an upgrade so node runners are signaled to start utilizing `Cosmovisor` for new binaries. var UpgradeExample = Upgrade{ + // PlanName can be any string. + // This code is executed when the upgrade with this plan name is submitted to the network. + // This does not necessarily need to be a version, but it's usually the case with consensus-breaking changes. PlanName: "v0.0.0-Example", CreateUpgradeHandler: defaultUpgradeHandler, diff --git a/app/upgrades/types.go b/app/upgrades/types.go index 3bba73629..f4c9793cd 100644 --- a/app/upgrades/types.go +++ b/app/upgrades/types.go @@ -16,8 +16,15 @@ import ( const ( // The default PNF/DAO address in the genesis file for Alpha TestNet. Used to create new authz authorizations. AlphaTestNetPnfAddress = "pokt1r6ja6rz6rpae58njfrsgs5n5sp3r36r2q9j04h" - // Authority address. Defaults to gov module address. Used to create new authz authorizations. + + // TECHDEBT: DO NOT use AlphaTestNetAuthorityAddress. + // This is the authority address used to create new authz authorizations. Defaults to x/gov module account address. + // Use `keepers.UpgradeKeeper.Authority(ctx, &upgradetypes.QueryAuthorityRequest{})` to query the authority address of the current Alpha Network. + // NOTE: This hard-coded address is kept for record-keeping historical purposes. AlphaTestNetAuthorityAddress = "pokt10d07y265gmmuvt4z0w9aw880jnsr700j8yv32t" + + // The default PNF/DAO address in the genesis file for Beta TestNet. Used to create new authz authorizations. + BetaTestNetPnfAddress = "pokt1f0c9y7mahf2ya8tymy8g4rr75ezh3pkklu4c3e" ) // Upgrade represents a protocol upgrade in code. diff --git a/app/upgrades/v0.0.12.go b/app/upgrades/v0.0.12.go new file mode 100644 index 000000000..213f42c08 --- /dev/null +++ b/app/upgrades/v0.0.12.go @@ -0,0 +1,197 @@ +package upgrades + +import ( + "context" + "strings" + + "cosmossdk.io/math" + storetypes "cosmossdk.io/store/types" + upgradetypes "cosmossdk.io/x/upgrade/types" + cosmosTypes "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/pokt-network/poktroll/app/keepers" + sharedtypes "github.com/pokt-network/poktroll/x/shared/types" +) + +const Upgrade_0_0_12_PlanName = "v0.0.12" + +// Upgrade_0_0_12 handles the upgrade to release `v0.0.12`. +// This is planned to be issued on both Pocket Network's Shannon Alpha & Beta TestNets. +var Upgrade_0_0_12 = Upgrade{ + PlanName: Upgrade_0_0_12_PlanName, + CreateUpgradeHandler: func(mm *module.Manager, + keepers *keepers.Keepers, + configurator module.Configurator, + ) upgradetypes.UpgradeHandler { + // Parameter configurations aligned with repository config.yml specifications. + // These values reflect the delta between v0.0.11 and the main branch as of #1043. + // Reference: + // - Comparison: https://github.com/pokt-network/poktroll/compare/v0.0.11..7541afd6d89a12d61e2c32637b535f24fae20b58 + // - Direct diff: `git diff v0.0.11..7541afd6d89a12d61e2c32637b535f24fae20b58 -- config.yml` + // + // DEV_NOTE: These parameter updates are derived from config.yml in the root directory + // of this repository, which serves as the source of truth for all parameter changes. + const ( + supplierStakingFee = 1000000 // uPOKT + serviceTargetNumRelays = 100 // num relays + tokenomicsGlobalInflationPerClaim = 0.1 // % of the claim amount + ) + + applyNewParameters := func(ctx context.Context) (err error) { + logger := cosmosTypes.UnwrapSDKContext(ctx).Logger() + logger.Info("Starting parameter updates", "upgrade_plan_name", Upgrade_0_0_12_PlanName) + + // Set supplier module staking_fee to 1000000upokt, in line with the config.yml in the repo. + // Verify via: + // $ poktrolld q supplier params --node=... + supplierParams := keepers.SupplierKeeper.GetParams(ctx) + supplierParams.MinStake = &cosmosTypes.Coin{ + Denom: "upokt", + Amount: math.NewInt(supplierStakingFee), + } + err = keepers.SupplierKeeper.SetParams(ctx, supplierParams) + if err != nil { + logger.Error("Failed to set supplier params", "error", err) + return err + } + logger.Info("Successfully updated supplier params", "new_params", supplierParams) + + // Add service module `target_num_relays` parameter, in line with the config.yml in the repo. + // Verify via: + // $ poktrolld q service params --node=... + serviceParams := keepers.ServiceKeeper.GetParams(ctx) + serviceParams.TargetNumRelays = serviceTargetNumRelays + err = keepers.ServiceKeeper.SetParams(ctx, serviceParams) + if err != nil { + logger.Error("Failed to set service params", "error", err) + return err + } + logger.Info("Successfully updated service params", "new_params", serviceParams) + + // Add tokenomics module `global_inflation_per_claim` parameter, in line with the config.yml in the repo. + // Verify via: + // $ poktrolld q tokenomics params --node=... + tokenomicsParams := keepers.TokenomicsKeeper.GetParams(ctx) + tokenomicsParams.GlobalInflationPerClaim = tokenomicsGlobalInflationPerClaim + err = keepers.TokenomicsKeeper.SetParams(ctx, tokenomicsParams) + if err != nil { + logger.Error("Failed to set tokenomics params", "error", err) + return err + } + logger.Info("Successfully updated tokenomics params", "new_params", tokenomicsParams) + return nil + } + + // Helper function to update all suppliers' RevShare to 100%. + // This is necessary to ensure that we have that value populated before suppliers are connected. + // + updateSuppliersRevShare := func(ctx context.Context) error { + logger := cosmosTypes.UnwrapSDKContext(ctx).Logger() + suppliers := keepers.SupplierKeeper.GetAllSuppliers(ctx) + logger.Info("Updating (overriding) all suppliers to delegate 100% revenue share to the supplier's operator address", + "num_suppliers", len(suppliers)) + + for _, supplier := range suppliers { + for _, service := range supplier.Services { + if len(service.RevShare) > 1 { + // WARNING: Overwriting existing revshare settings without preserving history. + // NOTE: While the canonical approach would be using Module Upgrade (docs.cosmos.network/v0.46/building-modules/upgrade) + // to handle protobuf type changes (see: github.com/cosmos/cosmos-sdk/blob/v0.46.0-rc1/x/bank/migrations/v043/store.go#L50-L71), + // we've opted for direct overwrite because: + // 1. No active revenue shares are impacted at time of writing + // 2. Additional protobuf and repo structure changes would be required for proper (though unnecessary) migration + + // Create a string representation of just the revenue share addresses + addresses := make([]string, len(service.RevShare)) + for i, rs := range service.RevShare { + addresses[i] = rs.Address + } + revShareAddressesStr := "[" + strings.Join(addresses, ",") + "]" + logger.Warn( + "Overwriting existing revenue share configuration", + "supplier_operator", supplier.OperatorAddress, + "supplier_owner", supplier.OwnerAddress, + "service", service.ServiceId, + "previous_revshare_count", len(service.RevShare), + "previous_revshare_addresses", revShareAddressesStr, + ) + service.RevShare = []*sharedtypes.ServiceRevenueShare{ + { + Address: supplier.OperatorAddress, + RevSharePercentage: uint64(100), + }, + } + } else if len(service.RevShare) == 1 { + // If there is only one revshare setting, we can safely overwrite it (because it has 100% + // revenue share), keeping the existing address. + logger.Info("Updating supplier's revenue share configuration", + "supplier_operator", supplier.OperatorAddress, + "supplier_owner", supplier.OwnerAddress, + "service", service.ServiceId, + "previous_revshare_address", service.RevShare[0].Address, + ) + currentRevShare := service.RevShare[0] + service.RevShare = []*sharedtypes.ServiceRevenueShare{ + { + Address: currentRevShare.Address, + RevSharePercentage: uint64(100), + }, + } + } else { + logger.Warn("That shouldn't happen: no revenue share configuration found for supplier", + "supplier_operator", supplier.OperatorAddress, + "supplier_owner", supplier.OwnerAddress, + "service", service.ServiceId, + ) + } + } + keepers.SupplierKeeper.SetSupplier(ctx, supplier) + logger.Info("Updated supplier", + "supplier_operator", supplier.OperatorAddress, + "supplier_owner", supplier.OwnerAddress) + } + return nil + } + + // Returns the upgrade handler for v0.0.12 + return func(ctx context.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) { + logger := cosmosTypes.UnwrapSDKContext(ctx).Logger() + logger.Info("Starting upgrade handler", "upgrade_plan_name", Upgrade_0_0_12_PlanName) + + logger.Info("Starting parameter updates section", "upgrade_plan_name", Upgrade_0_0_12_PlanName) + // Update all governance parameter changes. + // This includes adding params, removing params and changing values of existing params. + err := applyNewParameters(ctx) + if err != nil { + logger.Error("Failed to apply new parameters", + "upgrade_plan_name", Upgrade_0_0_12_PlanName, + "error", err) + return vm, err + } + + logger.Info("Starting supplier RevShare updates section", "upgrade_plan_name", Upgrade_0_0_12_PlanName) + // Override all suppliers' RevShare to be 100% delegate to the supplier's operator address + err = updateSuppliersRevShare(ctx) + if err != nil { + logger.Error("Failed to update suppliers RevShare", + "upgrade_plan_name", Upgrade_0_0_12_PlanName, + "error", err) + return vm, err + } + + logger.Info("Starting module migrations section", "upgrade_plan_name", Upgrade_0_0_12_PlanName) + vm, err = mm.RunMigrations(ctx, configurator, vm) + if err != nil { + logger.Error("Failed to run migrations", + "upgrade_plan_name", Upgrade_0_0_12_PlanName, + "error", err) + return vm, err + } + + logger.Info("Successfully completed upgrade handler", "upgrade_plan_name", Upgrade_0_0_12_PlanName) + return vm, nil + } + }, + // No changes to the KVStore in this upgrade. + StoreUpgrades: storetypes.StoreUpgrades{}, +} diff --git a/docusaurus/docs/protocol/upgrades/upgrade_list.md b/docusaurus/docs/protocol/upgrades/upgrade_list.md index 6480086c3..bd2d816b0 100644 --- a/docusaurus/docs/protocol/upgrades/upgrade_list.md +++ b/docusaurus/docs/protocol/upgrades/upgrade_list.md @@ -27,6 +27,7 @@ Coming... | Version | Planned | Breaking | Requires Manual Intervention | Upgrade Height | | -------------------------------------------------------------------------------- | :-----: | :------: | :--------------------------: | -------------- | +| [`v0.0.12`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.12) | ✅ | ✅ | ❌ | TBA | | [`v0.0.11-rc`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.11-rc) | N/A | N/A | ❌ genesis version | N/A | ## Alpha TestNet @@ -36,12 +37,14 @@ Some manual steps are currently required to sync to the latest block. Please fol -| Version | Planned | Breaking | Requires Manual Intervention | Upgrade Height | -| ---------------------------------------------------------------------------- | :-----: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | -------------------------------------------------------------------------------------------------------------------------------- | -| [`v0.0.10`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.10) | ✅ | ✅ | ❌ (automatic upgrade) | [56860](https://shannon.alpha.testnet.pokt.network/poktroll/tx/4E201E5C397AB881F417266154C907D38404BE00BE9A443DE28E44A2B09C5CFB) | -| [`v0.0.9-4`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-4) | ❌ | ✅ | ⚠️ [follow manual upgrade instructions](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-4) ⚠️ | `46329` | -| [`v0.0.9-3`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-3) | ❌ | ✅ | ❌ Active Alpha TestNet Participants Only: [follow manual upgrade instructions](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-3) | `17102` | -| [`v0.0.9`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9) | N/A | N/A | ❌ genesis version | N/A | +| Version | Planned | Breaking | Requires Manual Intervention | Upgrade Height | +| ---------------------------------------------------------------------------- | :-----: | :------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | --------------------------------------------------------------------------------------------------------------------------------- | +| [`v0.0.12`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.12) | ✅ | ✅ | ❌ | TBA | +| [`v0.0.11`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.11) | ✅ | ✅ | ❌ (automatic upgrade) | [156245](https://shannon.alpha.testnet.pokt.network/poktroll/tx/EE72B1D0744872CFFF4AC34DA9573B0BC2E32FFF998A8F25BF817FBE44F53543) | +| [`v0.0.10`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.10) | ✅ | ✅ | ❌ (automatic upgrade) | [56860](https://shannon.alpha.testnet.pokt.network/poktroll/tx/4E201E5C397AB881F417266154C907D38404BE00BE9A443DE28E44A2B09C5CFB) | +| [`v0.0.9-4`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-4) | ❌ | ✅ | ⚠️ [follow manual upgrade instructions](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-4) ⚠️ | `46329` | +| [`v0.0.9-3`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-3) | ❌ | ✅ | ❌ Active Alpha TestNet Participants Only: [follow manual upgrade instructions](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9-3) | `17102` | +| [`v0.0.9`](https://github.com/pokt-network/poktroll/releases/tag/v0.0.9) | N/A | N/A | ❌ genesis version | N/A | ### Syncing from genesis - manual steps diff --git a/localnet/poktrolld/config/relayminer_config_localnet_vscode.yaml b/localnet/poktrolld/config/relayminer_config_localnet_vscode.yaml index 451914f9f..de20c4d13 100644 --- a/localnet/poktrolld/config/relayminer_config_localnet_vscode.yaml +++ b/localnet/poktrolld/config/relayminer_config_localnet_vscode.yaml @@ -23,7 +23,7 @@ metrics: addr: :9070 pocket_node: query_node_rpc_url: tcp://localhost:26657 - query_node_grpc_url: tcp://localhost:36658 + query_node_grpc_url: tcp://localhost:9090 tx_node_rpc_url: tcp://localhost:26657 suppliers: - service_id: anvil