From 70d33176728abe576f1c4224f555f55c7794445d Mon Sep 17 00:00:00 2001 From: jgo121 Date: Mon, 4 Dec 2023 10:59:06 +0800 Subject: [PATCH 01/12] add contributing, devnotes, update readme --- CONTRIBUTING.md | 88 +++++++++++++++++++++++ DEVNOTES.md | 172 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 182 ++++++++---------------------------------------- 3 files changed, 288 insertions(+), 154 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 DEVNOTES.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..cf50b672 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,88 @@ +# Contributing + +- [Contributing](#contributing) + - [Overview](#overview) + - [Kira Improvement Proposal (KIP)](#kira-improvement-proposal-kip) + - [Testing](#testing) + - [Pull Requests](#pull-requests) + - [Requesting Reviews](#requesting-reviews) + - [Changelog](#changelog) + - [Dependencies](#dependencies) + - [Protobuf](#protobuf) + - [Branching Model and Release](#branching-model-and-release) + +## Overview + +Contributing to this repo can mean many things such as participating in +discussion or proposing code changes. +Following the processes outlined in this document will lead to the best +chance of getting changes merged into the codebase. + +## Kira Improvement Proposal (KIP) + +When proposing an architecture decision for Gaia, please start by opening an [issue](https://github.com/cosmos/gaia/issues/new/choose) or a [discussion](https://github.com/cosmos/gaia/discussions/new) with a summary of the proposal. Once the proposal has been discussed and there is rough alignment on a high-level approach to the design, you may either start development, or write an ADR. + +If your architecture decision is a simple change, you may contribute directly without writing an ADR. However, if you are proposing a significant change, please include a corresponding ADR. + +To create an ADR, follow the [template](./docs/architecture/adr-template.md) and [doc](./docs/architecture/README.md). If you would like to see examples of how these are written, please refer to the current [ADRs](https://github.com/cosmos/gaia/tree/main/docs/architecture). + +### Testing + +Tests can be executed by running `make test` at the top level of the Sekai repository. + +### Pull Requests + +Before submitting a pull request: + +- synchronize your branch with the latest `master` branch and resolve any arising conflicts, `git fetch origin/master && git merge origin/master` +- run `make install`, `make test`, to ensure that all checks and tests pass. + +### Requesting Reviews + +In order to accommodate the review process, the author of the PR should be in contact with Sekai repo maintainers. + +### Changelog + +Changelog keeps the changes made as part of releases. The logs are kept on [CHANGELOG](./CHANGELOG.md). + +## Dependencies + +We use [Go Modules](https://github.com/golang/go/wiki/Modules) to manage +dependency versions. + +The main branch of every Cosmos repository should just build with `go get`, +which means they should be kept up-to-date with their dependencies so we can +get away with telling people they can just `go get` our software. + +When dependencies in Sekai's `go.mod` are changed, it is generally accepted practice +to delete `go.sum` and then run `go mod tidy`. + +Since some dependencies are not under our control, a third party may break our +build, in which case we can fall back on `go mod tidy -v`. + +## Protobuf + +We use [Protocol Buffers](https://developers.google.com/protocol-buffers) along with [gogoproto](https://github.com/cosmos/gogoproto) to generate code for use in sekai. + +For deterministic behavior around Protobuf tooling, everything is containerized using Docker. Make sure to have Docker installed on your machine, or head to [Docker's website](https://docs.docker.com/get-docker/) to install it. + +To generate the protobuf stubs, you can run `make proto-gen`. + +## Branching Model and Release + +Sekai branches should be one of `feature/{feature-description}` or `bugfix/{bugfix-description}` to join CI/CD process. + +Sekai follows [semantic versioning](https://semver.org). + +To release a new version + +- Set a new sekai version on [`types/constants.go`](types/constants.go) +- Add relevant information on [`RELEASE.md`](RELEASE.md) +- Push the code to the branch +- The bot automatically creates release branch `release/vx.x.x` as configured in [`types/constants.go`](types/constants.go) and raise the PR from working branch to release branch automatically +- Check CI/CD pass on the PR +- Get manual review +- Get the PR merged into release branch +- New PR into master is raised after release branch PR merge +- Check CI/CD pass on the PR +- Merge into master diff --git a/DEVNOTES.md b/DEVNOTES.md new file mode 100644 index 00000000..022bed03 --- /dev/null +++ b/DEVNOTES.md @@ -0,0 +1,172 @@ +## Install bash-utils + +Bash-utils is a KIRA tool that helps to simplify shell scripts and various bash commands that you might need to run + +``` +# Install bash-utils.sh KIRA tool to make downloads faster and easier +TOOLS_VERSION="v0.0.12.4" && mkdir -p /usr/keys && FILE_NAME="bash-utils.sh" && \ + if [ -z "$KIRA_COSIGN_PUB" ] ; then KIRA_COSIGN_PUB=/usr/keys/kira-cosign.pub ; fi && \ + echo -e "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/IrzBQYeMwvKa44/DF/HB7XDpnE+\nf+mU9F/Qbfq25bBWV2+NlYMJv3KvKHNtu3Jknt6yizZjUV4b8WGfKBzFYw==\n-----END PUBLIC KEY-----" > $KIRA_COSIGN_PUB && \ + wget "https://github.com/KiraCore/tools/releases/download/$TOOLS_VERSION/${FILE_NAME}" -O ./$FILE_NAME && \ + wget "https://github.com/KiraCore/tools/releases/download/$TOOLS_VERSION/${FILE_NAME}.sig" -O ./${FILE_NAME}.sig && \ + cosign verify-blob --key="$KIRA_COSIGN_PUB" --signature=./${FILE_NAME}.sig ./$FILE_NAME && \ + chmod -v 555 ./$FILE_NAME && ./$FILE_NAME bashUtilsSetup "/var/kiraglob" && . /etc/profile && \ + echoInfo "Installed bash-utils $(bash-utils bashUtilsVersion)" +``` + +## Quick setup from Releases + +```bash +# TBD +``` + +## Set environment variables + +```sh +sh env.sh +``` + +# Get version info + +[scripts/commands/version.sh](scripts/commands/version.sh) + +# Adding more validators + +[scripts/commands/adding-validators.sh](scripts/commands/adding-validators.sh) + +## Set ChangeTxFee permission + +[scripts/commands/set-permission.sh](scripts/commands/set-permission.sh) + +## Set network properties + +[scripts/commands/set-network-properties.sh](scripts/commands/set-network-properties.sh) + +## Set Execution Fee + +[scripts/commands/set-execution-fee.sh](scripts/commands/set-execution-fee.sh) + +## Upsert token rates + +[scripts/commands/upsert-token-rates.sh](scripts/commands/upsert-token-rates.sh) + +## Upsert token alias + +[scripts/commands/upsert-token-alias.sh](scripts/commands/upsert-token-alias.sh) + +# Fee payment in foreign currency + +[scripts/commands/foreign-fee-payments.sh](scripts/commands/foreign-fee-payments.sh) + +# Fee payment in foreign currency returning failure - execution fee in foreign currency + +[scripts/commands/foreign-fee-payments-failure-return.sh](scripts/commands/foreign-fee-payments-failure-return.sh) + +## Query permission of an address + +[scripts/commands/query-permission.sh](scripts/commands/query-permission.sh) + +## Query network properties + +[scripts/commands/query-network-properties.sh](scripts/commands/query-network-properties.sh) + +## Query execution fee + +[scripts/commands/query-execution-fee.sh](scripts/commands/query-execution-fee.sh) + +# Query token alias + +[scripts/commands/query-token-alias.sh](scripts/commands/query-token-alias.sh) + +# Query token rate + +[scripts/commands/query-token-rate.sh](scripts/commands/query-token-rate.sh) + +# Query validator account + +[scripts/commands/query-validator.sh](scripts/commands/query-validator.sh) + +# Query for current frozen / unfronzen tokens + +**Notes**: these values are valid only when specific network property is enabled +[scripts/commands/query-frozen-token.sh](scripts/commands/query-frozen-token.sh) + +# Query poor network messages + +[scripts/commands/query-poor-network-messages.sh](scripts/commands/query-poor-network-messages.sh) + +# Query signing infos per validator's consensus address + +[scripts/commands/query-signing-infos.sh](scripts/commands/query-signing-infos.sh) + +# Common commands for governance process + +[scripts/commands/governance/common.sh](scripts/commands/governance/common.sh) + +### Set permission via governance process + +[scripts/commands/governance/assign-permission.sh](scripts/commands/governance/assign-permission.sh) + +## Upsert token alias via governance process + +[scripts/commands/governance/upsert-token-alias.sh](scripts/commands/governance/upsert-token-alias.sh) + +## Upsert token rates via governance process + +[scripts/commands/governance/upsert-token-rates.sh](scripts/commands/governance/upsert-token-rates.sh) + +# Commands for poor network management via governance process + +[scripts/commands/governance/poor-network-messages.sh](scripts/commands/governance/poor-network-messages.sh) + +# Freeze / unfreeze tokens via governance process + +[scripts/commands/governance/token-freeze.sh](scripts/commands/governance/token-freeze.sh) + +# Set network property proposal via governance process + +[scripts/commands/governance/set-network-property.sh](scripts/commands/governance/set-network-property.sh) + +# Set application upgrade proposal via governance process + +[scripts/commands/governance/upgrade-plan.sh](scripts/commands/governance/upgrade-plan.sh) + +Export the status of chain before halt (should kill the daemon process at the time of genesis export) +[scripts/commands/export-state.sh](scripts/commands/export-state.sh) + +The script for creating new chain from exported state should be written or manual edition process is required. +`ChainId` should be modified in this process. + +For now, upgrade process requires manual conversion from old genesis to new genesis. +At each time of upgrade, genesis upgrade command will be built and infra could run the command like `sekaid genesis-migrate` + +Note: state export command is not exporting the upgrade plan and if all validators run with exported genesis with the previous binary, consensus failure won't happen. + +# Identity registrar + +[scripts/commands/identity-registrar.sh](scripts/commands/identity-registrar.sh) + +# Unjail via governance process + +Modify genesis json to have jailed validator for Unjail testing +Add jailed validator key to kms. + +```sh + sekaid keys add jailed_validator --keyring-backend=test --home=$HOME/.sekaid --recover + "dish rather zoo connect cross inhale security utility occur spell price cute one catalog coconut sort shuffle palm crop surface label foster slender inherit" +``` + +[scripts/commands/governance/unjail-validator.sh](scripts/commands/governance/unjail-validator.sh) + +# New genesis file generation process from exported version + +In order to manually generate new genesis file when the hard fork is activated, following steps should be taken: + +1. Export current genesis, e.g: sekaid export --home= +2. Change chain-id to new_chain_id as indicated by the upgrade plan +3. Replace current upgrade plan in the app_state.upgrade with next plan and set next plan to null + +Using a command it can be done in this way. + +1. sekaid export > exported-genesis.json +2. sekaid new-genesis-from-exported exported-genesis.json new-genesis.json --json-minimize=true diff --git a/README.md b/README.md index d79262e5..d5e07b85 100644 --- a/README.md +++ b/README.md @@ -41,175 +41,49 @@ EOL cosign verify-blob --key=$KIRA_COSIGN_PUB--signature=./.sig ./ ``` -## Install bash-utils +## Features -Bash-utils is a KIRA tool that helps to simplify shell scripts and various bash commands that you might need to run +### Core modules for consensus -``` -# Install bash-utils.sh KIRA tool to make downloads faster and easier -TOOLS_VERSION="v0.0.12.4" && mkdir -p /usr/keys && FILE_NAME="bash-utils.sh" && \ - if [ -z "$KIRA_COSIGN_PUB" ] ; then KIRA_COSIGN_PUB=/usr/keys/kira-cosign.pub ; fi && \ - echo -e "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/IrzBQYeMwvKa44/DF/HB7XDpnE+\nf+mU9F/Qbfq25bBWV2+NlYMJv3KvKHNtu3Jknt6yizZjUV4b8WGfKBzFYw==\n-----END PUBLIC KEY-----" > $KIRA_COSIGN_PUB && \ - wget "https://github.com/KiraCore/tools/releases/download/$TOOLS_VERSION/${FILE_NAME}" -O ./$FILE_NAME && \ - wget "https://github.com/KiraCore/tools/releases/download/$TOOLS_VERSION/${FILE_NAME}.sig" -O ./${FILE_NAME}.sig && \ - cosign verify-blob --key="$KIRA_COSIGN_PUB" --signature=./${FILE_NAME}.sig ./$FILE_NAME && \ - chmod -v 555 ./$FILE_NAME && ./$FILE_NAME bashUtilsSetup "/var/kiraglob" && . /etc/profile && \ - echoInfo "Installed bash-utils $(bash-utils bashUtilsVersion)" -``` - -## Quick setup from Releases - -```bash -# TBD -``` - -## Set environment variables - -```sh -sh env.sh -``` - -# Get version info - -[scripts/commands/version.sh](scripts/commands/version.sh) - -# Adding more validators - -[scripts/commands/adding-validators.sh](scripts/commands/adding-validators.sh) - -## Set ChangeTxFee permission - -[scripts/commands/set-permission.sh](scripts/commands/set-permission.sh) - -## Set network properties - -[scripts/commands/set-network-properties.sh](scripts/commands/set-network-properties.sh) - -## Set Execution Fee - -[scripts/commands/set-execution-fee.sh](scripts/commands/set-execution-fee.sh) - -## Upsert token rates - -[scripts/commands/upsert-token-rates.sh](scripts/commands/upsert-token-rates.sh) - -## Upsert token alias - -[scripts/commands/upsert-token-alias.sh](scripts/commands/upsert-token-alias.sh) - -# Fee payment in foreign currency - -[scripts/commands/foreign-fee-payments.sh](scripts/commands/foreign-fee-payments.sh) - -# Fee payment in foreign currency returning failure - execution fee in foreign currency - -[scripts/commands/foreign-fee-payments-failure-return.sh](scripts/commands/foreign-fee-payments-failure-return.sh) - -## Query permission of an address - -[scripts/commands/query-permission.sh](scripts/commands/query-permission.sh) - -## Query network properties - -[scripts/commands/query-network-properties.sh](scripts/commands/query-network-properties.sh) +- staking +- slashing +- evidence +- distributor -## Query execution fee +### Basic modules -[scripts/commands/query-execution-fee.sh](scripts/commands/query-execution-fee.sh) +- spending +- tokens +- ubi -# Query token alias +### Liquid staking -[scripts/commands/query-token-alias.sh](scripts/commands/query-token-alias.sh) +- multistaking -# Query token rate +### Derivatives -[scripts/commands/query-token-rate.sh](scripts/commands/query-token-rate.sh) +- basket +- collectives -# Query validator account +### Governance -[scripts/commands/query-validator.sh](scripts/commands/query-validator.sh) +- gov -# Query for current frozen / unfronzen tokens +### Layer2 -**Notes**: these values are valid only when specific network property is enabled -[scripts/commands/query-frozen-token.sh](scripts/commands/query-frozen-token.sh) - -# Query poor network messages - -[scripts/commands/query-poor-network-messages.sh](scripts/commands/query-poor-network-messages.sh) - -# Query signing infos per validator's consensus address - -[scripts/commands/query-signing-infos.sh](scripts/commands/query-signing-infos.sh) - -# Common commands for governance process - -[scripts/commands/governance/common.sh](scripts/commands/governance/common.sh) - -### Set permission via governance process - -[scripts/commands/governance/assign-permission.sh](scripts/commands/governance/assign-permission.sh) - -## Upsert token alias via governance process - -[scripts/commands/governance/upsert-token-alias.sh](scripts/commands/governance/upsert-token-alias.sh) - -## Upsert token rates via governance process - -[scripts/commands/governance/upsert-token-rates.sh](scripts/commands/governance/upsert-token-rates.sh) - -# Commands for poor network management via governance process - -[scripts/commands/governance/poor-network-messages.sh](scripts/commands/governance/poor-network-messages.sh) - -# Freeze / unfreeze tokens via governance process - -[scripts/commands/governance/token-freeze.sh](scripts/commands/governance/token-freeze.sh) - -# Set network property proposal via governance process - -[scripts/commands/governance/set-network-property.sh](scripts/commands/governance/set-network-property.sh) - -# Set application upgrade proposal via governance process - -[scripts/commands/governance/upgrade-plan.sh](scripts/commands/governance/upgrade-plan.sh) - -Export the status of chain before halt (should kill the daemon process at the time of genesis export) -[scripts/commands/export-state.sh](scripts/commands/export-state.sh) - -The script for creating new chain from exported state should be written or manual edition process is required. -`ChainId` should be modified in this process. - -For now, upgrade process requires manual conversion from old genesis to new genesis. -At each time of upgrade, genesis upgrade command will be built and infra could run the command like `sekaid genesis-migrate` - -Note: state export command is not exporting the upgrade plan and if all validators run with exported genesis with the previous binary, consensus failure won't happen. - -# Identity registrar - -[scripts/commands/identity-registrar.sh](scripts/commands/identity-registrar.sh) - -# Unjail via governance process - -Modify genesis json to have jailed validator for Unjail testing -Add jailed validator key to kms. - -```sh - sekaid keys add jailed_validator --keyring-backend=test --home=$HOME/.sekaid --recover - "dish rather zoo connect cross inhale security utility occur spell price cute one catalog coconut sort shuffle palm crop surface label foster slender inherit" -``` +- layer2 -[scripts/commands/governance/unjail-validator.sh](scripts/commands/governance/unjail-validator.sh) +### Fees -# New genesis file generation process from exported version +- feeprocessing -In order to manually generate new genesis file when the hard fork is activated, following steps should be taken: +### Utilities & Upgrade -1. Export current genesis, e.g: sekaid export --home= -2. Change chain-id to new_chain_id as indicated by the upgrade plan -3. Replace current upgrade plan in the app_state.upgrade with next plan and set next plan to null +- custody +- recovery +- genutil +- upgrade -Using a command it can be done in this way. +## Contributing -1. sekaid export > exported-genesis.json -2. sekaid new-genesis-from-exported exported-genesis.json new-genesis.json --json-minimize=true +Check out [contributing.md](./CONTRIBUTING.md) for our guidelines & policies for how we develop the Kira chain. Thank you to all those who have contributed! From d1d5f00fc836a5149e558038d8373e1897498ae4 Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 01:32:58 +0800 Subject: [PATCH 02/12] add proposal for set execution fees --- app/ante/testutil/expected_keepers_mocks.go | 127 +++++ app/app.go | 1 + proto/kira/gov/permission.proto | 6 + proto/kira/gov/proposal.proto | 9 + scripts/sekai-env.sh | 12 + types/Proposal.go | 1 + x/gov/client/cli/tx.go | 78 ++++ x/gov/proposal_handler.go | 22 + x/gov/types/codec.go | 1 + x/gov/types/permission.pb.go | 219 ++++----- x/gov/types/proposal.go | 25 + x/gov/types/proposal.pb.go | 490 ++++++++++++++++---- 12 files changed, 786 insertions(+), 205 deletions(-) create mode 100644 app/ante/testutil/expected_keepers_mocks.go diff --git a/app/ante/testutil/expected_keepers_mocks.go b/app/ante/testutil/expected_keepers_mocks.go new file mode 100644 index 00000000..ff2803af --- /dev/null +++ b/app/ante/testutil/expected_keepers_mocks.go @@ -0,0 +1,127 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: x/auth/ante/expected_keepers.go + +// Package testutil is a generated GoMock package. +package testutil + +import ( + reflect "reflect" + + types "github.com/cosmos/cosmos-sdk/types" + types0 "github.com/cosmos/cosmos-sdk/x/auth/types" + gomock "github.com/golang/mock/gomock" +) + +// MockAccountKeeper is a mock of AccountKeeper interface. +type MockAccountKeeper struct { + ctrl *gomock.Controller + recorder *MockAccountKeeperMockRecorder +} + +// MockAccountKeeperMockRecorder is the mock recorder for MockAccountKeeper. +type MockAccountKeeperMockRecorder struct { + mock *MockAccountKeeper +} + +// NewMockAccountKeeper creates a new mock instance. +func NewMockAccountKeeper(ctrl *gomock.Controller) *MockAccountKeeper { + mock := &MockAccountKeeper{ctrl: ctrl} + mock.recorder = &MockAccountKeeperMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAccountKeeper) EXPECT() *MockAccountKeeperMockRecorder { + return m.recorder +} + +// GetAccount mocks base method. +func (m *MockAccountKeeper) GetAccount(ctx types.Context, addr types.AccAddress) types0.AccountI { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAccount", ctx, addr) + ret0, _ := ret[0].(types0.AccountI) + return ret0 +} + +// GetAccount indicates an expected call of GetAccount. +func (mr *MockAccountKeeperMockRecorder) GetAccount(ctx, addr interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAccount", reflect.TypeOf((*MockAccountKeeper)(nil).GetAccount), ctx, addr) +} + +// GetModuleAddress mocks base method. +func (m *MockAccountKeeper) GetModuleAddress(moduleName string) types.AccAddress { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetModuleAddress", moduleName) + ret0, _ := ret[0].(types.AccAddress) + return ret0 +} + +// GetModuleAddress indicates an expected call of GetModuleAddress. +func (mr *MockAccountKeeperMockRecorder) GetModuleAddress(moduleName interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetModuleAddress", reflect.TypeOf((*MockAccountKeeper)(nil).GetModuleAddress), moduleName) +} + +// GetParams mocks base method. +func (m *MockAccountKeeper) GetParams(ctx types.Context) types0.Params { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetParams", ctx) + ret0, _ := ret[0].(types0.Params) + return ret0 +} + +// GetParams indicates an expected call of GetParams. +func (mr *MockAccountKeeperMockRecorder) GetParams(ctx interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetParams", reflect.TypeOf((*MockAccountKeeper)(nil).GetParams), ctx) +} + +// SetAccount mocks base method. +func (m *MockAccountKeeper) SetAccount(ctx types.Context, acc types0.AccountI) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetAccount", ctx, acc) +} + +// SetAccount indicates an expected call of SetAccount. +func (mr *MockAccountKeeperMockRecorder) SetAccount(ctx, acc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAccount", reflect.TypeOf((*MockAccountKeeper)(nil).SetAccount), ctx, acc) +} + +// MockFeegrantKeeper is a mock of FeegrantKeeper interface. +type MockFeegrantKeeper struct { + ctrl *gomock.Controller + recorder *MockFeegrantKeeperMockRecorder +} + +// MockFeegrantKeeperMockRecorder is the mock recorder for MockFeegrantKeeper. +type MockFeegrantKeeperMockRecorder struct { + mock *MockFeegrantKeeper +} + +// NewMockFeegrantKeeper creates a new mock instance. +func NewMockFeegrantKeeper(ctrl *gomock.Controller) *MockFeegrantKeeper { + mock := &MockFeegrantKeeper{ctrl: ctrl} + mock.recorder = &MockFeegrantKeeperMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockFeegrantKeeper) EXPECT() *MockFeegrantKeeperMockRecorder { + return m.recorder +} + +// UseGrantedFees mocks base method. +func (m *MockFeegrantKeeper) UseGrantedFees(ctx types.Context, granter, grantee types.AccAddress, fee types.Coins, msgs []types.Msg) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UseGrantedFees", ctx, granter, grantee, fee, msgs) + ret0, _ := ret[0].(error) + return ret0 +} + +// UseGrantedFees indicates an expected call of UseGrantedFees. +func (mr *MockFeegrantKeeperMockRecorder) UseGrantedFees(ctx, granter, grantee, fee, msgs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UseGrantedFees", reflect.TypeOf((*MockFeegrantKeeper)(nil).UseGrantedFees), ctx, granter, grantee, fee, msgs) +} diff --git a/app/app.go b/app/app.go index 49e74596..793b769a 100644 --- a/app/app.go +++ b/app/app.go @@ -370,6 +370,7 @@ func NewInitApp( customgov.NewApplySetPoorNetworkMessagesProposalHandler(app.CustomGovKeeper), customgov.NewApplyResetWholeCouncilorRankProposalHandler(app.CustomGovKeeper), customgov.NewApplyJailCouncilorProposalHandler(app.CustomGovKeeper), + customgov.NewApplySetExecutionFeesProposalHandler(app.CustomGovKeeper), tokens.NewApplyUpsertTokenAliasProposalHandler(app.TokensKeeper), tokens.NewApplyUpsertTokenRatesProposalHandler(app.TokensKeeper), tokens.NewApplyWhiteBlackChangeProposalHandler(app.TokensKeeper), diff --git a/proto/kira/gov/permission.proto b/proto/kira/gov/permission.proto index b41538ef..1193f787 100644 --- a/proto/kira/gov/permission.proto +++ b/proto/kira/gov/permission.proto @@ -226,4 +226,10 @@ enum PermValue { // PERMISSION_CREATE_DAPP_PROPOSAL_WITHOUT_BOND defines the permission needed to create a dapp proposal without bond PERMISSION_CREATE_DAPP_PROPOSAL_WITHOUT_BOND = 67 [(gogoproto.enumvalue_customname) = "PermCreateDappProposalWithoutBond"]; + + // PERMISSION_CREATE_SET_EXECUTION_FEES_PROPOSAL defines the permission needed to create a proposal to set execution fees + PERMISSION_CREATE_SET_EXECUTION_FEES_PROPOSAL = 68 [(gogoproto.enumvalue_customname) = "PermCreateSetExecutionFeesProposal"]; + + // PERMISSION_VOTE_SET_EXECUTION_FEES_PROPOSAL defines the permission needed to vote on set execution fees proposal + PERMISSION_VOTE_SET_EXECUTION_FEES_PROPOSAL = 69 [(gogoproto.enumvalue_customname) = "PermVoteSetExecutionFeesProposal"]; } diff --git a/proto/kira/gov/proposal.proto b/proto/kira/gov/proposal.proto index c31edf30..0bf60671 100644 --- a/proto/kira/gov/proposal.proto +++ b/proto/kira/gov/proposal.proto @@ -7,6 +7,7 @@ import "google/protobuf/any.proto"; import "cosmos_proto/cosmos.proto"; import "kira/gov/role.proto"; import "kira/gov/permission.proto"; +import "kira/gov/execution_fee.proto"; import "kira/gov/network_properties.proto"; option go_package = "github.com/KiraCore/sekai/x/gov/types"; @@ -252,4 +253,12 @@ message ProposalJailCouncilor { ]; string description = 2; repeated string councilors = 3; +} + +message ProposalSetExecutionFees { + bytes proposer = 1 [ + (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress" + ]; + string description = 2; + repeated ExecutionFee execution_fees = 3 [ (gogoproto.nullable) = false ]; } \ No newline at end of file diff --git a/scripts/sekai-env.sh b/scripts/sekai-env.sh index 8153f0cc..e457a8a9 100755 --- a/scripts/sekai-env.sh +++ b/scripts/sekai-env.sh @@ -200,6 +200,18 @@ PermCreateJailCouncilorProposal=64 # permission needed to vote on jail councilors proposal PermVoteJailCouncilorProposal=65 +# permission needed to create a poll proposal +PermCreatePollProposal=66 + +# permission needed to create a dapp proposal without bond +PermCreateDappProposalWithoutBond=67 + +# permission needed to create a proposal to set execution fees +PermCreateSetExecutionFeesProposal=68 + +# permission needed to vote on set execution fees proposal +PermVoteSetExecutionFeesProposal=69 + ###################################### transaction_types ###################################### TypeMsgSend="send" TypeMsgMultiSend="multisend" diff --git a/types/Proposal.go b/types/Proposal.go index 24434a27..0465bece 100644 --- a/types/Proposal.go +++ b/types/Proposal.go @@ -16,6 +16,7 @@ const ( ProposalTypeRemoveUBI = "RemoveUBI" ProposalTypeResetWholeCouncilorRank = "ResetWholeCouncilorRank" ProposalTypeJailCouncilor = "JailCouncilor" + ProposalTypeSetExecutionFees = "SetExecutionFees" ProposalTypeWhitelistAccountPermission = "WhitelistAccountPermission" ProposalTypeBlacklistAccountPermission = "BlacklistAccountPermission" ProposalTypeRemoveWhitelistedAccountPermission = "RemoveWhitelistedAccountPermission" diff --git a/x/gov/client/cli/tx.go b/x/gov/client/cli/tx.go index 7cd3a585..e3d72f37 100644 --- a/x/gov/client/cli/tx.go +++ b/x/gov/client/cli/tx.go @@ -150,6 +150,7 @@ func NewTxProposalCmds() *cobra.Command { proposalCmd.AddCommand(GetTxProposalSetProposalDurations()) proposalCmd.AddCommand(GetTxProposalResetWholeCouncilorRankCmd()) proposalCmd.AddCommand(GetTxProposalJailCouncilorCmd()) + proposalCmd.AddCommand(GetTxProposalSetExecutionFeesCmd()) proposalCmd.AddCommand(accountProposalCmd) proposalCmd.AddCommand(roleProposalCmd) @@ -2314,6 +2315,83 @@ func GetTxProposalJailCouncilorCmd() *cobra.Command { return cmd } +// GetTxProposalSetExecutionFeesCmd implement cli command for ProposalSetExecutionFees +func GetTxProposalSetExecutionFeesCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "proposal-set-execution-fees [txTypes] [executionFees] [failureFees] [timeouts] [defaultParams]", + Short: "Create a proposal to set execution fees", + Args: cobra.ExactArgs(5), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + title, err := cmd.Flags().GetString(FlagTitle) + if err != nil { + return fmt.Errorf("invalid title: %w", err) + } + description, err := cmd.Flags().GetString(FlagDescription) + if err != nil { + return fmt.Errorf("invalid description: %w", err) + } + + txTypes := strings.Split(args[0], ",") + execFeeStrs := strings.Split(args[1], ",") + failureFeeStrs := strings.Split(args[2], ",") + timeoutStrs := strings.Split(args[3], ",") + defaultParamStrs := strings.Split(args[3], ",") + executionFees := []types.ExecutionFee{} + for i, txType := range txTypes { + execFee, err := strconv.Atoi(execFeeStrs[i]) + if err != nil { + return err + } + failureFee, err := strconv.Atoi(failureFeeStrs[i]) + if err != nil { + return err + } + timeout, err := strconv.Atoi(timeoutStrs[i]) + if err != nil { + return err + } + defaultParams, err := strconv.Atoi(defaultParamStrs[i]) + if err != nil { + return err + } + executionFees = append(executionFees, types.ExecutionFee{ + TransactionType: txType, + ExecutionFee: uint64(execFee), + FailureFee: uint64(failureFee), + Timeout: uint64(timeout), + DefaultParameters: uint64(defaultParams), + }) + } + + msg, err := types.NewMsgSubmitProposal( + clientCtx.FromAddress, + title, + description, + types.NewSetExecutionFeesProposal(clientCtx.FromAddress, description, executionFees), + ) + if err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + cmd.Flags().String(FlagTitle, "", "The title of the proposal.") + cmd.MarkFlagRequired(FlagTitle) + cmd.Flags().String(FlagDescription, "", "The description of the proposal, it can be a url, some text, etc.") + cmd.MarkFlagRequired(FlagDescription) + + flags.AddTxFlagsToCmd(cmd) + _ = cmd.MarkFlagRequired(flags.FlagFrom) + + return cmd +} + // convertAsPermValues convert array of int32 to PermValue array. func convertAsPermValues(values []int32) []types.PermValue { var v []types.PermValue diff --git a/x/gov/proposal_handler.go b/x/gov/proposal_handler.go index db0683da..1e32d0e2 100644 --- a/x/gov/proposal_handler.go +++ b/x/gov/proposal_handler.go @@ -464,3 +464,25 @@ func (a ApplyJailCouncilorProposalHandler) Apply(ctx sdk.Context, proposalID uin } return nil } + +type ApplySetExecutionFeesHandler struct { + keeper keeper.Keeper +} + +func NewApplySetExecutionFeesProposalHandler(keeper keeper.Keeper) *ApplySetExecutionFeesHandler { + return &ApplySetExecutionFeesHandler{ + keeper: keeper, + } +} + +func (a ApplySetExecutionFeesHandler) ProposalType() string { + return kiratypes.ProposalTypeSetExecutionFees +} + +func (a ApplySetExecutionFeesHandler) Apply(ctx sdk.Context, proposalID uint64, proposal types.Content, slash sdk.Dec) error { + p := proposal.(*types.ProposalSetExecutionFees) + for _, executionFee := range p.ExecutionFees { + a.keeper.SetExecutionFee(ctx, executionFee) + } + return nil +} diff --git a/x/gov/types/codec.go b/x/gov/types/codec.go index 8356a735..9b8575c1 100644 --- a/x/gov/types/codec.go +++ b/x/gov/types/codec.go @@ -456,6 +456,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &SetProposalDurationsProposal{}, &ProposalResetWholeCouncilorRank{}, &ProposalJailCouncilor{}, + &ProposalSetExecutionFees{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) diff --git a/x/gov/types/permission.pb.go b/x/gov/types/permission.pb.go index 6aa26529..2659611e 100644 --- a/x/gov/types/permission.pb.go +++ b/x/gov/types/permission.pb.go @@ -172,6 +172,10 @@ const ( PermCreatePollProposal PermValue = 66 // PERMISSION_CREATE_DAPP_PROPOSAL_WITHOUT_BOND defines the permission needed to create a dapp proposal without bond PermCreateDappProposalWithoutBond PermValue = 67 + // PERMISSION_CREATE_SET_EXECUTION_FEES_PROPOSAL defines the permission needed to create a proposal to set execution fees + PermCreateSetExecutionFeesProposal PermValue = 68 + // PERMISSION_VOTE_SET_EXECUTION_FEES_PROPOSAL defines the permission needed to vote on set execution fees proposal + PermVoteSetExecutionFeesProposal PermValue = 69 ) var PermValue_name = map[int32]string{ @@ -243,6 +247,8 @@ var PermValue_name = map[int32]string{ 65: "PERMISSION_VOTE_JAIL_COUNCILOR_PROPOSAL", 66: "PERMISSION_CREATE_POLL_PROPOSAL", 67: "PERMISSION_CREATE_DAPP_PROPOSAL_WITHOUT_BOND", + 68: "PERMISSION_CREATE_SET_EXECUTION_FEES_PROPOSAL", + 69: "PERMISSION_VOTE_SET_EXECUTION_FEES_PROPOSAL", } var PermValue_value = map[string]int32{ @@ -314,6 +320,8 @@ var PermValue_value = map[string]int32{ "PERMISSION_VOTE_JAIL_COUNCILOR_PROPOSAL": 65, "PERMISSION_CREATE_POLL_PROPOSAL": 66, "PERMISSION_CREATE_DAPP_PROPOSAL_WITHOUT_BOND": 67, + "PERMISSION_CREATE_SET_EXECUTION_FEES_PROPOSAL": 68, + "PERMISSION_VOTE_SET_EXECUTION_FEES_PROPOSAL": 69, } func (x PermValue) String() string { @@ -331,108 +339,111 @@ func init() { func init() { proto.RegisterFile("kira/gov/permission.proto", fileDescriptor_214168f8815c1062) } var fileDescriptor_214168f8815c1062 = []byte{ - // 1647 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x98, 0xcd, 0x76, 0xd3, 0x46, - 0x14, 0xc7, 0x93, 0x96, 0x52, 0x98, 0x52, 0x50, 0x0d, 0x0d, 0x61, 0x20, 0xce, 0xe4, 0xfb, 0x0b, - 0x6c, 0x48, 0x20, 0x2d, 0xa5, 0x85, 0xca, 0xb6, 0x12, 0x9b, 0xd8, 0x96, 0x8f, 0x24, 0xc7, 0x25, - 0x2d, 0xc7, 0x15, 0xc9, 0xe0, 0xa8, 0x56, 0x3c, 0xae, 0xa4, 0xf0, 0xd1, 0x27, 0xe8, 0xd1, 0xaa, - 0x2f, 0xa0, 0x55, 0x5f, 0xa6, 0x4b, 0x16, 0x5d, 0x74, 0xd9, 0x03, 0x2f, 0xd2, 0x23, 0xd9, 0xd6, - 0x68, 0x64, 0xc9, 0x56, 0xba, 0xe2, 0x23, 0x99, 0xdf, 0xff, 0xde, 0xff, 0xcc, 0x9d, 0xb9, 0x57, - 0xe0, 0x46, 0x5b, 0x33, 0xd4, 0x6c, 0x8b, 0xbc, 0xca, 0x76, 0xb1, 0x71, 0xa2, 0x99, 0xa6, 0x46, - 0x3a, 0x99, 0xae, 0x41, 0x2c, 0x92, 0xba, 0xe0, 0xfe, 0x28, 0xd3, 0x22, 0xaf, 0xe0, 0xb5, 0x16, - 0x69, 0x11, 0xef, 0x3f, 0xb3, 0xee, 0xdf, 0x7a, 0x3f, 0x5f, 0xff, 0x3b, 0x03, 0x2e, 0xd6, 0xb0, - 0x71, 0xb2, 0xaf, 0xea, 0xa7, 0x38, 0x35, 0x07, 0xae, 0xd4, 0x04, 0xa9, 0x52, 0x92, 0xe5, 0x92, - 0x58, 0x6d, 0x1e, 0x08, 0x92, 0xc8, 0x4d, 0xc0, 0x4b, 0xb6, 0x83, 0x2e, 0xb8, 0xbf, 0x73, 0x80, - 0x0d, 0x92, 0xda, 0x06, 0x30, 0xf0, 0x2b, 0xb2, 0xa0, 0x34, 0xe9, 0x3f, 0x65, 0x6e, 0x12, 0x4e, - 0xd9, 0x0e, 0x4a, 0xb9, 0xbf, 0x2d, 0x63, 0xab, 0xe6, 0x47, 0x63, 0x86, 0xd6, 0xe5, 0xcb, 0x7c, - 0xa9, 0xd2, 0xdc, 0xe7, 0xcb, 0xa5, 0x02, 0xaf, 0x88, 0x12, 0xf7, 0x11, 0x5d, 0x97, 0xd7, 0x55, - 0xcd, 0x0d, 0x47, 0x3b, 0x52, 0x2d, 0x62, 0x44, 0xae, 0xcb, 0x8b, 0xf5, 0x6a, 0xbe, 0x54, 0x16, - 0x25, 0xee, 0xe3, 0xd0, 0xba, 0x3c, 0x39, 0xed, 0x1c, 0x6a, 0x3a, 0x31, 0x52, 0x3f, 0x83, 0xbb, - 0x81, 0x75, 0x8d, 0x62, 0x49, 0x11, 0xca, 0x25, 0x59, 0x69, 0xf2, 0x79, 0x77, 0x75, 0x30, 0xea, - 0x66, 0x4d, 0x12, 0x6b, 0xa2, 0xcc, 0x97, 0xb9, 0x73, 0x70, 0xdd, 0x76, 0xd0, 0xb2, 0x4b, 0x6b, - 0x1c, 0x6b, 0x16, 0xd6, 0x35, 0xd3, 0xe2, 0x0f, 0x0f, 0xc9, 0x69, 0x27, 0x90, 0x4a, 0xcd, 0x20, - 0x5d, 0x62, 0xaa, 0x7a, 0x4a, 0x03, 0x0f, 0x02, 0x90, 0x7d, 0x51, 0x11, 0x12, 0xca, 0x7c, 0x02, - 0x33, 0xb6, 0x83, 0xd6, 0x3d, 0xdb, 0x89, 0x85, 0x13, 0x48, 0x3d, 0x02, 0x33, 0x01, 0x50, 0xbd, - 0x26, 0x0b, 0x92, 0xd2, 0x54, 0xc4, 0x3d, 0xa1, 0xda, 0xe4, 0xcb, 0x25, 0x5e, 0xe6, 0xce, 0xc3, - 0x69, 0xdb, 0x41, 0xd7, 0xdc, 0xa5, 0xf5, 0xae, 0x89, 0x0d, 0x4b, 0x21, 0x6d, 0xdc, 0xe1, 0x75, - 0x4d, 0x35, 0x53, 0xf7, 0xc0, 0x74, 0xd0, 0xc1, 0x22, 0x5f, 0xdd, 0x15, 0x9a, 0xca, 0x0f, 0xcd, - 0x1d, 0x41, 0xe0, 0x3e, 0x85, 0x57, 0x6d, 0x07, 0x5d, 0xf1, 0xfc, 0x3b, 0x56, 0x3b, 0x2d, 0xac, - 0xbc, 0xd9, 0xc1, 0x38, 0xf5, 0x10, 0xdc, 0x8a, 0xd3, 0x93, 0x78, 0x45, 0xe0, 0x2e, 0xc0, 0xeb, - 0xb6, 0x83, 0xae, 0x86, 0xe4, 0x24, 0xd5, 0xc2, 0xa9, 0x0c, 0x98, 0x1a, 0x5e, 0x2a, 0x89, 0x65, - 0x81, 0xbb, 0x08, 0x53, 0xb6, 0x83, 0x2e, 0xd3, 0x45, 0x12, 0xd1, 0x71, 0xea, 0x39, 0xc8, 0x06, - 0xa3, 0x93, 0x04, 0x5e, 0x11, 0x06, 0xcb, 0x0a, 0xbc, 0xc2, 0x37, 0x25, 0x61, 0xb7, 0x24, 0x2b, - 0xd2, 0x33, 0xea, 0x1f, 0x80, 0xab, 0xb6, 0x83, 0x16, 0xbd, 0xa0, 0x0d, 0xac, 0x5a, 0xb8, 0x87, - 0x2b, 0xa8, 0x96, 0x2a, 0xe1, 0x96, 0x66, 0x5a, 0xc6, 0x5b, 0xdf, 0xb9, 0x67, 0xe0, 0x4e, 0x78, - 0x93, 0x46, 0xc3, 0x3f, 0x83, 0xcb, 0xb6, 0x83, 0xe6, 0x07, 0x9b, 0x33, 0x02, 0x1d, 0x19, 0xb9, - 0x5b, 0x10, 0x55, 0x41, 0x69, 0x88, 0xd2, 0x9e, 0xc7, 0x14, 0x24, 0x25, 0x00, 0xbf, 0x14, 0x8e, - 0x5c, 0xc6, 0x56, 0x15, 0x5b, 0xaf, 0x89, 0xd1, 0x76, 0xb1, 0xd8, 0xb0, 0x46, 0x46, 0x3e, 0x1a, - 0xfe, 0x39, 0x1b, 0x79, 0x62, 0x34, 0xeb, 0x79, 0xe0, 0x54, 0x51, 0xf4, 0x65, 0x8a, 0x0e, 0x3a, - 0x4e, 0x0f, 0x99, 0x8f, 0xae, 0x83, 0x8d, 0x18, 0xbf, 0x23, 0xc1, 0x57, 0xe0, 0xa2, 0xed, 0x20, - 0xc4, 0xba, 0x1d, 0x81, 0x7d, 0xce, 0x60, 0x03, 0x5e, 0xd7, 0x44, 0x51, 0xf2, 0x3d, 0xa9, 0x08, - 0xb2, 0xcc, 0xef, 0x0a, 0x32, 0xc7, 0xc1, 0xdb, 0xb6, 0x83, 0x56, 0x19, 0x9f, 0x6b, 0x84, 0x18, - 0x7d, 0x43, 0x2a, 0xd8, 0x34, 0xd5, 0x16, 0xa6, 0xf8, 0x17, 0x60, 0x33, 0xca, 0xeb, 0x48, 0x38, - 0x0d, 0xfe, 0x0b, 0x7a, 0x5d, 0xf4, 0x0d, 0x1f, 0xa5, 0xd1, 0x00, 0xb7, 0xc7, 0x98, 0xee, 0x96, - 0x16, 0xa5, 0xa7, 0xe0, 0x92, 0xed, 0xa0, 0xb9, 0x48, 0xcf, 0xdd, 0x4a, 0xf3, 0xc1, 0x32, 0x58, - 0x1f, 0x69, 0x39, 0x8b, 0xbd, 0x0a, 0x17, 0x6c, 0x07, 0xcd, 0x46, 0x38, 0xce, 0x40, 0xf7, 0xa3, - 0x0c, 0xaf, 0x57, 0x9f, 0xf2, 0xa5, 0x32, 0xbd, 0xb6, 0x29, 0xf5, 0xda, 0x50, 0xb0, 0x9d, 0x5f, - 0x54, 0x4d, 0xf7, 0xaf, 0x71, 0x9f, 0x2b, 0x81, 0xb5, 0xa1, 0x60, 0x63, 0xa9, 0x5f, 0x86, 0x62, - 0x8d, 0x61, 0xee, 0x80, 0xe5, 0xe1, 0x58, 0xfb, 0x7f, 0xb8, 0x37, 0x0f, 0x05, 0x4e, 0x41, 0x68, - 0x3b, 0x68, 0x8a, 0x86, 0xe9, 0x5e, 0x41, 0x3e, 0xa7, 0x08, 0x16, 0xc3, 0xb1, 0x45, 0x52, 0xae, - 0xc3, 0xb4, 0xed, 0x20, 0x38, 0x08, 0x2b, 0x82, 0xf4, 0x12, 0xdc, 0x1f, 0x8e, 0xc8, 0xdb, 0x0d, - 0xb9, 0xf7, 0x46, 0x34, 0x73, 0x65, 0x3e, 0xbf, 0x37, 0xb8, 0x8c, 0x7d, 0xf2, 0x74, 0xf8, 0xdc, - 0x7a, 0x1b, 0x63, 0x7a, 0x2f, 0x44, 0x4e, 0x57, 0x0f, 0xdb, 0xbd, 0x4b, 0x7a, 0xd4, 0xb9, 0x4d, - 0xa0, 0x72, 0x83, 0x3d, 0xb7, 0x63, 0x34, 0x8e, 0x99, 0x67, 0x6e, 0x60, 0x88, 0xe0, 0xd6, 0x47, - 0xa3, 0xe8, 0xfa, 0x42, 0x37, 0x4e, 0xe2, 0xab, 0x7b, 0x54, 0x06, 0xc2, 0x3b, 0xb6, 0x83, 0xd6, - 0x02, 0x66, 0x63, 0x13, 0x5b, 0x8d, 0x63, 0xa2, 0x63, 0x7f, 0x0f, 0x25, 0xb5, 0xd3, 0xf6, 0x95, - 0x8e, 0xc0, 0x56, 0x38, 0x9b, 0x24, 0x3a, 0x37, 0xe1, 0x86, 0xed, 0xa0, 0x95, 0x41, 0x3a, 0xe3, - 0x54, 0x22, 0x4f, 0xb6, 0x2c, 0xee, 0x28, 0x0d, 0x5e, 0x72, 0x2b, 0x67, 0x57, 0xe2, 0x0b, 0x01, - 0xb3, 0x6e, 0x85, 0x4f, 0xb6, 0x4c, 0x5e, 0x5a, 0xaf, 0x55, 0x03, 0xd7, 0xbb, 0x2d, 0x43, 0x3d, - 0xa2, 0x3e, 0x55, 0x98, 0xd3, 0x13, 0x0f, 0x9c, 0x61, 0x0f, 0x75, 0x1c, 0x8e, 0x2d, 0x14, 0xd7, - 0x85, 0x50, 0xcf, 0x14, 0x68, 0x2d, 0xb8, 0x34, 0x65, 0xca, 0xd8, 0x62, 0x3b, 0x28, 0xda, 0x4e, - 0xa4, 0x9a, 0x4c, 0x4f, 0x14, 0xbc, 0x45, 0xfb, 0xc1, 0x35, 0x0b, 0x75, 0x89, 0x57, 0x98, 0x66, - 0x65, 0x16, 0xae, 0xd9, 0x0e, 0x5a, 0x62, 0xaf, 0xd2, 0x7e, 0x90, 0x85, 0x53, 0x43, 0xb5, 0x82, - 0x7d, 0xca, 0x8f, 0x20, 0x13, 0x79, 0x8f, 0xc6, 0xe3, 0x11, 0x5c, 0xb1, 0x1d, 0xb4, 0x10, 0xbc, - 0x43, 0xe3, 0xe0, 0x6c, 0x47, 0xe7, 0x1d, 0xed, 0xb1, 0xad, 0xd6, 0x1c, 0x3d, 0xea, 0xde, 0xd9, - 0x3e, 0x73, 0x47, 0x97, 0x4c, 0x66, 0x9e, 0xed, 0xe8, 0x12, 0x48, 0xfd, 0x0a, 0x1e, 0x06, 0x40, - 0x92, 0x50, 0x11, 0xf7, 0x03, 0xed, 0xa3, 0x50, 0x18, 0x29, 0xb7, 0x00, 0x37, 0x6d, 0x07, 0x65, - 0x5c, 0xac, 0x84, 0x4f, 0xc8, 0x2b, 0xda, 0x42, 0xe2, 0xa3, 0x78, 0xc9, 0xdf, 0xc0, 0xe3, 0xe1, - 0xf2, 0x3a, 0x93, 0xee, 0x22, 0xdc, 0xb6, 0x1d, 0xb4, 0x49, 0x2b, 0x2d, 0xb1, 0x76, 0x64, 0xba, - 0xbe, 0xb7, 0x63, 0x64, 0x97, 0xc2, 0xe9, 0xfa, 0xfe, 0xfe, 0xbf, 0x74, 0x93, 0xea, 0x2e, 0x47, - 0xa5, 0x9b, 0x48, 0xfb, 0x80, 0x69, 0xb0, 0xe8, 0x54, 0xd0, 0x7b, 0x47, 0x22, 0xa4, 0x56, 0x68, - 0x19, 0xf8, 0x7e, 0x7a, 0x2f, 0xca, 0x30, 0xfb, 0x70, 0xf8, 0xce, 0x4f, 0x20, 0xb0, 0xca, 0x5e, - 0x92, 0xe3, 0x44, 0xd8, 0x04, 0x68, 0x11, 0xc4, 0xf2, 0xd7, 0x68, 0x02, 0xbe, 0x43, 0xc9, 0x13, - 0x48, 0x20, 0xb0, 0xce, 0x26, 0x30, 0x4e, 0xa4, 0x0d, 0xb6, 0x47, 0xd7, 0x57, 0xac, 0xd0, 0x06, - 0xcc, 0xda, 0x0e, 0xda, 0x88, 0x2c, 0xae, 0x18, 0x31, 0x0b, 0x3c, 0x4a, 0x50, 0x59, 0xb1, 0x8a, - 0xb7, 0xe1, 0x96, 0xed, 0xa0, 0x6c, 0x6c, 0x59, 0x9d, 0x25, 0xc5, 0xe0, 0xd9, 0x8e, 0x15, 0xbc, - 0x13, 0x4e, 0x31, 0x70, 0xa8, 0xcf, 0x9c, 0x62, 0x22, 0xc5, 0x4c, 0x54, 0x8a, 0xe3, 0x55, 0xd9, - 0xd6, 0x96, 0x97, 0xe5, 0xd2, 0x6e, 0xb5, 0x27, 0xa2, 0x88, 0xb4, 0x74, 0x07, 0x22, 0x59, 0xfa, - 0x0a, 0xf2, 0xa6, 0xa9, 0xb5, 0x3a, 0x2e, 0x55, 0x21, 0x83, 0x32, 0x1d, 0x40, 0x7f, 0x62, 0xe6, - 0x36, 0x2f, 0x95, 0x71, 0xe4, 0xbb, 0xec, 0x2b, 0x35, 0x8a, 0xce, 0x3e, 0x81, 0xf5, 0x6a, 0x10, - 0xbd, 0x23, 0x89, 0x95, 0x61, 0xf8, 0x3d, 0x0a, 0xaf, 0x77, 0x54, 0x1f, 0xbd, 0x63, 0x90, 0x93, - 0x30, 0x3c, 0xa2, 0x43, 0x4a, 0xa2, 0xb0, 0xc9, 0xd6, 0xce, 0x38, 0x95, 0xc8, 0x7e, 0xba, 0xbf, - 0xdb, 0x6c, 0x27, 0xbc, 0x45, 0xfb, 0xe9, 0xde, 0x96, 0x8e, 0xeb, 0xa7, 0x23, 0x29, 0xf7, 0xd9, - 0x7e, 0x3a, 0x82, 0xf4, 0x14, 0x2c, 0xc5, 0xce, 0x4e, 0xf5, 0x5c, 0x89, 0xa2, 0x1e, 0xc0, 0x59, - 0xdb, 0x41, 0x37, 0xc3, 0x43, 0x53, 0x3d, 0x57, 0x0a, 0x64, 0xb7, 0x10, 0x33, 0x2e, 0x31, 0xa4, - 0x6d, 0x38, 0x63, 0x3b, 0xe8, 0x06, 0x3b, 0x27, 0x05, 0x39, 0x91, 0x31, 0xf5, 0xf3, 0x63, 0x48, - 0x5f, 0x85, 0x63, 0xea, 0x25, 0x38, 0x26, 0xa6, 0x28, 0xd2, 0xd7, 0x6c, 0x4c, 0xc3, 0x1c, 0x85, - 0xa9, 0x97, 0x41, 0x83, 0x57, 0xe6, 0xe5, 0x62, 0xd4, 0x78, 0xf5, 0x90, 0x0e, 0xdf, 0xfd, 0xd6, - 0x4e, 0x57, 0xcd, 0xe3, 0xe1, 0xf9, 0xaa, 0x06, 0x56, 0x87, 0xba, 0xba, 0x38, 0xe6, 0x37, 0x70, - 0xde, 0x76, 0x50, 0xda, 0xef, 0xe7, 0xa2, 0x89, 0x79, 0x30, 0x37, 0x1c, 0x67, 0x8e, 0x97, 0xf7, - 0x02, 0xcd, 0x22, 0xf7, 0x08, 0xde, 0xb2, 0x1d, 0x34, 0x4d, 0xc3, 0xcb, 0xa9, 0x66, 0x9b, 0xf6, - 0x87, 0xa9, 0x27, 0x60, 0x76, 0xe8, 0x1d, 0x09, 0x21, 0xbe, 0xa5, 0xe7, 0xd3, 0x7b, 0x34, 0x58, - 0x80, 0x00, 0xe6, 0x03, 0x80, 0x22, 0x5f, 0x2d, 0x94, 0x7d, 0x84, 0x50, 0x11, 0xa4, 0x5d, 0xa1, - 0x9a, 0x7f, 0xc6, 0x7d, 0x47, 0x4d, 0x2f, 0xaa, 0x9d, 0x23, 0xbd, 0x4f, 0x11, 0x4e, 0xb0, 0xd1, - 0xc2, 0x9d, 0xc3, 0xb7, 0xe3, 0x07, 0x24, 0xff, 0x73, 0x65, 0x68, 0x70, 0x79, 0x1c, 0x3f, 0x20, - 0xf9, 0xdf, 0x31, 0xcf, 0x32, 0x20, 0xc5, 0xe9, 0x3c, 0x89, 0x1b, 0x90, 0xa2, 0x55, 0xd8, 0xc9, - 0xa3, 0x9f, 0x8f, 0x37, 0xa2, 0x53, 0x01, 0x9f, 0xfd, 0x3d, 0xbd, 0x73, 0x7b, 0x39, 0x3c, 0x55, - 0x35, 0xdd, 0xe7, 0xfa, 0xcc, 0x2a, 0x58, 0x09, 0x47, 0x1e, 0x47, 0xe4, 0xe1, 0x9c, 0xed, 0xa0, - 0x99, 0x41, 0xb4, 0xd1, 0x3c, 0x76, 0xef, 0xfb, 0x31, 0xd6, 0xc4, 0x72, 0x99, 0x72, 0x72, 0xe1, - 0x59, 0xbf, 0x46, 0x74, 0x7d, 0xf4, 0xd7, 0x98, 0x02, 0x5f, 0xab, 0xd1, 0x61, 0xa5, 0x51, 0x52, - 0x8a, 0x62, 0x5d, 0x69, 0xe6, 0xc4, 0x6a, 0x81, 0xcb, 0x87, 0xc7, 0xc0, 0x82, 0xda, 0xed, 0x0e, - 0x68, 0x0d, 0xcd, 0x3a, 0x26, 0xa7, 0x56, 0x8e, 0x74, 0x8e, 0xe0, 0xb9, 0xdf, 0xff, 0x4c, 0x4f, - 0xe4, 0x9e, 0xfc, 0xf5, 0x3e, 0x3d, 0xf9, 0xee, 0x7d, 0x7a, 0xf2, 0xdf, 0xf7, 0xe9, 0xc9, 0x3f, - 0x3e, 0xa4, 0x27, 0xde, 0x7d, 0x48, 0x4f, 0xfc, 0xf3, 0x21, 0x3d, 0x71, 0xb0, 0xd4, 0xd2, 0xac, - 0xe3, 0xd3, 0x17, 0x99, 0x43, 0x72, 0x92, 0xdd, 0xd3, 0x0c, 0x35, 0x4f, 0x0c, 0x9c, 0x35, 0x71, - 0x5b, 0xd5, 0xb2, 0x6f, 0xbc, 0x4f, 0xf8, 0xd6, 0xdb, 0x2e, 0x36, 0x5f, 0x9c, 0xf7, 0x3e, 0xcf, - 0x6f, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0x16, 0xe0, 0x0d, 0x6b, 0xdb, 0x17, 0x00, 0x00, + // 1692 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x99, 0xdb, 0x76, 0xd3, 0x46, + 0x17, 0xc7, 0x93, 0xef, 0xa3, 0x14, 0xa6, 0x14, 0x5c, 0x43, 0x43, 0x18, 0x88, 0x33, 0x39, 0x9f, + 0xc0, 0x86, 0x04, 0xd2, 0x52, 0x5a, 0xa8, 0x6c, 0x8f, 0x63, 0x13, 0xdb, 0xf2, 0x92, 0xe4, 0x18, + 0xd2, 0xb2, 0x5c, 0xe1, 0x0c, 0x8e, 0x6a, 0xc5, 0x72, 0x25, 0x85, 0x43, 0x1f, 0xa0, 0xab, 0x4b, + 0x57, 0x7d, 0x01, 0x5d, 0xf5, 0x65, 0x7a, 0xc9, 0x65, 0x2f, 0xbb, 0xe0, 0x45, 0xba, 0x24, 0xdb, + 0x1a, 0x8d, 0x2c, 0xd9, 0x4a, 0xaf, 0x38, 0xd8, 0xf3, 0xfb, 0xef, 0xbd, 0x67, 0xef, 0x99, 0xbd, + 0xc7, 0xe0, 0x46, 0x47, 0xd1, 0xe5, 0x4c, 0x5b, 0x7b, 0x9d, 0xe9, 0x11, 0xfd, 0x44, 0x31, 0x0c, + 0x45, 0xeb, 0xa6, 0x7b, 0xba, 0x66, 0x6a, 0xc9, 0x0b, 0xce, 0x47, 0xe9, 0xb6, 0xf6, 0x1a, 0x5e, + 0x6b, 0x6b, 0x6d, 0xcd, 0xfd, 0xcf, 0x8c, 0xf3, 0xb7, 0xfe, 0xe7, 0x9b, 0xbf, 0xdd, 0x05, 0x17, + 0x6b, 0x44, 0x3f, 0x39, 0x90, 0xd5, 0x53, 0x92, 0x5c, 0x00, 0x57, 0x6a, 0x58, 0xa8, 0x94, 0x44, + 0xb1, 0xc4, 0x57, 0x9b, 0x87, 0x58, 0xe0, 0x13, 0x53, 0xf0, 0x92, 0x65, 0xa3, 0x0b, 0xce, 0x77, + 0x0e, 0x89, 0xae, 0x25, 0x77, 0x01, 0xf4, 0x7d, 0x45, 0xc4, 0x52, 0x93, 0xfe, 0x53, 0x4c, 0x4c, + 0xc3, 0x19, 0xcb, 0x46, 0x49, 0xe7, 0xdb, 0x22, 0x31, 0x6b, 0x9e, 0x35, 0x46, 0x60, 0x5d, 0xae, + 0xcc, 0x95, 0x2a, 0xcd, 0x03, 0xae, 0x5c, 0xca, 0x73, 0x12, 0x2f, 0x24, 0xfe, 0x47, 0xd7, 0xe5, + 0x54, 0x59, 0x71, 0xcc, 0x51, 0x8e, 0x64, 0x53, 0xd3, 0x43, 0xd7, 0xe5, 0xf8, 0x7a, 0x35, 0x57, + 0x2a, 0xf3, 0x42, 0xe2, 0xff, 0x81, 0x75, 0x39, 0xed, 0xb4, 0xdb, 0x52, 0x54, 0x4d, 0x4f, 0xfe, + 0x04, 0xee, 0xfa, 0xd6, 0x35, 0x8a, 0x25, 0x09, 0x97, 0x4b, 0xa2, 0xd4, 0xe4, 0x72, 0xce, 0x6a, + 0xbf, 0xd5, 0xcd, 0x9a, 0xc0, 0xd7, 0x78, 0x91, 0x2b, 0x27, 0xce, 0xc1, 0x4d, 0xcb, 0x46, 0xab, + 0x0e, 0xad, 0x71, 0xac, 0x98, 0x44, 0x55, 0x0c, 0x93, 0x6b, 0xb5, 0xb4, 0xd3, 0xae, 0xcf, 0x95, + 0x9a, 0xae, 0xf5, 0x34, 0x43, 0x56, 0x93, 0x0a, 0x78, 0xe0, 0x83, 0x1c, 0xf0, 0x12, 0x8e, 0x29, + 0xf3, 0x09, 0x4c, 0x5b, 0x36, 0xda, 0x74, 0xc3, 0xae, 0x99, 0x24, 0x86, 0xd4, 0x23, 0x30, 0xe7, + 0x03, 0xd5, 0x6b, 0x22, 0x16, 0xa4, 0xa6, 0xc4, 0xef, 0xe3, 0x6a, 0x93, 0x2b, 0x97, 0x38, 0x31, + 0x71, 0x1e, 0xce, 0x5a, 0x36, 0xba, 0xe6, 0x2c, 0xad, 0xf7, 0x0c, 0xa2, 0x9b, 0x92, 0xd6, 0x21, + 0x5d, 0x4e, 0x55, 0x64, 0x23, 0x79, 0x0f, 0xcc, 0xfa, 0x23, 0x58, 0xe4, 0xaa, 0x7b, 0xb8, 0x29, + 0x3d, 0x6b, 0x16, 0x30, 0x4e, 0x7c, 0x0a, 0xaf, 0x5a, 0x36, 0xba, 0xe2, 0xc6, 0xef, 0x58, 0xee, + 0xb6, 0x89, 0xf4, 0xb6, 0x40, 0x48, 0xf2, 0x21, 0xb8, 0x15, 0xa5, 0x27, 0x70, 0x12, 0x4e, 0x5c, + 0x80, 0xd7, 0x2d, 0x1b, 0x5d, 0x0d, 0xc8, 0x09, 0xb2, 0x49, 0x92, 0x69, 0x30, 0x33, 0xba, 0x54, + 0xe0, 0xcb, 0x38, 0x71, 0x11, 0x26, 0x2d, 0x1b, 0x5d, 0xa6, 0x8b, 0x04, 0x4d, 0x25, 0xc9, 0x17, + 0x20, 0xe3, 0xb7, 0x4e, 0xc0, 0x9c, 0x84, 0x87, 0xcb, 0xf2, 0x9c, 0xc4, 0x35, 0x05, 0xbc, 0x57, + 0x12, 0x25, 0xe1, 0x39, 0x8d, 0x1f, 0x80, 0xeb, 0x96, 0x8d, 0x96, 0x5d, 0xa3, 0x75, 0x22, 0x9b, + 0xa4, 0x8f, 0xcb, 0xcb, 0xa6, 0x2c, 0x90, 0xb6, 0x62, 0x98, 0xfa, 0x3b, 0x2f, 0x72, 0xcf, 0xc1, + 0x9d, 0xe0, 0x26, 0x8d, 0x87, 0x7f, 0x06, 0x57, 0x2d, 0x1b, 0x2d, 0x0e, 0x37, 0x67, 0x0c, 0x3a, + 0xd4, 0x72, 0xa7, 0x20, 0xaa, 0x58, 0x6a, 0xf0, 0xc2, 0xbe, 0xcb, 0xc4, 0x82, 0xe4, 0x83, 0x5f, + 0x0a, 0x5a, 0x2e, 0x12, 0xb3, 0x4a, 0xcc, 0x37, 0x9a, 0xde, 0x71, 0xb0, 0x44, 0x37, 0xc7, 0x5a, + 0x3e, 0x1e, 0xfe, 0x39, 0x6b, 0x79, 0x6c, 0x34, 0x1b, 0x73, 0x5f, 0x56, 0x51, 0xf4, 0x65, 0x8a, + 0xf6, 0x47, 0x9c, 0x26, 0x99, 0x87, 0xae, 0x83, 0xad, 0x88, 0x78, 0x87, 0x82, 0xaf, 0xc0, 0x65, + 0xcb, 0x46, 0x88, 0x8d, 0x76, 0x08, 0xf6, 0x05, 0x83, 0xf5, 0xc5, 0xba, 0xc6, 0xf3, 0x82, 0x17, + 0x93, 0x0a, 0x16, 0x45, 0x6e, 0x0f, 0x8b, 0x89, 0x04, 0xbc, 0x6d, 0xd9, 0x68, 0x9d, 0x89, 0x73, + 0x4d, 0xd3, 0xf4, 0x41, 0x40, 0x2a, 0xc4, 0x30, 0xe4, 0x36, 0xa1, 0xf8, 0x97, 0x60, 0x3b, 0x2c, + 0xd6, 0xa1, 0x70, 0x6a, 0xfc, 0x17, 0xf4, 0xb8, 0x18, 0x04, 0x7c, 0x9c, 0x46, 0x03, 0xdc, 0x9e, + 0x10, 0x74, 0xa7, 0xb4, 0x28, 0x3d, 0x09, 0x57, 0x2c, 0x1b, 0x2d, 0x84, 0xc6, 0xdc, 0xa9, 0x34, + 0x0f, 0x2c, 0x82, 0xcd, 0xb1, 0x21, 0x67, 0xb1, 0x57, 0xe1, 0x92, 0x65, 0xa3, 0xf9, 0x90, 0x88, + 0x33, 0xd0, 0x83, 0xb0, 0x80, 0xd7, 0xab, 0x4f, 0xb9, 0x52, 0x99, 0x1e, 0xdb, 0x94, 0x7a, 0x6d, + 0xc4, 0xd8, 0xee, 0xcf, 0xb2, 0xa2, 0x7a, 0xc7, 0xb8, 0xc7, 0x15, 0xc0, 0xc6, 0x88, 0xb1, 0x91, + 0xd4, 0x2f, 0x03, 0xb6, 0x46, 0x30, 0x0b, 0x60, 0x75, 0xd4, 0xd6, 0xc1, 0x1f, 0xce, 0xc9, 0x43, + 0x81, 0x33, 0x10, 0x5a, 0x36, 0x9a, 0xa1, 0x66, 0x3a, 0x47, 0x90, 0xc7, 0x29, 0x82, 0xe5, 0xa0, + 0x6d, 0xa1, 0x94, 0xeb, 0x30, 0x65, 0xd9, 0x08, 0x0e, 0xcd, 0x0a, 0x21, 0xbd, 0x02, 0xf7, 0x47, + 0x2d, 0x72, 0x77, 0x43, 0xec, 0xdf, 0x11, 0xcd, 0x6c, 0x99, 0xcb, 0xed, 0x0f, 0x0f, 0x63, 0x8f, + 0x3c, 0x1b, 0xcc, 0x5b, 0x77, 0x63, 0x0c, 0xf7, 0x86, 0xc8, 0xaa, 0x72, 0xab, 0xd3, 0x3f, 0xa4, + 0xc7, 0xe5, 0x6d, 0x0c, 0x95, 0x1b, 0x6c, 0xde, 0x4e, 0xd0, 0x38, 0x66, 0xae, 0xb9, 0x61, 0x40, + 0xb0, 0x53, 0x1f, 0x8d, 0xa2, 0x13, 0x17, 0xba, 0x71, 0x02, 0x57, 0xdd, 0xa7, 0x32, 0x10, 0xde, + 0xb1, 0x6c, 0xb4, 0xe1, 0x0b, 0x36, 0x31, 0x88, 0xd9, 0x38, 0xd6, 0x54, 0xe2, 0xed, 0xa1, 0x20, + 0x77, 0x3b, 0x9e, 0xd2, 0x11, 0xd8, 0x09, 0x7a, 0x13, 0x47, 0xe7, 0x26, 0xdc, 0xb2, 0x6c, 0xb4, + 0x36, 0x74, 0x67, 0x92, 0x4a, 0x68, 0x66, 0x8b, 0x7c, 0x41, 0x6a, 0x70, 0x82, 0x53, 0x39, 0x7b, + 0x02, 0x97, 0xf7, 0x05, 0xeb, 0x56, 0x30, 0xb3, 0x45, 0xed, 0x95, 0xf9, 0x46, 0xd6, 0x49, 0xbd, + 0xd7, 0xd6, 0xe5, 0x23, 0x1a, 0xa7, 0x0a, 0x93, 0x3d, 0xd1, 0xc0, 0x39, 0x36, 0xa9, 0xa3, 0x70, + 0x6c, 0xa1, 0x38, 0x51, 0x08, 0xf4, 0x4c, 0xbe, 0xd6, 0x22, 0x91, 0xa2, 0x4c, 0x91, 0x98, 0x6c, + 0x07, 0x45, 0xdb, 0x89, 0x64, 0x93, 0xe9, 0x89, 0xfc, 0xa7, 0xe8, 0xc0, 0xb8, 0x66, 0xbe, 0x2e, + 0x70, 0x12, 0xd3, 0xac, 0xcc, 0xc3, 0x0d, 0xcb, 0x46, 0x2b, 0xec, 0x51, 0x3a, 0x30, 0x32, 0x7f, + 0xaa, 0xcb, 0xa6, 0xbf, 0x4f, 0xf9, 0x01, 0xa4, 0x43, 0xcf, 0xd1, 0x68, 0x3c, 0x82, 0x6b, 0x96, + 0x8d, 0x96, 0xfc, 0x67, 0x68, 0x14, 0x9c, 0xed, 0xe8, 0xdc, 0xd4, 0x9e, 0xd8, 0x6a, 0x2d, 0xd0, + 0x54, 0x77, 0x73, 0xfb, 0xcc, 0x1d, 0x5d, 0x3c, 0x99, 0x45, 0xb6, 0xa3, 0x8b, 0x21, 0xf5, 0x0b, + 0x78, 0xe8, 0x03, 0x09, 0xb8, 0xc2, 0x1f, 0xf8, 0xda, 0x47, 0x9c, 0x1f, 0x2b, 0xb7, 0x04, 0xb7, + 0x2d, 0x1b, 0xa5, 0x1d, 0xac, 0x40, 0x4e, 0xb4, 0xd7, 0xb4, 0x85, 0x24, 0x47, 0xd1, 0x92, 0xbf, + 0x82, 0xc7, 0xa3, 0xe5, 0x75, 0x26, 0xdd, 0x65, 0xb8, 0x6b, 0xd9, 0x68, 0x9b, 0x56, 0x5a, 0x6c, + 0xed, 0x50, 0x77, 0xbd, 0xd8, 0x4e, 0x90, 0x5d, 0x09, 0xba, 0xeb, 0xc5, 0xf7, 0xbf, 0xb9, 0x1b, + 0x57, 0x77, 0x35, 0xcc, 0xdd, 0x58, 0xda, 0x87, 0x4c, 0x83, 0x45, 0xa7, 0x82, 0xfe, 0x3d, 0x12, + 0x22, 0xb5, 0x46, 0xcb, 0xc0, 0x8b, 0xa7, 0x7b, 0xa3, 0x8c, 0xb2, 0x5b, 0xa3, 0x67, 0x7e, 0x0c, + 0x81, 0x75, 0xf6, 0x90, 0x9c, 0x24, 0xc2, 0x3a, 0x40, 0x8b, 0x20, 0x92, 0xbf, 0x41, 0x1d, 0xf0, + 0x22, 0x14, 0xdf, 0x81, 0x18, 0x02, 0x9b, 0xac, 0x03, 0x93, 0x44, 0x3a, 0x60, 0x77, 0x7c, 0x7d, + 0x45, 0x0a, 0x6d, 0xc1, 0x8c, 0x65, 0xa3, 0xad, 0xd0, 0xe2, 0x8a, 0x10, 0x33, 0xc1, 0xa3, 0x18, + 0x95, 0x15, 0xa9, 0x78, 0x1b, 0xee, 0x58, 0x36, 0xca, 0x44, 0x96, 0xd5, 0x59, 0x5c, 0xf4, 0xe7, + 0x76, 0xa4, 0xe0, 0x9d, 0xa0, 0x8b, 0xbe, 0xa4, 0x3e, 0xb3, 0x8b, 0xb1, 0x14, 0xd3, 0x61, 0x2e, + 0x4e, 0x56, 0x65, 0x5b, 0x5b, 0x4e, 0x14, 0x4b, 0x7b, 0xd5, 0xbe, 0x88, 0xc4, 0xd3, 0xd2, 0x1d, + 0x8a, 0x64, 0xe8, 0x2d, 0xc8, 0x19, 0x86, 0xd2, 0xee, 0x3a, 0x54, 0x49, 0x1b, 0x96, 0xe9, 0x10, + 0xfa, 0x23, 0x33, 0xb7, 0xb9, 0xae, 0x4c, 0x22, 0xdf, 0x65, 0x6f, 0xa9, 0x71, 0x74, 0xf6, 0x0a, + 0xac, 0x57, 0xfd, 0xe8, 0x82, 0xc0, 0x57, 0x46, 0xe1, 0xf7, 0x28, 0xbc, 0xde, 0x95, 0x3d, 0x74, + 0x41, 0xd7, 0x4e, 0x82, 0xf0, 0x90, 0x0e, 0x29, 0x8e, 0xc2, 0x36, 0x5b, 0x3b, 0x93, 0x54, 0x42, + 0xfb, 0xe9, 0xc1, 0x6e, 0xb3, 0x9d, 0xf0, 0x0e, 0xed, 0xa7, 0xfb, 0x5b, 0x3a, 0xa9, 0x9f, 0x0e, + 0xa5, 0xdc, 0x67, 0xfb, 0xe9, 0x10, 0xd2, 0x53, 0xb0, 0x12, 0x39, 0x3b, 0xd5, 0xb3, 0x25, 0x8a, + 0x7a, 0x00, 0xe7, 0x2d, 0x1b, 0xdd, 0x0c, 0x0e, 0x4d, 0xf5, 0x6c, 0xc9, 0xe7, 0xdd, 0x52, 0xc4, + 0xb8, 0xc4, 0x90, 0x76, 0xe1, 0x9c, 0x65, 0xa3, 0x1b, 0xec, 0x9c, 0xe4, 0xe7, 0x84, 0xda, 0x34, + 0xf0, 0x8f, 0x21, 0x7d, 0x15, 0xb4, 0xa9, 0xef, 0xe0, 0x04, 0x9b, 0xc2, 0x48, 0x5f, 0xb3, 0x36, + 0x8d, 0x72, 0x24, 0xa6, 0x5e, 0x86, 0x0d, 0x5e, 0x99, 0x13, 0x8b, 0x61, 0xe3, 0xd5, 0x43, 0x3a, + 0x7c, 0x0f, 0x5a, 0x3b, 0x55, 0x36, 0x8e, 0x47, 0xe7, 0xab, 0x1a, 0x58, 0x1f, 0xe9, 0xea, 0xa2, + 0x98, 0xdf, 0xc0, 0x45, 0xcb, 0x46, 0x29, 0xaf, 0x9f, 0x0b, 0x27, 0xe6, 0xc0, 0xc2, 0xa8, 0x9d, + 0x59, 0x4e, 0xdc, 0xf7, 0x35, 0x8b, 0x89, 0x47, 0xf0, 0x96, 0x65, 0xa3, 0x59, 0x6a, 0x5e, 0x56, + 0x36, 0x3a, 0xb4, 0x3f, 0x4c, 0x3e, 0x01, 0xf3, 0x23, 0xf7, 0x48, 0x00, 0xf1, 0x2d, 0xcd, 0x4f, + 0xf7, 0xd2, 0x60, 0x01, 0x18, 0x2c, 0xfa, 0x00, 0x45, 0xae, 0x9a, 0x2f, 0x7b, 0x08, 0x5c, 0xc1, + 0xc2, 0x1e, 0xae, 0xe6, 0x9e, 0x27, 0xbe, 0xa3, 0x41, 0x2f, 0xca, 0xdd, 0x23, 0x75, 0x40, 0xc1, + 0x27, 0x44, 0x6f, 0x93, 0x6e, 0xeb, 0xdd, 0xe4, 0x01, 0xc9, 0x7b, 0xae, 0x0c, 0x0c, 0x2e, 0x8f, + 0xa3, 0x07, 0x24, 0xef, 0x1d, 0xf3, 0x2c, 0x03, 0x52, 0x94, 0xce, 0x93, 0xa8, 0x01, 0x29, 0x5c, + 0x85, 0x9d, 0x3c, 0x06, 0xfe, 0xb8, 0x23, 0x3a, 0x15, 0xf0, 0xd8, 0xdf, 0xd3, 0x33, 0xb7, 0xef, + 0xc3, 0x53, 0x59, 0x51, 0x3d, 0xae, 0xc7, 0xac, 0x82, 0xb5, 0xa0, 0xe5, 0x51, 0x44, 0x0e, 0x2e, + 0x58, 0x36, 0x9a, 0x1b, 0x5a, 0x1b, 0xce, 0x63, 0xf7, 0x7e, 0x60, 0x63, 0x8d, 0x2f, 0x97, 0x29, + 0x27, 0x1b, 0x9c, 0xf5, 0x6b, 0x9a, 0xaa, 0x8e, 0x7f, 0x8d, 0xc9, 0x73, 0xb5, 0x1a, 0x1d, 0x56, + 0x1a, 0x25, 0xa9, 0xc8, 0xd7, 0xa5, 0x66, 0x96, 0xaf, 0xe6, 0x13, 0xb9, 0xe0, 0x18, 0x98, 0x97, + 0x7b, 0xbd, 0x21, 0xad, 0xa1, 0x98, 0xc7, 0xda, 0xa9, 0x99, 0xd5, 0xba, 0x47, 0xe1, 0x6f, 0x6b, + 0xce, 0x1e, 0xe1, 0x67, 0x38, 0x57, 0x77, 0x87, 0x9f, 0x02, 0xf6, 0xbf, 0x22, 0xe5, 0x83, 0x6f, + 0x6b, 0x22, 0x31, 0xf1, 0x5b, 0xd2, 0x3a, 0x75, 0x86, 0x9f, 0x02, 0x21, 0x63, 0xdf, 0xd6, 0xc6, + 0x81, 0x31, 0xfb, 0xb6, 0x16, 0x85, 0x85, 0xe7, 0x7e, 0xff, 0x33, 0x35, 0x95, 0x7d, 0xf2, 0xd7, + 0x87, 0xd4, 0xf4, 0xfb, 0x0f, 0xa9, 0xe9, 0x7f, 0x3e, 0xa4, 0xa6, 0xff, 0xf8, 0x98, 0x9a, 0x7a, + 0xff, 0x31, 0x35, 0xf5, 0xf7, 0xc7, 0xd4, 0xd4, 0xe1, 0x4a, 0x5b, 0x31, 0x8f, 0x4f, 0x5f, 0xa6, + 0x5b, 0xda, 0x49, 0x66, 0x5f, 0xd1, 0xe5, 0x9c, 0xa6, 0x93, 0x8c, 0x41, 0x3a, 0xb2, 0x92, 0x79, + 0xeb, 0xfe, 0xe8, 0x60, 0xbe, 0xeb, 0x11, 0xe3, 0xe5, 0x79, 0xf7, 0x07, 0x85, 0x9d, 0x7f, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x97, 0x58, 0x79, 0x11, 0x8d, 0x18, 0x00, 0x00, } diff --git a/x/gov/types/proposal.go b/x/gov/types/proposal.go index a25ddacc..1fa0af89 100644 --- a/x/gov/types/proposal.go +++ b/x/gov/types/proposal.go @@ -644,3 +644,28 @@ func (m *ProposalJailCouncilor) VotePermission() PermValue { func (m *ProposalJailCouncilor) ValidateBasic() error { return nil } + +func NewSetExecutionFeesProposal(proposer sdk.AccAddress, description string, executionFees []ExecutionFee) *ProposalSetExecutionFees { + return &ProposalSetExecutionFees{ + Proposer: proposer, + Description: description, + ExecutionFees: executionFees, + } +} + +func (m *ProposalSetExecutionFees) ProposalType() string { + return kiratypes.ProposalTypeSetExecutionFees +} + +func (m *ProposalSetExecutionFees) ProposalPermission() PermValue { + return PermCreateJailCouncilorProposal +} + +func (m *ProposalSetExecutionFees) VotePermission() PermValue { + return PermVoteJailCouncilorProposal +} + +// ValidateBasic returns basic validation +func (m *ProposalSetExecutionFees) ValidateBasic() error { + return nil +} diff --git a/x/gov/types/proposal.pb.go b/x/gov/types/proposal.pb.go index cfb1d457..f259c38b 100644 --- a/x/gov/types/proposal.pb.go +++ b/x/gov/types/proposal.pb.go @@ -1263,6 +1263,66 @@ func (m *ProposalJailCouncilor) GetCouncilors() []string { return nil } +type ProposalSetExecutionFees struct { + Proposer github_com_cosmos_cosmos_sdk_types.AccAddress `protobuf:"bytes,1,opt,name=proposer,proto3,casttype=github.com/cosmos/cosmos-sdk/types.AccAddress" json:"proposer,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + ExecutionFees []ExecutionFee `protobuf:"bytes,3,rep,name=execution_fees,json=executionFees,proto3" json:"execution_fees"` +} + +func (m *ProposalSetExecutionFees) Reset() { *m = ProposalSetExecutionFees{} } +func (m *ProposalSetExecutionFees) String() string { return proto.CompactTextString(m) } +func (*ProposalSetExecutionFees) ProtoMessage() {} +func (*ProposalSetExecutionFees) Descriptor() ([]byte, []int) { + return fileDescriptor_e108f9b9b2d46b19, []int{21} +} +func (m *ProposalSetExecutionFees) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ProposalSetExecutionFees) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ProposalSetExecutionFees.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 *ProposalSetExecutionFees) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProposalSetExecutionFees.Merge(m, src) +} +func (m *ProposalSetExecutionFees) XXX_Size() int { + return m.Size() +} +func (m *ProposalSetExecutionFees) XXX_DiscardUnknown() { + xxx_messageInfo_ProposalSetExecutionFees.DiscardUnknown(m) +} + +var xxx_messageInfo_ProposalSetExecutionFees proto.InternalMessageInfo + +func (m *ProposalSetExecutionFees) GetProposer() github_com_cosmos_cosmos_sdk_types.AccAddress { + if m != nil { + return m.Proposer + } + return nil +} + +func (m *ProposalSetExecutionFees) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +func (m *ProposalSetExecutionFees) GetExecutionFees() []ExecutionFee { + if m != nil { + return m.ExecutionFees + } + return nil +} + func init() { proto.RegisterEnum("kira.gov.VoteOption", VoteOption_name, VoteOption_value) proto.RegisterEnum("kira.gov.VoteResult", VoteResult_name, VoteResult_value) @@ -1287,113 +1347,117 @@ func init() { proto.RegisterType((*SetProposalDurationsProposal)(nil), "kira.gov.SetProposalDurationsProposal") proto.RegisterType((*ProposalResetWholeCouncilorRank)(nil), "kira.gov.ProposalResetWholeCouncilorRank") proto.RegisterType((*ProposalJailCouncilor)(nil), "kira.gov.ProposalJailCouncilor") + proto.RegisterType((*ProposalSetExecutionFees)(nil), "kira.gov.ProposalSetExecutionFees") } func init() { proto.RegisterFile("kira/gov/proposal.proto", fileDescriptor_e108f9b9b2d46b19) } var fileDescriptor_e108f9b9b2d46b19 = []byte{ - // 1612 bytes of a gzipped FileDescriptorProto + // 1662 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xd7, 0x8a, 0xd4, 0x07, 0x1f, 0x6d, 0x69, 0x33, 0x56, 0x6c, 0x7a, 0x93, 0x92, 0x1b, 0xa2, - 0x49, 0x14, 0xc3, 0xa6, 0x50, 0xe5, 0x52, 0xb8, 0x29, 0x5a, 0x7e, 0xac, 0x63, 0x26, 0x16, 0xc9, - 0x2c, 0x29, 0xa9, 0x69, 0x51, 0x2c, 0x56, 0xbb, 0x23, 0x72, 0xca, 0xdd, 0x1d, 0x62, 0x67, 0x28, - 0x9b, 0x3d, 0xf5, 0xd6, 0x80, 0x27, 0xa3, 0x77, 0x02, 0x29, 0x7a, 0xe9, 0xa5, 0xe8, 0xa5, 0xe8, - 0xa1, 0x7f, 0x41, 0xda, 0x53, 0x7a, 0x2b, 0x7a, 0x50, 0x0b, 0xbb, 0x28, 0x7a, 0x2b, 0x90, 0x63, - 0x4f, 0xc5, 0xee, 0xec, 0x2e, 0x57, 0xa2, 0xdc, 0xa8, 0x45, 0x90, 0xc6, 0x3e, 0x69, 0xe7, 0x7d, - 0xfc, 0xde, 0xef, 0xcd, 0xbc, 0x37, 0x7a, 0x43, 0xb8, 0x31, 0x24, 0xbe, 0xb9, 0xd3, 0xa7, 0x27, - 0x3b, 0x23, 0x9f, 0x8e, 0x28, 0x33, 0x9d, 0xca, 0xc8, 0xa7, 0x9c, 0xa2, 0xf5, 0x40, 0x51, 0xe9, - 0xd3, 0x13, 0x65, 0xab, 0x4f, 0xfb, 0x34, 0x14, 0xee, 0x04, 0x5f, 0x42, 0xaf, 0x94, 0xfa, 0x94, - 0xf6, 0x1d, 0xbc, 0x13, 0xae, 0x8e, 0xc6, 0xc7, 0x3b, 0x9c, 0xb8, 0x98, 0x71, 0xd3, 0x1d, 0x45, - 0x06, 0x37, 0xcf, 0x1b, 0x98, 0xde, 0x24, 0x56, 0x59, 0x94, 0xb9, 0x94, 0x19, 0x02, 0x54, 0x2c, - 0x22, 0xd5, 0xb5, 0x84, 0x8f, 0x4f, 0x1d, 0x1c, 0xdb, 0xcf, 0x49, 0x62, 0xdf, 0x25, 0x8c, 0x11, - 0xea, 0x45, 0xaa, 0xd7, 0x12, 0x95, 0x87, 0xf9, 0x43, 0xea, 0x0f, 0x03, 0xd0, 0x11, 0xf6, 0x39, - 0xc1, 0x11, 0x64, 0xf9, 0x6f, 0x12, 0x64, 0x0f, 0x28, 0xc7, 0xa8, 0x04, 0xf9, 0x38, 0x49, 0x83, - 0xd8, 0x05, 0x49, 0x95, 0xb6, 0xb3, 0x3a, 0xc4, 0xa2, 0xa6, 0x8d, 0xde, 0x85, 0x95, 0x13, 0xca, - 0xb1, 0x5f, 0x58, 0x56, 0xa5, 0xed, 0x2b, 0xb5, 0x6f, 0xfc, 0xeb, 0xb4, 0x74, 0xa7, 0x4f, 0xf8, - 0x60, 0x7c, 0x54, 0xb1, 0xa8, 0x1b, 0x11, 0x8d, 0xfe, 0xdc, 0x61, 0xf6, 0x70, 0x87, 0x4f, 0x46, - 0x98, 0x55, 0xaa, 0x96, 0x55, 0xb5, 0x6d, 0x1f, 0x33, 0xa6, 0x0b, 0x7f, 0x74, 0x1b, 0x56, 0xe9, - 0x88, 0x13, 0xea, 0x15, 0x32, 0xaa, 0xb4, 0xbd, 0xb1, 0xbb, 0x55, 0x89, 0x77, 0xb3, 0x12, 0x30, - 0x69, 0x87, 0x3a, 0x3d, 0xb2, 0x41, 0x0d, 0x58, 0x61, 0x8e, 0xc9, 0x06, 0x85, 0xac, 0x2a, 0x6d, - 0xe7, 0x6a, 0x95, 0x4f, 0x4e, 0x4b, 0x4b, 0x7f, 0x3e, 0x2d, 0xbd, 0x71, 0x89, 0xd0, 0x0d, 0x6c, - 0xe9, 0xc2, 0xb9, 0xfc, 0x4f, 0x09, 0x36, 0xf7, 0x58, 0x3f, 0xc0, 0xef, 0x44, 0x29, 0xbd, 0xe0, - 0x19, 0xff, 0x6a, 0x05, 0xd6, 0x2f, 0x9f, 0xea, 0x16, 0xac, 0x70, 0xc2, 0x1d, 0x1c, 0xa6, 0x9a, - 0xd3, 0xc5, 0x02, 0xa9, 0x90, 0xb7, 0x31, 0xb3, 0x7c, 0x32, 0x27, 0x9f, 0xd3, 0xd3, 0x22, 0xf4, - 0x2d, 0x58, 0xb3, 0xa8, 0xc7, 0xb1, 0xc7, 0x43, 0xb6, 0xf9, 0xdd, 0xad, 0x8a, 0xa8, 0xec, 0x4a, - 0x5c, 0xd9, 0x95, 0xaa, 0x37, 0xa9, 0xe5, 0xff, 0xf0, 0x9b, 0x3b, 0x6b, 0x75, 0x61, 0xa8, 0xc7, - 0x1e, 0xe8, 0x07, 0x90, 0x67, 0xe3, 0x23, 0x97, 0x70, 0x23, 0x68, 0x8f, 0xc2, 0x4a, 0x08, 0xa0, - 0x2c, 0x00, 0xf4, 0xe2, 0xde, 0xa9, 0x15, 0x83, 0xad, 0xf8, 0xec, 0xb4, 0x84, 0x26, 0xa6, 0xeb, - 0xdc, 0x2d, 0xa7, 0x9c, 0xcb, 0x8f, 0xff, 0x52, 0x92, 0x74, 0x10, 0x92, 0xc0, 0x01, 0x1d, 0xc3, - 0xe6, 0x09, 0xe5, 0xc4, 0xeb, 0x1b, 0xd8, 0xb3, 0x45, 0x80, 0xd5, 0xcf, 0x0d, 0x50, 0x8e, 0x02, - 0x5c, 0x17, 0x01, 0xce, 0x01, 0x88, 0x20, 0x57, 0x85, 0x54, 0xf3, 0xec, 0x30, 0x0e, 0x05, 0x84, - 0x3d, 0xd3, 0xe2, 0x2e, 0xf6, 0xf8, 0x3c, 0xd4, 0xda, 0xe7, 0x86, 0x7a, 0x3d, 0x0a, 0x75, 0x53, - 0x84, 0x5a, 0xc4, 0x10, 0xd1, 0xe4, 0x44, 0x11, 0x07, 0x7c, 0x07, 0x5e, 0x71, 0x89, 0x67, 0xa4, - 0xb8, 0x1d, 0x39, 0xd4, 0x1a, 0x1a, 0x03, 0x4c, 0xfa, 0x03, 0x5e, 0x58, 0x57, 0xa5, 0xed, 0x8c, - 0x7e, 0xc3, 0x25, 0xde, 0x41, 0xcc, 0xb3, 0x16, 0xe8, 0xef, 0x87, 0x6a, 0x54, 0x83, 0x62, 0xe0, - 0x7d, 0x36, 0xdc, 0x19, 0x80, 0x5c, 0x08, 0xa0, 0xb8, 0xc4, 0xd3, 0x52, 0xa1, 0xd3, 0x18, 0xb7, - 0x61, 0xd5, 0xc7, 0x6c, 0xec, 0xf0, 0x02, 0x5c, 0x54, 0xce, 0x7a, 0xa8, 0xd3, 0x23, 0x9b, 0xa0, - 0xf6, 0xf0, 0x23, 0x6c, 0x19, 0x91, 0x4b, 0x3e, 0x2c, 0x22, 0x08, 0x44, 0xc2, 0xf0, 0x6e, 0xf6, - 0xa3, 0x8f, 0x4b, 0x4b, 0xe5, 0xdf, 0x4b, 0x50, 0x3e, 0x1c, 0x10, 0x8e, 0x1d, 0xc2, 0x78, 0xd5, - 0xb2, 0xe8, 0xd8, 0xe3, 0x9d, 0xe4, 0x42, 0x4b, 0x2a, 0xf9, 0x87, 0xb0, 0x66, 0x8a, 0xe6, 0x0a, - 0xab, 0xf8, 0x4a, 0xad, 0xfe, 0xd9, 0x69, 0x69, 0x43, 0xec, 0x61, 0xa4, 0x28, 0xff, 0xf7, 0x7d, - 0x1a, 0x63, 0xa2, 0xb7, 0x01, 0xe6, 0xb7, 0x68, 0xd8, 0x0c, 0x1b, 0xbb, 0xd7, 0xe6, 0xe9, 0x05, - 0x84, 0x0e, 0x4c, 0x67, 0x8c, 0xf5, 0x94, 0xd9, 0xdd, 0xcd, 0x7f, 0x7c, 0x5c, 0x92, 0x52, 0x15, - 0x1e, 0xe6, 0x52, 0x73, 0x4c, 0x6b, 0xf8, 0x02, 0xe4, 0xf2, 0x47, 0x09, 0x6e, 0xe9, 0xd8, 0xa5, - 0x27, 0x38, 0x39, 0x1d, 0x6c, 0xbf, 0x30, 0x39, 0x25, 0xa7, 0xf4, 0xdc, 0xe7, 0xf4, 0x5b, 0x09, - 0x5e, 0xa9, 0x32, 0x46, 0xfa, 0x9e, 0x4e, 0x1d, 0xdc, 0xa3, 0x71, 0x3a, 0x5f, 0x52, 0x12, 0x6f, - 0xc2, 0x66, 0x30, 0x93, 0x18, 0xc4, 0xc6, 0x1e, 0x27, 0xc7, 0x24, 0xfa, 0xaf, 0x99, 0xd3, 0x37, - 0x02, 0x71, 0x33, 0x91, 0x2e, 0x12, 0xff, 0x9d, 0x04, 0xa5, 0x7d, 0xcf, 0x4c, 0xa8, 0xdf, 0xf3, - 0xa9, 0xfb, 0xdc, 0x90, 0x7f, 0x2c, 0x41, 0x29, 0xe9, 0x8b, 0x80, 0xfd, 0x05, 0xe5, 0x73, 0x01, - 0xba, 0x74, 0x11, 0xfa, 0x17, 0x54, 0x08, 0x01, 0xa5, 0xa4, 0xac, 0xbf, 0x1a, 0x94, 0xa6, 0x12, - 0xbc, 0xb9, 0x70, 0x87, 0x3c, 0x83, 0xda, 0x4d, 0x58, 0x0f, 0xa9, 0xb1, 0x68, 0x4e, 0xc9, 0xe9, - 0x6b, 0xc1, 0xba, 0x4b, 0xec, 0x2f, 0x9c, 0x4c, 0xaa, 0xf9, 0xff, 0x5f, 0x64, 0x7e, 0x2d, 0x81, - 0xd2, 0xc5, 0xbc, 0x25, 0xc6, 0xf3, 0x8e, 0x98, 0xce, 0x27, 0x49, 0xfc, 0x06, 0xc8, 0xe7, 0x26, - 0xf7, 0x49, 0xc8, 0x63, 0x63, 0xf7, 0xe6, 0x3c, 0xd4, 0x39, 0x67, 0x7d, 0xd3, 0x3b, 0x2b, 0x40, - 0x77, 0x61, 0xe5, 0x24, 0xa0, 0x12, 0xb2, 0xcc, 0xef, 0x16, 0x9f, 0xe9, 0x1a, 0x12, 0xae, 0x65, - 0x83, 0xc9, 0x44, 0x17, 0x2e, 0x8b, 0x8c, 0x7f, 0x2e, 0x81, 0xb2, 0x3f, 0x62, 0xd8, 0xe7, 0x0d, - 0x93, 0x9b, 0x3a, 0xee, 0x13, 0xc6, 0xfd, 0x39, 0x63, 0x19, 0x32, 0x43, 0x3c, 0x89, 0x36, 0x2b, - 0xf8, 0x44, 0x08, 0xb2, 0x83, 0x60, 0x9a, 0x15, 0x1d, 0x15, 0x7e, 0xa3, 0x57, 0x21, 0xe7, 0xe3, - 0x63, 0xec, 0x63, 0xcf, 0xc2, 0xd1, 0x58, 0x39, 0x17, 0x20, 0x05, 0xd6, 0xb1, 0x67, 0x51, 0x9b, - 0x78, 0x7d, 0x31, 0x03, 0xeb, 0xc9, 0x3a, 0x40, 0x63, 0xe4, 0xc7, 0x62, 0x58, 0xcc, 0xea, 0xe1, - 0xf7, 0x22, 0xc7, 0x77, 0xa0, 0xd8, 0xc5, 0xbc, 0x43, 0xa9, 0x1f, 0x25, 0xb8, 0x87, 0x19, 0x33, - 0xfb, 0x98, 0x25, 0x34, 0x15, 0x58, 0x77, 0x23, 0x59, 0x41, 0x52, 0x33, 0x41, 0x88, 0x78, 0x5d, - 0xfe, 0xe9, 0x32, 0xa0, 0xba, 0x8f, 0x4d, 0x8e, 0xc3, 0xaa, 0xb8, 0x44, 0x2d, 0xbc, 0x05, 0x72, - 0xa8, 0x4a, 0x0f, 0xcb, 0x22, 0xdd, 0xb0, 0xcd, 0x1a, 0xa9, 0x81, 0xf9, 0x01, 0xdc, 0x78, 0x38, - 0xef, 0x01, 0x63, 0x5e, 0x1b, 0xac, 0x90, 0x51, 0x33, 0xcf, 0xaa, 0xa1, 0xeb, 0x29, 0x9f, 0x79, - 0x99, 0xb2, 0x00, 0xed, 0x68, 0x5e, 0xc4, 0x67, 0xd0, 0xb2, 0xff, 0x01, 0x2d, 0xe5, 0x93, 0x42, - 0x5b, 0xdc, 0xc7, 0xef, 0x02, 0x12, 0x9d, 0x72, 0xc9, 0x8d, 0x58, 0x44, 0x78, 0x04, 0xaf, 0x06, - 0x27, 0x11, 0xb9, 0x36, 0xc6, 0xbe, 0x19, 0xec, 0xc2, 0xfc, 0x1c, 0xde, 0x02, 0x39, 0xb8, 0x96, - 0xe9, 0xb1, 0x11, 0x3f, 0x46, 0xe2, 0xf3, 0xd8, 0x14, 0xf2, 0xd8, 0x92, 0xa1, 0x3b, 0x80, 0x92, - 0x37, 0x8c, 0x1d, 0x03, 0x15, 0x96, 0xd5, 0xcc, 0x76, 0x56, 0x7f, 0x69, 0x74, 0x3e, 0x42, 0xf9, - 0x67, 0x12, 0x94, 0x62, 0x67, 0x1d, 0x33, 0xcc, 0x0f, 0x07, 0xd4, 0xc1, 0x75, 0x3a, 0xf6, 0x2c, - 0xe2, 0x50, 0x5f, 0x37, 0xbd, 0x21, 0xda, 0x83, 0x75, 0xe1, 0x18, 0xdd, 0x7f, 0xff, 0xd3, 0x1b, - 0x2f, 0x81, 0x38, 0xff, 0x5c, 0x5a, 0x5e, 0x78, 0x2e, 0x95, 0x7f, 0x29, 0xc1, 0xcb, 0x31, 0xa9, - 0xf7, 0x4c, 0xe2, 0x24, 0x74, 0xbe, 0x74, 0x2a, 0xa8, 0x08, 0x60, 0xc5, 0xd1, 0x45, 0xed, 0xe5, - 0xf4, 0x94, 0xe4, 0xd6, 0xdf, 0x25, 0x80, 0xf9, 0xe3, 0x14, 0xdd, 0x86, 0x1b, 0x07, 0xed, 0x9e, - 0x66, 0xb4, 0x3b, 0xbd, 0x66, 0xbb, 0x65, 0xec, 0xb7, 0xba, 0x1d, 0xad, 0xde, 0xbc, 0xd7, 0xd4, - 0x1a, 0xf2, 0x92, 0xb2, 0x39, 0x9d, 0xa9, 0x79, 0x61, 0xa8, 0xb9, 0x23, 0x3e, 0x41, 0x65, 0xd8, - 0x4c, 0x5b, 0x7f, 0xa8, 0x75, 0x65, 0x49, 0xb9, 0x3a, 0x9d, 0xa9, 0x39, 0x61, 0xf5, 0x21, 0x66, - 0xe8, 0x16, 0x5c, 0x4b, 0xdb, 0x54, 0x6b, 0xdd, 0x5e, 0xb5, 0xd9, 0x92, 0x97, 0x95, 0x97, 0xa6, - 0x33, 0xf5, 0xaa, 0xb0, 0xab, 0x1e, 0x31, 0x6e, 0x12, 0x0f, 0xa9, 0xb0, 0x91, 0xb6, 0x6d, 0xb5, - 0xe5, 0x8c, 0x72, 0x65, 0x3a, 0x53, 0xd7, 0x85, 0x59, 0x8b, 0xa2, 0x5d, 0x28, 0x9c, 0xb5, 0x30, - 0x0e, 0x9b, 0xbd, 0xfb, 0xc6, 0x81, 0xd6, 0x6b, 0xcb, 0x59, 0x65, 0x6b, 0x3a, 0x53, 0xe5, 0xd8, - 0xf6, 0x90, 0xf0, 0xc1, 0x01, 0xe6, 0x54, 0xc9, 0x7e, 0xf4, 0x8b, 0xe2, 0xd2, 0xad, 0x9f, 0x64, - 0x44, 0xa2, 0xe2, 0x35, 0x82, 0xbe, 0x1e, 0xd1, 0xd2, 0xb5, 0xee, 0xfe, 0x83, 0x9e, 0xb1, 0xdf, - 0x7a, 0xbf, 0xd5, 0x3e, 0x6c, 0xc9, 0x4b, 0x4a, 0x7e, 0x3a, 0x53, 0xd7, 0xf6, 0xbd, 0xa1, 0x47, - 0x1f, 0x7a, 0xa8, 0x0c, 0x28, 0x6d, 0xd5, 0xa9, 0x76, 0xbb, 0x5a, 0x43, 0x96, 0x14, 0x98, 0xce, - 0xd4, 0xd5, 0x8e, 0xc9, 0x18, 0xb6, 0xd1, 0x1b, 0xb0, 0x95, 0xb6, 0xd1, 0xb5, 0xf7, 0xb4, 0x7a, - 0x4f, 0x6b, 0xc8, 0xcb, 0x82, 0xba, 0x8e, 0x7f, 0x84, 0x2d, 0x8e, 0x6d, 0xf4, 0x4d, 0x28, 0x5e, - 0x64, 0x97, 0x4a, 0x20, 0x23, 0x12, 0x88, 0x3d, 0xe2, 0x04, 0xd0, 0xd7, 0xe0, 0x4a, 0xe8, 0xd9, - 0xd1, 0x5a, 0x8d, 0x66, 0xeb, 0x5d, 0x39, 0x2b, 0x48, 0x76, 0xb0, 0x17, 0xde, 0x95, 0xe7, 0x80, - 0x3f, 0xd8, 0x6f, 0xeb, 0xfb, 0x7b, 0x46, 0xab, 0x1d, 0xc4, 0xa8, 0xd6, 0xef, 0x6b, 0x0d, 0x79, - 0x45, 0x00, 0x7f, 0x30, 0xa6, 0xfe, 0xd8, 0x6d, 0x51, 0xae, 0x63, 0xd3, 0x1a, 0x60, 0x1b, 0x6d, - 0xc3, 0xcb, 0x69, 0x4f, 0xad, 0x55, 0xad, 0xf7, 0xf6, 0xb4, 0x56, 0x4f, 0x5e, 0x15, 0xa7, 0x98, - 0xbc, 0x0c, 0xd1, 0xb7, 0xe1, 0xb5, 0xc5, 0x8d, 0x10, 0xd4, 0xb5, 0xef, 0x69, 0x75, 0xe3, 0x5e, - 0xb5, 0xf9, 0x40, 0x5e, 0x53, 0xae, 0x4f, 0x67, 0x2a, 0x12, 0xfb, 0x12, 0xb0, 0xd7, 0x1e, 0x61, - 0xeb, 0x9e, 0x49, 0x1c, 0x71, 0x04, 0xb5, 0xef, 0x7c, 0xf2, 0xa4, 0x28, 0x7d, 0xfa, 0xa4, 0x28, - 0xfd, 0xf5, 0x49, 0x51, 0x7a, 0xfc, 0xb4, 0xb8, 0xf4, 0xe9, 0xd3, 0xe2, 0xd2, 0x9f, 0x9e, 0x16, - 0x97, 0xbe, 0xff, 0x7a, 0xaa, 0x01, 0xde, 0x27, 0xbe, 0x59, 0xa7, 0x3e, 0xde, 0x61, 0x78, 0x68, - 0x92, 0x9d, 0x47, 0xe1, 0x0f, 0x5b, 0x61, 0x0f, 0x1c, 0xad, 0x86, 0x0f, 0xec, 0xb7, 0xff, 0x1d, - 0x00, 0x00, 0xff, 0xff, 0x64, 0x74, 0xca, 0xd8, 0xb1, 0x13, 0x00, 0x00, + 0x15, 0xd7, 0x8a, 0xd4, 0x07, 0x1f, 0x6d, 0x69, 0x33, 0x56, 0x6c, 0x7a, 0xe3, 0x92, 0x1b, 0xa2, + 0x49, 0x14, 0xc3, 0xa6, 0x50, 0xe5, 0x52, 0xb8, 0x29, 0x5a, 0x7e, 0xac, 0x62, 0x26, 0x16, 0xc9, + 0x2c, 0x29, 0xa9, 0x69, 0x51, 0x2c, 0x56, 0xcb, 0x11, 0x39, 0x25, 0x77, 0x87, 0xd8, 0x19, 0xca, + 0x56, 0x4f, 0xbd, 0x35, 0xe0, 0xc9, 0xe8, 0x9d, 0x40, 0x8a, 0x5e, 0x7a, 0x29, 0x7a, 0x29, 0x7a, + 0xe8, 0x5f, 0x90, 0xf6, 0xe4, 0xde, 0x8a, 0x1e, 0xd4, 0xc2, 0x2e, 0x8a, 0xde, 0x0a, 0xe4, 0xd8, + 0x53, 0x31, 0x3b, 0xbb, 0xcb, 0x95, 0x28, 0x37, 0x6a, 0x11, 0xb8, 0x89, 0x4f, 0xe2, 0xbc, 0xaf, + 0xdf, 0xef, 0xcd, 0xbc, 0x37, 0x7a, 0xb3, 0x70, 0x63, 0x40, 0x7c, 0x7b, 0xab, 0x47, 0x8f, 0xb7, + 0x46, 0x3e, 0x1d, 0x51, 0x66, 0x0f, 0x4b, 0x23, 0x9f, 0x72, 0x8a, 0x56, 0x85, 0xa2, 0xd4, 0xa3, + 0xc7, 0xda, 0x46, 0x8f, 0xf6, 0x68, 0x20, 0xdc, 0x12, 0xbf, 0xa4, 0x5e, 0x2b, 0xf4, 0x28, 0xed, + 0x0d, 0xf1, 0x56, 0xb0, 0x3a, 0x1c, 0x1f, 0x6d, 0x71, 0xe2, 0x62, 0xc6, 0x6d, 0x77, 0x14, 0x1a, + 0xdc, 0x3c, 0x6f, 0x60, 0x7b, 0x27, 0x91, 0xca, 0xa1, 0xcc, 0xa5, 0xcc, 0x92, 0x41, 0xe5, 0x22, + 0x54, 0x5d, 0x8b, 0xf9, 0xf8, 0x74, 0x88, 0x23, 0xfb, 0x19, 0x49, 0xec, 0xbb, 0x84, 0x31, 0x42, + 0xbd, 0x50, 0x75, 0x2b, 0x56, 0xe1, 0x47, 0xd8, 0x19, 0x73, 0x42, 0x3d, 0xeb, 0x08, 0x47, 0x8e, + 0xaf, 0xc7, 0x5a, 0x0f, 0xf3, 0x87, 0xd4, 0x1f, 0x08, 0xc8, 0x11, 0xf6, 0x39, 0xc1, 0x21, 0x60, + 0xf1, 0x6f, 0x0a, 0xa4, 0xf7, 0x29, 0xc7, 0xa8, 0x00, 0xd9, 0x68, 0x0b, 0x2c, 0xd2, 0xcd, 0x29, + 0xba, 0xb2, 0x99, 0x36, 0x21, 0x12, 0xd5, 0xbb, 0xe8, 0x3d, 0x58, 0x3a, 0xa6, 0x1c, 0xfb, 0xb9, + 0x45, 0x5d, 0xd9, 0xbc, 0x52, 0xf9, 0xc6, 0xbf, 0x4e, 0x0b, 0x77, 0x7b, 0x84, 0xf7, 0xc7, 0x87, + 0x25, 0x87, 0xba, 0x61, 0x1a, 0xe1, 0x9f, 0xbb, 0xac, 0x3b, 0xd8, 0xe2, 0x27, 0x23, 0xcc, 0x4a, + 0x65, 0xc7, 0x29, 0x77, 0xbb, 0x3e, 0x66, 0xcc, 0x94, 0xfe, 0xe8, 0x0e, 0x2c, 0xd3, 0x91, 0x60, + 0x9a, 0x4b, 0xe9, 0xca, 0xe6, 0xda, 0xf6, 0x46, 0x29, 0xda, 0xeb, 0x92, 0x60, 0xd2, 0x0c, 0x74, + 0x66, 0x68, 0x83, 0x6a, 0xb0, 0xc4, 0x86, 0x36, 0xeb, 0xe7, 0xd2, 0xba, 0xb2, 0x99, 0xa9, 0x94, + 0x3e, 0x3d, 0x2d, 0x2c, 0xfc, 0xf9, 0xb4, 0xf0, 0xe6, 0x25, 0xa0, 0x6b, 0xd8, 0x31, 0xa5, 0x73, + 0xf1, 0x9f, 0x0a, 0xac, 0xef, 0xb2, 0x9e, 0x88, 0xdf, 0x0a, 0x53, 0x7a, 0xc9, 0x33, 0xfe, 0xd5, + 0x12, 0xac, 0x5e, 0x3e, 0xd5, 0x0d, 0x58, 0xe2, 0x84, 0x0f, 0x71, 0x90, 0x6a, 0xc6, 0x94, 0x0b, + 0xa4, 0x43, 0xb6, 0x8b, 0x99, 0xe3, 0x93, 0x19, 0xf9, 0x8c, 0x99, 0x14, 0xa1, 0x6f, 0xc1, 0x8a, + 0x43, 0x3d, 0x8e, 0x3d, 0x1e, 0xb0, 0xcd, 0x6e, 0x6f, 0x94, 0x64, 0xdd, 0x97, 0xa2, 0xba, 0x2f, + 0x95, 0xbd, 0x93, 0x4a, 0xf6, 0x0f, 0xbf, 0xb9, 0xbb, 0x52, 0x95, 0x86, 0x66, 0xe4, 0x81, 0x7e, + 0x00, 0x59, 0x36, 0x3e, 0x74, 0x09, 0xb7, 0x44, 0xf3, 0xe4, 0x96, 0x82, 0x00, 0xda, 0x5c, 0x80, + 0x4e, 0xd4, 0x59, 0x95, 0xbc, 0xd8, 0x8a, 0xcf, 0x4e, 0x0b, 0xe8, 0xc4, 0x76, 0x87, 0xf7, 0x8a, + 0x09, 0xe7, 0xe2, 0xe3, 0xbf, 0x14, 0x14, 0x13, 0xa4, 0x44, 0x38, 0xa0, 0x23, 0x58, 0x3f, 0xa6, + 0x9c, 0x78, 0x3d, 0x0b, 0x7b, 0x5d, 0x09, 0xb0, 0xfc, 0xb9, 0x00, 0xc5, 0x10, 0xe0, 0xba, 0x04, + 0x38, 0x17, 0x40, 0x82, 0x5c, 0x95, 0x52, 0xc3, 0xeb, 0x06, 0x38, 0x14, 0x10, 0xf6, 0x6c, 0x87, + 0xbb, 0xd8, 0xe3, 0x33, 0xa8, 0x95, 0xcf, 0x85, 0x7a, 0x23, 0x84, 0xba, 0x29, 0xa1, 0xe6, 0x63, + 0x48, 0x34, 0x35, 0x56, 0x44, 0x80, 0xef, 0xc2, 0x6b, 0x2e, 0xf1, 0xac, 0x04, 0xb7, 0xc3, 0x21, + 0x75, 0x06, 0x56, 0x1f, 0x93, 0x5e, 0x9f, 0xe7, 0x56, 0x75, 0x65, 0x33, 0x65, 0xde, 0x70, 0x89, + 0xb7, 0x1f, 0xf1, 0xac, 0x08, 0xfd, 0xfd, 0x40, 0x8d, 0x2a, 0x90, 0x17, 0xde, 0x67, 0xe1, 0xce, + 0x04, 0xc8, 0x04, 0x01, 0x34, 0x97, 0x78, 0x46, 0x02, 0x3a, 0x19, 0xe3, 0x0e, 0x2c, 0xfb, 0x98, + 0x8d, 0x87, 0x3c, 0x07, 0x17, 0x95, 0xb3, 0x19, 0xe8, 0xcc, 0xd0, 0x46, 0xd4, 0x9e, 0xb8, 0x9b, + 0xac, 0xd0, 0x25, 0x1b, 0x14, 0x11, 0x08, 0x91, 0x34, 0xbc, 0x97, 0xfe, 0xf8, 0x93, 0xc2, 0x42, + 0xf1, 0xf7, 0x0a, 0x14, 0x0f, 0xfa, 0x84, 0xe3, 0x21, 0x61, 0xbc, 0xec, 0x38, 0x74, 0xec, 0xf1, + 0x56, 0x7c, 0xdd, 0xc5, 0x95, 0xfc, 0x43, 0x58, 0xb1, 0x65, 0x73, 0x05, 0x55, 0x7c, 0xa5, 0x52, + 0xfd, 0xec, 0xb4, 0xb0, 0x26, 0xf7, 0x30, 0x54, 0x14, 0xff, 0xfb, 0x3e, 0x8d, 0x62, 0xa2, 0x77, + 0x00, 0x66, 0x77, 0x6c, 0xd0, 0x0c, 0x6b, 0xdb, 0xd7, 0x66, 0xe9, 0x09, 0x42, 0xfb, 0xf6, 0x70, + 0x8c, 0xcd, 0x84, 0xd9, 0xbd, 0xf5, 0x7f, 0x7c, 0x52, 0x50, 0x12, 0x15, 0x1e, 0xe4, 0x52, 0x19, + 0xda, 0xce, 0xe0, 0x25, 0xc8, 0xe5, 0x8f, 0x0a, 0xdc, 0x36, 0xb1, 0x4b, 0x8f, 0x71, 0x7c, 0x3a, + 0xb8, 0xfb, 0xd2, 0xe4, 0x14, 0x9f, 0xd2, 0x57, 0x3e, 0xa7, 0xdf, 0x2a, 0xf0, 0x5a, 0x99, 0x31, + 0xd2, 0xf3, 0x4c, 0x3a, 0xc4, 0x1d, 0x1a, 0xa5, 0xf3, 0x82, 0x92, 0x78, 0x0b, 0xd6, 0xc5, 0xc4, + 0x62, 0x91, 0x2e, 0xf6, 0x38, 0x39, 0x22, 0xe1, 0x7f, 0xcd, 0x8c, 0xb9, 0x26, 0xc4, 0xf5, 0x58, + 0x3a, 0x4f, 0xfc, 0x77, 0x0a, 0x14, 0xf6, 0x3c, 0x3b, 0xa6, 0xbe, 0xe3, 0x53, 0xf7, 0x2b, 0x43, + 0xfe, 0xb1, 0x02, 0x85, 0xb8, 0x2f, 0x04, 0xfb, 0x0b, 0xca, 0xe7, 0x82, 0xe8, 0xca, 0x45, 0xd1, + 0xbf, 0xa0, 0x42, 0x10, 0x94, 0xe2, 0xb2, 0xfe, 0x72, 0x50, 0x9a, 0x28, 0xf0, 0xd6, 0xdc, 0x1d, + 0xf2, 0x1c, 0x6a, 0x37, 0x61, 0x35, 0xa0, 0xc6, 0xc2, 0x39, 0x25, 0x63, 0xae, 0x88, 0x75, 0x9b, + 0x74, 0xbf, 0x70, 0x32, 0x89, 0xe6, 0xff, 0x7f, 0x91, 0xf9, 0xb5, 0x02, 0x5a, 0x1b, 0xf3, 0x86, + 0x1c, 0xcf, 0x5b, 0x72, 0x3a, 0x3f, 0x89, 0xf1, 0x6b, 0xa0, 0x9e, 0x9b, 0xdc, 0x4f, 0x02, 0x1e, + 0x6b, 0xdb, 0x37, 0x67, 0x50, 0xe7, 0x9c, 0xcd, 0x75, 0xef, 0xac, 0x00, 0xdd, 0x83, 0xa5, 0x63, + 0x41, 0x25, 0x60, 0x99, 0xdd, 0xce, 0x3f, 0xd7, 0x35, 0x20, 0x5c, 0x49, 0x8b, 0xc9, 0xc4, 0x94, + 0x2e, 0xf3, 0x8c, 0x7f, 0xae, 0x80, 0xb6, 0x37, 0x62, 0xd8, 0xe7, 0x35, 0x9b, 0xdb, 0x26, 0xee, + 0x11, 0xc6, 0xfd, 0x19, 0x63, 0x15, 0x52, 0x03, 0x7c, 0x12, 0x6e, 0x96, 0xf8, 0x89, 0x10, 0xa4, + 0xfb, 0x62, 0x9a, 0x95, 0x1d, 0x15, 0xfc, 0x46, 0xb7, 0x20, 0xe3, 0xe3, 0x23, 0xec, 0x63, 0xcf, + 0xc1, 0xe1, 0x58, 0x39, 0x13, 0x20, 0x0d, 0x56, 0xb1, 0xe7, 0xd0, 0x2e, 0xf1, 0x7a, 0x72, 0x06, + 0x36, 0xe3, 0xb5, 0x88, 0xc6, 0xc8, 0x8f, 0xe5, 0xb0, 0x98, 0x36, 0x83, 0xdf, 0xf3, 0x1c, 0xdf, + 0x85, 0x7c, 0x1b, 0xf3, 0x16, 0xa5, 0x7e, 0x98, 0xe0, 0x2e, 0x66, 0xcc, 0xee, 0x61, 0x16, 0xd3, + 0xd4, 0x60, 0xd5, 0x0d, 0x65, 0x39, 0x45, 0x4f, 0x09, 0x88, 0x68, 0x5d, 0xfc, 0xe9, 0x22, 0xa0, + 0xaa, 0x8f, 0x6d, 0x8e, 0x83, 0xaa, 0xb8, 0x44, 0x2d, 0xbc, 0x0d, 0x6a, 0xa0, 0x4a, 0x0e, 0xcb, + 0x32, 0xdd, 0xa0, 0xcd, 0x6a, 0x89, 0x81, 0xf9, 0x01, 0xdc, 0x78, 0x38, 0xeb, 0x01, 0x6b, 0x56, + 0x1b, 0x2c, 0x97, 0xd2, 0x53, 0xcf, 0xab, 0xa1, 0xeb, 0x09, 0x9f, 0x59, 0x99, 0x32, 0x11, 0xed, + 0x70, 0x56, 0xc4, 0x67, 0xa2, 0xa5, 0xff, 0x43, 0xb4, 0x84, 0x4f, 0x22, 0xda, 0xfc, 0x3e, 0x7e, + 0x17, 0x90, 0xec, 0x94, 0x4b, 0x6e, 0xc4, 0x7c, 0x84, 0x47, 0x70, 0x4b, 0x9c, 0x44, 0xe8, 0x5a, + 0x1b, 0xfb, 0xb6, 0xd8, 0x85, 0xd9, 0x39, 0xbc, 0x0d, 0xaa, 0xb8, 0x96, 0xe9, 0x91, 0x15, 0x3d, + 0x46, 0xa2, 0xf3, 0x58, 0x97, 0xf2, 0xc8, 0x92, 0xa1, 0xbb, 0x80, 0xe2, 0x37, 0x4c, 0x37, 0x0a, + 0x94, 0x5b, 0xd4, 0x53, 0x9b, 0x69, 0xf3, 0x95, 0xd1, 0x79, 0x84, 0xe2, 0xcf, 0x14, 0x28, 0x44, + 0xce, 0x26, 0x66, 0x98, 0x1f, 0xf4, 0xe9, 0x10, 0x57, 0xe9, 0xd8, 0x73, 0xc8, 0x90, 0xfa, 0xa6, + 0xed, 0x0d, 0xd0, 0x2e, 0xac, 0x4a, 0xc7, 0xf0, 0xfe, 0xfb, 0x9f, 0xde, 0x78, 0x71, 0x88, 0xf3, + 0xcf, 0xa5, 0xc5, 0xb9, 0xe7, 0x52, 0xf1, 0x97, 0x0a, 0xbc, 0x1a, 0x91, 0x7a, 0xdf, 0x26, 0xc3, + 0x98, 0xce, 0x0b, 0xa7, 0x82, 0xf2, 0x00, 0x4e, 0x84, 0x2e, 0x6b, 0x2f, 0x63, 0x26, 0x24, 0xc5, + 0x27, 0x0a, 0xe4, 0x22, 0xaa, 0x6d, 0xcc, 0x8d, 0xe8, 0xf3, 0xc2, 0x0e, 0xc6, 0xec, 0xc5, 0xb3, + 0xad, 0xc2, 0xda, 0x99, 0x0f, 0x1c, 0x92, 0x71, 0x76, 0xfb, 0xfa, 0xac, 0xbe, 0x93, 0x0c, 0xc3, + 0x3b, 0xec, 0x2a, 0x4e, 0xb2, 0xbe, 0xfd, 0x77, 0x05, 0x60, 0xf6, 0xde, 0x46, 0x77, 0xe0, 0xc6, + 0x7e, 0xb3, 0x63, 0x58, 0xcd, 0x56, 0xa7, 0xde, 0x6c, 0x58, 0x7b, 0x8d, 0x76, 0xcb, 0xa8, 0xd6, + 0x77, 0xea, 0x46, 0x4d, 0x5d, 0xd0, 0xd6, 0x27, 0x53, 0x3d, 0x2b, 0x0d, 0x0d, 0x77, 0xc4, 0x4f, + 0x50, 0x11, 0xd6, 0x93, 0xd6, 0x1f, 0x19, 0x6d, 0x55, 0xd1, 0xae, 0x4e, 0xa6, 0x7a, 0x46, 0x5a, + 0x7d, 0x84, 0x19, 0xba, 0x0d, 0xd7, 0x92, 0x36, 0xe5, 0x4a, 0xbb, 0x53, 0xae, 0x37, 0xd4, 0x45, + 0xed, 0x95, 0xc9, 0x54, 0xbf, 0x2a, 0xed, 0xca, 0x87, 0x8c, 0xdb, 0xc4, 0x43, 0x3a, 0xac, 0x25, + 0x6d, 0x1b, 0x4d, 0x35, 0xa5, 0x5d, 0x99, 0x4c, 0xf5, 0x55, 0x69, 0xd6, 0xa0, 0x68, 0x1b, 0x72, + 0x67, 0x2d, 0xac, 0x83, 0x7a, 0xe7, 0xbe, 0xb5, 0x6f, 0x74, 0x9a, 0x6a, 0x5a, 0xdb, 0x98, 0x4c, + 0x75, 0x35, 0xb2, 0x3d, 0x20, 0xbc, 0xbf, 0x8f, 0x39, 0xd5, 0xd2, 0x1f, 0xff, 0x22, 0xbf, 0x70, + 0xfb, 0x27, 0x29, 0x99, 0xa8, 0x7c, 0x60, 0xa1, 0xaf, 0x87, 0xb4, 0x4c, 0xa3, 0xbd, 0xf7, 0xa0, + 0x63, 0xed, 0x35, 0x3e, 0x68, 0x34, 0x0f, 0x1a, 0xea, 0x82, 0x96, 0x9d, 0x4c, 0xf5, 0x95, 0x3d, + 0x6f, 0xe0, 0xd1, 0x87, 0x1e, 0x2a, 0x02, 0x4a, 0x5a, 0xb5, 0xca, 0xed, 0xb6, 0x51, 0x53, 0x15, + 0x0d, 0x26, 0x53, 0x7d, 0xb9, 0x65, 0x33, 0x86, 0xbb, 0xe8, 0x4d, 0xd8, 0x48, 0xda, 0x98, 0xc6, + 0xfb, 0x46, 0xb5, 0x63, 0xd4, 0xd4, 0x45, 0x49, 0xdd, 0xc4, 0x3f, 0xc2, 0x0e, 0xc7, 0x5d, 0xf4, + 0x4d, 0xc8, 0x5f, 0x64, 0x97, 0x48, 0x20, 0x25, 0x13, 0x88, 0x3c, 0xa2, 0x04, 0xd0, 0xd7, 0xe0, + 0x4a, 0xe0, 0xd9, 0x32, 0x1a, 0xb5, 0x7a, 0xe3, 0x3d, 0x35, 0x2d, 0x49, 0xb6, 0xb0, 0x17, 0x5c, + 0xff, 0xe7, 0x02, 0x7f, 0xb8, 0xd7, 0x34, 0xf7, 0x76, 0xad, 0x46, 0x53, 0x60, 0x94, 0xab, 0xf7, + 0x8d, 0x9a, 0xba, 0x24, 0x03, 0x7f, 0x38, 0xa6, 0xfe, 0xd8, 0x6d, 0x50, 0x6e, 0x62, 0xdb, 0xe9, + 0xe3, 0x2e, 0xda, 0x84, 0x57, 0x93, 0x9e, 0x46, 0xa3, 0x5c, 0xed, 0xec, 0x1a, 0x8d, 0x8e, 0xba, + 0x2c, 0x4f, 0x31, 0x7e, 0xec, 0xa2, 0x6f, 0xc3, 0xeb, 0xf3, 0x1b, 0x21, 0xa9, 0x1b, 0xdf, 0x33, + 0xaa, 0xd6, 0x4e, 0xb9, 0xfe, 0x40, 0x5d, 0xd1, 0xae, 0x4f, 0xa6, 0x3a, 0x92, 0xfb, 0x22, 0xd8, + 0x8b, 0xf2, 0xdb, 0xb1, 0xc9, 0x50, 0x1e, 0x41, 0xe5, 0x3b, 0x9f, 0x3e, 0xcd, 0x2b, 0x4f, 0x9e, + 0xe6, 0x95, 0xbf, 0x3e, 0xcd, 0x2b, 0x8f, 0x9f, 0xe5, 0x17, 0x9e, 0x3c, 0xcb, 0x2f, 0xfc, 0xe9, + 0x59, 0x7e, 0xe1, 0xfb, 0x6f, 0x24, 0xba, 0xe4, 0x03, 0xe2, 0xdb, 0x55, 0xea, 0xe3, 0x2d, 0x86, + 0x07, 0x36, 0xd9, 0x7a, 0x14, 0x7c, 0xab, 0x0b, 0x1a, 0xe5, 0x70, 0x39, 0xf8, 0x66, 0xf0, 0xce, + 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xca, 0x76, 0x2b, 0xbc, 0xa2, 0x14, 0x00, 0x00, } func (this *WhitelistAccountPermissionProposal) Equal(that interface{}) bool { @@ -2712,6 +2776,57 @@ func (m *ProposalJailCouncilor) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ProposalSetExecutionFees) 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 *ProposalSetExecutionFees) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ProposalSetExecutionFees) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ExecutionFees) > 0 { + for iNdEx := len(m.ExecutionFees) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ExecutionFees[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProposal(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x12 + } + if len(m.Proposer) > 0 { + i -= len(m.Proposer) + copy(dAtA[i:], m.Proposer) + i = encodeVarintProposal(dAtA, i, uint64(len(m.Proposer))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintProposal(dAtA []byte, offset int, v uint64) int { offset -= sovProposal(v) base := offset @@ -3133,6 +3248,29 @@ func (m *ProposalJailCouncilor) Size() (n int) { return n } +func (m *ProposalSetExecutionFees) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Proposer) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovProposal(uint64(l)) + } + if len(m.ExecutionFees) > 0 { + for _, e := range m.ExecutionFees { + l = e.Size() + n += 1 + l + sovProposal(uint64(l)) + } + } + return n +} + func sovProposal(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -5993,6 +6131,156 @@ func (m *ProposalJailCouncilor) Unmarshal(dAtA []byte) error { } return nil } +func (m *ProposalSetExecutionFees) 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 ErrIntOverflowProposal + } + 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: ProposalSetExecutionFees: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProposalSetExecutionFees: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Proposer", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProposal + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Proposer = append(m.Proposer[:0], dAtA[iNdEx:postIndex]...) + if m.Proposer == nil { + m.Proposer = []byte{} + } + 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 ErrIntOverflowProposal + } + 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 ErrInvalidLengthProposal + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + 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 ExecutionFees", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProposal + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProposal + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExecutionFees = append(m.ExecutionFees, ExecutionFee{}) + if err := m.ExecutionFees[len(m.ExecutionFees)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProposal(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProposal + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipProposal(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 From 4e45a8fc468f7f8bfe2ef399492063073cfcafa8 Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 01:33:54 +0800 Subject: [PATCH 03/12] set proposal --- x/gov/types/proposal.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/gov/types/proposal.go b/x/gov/types/proposal.go index 1fa0af89..d237a511 100644 --- a/x/gov/types/proposal.go +++ b/x/gov/types/proposal.go @@ -658,11 +658,11 @@ func (m *ProposalSetExecutionFees) ProposalType() string { } func (m *ProposalSetExecutionFees) ProposalPermission() PermValue { - return PermCreateJailCouncilorProposal + return PermCreateSetExecutionFeesProposal } func (m *ProposalSetExecutionFees) VotePermission() PermValue { - return PermVoteJailCouncilorProposal + return PermVoteSetExecutionFeesProposal } // ValidateBasic returns basic validation From 6ea17771ef10e4e6ec3eca1c91c8fab3e34d259f Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 01:38:25 +0800 Subject: [PATCH 04/12] add sudo genesis permission, more permission metadata --- x/gov/types/genesis.go | 3 +++ x/gov/types/permission.go | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/x/gov/types/genesis.go b/x/gov/types/genesis.go index 9df8c86a..4f37824c 100644 --- a/x/gov/types/genesis.go +++ b/x/gov/types/genesis.go @@ -95,6 +95,9 @@ func DefaultGenesis() *GenesisState { PermCreateJailCouncilorProposal, PermVoteJailCouncilorProposal, PermCreatePollProposal, + PermCreateDappProposalWithoutBond, + PermCreateSetExecutionFeesProposal, + PermVoteSetExecutionFeesProposal, }, nil), uint64(RoleValidator): NewPermissions([]PermValue{PermClaimValidator}, nil), }, diff --git a/x/gov/types/permission.go b/x/gov/types/permission.go index 66522de4..054da240 100644 --- a/x/gov/types/permission.go +++ b/x/gov/types/permission.go @@ -398,4 +398,28 @@ var PermMetadata = []PermInfo{ Module: "gov", Description: "the permission needed to vote on jail councilors proposal", }, + { + Id: int32(PermCreatePollProposal), + Name: "PERMISSION_CREATE_POLL_PROPOSAL", + Module: "gov", + Description: "the permission needed to create a poll proposal", + }, + { + Id: int32(PermCreateDappProposalWithoutBond), + Name: "PERMISSION_CREATE_DAPP_PROPOSAL_WITHOUT_BOND", + Module: "gov", + Description: "the permission needed to create a dapp proposal without bond", + }, + { + Id: int32(PermCreateSetExecutionFeesProposal), + Name: "PERMISSION_CREATE_SET_EXECUTION_FEES_PROPOSAL", + Module: "gov", + Description: "the permission needed to create a proposal to set execution fees", + }, + { + Id: int32(PermVoteSetExecutionFeesProposal), + Name: "PERMISSION_VOTE_SET_EXECUTION_FEES_PROPOSAL", + Module: "gov", + Description: "the permission needed to vote on set execution fees proposal", + }, } From a142e1a6a2ddbf5f47a3fb9b32174199ecab1c0b Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 01:42:41 +0800 Subject: [PATCH 05/12] fix unit test --- x/gov/genesis_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x/gov/genesis_test.go b/x/gov/genesis_test.go index 166e7cd6..1c8402b2 100644 --- a/x/gov/genesis_test.go +++ b/x/gov/genesis_test.go @@ -114,7 +114,10 @@ func TestSimappExportGenesis(t *testing.T) { 63, 64, 65, - 66 + 66, + 67, + 68, + 69 ] }, "2": { From 89913725e5d080a65be4555a2f01b323e048e7fd Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 20:55:36 +0800 Subject: [PATCH 06/12] update README --- README.md | 102 ++++++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index d5e07b85..f93840c8 100644 --- a/README.md +++ b/README.md @@ -1,88 +1,86 @@ -# sekai +# SEKAI -KIRA Relay Chain +SEKAI is KIRA Network's base layer (L1) blockchain application sometimes referred to as “backend”. The role of SEKAI is to be a source of shared security as well as a governance and settlement layer for all KIRA RollApps (L2). KIRA Blockchain preserves information such as user account balances, governance permissions, and RollApp state roots as well as other essential data for coordinating both L1 and L2 operations. -## Quick setup from Github +## Documentation -```bash -# dont forget to specify branch name or hash -cd $HOME && rm -fvr ./sekai && SEKAI_BRANCH="" && \ - git clone https://github.com/KiraCore/sekai.git -b $SEKAI_BRANCH && \ - cd ./sekai && chmod -R 777 ./scripts && make proto-gen && \ - make install && echo "SUCCESS installed sekaid $(sekaid version)" || echo "FAILED" -``` +For the most up to date documentation please visit [docs.kira.network](https://docs.kira.network/) -## Signatures +## Quick Installation Guide -All files in KIRA repositories are always signed with [cosign](https://github.com/sigstore/cosign/releases), you should NEVER install anything on your machine unless you verified integrity of the files! +### Required Tools -Cosign requires simple initial setup of the signer keys described more precisely [here](https://dev.to/n3wt0n/sign-your-container-images-with-cosign-github-actions-and-github-container-registry-3mni) +KIRA requires the installation of two tools, [Cosign](https://docs.kira.network/docs/cosign) and [Bash-utils](https://docs.kira.network/docs/bash-utils), in order to secure the network and simplify the execution of various tasks. +All files in KIRA repositories are always signed with cosign, you should NEVER install anything on your machine unless you verified integrity of the files! -```bash -# install cosign -COSIGN_VERSION="v1.7.2" && \ -if [[ "$(uname -m)" == *"ar"* ]] ; then ARCH="arm64"; else ARCH="amd64" ; fi && echo $ARCH && \ -PLATFORM=$(uname) && FILE=$(echo "cosign-${PLATFORM}-${ARCH}" | tr '[:upper:]' '[:lower:]') && \ - wget https://github.com/sigstore/cosign/releases/download/${COSIGN_VERSION}/$FILE && chmod +x -v ./$FILE && \ - mv -fv ./$FILE /usr/local/bin/cosign && cosign version +### Installation -# save KIRA public cosign key -KEYS_DIR="/usr/keys" && KIRA_COSIGN_PUB="${KEYS_DIR}/kira-cosign.pub" && \ -mkdir -p $KEYS_DIR && cat > ./cosign.pub << EOL ------BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/IrzBQYeMwvKa44/DF/HB7XDpnE+ -f+mU9F/Qbfq25bBWV2+NlYMJv3KvKHNtu3Jknt6yizZjUV4b8WGfKBzFYw== ------END PUBLIC KEY----- -EOL +Login as admin & load environment variables. -# download desired files and the corresponding .sig file from: https://github.com/KiraCore/tools/releases +sudo -s -# verify signature of downloaded files -cosign verify-blob --key=$KIRA_COSIGN_PUB--signature=./.sig ./ -``` +Set desired SEKAI release version and binaries repo as env variables within /etc/profile (with bash-utils or manually). Sourcing /etc/profile is necessary. +Check latest SEKAI release's version [here](https://github.com/KiraCore/sekai/releases). -## Features +setGlobEnv SEKAI_VERSION "v0.3.39" && \ +setGlobEnv SEKAI_REPO "$HOME/sekai" && \ +setGlobEnv NETWORK_NAME "test" && \ +setGlobEnv SEKAID_HOME "~/.sekaid-$NETWORK_NAME" && \ +loadGlobEnvs -### Core modules for consensus +Clone repository and install -- staking -- slashing -- evidence -- distributor +rm -fr $SEKAI_REPO && rm -fr $GOBIN/sekaid && mkdir $SEKAI_REPO && cd $SEKAI_REPO && \ +git clone https://github.com/KiraCore/sekai.git -b $SEKAI_VERSION $SEKAI_REPO && \ +chmod -R 777 ./scripts && make install && \ +echo "SUCCESS installed sekaid $(sekaid version)" || echo "FAILED" + +Verify successful installation + +sekaid version --long + +## SEKAI Modules + +### Consensus + +- [staking](https://github.com/KiraCore/sekai/tree/master/x/staking) +- [slashing](https://github.com/KiraCore/sekai/tree/master/x/slashing) +- [evidence](https://github.com/KiraCore/sekai/tree/master/x/evidence) +- [distributor](https://github.com/KiraCore/sekai/tree/master/x/distributor) ### Basic modules -- spending -- tokens -- ubi +- [spending](https://github.com/KiraCore/sekai/tree/master/x/spending) +- [tokens](https://github.com/KiraCore/sekai/tree/master/x/tokens) +- [ubi](https://github.com/KiraCore/sekai/tree/master/x/ubi) -### Liquid staking +### Liquid Staking -- multistaking +- [multistaking](https://github.com/KiraCore/sekai/tree/master/x/multistaking) ### Derivatives -- basket -- collectives +- [basket](https://github.com/KiraCore/sekai/tree/master/x/basket) +- [collectives](https://github.com/KiraCore/sekai/tree/master/x/collectives) ### Governance -- gov +- [gov](https://github.com/KiraCore/sekai/tree/master/x/gov) ### Layer2 -- layer2 +- [layer2](https://github.com/KiraCore/sekai/tree/master/x/layer2) ### Fees -- feeprocessing +- [feeprocessing](https://github.com/KiraCore/sekai/tree/master/x/feeprocessing) ### Utilities & Upgrade -- custody -- recovery -- genutil -- upgrade +- [custody](https://github.com/KiraCore/sekai/tree/master/x/custody) +- [recovery](https://github.com/KiraCore/sekai/tree/master/x/recovery) +- [genutil](https://github.com/KiraCore/sekai/tree/master/x/genutil) +- [upgrade](https://github.com/KiraCore/sekai/tree/master/x/upgrade) ## Contributing From 832daa69e864575bbd83e8a1f03e1c418a0f1d41 Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 20:58:44 +0800 Subject: [PATCH 07/12] update formatting for code blocks --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f93840c8..2e28659b 100644 --- a/README.md +++ b/README.md @@ -19,25 +19,31 @@ Login as admin & load environment variables. sudo -s -Set desired SEKAI release version and binaries repo as env variables within /etc/profile (with bash-utils or manually). Sourcing /etc/profile is necessary. +Set desired SEKAI release version and binaries repo as env variables within `/etc/profile` (with `bash-utils` or manually). Sourcing `/etc/profile` is necessary. Check latest SEKAI release's version [here](https://github.com/KiraCore/sekai/releases). +```bash setGlobEnv SEKAI_VERSION "v0.3.39" && \ setGlobEnv SEKAI_REPO "$HOME/sekai" && \ setGlobEnv NETWORK_NAME "test" && \ setGlobEnv SEKAID_HOME "~/.sekaid-$NETWORK_NAME" && \ loadGlobEnvs +``` Clone repository and install -rm -fr $SEKAI_REPO && rm -fr $GOBIN/sekaid && mkdir $SEKAI_REPO && cd $SEKAI_REPO && \ +```bash +rm -rf $SEKAI_REPO && rm -fr $GOBIN/sekaid && mkdir $SEKAI_REPO && cd $SEKAI_REPO && \ git clone https://github.com/KiraCore/sekai.git -b $SEKAI_VERSION $SEKAI_REPO && \ chmod -R 777 ./scripts && make install && \ echo "SUCCESS installed sekaid $(sekaid version)" || echo "FAILED" +``` Verify successful installation +```bash sekaid version --long +``` ## SEKAI Modules From 29c6a669bda49f59d49f37f526228aa15440c303 Mon Sep 17 00:00:00 2001 From: jgo121 Date: Fri, 8 Mar 2024 21:12:31 +0800 Subject: [PATCH 08/12] Update error content on creating/voting dynamic type proposals --- x/gov/keeper/msg_server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/gov/keeper/msg_server.go b/x/gov/keeper/msg_server.go index 55991f8b..64af059e 100644 --- a/x/gov/keeper/msg_server.go +++ b/x/gov/keeper/msg_server.go @@ -42,7 +42,7 @@ func (k msgServer) SubmitProposal(goCtx context.Context, msg *types.MsgSubmitPro router := k.keeper.GetProposalRouter() isAllowed := router.IsAllowedAddressDynamicProposal(ctx, msg.Proposer, content) if !isAllowed { - return nil, errors.Wrap(types.ErrNotEnoughPermissions, "spending pool permission") + return nil, errors.Wrap(types.ErrNotEnoughPermissions, "not enough permission to create the proposal") } } else { isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, content.ProposalPermission()) @@ -111,7 +111,7 @@ func (k msgServer) VoteProposal( router := k.keeper.GetProposalRouter() isAllowed := router.IsAllowedAddressDynamicProposal(ctx, msg.Voter, content) if !isAllowed { - return nil, errors.Wrap(types.ErrNotEnoughPermissions, "spending pool permission") + return nil, errors.Wrap(types.ErrNotEnoughPermissions, "not enough permission to vote on the proposal") } } else { isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Voter, content.VotePermission()) From c066abdbcb92fc9a96d629cb5b916b18dc4e8f44 Mon Sep 17 00:00:00 2001 From: jgo121 Date: Mon, 18 Mar 2024 17:56:51 +0800 Subject: [PATCH 09/12] Proper error handling for non existing identity records key from an address --- x/gov/keeper/identity_registrar.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/x/gov/keeper/identity_registrar.go b/x/gov/keeper/identity_registrar.go index 209e3fe5..35572915 100644 --- a/x/gov/keeper/identity_registrar.go +++ b/x/gov/keeper/identity_registrar.go @@ -315,9 +315,17 @@ func (k Keeper) GetIdRecordsByAddressAndKeys(ctx sdk.Context, address sdk.AccAdd recordId := sdk.BigEndianToUint64(bz) record := k.GetIdentityRecordById(ctx, recordId) if record == nil { - return records, sdkerrors.Wrap(types.ErrInvalidIdentityRecordId, fmt.Sprintf("identity record with specified id does NOT exist: id=%d", recordId)) + records = append(records, types.IdentityRecord{ + Id: 0, + Address: address.String(), + Key: key, + Value: "", + Date: time.Time{}, + Verifiers: []string{}, + }) + } else { + records = append(records, *record) } - records = append(records, *record) } return records, nil } @@ -485,7 +493,7 @@ func (k Keeper) HandleIdentityRecordsVerifyRequest(ctx sdk.Context, verifier sdk } } - if approve == false { + if !approve { k.DeleteIdRecordsVerifyRequest(ctx, requestId) return nil } From 5862ea82133c02cc55f47a62bd7e440eae295aca Mon Sep 17 00:00:00 2001 From: jgo121 Date: Mon, 18 Mar 2024 18:13:27 +0800 Subject: [PATCH 10/12] fix usage of native cosmos staking module msg to custom staking module msg --- x/genutil/collect.go | 41 +++----------------------------- x/genutil/types/genesis_state.go | 7 +++--- 2 files changed, 6 insertions(+), 42 deletions(-) diff --git a/x/genutil/collect.go b/x/genutil/collect.go index a8d1bdf6..e9183b4a 100644 --- a/x/genutil/collect.go +++ b/x/genutil/collect.go @@ -9,7 +9,6 @@ import ( "io/ioutil" "os" "path/filepath" - "runtime" "sort" "strings" @@ -17,11 +16,11 @@ import ( tmtypes "github.com/cometbft/cometbft/types" "github.com/KiraCore/sekai/x/genutil/types" + stakingtypes "github.com/KiraCore/sekai/x/staking/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" bankexported "github.com/cosmos/cosmos-sdk/x/bank/exported" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // GenAppStateFromConfig gets the genesis app state from the config @@ -138,44 +137,10 @@ func CollectTxs(cdc codec.JSONCodec, txJSONDecoder sdk.TxDecoder, moniker, genTx return appGenTxs, persistentPeers, errors.New("each genesis transaction must provide a single genesis message") } - // TODO abstract out staking message validation back to staking - msg := msgs[0].(*stakingtypes.MsgCreateValidator) - - // validate delegator and validator addresses and funds against the accounts in the state - delAddr := msg.DelegatorAddress - valAddr, err := sdk.ValAddressFromBech32(msg.ValidatorAddress) - if err != nil { - return appGenTxs, persistentPeers, err - } - - delBal, delOk := balancesMap[delAddr] - if !delOk { - _, file, no, ok := runtime.Caller(1) - if ok { - fmt.Printf("CollectTxs-1, called from %s#%d\n", file, no) - } - - return appGenTxs, persistentPeers, fmt.Errorf("account %s balance not in genesis state: %+v", delAddr, balancesMap) - } - - _, valOk := balancesMap[sdk.AccAddress(valAddr).String()] - if !valOk { - _, file, no, ok := runtime.Caller(1) - if ok { - fmt.Printf("CollectTxs-2, called from %s#%d - %s\n", file, no, sdk.AccAddress(msg.ValidatorAddress).String()) - } - return appGenTxs, persistentPeers, fmt.Errorf("account %s balance not in genesis state: %+v", valAddr, balancesMap) - } - - if delBal.GetCoins().AmountOf(msg.Value.Denom).LT(msg.Value.Amount) { - return appGenTxs, persistentPeers, fmt.Errorf( - "insufficient fund for delegation %v: %v < %v", - delBal.GetAddress().String(), delBal.GetCoins().AmountOf(msg.Value.Denom), msg.Value.Amount, - ) - } + msg := msgs[0].(*stakingtypes.MsgClaimValidator) // exclude itself from persistent peers - if msg.Description.Moniker != moniker { + if msg.Moniker != moniker { addressesIPs = append(addressesIPs, nodeAddrIP) } } diff --git a/x/genutil/types/genesis_state.go b/x/genutil/types/genesis_state.go index c2278b06..927ac0e4 100644 --- a/x/genutil/types/genesis_state.go +++ b/x/genutil/types/genesis_state.go @@ -8,9 +8,9 @@ import ( tmos "github.com/cometbft/cometbft/libs/os" tmtypes "github.com/cometbft/cometbft/types" + stakingtypes "github.com/KiraCore/sekai/x/staking/types" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // NewGenesisState creates a new GenesisState object @@ -110,10 +110,9 @@ func ValidateGenesis(genesisState *GenesisState, txJSONDecoder sdk.TxDecoder) er "must provide genesis Tx with exactly 1 CreateValidator message") } - // TODO: abstract back to staking - if _, ok := msgs[0].(*stakingtypes.MsgCreateValidator); !ok { + if _, ok := msgs[0].(*stakingtypes.MsgClaimValidator); !ok { return fmt.Errorf( - "genesis transaction %v does not contain a MsgCreateValidator", i) + "genesis transaction %v does not contain a MsgClaimValidator", i) } } return nil From 8fbc3ea69d94874b8397738e078ca70e0c9d632b Mon Sep 17 00:00:00 2001 From: jgo121 Date: Mon, 18 Mar 2024 20:03:02 +0800 Subject: [PATCH 11/12] fix unit test for ir --- x/gov/keeper/identity_registrar_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x/gov/keeper/identity_registrar_test.go b/x/gov/keeper/identity_registrar_test.go index f9d8e125..9192b7ff 100644 --- a/x/gov/keeper/identity_registrar_test.go +++ b/x/gov/keeper/identity_registrar_test.go @@ -220,7 +220,8 @@ func TestKeeper_IdentityRecordAddEditRemove(t *testing.T) { require.Len(t, records, 1) records, err = app.CustomGovKeeper.GetIdRecordsByAddressAndKeys(ctx, addr1, []string{"invalidkey"}) - require.Error(t, err) + require.NoError(t, err) + require.Len(t, records, 1) } func TestKeeper_TryLongMonikerField(t *testing.T) { From 67acea70ca38c201c2c886e6d812af4135c74bce Mon Sep 17 00:00:00 2001 From: jgo121 Date: Mon, 18 Mar 2024 20:06:59 +0800 Subject: [PATCH 12/12] add release version --- RELEASE.md | 7 ++++--- types/constants.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/RELEASE.md b/RELEASE.md index 3ed5885f..1d15c3e7 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,5 +1,6 @@ Features: -- Add webhook -- Add static build - +- Docs update +- Set execution fees proposal +- Proper error handling for non existing identity records key from an address +- Fix usage of native cosmos staking module msg to custom staking module msg diff --git a/types/constants.go b/types/constants.go index b95cb250..4703e0db 100644 --- a/types/constants.go +++ b/types/constants.go @@ -3,6 +3,6 @@ package types const ( // we set page iteration limit for safety PageIterationLimit = 512 - SekaiVersion = "v0.3.42" + SekaiVersion = "v0.3.43" CosmosVersion = "v0.47.6" )