mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 23:35:19 +00:00
feat: Add x/precisebank module basic setup (#1906)
- Add initial setup and empty genesis type for x/precisebank - Basic tests with mostly empty values, to be filled out with additional implementation
This commit is contained in:
parent
871e26670c
commit
3c53e72220
@ -36,6 +36,9 @@ Ref: https://keepachangelog.com/en/1.0.0/
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Features
|
||||||
|
- (precisebank) [#1906] Add new `x/precisebank` module with bank decimal extension for EVM usage.
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
- (rocksdb) [#1903] Bump cometbft-db dependency for use with rocksdb v8.10.0
|
- (rocksdb) [#1903] Bump cometbft-db dependency for use with rocksdb v8.10.0
|
||||||
|
|
||||||
@ -333,6 +336,7 @@ the [changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.38.4/CHANGELOG.md).
|
|||||||
- [#257](https://github.com/Kava-Labs/kava/pulls/257) Include scripts to run
|
- [#257](https://github.com/Kava-Labs/kava/pulls/257) Include scripts to run
|
||||||
large-scale simulations remotely using aws-batch
|
large-scale simulations remotely using aws-batch
|
||||||
|
|
||||||
|
[#1906]: https://github.com/Kava-Labs/kava/pull/1906
|
||||||
[#1903]: https://github.com/Kava-Labs/kava/pull/1903
|
[#1903]: https://github.com/Kava-Labs/kava/pull/1903
|
||||||
[#1846]: https://github.com/Kava-Labs/kava/pull/1846
|
[#1846]: https://github.com/Kava-Labs/kava/pull/1846
|
||||||
[#1848]: https://github.com/Kava-Labs/kava/pull/1848
|
[#1848]: https://github.com/Kava-Labs/kava/pull/1848
|
||||||
|
20
app/app.go
20
app/app.go
@ -149,6 +149,9 @@ import (
|
|||||||
liquidtypes "github.com/kava-labs/kava/x/liquid/types"
|
liquidtypes "github.com/kava-labs/kava/x/liquid/types"
|
||||||
metrics "github.com/kava-labs/kava/x/metrics"
|
metrics "github.com/kava-labs/kava/x/metrics"
|
||||||
metricstypes "github.com/kava-labs/kava/x/metrics/types"
|
metricstypes "github.com/kava-labs/kava/x/metrics/types"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank"
|
||||||
|
precisebankkeeper "github.com/kava-labs/kava/x/precisebank/keeper"
|
||||||
|
precisebanktypes "github.com/kava-labs/kava/x/precisebank/types"
|
||||||
pricefeed "github.com/kava-labs/kava/x/pricefeed"
|
pricefeed "github.com/kava-labs/kava/x/pricefeed"
|
||||||
pricefeedkeeper "github.com/kava-labs/kava/x/pricefeed/keeper"
|
pricefeedkeeper "github.com/kava-labs/kava/x/pricefeed/keeper"
|
||||||
pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
|
pricefeedtypes "github.com/kava-labs/kava/x/pricefeed/types"
|
||||||
@ -230,6 +233,7 @@ var (
|
|||||||
community.AppModuleBasic{},
|
community.AppModuleBasic{},
|
||||||
metrics.AppModuleBasic{},
|
metrics.AppModuleBasic{},
|
||||||
consensus.AppModuleBasic{},
|
consensus.AppModuleBasic{},
|
||||||
|
precisebank.AppModuleBasic{},
|
||||||
)
|
)
|
||||||
|
|
||||||
// module account permissions
|
// module account permissions
|
||||||
@ -258,6 +262,7 @@ var (
|
|||||||
kavadisttypes.FundModuleAccount: nil,
|
kavadisttypes.FundModuleAccount: nil,
|
||||||
minttypes.ModuleName: {authtypes.Minter},
|
minttypes.ModuleName: {authtypes.Minter},
|
||||||
communitytypes.ModuleName: nil,
|
communitytypes.ModuleName: nil,
|
||||||
|
precisebanktypes.ModuleName: {authtypes.Minter, authtypes.Burner}, // used for reserve account to back fractional amounts
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -335,6 +340,7 @@ type App struct {
|
|||||||
mintKeeper mintkeeper.Keeper
|
mintKeeper mintkeeper.Keeper
|
||||||
communityKeeper communitykeeper.Keeper
|
communityKeeper communitykeeper.Keeper
|
||||||
consensusParamsKeeper consensusparamkeeper.Keeper
|
consensusParamsKeeper consensusparamkeeper.Keeper
|
||||||
|
precisebankKeeper precisebankkeeper.Keeper
|
||||||
|
|
||||||
// make scoped keepers public for test purposes
|
// make scoped keepers public for test purposes
|
||||||
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
|
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
|
||||||
@ -389,7 +395,7 @@ func NewApp(
|
|||||||
swaptypes.StoreKey, cdptypes.StoreKey, hardtypes.StoreKey, communitytypes.StoreKey,
|
swaptypes.StoreKey, cdptypes.StoreKey, hardtypes.StoreKey, communitytypes.StoreKey,
|
||||||
committeetypes.StoreKey, incentivetypes.StoreKey, evmutiltypes.StoreKey,
|
committeetypes.StoreKey, incentivetypes.StoreKey, evmutiltypes.StoreKey,
|
||||||
savingstypes.StoreKey, earntypes.StoreKey, minttypes.StoreKey,
|
savingstypes.StoreKey, earntypes.StoreKey, minttypes.StoreKey,
|
||||||
consensusparamtypes.StoreKey, crisistypes.StoreKey,
|
consensusparamtypes.StoreKey, crisistypes.StoreKey, precisebanktypes.StoreKey,
|
||||||
)
|
)
|
||||||
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey)
|
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey, feemarkettypes.TransientKey)
|
||||||
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
|
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
|
||||||
@ -544,6 +550,12 @@ func NewApp(
|
|||||||
app.accountKeeper,
|
app.accountKeeper,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO: Pass this to evmkeeper.NewKeeper() instead of evmutilKeeper
|
||||||
|
app.precisebankKeeper = precisebankkeeper.NewKeeper(
|
||||||
|
app.appCodec,
|
||||||
|
keys[precisebanktypes.StoreKey],
|
||||||
|
)
|
||||||
|
|
||||||
evmBankKeeper := evmutilkeeper.NewEvmBankKeeper(app.evmutilKeeper, app.bankKeeper, app.accountKeeper)
|
evmBankKeeper := evmutilkeeper.NewEvmBankKeeper(app.evmutilKeeper, app.bankKeeper, app.accountKeeper)
|
||||||
app.evmKeeper = evmkeeper.NewKeeper(
|
app.evmKeeper = evmkeeper.NewKeeper(
|
||||||
appCodec, keys[evmtypes.StoreKey], tkeys[evmtypes.TransientKey],
|
appCodec, keys[evmtypes.StoreKey], tkeys[evmtypes.TransientKey],
|
||||||
@ -849,6 +861,7 @@ func NewApp(
|
|||||||
mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper, nil, mintSubspace),
|
mint.NewAppModule(appCodec, app.mintKeeper, app.accountKeeper, nil, mintSubspace),
|
||||||
community.NewAppModule(app.communityKeeper, app.accountKeeper),
|
community.NewAppModule(app.communityKeeper, app.accountKeeper),
|
||||||
metrics.NewAppModule(options.TelemetryOptions),
|
metrics.NewAppModule(options.TelemetryOptions),
|
||||||
|
precisebank.NewAppModule(app.precisebankKeeper, app.bankKeeper, app.accountKeeper),
|
||||||
)
|
)
|
||||||
|
|
||||||
// Warning: Some begin blockers must run before others. Ensure the dependencies are understood before modifying this list.
|
// Warning: Some begin blockers must run before others. Ensure the dependencies are understood before modifying this list.
|
||||||
@ -904,6 +917,7 @@ func NewApp(
|
|||||||
routertypes.ModuleName,
|
routertypes.ModuleName,
|
||||||
consensusparamtypes.ModuleName,
|
consensusparamtypes.ModuleName,
|
||||||
packetforwardtypes.ModuleName,
|
packetforwardtypes.ModuleName,
|
||||||
|
precisebanktypes.ModuleName,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Warning: Some end blockers must run before others. Ensure the dependencies are understood before modifying this list.
|
// Warning: Some end blockers must run before others. Ensure the dependencies are understood before modifying this list.
|
||||||
@ -949,6 +963,7 @@ func NewApp(
|
|||||||
metricstypes.ModuleName,
|
metricstypes.ModuleName,
|
||||||
consensusparamtypes.ModuleName,
|
consensusparamtypes.ModuleName,
|
||||||
packetforwardtypes.ModuleName,
|
packetforwardtypes.ModuleName,
|
||||||
|
precisebanktypes.ModuleName,
|
||||||
)
|
)
|
||||||
|
|
||||||
// Warning: Some init genesis methods must run before others. Ensure the dependencies are understood before modifying this list
|
// Warning: Some init genesis methods must run before others. Ensure the dependencies are understood before modifying this list
|
||||||
@ -992,7 +1007,8 @@ func NewApp(
|
|||||||
metricstypes.ModuleName,
|
metricstypes.ModuleName,
|
||||||
consensusparamtypes.ModuleName,
|
consensusparamtypes.ModuleName,
|
||||||
packetforwardtypes.ModuleName,
|
packetforwardtypes.ModuleName,
|
||||||
crisistypes.ModuleName, // runs the invariants at genesis, should run after other modules
|
precisebanktypes.ModuleName, // Must be run after x/bank to verify reserve balance
|
||||||
|
crisistypes.ModuleName, // runs the invariants at genesis, should run after other modules
|
||||||
)
|
)
|
||||||
|
|
||||||
app.mm.RegisterInvariants(&app.crisisKeeper)
|
app.mm.RegisterInvariants(&app.crisisKeeper)
|
||||||
|
@ -53,6 +53,7 @@ import (
|
|||||||
issuancekeeper "github.com/kava-labs/kava/x/issuance/keeper"
|
issuancekeeper "github.com/kava-labs/kava/x/issuance/keeper"
|
||||||
kavadistkeeper "github.com/kava-labs/kava/x/kavadist/keeper"
|
kavadistkeeper "github.com/kava-labs/kava/x/kavadist/keeper"
|
||||||
liquidkeeper "github.com/kava-labs/kava/x/liquid/keeper"
|
liquidkeeper "github.com/kava-labs/kava/x/liquid/keeper"
|
||||||
|
precisebankkeeper "github.com/kava-labs/kava/x/precisebank/keeper"
|
||||||
pricefeedkeeper "github.com/kava-labs/kava/x/pricefeed/keeper"
|
pricefeedkeeper "github.com/kava-labs/kava/x/pricefeed/keeper"
|
||||||
routerkeeper "github.com/kava-labs/kava/x/router/keeper"
|
routerkeeper "github.com/kava-labs/kava/x/router/keeper"
|
||||||
savingskeeper "github.com/kava-labs/kava/x/savings/keeper"
|
savingskeeper "github.com/kava-labs/kava/x/savings/keeper"
|
||||||
@ -108,33 +109,34 @@ func NewTestAppFromSealed() TestApp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// nolint
|
// nolint
|
||||||
func (tApp TestApp) GetAccountKeeper() authkeeper.AccountKeeper { return tApp.accountKeeper }
|
func (tApp TestApp) GetAccountKeeper() authkeeper.AccountKeeper { return tApp.accountKeeper }
|
||||||
func (tApp TestApp) GetBankKeeper() bankkeeper.Keeper { return tApp.bankKeeper }
|
func (tApp TestApp) GetBankKeeper() bankkeeper.Keeper { return tApp.bankKeeper }
|
||||||
func (tApp TestApp) GetMintKeeper() mintkeeper.Keeper { return tApp.mintKeeper }
|
func (tApp TestApp) GetMintKeeper() mintkeeper.Keeper { return tApp.mintKeeper }
|
||||||
func (tApp TestApp) GetStakingKeeper() *stakingkeeper.Keeper { return tApp.stakingKeeper }
|
func (tApp TestApp) GetStakingKeeper() *stakingkeeper.Keeper { return tApp.stakingKeeper }
|
||||||
func (tApp TestApp) GetSlashingKeeper() slashingkeeper.Keeper { return tApp.slashingKeeper }
|
func (tApp TestApp) GetSlashingKeeper() slashingkeeper.Keeper { return tApp.slashingKeeper }
|
||||||
func (tApp TestApp) GetDistrKeeper() distkeeper.Keeper { return tApp.distrKeeper }
|
func (tApp TestApp) GetDistrKeeper() distkeeper.Keeper { return tApp.distrKeeper }
|
||||||
func (tApp TestApp) GetGovKeeper() govkeeper.Keeper { return tApp.govKeeper }
|
func (tApp TestApp) GetGovKeeper() govkeeper.Keeper { return tApp.govKeeper }
|
||||||
func (tApp TestApp) GetCrisisKeeper() crisiskeeper.Keeper { return tApp.crisisKeeper }
|
func (tApp TestApp) GetCrisisKeeper() crisiskeeper.Keeper { return tApp.crisisKeeper }
|
||||||
func (tApp TestApp) GetParamsKeeper() paramskeeper.Keeper { return tApp.paramsKeeper }
|
func (tApp TestApp) GetParamsKeeper() paramskeeper.Keeper { return tApp.paramsKeeper }
|
||||||
func (tApp TestApp) GetKavadistKeeper() kavadistkeeper.Keeper { return tApp.kavadistKeeper }
|
func (tApp TestApp) GetKavadistKeeper() kavadistkeeper.Keeper { return tApp.kavadistKeeper }
|
||||||
func (tApp TestApp) GetAuctionKeeper() auctionkeeper.Keeper { return tApp.auctionKeeper }
|
func (tApp TestApp) GetAuctionKeeper() auctionkeeper.Keeper { return tApp.auctionKeeper }
|
||||||
func (tApp TestApp) GetIssuanceKeeper() issuancekeeper.Keeper { return tApp.issuanceKeeper }
|
func (tApp TestApp) GetIssuanceKeeper() issuancekeeper.Keeper { return tApp.issuanceKeeper }
|
||||||
func (tApp TestApp) GetBep3Keeper() bep3keeper.Keeper { return tApp.bep3Keeper }
|
func (tApp TestApp) GetBep3Keeper() bep3keeper.Keeper { return tApp.bep3Keeper }
|
||||||
func (tApp TestApp) GetPriceFeedKeeper() pricefeedkeeper.Keeper { return tApp.pricefeedKeeper }
|
func (tApp TestApp) GetPriceFeedKeeper() pricefeedkeeper.Keeper { return tApp.pricefeedKeeper }
|
||||||
func (tApp TestApp) GetSwapKeeper() swapkeeper.Keeper { return tApp.swapKeeper }
|
func (tApp TestApp) GetSwapKeeper() swapkeeper.Keeper { return tApp.swapKeeper }
|
||||||
func (tApp TestApp) GetCDPKeeper() cdpkeeper.Keeper { return tApp.cdpKeeper }
|
func (tApp TestApp) GetCDPKeeper() cdpkeeper.Keeper { return tApp.cdpKeeper }
|
||||||
func (tApp TestApp) GetHardKeeper() hardkeeper.Keeper { return tApp.hardKeeper }
|
func (tApp TestApp) GetHardKeeper() hardkeeper.Keeper { return tApp.hardKeeper }
|
||||||
func (tApp TestApp) GetCommitteeKeeper() committeekeeper.Keeper { return tApp.committeeKeeper }
|
func (tApp TestApp) GetCommitteeKeeper() committeekeeper.Keeper { return tApp.committeeKeeper }
|
||||||
func (tApp TestApp) GetIncentiveKeeper() incentivekeeper.Keeper { return tApp.incentiveKeeper }
|
func (tApp TestApp) GetIncentiveKeeper() incentivekeeper.Keeper { return tApp.incentiveKeeper }
|
||||||
func (tApp TestApp) GetEvmutilKeeper() evmutilkeeper.Keeper { return tApp.evmutilKeeper }
|
func (tApp TestApp) GetEvmutilKeeper() evmutilkeeper.Keeper { return tApp.evmutilKeeper }
|
||||||
func (tApp TestApp) GetEvmKeeper() *evmkeeper.Keeper { return tApp.evmKeeper }
|
func (tApp TestApp) GetEvmKeeper() *evmkeeper.Keeper { return tApp.evmKeeper }
|
||||||
func (tApp TestApp) GetSavingsKeeper() savingskeeper.Keeper { return tApp.savingsKeeper }
|
func (tApp TestApp) GetSavingsKeeper() savingskeeper.Keeper { return tApp.savingsKeeper }
|
||||||
func (tApp TestApp) GetFeeMarketKeeper() feemarketkeeper.Keeper { return tApp.feeMarketKeeper }
|
func (tApp TestApp) GetFeeMarketKeeper() feemarketkeeper.Keeper { return tApp.feeMarketKeeper }
|
||||||
func (tApp TestApp) GetLiquidKeeper() liquidkeeper.Keeper { return tApp.liquidKeeper }
|
func (tApp TestApp) GetLiquidKeeper() liquidkeeper.Keeper { return tApp.liquidKeeper }
|
||||||
func (tApp TestApp) GetEarnKeeper() earnkeeper.Keeper { return tApp.earnKeeper }
|
func (tApp TestApp) GetEarnKeeper() earnkeeper.Keeper { return tApp.earnKeeper }
|
||||||
func (tApp TestApp) GetRouterKeeper() routerkeeper.Keeper { return tApp.routerKeeper }
|
func (tApp TestApp) GetRouterKeeper() routerkeeper.Keeper { return tApp.routerKeeper }
|
||||||
func (tApp TestApp) GetCommunityKeeper() communitykeeper.Keeper { return tApp.communityKeeper }
|
func (tApp TestApp) GetCommunityKeeper() communitykeeper.Keeper { return tApp.communityKeeper }
|
||||||
|
func (tApp TestApp) GetPrecisebankKeeper() precisebankkeeper.Keeper { return tApp.precisebankKeeper }
|
||||||
|
|
||||||
func (tApp TestApp) GetKVStoreKey(key string) *storetypes.KVStoreKey {
|
func (tApp TestApp) GetKVStoreKey(key string) *storetypes.KVStoreKey {
|
||||||
return tApp.keys[key]
|
return tApp.keys[key]
|
||||||
|
1
ci/env/kava-protonet/genesis.json
vendored
1
ci/env/kava-protonet/genesis.json
vendored
@ -3006,6 +3006,7 @@
|
|||||||
},
|
},
|
||||||
"in_flight_packets": {}
|
"in_flight_packets": {}
|
||||||
},
|
},
|
||||||
|
"precisebank": {},
|
||||||
"pricefeed": {
|
"pricefeed": {
|
||||||
"params": {
|
"params": {
|
||||||
"markets": [
|
"markets": [
|
||||||
|
@ -476,6 +476,9 @@
|
|||||||
|
|
||||||
- [Msg](#kava.liquid.v1beta1.Msg)
|
- [Msg](#kava.liquid.v1beta1.Msg)
|
||||||
|
|
||||||
|
- [kava/precisebank/v1/genesis.proto](#kava/precisebank/v1/genesis.proto)
|
||||||
|
- [GenesisState](#kava.precisebank.v1.GenesisState)
|
||||||
|
|
||||||
- [kava/pricefeed/v1beta1/store.proto](#kava/pricefeed/v1beta1/store.proto)
|
- [kava/pricefeed/v1beta1/store.proto](#kava/pricefeed/v1beta1/store.proto)
|
||||||
- [CurrentPrice](#kava.pricefeed.v1beta1.CurrentPrice)
|
- [CurrentPrice](#kava.pricefeed.v1beta1.CurrentPrice)
|
||||||
- [Market](#kava.pricefeed.v1beta1.Market)
|
- [Market](#kava.pricefeed.v1beta1.Market)
|
||||||
@ -6624,6 +6627,32 @@ Msg defines the liquid Msg service.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="kava/precisebank/v1/genesis.proto"></a>
|
||||||
|
<p align="right"><a href="#top">Top</a></p>
|
||||||
|
|
||||||
|
## kava/precisebank/v1/genesis.proto
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="kava.precisebank.v1.GenesisState"></a>
|
||||||
|
|
||||||
|
### GenesisState
|
||||||
|
GenesisState defines the precisebank module's genesis state.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- end messages -->
|
||||||
|
|
||||||
|
<!-- end enums -->
|
||||||
|
|
||||||
|
<!-- end HasExtensions -->
|
||||||
|
|
||||||
|
<!-- end services -->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="kava/pricefeed/v1beta1/store.proto"></a>
|
<a name="kava/pricefeed/v1beta1/store.proto"></a>
|
||||||
<p align="right"><a href="#top">Top</a></p>
|
<p align="right"><a href="#top">Top</a></p>
|
||||||
|
|
||||||
|
7
proto/kava/precisebank/v1/genesis.proto
Normal file
7
proto/kava/precisebank/v1/genesis.proto
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package kava.precisebank.v1;
|
||||||
|
|
||||||
|
option go_package = "github.com/kava-labs/kava/x/precisebank/types";
|
||||||
|
|
||||||
|
// GenesisState defines the precisebank module's genesis state.
|
||||||
|
message GenesisState {}
|
12
x/precisebank/README.md
Normal file
12
x/precisebank/README.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# `x/precisebank`
|
||||||
|
|
||||||
|
## Abstract
|
||||||
|
|
||||||
|
This document specifies the precisebank module of Kava.
|
||||||
|
|
||||||
|
The precisebank module is responsible for extending the precision of `x/bank`,
|
||||||
|
intended to be used for the `x/evm`. It serves as a wrapper of `x/bank` to
|
||||||
|
increase the precision of KAVA from 6 to 18 decimals, while preserving the
|
||||||
|
behavior of existing `x/bank` balances.
|
||||||
|
|
||||||
|
This module is used only by `x/evm` where 18 decimal points are expected.
|
37
x/precisebank/genesis.go
Normal file
37
x/precisebank/genesis.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package precisebank
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/keeper"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// InitGenesis initializes the store state from a genesis state.
|
||||||
|
func InitGenesis(
|
||||||
|
ctx sdk.Context,
|
||||||
|
keeper keeper.Keeper,
|
||||||
|
ak types.AccountKeeper,
|
||||||
|
gs *types.GenesisState,
|
||||||
|
) {
|
||||||
|
if err := gs.Validate(); err != nil {
|
||||||
|
panic(fmt.Sprintf("failed to validate %s genesis state: %s", types.ModuleName, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize module account
|
||||||
|
if moduleAcc := ak.GetModuleAccount(ctx, types.ModuleName); moduleAcc == nil {
|
||||||
|
panic(fmt.Sprintf("%s module account has not been set", types.ModuleName))
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
// - Set balances
|
||||||
|
// - Ensure reserve account exists
|
||||||
|
// - Ensure reserve balance matches sum of all fractional balances
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExportGenesis returns a GenesisState for a given context and keeper.
|
||||||
|
func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState {
|
||||||
|
return types.NewGenesisState()
|
||||||
|
}
|
133
x/precisebank/genesis_test.go
Normal file
133
x/precisebank/genesis_test.go
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package precisebank_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/kava-labs/kava/x/precisebank"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/testutil"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
type KeeperTestSuite struct {
|
||||||
|
testutil.Suite
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *KeeperTestSuite) TestInitGenesis() {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
genesisState *types.GenesisState
|
||||||
|
shouldPanic bool
|
||||||
|
panicMsg string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"default genesisState",
|
||||||
|
types.DefaultGenesisState(),
|
||||||
|
false,
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"empty genesisState",
|
||||||
|
&types.GenesisState{},
|
||||||
|
false,
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"TODO: invalid genesisState",
|
||||||
|
&types.GenesisState{},
|
||||||
|
false,
|
||||||
|
"",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
suite.Run(tc.name, func() {
|
||||||
|
if tc.shouldPanic {
|
||||||
|
suite.Require().Panics(func() {
|
||||||
|
precisebank.InitGenesis(suite.Ctx, suite.Keeper, suite.AccountKeeper, tc.genesisState)
|
||||||
|
}, tc.panicMsg)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.Require().NotPanics(func() {
|
||||||
|
precisebank.InitGenesis(suite.Ctx, suite.Keeper, suite.AccountKeeper, tc.genesisState)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Ensure module account is created
|
||||||
|
moduleAcc := suite.AccountKeeper.GetModuleAccount(suite.Ctx, types.ModuleName)
|
||||||
|
suite.NotNil(moduleAcc, "module account should be created")
|
||||||
|
|
||||||
|
// TODO: Check module state once implemented
|
||||||
|
|
||||||
|
// - Verify balances
|
||||||
|
// - Ensure reserve account exists
|
||||||
|
// - Ensure reserve balance matches sum of all fractional balances
|
||||||
|
// - etc
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *KeeperTestSuite) TestExportGenesis_Valid() {
|
||||||
|
// ExportGenesis(moduleState) should return a valid genesis state
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
maleate func()
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"InitGenesis(DefaultGenesisState)",
|
||||||
|
func() {
|
||||||
|
precisebank.InitGenesis(
|
||||||
|
suite.Ctx,
|
||||||
|
suite.Keeper,
|
||||||
|
suite.AccountKeeper,
|
||||||
|
types.DefaultGenesisState(),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
suite.Run(tc.name, func() {
|
||||||
|
tc.maleate()
|
||||||
|
|
||||||
|
genesisState := precisebank.ExportGenesis(suite.Ctx, suite.Keeper)
|
||||||
|
|
||||||
|
suite.Require().NoError(genesisState.Validate(), "exported genesis state should be valid")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *KeeperTestSuite) TestExportImportedState() {
|
||||||
|
// ExportGenesis(InitGenesis(genesisState)) == genesisState
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
initGenesisState *types.GenesisState
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"InitGenesis(DefaultGenesisState)",
|
||||||
|
types.DefaultGenesisState(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range tests {
|
||||||
|
suite.Run(tc.name, func() {
|
||||||
|
suite.Require().NotPanics(func() {
|
||||||
|
precisebank.InitGenesis(
|
||||||
|
suite.Ctx,
|
||||||
|
suite.Keeper,
|
||||||
|
suite.AccountKeeper,
|
||||||
|
tc.initGenesisState,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
genesisState := precisebank.ExportGenesis(suite.Ctx, suite.Keeper)
|
||||||
|
suite.Require().NoError(genesisState.Validate(), "exported genesis state should be valid")
|
||||||
|
|
||||||
|
suite.Require().Equal(
|
||||||
|
tc.initGenesisState,
|
||||||
|
genesisState,
|
||||||
|
"exported genesis state should equal initial genesis state",
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
21
x/precisebank/keeper/invariants.go
Normal file
21
x/precisebank/keeper/invariants.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package keeper
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RegisterInvariants registers the x/precisebank module invariants
|
||||||
|
func RegisterInvariants(
|
||||||
|
ir sdk.InvariantRegistry,
|
||||||
|
k Keeper,
|
||||||
|
bk types.BankKeeper,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// AllInvariants runs all invariants of the X/precisebank module.
|
||||||
|
func AllInvariants(k Keeper) sdk.Invariant {
|
||||||
|
return func(ctx sdk.Context) (string, bool) {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
}
|
23
x/precisebank/keeper/keeper.go
Normal file
23
x/precisebank/keeper/keeper.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package keeper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO: Enforce that Keeper implements the expected keeper interfaces
|
||||||
|
// var _ types.BankKeeper = Keeper{}
|
||||||
|
|
||||||
|
// Keeper defines the precisebank module's keeper
|
||||||
|
type Keeper struct {
|
||||||
|
cdc codec.BinaryCodec
|
||||||
|
storeKey storetypes.StoreKey
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewKeeper creates a new keeper
|
||||||
|
func NewKeeper(cdc codec.BinaryCodec, storeKey storetypes.StoreKey) Keeper {
|
||||||
|
return Keeper{
|
||||||
|
cdc: cdc,
|
||||||
|
storeKey: storeKey,
|
||||||
|
}
|
||||||
|
}
|
154
x/precisebank/module.go
Normal file
154
x/precisebank/module.go
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
package precisebank
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"github.com/grpc-ecosystem/grpc-gateway/runtime"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
abci "github.com/cometbft/cometbft/abci/types"
|
||||||
|
|
||||||
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
"github.com/cosmos/cosmos-sdk/types/module"
|
||||||
|
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/keeper"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ConsensusVersion defines the current module consensus version.
|
||||||
|
const ConsensusVersion = 1
|
||||||
|
|
||||||
|
var (
|
||||||
|
_ module.AppModule = AppModule{}
|
||||||
|
_ module.AppModuleBasic = AppModuleBasic{}
|
||||||
|
)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// AppModuleBasic
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// AppModuleBasic app module basics object
|
||||||
|
type AppModuleBasic struct{}
|
||||||
|
|
||||||
|
func NewAppModuleBasic() AppModuleBasic {
|
||||||
|
return AppModuleBasic{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name get module name
|
||||||
|
func (AppModuleBasic) Name() string {
|
||||||
|
return types.ModuleName
|
||||||
|
}
|
||||||
|
|
||||||
|
// Registers legacy amino codec
|
||||||
|
func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
|
||||||
|
types.RegisterLegacyAminoCodec(cdc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterInterfaces registers the module's interface types
|
||||||
|
func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) {
|
||||||
|
types.RegisterInterfaces(reg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultGenesis default genesis state
|
||||||
|
func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage {
|
||||||
|
gs := types.DefaultGenesisState()
|
||||||
|
return cdc.MustMarshalJSON(gs)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateGenesis module validate genesis
|
||||||
|
func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error {
|
||||||
|
var gs types.GenesisState
|
||||||
|
err := cdc.UnmarshalJSON(bz, &gs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return gs.Validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for precisebank module.
|
||||||
|
func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTxCmd returns precisebank module's root tx command.
|
||||||
|
func (a AppModuleBasic) GetTxCmd() *cobra.Command {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetQueryCmd returns precisebank module's root query command.
|
||||||
|
func (AppModuleBasic) GetQueryCmd() *cobra.Command {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// AppModule
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// AppModule implements the AppModule interface for precisebank module.
|
||||||
|
type AppModule struct {
|
||||||
|
AppModuleBasic
|
||||||
|
|
||||||
|
keeper keeper.Keeper
|
||||||
|
accountKeeper types.AccountKeeper
|
||||||
|
bankKeeper types.BankKeeper
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAppModule creates a new AppModule object
|
||||||
|
func NewAppModule(
|
||||||
|
keeper keeper.Keeper,
|
||||||
|
bankKeeper types.BankKeeper,
|
||||||
|
accountKeeper types.AccountKeeper,
|
||||||
|
) AppModule {
|
||||||
|
return AppModule{
|
||||||
|
AppModuleBasic: NewAppModuleBasic(),
|
||||||
|
keeper: keeper,
|
||||||
|
accountKeeper: accountKeeper,
|
||||||
|
bankKeeper: bankKeeper,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Name returns precisebank module's name.
|
||||||
|
func (am AppModule) Name() string {
|
||||||
|
return am.AppModuleBasic.Name()
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterServices registers a GRPC query service to respond to the
|
||||||
|
// module-specific GRPC queries.
|
||||||
|
func (am AppModule) RegisterServices(cfg module.Configurator) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterInvariants registers precisebank module's invariants.
|
||||||
|
func (am AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {
|
||||||
|
keeper.RegisterInvariants(ir, am.keeper, am.bankKeeper)
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitGenesis performs precisebank module's genesis initialization It returns
|
||||||
|
// no validator updates.
|
||||||
|
func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate {
|
||||||
|
var genState types.GenesisState
|
||||||
|
// Initialize global index to index in genesis state
|
||||||
|
cdc.MustUnmarshalJSON(gs, &genState)
|
||||||
|
|
||||||
|
InitGenesis(ctx, am.keeper, am.accountKeeper, &genState)
|
||||||
|
return []abci.ValidatorUpdate{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExportGenesis returns precisebank module's exported genesis state as raw JSON bytes.
|
||||||
|
func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage {
|
||||||
|
gs := ExportGenesis(ctx, am.keeper)
|
||||||
|
return cdc.MustMarshalJSON(gs)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConsensusVersion implements ConsensusVersion.
|
||||||
|
func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion }
|
||||||
|
|
||||||
|
// BeginBlock executes all ABCI BeginBlock logic respective to precisebank module.
|
||||||
|
func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) {}
|
||||||
|
|
||||||
|
// EndBlock executes all ABCI EndBlock logic respective to precisebank module. It
|
||||||
|
// returns no validator updates.
|
||||||
|
func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate {
|
||||||
|
return []abci.ValidatorUpdate{}
|
||||||
|
}
|
89
x/precisebank/testutil/suite.go
Normal file
89
x/precisebank/testutil/suite.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package testutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
abci "github.com/cometbft/cometbft/abci/types"
|
||||||
|
"github.com/cometbft/cometbft/crypto/tmhash"
|
||||||
|
tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
|
||||||
|
tmversion "github.com/cometbft/cometbft/proto/tendermint/version"
|
||||||
|
tmtime "github.com/cometbft/cometbft/types/time"
|
||||||
|
"github.com/cometbft/cometbft/version"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
||||||
|
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
||||||
|
"github.com/evmos/ethermint/crypto/ethsecp256k1"
|
||||||
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
|
"github.com/kava-labs/kava/app"
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/keeper"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Suite struct {
|
||||||
|
suite.Suite
|
||||||
|
|
||||||
|
App app.TestApp
|
||||||
|
Ctx sdk.Context
|
||||||
|
BankKeeper bankkeeper.Keeper
|
||||||
|
AccountKeeper authkeeper.AccountKeeper
|
||||||
|
Keeper keeper.Keeper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *Suite) SetupTest() {
|
||||||
|
tApp := app.NewTestApp()
|
||||||
|
|
||||||
|
suite.Ctx = tApp.NewContext(true, tmproto.Header{Height: 1, Time: tmtime.Now()})
|
||||||
|
suite.App = tApp
|
||||||
|
suite.BankKeeper = tApp.GetBankKeeper()
|
||||||
|
suite.AccountKeeper = tApp.GetAccountKeeper()
|
||||||
|
suite.Keeper = tApp.GetPrecisebankKeeper()
|
||||||
|
|
||||||
|
cdc := suite.App.AppCodec()
|
||||||
|
coins := sdk.NewCoins(sdk.NewInt64Coin("ukava", 1000_000_000_000_000_000))
|
||||||
|
authGS := app.NewFundedGenStateWithSameCoins(cdc, coins, []sdk.AccAddress{})
|
||||||
|
|
||||||
|
gs := app.GenesisState{}
|
||||||
|
suite.App.InitializeFromGenesisStates(authGS, gs)
|
||||||
|
|
||||||
|
// consensus key - needed to set up evm module
|
||||||
|
consPriv, err := ethsecp256k1.GenerateKey()
|
||||||
|
suite.Require().NoError(err)
|
||||||
|
consAddress := sdk.ConsAddress(consPriv.PubKey().Address())
|
||||||
|
|
||||||
|
// InitializeFromGenesisStates commits first block so we start at 2 here
|
||||||
|
suite.Ctx = suite.App.NewContext(false, tmproto.Header{
|
||||||
|
Height: suite.App.LastBlockHeight() + 1,
|
||||||
|
ChainID: app.TestChainId,
|
||||||
|
Time: time.Now().UTC(),
|
||||||
|
ProposerAddress: consAddress.Bytes(),
|
||||||
|
Version: tmversion.Consensus{
|
||||||
|
Block: version.BlockProtocol,
|
||||||
|
},
|
||||||
|
LastBlockId: tmproto.BlockID{
|
||||||
|
Hash: tmhash.Sum([]byte("block_id")),
|
||||||
|
PartSetHeader: tmproto.PartSetHeader{
|
||||||
|
Total: 11,
|
||||||
|
Hash: tmhash.Sum([]byte("partset_header")),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
AppHash: tmhash.Sum([]byte("app")),
|
||||||
|
DataHash: tmhash.Sum([]byte("data")),
|
||||||
|
EvidenceHash: tmhash.Sum([]byte("evidence")),
|
||||||
|
ValidatorsHash: tmhash.Sum([]byte("validators")),
|
||||||
|
NextValidatorsHash: tmhash.Sum([]byte("next_validators")),
|
||||||
|
ConsensusHash: tmhash.Sum([]byte("consensus")),
|
||||||
|
LastResultsHash: tmhash.Sum([]byte("last_result")),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *Suite) Commit() {
|
||||||
|
_ = suite.App.Commit()
|
||||||
|
header := suite.Ctx.BlockHeader()
|
||||||
|
header.Height += 1
|
||||||
|
suite.App.BeginBlock(abci.RequestBeginBlock{
|
||||||
|
Header: header,
|
||||||
|
})
|
||||||
|
|
||||||
|
// update ctx
|
||||||
|
suite.Ctx = suite.App.NewContext(false, header)
|
||||||
|
}
|
33
x/precisebank/types/codec.go
Normal file
33
x/precisebank/types/codec.go
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||||
|
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
authzcodec "github.com/cosmos/cosmos-sdk/x/authz/codec"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RegisterLegacyAminoCodec registers the necessary evmutil interfaces and concrete types
|
||||||
|
// on the provided LegacyAmino codec. These types are used for Amino JSON serialization.
|
||||||
|
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterInterfaces(registry cdctypes.InterfaceRegistry) {
|
||||||
|
registry.RegisterImplementations((*sdk.Msg)(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
amino = codec.NewLegacyAmino()
|
||||||
|
ModuleCdc = codec.NewAminoCodec(amino)
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterLegacyAminoCodec(amino)
|
||||||
|
cryptocodec.RegisterCrypto(amino)
|
||||||
|
amino.Seal()
|
||||||
|
|
||||||
|
// Register all Amino interfaces and concrete types on the authz Amino codec so that this can later be
|
||||||
|
// used to properly serialize MsgGrant and MsgExec instances
|
||||||
|
RegisterLegacyAminoCodec(authzcodec.Amino)
|
||||||
|
}
|
23
x/precisebank/types/expected_keepers.go
Normal file
23
x/precisebank/types/expected_keepers.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||||
|
evmtypes "github.com/evmos/ethermint/x/evm/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AccountKeeper defines the expected account keeper interface
|
||||||
|
type AccountKeeper interface {
|
||||||
|
GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI
|
||||||
|
GetModuleAddress(moduleName string) sdk.AccAddress
|
||||||
|
GetSequence(sdk.Context, sdk.AccAddress) (uint64, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// BankKeeper defines the expected bank keeper interface
|
||||||
|
type BankKeeper interface {
|
||||||
|
evmtypes.BankKeeper
|
||||||
|
|
||||||
|
GetSupply(ctx sdk.Context, denom string) sdk.Coin
|
||||||
|
SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins
|
||||||
|
SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error
|
||||||
|
}
|
17
x/precisebank/types/genesis.go
Normal file
17
x/precisebank/types/genesis.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
// Validate performs basic validation of supply genesis data returning an
|
||||||
|
// error for any failed validation criteria.
|
||||||
|
func (gs *GenesisState) Validate() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewGenesisState creates a new genesis state.
|
||||||
|
func NewGenesisState() *GenesisState {
|
||||||
|
return &GenesisState{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultGenesisState returns a default genesis state.
|
||||||
|
func DefaultGenesisState() *GenesisState {
|
||||||
|
return NewGenesisState()
|
||||||
|
}
|
264
x/precisebank/types/genesis.pb.go
Normal file
264
x/precisebank/types/genesis.pb.go
Normal file
@ -0,0 +1,264 @@
|
|||||||
|
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||||
|
// source: kava/precisebank/v1/genesis.proto
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
proto "github.com/cosmos/gogoproto/proto"
|
||||||
|
io "io"
|
||||||
|
math "math"
|
||||||
|
math_bits "math/bits"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
|
||||||
|
|
||||||
|
// GenesisState defines the precisebank module's genesis state.
|
||||||
|
type GenesisState struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GenesisState) Reset() { *m = GenesisState{} }
|
||||||
|
func (m *GenesisState) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GenesisState) ProtoMessage() {}
|
||||||
|
func (*GenesisState) Descriptor() ([]byte, []int) {
|
||||||
|
return fileDescriptor_7f1c47a86fb0d2e0, []int{0}
|
||||||
|
}
|
||||||
|
func (m *GenesisState) XXX_Unmarshal(b []byte) error {
|
||||||
|
return m.Unmarshal(b)
|
||||||
|
}
|
||||||
|
func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||||
|
if deterministic {
|
||||||
|
return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic)
|
||||||
|
} else {
|
||||||
|
b = b[:cap(b)]
|
||||||
|
n, err := m.MarshalToSizedBuffer(b)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return b[:n], nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (m *GenesisState) XXX_Merge(src proto.Message) {
|
||||||
|
xxx_messageInfo_GenesisState.Merge(m, src)
|
||||||
|
}
|
||||||
|
func (m *GenesisState) XXX_Size() int {
|
||||||
|
return m.Size()
|
||||||
|
}
|
||||||
|
func (m *GenesisState) XXX_DiscardUnknown() {
|
||||||
|
xxx_messageInfo_GenesisState.DiscardUnknown(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
var xxx_messageInfo_GenesisState proto.InternalMessageInfo
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*GenesisState)(nil), "kava.precisebank.v1.GenesisState")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("kava/precisebank/v1/genesis.proto", fileDescriptor_7f1c47a86fb0d2e0) }
|
||||||
|
|
||||||
|
var fileDescriptor_7f1c47a86fb0d2e0 = []byte{
|
||||||
|
// 145 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xcc, 0x4e, 0x2c, 0x4b,
|
||||||
|
0xd4, 0x2f, 0x28, 0x4a, 0x4d, 0xce, 0x2c, 0x4e, 0x4d, 0x4a, 0xcc, 0xcb, 0xd6, 0x2f, 0x33, 0xd4,
|
||||||
|
0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x06,
|
||||||
|
0x29, 0xd1, 0x43, 0x52, 0xa2, 0x57, 0x66, 0xa8, 0xc4, 0xc7, 0xc5, 0xe3, 0x0e, 0x51, 0x15, 0x5c,
|
||||||
|
0x92, 0x58, 0x92, 0xea, 0xe4, 0x7e, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, 0x8c, 0x0f, 0x1e,
|
||||||
|
0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, 0x72, 0x0c, 0x51,
|
||||||
|
0xba, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x20, 0x93, 0x74, 0x73,
|
||||||
|
0x12, 0x93, 0x8a, 0xc1, 0x2c, 0xfd, 0x0a, 0x14, 0x8b, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8,
|
||||||
|
0xc0, 0x96, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x51, 0x07, 0x09, 0x29, 0x99, 0x00, 0x00,
|
||||||
|
0x00,
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GenesisState) Marshal() (dAtA []byte, err error) {
|
||||||
|
size := m.Size()
|
||||||
|
dAtA = make([]byte, size)
|
||||||
|
n, err := m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return dAtA[:n], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) {
|
||||||
|
size := m.Size()
|
||||||
|
return m.MarshalToSizedBuffer(dAtA[:size])
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||||
|
i := len(dAtA)
|
||||||
|
_ = i
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
return len(dAtA) - i, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int {
|
||||||
|
offset -= sovGenesis(v)
|
||||||
|
base := offset
|
||||||
|
for v >= 1<<7 {
|
||||||
|
dAtA[offset] = uint8(v&0x7f | 0x80)
|
||||||
|
v >>= 7
|
||||||
|
offset++
|
||||||
|
}
|
||||||
|
dAtA[offset] = uint8(v)
|
||||||
|
return base
|
||||||
|
}
|
||||||
|
func (m *GenesisState) Size() (n int) {
|
||||||
|
if m == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
var l int
|
||||||
|
_ = l
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
func sovGenesis(x uint64) (n int) {
|
||||||
|
return (math_bits.Len64(x|1) + 6) / 7
|
||||||
|
}
|
||||||
|
func sozGenesis(x uint64) (n int) {
|
||||||
|
return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
||||||
|
}
|
||||||
|
func (m *GenesisState) Unmarshal(dAtA []byte) error {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
preIndex := iNdEx
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return ErrIntOverflowGenesis
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= uint64(b&0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fieldNum := int32(wire >> 3)
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
if wireType == 4 {
|
||||||
|
return fmt.Errorf("proto: GenesisState: wiretype end group for non-group")
|
||||||
|
}
|
||||||
|
if fieldNum <= 0 {
|
||||||
|
return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire)
|
||||||
|
}
|
||||||
|
switch fieldNum {
|
||||||
|
default:
|
||||||
|
iNdEx = preIndex
|
||||||
|
skippy, err := skipGenesis(dAtA[iNdEx:])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if (skippy < 0) || (iNdEx+skippy) < 0 {
|
||||||
|
return ErrInvalidLengthGenesis
|
||||||
|
}
|
||||||
|
if (iNdEx + skippy) > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx += skippy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iNdEx > l {
|
||||||
|
return io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func skipGenesis(dAtA []byte) (n int, err error) {
|
||||||
|
l := len(dAtA)
|
||||||
|
iNdEx := 0
|
||||||
|
depth := 0
|
||||||
|
for iNdEx < l {
|
||||||
|
var wire uint64
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowGenesis
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
wire |= (uint64(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wireType := int(wire & 0x7)
|
||||||
|
switch wireType {
|
||||||
|
case 0:
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowGenesis
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
iNdEx++
|
||||||
|
if dAtA[iNdEx-1] < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
iNdEx += 8
|
||||||
|
case 2:
|
||||||
|
var length int
|
||||||
|
for shift := uint(0); ; shift += 7 {
|
||||||
|
if shift >= 64 {
|
||||||
|
return 0, ErrIntOverflowGenesis
|
||||||
|
}
|
||||||
|
if iNdEx >= l {
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
b := dAtA[iNdEx]
|
||||||
|
iNdEx++
|
||||||
|
length |= (int(b) & 0x7F) << shift
|
||||||
|
if b < 0x80 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if length < 0 {
|
||||||
|
return 0, ErrInvalidLengthGenesis
|
||||||
|
}
|
||||||
|
iNdEx += length
|
||||||
|
case 3:
|
||||||
|
depth++
|
||||||
|
case 4:
|
||||||
|
if depth == 0 {
|
||||||
|
return 0, ErrUnexpectedEndOfGroupGenesis
|
||||||
|
}
|
||||||
|
depth--
|
||||||
|
case 5:
|
||||||
|
iNdEx += 4
|
||||||
|
default:
|
||||||
|
return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
|
||||||
|
}
|
||||||
|
if iNdEx < 0 {
|
||||||
|
return 0, ErrInvalidLengthGenesis
|
||||||
|
}
|
||||||
|
if depth == 0 {
|
||||||
|
return iNdEx, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, io.ErrUnexpectedEOF
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling")
|
||||||
|
ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow")
|
||||||
|
ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group")
|
||||||
|
)
|
47
x/precisebank/types/genesis_test.go
Normal file
47
x/precisebank/types/genesis_test.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package types_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/kava-labs/kava/x/precisebank/types"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGenesisStateValidate(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
genesisState types.GenesisState
|
||||||
|
expErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"empty genesisState",
|
||||||
|
types.GenesisState{},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valid genesisState",
|
||||||
|
// TODO: Fill out fields
|
||||||
|
types.GenesisState{},
|
||||||
|
false,
|
||||||
|
},
|
||||||
|
// TODO: Sum of balances does not equal an integer amount
|
||||||
|
// {
|
||||||
|
// "invalid balances",
|
||||||
|
// types.GenesisState{},
|
||||||
|
// true,
|
||||||
|
// },
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
tc := tc
|
||||||
|
t.Run(tc.name, func(tt *testing.T) {
|
||||||
|
err := tc.genesisState.Validate()
|
||||||
|
|
||||||
|
if tc.expErr {
|
||||||
|
require.Error(tt, err)
|
||||||
|
} else {
|
||||||
|
require.NoError(tt, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
11
x/precisebank/types/keys.go
Normal file
11
x/precisebank/types/keys.go
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package types
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ModuleName name that will be used throughout the module
|
||||||
|
ModuleName = "precisebank"
|
||||||
|
|
||||||
|
StoreKey = ModuleName
|
||||||
|
|
||||||
|
// RouterKey Top level router key
|
||||||
|
RouterKey = ModuleName
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user