mirror of
https://github.com/planetmint/planetmint-go.git
synced 2025-03-30 15:08:28 +00:00
Add initial generated code
``` $ ignite version Ignite CLI version: v0.27.1 Cosmos SDK version: v0.47.3 $ ignite scaffold chain planetmint-go --address-prefix plmt --no-module ``` Signed-off-by: Julian Strobl <jmastr@mailbox.org>
This commit is contained in:
parent
761ee6792c
commit
7810d08780
53
.github/workflows/release.yml
vendored
Normal file
53
.github/workflows/release.yml
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# This workflow is useful if you want to automate the process of:
|
||||||
|
#
|
||||||
|
# a) Creating a new prelease when you push a new tag with a "v" prefix (version).
|
||||||
|
#
|
||||||
|
# This type of prerelease is meant to be used for production: alpha, beta, rc, etc. types of releases.
|
||||||
|
# After the prerelease is created, you need to make your changes on the release page at the relevant
|
||||||
|
# Github page and publish your release.
|
||||||
|
#
|
||||||
|
# b) Creating/updating the "latest" prerelease when you push to your default branch.
|
||||||
|
#
|
||||||
|
# This type of prelease is useful to make your bleeding-edge binaries available to advanced users.
|
||||||
|
#
|
||||||
|
# The workflow will not run if there is no tag pushed with a "v" prefix and no change pushed to your
|
||||||
|
# default branch.
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
might_release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Prepare Release Variables
|
||||||
|
id: vars
|
||||||
|
uses: ignite/cli/actions/release/vars@main
|
||||||
|
|
||||||
|
- name: Issue Release Assets
|
||||||
|
uses: ignite/cli/actions/cli@main
|
||||||
|
if: ${{ steps.vars.outputs.should_release == 'true' }}
|
||||||
|
with:
|
||||||
|
args: chain build --release --release.prefix ${{ steps.vars.outputs.tarball_prefix }} -t linux:amd64 -t darwin:amd64 -t darwin:arm64
|
||||||
|
|
||||||
|
- name: Delete the "latest" Release
|
||||||
|
uses: dev-drprasad/delete-tag-and-release@v0.2.1
|
||||||
|
if: ${{ steps.vars.outputs.is_release_type_latest == 'true' }}
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.vars.outputs.tag_name }}
|
||||||
|
delete_release: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Publish the Release
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
if: ${{ steps.vars.outputs.should_release == 'true' }}
|
||||||
|
with:
|
||||||
|
tag_name: ${{ steps.vars.outputs.tag_name }}
|
||||||
|
files: release/*
|
||||||
|
prerelease: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -1 +1,6 @@
|
|||||||
planetmintd
|
vue/node_modules
|
||||||
|
vue/dist
|
||||||
|
release/
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.DS_Store
|
||||||
|
21
Makefile
21
Makefile
@ -1,21 +0,0 @@
|
|||||||
#! /usr/bin/make -f
|
|
||||||
|
|
||||||
## vet: Run go vet.
|
|
||||||
vet:
|
|
||||||
@echo Running go vet...
|
|
||||||
@go vet ./...
|
|
||||||
|
|
||||||
## fmt: Run go fmt.
|
|
||||||
fmt:
|
|
||||||
@echo Running go fmt...
|
|
||||||
@go fmt ./...
|
|
||||||
|
|
||||||
## build: Run go build.
|
|
||||||
build: vet fmt
|
|
||||||
@echo Running go build...
|
|
||||||
@go build -v ./...
|
|
||||||
|
|
||||||
## install: Run go install.
|
|
||||||
install: vet fmt
|
|
||||||
@echo Running go install...
|
|
||||||
@go install ./...
|
|
13
README.md
13
README.md
@ -1,13 +0,0 @@
|
|||||||
# Planetmint Daemon in Go
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ make build
|
|
||||||
```
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ make install
|
|
||||||
```
|
|
901
app/app.go
Normal file
901
app/app.go
Normal file
@ -0,0 +1,901 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
|
||||||
|
reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
|
||||||
|
dbm "github.com/cometbft/cometbft-db"
|
||||||
|
abci "github.com/cometbft/cometbft/abci/types"
|
||||||
|
"github.com/cometbft/cometbft/libs/log"
|
||||||
|
tmos "github.com/cometbft/cometbft/libs/os"
|
||||||
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
|
nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/grpc/tmservice"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/runtime"
|
||||||
|
runtimeservices "github.com/cosmos/cosmos-sdk/runtime/services"
|
||||||
|
"github.com/cosmos/cosmos-sdk/server/api"
|
||||||
|
"github.com/cosmos/cosmos-sdk/server/config"
|
||||||
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
||||||
|
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/types/module"
|
||||||
|
"github.com/cosmos/cosmos-sdk/version"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth/ante"
|
||||||
|
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||||
|
authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"
|
||||||
|
authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
|
||||||
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth/vesting"
|
||||||
|
vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/authz"
|
||||||
|
authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
|
||||||
|
authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/bank"
|
||||||
|
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||||
|
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/capability"
|
||||||
|
capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
|
||||||
|
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/consensus"
|
||||||
|
consensusparamkeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper"
|
||||||
|
consensusparamtypes "github.com/cosmos/cosmos-sdk/x/consensus/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/crisis"
|
||||||
|
crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper"
|
||||||
|
crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
|
||||||
|
distr "github.com/cosmos/cosmos-sdk/x/distribution"
|
||||||
|
distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
|
||||||
|
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/evidence"
|
||||||
|
evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper"
|
||||||
|
evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/feegrant"
|
||||||
|
feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper"
|
||||||
|
feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/genutil"
|
||||||
|
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/gov"
|
||||||
|
govclient "github.com/cosmos/cosmos-sdk/x/gov/client"
|
||||||
|
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
|
||||||
|
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
|
||||||
|
govv1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
|
||||||
|
govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/group"
|
||||||
|
groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper"
|
||||||
|
groupmodule "github.com/cosmos/cosmos-sdk/x/group/module"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/mint"
|
||||||
|
mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper"
|
||||||
|
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/params"
|
||||||
|
paramsclient "github.com/cosmos/cosmos-sdk/x/params/client"
|
||||||
|
paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
|
||||||
|
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
||||||
|
paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/slashing"
|
||||||
|
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
||||||
|
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
|
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
|
||||||
|
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/upgrade"
|
||||||
|
upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client"
|
||||||
|
upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
|
||||||
|
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
|
||||||
|
ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts"
|
||||||
|
icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper"
|
||||||
|
icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types"
|
||||||
|
icahost "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host"
|
||||||
|
icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper"
|
||||||
|
icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types"
|
||||||
|
icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types"
|
||||||
|
"github.com/cosmos/ibc-go/v7/modules/apps/transfer"
|
||||||
|
ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper"
|
||||||
|
ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
|
||||||
|
ibc "github.com/cosmos/ibc-go/v7/modules/core"
|
||||||
|
ibcclient "github.com/cosmos/ibc-go/v7/modules/core/02-client"
|
||||||
|
ibcclientclient "github.com/cosmos/ibc-go/v7/modules/core/02-client/client"
|
||||||
|
ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
|
||||||
|
ibcporttypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types"
|
||||||
|
ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported"
|
||||||
|
ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper"
|
||||||
|
solomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine"
|
||||||
|
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
|
||||||
|
"github.com/spf13/cast"
|
||||||
|
|
||||||
|
// this line is used by starport scaffolding # stargate/app/moduleImport
|
||||||
|
|
||||||
|
appparams "planetmint-go/app/params"
|
||||||
|
"planetmint-go/docs"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
AccountAddressPrefix = "plmt"
|
||||||
|
Name = "planetmint-go"
|
||||||
|
)
|
||||||
|
|
||||||
|
// this line is used by starport scaffolding # stargate/wasm/app/enabledProposals
|
||||||
|
|
||||||
|
func getGovProposalHandlers() []govclient.ProposalHandler {
|
||||||
|
var govProposalHandlers []govclient.ProposalHandler
|
||||||
|
// this line is used by starport scaffolding # stargate/app/govProposalHandlers
|
||||||
|
|
||||||
|
govProposalHandlers = append(govProposalHandlers,
|
||||||
|
paramsclient.ProposalHandler,
|
||||||
|
upgradeclient.LegacyProposalHandler,
|
||||||
|
upgradeclient.LegacyCancelProposalHandler,
|
||||||
|
ibcclientclient.UpdateClientProposalHandler,
|
||||||
|
ibcclientclient.UpgradeProposalHandler,
|
||||||
|
// this line is used by starport scaffolding # stargate/app/govProposalHandler
|
||||||
|
)
|
||||||
|
|
||||||
|
return govProposalHandlers
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// DefaultNodeHome default home directories for the application daemon
|
||||||
|
DefaultNodeHome string
|
||||||
|
|
||||||
|
// ModuleBasics defines the module BasicManager is in charge of setting up basic,
|
||||||
|
// non-dependant module elements, such as codec registration
|
||||||
|
// and genesis verification.
|
||||||
|
ModuleBasics = module.NewBasicManager(
|
||||||
|
auth.AppModuleBasic{},
|
||||||
|
authzmodule.AppModuleBasic{},
|
||||||
|
genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator),
|
||||||
|
bank.AppModuleBasic{},
|
||||||
|
capability.AppModuleBasic{},
|
||||||
|
staking.AppModuleBasic{},
|
||||||
|
mint.AppModuleBasic{},
|
||||||
|
distr.AppModuleBasic{},
|
||||||
|
gov.NewAppModuleBasic(getGovProposalHandlers()),
|
||||||
|
params.AppModuleBasic{},
|
||||||
|
crisis.AppModuleBasic{},
|
||||||
|
slashing.AppModuleBasic{},
|
||||||
|
feegrantmodule.AppModuleBasic{},
|
||||||
|
groupmodule.AppModuleBasic{},
|
||||||
|
ibc.AppModuleBasic{},
|
||||||
|
ibctm.AppModuleBasic{},
|
||||||
|
solomachine.AppModuleBasic{},
|
||||||
|
upgrade.AppModuleBasic{},
|
||||||
|
evidence.AppModuleBasic{},
|
||||||
|
transfer.AppModuleBasic{},
|
||||||
|
ica.AppModuleBasic{},
|
||||||
|
vesting.AppModuleBasic{},
|
||||||
|
consensus.AppModuleBasic{},
|
||||||
|
// this line is used by starport scaffolding # stargate/app/moduleBasic
|
||||||
|
)
|
||||||
|
|
||||||
|
// module account permissions
|
||||||
|
maccPerms = map[string][]string{
|
||||||
|
authtypes.FeeCollectorName: nil,
|
||||||
|
distrtypes.ModuleName: nil,
|
||||||
|
icatypes.ModuleName: nil,
|
||||||
|
minttypes.ModuleName: {authtypes.Minter},
|
||||||
|
stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking},
|
||||||
|
stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking},
|
||||||
|
govtypes.ModuleName: {authtypes.Burner},
|
||||||
|
ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
|
||||||
|
// this line is used by starport scaffolding # stargate/app/maccPerms
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ runtime.AppI = (*App)(nil)
|
||||||
|
_ servertypes.Application = (*App)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
userHomeDir, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultNodeHome = filepath.Join(userHomeDir, "."+Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
// App extends an ABCI application, but with most of its parameters exported.
|
||||||
|
// They are exported for convenience in creating helper functions, as object
|
||||||
|
// capabilities aren't needed for testing.
|
||||||
|
type App struct {
|
||||||
|
*baseapp.BaseApp
|
||||||
|
|
||||||
|
cdc *codec.LegacyAmino
|
||||||
|
appCodec codec.Codec
|
||||||
|
interfaceRegistry types.InterfaceRegistry
|
||||||
|
txConfig client.TxConfig
|
||||||
|
|
||||||
|
invCheckPeriod uint
|
||||||
|
|
||||||
|
// keys to access the substores
|
||||||
|
keys map[string]*storetypes.KVStoreKey
|
||||||
|
tkeys map[string]*storetypes.TransientStoreKey
|
||||||
|
memKeys map[string]*storetypes.MemoryStoreKey
|
||||||
|
|
||||||
|
// keepers
|
||||||
|
AccountKeeper authkeeper.AccountKeeper
|
||||||
|
AuthzKeeper authzkeeper.Keeper
|
||||||
|
BankKeeper bankkeeper.Keeper
|
||||||
|
CapabilityKeeper *capabilitykeeper.Keeper
|
||||||
|
StakingKeeper *stakingkeeper.Keeper
|
||||||
|
SlashingKeeper slashingkeeper.Keeper
|
||||||
|
MintKeeper mintkeeper.Keeper
|
||||||
|
DistrKeeper distrkeeper.Keeper
|
||||||
|
GovKeeper govkeeper.Keeper
|
||||||
|
CrisisKeeper *crisiskeeper.Keeper
|
||||||
|
UpgradeKeeper *upgradekeeper.Keeper
|
||||||
|
ParamsKeeper paramskeeper.Keeper
|
||||||
|
IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
|
||||||
|
EvidenceKeeper evidencekeeper.Keeper
|
||||||
|
TransferKeeper ibctransferkeeper.Keeper
|
||||||
|
ICAHostKeeper icahostkeeper.Keeper
|
||||||
|
FeeGrantKeeper feegrantkeeper.Keeper
|
||||||
|
GroupKeeper groupkeeper.Keeper
|
||||||
|
ConsensusParamsKeeper consensusparamkeeper.Keeper
|
||||||
|
|
||||||
|
// make scoped keepers public for test purposes
|
||||||
|
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
|
||||||
|
ScopedTransferKeeper capabilitykeeper.ScopedKeeper
|
||||||
|
ScopedICAHostKeeper capabilitykeeper.ScopedKeeper
|
||||||
|
|
||||||
|
// this line is used by starport scaffolding # stargate/app/keeperDeclaration
|
||||||
|
|
||||||
|
// mm is the module manager
|
||||||
|
mm *module.Manager
|
||||||
|
|
||||||
|
// sm is the simulation manager
|
||||||
|
sm *module.SimulationManager
|
||||||
|
configurator module.Configurator
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a reference to an initialized blockchain app
|
||||||
|
func New(
|
||||||
|
logger log.Logger,
|
||||||
|
db dbm.DB,
|
||||||
|
traceStore io.Writer,
|
||||||
|
loadLatest bool,
|
||||||
|
skipUpgradeHeights map[int64]bool,
|
||||||
|
homePath string,
|
||||||
|
invCheckPeriod uint,
|
||||||
|
encodingConfig appparams.EncodingConfig,
|
||||||
|
appOpts servertypes.AppOptions,
|
||||||
|
baseAppOptions ...func(*baseapp.BaseApp),
|
||||||
|
) *App {
|
||||||
|
appCodec := encodingConfig.Marshaler
|
||||||
|
cdc := encodingConfig.Amino
|
||||||
|
interfaceRegistry := encodingConfig.InterfaceRegistry
|
||||||
|
txConfig := encodingConfig.TxConfig
|
||||||
|
|
||||||
|
bApp := baseapp.NewBaseApp(
|
||||||
|
Name,
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
encodingConfig.TxConfig.TxDecoder(),
|
||||||
|
baseAppOptions...,
|
||||||
|
)
|
||||||
|
bApp.SetCommitMultiStoreTracer(traceStore)
|
||||||
|
bApp.SetVersion(version.Version)
|
||||||
|
bApp.SetInterfaceRegistry(interfaceRegistry)
|
||||||
|
bApp.SetTxEncoder(txConfig.TxEncoder())
|
||||||
|
|
||||||
|
keys := sdk.NewKVStoreKeys(
|
||||||
|
authtypes.StoreKey, authz.ModuleName, banktypes.StoreKey, stakingtypes.StoreKey,
|
||||||
|
crisistypes.StoreKey, minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey,
|
||||||
|
govtypes.StoreKey, paramstypes.StoreKey, ibcexported.StoreKey, upgradetypes.StoreKey,
|
||||||
|
feegrant.StoreKey, evidencetypes.StoreKey, ibctransfertypes.StoreKey, icahosttypes.StoreKey,
|
||||||
|
capabilitytypes.StoreKey, group.StoreKey, icacontrollertypes.StoreKey, consensusparamtypes.StoreKey,
|
||||||
|
// this line is used by starport scaffolding # stargate/app/storeKey
|
||||||
|
)
|
||||||
|
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
|
||||||
|
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
|
||||||
|
|
||||||
|
app := &App{
|
||||||
|
BaseApp: bApp,
|
||||||
|
cdc: cdc,
|
||||||
|
appCodec: appCodec,
|
||||||
|
interfaceRegistry: interfaceRegistry,
|
||||||
|
txConfig: encodingConfig.TxConfig,
|
||||||
|
invCheckPeriod: invCheckPeriod,
|
||||||
|
keys: keys,
|
||||||
|
tkeys: tkeys,
|
||||||
|
memKeys: memKeys,
|
||||||
|
}
|
||||||
|
|
||||||
|
app.ParamsKeeper = initParamsKeeper(
|
||||||
|
appCodec,
|
||||||
|
cdc,
|
||||||
|
keys[paramstypes.StoreKey],
|
||||||
|
tkeys[paramstypes.TStoreKey],
|
||||||
|
)
|
||||||
|
|
||||||
|
// set the BaseApp's parameter store
|
||||||
|
app.ConsensusParamsKeeper = consensusparamkeeper.NewKeeper(appCodec, keys[upgradetypes.StoreKey], authtypes.NewModuleAddress(govtypes.ModuleName).String())
|
||||||
|
bApp.SetParamStore(&app.ConsensusParamsKeeper)
|
||||||
|
|
||||||
|
// add capability keeper and ScopeToModule for ibc module
|
||||||
|
app.CapabilityKeeper = capabilitykeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[capabilitytypes.StoreKey],
|
||||||
|
memKeys[capabilitytypes.MemStoreKey],
|
||||||
|
)
|
||||||
|
|
||||||
|
// grant capabilities for the ibc and ibc-transfer modules
|
||||||
|
scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcexported.ModuleName)
|
||||||
|
scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName)
|
||||||
|
scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName)
|
||||||
|
scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icahosttypes.SubModuleName)
|
||||||
|
// this line is used by starport scaffolding # stargate/app/scopedKeeper
|
||||||
|
|
||||||
|
// add keepers
|
||||||
|
app.AccountKeeper = authkeeper.NewAccountKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[authtypes.StoreKey],
|
||||||
|
authtypes.ProtoBaseAccount,
|
||||||
|
maccPerms,
|
||||||
|
sdk.Bech32PrefixAccAddr,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.AuthzKeeper = authzkeeper.NewKeeper(
|
||||||
|
keys[authz.ModuleName],
|
||||||
|
appCodec,
|
||||||
|
app.MsgServiceRouter(),
|
||||||
|
app.AccountKeeper,
|
||||||
|
)
|
||||||
|
|
||||||
|
app.BankKeeper = bankkeeper.NewBaseKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[banktypes.StoreKey],
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.BlockedModuleAccountAddrs(),
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.StakingKeeper = stakingkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[stakingtypes.StoreKey],
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.BankKeeper,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.FeeGrantKeeper = feegrantkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[feegrant.StoreKey],
|
||||||
|
app.AccountKeeper,
|
||||||
|
)
|
||||||
|
|
||||||
|
app.MintKeeper = mintkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[minttypes.StoreKey],
|
||||||
|
app.StakingKeeper,
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.BankKeeper,
|
||||||
|
authtypes.FeeCollectorName,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.DistrKeeper = distrkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[distrtypes.StoreKey],
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.BankKeeper,
|
||||||
|
app.StakingKeeper,
|
||||||
|
authtypes.FeeCollectorName,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.SlashingKeeper = slashingkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
cdc,
|
||||||
|
keys[slashingtypes.StoreKey],
|
||||||
|
app.StakingKeeper,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.CrisisKeeper = crisiskeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[crisistypes.StoreKey],
|
||||||
|
invCheckPeriod,
|
||||||
|
app.BankKeeper,
|
||||||
|
authtypes.FeeCollectorName,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
groupConfig := group.DefaultConfig()
|
||||||
|
/*
|
||||||
|
Example of setting group params:
|
||||||
|
groupConfig.MaxMetadataLen = 1000
|
||||||
|
*/
|
||||||
|
app.GroupKeeper = groupkeeper.NewKeeper(
|
||||||
|
keys[group.StoreKey],
|
||||||
|
appCodec,
|
||||||
|
app.MsgServiceRouter(),
|
||||||
|
app.AccountKeeper,
|
||||||
|
groupConfig,
|
||||||
|
)
|
||||||
|
|
||||||
|
app.UpgradeKeeper = upgradekeeper.NewKeeper(
|
||||||
|
skipUpgradeHeights,
|
||||||
|
keys[upgradetypes.StoreKey],
|
||||||
|
appCodec,
|
||||||
|
homePath,
|
||||||
|
app.BaseApp,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// ... other modules keepers
|
||||||
|
|
||||||
|
// Create IBC Keeper
|
||||||
|
app.IBCKeeper = ibckeeper.NewKeeper(
|
||||||
|
appCodec, keys[ibcexported.StoreKey],
|
||||||
|
app.GetSubspace(ibcexported.ModuleName),
|
||||||
|
app.StakingKeeper,
|
||||||
|
app.UpgradeKeeper,
|
||||||
|
scopedIBCKeeper,
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create Transfer Keepers
|
||||||
|
app.TransferKeeper = ibctransferkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[ibctransfertypes.StoreKey],
|
||||||
|
app.GetSubspace(ibctransfertypes.ModuleName),
|
||||||
|
app.IBCKeeper.ChannelKeeper,
|
||||||
|
app.IBCKeeper.ChannelKeeper,
|
||||||
|
&app.IBCKeeper.PortKeeper,
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.BankKeeper,
|
||||||
|
scopedTransferKeeper,
|
||||||
|
)
|
||||||
|
transferModule := transfer.NewAppModule(app.TransferKeeper)
|
||||||
|
transferIBCModule := transfer.NewIBCModule(app.TransferKeeper)
|
||||||
|
|
||||||
|
app.ICAHostKeeper = icahostkeeper.NewKeeper(
|
||||||
|
appCodec, keys[icahosttypes.StoreKey],
|
||||||
|
app.GetSubspace(icahosttypes.SubModuleName),
|
||||||
|
app.IBCKeeper.ChannelKeeper,
|
||||||
|
app.IBCKeeper.ChannelKeeper,
|
||||||
|
&app.IBCKeeper.PortKeeper,
|
||||||
|
app.AccountKeeper,
|
||||||
|
scopedICAHostKeeper,
|
||||||
|
app.MsgServiceRouter(),
|
||||||
|
)
|
||||||
|
icaControllerKeeper := icacontrollerkeeper.NewKeeper(
|
||||||
|
appCodec, keys[icacontrollertypes.StoreKey],
|
||||||
|
app.GetSubspace(icacontrollertypes.SubModuleName),
|
||||||
|
app.IBCKeeper.ChannelKeeper, // may be replaced with middleware such as ics29 fee
|
||||||
|
app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
|
||||||
|
scopedICAControllerKeeper, app.MsgServiceRouter(),
|
||||||
|
)
|
||||||
|
icaModule := ica.NewAppModule(&icaControllerKeeper, &app.ICAHostKeeper)
|
||||||
|
icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper)
|
||||||
|
|
||||||
|
// Create evidence Keeper for to register the IBC light client misbehaviour evidence route
|
||||||
|
evidenceKeeper := evidencekeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[evidencetypes.StoreKey],
|
||||||
|
app.StakingKeeper,
|
||||||
|
app.SlashingKeeper,
|
||||||
|
)
|
||||||
|
// If evidence needs to be handled for the app, set routes in router here and seal
|
||||||
|
app.EvidenceKeeper = *evidenceKeeper
|
||||||
|
|
||||||
|
govConfig := govtypes.DefaultConfig()
|
||||||
|
govKeeper := govkeeper.NewKeeper(
|
||||||
|
appCodec,
|
||||||
|
keys[govtypes.StoreKey],
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.BankKeeper,
|
||||||
|
app.StakingKeeper,
|
||||||
|
app.MsgServiceRouter(),
|
||||||
|
govConfig,
|
||||||
|
authtypes.NewModuleAddress(govtypes.ModuleName).String(),
|
||||||
|
)
|
||||||
|
|
||||||
|
govRouter := govv1beta1.NewRouter()
|
||||||
|
govRouter.
|
||||||
|
AddRoute(govtypes.RouterKey, govv1beta1.ProposalHandler).
|
||||||
|
AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)).
|
||||||
|
AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)).
|
||||||
|
AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper))
|
||||||
|
govKeeper.SetLegacyRouter(govRouter)
|
||||||
|
|
||||||
|
app.GovKeeper = *govKeeper.SetHooks(
|
||||||
|
govtypes.NewMultiGovHooks(
|
||||||
|
// register the governance hooks
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
// this line is used by starport scaffolding # stargate/app/keeperDefinition
|
||||||
|
|
||||||
|
/**** IBC Routing ****/
|
||||||
|
|
||||||
|
// Sealing prevents other modules from creating scoped sub-keepers
|
||||||
|
app.CapabilityKeeper.Seal()
|
||||||
|
|
||||||
|
// Create static IBC router, add transfer route, then set and seal it
|
||||||
|
ibcRouter := ibcporttypes.NewRouter()
|
||||||
|
ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule).
|
||||||
|
AddRoute(ibctransfertypes.ModuleName, transferIBCModule)
|
||||||
|
// this line is used by starport scaffolding # ibc/app/router
|
||||||
|
app.IBCKeeper.SetRouter(ibcRouter)
|
||||||
|
|
||||||
|
/**** Module Hooks ****/
|
||||||
|
|
||||||
|
// register hooks after all modules have been initialized
|
||||||
|
|
||||||
|
app.StakingKeeper.SetHooks(
|
||||||
|
stakingtypes.NewMultiStakingHooks(
|
||||||
|
// insert staking hooks receivers here
|
||||||
|
app.DistrKeeper.Hooks(),
|
||||||
|
app.SlashingKeeper.Hooks(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
/**** Module Options ****/
|
||||||
|
|
||||||
|
// NOTE: we may consider parsing `appOpts` inside module constructors. For the moment
|
||||||
|
// we prefer to be more strict in what arguments the modules expect.
|
||||||
|
skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants))
|
||||||
|
|
||||||
|
// NOTE: Any module instantiated in the module manager that is later modified
|
||||||
|
// must be passed by reference here.
|
||||||
|
|
||||||
|
app.mm = module.NewManager(
|
||||||
|
genutil.NewAppModule(
|
||||||
|
app.AccountKeeper,
|
||||||
|
app.StakingKeeper,
|
||||||
|
app.BaseApp.DeliverTx,
|
||||||
|
encodingConfig.TxConfig,
|
||||||
|
),
|
||||||
|
auth.NewAppModule(appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
|
||||||
|
authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry),
|
||||||
|
vesting.NewAppModule(app.AccountKeeper, app.BankKeeper),
|
||||||
|
bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(banktypes.ModuleName)),
|
||||||
|
capability.NewAppModule(appCodec, *app.CapabilityKeeper, false),
|
||||||
|
feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry),
|
||||||
|
groupmodule.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry),
|
||||||
|
gov.NewAppModule(appCodec, &app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govtypes.ModuleName)),
|
||||||
|
mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, nil, app.GetSubspace(minttypes.ModuleName)),
|
||||||
|
slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingtypes.ModuleName)),
|
||||||
|
distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distrtypes.ModuleName)),
|
||||||
|
staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingtypes.ModuleName)),
|
||||||
|
upgrade.NewAppModule(app.UpgradeKeeper),
|
||||||
|
evidence.NewAppModule(app.EvidenceKeeper),
|
||||||
|
consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper),
|
||||||
|
ibc.NewAppModule(app.IBCKeeper),
|
||||||
|
params.NewAppModule(app.ParamsKeeper),
|
||||||
|
transferModule,
|
||||||
|
icaModule,
|
||||||
|
// this line is used by starport scaffolding # stargate/app/appModule
|
||||||
|
|
||||||
|
crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisistypes.ModuleName)), // always be last to make sure that it checks for all invariants and not only part of them
|
||||||
|
)
|
||||||
|
|
||||||
|
// During begin block slashing happens after distr.BeginBlocker so that
|
||||||
|
// there is nothing left over in the validator fee pool, so as to keep the
|
||||||
|
// CanWithdrawInvariant invariant.
|
||||||
|
// NOTE: staking module is required if HistoricalEntries param > 0
|
||||||
|
app.mm.SetOrderBeginBlockers(
|
||||||
|
// upgrades should be run first
|
||||||
|
upgradetypes.ModuleName,
|
||||||
|
capabilitytypes.ModuleName,
|
||||||
|
minttypes.ModuleName,
|
||||||
|
distrtypes.ModuleName,
|
||||||
|
slashingtypes.ModuleName,
|
||||||
|
evidencetypes.ModuleName,
|
||||||
|
stakingtypes.ModuleName,
|
||||||
|
authtypes.ModuleName,
|
||||||
|
banktypes.ModuleName,
|
||||||
|
govtypes.ModuleName,
|
||||||
|
crisistypes.ModuleName,
|
||||||
|
ibctransfertypes.ModuleName,
|
||||||
|
ibcexported.ModuleName,
|
||||||
|
icatypes.ModuleName,
|
||||||
|
genutiltypes.ModuleName,
|
||||||
|
authz.ModuleName,
|
||||||
|
feegrant.ModuleName,
|
||||||
|
group.ModuleName,
|
||||||
|
paramstypes.ModuleName,
|
||||||
|
vestingtypes.ModuleName,
|
||||||
|
consensusparamtypes.ModuleName,
|
||||||
|
// this line is used by starport scaffolding # stargate/app/beginBlockers
|
||||||
|
)
|
||||||
|
|
||||||
|
app.mm.SetOrderEndBlockers(
|
||||||
|
crisistypes.ModuleName,
|
||||||
|
govtypes.ModuleName,
|
||||||
|
stakingtypes.ModuleName,
|
||||||
|
ibctransfertypes.ModuleName,
|
||||||
|
ibcexported.ModuleName,
|
||||||
|
icatypes.ModuleName,
|
||||||
|
capabilitytypes.ModuleName,
|
||||||
|
authtypes.ModuleName,
|
||||||
|
banktypes.ModuleName,
|
||||||
|
distrtypes.ModuleName,
|
||||||
|
slashingtypes.ModuleName,
|
||||||
|
minttypes.ModuleName,
|
||||||
|
genutiltypes.ModuleName,
|
||||||
|
evidencetypes.ModuleName,
|
||||||
|
authz.ModuleName,
|
||||||
|
feegrant.ModuleName,
|
||||||
|
group.ModuleName,
|
||||||
|
paramstypes.ModuleName,
|
||||||
|
upgradetypes.ModuleName,
|
||||||
|
vestingtypes.ModuleName,
|
||||||
|
consensusparamtypes.ModuleName,
|
||||||
|
// this line is used by starport scaffolding # stargate/app/endBlockers
|
||||||
|
)
|
||||||
|
|
||||||
|
// NOTE: The genutils module must occur after staking so that pools are
|
||||||
|
// properly initialized with tokens from genesis accounts.
|
||||||
|
// NOTE: Capability module must occur first so that it can initialize any capabilities
|
||||||
|
// so that other modules that want to create or claim capabilities afterwards in InitChain
|
||||||
|
// can do so safely.
|
||||||
|
genesisModuleOrder := []string{
|
||||||
|
capabilitytypes.ModuleName,
|
||||||
|
authtypes.ModuleName,
|
||||||
|
banktypes.ModuleName,
|
||||||
|
distrtypes.ModuleName,
|
||||||
|
stakingtypes.ModuleName,
|
||||||
|
slashingtypes.ModuleName,
|
||||||
|
govtypes.ModuleName,
|
||||||
|
minttypes.ModuleName,
|
||||||
|
crisistypes.ModuleName,
|
||||||
|
genutiltypes.ModuleName,
|
||||||
|
ibctransfertypes.ModuleName,
|
||||||
|
ibcexported.ModuleName,
|
||||||
|
icatypes.ModuleName,
|
||||||
|
evidencetypes.ModuleName,
|
||||||
|
authz.ModuleName,
|
||||||
|
feegrant.ModuleName,
|
||||||
|
group.ModuleName,
|
||||||
|
paramstypes.ModuleName,
|
||||||
|
upgradetypes.ModuleName,
|
||||||
|
vestingtypes.ModuleName,
|
||||||
|
consensusparamtypes.ModuleName,
|
||||||
|
// this line is used by starport scaffolding # stargate/app/initGenesis
|
||||||
|
}
|
||||||
|
app.mm.SetOrderInitGenesis(genesisModuleOrder...)
|
||||||
|
app.mm.SetOrderExportGenesis(genesisModuleOrder...)
|
||||||
|
|
||||||
|
// Uncomment if you want to set a custom migration order here.
|
||||||
|
// app.mm.SetOrderMigrations(custom order)
|
||||||
|
|
||||||
|
app.mm.RegisterInvariants(app.CrisisKeeper)
|
||||||
|
app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())
|
||||||
|
app.mm.RegisterServices(app.configurator)
|
||||||
|
|
||||||
|
autocliv1.RegisterQueryServer(app.GRPCQueryRouter(), runtimeservices.NewAutoCLIQueryService(app.mm.Modules))
|
||||||
|
reflectionSvc, err := runtimeservices.NewReflectionService()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
reflectionv1.RegisterReflectionServiceServer(app.GRPCQueryRouter(), reflectionSvc)
|
||||||
|
|
||||||
|
// create the simulation manager and define the order of the modules for deterministic simulations
|
||||||
|
overrideModules := map[string]module.AppModuleSimulation{
|
||||||
|
authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
|
||||||
|
}
|
||||||
|
app.sm = module.NewSimulationManagerFromAppModules(app.mm.Modules, overrideModules)
|
||||||
|
app.sm.RegisterStoreDecoders()
|
||||||
|
|
||||||
|
// initialize stores
|
||||||
|
app.MountKVStores(keys)
|
||||||
|
app.MountTransientStores(tkeys)
|
||||||
|
app.MountMemoryStores(memKeys)
|
||||||
|
|
||||||
|
// initialize BaseApp
|
||||||
|
anteHandler, err := ante.NewAnteHandler(
|
||||||
|
ante.HandlerOptions{
|
||||||
|
AccountKeeper: app.AccountKeeper,
|
||||||
|
BankKeeper: app.BankKeeper,
|
||||||
|
SignModeHandler: encodingConfig.TxConfig.SignModeHandler(),
|
||||||
|
FeegrantKeeper: app.FeeGrantKeeper,
|
||||||
|
SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("failed to create AnteHandler: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
app.SetAnteHandler(anteHandler)
|
||||||
|
app.SetInitChainer(app.InitChainer)
|
||||||
|
app.SetBeginBlocker(app.BeginBlocker)
|
||||||
|
app.SetEndBlocker(app.EndBlocker)
|
||||||
|
|
||||||
|
if loadLatest {
|
||||||
|
if err := app.LoadLatestVersion(); err != nil {
|
||||||
|
tmos.Exit(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app.ScopedIBCKeeper = scopedIBCKeeper
|
||||||
|
app.ScopedTransferKeeper = scopedTransferKeeper
|
||||||
|
// this line is used by starport scaffolding # stargate/app/beforeInitReturn
|
||||||
|
|
||||||
|
return app
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name returns the name of the App
|
||||||
|
func (app *App) Name() string { return app.BaseApp.Name() }
|
||||||
|
|
||||||
|
// BeginBlocker application updates every begin block
|
||||||
|
func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
|
||||||
|
return app.mm.BeginBlock(ctx, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EndBlocker application updates every end block
|
||||||
|
func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
|
||||||
|
return app.mm.EndBlock(ctx, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitChainer application update at chain initialization
|
||||||
|
func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
|
||||||
|
var genesisState GenesisState
|
||||||
|
if err := json.Unmarshal(req.AppStateBytes, &genesisState); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap())
|
||||||
|
return app.mm.InitGenesis(ctx, app.appCodec, genesisState)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configurator get app configurator
|
||||||
|
func (app *App) Configurator() module.Configurator {
|
||||||
|
return app.configurator
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadHeight loads a particular height
|
||||||
|
func (app *App) LoadHeight(height int64) error {
|
||||||
|
return app.LoadVersion(height)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ModuleAccountAddrs returns all the app's module account addresses.
|
||||||
|
func (app *App) ModuleAccountAddrs() map[string]bool {
|
||||||
|
modAccAddrs := make(map[string]bool)
|
||||||
|
for acc := range maccPerms {
|
||||||
|
modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return modAccAddrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlockedModuleAccountAddrs returns all the app's blocked module account
|
||||||
|
// addresses.
|
||||||
|
func (app *App) BlockedModuleAccountAddrs() map[string]bool {
|
||||||
|
modAccAddrs := app.ModuleAccountAddrs()
|
||||||
|
delete(modAccAddrs, authtypes.NewModuleAddress(govtypes.ModuleName).String())
|
||||||
|
|
||||||
|
return modAccAddrs
|
||||||
|
}
|
||||||
|
|
||||||
|
// LegacyAmino returns SimApp's amino codec.
|
||||||
|
//
|
||||||
|
// NOTE: This is solely to be used for testing purposes as it may be desirable
|
||||||
|
// for modules to register their own custom testing types.
|
||||||
|
func (app *App) LegacyAmino() *codec.LegacyAmino {
|
||||||
|
return app.cdc
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppCodec returns an app codec.
|
||||||
|
//
|
||||||
|
// NOTE: This is solely to be used for testing purposes as it may be desirable
|
||||||
|
// for modules to register their own custom testing types.
|
||||||
|
func (app *App) AppCodec() codec.Codec {
|
||||||
|
return app.appCodec
|
||||||
|
}
|
||||||
|
|
||||||
|
// InterfaceRegistry returns an InterfaceRegistry
|
||||||
|
func (app *App) InterfaceRegistry() types.InterfaceRegistry {
|
||||||
|
return app.interfaceRegistry
|
||||||
|
}
|
||||||
|
|
||||||
|
// TxConfig returns SimApp's TxConfig
|
||||||
|
func (app *App) TxConfig() client.TxConfig {
|
||||||
|
return app.txConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetKey returns the KVStoreKey for the provided store key.
|
||||||
|
//
|
||||||
|
// NOTE: This is solely to be used for testing purposes.
|
||||||
|
func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey {
|
||||||
|
return app.keys[storeKey]
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTKey returns the TransientStoreKey for the provided store key.
|
||||||
|
//
|
||||||
|
// NOTE: This is solely to be used for testing purposes.
|
||||||
|
func (app *App) GetTKey(storeKey string) *storetypes.TransientStoreKey {
|
||||||
|
return app.tkeys[storeKey]
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMemKey returns the MemStoreKey for the provided mem key.
|
||||||
|
//
|
||||||
|
// NOTE: This is solely used for testing purposes.
|
||||||
|
func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey {
|
||||||
|
return app.memKeys[storeKey]
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSubspace returns a param subspace for a given module name.
|
||||||
|
//
|
||||||
|
// NOTE: This is solely to be used for testing purposes.
|
||||||
|
func (app *App) GetSubspace(moduleName string) paramstypes.Subspace {
|
||||||
|
subspace, _ := app.ParamsKeeper.GetSubspace(moduleName)
|
||||||
|
return subspace
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterAPIRoutes registers all application module routes with the provided
|
||||||
|
// API server.
|
||||||
|
func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) {
|
||||||
|
clientCtx := apiSvr.ClientCtx
|
||||||
|
// Register new tx routes from grpc-gateway.
|
||||||
|
authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
|
||||||
|
// Register new tendermint queries routes from grpc-gateway.
|
||||||
|
tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
|
||||||
|
// Register node gRPC service for grpc-gateway.
|
||||||
|
nodeservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
|
||||||
|
|
||||||
|
// Register grpc-gateway routes for all modules.
|
||||||
|
ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
|
||||||
|
|
||||||
|
// register app's OpenAPI routes.
|
||||||
|
docs.RegisterOpenAPIService(Name, apiSvr.Router)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterTxService implements the Application.RegisterTxService method.
|
||||||
|
func (app *App) RegisterTxService(clientCtx client.Context) {
|
||||||
|
authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterTendermintService implements the Application.RegisterTendermintService method.
|
||||||
|
func (app *App) RegisterTendermintService(clientCtx client.Context) {
|
||||||
|
tmservice.RegisterTendermintService(
|
||||||
|
clientCtx,
|
||||||
|
app.BaseApp.GRPCQueryRouter(),
|
||||||
|
app.interfaceRegistry,
|
||||||
|
app.Query,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterNodeService implements the Application.RegisterNodeService method.
|
||||||
|
func (app *App) RegisterNodeService(clientCtx client.Context) {
|
||||||
|
nodeservice.RegisterNodeService(clientCtx, app.GRPCQueryRouter())
|
||||||
|
}
|
||||||
|
|
||||||
|
// initParamsKeeper init params keeper and its subspaces
|
||||||
|
func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey storetypes.StoreKey) paramskeeper.Keeper {
|
||||||
|
paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey)
|
||||||
|
|
||||||
|
paramsKeeper.Subspace(authtypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(banktypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(stakingtypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(minttypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(distrtypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(slashingtypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govv1.ParamKeyTable()) //nolint:staticcheck
|
||||||
|
paramsKeeper.Subspace(crisistypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(ibctransfertypes.ModuleName)
|
||||||
|
paramsKeeper.Subspace(ibcexported.ModuleName)
|
||||||
|
paramsKeeper.Subspace(icacontrollertypes.SubModuleName)
|
||||||
|
paramsKeeper.Subspace(icahosttypes.SubModuleName)
|
||||||
|
// this line is used by starport scaffolding # stargate/app/paramSubspace
|
||||||
|
|
||||||
|
return paramsKeeper
|
||||||
|
}
|
||||||
|
|
||||||
|
// SimulationManager returns the app SimulationManager
|
||||||
|
func (app *App) SimulationManager() *module.SimulationManager {
|
||||||
|
return app.sm
|
||||||
|
}
|
||||||
|
|
||||||
|
// ModuleManager returns the app ModuleManager
|
||||||
|
func (app *App) ModuleManager() *module.Manager {
|
||||||
|
return app.mm
|
||||||
|
}
|
35
app/encoding.go
Normal file
35
app/encoding.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/std"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth/tx"
|
||||||
|
|
||||||
|
"planetmint-go/app/params"
|
||||||
|
)
|
||||||
|
|
||||||
|
// makeEncodingConfig creates an EncodingConfig for an amino based test configuration.
|
||||||
|
func makeEncodingConfig() params.EncodingConfig {
|
||||||
|
amino := codec.NewLegacyAmino()
|
||||||
|
interfaceRegistry := types.NewInterfaceRegistry()
|
||||||
|
marshaler := codec.NewProtoCodec(interfaceRegistry)
|
||||||
|
txCfg := tx.NewTxConfig(marshaler, tx.DefaultSignModes)
|
||||||
|
|
||||||
|
return params.EncodingConfig{
|
||||||
|
InterfaceRegistry: interfaceRegistry,
|
||||||
|
Marshaler: marshaler,
|
||||||
|
TxConfig: txCfg,
|
||||||
|
Amino: amino,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MakeEncodingConfig creates an EncodingConfig for testing
|
||||||
|
func MakeEncodingConfig() params.EncodingConfig {
|
||||||
|
encodingConfig := makeEncodingConfig()
|
||||||
|
std.RegisterLegacyAminoCodec(encodingConfig.Amino)
|
||||||
|
std.RegisterInterfaces(encodingConfig.InterfaceRegistry)
|
||||||
|
ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino)
|
||||||
|
ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry)
|
||||||
|
return encodingConfig
|
||||||
|
}
|
204
app/export.go
Normal file
204
app/export.go
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
|
||||||
|
tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
|
||||||
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/staking"
|
||||||
|
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ExportAppStateAndValidators exports the state of the application for a genesis
|
||||||
|
// file.
|
||||||
|
func (app *App) ExportAppStateAndValidators(
|
||||||
|
forZeroHeight bool,
|
||||||
|
jailAllowedAddrs []string,
|
||||||
|
modulesToExport []string,
|
||||||
|
) (servertypes.ExportedApp, error) {
|
||||||
|
// as if they could withdraw from the start of the next block
|
||||||
|
ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()})
|
||||||
|
|
||||||
|
// We export at last height + 1, because that's the height at which
|
||||||
|
// Tendermint will start InitChain.
|
||||||
|
height := app.LastBlockHeight() + 1
|
||||||
|
if forZeroHeight {
|
||||||
|
height = 0
|
||||||
|
app.prepForZeroHeightGenesis(ctx, jailAllowedAddrs)
|
||||||
|
}
|
||||||
|
|
||||||
|
genState := app.mm.ExportGenesisForModules(ctx, app.appCodec, modulesToExport)
|
||||||
|
appState, err := json.MarshalIndent(genState, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
return servertypes.ExportedApp{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
validators, err := staking.WriteValidators(ctx, app.StakingKeeper)
|
||||||
|
return servertypes.ExportedApp{
|
||||||
|
AppState: appState,
|
||||||
|
Validators: validators,
|
||||||
|
Height: height,
|
||||||
|
ConsensusParams: app.BaseApp.GetConsensusParams(ctx),
|
||||||
|
}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepForZeroHeightGenesis prepares for a fresh genesis
|
||||||
|
//
|
||||||
|
// NOTE zero height genesis is a temporary feature which will be deprecated
|
||||||
|
// in favour of export at a block height
|
||||||
|
func (app *App) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs []string) {
|
||||||
|
applyAllowedAddrs := false
|
||||||
|
|
||||||
|
// check if there is a allowed address list
|
||||||
|
if len(jailAllowedAddrs) > 0 {
|
||||||
|
applyAllowedAddrs = true
|
||||||
|
}
|
||||||
|
|
||||||
|
allowedAddrsMap := make(map[string]bool)
|
||||||
|
|
||||||
|
for _, addr := range jailAllowedAddrs {
|
||||||
|
_, err := sdk.ValAddressFromBech32(addr)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
allowedAddrsMap[addr] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Just to be safe, assert the invariants on current state. */
|
||||||
|
app.CrisisKeeper.AssertInvariants(ctx)
|
||||||
|
|
||||||
|
/* Handle fee distribution state. */
|
||||||
|
|
||||||
|
// withdraw all validator commission
|
||||||
|
app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) {
|
||||||
|
_, _ = app.DistrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator())
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
// withdraw all delegator rewards
|
||||||
|
dels := app.StakingKeeper.GetAllDelegations(ctx)
|
||||||
|
for _, delegation := range dels {
|
||||||
|
valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
delAddr := sdk.MustAccAddressFromBech32(delegation.DelegatorAddress)
|
||||||
|
|
||||||
|
_, _ = app.DistrKeeper.WithdrawDelegationRewards(ctx, delAddr, valAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear validator slash events
|
||||||
|
app.DistrKeeper.DeleteAllValidatorSlashEvents(ctx)
|
||||||
|
|
||||||
|
// clear validator historical rewards
|
||||||
|
app.DistrKeeper.DeleteAllValidatorHistoricalRewards(ctx)
|
||||||
|
|
||||||
|
// set context height to zero
|
||||||
|
height := ctx.BlockHeight()
|
||||||
|
ctx = ctx.WithBlockHeight(0)
|
||||||
|
|
||||||
|
// reinitialize all validators
|
||||||
|
app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) {
|
||||||
|
// donate any unwithdrawn outstanding reward fraction tokens to the community pool
|
||||||
|
scraps := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator())
|
||||||
|
feePool := app.DistrKeeper.GetFeePool(ctx)
|
||||||
|
feePool.CommunityPool = feePool.CommunityPool.Add(scraps...)
|
||||||
|
app.DistrKeeper.SetFeePool(ctx, feePool)
|
||||||
|
|
||||||
|
if err := app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
// reinitialize all delegations
|
||||||
|
for _, del := range dels {
|
||||||
|
valAddr, err := sdk.ValAddressFromBech32(del.ValidatorAddress)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
delAddr := sdk.MustAccAddressFromBech32(del.DelegatorAddress)
|
||||||
|
|
||||||
|
if err := app.DistrKeeper.Hooks().BeforeDelegationCreated(ctx, delAddr, valAddr); err != nil {
|
||||||
|
// never called as BeforeDelegationCreated always returns nil
|
||||||
|
panic(fmt.Errorf("error while incrementing period: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := app.DistrKeeper.Hooks().AfterDelegationModified(ctx, delAddr, valAddr); err != nil {
|
||||||
|
// never called as AfterDelegationModified always returns nil
|
||||||
|
panic(fmt.Errorf("error while creating a new delegation period record: %w", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset context height
|
||||||
|
ctx = ctx.WithBlockHeight(height)
|
||||||
|
|
||||||
|
/* Handle staking state. */
|
||||||
|
|
||||||
|
// iterate through redelegations, reset creation height
|
||||||
|
app.StakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) {
|
||||||
|
for i := range red.Entries {
|
||||||
|
red.Entries[i].CreationHeight = 0
|
||||||
|
}
|
||||||
|
app.StakingKeeper.SetRedelegation(ctx, red)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
// iterate through unbonding delegations, reset creation height
|
||||||
|
app.StakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) {
|
||||||
|
for i := range ubd.Entries {
|
||||||
|
ubd.Entries[i].CreationHeight = 0
|
||||||
|
}
|
||||||
|
app.StakingKeeper.SetUnbondingDelegation(ctx, ubd)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
// Iterate through validators by power descending, reset bond heights, and
|
||||||
|
// update bond intra-tx counters.
|
||||||
|
store := ctx.KVStore(app.GetKey(stakingtypes.StoreKey))
|
||||||
|
iter := sdk.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey)
|
||||||
|
counter := int16(0)
|
||||||
|
|
||||||
|
for ; iter.Valid(); iter.Next() {
|
||||||
|
addr := sdk.ValAddress(stakingtypes.AddressFromValidatorsKey(iter.Key()))
|
||||||
|
validator, found := app.StakingKeeper.GetValidator(ctx, addr)
|
||||||
|
if !found {
|
||||||
|
panic("expected validator, not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
validator.UnbondingHeight = 0
|
||||||
|
if applyAllowedAddrs && !allowedAddrsMap[addr.String()] {
|
||||||
|
validator.Jailed = true
|
||||||
|
}
|
||||||
|
|
||||||
|
app.StakingKeeper.SetValidator(ctx, validator)
|
||||||
|
counter++
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := iter.Close(); err != nil {
|
||||||
|
app.Logger().Error("error while closing the key-value store reverse prefix iterator: ", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle slashing state. */
|
||||||
|
|
||||||
|
// reset start height on signing infos
|
||||||
|
app.SlashingKeeper.IterateValidatorSigningInfos(
|
||||||
|
ctx,
|
||||||
|
func(addr sdk.ConsAddress, info slashingtypes.ValidatorSigningInfo) (stop bool) {
|
||||||
|
info.StartHeight = 0
|
||||||
|
app.SlashingKeeper.SetValidatorSigningInfo(ctx, addr, info)
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
21
app/genesis.go
Normal file
21
app/genesis.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The genesis state of the blockchain is represented here as a map of raw json
|
||||||
|
// messages key'd by a identifier string.
|
||||||
|
// The identifier is used to determine which module genesis information belongs
|
||||||
|
// to so it may be appropriately routed during init chain.
|
||||||
|
// Within this application default genesis information is retrieved from
|
||||||
|
// the ModuleBasicManager which populates json from each BasicModule
|
||||||
|
// object provided to it during init.
|
||||||
|
type GenesisState map[string]json.RawMessage
|
||||||
|
|
||||||
|
// NewDefaultGenesisState generates the default state for the application.
|
||||||
|
func NewDefaultGenesisState(cdc codec.JSONCodec) GenesisState {
|
||||||
|
return ModuleBasics.DefaultGenesis(cdc)
|
||||||
|
}
|
16
app/params/encoding.go
Normal file
16
app/params/encoding.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package params
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EncodingConfig specifies the concrete encoding types to use for a given app.
|
||||||
|
// This is provided for compatibility between protobuf and amino implementations.
|
||||||
|
type EncodingConfig struct {
|
||||||
|
InterfaceRegistry types.InterfaceRegistry
|
||||||
|
Marshaler codec.Codec
|
||||||
|
TxConfig client.TxConfig
|
||||||
|
Amino *codec.LegacyAmino
|
||||||
|
}
|
501
app/simulation_test.go
Normal file
501
app/simulation_test.go
Normal file
@ -0,0 +1,501 @@
|
|||||||
|
package app_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"os"
|
||||||
|
"runtime/debug"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
dbm "github.com/cometbft/cometbft-db"
|
||||||
|
abci "github.com/cometbft/cometbft/abci/types"
|
||||||
|
"github.com/cometbft/cometbft/libs/log"
|
||||||
|
tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||||
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
|
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||||
|
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
simulationtypes "github.com/cosmos/cosmos-sdk/types/simulation"
|
||||||
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
|
authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
|
||||||
|
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||||
|
capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
|
||||||
|
distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
|
||||||
|
evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types"
|
||||||
|
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
|
||||||
|
minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
|
||||||
|
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/simulation"
|
||||||
|
simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli"
|
||||||
|
slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
|
||||||
|
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"planetmint-go/app"
|
||||||
|
)
|
||||||
|
|
||||||
|
type storeKeysPrefixes struct {
|
||||||
|
A storetypes.StoreKey
|
||||||
|
B storetypes.StoreKey
|
||||||
|
Prefixes [][]byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get flags every time the simulator is run
|
||||||
|
func init() {
|
||||||
|
simcli.GetSimulatorFlags()
|
||||||
|
}
|
||||||
|
|
||||||
|
// fauxMerkleModeOpt returns a BaseApp option to use a dbStoreAdapter instead of
|
||||||
|
// an IAVLStore for faster simulation speed.
|
||||||
|
func fauxMerkleModeOpt(bapp *baseapp.BaseApp) {
|
||||||
|
bapp.SetFauxMerkleMode()
|
||||||
|
}
|
||||||
|
|
||||||
|
// BenchmarkSimulation run the chain simulation
|
||||||
|
// Running using starport command:
|
||||||
|
// `starport chain simulate -v --numBlocks 200 --blockSize 50`
|
||||||
|
// Running as go benchmark test:
|
||||||
|
// `go test -benchmem -run=^$ -bench ^BenchmarkSimulation ./app -NumBlocks=200 -BlockSize 50 -Commit=true -Verbose=true -Enabled=true`
|
||||||
|
func BenchmarkSimulation(b *testing.B) {
|
||||||
|
simcli.FlagSeedValue = time.Now().Unix()
|
||||||
|
simcli.FlagVerboseValue = true
|
||||||
|
simcli.FlagCommitValue = true
|
||||||
|
simcli.FlagEnabledValue = true
|
||||||
|
|
||||||
|
config := simcli.NewConfigFromFlags()
|
||||||
|
config.ChainID = "mars-simapp"
|
||||||
|
db, dir, logger, _, err := simtestutil.SetupSimulation(
|
||||||
|
config,
|
||||||
|
"leveldb-bApp-sim",
|
||||||
|
"Simulation",
|
||||||
|
simcli.FlagVerboseValue,
|
||||||
|
simcli.FlagEnabledValue,
|
||||||
|
)
|
||||||
|
require.NoError(b, err, "simulation setup failed")
|
||||||
|
|
||||||
|
b.Cleanup(func() {
|
||||||
|
require.NoError(b, db.Close())
|
||||||
|
require.NoError(b, os.RemoveAll(dir))
|
||||||
|
})
|
||||||
|
|
||||||
|
appOptions := make(simtestutil.AppOptionsMap, 0)
|
||||||
|
appOptions[flags.FlagHome] = app.DefaultNodeHome
|
||||||
|
appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue
|
||||||
|
|
||||||
|
bApp := app.New(
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
0,
|
||||||
|
app.MakeEncodingConfig(),
|
||||||
|
appOptions,
|
||||||
|
baseapp.SetChainID(config.ChainID),
|
||||||
|
)
|
||||||
|
require.Equal(b, app.Name, bApp.Name())
|
||||||
|
|
||||||
|
// run randomized simulation
|
||||||
|
_, simParams, simErr := simulation.SimulateFromSeed(
|
||||||
|
b,
|
||||||
|
os.Stdout,
|
||||||
|
bApp.BaseApp,
|
||||||
|
simtestutil.AppStateFn(
|
||||||
|
bApp.AppCodec(),
|
||||||
|
bApp.SimulationManager(),
|
||||||
|
app.NewDefaultGenesisState(bApp.AppCodec()),
|
||||||
|
),
|
||||||
|
simulationtypes.RandomAccounts,
|
||||||
|
simtestutil.SimulationOperations(bApp, bApp.AppCodec(), config),
|
||||||
|
bApp.ModuleAccountAddrs(),
|
||||||
|
config,
|
||||||
|
bApp.AppCodec(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// export state and simParams before the simulation error is checked
|
||||||
|
err = simtestutil.CheckExportSimulation(bApp, config, simParams)
|
||||||
|
require.NoError(b, err)
|
||||||
|
require.NoError(b, simErr)
|
||||||
|
|
||||||
|
if config.Commit {
|
||||||
|
simtestutil.PrintStats(db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppStateDeterminism(t *testing.T) {
|
||||||
|
if !simcli.FlagEnabledValue {
|
||||||
|
t.Skip("skipping application simulation")
|
||||||
|
}
|
||||||
|
|
||||||
|
config := simcli.NewConfigFromFlags()
|
||||||
|
config.InitialBlockHeight = 1
|
||||||
|
config.ExportParamsPath = ""
|
||||||
|
config.OnOperation = true
|
||||||
|
config.AllInvariants = true
|
||||||
|
|
||||||
|
var (
|
||||||
|
r = rand.New(rand.NewSource(time.Now().Unix()))
|
||||||
|
numSeeds = 3
|
||||||
|
numTimesToRunPerSeed = 5
|
||||||
|
appHashList = make([]json.RawMessage, numTimesToRunPerSeed)
|
||||||
|
appOptions = make(simtestutil.AppOptionsMap, 0)
|
||||||
|
)
|
||||||
|
appOptions[flags.FlagHome] = app.DefaultNodeHome
|
||||||
|
appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue
|
||||||
|
|
||||||
|
for i := 0; i < numSeeds; i++ {
|
||||||
|
config.Seed = r.Int63()
|
||||||
|
|
||||||
|
for j := 0; j < numTimesToRunPerSeed; j++ {
|
||||||
|
var logger log.Logger
|
||||||
|
if simcli.FlagVerboseValue {
|
||||||
|
logger = log.TestingLogger()
|
||||||
|
} else {
|
||||||
|
logger = log.NewNopLogger()
|
||||||
|
}
|
||||||
|
chainID := fmt.Sprintf("chain-id-%d-%d", i, j)
|
||||||
|
config.ChainID = chainID
|
||||||
|
|
||||||
|
db := dbm.NewMemDB()
|
||||||
|
bApp := app.New(
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
simcli.FlagPeriodValue,
|
||||||
|
app.MakeEncodingConfig(),
|
||||||
|
appOptions,
|
||||||
|
fauxMerkleModeOpt,
|
||||||
|
baseapp.SetChainID(chainID),
|
||||||
|
)
|
||||||
|
|
||||||
|
fmt.Printf(
|
||||||
|
"running non-determinism simulation; seed %d: %d/%d, attempt: %d/%d\n",
|
||||||
|
config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
|
||||||
|
)
|
||||||
|
|
||||||
|
_, _, err := simulation.SimulateFromSeed(
|
||||||
|
t,
|
||||||
|
os.Stdout,
|
||||||
|
bApp.BaseApp,
|
||||||
|
simtestutil.AppStateFn(
|
||||||
|
bApp.AppCodec(),
|
||||||
|
bApp.SimulationManager(),
|
||||||
|
app.NewDefaultGenesisState(bApp.AppCodec()),
|
||||||
|
),
|
||||||
|
simulationtypes.RandomAccounts,
|
||||||
|
simtestutil.SimulationOperations(bApp, bApp.AppCodec(), config),
|
||||||
|
bApp.ModuleAccountAddrs(),
|
||||||
|
config,
|
||||||
|
bApp.AppCodec(),
|
||||||
|
)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if config.Commit {
|
||||||
|
simtestutil.PrintStats(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
appHash := bApp.LastCommitID().Hash
|
||||||
|
appHashList[j] = appHash
|
||||||
|
|
||||||
|
if j != 0 {
|
||||||
|
require.Equal(
|
||||||
|
t, string(appHashList[0]), string(appHashList[j]),
|
||||||
|
"non-determinism in seed %d: %d/%d, attempt: %d/%d\n", config.Seed, i+1, numSeeds, j+1, numTimesToRunPerSeed,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppImportExport(t *testing.T) {
|
||||||
|
config := simcli.NewConfigFromFlags()
|
||||||
|
config.ChainID = "mars-simapp-import"
|
||||||
|
|
||||||
|
db, dir, logger, skip, err := simtestutil.SetupSimulation(
|
||||||
|
config,
|
||||||
|
"leveldb-app-sim",
|
||||||
|
"Simulation",
|
||||||
|
simcli.FlagVerboseValue,
|
||||||
|
simcli.FlagEnabledValue,
|
||||||
|
)
|
||||||
|
if skip {
|
||||||
|
t.Skip("skipping application import/export simulation")
|
||||||
|
}
|
||||||
|
require.NoError(t, err, "simulation setup failed")
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
require.NoError(t, db.Close())
|
||||||
|
require.NoError(t, os.RemoveAll(dir))
|
||||||
|
}()
|
||||||
|
|
||||||
|
appOptions := make(simtestutil.AppOptionsMap, 0)
|
||||||
|
appOptions[flags.FlagHome] = app.DefaultNodeHome
|
||||||
|
appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue
|
||||||
|
|
||||||
|
bApp := app.New(
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
0,
|
||||||
|
app.MakeEncodingConfig(),
|
||||||
|
appOptions,
|
||||||
|
baseapp.SetChainID(config.ChainID),
|
||||||
|
)
|
||||||
|
require.Equal(t, app.Name, bApp.Name())
|
||||||
|
|
||||||
|
// run randomized simulation
|
||||||
|
_, simParams, simErr := simulation.SimulateFromSeed(
|
||||||
|
t,
|
||||||
|
os.Stdout,
|
||||||
|
bApp.BaseApp,
|
||||||
|
simtestutil.AppStateFn(
|
||||||
|
bApp.AppCodec(),
|
||||||
|
bApp.SimulationManager(),
|
||||||
|
app.NewDefaultGenesisState(bApp.AppCodec()),
|
||||||
|
),
|
||||||
|
simulationtypes.RandomAccounts,
|
||||||
|
simtestutil.SimulationOperations(bApp, bApp.AppCodec(), config),
|
||||||
|
bApp.BlockedModuleAccountAddrs(),
|
||||||
|
config,
|
||||||
|
bApp.AppCodec(),
|
||||||
|
)
|
||||||
|
require.NoError(t, simErr)
|
||||||
|
|
||||||
|
// export state and simParams before the simulation error is checked
|
||||||
|
err = simtestutil.CheckExportSimulation(bApp, config, simParams)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if config.Commit {
|
||||||
|
simtestutil.PrintStats(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("exporting genesis...\n")
|
||||||
|
|
||||||
|
exported, err := bApp.ExportAppStateAndValidators(false, []string{}, []string{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
fmt.Printf("importing genesis...\n")
|
||||||
|
|
||||||
|
newDB, newDir, _, _, err := simtestutil.SetupSimulation(
|
||||||
|
config,
|
||||||
|
"leveldb-app-sim-2",
|
||||||
|
"Simulation-2",
|
||||||
|
simcli.FlagVerboseValue,
|
||||||
|
simcli.FlagEnabledValue,
|
||||||
|
)
|
||||||
|
require.NoError(t, err, "simulation setup failed")
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
require.NoError(t, newDB.Close())
|
||||||
|
require.NoError(t, os.RemoveAll(newDir))
|
||||||
|
}()
|
||||||
|
|
||||||
|
newApp := app.New(
|
||||||
|
log.NewNopLogger(),
|
||||||
|
newDB,
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
0,
|
||||||
|
app.MakeEncodingConfig(),
|
||||||
|
appOptions,
|
||||||
|
baseapp.SetChainID(config.ChainID),
|
||||||
|
)
|
||||||
|
require.Equal(t, app.Name, bApp.Name())
|
||||||
|
|
||||||
|
var genesisState app.GenesisState
|
||||||
|
err = json.Unmarshal(exported.AppState, &genesisState)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
err := fmt.Sprintf("%v", r)
|
||||||
|
if !strings.Contains(err, "validator set is empty after InitGenesis") {
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
logger.Info("Skipping simulation as all validators have been unbonded")
|
||||||
|
logger.Info("err", err, "stacktrace", string(debug.Stack()))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
ctxA := bApp.NewContext(true, tmproto.Header{Height: bApp.LastBlockHeight()})
|
||||||
|
ctxB := newApp.NewContext(true, tmproto.Header{Height: bApp.LastBlockHeight()})
|
||||||
|
newApp.ModuleManager().InitGenesis(ctxB, bApp.AppCodec(), genesisState)
|
||||||
|
newApp.StoreConsensusParams(ctxB, exported.ConsensusParams)
|
||||||
|
|
||||||
|
fmt.Printf("comparing stores...\n")
|
||||||
|
|
||||||
|
storeKeysPrefixes := []storeKeysPrefixes{
|
||||||
|
{bApp.GetKey(authtypes.StoreKey), newApp.GetKey(authtypes.StoreKey), [][]byte{}},
|
||||||
|
{
|
||||||
|
bApp.GetKey(stakingtypes.StoreKey), newApp.GetKey(stakingtypes.StoreKey),
|
||||||
|
[][]byte{
|
||||||
|
stakingtypes.UnbondingQueueKey, stakingtypes.RedelegationQueueKey, stakingtypes.ValidatorQueueKey,
|
||||||
|
stakingtypes.HistoricalInfoKey, stakingtypes.UnbondingIDKey, stakingtypes.UnbondingIndexKey, stakingtypes.UnbondingTypeKey, stakingtypes.ValidatorUpdatesKey,
|
||||||
|
},
|
||||||
|
}, // ordering may change but it doesn't matter
|
||||||
|
{bApp.GetKey(slashingtypes.StoreKey), newApp.GetKey(slashingtypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(minttypes.StoreKey), newApp.GetKey(minttypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(distrtypes.StoreKey), newApp.GetKey(distrtypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(banktypes.StoreKey), newApp.GetKey(banktypes.StoreKey), [][]byte{banktypes.BalancesPrefix}},
|
||||||
|
{bApp.GetKey(paramstypes.StoreKey), newApp.GetKey(paramstypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(govtypes.StoreKey), newApp.GetKey(govtypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(evidencetypes.StoreKey), newApp.GetKey(evidencetypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(capabilitytypes.StoreKey), newApp.GetKey(capabilitytypes.StoreKey), [][]byte{}},
|
||||||
|
{bApp.GetKey(authzkeeper.StoreKey), newApp.GetKey(authzkeeper.StoreKey), [][]byte{authzkeeper.GrantKey, authzkeeper.GrantQueuePrefix}},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, skp := range storeKeysPrefixes {
|
||||||
|
storeA := ctxA.KVStore(skp.A)
|
||||||
|
storeB := ctxB.KVStore(skp.B)
|
||||||
|
|
||||||
|
failedKVAs, failedKVBs := sdk.DiffKVStores(storeA, storeB, skp.Prefixes)
|
||||||
|
require.Equal(t, len(failedKVAs), len(failedKVBs), "unequal sets of key-values to compare")
|
||||||
|
|
||||||
|
fmt.Printf("compared %d different key/value pairs between %s and %s\n", len(failedKVAs), skp.A, skp.B)
|
||||||
|
require.Equal(t, 0, len(failedKVAs), simtestutil.GetSimulationLog(skp.A.Name(), bApp.SimulationManager().StoreDecoders, failedKVAs, failedKVBs))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAppSimulationAfterImport(t *testing.T) {
|
||||||
|
config := simcli.NewConfigFromFlags()
|
||||||
|
config.ChainID = "mars-simapp-after-import"
|
||||||
|
|
||||||
|
db, dir, logger, skip, err := simtestutil.SetupSimulation(
|
||||||
|
config,
|
||||||
|
"leveldb-app-sim",
|
||||||
|
"Simulation",
|
||||||
|
simcli.FlagVerboseValue,
|
||||||
|
simcli.FlagEnabledValue,
|
||||||
|
)
|
||||||
|
if skip {
|
||||||
|
t.Skip("skipping application simulation after import")
|
||||||
|
}
|
||||||
|
require.NoError(t, err, "simulation setup failed")
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
require.NoError(t, db.Close())
|
||||||
|
require.NoError(t, os.RemoveAll(dir))
|
||||||
|
}()
|
||||||
|
|
||||||
|
appOptions := make(simtestutil.AppOptionsMap, 0)
|
||||||
|
appOptions[flags.FlagHome] = app.DefaultNodeHome
|
||||||
|
appOptions[server.FlagInvCheckPeriod] = simcli.FlagPeriodValue
|
||||||
|
|
||||||
|
bApp := app.New(
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
0,
|
||||||
|
app.MakeEncodingConfig(),
|
||||||
|
appOptions,
|
||||||
|
fauxMerkleModeOpt,
|
||||||
|
baseapp.SetChainID(config.ChainID),
|
||||||
|
)
|
||||||
|
require.Equal(t, app.Name, bApp.Name())
|
||||||
|
|
||||||
|
// run randomized simulation
|
||||||
|
stopEarly, simParams, simErr := simulation.SimulateFromSeed(
|
||||||
|
t,
|
||||||
|
os.Stdout,
|
||||||
|
bApp.BaseApp,
|
||||||
|
simtestutil.AppStateFn(
|
||||||
|
bApp.AppCodec(),
|
||||||
|
bApp.SimulationManager(),
|
||||||
|
app.NewDefaultGenesisState(bApp.AppCodec()),
|
||||||
|
),
|
||||||
|
simulationtypes.RandomAccounts,
|
||||||
|
simtestutil.SimulationOperations(bApp, bApp.AppCodec(), config),
|
||||||
|
bApp.BlockedModuleAccountAddrs(),
|
||||||
|
config,
|
||||||
|
bApp.AppCodec(),
|
||||||
|
)
|
||||||
|
require.NoError(t, simErr)
|
||||||
|
|
||||||
|
// export state and simParams before the simulation error is checked
|
||||||
|
err = simtestutil.CheckExportSimulation(bApp, config, simParams)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if config.Commit {
|
||||||
|
simtestutil.PrintStats(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
if stopEarly {
|
||||||
|
fmt.Println("can't export or import a zero-validator genesis, exiting test...")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("exporting genesis...\n")
|
||||||
|
|
||||||
|
exported, err := bApp.ExportAppStateAndValidators(true, []string{}, []string{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
fmt.Printf("importing genesis...\n")
|
||||||
|
|
||||||
|
newDB, newDir, _, _, err := simtestutil.SetupSimulation(
|
||||||
|
config,
|
||||||
|
"leveldb-app-sim-2",
|
||||||
|
"Simulation-2",
|
||||||
|
simcli.FlagVerboseValue,
|
||||||
|
simcli.FlagEnabledValue,
|
||||||
|
)
|
||||||
|
require.NoError(t, err, "simulation setup failed")
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
require.NoError(t, newDB.Close())
|
||||||
|
require.NoError(t, os.RemoveAll(newDir))
|
||||||
|
}()
|
||||||
|
|
||||||
|
newApp := app.New(
|
||||||
|
log.NewNopLogger(),
|
||||||
|
newDB,
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
0,
|
||||||
|
app.MakeEncodingConfig(),
|
||||||
|
appOptions,
|
||||||
|
fauxMerkleModeOpt,
|
||||||
|
baseapp.SetChainID(config.ChainID),
|
||||||
|
)
|
||||||
|
require.Equal(t, app.Name, bApp.Name())
|
||||||
|
|
||||||
|
newApp.InitChain(abci.RequestInitChain{
|
||||||
|
ChainId: config.ChainID,
|
||||||
|
AppStateBytes: exported.AppState,
|
||||||
|
})
|
||||||
|
|
||||||
|
_, _, err = simulation.SimulateFromSeed(
|
||||||
|
t,
|
||||||
|
os.Stdout,
|
||||||
|
newApp.BaseApp,
|
||||||
|
simtestutil.AppStateFn(
|
||||||
|
bApp.AppCodec(),
|
||||||
|
bApp.SimulationManager(),
|
||||||
|
app.NewDefaultGenesisState(bApp.AppCodec()),
|
||||||
|
),
|
||||||
|
simulationtypes.RandomAccounts,
|
||||||
|
simtestutil.SimulationOperations(newApp, newApp.AppCodec(), config),
|
||||||
|
newApp.BlockedModuleAccountAddrs(),
|
||||||
|
config,
|
||||||
|
bApp.AppCodec(),
|
||||||
|
)
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
23
cmd/planetmint-god/cmd/config.go
Normal file
23
cmd/planetmint-god/cmd/config.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
|
"planetmint-go/app"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initSDKConfig() {
|
||||||
|
// Set prefixes
|
||||||
|
accountPubKeyPrefix := app.AccountAddressPrefix + "pub"
|
||||||
|
validatorAddressPrefix := app.AccountAddressPrefix + "valoper"
|
||||||
|
validatorPubKeyPrefix := app.AccountAddressPrefix + "valoperpub"
|
||||||
|
consNodeAddressPrefix := app.AccountAddressPrefix + "valcons"
|
||||||
|
consNodePubKeyPrefix := app.AccountAddressPrefix + "valconspub"
|
||||||
|
|
||||||
|
// Set and seal config
|
||||||
|
config := sdk.GetConfig()
|
||||||
|
config.SetBech32PrefixForAccount(app.AccountAddressPrefix, accountPubKeyPrefix)
|
||||||
|
config.SetBech32PrefixForValidator(validatorAddressPrefix, validatorPubKeyPrefix)
|
||||||
|
config.SetBech32PrefixForConsensusNode(consNodeAddressPrefix, consNodePubKeyPrefix)
|
||||||
|
config.Seal()
|
||||||
|
}
|
192
cmd/planetmint-god/cmd/genaccounts.go
Normal file
192
cmd/planetmint-god/cmd/genaccounts.go
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||||
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
|
authvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
|
||||||
|
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/genutil"
|
||||||
|
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
flagVestingStart = "vesting-start-time"
|
||||||
|
flagVestingEnd = "vesting-end-time"
|
||||||
|
flagVestingAmt = "vesting-amount"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddGenesisAccountCmd returns add-genesis-account cobra Command.
|
||||||
|
func AddGenesisAccountCmd(defaultNodeHome string) *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "add-genesis-account [address_or_key_name] [coin][,[coin]]",
|
||||||
|
Short: "Add a genesis account to genesis.json",
|
||||||
|
Long: `Add a genesis account to genesis.json. The provided account must specify
|
||||||
|
the account address or key name and a list of initial coins. If a key name is given,
|
||||||
|
the address will be looked up in the local Keybase. The list of initial tokens must
|
||||||
|
contain valid denominations. Accounts may optionally be supplied with vesting parameters.
|
||||||
|
`,
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
clientCtx := client.GetClientContextFromCmd(cmd)
|
||||||
|
cdc := clientCtx.Codec
|
||||||
|
|
||||||
|
serverCtx := server.GetServerContextFromCmd(cmd)
|
||||||
|
config := serverCtx.Config
|
||||||
|
|
||||||
|
config.SetRoot(clientCtx.HomeDir)
|
||||||
|
|
||||||
|
coins, err := sdk.ParseCoinsNormalized(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to parse coins: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
addr, err := sdk.AccAddressFromBech32(args[0])
|
||||||
|
if err != nil {
|
||||||
|
inBuf := bufio.NewReader(cmd.InOrStdin())
|
||||||
|
keyringBackend, err := cmd.Flags().GetString(flags.FlagKeyringBackend)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// attempt to lookup address from Keybase if no address was provided
|
||||||
|
kb, err := keyring.New(sdk.KeyringServiceName(), keyringBackend, clientCtx.HomeDir, inBuf, cdc)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
info, err := kb.Key(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get address from Keybase: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
addr, err = info.GetAddress()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get address from Keybase: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vestingStart, err := cmd.Flags().GetInt64(flagVestingStart)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
vestingEnd, err := cmd.Flags().GetInt64(flagVestingEnd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
vestingAmtStr, err := cmd.Flags().GetString(flagVestingAmt)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
vestingAmt, err := sdk.ParseCoinsNormalized(vestingAmtStr)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to parse vesting amount: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// create concrete account type based on input parameters
|
||||||
|
var genAccount authtypes.GenesisAccount
|
||||||
|
|
||||||
|
balances := banktypes.Balance{Address: addr.String(), Coins: coins.Sort()}
|
||||||
|
baseAccount := authtypes.NewBaseAccount(addr, nil, 0, 0)
|
||||||
|
|
||||||
|
if !vestingAmt.IsZero() {
|
||||||
|
baseVestingAccount := authvesting.NewBaseVestingAccount(baseAccount, vestingAmt.Sort(), vestingEnd)
|
||||||
|
|
||||||
|
if (balances.Coins.IsZero() && !baseVestingAccount.OriginalVesting.IsZero()) ||
|
||||||
|
baseVestingAccount.OriginalVesting.IsAnyGT(balances.Coins) {
|
||||||
|
return errors.New("vesting amount cannot be greater than total amount")
|
||||||
|
}
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case vestingStart != 0 && vestingEnd != 0:
|
||||||
|
genAccount = authvesting.NewContinuousVestingAccountRaw(baseVestingAccount, vestingStart)
|
||||||
|
|
||||||
|
case vestingEnd != 0:
|
||||||
|
genAccount = authvesting.NewDelayedVestingAccountRaw(baseVestingAccount)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return errors.New("invalid vesting parameters; must supply start and end time or end time")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
genAccount = baseAccount
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := genAccount.Validate(); err != nil {
|
||||||
|
return fmt.Errorf("failed to validate new genesis account: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
genFile := config.GenesisFile()
|
||||||
|
appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to unmarshal genesis state: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
authGenState := authtypes.GetGenesisStateFromAppState(cdc, appState)
|
||||||
|
|
||||||
|
accs, err := authtypes.UnpackAccounts(authGenState.Accounts)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to get accounts from any: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if accs.Contains(addr) {
|
||||||
|
return fmt.Errorf("cannot add account at existing address %s", addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the new account to the set of genesis accounts and sanitize the
|
||||||
|
// accounts afterwards.
|
||||||
|
accs = append(accs, genAccount)
|
||||||
|
accs = authtypes.SanitizeGenesisAccounts(accs)
|
||||||
|
|
||||||
|
genAccs, err := authtypes.PackAccounts(accs)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to convert accounts into any's: %w", err)
|
||||||
|
}
|
||||||
|
authGenState.Accounts = genAccs
|
||||||
|
|
||||||
|
authGenStateBz, err := cdc.MarshalJSON(&authGenState)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to marshal auth genesis state: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
appState[authtypes.ModuleName] = authGenStateBz
|
||||||
|
|
||||||
|
bankGenState := banktypes.GetGenesisStateFromAppState(cdc, appState)
|
||||||
|
bankGenState.Balances = append(bankGenState.Balances, balances)
|
||||||
|
bankGenState.Balances = banktypes.SanitizeGenesisBalances(bankGenState.Balances)
|
||||||
|
|
||||||
|
bankGenStateBz, err := cdc.MarshalJSON(bankGenState)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to marshal bank genesis state: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
appState[banktypes.ModuleName] = bankGenStateBz
|
||||||
|
|
||||||
|
appStateJSON, err := json.Marshal(appState)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to marshal application genesis state: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
genDoc.AppState = appStateJSON
|
||||||
|
return genutil.ExportGenesisFile(genDoc, genFile)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|kwallet|pass|test)")
|
||||||
|
cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory")
|
||||||
|
cmd.Flags().String(flagVestingAmt, "", "amount of coins for vesting accounts")
|
||||||
|
cmd.Flags().Int64(flagVestingStart, 0, "schedule start time (unix epoch) for vesting accounts")
|
||||||
|
cmd.Flags().Int64(flagVestingEnd, 0, "schedule end time (unix epoch) for vesting accounts")
|
||||||
|
flags.AddQueryFlagsToCmd(cmd)
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
371
cmd/planetmint-god/cmd/root.go
Normal file
371
cmd/planetmint-god/cmd/root.go
Normal file
@ -0,0 +1,371 @@
|
|||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
dbm "github.com/cometbft/cometbft-db"
|
||||||
|
tmcfg "github.com/cometbft/cometbft/config"
|
||||||
|
tmcli "github.com/cometbft/cometbft/libs/cli"
|
||||||
|
"github.com/cometbft/cometbft/libs/log"
|
||||||
|
tmtypes "github.com/cometbft/cometbft/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/config"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/debug"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/keys"
|
||||||
|
"github.com/cosmos/cosmos-sdk/client/rpc"
|
||||||
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
|
serverconfig "github.com/cosmos/cosmos-sdk/server/config"
|
||||||
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/snapshots"
|
||||||
|
snapshottypes "github.com/cosmos/cosmos-sdk/snapshots/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/store"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
|
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/crisis"
|
||||||
|
"github.com/cosmos/cosmos-sdk/x/genutil"
|
||||||
|
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
|
||||||
|
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
||||||
|
"github.com/spf13/cast"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/spf13/pflag"
|
||||||
|
// this line is used by starport scaffolding # root/moduleImport
|
||||||
|
|
||||||
|
"planetmint-go/app"
|
||||||
|
appparams "planetmint-go/app/params"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewRootCmd creates a new root command for a Cosmos SDK application
|
||||||
|
func NewRootCmd() (*cobra.Command, appparams.EncodingConfig) {
|
||||||
|
encodingConfig := app.MakeEncodingConfig()
|
||||||
|
initClientCtx := client.Context{}.
|
||||||
|
WithCodec(encodingConfig.Marshaler).
|
||||||
|
WithInterfaceRegistry(encodingConfig.InterfaceRegistry).
|
||||||
|
WithTxConfig(encodingConfig.TxConfig).
|
||||||
|
WithLegacyAmino(encodingConfig.Amino).
|
||||||
|
WithInput(os.Stdin).
|
||||||
|
WithAccountRetriever(types.AccountRetriever{}).
|
||||||
|
WithHomeDir(app.DefaultNodeHome).
|
||||||
|
WithViper("")
|
||||||
|
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
|
Use: app.Name + "d",
|
||||||
|
Short: "Start planetmintgo node",
|
||||||
|
PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
|
||||||
|
// set the default command outputs
|
||||||
|
cmd.SetOut(cmd.OutOrStdout())
|
||||||
|
cmd.SetErr(cmd.ErrOrStderr())
|
||||||
|
initClientCtx, err := client.ReadPersistentCommandFlags(initClientCtx, cmd.Flags())
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
initClientCtx, err = config.ReadFromClientConfig(initClientCtx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := client.SetCmdClientContextHandler(initClientCtx, cmd); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
customAppTemplate, customAppConfig := initAppConfig()
|
||||||
|
customTMConfig := initTendermintConfig()
|
||||||
|
return server.InterceptConfigsPreRunHandler(
|
||||||
|
cmd, customAppTemplate, customAppConfig, customTMConfig,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
initRootCmd(rootCmd, encodingConfig)
|
||||||
|
overwriteFlagDefaults(rootCmd, map[string]string{
|
||||||
|
flags.FlagChainID: strings.ReplaceAll(app.Name, "-", ""),
|
||||||
|
flags.FlagKeyringBackend: "test",
|
||||||
|
})
|
||||||
|
|
||||||
|
return rootCmd, encodingConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// initTendermintConfig helps to override default Tendermint Config values.
|
||||||
|
// return tmcfg.DefaultConfig if no custom configuration is required for the application.
|
||||||
|
func initTendermintConfig() *tmcfg.Config {
|
||||||
|
cfg := tmcfg.DefaultConfig()
|
||||||
|
return cfg
|
||||||
|
}
|
||||||
|
|
||||||
|
func initRootCmd(
|
||||||
|
rootCmd *cobra.Command,
|
||||||
|
encodingConfig appparams.EncodingConfig,
|
||||||
|
) {
|
||||||
|
// Set config
|
||||||
|
initSDKConfig()
|
||||||
|
|
||||||
|
gentxModule := app.ModuleBasics[genutiltypes.ModuleName].(genutil.AppModuleBasic)
|
||||||
|
rootCmd.AddCommand(
|
||||||
|
genutilcli.InitCmd(app.ModuleBasics, app.DefaultNodeHome),
|
||||||
|
genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome, gentxModule.GenTxValidator),
|
||||||
|
genutilcli.MigrateGenesisCmd(),
|
||||||
|
genutilcli.GenTxCmd(
|
||||||
|
app.ModuleBasics,
|
||||||
|
encodingConfig.TxConfig,
|
||||||
|
banktypes.GenesisBalancesIterator{},
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
),
|
||||||
|
genutilcli.ValidateGenesisCmd(app.ModuleBasics),
|
||||||
|
AddGenesisAccountCmd(app.DefaultNodeHome),
|
||||||
|
tmcli.NewCompletionCmd(rootCmd, true),
|
||||||
|
debug.Cmd(),
|
||||||
|
config.Cmd(),
|
||||||
|
// this line is used by starport scaffolding # root/commands
|
||||||
|
)
|
||||||
|
|
||||||
|
a := appCreator{
|
||||||
|
encodingConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
// add server commands
|
||||||
|
server.AddCommands(
|
||||||
|
rootCmd,
|
||||||
|
app.DefaultNodeHome,
|
||||||
|
a.newApp,
|
||||||
|
a.appExport,
|
||||||
|
addModuleInitFlags,
|
||||||
|
)
|
||||||
|
|
||||||
|
// add keybase, auxiliary RPC, query, and tx child commands
|
||||||
|
rootCmd.AddCommand(
|
||||||
|
rpc.StatusCommand(),
|
||||||
|
queryCommand(),
|
||||||
|
txCommand(),
|
||||||
|
keys.Commands(app.DefaultNodeHome),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// queryCommand returns the sub-command to send queries to the app
|
||||||
|
func queryCommand() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "query",
|
||||||
|
Aliases: []string{"q"},
|
||||||
|
Short: "Querying subcommands",
|
||||||
|
DisableFlagParsing: true,
|
||||||
|
SuggestionsMinimumDistance: 2,
|
||||||
|
RunE: client.ValidateCmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.AddCommand(
|
||||||
|
authcmd.GetAccountCmd(),
|
||||||
|
rpc.ValidatorCommand(),
|
||||||
|
rpc.BlockCommand(),
|
||||||
|
authcmd.QueryTxsByEventsCmd(),
|
||||||
|
authcmd.QueryTxCmd(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.ModuleBasics.AddQueryCommands(cmd)
|
||||||
|
cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID")
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
// txCommand returns the sub-command to send transactions to the app
|
||||||
|
func txCommand() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "tx",
|
||||||
|
Short: "Transactions subcommands",
|
||||||
|
DisableFlagParsing: true,
|
||||||
|
SuggestionsMinimumDistance: 2,
|
||||||
|
RunE: client.ValidateCmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.AddCommand(
|
||||||
|
authcmd.GetSignCommand(),
|
||||||
|
authcmd.GetSignBatchCommand(),
|
||||||
|
authcmd.GetMultiSignCommand(),
|
||||||
|
authcmd.GetValidateSignaturesCommand(),
|
||||||
|
flags.LineBreak,
|
||||||
|
authcmd.GetBroadcastCommand(),
|
||||||
|
authcmd.GetEncodeCommand(),
|
||||||
|
authcmd.GetDecodeCommand(),
|
||||||
|
)
|
||||||
|
|
||||||
|
app.ModuleBasics.AddTxCommands(cmd)
|
||||||
|
cmd.PersistentFlags().String(flags.FlagChainID, "", "The network chain ID")
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func addModuleInitFlags(startCmd *cobra.Command) {
|
||||||
|
crisis.AddModuleInitFlags(startCmd)
|
||||||
|
// this line is used by starport scaffolding # root/arguments
|
||||||
|
}
|
||||||
|
|
||||||
|
func overwriteFlagDefaults(c *cobra.Command, defaults map[string]string) {
|
||||||
|
set := func(s *pflag.FlagSet, key, val string) {
|
||||||
|
if f := s.Lookup(key); f != nil {
|
||||||
|
f.DefValue = val
|
||||||
|
f.Value.Set(val)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for key, val := range defaults {
|
||||||
|
set(c.Flags(), key, val)
|
||||||
|
set(c.PersistentFlags(), key, val)
|
||||||
|
}
|
||||||
|
for _, c := range c.Commands() {
|
||||||
|
overwriteFlagDefaults(c, defaults)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type appCreator struct {
|
||||||
|
encodingConfig appparams.EncodingConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
// newApp creates a new Cosmos SDK app
|
||||||
|
func (a appCreator) newApp(
|
||||||
|
logger log.Logger,
|
||||||
|
db dbm.DB,
|
||||||
|
traceStore io.Writer,
|
||||||
|
appOpts servertypes.AppOptions,
|
||||||
|
) servertypes.Application {
|
||||||
|
var cache sdk.MultiStorePersistentCache
|
||||||
|
|
||||||
|
if cast.ToBool(appOpts.Get(server.FlagInterBlockCache)) {
|
||||||
|
cache = store.NewCommitKVStoreCacheManager()
|
||||||
|
}
|
||||||
|
|
||||||
|
skipUpgradeHeights := make(map[int64]bool)
|
||||||
|
for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) {
|
||||||
|
skipUpgradeHeights[int64(h)] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
pruningOpts, err := server.GetPruningOptionsFromFlags(appOpts)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
homeDir := cast.ToString(appOpts.Get(flags.FlagHome))
|
||||||
|
chainID := cast.ToString(appOpts.Get(flags.FlagChainID))
|
||||||
|
if chainID == "" {
|
||||||
|
// fallback to genesis chain-id
|
||||||
|
appGenesis, err := tmtypes.GenesisDocFromFile(filepath.Join(homeDir, "config", "genesis.json"))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
chainID = appGenesis.ChainID
|
||||||
|
}
|
||||||
|
|
||||||
|
snapshotDir := filepath.Join(cast.ToString(appOpts.Get(flags.FlagHome)), "data", "snapshots")
|
||||||
|
snapshotDB, err := dbm.NewDB("metadata", dbm.GoLevelDBBackend, snapshotDir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
snapshotStore, err := snapshots.NewStore(snapshotDB, snapshotDir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
snapshotOptions := snapshottypes.NewSnapshotOptions(
|
||||||
|
cast.ToUint64(appOpts.Get(server.FlagStateSyncSnapshotInterval)),
|
||||||
|
cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent)),
|
||||||
|
)
|
||||||
|
|
||||||
|
return app.New(
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
traceStore,
|
||||||
|
true,
|
||||||
|
skipUpgradeHeights,
|
||||||
|
cast.ToString(appOpts.Get(flags.FlagHome)),
|
||||||
|
cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)),
|
||||||
|
a.encodingConfig,
|
||||||
|
appOpts,
|
||||||
|
baseapp.SetPruning(pruningOpts),
|
||||||
|
baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))),
|
||||||
|
baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))),
|
||||||
|
baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))),
|
||||||
|
baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))),
|
||||||
|
baseapp.SetInterBlockCache(cache),
|
||||||
|
baseapp.SetTrace(cast.ToBool(appOpts.Get(server.FlagTrace))),
|
||||||
|
baseapp.SetIndexEvents(cast.ToStringSlice(appOpts.Get(server.FlagIndexEvents))),
|
||||||
|
baseapp.SetSnapshot(snapshotStore, snapshotOptions),
|
||||||
|
baseapp.SetIAVLCacheSize(cast.ToInt(appOpts.Get(server.FlagIAVLCacheSize))),
|
||||||
|
baseapp.SetIAVLDisableFastNode(cast.ToBool(appOpts.Get(server.FlagDisableIAVLFastNode))),
|
||||||
|
baseapp.SetChainID(chainID),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// appExport creates a new simapp (optionally at a given height)
|
||||||
|
func (a appCreator) appExport(
|
||||||
|
logger log.Logger,
|
||||||
|
db dbm.DB,
|
||||||
|
traceStore io.Writer,
|
||||||
|
height int64,
|
||||||
|
forZeroHeight bool,
|
||||||
|
jailAllowedAddrs []string,
|
||||||
|
appOpts servertypes.AppOptions,
|
||||||
|
modulesToExport []string,
|
||||||
|
) (servertypes.ExportedApp, error) {
|
||||||
|
homePath, ok := appOpts.Get(flags.FlagHome).(string)
|
||||||
|
if !ok || homePath == "" {
|
||||||
|
return servertypes.ExportedApp{}, errors.New("application home not set")
|
||||||
|
}
|
||||||
|
|
||||||
|
app := app.New(
|
||||||
|
logger,
|
||||||
|
db,
|
||||||
|
traceStore,
|
||||||
|
height == -1, // -1: no height provided
|
||||||
|
map[int64]bool{},
|
||||||
|
homePath,
|
||||||
|
uint(1),
|
||||||
|
a.encodingConfig,
|
||||||
|
appOpts,
|
||||||
|
)
|
||||||
|
|
||||||
|
if height != -1 {
|
||||||
|
if err := app.LoadHeight(height); err != nil {
|
||||||
|
return servertypes.ExportedApp{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return app.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport)
|
||||||
|
}
|
||||||
|
|
||||||
|
// initAppConfig helps to override default appConfig template and configs.
|
||||||
|
// return "", nil if no custom configuration is required for the application.
|
||||||
|
func initAppConfig() (string, interface{}) {
|
||||||
|
// The following code snippet is just for reference.
|
||||||
|
|
||||||
|
type CustomAppConfig struct {
|
||||||
|
serverconfig.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
// Optionally allow the chain developer to overwrite the SDK's default
|
||||||
|
// server config.
|
||||||
|
srvCfg := serverconfig.DefaultConfig()
|
||||||
|
// The SDK's default minimum gas price is set to "" (empty value) inside
|
||||||
|
// app.toml. If left empty by validators, the node will halt on startup.
|
||||||
|
// However, the chain developer can set a default app.toml value for their
|
||||||
|
// validators here.
|
||||||
|
//
|
||||||
|
// In summary:
|
||||||
|
// - if you leave srvCfg.MinGasPrices = "", all validators MUST tweak their
|
||||||
|
// own app.toml config,
|
||||||
|
// - if you set srvCfg.MinGasPrices non-empty, validators CAN tweak their
|
||||||
|
// own app.toml to override, or use this default value.
|
||||||
|
//
|
||||||
|
// In simapp, we set the min gas prices to 0.
|
||||||
|
srvCfg.MinGasPrices = "0stake"
|
||||||
|
|
||||||
|
customAppConfig := CustomAppConfig{
|
||||||
|
Config: *srvCfg,
|
||||||
|
}
|
||||||
|
customAppTemplate := serverconfig.DefaultConfigTemplate
|
||||||
|
|
||||||
|
return customAppTemplate, customAppConfig
|
||||||
|
}
|
24
cmd/planetmint-god/main.go
Normal file
24
cmd/planetmint-god/main.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/server"
|
||||||
|
svrcmd "github.com/cosmos/cosmos-sdk/server/cmd"
|
||||||
|
|
||||||
|
"planetmint-go/app"
|
||||||
|
"planetmint-go/cmd/planetmint-god/cmd"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rootCmd, _ := cmd.NewRootCmd()
|
||||||
|
if err := svrcmd.Execute(rootCmd, "", app.DefaultNodeHome); err != nil {
|
||||||
|
switch e := err.(type) {
|
||||||
|
case server.ErrorCode:
|
||||||
|
os.Exit(e.Code)
|
||||||
|
|
||||||
|
default:
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
fmt.Println("Welcome to Planetmint Daemon!")
|
|
||||||
}
|
|
21
config.yml
Normal file
21
config.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
version: 1
|
||||||
|
accounts:
|
||||||
|
- name: alice
|
||||||
|
coins:
|
||||||
|
- 20000token
|
||||||
|
- 200000000stake
|
||||||
|
- name: bob
|
||||||
|
coins:
|
||||||
|
- 10000token
|
||||||
|
- 100000000stake
|
||||||
|
client:
|
||||||
|
openapi:
|
||||||
|
path: docs/static/openapi.yml
|
||||||
|
faucet:
|
||||||
|
name: bob
|
||||||
|
coins:
|
||||||
|
- 5token
|
||||||
|
- 100000stake
|
||||||
|
validators:
|
||||||
|
- name: alice
|
||||||
|
bonded: 100000000stake
|
40
docs/docs.go
Normal file
40
docs/docs.go
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package docs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
httptemplate "html/template"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
apiFile = "/static/openapi.yml"
|
||||||
|
indexFile = "template/index.tpl"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed static
|
||||||
|
var Static embed.FS
|
||||||
|
|
||||||
|
//go:embed template
|
||||||
|
var template embed.FS
|
||||||
|
|
||||||
|
func RegisterOpenAPIService(appName string, rtr *mux.Router) {
|
||||||
|
rtr.Handle(apiFile, http.FileServer(http.FS(Static)))
|
||||||
|
rtr.HandleFunc("/", handler(appName))
|
||||||
|
}
|
||||||
|
|
||||||
|
// handler returns an http handler that servers OpenAPI console for an OpenAPI spec at specURL.
|
||||||
|
func handler(title string) http.HandlerFunc {
|
||||||
|
t, _ := httptemplate.ParseFS(template, indexFile)
|
||||||
|
|
||||||
|
return func(w http.ResponseWriter, req *http.Request) {
|
||||||
|
t.Execute(w, struct {
|
||||||
|
Title string
|
||||||
|
URL string
|
||||||
|
}{
|
||||||
|
title,
|
||||||
|
apiFile,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
75178
docs/static/openapi.yml
vendored
Normal file
75178
docs/static/openapi.yml
vendored
Normal file
File diff suppressed because it is too large
Load Diff
28
docs/template/index.tpl
vendored
Normal file
28
docs/template/index.tpl
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>{{ .Title }}</title>
|
||||||
|
<link rel="stylesheet" type="text/css" href="//unpkg.com/swagger-ui-dist@3.40.0/swagger-ui.css" />
|
||||||
|
<link rel="icon" type="image/png" href="//unpkg.com/swagger-ui-dist@3.40.0/favicon-16x16.png" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="swagger-ui"></div>
|
||||||
|
|
||||||
|
<script src="//unpkg.com/swagger-ui-dist@3.40.0/swagger-ui-bundle.js"></script>
|
||||||
|
<script>
|
||||||
|
// init Swagger for faucet's openapi.yml.
|
||||||
|
window.onload = function() {
|
||||||
|
window.ui = SwaggerUIBundle({
|
||||||
|
url: {{ .URL }},
|
||||||
|
dom_id: "#swagger-ui",
|
||||||
|
deepLinking: true,
|
||||||
|
layout: "BaseLayout",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
Footer
|
||||||
|
© 2022 GitHub, Inc.
|
||||||
|
Footer navigation
|
167
go.mod
167
go.mod
@ -1,3 +1,168 @@
|
|||||||
module github.com/planetmint/planetmint-go
|
module planetmint-go
|
||||||
|
|
||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
cosmossdk.io/api v0.3.1
|
||||||
|
github.com/cometbft/cometbft v0.37.1
|
||||||
|
github.com/cometbft/cometbft-db v0.7.0
|
||||||
|
github.com/cosmos/cosmos-sdk v0.47.3
|
||||||
|
github.com/cosmos/gogoproto v1.4.10
|
||||||
|
github.com/cosmos/ibc-go/v7 v7.1.0
|
||||||
|
github.com/golang/protobuf v1.5.3
|
||||||
|
github.com/gorilla/mux v1.8.0
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2
|
||||||
|
github.com/spf13/cast v1.5.0
|
||||||
|
github.com/spf13/cobra v1.6.1
|
||||||
|
github.com/spf13/pflag v1.0.5
|
||||||
|
github.com/stretchr/testify v1.8.2
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
cloud.google.com/go v0.110.0 // indirect
|
||||||
|
cloud.google.com/go/compute v1.18.0 // indirect
|
||||||
|
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||||
|
cloud.google.com/go/iam v0.12.0 // indirect
|
||||||
|
cloud.google.com/go/storage v1.29.0 // indirect
|
||||||
|
cosmossdk.io/core v0.5.1 // indirect
|
||||||
|
cosmossdk.io/depinject v1.0.0-alpha.3 // indirect
|
||||||
|
cosmossdk.io/errors v1.0.0-beta.7 // indirect
|
||||||
|
cosmossdk.io/log v1.1.0 // indirect
|
||||||
|
cosmossdk.io/math v1.0.1 // indirect
|
||||||
|
cosmossdk.io/tools/rosetta v0.2.1 // indirect
|
||||||
|
filippo.io/edwards25519 v1.0.0 // indirect
|
||||||
|
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
|
||||||
|
github.com/99designs/keyring v1.2.1 // indirect
|
||||||
|
github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect
|
||||||
|
github.com/armon/go-metrics v0.4.1 // indirect
|
||||||
|
github.com/aws/aws-sdk-go v1.44.203 // indirect
|
||||||
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
|
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
|
||||||
|
github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect
|
||||||
|
github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
|
||||||
|
github.com/cespare/xxhash v1.1.0 // indirect
|
||||||
|
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||||
|
github.com/chzyer/readline v1.5.1 // indirect
|
||||||
|
github.com/cockroachdb/apd/v2 v2.0.2 // indirect
|
||||||
|
github.com/coinbase/rosetta-sdk-go/types v1.0.0 // indirect
|
||||||
|
github.com/confio/ics23/go v0.9.0 // indirect
|
||||||
|
github.com/cosmos/btcutil v1.0.5 // indirect
|
||||||
|
github.com/cosmos/cosmos-proto v1.0.0-beta.2 // indirect
|
||||||
|
github.com/cosmos/go-bip39 v1.0.0 // indirect
|
||||||
|
github.com/cosmos/gogogateway v1.2.0 // indirect
|
||||||
|
github.com/cosmos/iavl v0.20.0 // indirect
|
||||||
|
github.com/cosmos/ics23/go v0.10.0 // indirect
|
||||||
|
github.com/cosmos/ledger-cosmos-go v0.12.1 // indirect
|
||||||
|
github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect
|
||||||
|
github.com/creachadair/taskgroup v0.4.2 // indirect
|
||||||
|
github.com/danieljoos/wincred v1.1.2 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
|
||||||
|
github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect
|
||||||
|
github.com/dgraph-io/badger/v2 v2.2007.4 // indirect
|
||||||
|
github.com/dgraph-io/ristretto v0.1.1 // indirect
|
||||||
|
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
|
||||||
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
|
github.com/dvsekhvalnov/jose2go v1.5.0 // indirect
|
||||||
|
github.com/felixge/httpsnoop v1.0.2 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
||||||
|
github.com/ghodss/yaml v1.0.0 // indirect
|
||||||
|
github.com/go-kit/kit v0.12.0 // indirect
|
||||||
|
github.com/go-kit/log v0.2.1 // indirect
|
||||||
|
github.com/go-logfmt/logfmt v0.6.0 // indirect
|
||||||
|
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
|
||||||
|
github.com/gogo/googleapis v1.4.1 // indirect
|
||||||
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
|
github.com/golang/glog v1.1.0 // indirect
|
||||||
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
|
github.com/golang/mock v1.6.0 // indirect
|
||||||
|
github.com/golang/snappy v0.0.4 // indirect
|
||||||
|
github.com/google/btree v1.1.2 // indirect
|
||||||
|
github.com/google/go-cmp v0.5.9 // indirect
|
||||||
|
github.com/google/orderedcode v0.0.1 // indirect
|
||||||
|
github.com/google/uuid v1.3.0 // indirect
|
||||||
|
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
|
||||||
|
github.com/googleapis/gax-go/v2 v2.7.0 // indirect
|
||||||
|
github.com/gorilla/handlers v1.5.1 // indirect
|
||||||
|
github.com/gorilla/websocket v1.5.0 // indirect
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
|
||||||
|
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect
|
||||||
|
github.com/gtank/merlin v0.1.1 // indirect
|
||||||
|
github.com/gtank/ristretto255 v0.1.2 // indirect
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
|
github.com/hashicorp/go-getter v1.7.1 // indirect
|
||||||
|
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||||
|
github.com/hashicorp/go-safetemp v1.0.0 // indirect
|
||||||
|
github.com/hashicorp/go-version v1.6.0 // indirect
|
||||||
|
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
|
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
|
github.com/hdevalence/ed25519consensus v0.1.0 // indirect
|
||||||
|
github.com/huandu/skiplist v1.2.0 // indirect
|
||||||
|
github.com/improbable-eng/grpc-web v0.15.0 // indirect
|
||||||
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
|
github.com/jmhodges/levigo v1.0.0 // indirect
|
||||||
|
github.com/klauspost/compress v1.16.3 // indirect
|
||||||
|
github.com/lib/pq v1.10.7 // indirect
|
||||||
|
github.com/libp2p/go-buffer-pool v0.1.0 // indirect
|
||||||
|
github.com/magiconair/properties v1.8.7 // indirect
|
||||||
|
github.com/manifoldco/promptui v0.9.0 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.18 // indirect
|
||||||
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
|
github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect
|
||||||
|
github.com/minio/highwayhash v1.0.2 // indirect
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
|
github.com/mtibben/percent v0.2.1 // indirect
|
||||||
|
github.com/pelletier/go-toml/v2 v2.0.7 // indirect
|
||||||
|
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/prometheus/client_golang v1.14.0 // indirect
|
||||||
|
github.com/prometheus/client_model v0.3.0 // indirect
|
||||||
|
github.com/prometheus/common v0.42.0 // indirect
|
||||||
|
github.com/prometheus/procfs v0.9.0 // indirect
|
||||||
|
github.com/rakyll/statik v0.1.7 // indirect
|
||||||
|
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
|
||||||
|
github.com/rs/cors v1.8.3 // indirect
|
||||||
|
github.com/rs/zerolog v1.29.1 // indirect
|
||||||
|
github.com/sasha-s/go-deadlock v0.3.1 // indirect
|
||||||
|
github.com/spf13/afero v1.9.3 // indirect
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
github.com/spf13/viper v1.15.0 // indirect
|
||||||
|
github.com/subosito/gotenv v1.4.2 // indirect
|
||||||
|
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
||||||
|
github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect
|
||||||
|
github.com/tendermint/go-amino v0.16.0 // indirect
|
||||||
|
github.com/tidwall/btree v1.6.0 // indirect
|
||||||
|
github.com/ulikunitz/xz v0.5.11 // indirect
|
||||||
|
github.com/zondax/hid v0.9.1 // indirect
|
||||||
|
github.com/zondax/ledger-go v0.14.1 // indirect
|
||||||
|
go.etcd.io/bbolt v1.3.7 // indirect
|
||||||
|
go.opencensus.io v0.24.0 // indirect
|
||||||
|
golang.org/x/crypto v0.8.0 // indirect
|
||||||
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect
|
||||||
|
golang.org/x/net v0.9.0 // indirect
|
||||||
|
golang.org/x/oauth2 v0.6.0 // indirect
|
||||||
|
golang.org/x/sys v0.7.0 // indirect
|
||||||
|
golang.org/x/term v0.7.0 // indirect
|
||||||
|
golang.org/x/text v0.9.0 // indirect
|
||||||
|
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
|
||||||
|
google.golang.org/api v0.110.0 // indirect
|
||||||
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect
|
||||||
|
google.golang.org/grpc v1.55.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.30.0 // indirect
|
||||||
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
nhooyr.io/websocket v1.8.6 // indirect
|
||||||
|
pgregory.net/rapid v0.5.5 // indirect
|
||||||
|
sigs.k8s.io/yaml v1.3.0 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
|
||||||
|
52
readme.md
Normal file
52
readme.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# planetmintgo
|
||||||
|
**planetmintgo** is a blockchain built using Cosmos SDK and Tendermint and created with [Ignite CLI](https://ignite.com/cli).
|
||||||
|
|
||||||
|
## Get started
|
||||||
|
|
||||||
|
```
|
||||||
|
ignite chain serve
|
||||||
|
```
|
||||||
|
|
||||||
|
`serve` command installs dependencies, builds, initializes, and starts your blockchain in development.
|
||||||
|
|
||||||
|
### Configure
|
||||||
|
|
||||||
|
Your blockchain in development can be configured with `config.yml`. To learn more, see the [Ignite CLI docs](https://docs.ignite.com).
|
||||||
|
|
||||||
|
### Web Frontend
|
||||||
|
|
||||||
|
Ignite CLI has scaffolded a Vue.js-based web app in the `vue` directory. Run the following commands to install dependencies and start the app:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd vue
|
||||||
|
npm install
|
||||||
|
npm run serve
|
||||||
|
```
|
||||||
|
|
||||||
|
The frontend app is built using the `@starport/vue` and `@starport/vuex` packages. For details, see the [monorepo for Ignite front-end development](https://github.com/ignite/web).
|
||||||
|
|
||||||
|
## Release
|
||||||
|
To release a new version of your blockchain, create and push a new tag with `v` prefix. A new draft release with the configured targets will be created.
|
||||||
|
|
||||||
|
```
|
||||||
|
git tag v0.1
|
||||||
|
git push origin v0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
After a draft release is created, make your final changes from the release page and publish it.
|
||||||
|
|
||||||
|
### Install
|
||||||
|
To install the latest version of your blockchain node's binary, execute the following command on your machine:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl https://get.ignite.com/username/planetmint-go@latest! | sudo bash
|
||||||
|
```
|
||||||
|
`username/planetmint-go` should match the `username` and `repo_name` of the Github repository to which the source code was pushed. Learn more about [the install process](https://github.com/allinbits/starport-installer).
|
||||||
|
|
||||||
|
## Learn more
|
||||||
|
|
||||||
|
- [Ignite CLI](https://ignite.com/cli)
|
||||||
|
- [Tutorials](https://docs.ignite.com/guide)
|
||||||
|
- [Ignite CLI docs](https://docs.ignite.com)
|
||||||
|
- [Cosmos SDK docs](https://docs.cosmos.network)
|
||||||
|
- [Developer Chat](https://discord.gg/ignite)
|
92
testutil/network/network.go
Normal file
92
testutil/network/network.go
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package network
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
tmdb "github.com/cometbft/cometbft-db"
|
||||||
|
tmrand "github.com/cometbft/cometbft/libs/rand"
|
||||||
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
||||||
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
||||||
|
pruningtypes "github.com/cosmos/cosmos-sdk/store/pruning/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||||
|
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"planetmint-go/app"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
Network = network.Network
|
||||||
|
Config = network.Config
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates instance with fully configured cosmos network.
|
||||||
|
// Accepts optional config, that will be used in place of the DefaultConfig() if provided.
|
||||||
|
func New(t *testing.T, configs ...Config) *Network {
|
||||||
|
if len(configs) > 1 {
|
||||||
|
panic("at most one config should be provided")
|
||||||
|
}
|
||||||
|
var cfg network.Config
|
||||||
|
if len(configs) == 0 {
|
||||||
|
cfg = DefaultConfig()
|
||||||
|
} else {
|
||||||
|
cfg = configs[0]
|
||||||
|
}
|
||||||
|
net, err := network.New(t, t.TempDir(), cfg)
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = net.WaitForHeight(1)
|
||||||
|
require.NoError(t, err)
|
||||||
|
t.Cleanup(net.Cleanup)
|
||||||
|
return net
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultConfig will initialize config for the network with custom application,
|
||||||
|
// genesis and single validator. All other parameters are inherited from cosmos-sdk/testutil/network.DefaultConfig
|
||||||
|
func DefaultConfig() network.Config {
|
||||||
|
var (
|
||||||
|
encoding = app.MakeEncodingConfig()
|
||||||
|
chainID = "chain-" + tmrand.NewRand().Str(6)
|
||||||
|
)
|
||||||
|
return network.Config{
|
||||||
|
Codec: encoding.Marshaler,
|
||||||
|
TxConfig: encoding.TxConfig,
|
||||||
|
LegacyAmino: encoding.Amino,
|
||||||
|
InterfaceRegistry: encoding.InterfaceRegistry,
|
||||||
|
AccountRetriever: authtypes.AccountRetriever{},
|
||||||
|
AppConstructor: func(val network.ValidatorI) servertypes.Application {
|
||||||
|
return app.New(
|
||||||
|
val.GetCtx().Logger,
|
||||||
|
tmdb.NewMemDB(),
|
||||||
|
nil,
|
||||||
|
true,
|
||||||
|
map[int64]bool{},
|
||||||
|
val.GetCtx().Config.RootDir,
|
||||||
|
0,
|
||||||
|
encoding,
|
||||||
|
simtestutil.EmptyAppOptions{},
|
||||||
|
baseapp.SetPruning(pruningtypes.NewPruningOptionsFromString(val.GetAppConfig().Pruning)),
|
||||||
|
baseapp.SetMinGasPrices(val.GetAppConfig().MinGasPrices),
|
||||||
|
baseapp.SetChainID(chainID),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
GenesisState: app.ModuleBasics.DefaultGenesis(encoding.Marshaler),
|
||||||
|
TimeoutCommit: 2 * time.Second,
|
||||||
|
ChainID: chainID,
|
||||||
|
NumValidators: 1,
|
||||||
|
BondDenom: sdk.DefaultBondDenom,
|
||||||
|
MinGasPrices: fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom),
|
||||||
|
AccountTokens: sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction),
|
||||||
|
StakingTokens: sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction),
|
||||||
|
BondedTokens: sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction),
|
||||||
|
PruningStrategy: pruningtypes.PruningOptionNothing,
|
||||||
|
CleanupDir: true,
|
||||||
|
SigningAlgo: string(hd.Secp256k1Type),
|
||||||
|
KeyringOptions: []keyring.Option{},
|
||||||
|
}
|
||||||
|
}
|
57
testutil/nullify/nullify.go
Normal file
57
testutil/nullify/nullify.go
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// Package nullify provides methods to init nil values structs for test assertion.
|
||||||
|
package nullify
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
coinType = reflect.TypeOf(sdk.Coin{})
|
||||||
|
coinsType = reflect.TypeOf(sdk.Coins{})
|
||||||
|
)
|
||||||
|
|
||||||
|
// Fill analyze all struct fields and slices with
|
||||||
|
// reflection and initialize the nil and empty slices,
|
||||||
|
// structs, and pointers.
|
||||||
|
func Fill(x interface{}) interface{} {
|
||||||
|
v := reflect.Indirect(reflect.ValueOf(x))
|
||||||
|
switch v.Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
obj := v.Index(i)
|
||||||
|
objPt := reflect.NewAt(obj.Type(), unsafe.Pointer(obj.UnsafeAddr())).Interface()
|
||||||
|
objPt = Fill(objPt)
|
||||||
|
obj.Set(reflect.ValueOf(objPt))
|
||||||
|
}
|
||||||
|
case reflect.Struct:
|
||||||
|
for i := 0; i < v.NumField(); i++ {
|
||||||
|
f := reflect.Indirect(v.Field(i))
|
||||||
|
if !f.CanSet() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
switch f.Kind() {
|
||||||
|
case reflect.Slice:
|
||||||
|
f.Set(reflect.MakeSlice(f.Type(), 0, 0))
|
||||||
|
case reflect.Struct:
|
||||||
|
switch f.Type() {
|
||||||
|
case coinType:
|
||||||
|
coin := reflect.New(coinType).Interface()
|
||||||
|
s := reflect.ValueOf(coin).Elem()
|
||||||
|
f.Set(s)
|
||||||
|
case coinsType:
|
||||||
|
coins := reflect.New(coinsType).Interface()
|
||||||
|
s := reflect.ValueOf(coins).Elem()
|
||||||
|
f.Set(s)
|
||||||
|
default:
|
||||||
|
objPt := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Interface()
|
||||||
|
s := Fill(objPt)
|
||||||
|
f.Set(reflect.ValueOf(s))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return reflect.Indirect(v).Interface()
|
||||||
|
}
|
13
testutil/sample/sample.go
Normal file
13
testutil/sample/sample.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package sample
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AccAddress returns a sample account address
|
||||||
|
func AccAddress() string {
|
||||||
|
pk := ed25519.GenPrivKey().PubKey()
|
||||||
|
addr := pk.Address()
|
||||||
|
return sdk.AccAddress(addr).String()
|
||||||
|
}
|
11
tools/tools.go
Normal file
11
tools/tools.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
//go:build tools
|
||||||
|
|
||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "github.com/cosmos/gogoproto/protoc-gen-gocosmos"
|
||||||
|
_ "github.com/golang/protobuf/protoc-gen-go"
|
||||||
|
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway"
|
||||||
|
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger"
|
||||||
|
_ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2"
|
||||||
|
)
|
Loading…
x
Reference in New Issue
Block a user