Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Onboarding IBC middleware #103

Merged
merged 38 commits into from
Aug 6, 2023
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
37612b4
feat: onboarding IBC middleware
poorphd Apr 26, 2023
a44264e
fix: recovery test to use ibc/testing
poorphd Apr 26, 2023
12a1caf
refactor: package name change v6 -> v7
poorphd Apr 26, 2023
ba99a5b
docs: module specs
poorphd Apr 27, 2023
00b81a6
feat: proto for coinswap module
poorphd Apr 26, 2023
c61b8b0
feat: swap event emit in ibc callback
poorphd Apr 26, 2023
8ddce2a
test: convert fail test case added
poorphd Apr 21, 2023
305aee3
feat: WIP coinswap module
poorphd Apr 25, 2023
81e8fd6
refactor: delete migration code
poorphd Apr 21, 2023
31f6c9d
refactor: coinswap module for Canto
poorphd Apr 21, 2023
4f07331
fix: allowing vesting account
poorphd Apr 24, 2023
06746d5
fix: use ethsecp256k address for Canto address
poorphd Apr 24, 2023
73ff366
fix: emit swap event fix
poorphd Apr 25, 2023
1a9e72b
test: IBC transfer to a blocked addr
poorphd Apr 25, 2023
ef781ae
refactor: remove unnecessary test case
poorphd Apr 26, 2023
a137619
fix: default params for coinswap and upgrade handler to use the defau…
poorphd Apr 27, 2023
8f7d8be
refactor: package name v7 -> v6
poorphd Apr 26, 2023
9953db6
refactor: remove ibc/testing/simapp
poorphd Apr 26, 2023
ba3e0ea
fix: go mod
poorphd Apr 26, 2023
da6194f
fix: proto for coinswap
poorphd Apr 26, 2023
cadf019
refactor: sort imports and revert unnecessary changes
poorphd Apr 27, 2023
4bb9024
fix: package name change v7 -> v6
poorphd May 3, 2023
266930b
fix: bug in AmountOf
poorphd May 5, 2023
2b1b03e
fix: validate params
poorphd May 9, 2023
653d35b
fix: default max sawp amount
poorphd Jul 13, 2023
2aafb8e
fix: swappedAmount in error case
poorphd Jul 13, 2023
b186460
Merge remote-tracking branch 'upstream/main' into onboarding-middlewa…
poorphd Jul 24, 2023
b79a715
fix: resolve conflicts
poorphd Jul 24, 2023
4caeaf2
Merge pull request #22 from b-harvest/onboarding-middleware-conflict-…
poorphd Jul 25, 2023
9e54c11
Merge remote-tracking branch 'origin/canto-main' into onboarding-midd…
poorphd Jul 31, 2023
9bcebc8
Merge remote-tracking branch 'upstream/main' into onboarding-middlewa…
poorphd Aug 2, 2023
13f26e8
fix: SetupTestingCantoApp
poorphd Aug 2, 2023
b9e47d5
fix: coinswap module is added to simulation manager
poorphd Aug 2, 2023
6626290
fix: bug in coinswap module's param change simulation
poorphd Aug 3, 2023
6edd5d4
Merge commit 'd780d52648475e8887cacce73acec93ae59fb34b' into onboardi…
dongsam Aug 3, 2023
57b9208
Merge pull request #25 from b-harvest/onboarding-middleware-conflict-…
dongsam Aug 4, 2023
4240965
Merge commit main into onboarding-middleware
dongsam Aug 4, 2023
c497110
fix: update swagger for onboarding, coinswap module
dongsam Aug 4, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 87 additions & 29 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,9 @@ import (
"github.com/Canto-Network/Canto/v6/x/inflation"
inflationkeeper "github.com/Canto-Network/Canto/v6/x/inflation/keeper"
inflationtypes "github.com/Canto-Network/Canto/v6/x/inflation/types"
"github.com/Canto-Network/Canto/v6/x/onboarding"
onboardingkeeper "github.com/Canto-Network/Canto/v6/x/onboarding/keeper"
onboardingtypes "github.com/Canto-Network/Canto/v6/x/onboarding/types"
"github.com/Canto-Network/Canto/v6/x/recovery"
recoverykeeper "github.com/Canto-Network/Canto/v6/x/recovery/keeper"
recoverytypes "github.com/Canto-Network/Canto/v6/x/recovery/types"
Expand All @@ -140,10 +143,15 @@ import (
csrkeeper "github.com/Canto-Network/Canto/v6/x/csr/keeper"
csrtypes "github.com/Canto-Network/Canto/v6/x/csr/types"

"github.com/Canto-Network/Canto/v6/x/coinswap"
coinswapkeeper "github.com/Canto-Network/Canto/v6/x/coinswap/keeper"
coinswaptypes "github.com/Canto-Network/Canto/v6/x/coinswap/types"

v2 "github.com/Canto-Network/Canto/v6/app/upgrades/v2"
v3 "github.com/Canto-Network/Canto/v6/app/upgrades/v3"
v4 "github.com/Canto-Network/Canto/v6/app/upgrades/v4"
v5 "github.com/Canto-Network/Canto/v6/app/upgrades/v5"
v6 "github.com/Canto-Network/Canto/v6/app/upgrades/v6"
)

func init() {
Expand Down Expand Up @@ -204,7 +212,9 @@ var (
csr.AppModuleBasic{},
epochs.AppModuleBasic{},
recovery.AppModuleBasic{},
onboarding.AppModuleBasic{},
fees.AppModuleBasic{},
coinswap.AppModuleBasic{},
)

// module account permissions
Expand All @@ -220,6 +230,8 @@ var (
erc20types.ModuleName: {authtypes.Minter, authtypes.Burner},
csrtypes.ModuleName: {authtypes.Minter, authtypes.Burner},
govshuttletypes.ModuleName: {authtypes.Minter, authtypes.Burner},
onboardingtypes.ModuleName: {authtypes.Minter, authtypes.Burner},
coinswaptypes.ModuleName: {authtypes.Minter, authtypes.Burner},
}

// module accounts that are allowed to receive tokens
Expand Down Expand Up @@ -283,10 +295,14 @@ type Canto struct {
EpochsKeeper epochskeeper.Keeper
VestingKeeper vestingkeeper.Keeper
RecoveryKeeper *recoverykeeper.Keeper
OnboardingKeeper *onboardingkeeper.Keeper
FeesKeeper feeskeeper.Keeper
GovshuttleKeeper govshuttlekeeper.Keeper
CSRKeeper csrkeeper.Keeper

// Coinswap keeper
CoinswapKeeper coinswapkeeper.Keeper

// the module manager
mm *module.Manager

Expand Down Expand Up @@ -341,10 +357,12 @@ func NewCanto(
evmtypes.StoreKey, feemarkettypes.StoreKey,
// Canto keys
inflationtypes.StoreKey, erc20types.StoreKey,
epochstypes.StoreKey, vestingtypes.StoreKey, recoverytypes.StoreKey, //recoverytypes.StoreKe
epochstypes.StoreKey, vestingtypes.StoreKey, recoverytypes.StoreKey, onboardingtypes.StoreKey,
feestypes.StoreKey,
csrtypes.StoreKey,
govshuttletypes.StoreKey,
// Coinswap keys
coinswaptypes.StoreKey,
)

// Add the EVM transient store key
Expand Down Expand Up @@ -420,6 +438,16 @@ func NewCanto(
appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), &stakingKeeper, app.UpgradeKeeper, scopedIBCKeeper,
)

app.CoinswapKeeper = coinswapkeeper.NewKeeper(
appCodec,
keys[coinswaptypes.ModuleName],
app.GetSubspace(coinswaptypes.ModuleName),
app.BankKeeper,
app.AccountKeeper,
app.ModuleAccountAddrs(),
authtypes.FeeCollectorName,
)

// register the proposal types
govRouter := govtypes.NewRouter()
govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler).
Expand Down Expand Up @@ -505,19 +533,10 @@ func NewCanto(
// Create Transfer Stack

// SendPacket, since it is originating from the application to core IBC:
// transferKeeper.SendPacket -> claim.SendPacket -> recovery.SendPacket -> channel.SendPacket
// transferKeeper.SendPacket -> recovery.SendPacket -> onboarding.SendPacket -> channel.SendPacket

// RecvPacket, message that originates from core IBC and goes down to app, the flow is the otherway
// channel.RecvPacket -> recovery.OnRecvPacket -> claim.OnRecvPacket -> transfer.OnRecvPacket

// app.TransferKeeper = ibctransferkeeper.NewKeeper(
// appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), app.RecoveryKeeper,
// //nil, // ICS4 Wrapper: claims IBC middleware
// app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
// app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,
// )

// set Recovery Module as the ICS4Wrapper
// channel.RecvPacket -> onboarding.OnRecvPacket -> recovery.OnRecvPacket -> transfer.OnRecvPacket

app.RecoveryKeeper = recoverykeeper.NewKeeper(
app.GetSubspace(recoverytypes.ModuleName),
Expand All @@ -527,36 +546,35 @@ func NewCanto(
app.TransferKeeper,
)

app.OnboardingKeeper = onboardingkeeper.NewKeeper(
app.GetSubspace(onboardingtypes.ModuleName),
app.AccountKeeper,
app.BankKeeper,
app.IBCKeeper.ChannelKeeper,
app.TransferKeeper,
app.CoinswapKeeper,
app.Erc20Keeper,
)

app.TransferKeeper = ibctransferkeeper.NewKeeper(
appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), app.RecoveryKeeper,
//nil, // ICS4 Wrapper: claims IBC middleware
app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,
)

app.OnboardingKeeper.SetTransferKeeper(app.TransferKeeper)
app.RecoveryKeeper.SetTransferKeeper(app.TransferKeeper)

// app.TransferKeeper = ibctransferkeeper.NewKeeper(
// appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName),
// app.RecoveryKeeper,
// app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
// app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,
// )
// Set the ICS4 wrappers for claims and recovery middlewares
app.RecoveryKeeper.SetICS4Wrapper(app.IBCKeeper.ChannelKeeper)
// Set the ICS4 wrappers for onboarding and recovery middlewares
app.RecoveryKeeper.SetICS4Wrapper(app.OnboardingKeeper)
app.OnboardingKeeper.SetICS4Wrapper(app.IBCKeeper.ChannelKeeper)
// NOTE: ICS4 wrapper for Transfer Keeper already set

// set Recovery Module as the ICS4Wrapper
// app.TransferKeeper = ibctransferkeeper.NewKeeper(
// appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName),
// app.RecoveryKeeper,
// app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
// app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,
// )

// Override the ICS20 app module
transferModule := transfer.NewAppModule(app.TransferKeeper)

// transfer stack contains (from top to bottom):
// - Onboarding Middleware
// - Recovery Middleware
// - Transfer

Expand All @@ -565,6 +583,7 @@ func NewCanto(

transferStack = transfer.NewIBCModule(app.TransferKeeper)
transferStack = recovery.NewIBCMiddleware(*app.RecoveryKeeper, transferStack)
transferStack = onboarding.NewIBCMiddleware(*app.OnboardingKeeper, transferStack)

// Create static IBC router, add transfer route, then set and seal it
ibcRouter := porttypes.NewRouter()
Expand Down Expand Up @@ -618,9 +637,12 @@ func NewCanto(
epochs.NewAppModule(appCodec, app.EpochsKeeper),
vesting.NewAppModule(app.VestingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper),
recovery.NewAppModule(*app.RecoveryKeeper),
onboarding.NewAppModule(*app.OnboardingKeeper),
fees.NewAppModule(app.FeesKeeper, app.AccountKeeper),
govshuttle.NewAppModule(app.GovshuttleKeeper, app.AccountKeeper),
csr.NewAppModule(app.CSRKeeper, app.AccountKeeper),

coinswap.NewAppModule(appCodec, app.CoinswapKeeper, app.AccountKeeper, app.BankKeeper),
)

// During begin block slashing happens after distr.BeginBlocker so that
Expand Down Expand Up @@ -655,9 +677,11 @@ func NewCanto(
inflationtypes.ModuleName,
erc20types.ModuleName,
recoverytypes.ModuleName,
onboardingtypes.ModuleName,
feestypes.ModuleName,
govshuttletypes.ModuleName,
csrtypes.ModuleName,
coinswaptypes.ModuleName,
)

// NOTE: fee market module must go last in order to retrieve the block gas used.
Expand All @@ -670,6 +694,7 @@ func NewCanto(
// Note: epochs' endblock should be "real" end of epochs, we keep epochs endblock at the end
epochstypes.ModuleName,
recoverytypes.ModuleName,
onboardingtypes.ModuleName,
// no-op modules
ibchost.ModuleName,
ibctransfertypes.ModuleName,
Expand All @@ -684,12 +709,15 @@ func NewCanto(
feegrant.ModuleName,
paramstypes.ModuleName,
upgradetypes.ModuleName,

// Canto modules
vestingtypes.ModuleName,
inflationtypes.ModuleName,
erc20types.ModuleName,
govshuttletypes.ModuleName,
csrtypes.ModuleName,
coinswaptypes.ModuleName,

// recoverytypes.ModuleName,
feestypes.ModuleName,
)
Expand Down Expand Up @@ -729,9 +757,12 @@ func NewCanto(
erc20types.ModuleName,
epochstypes.ModuleName,
recoverytypes.ModuleName,
onboardingtypes.ModuleName,
feestypes.ModuleName,
govshuttletypes.ModuleName,
csrtypes.ModuleName,
coinswaptypes.ModuleName,

// NOTE: crisis module must go at the end to check for invariants on each module
crisistypes.ModuleName,
)
Expand Down Expand Up @@ -766,6 +797,7 @@ func NewCanto(
evm.NewAppModule(app.EvmKeeper, app.AccountKeeper),
epochs.NewAppModule(appCodec, app.EpochsKeeper),
feemarket.NewAppModule(app.FeeMarketKeeper),
coinswap.NewAppModule(appCodec, app.CoinswapKeeper, app.AccountKeeper, app.BankKeeper),
)

app.sm.RegisterStoreDecoders()
Expand Down Expand Up @@ -992,6 +1024,18 @@ func (app *Canto) GetIBCKeeper() *ibckeeper.Keeper {
return app.IBCKeeper
}

func (app *Canto) GetErc20Keeper() erc20keeper.Keeper {
return app.Erc20Keeper
}

func (app *Canto) GetCoinswapKeeper() coinswapkeeper.Keeper {
return app.CoinswapKeeper
}

func (app *Canto) GetOnboardingKeeper() *onboardingkeeper.Keeper {
return app.OnboardingKeeper
}

// GetScopedIBCKeeper implements the TestingApp interface.
func (app *Canto) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper {
return app.ScopedIBCKeeper
Expand Down Expand Up @@ -1047,9 +1091,13 @@ func initParamsKeeper(
paramsKeeper.Subspace(inflationtypes.ModuleName)
paramsKeeper.Subspace(erc20types.ModuleName)
paramsKeeper.Subspace(recoverytypes.ModuleName)
paramsKeeper.Subspace(onboardingtypes.ModuleName)
paramsKeeper.Subspace(feestypes.ModuleName)
paramsKeeper.Subspace(govshuttletypes.ModuleName)
paramsKeeper.Subspace(csrtypes.ModuleName)

paramsKeeper.Subspace(coinswaptypes.ModuleName)

return paramsKeeper
}

Expand All @@ -1076,6 +1124,12 @@ func (app *Canto) setupUpgradeHandlers() {
v5.CreateUpgradeHandler(app.mm, app.configurator),
)

// v6 upgrade handler
app.UpgradeKeeper.SetUpgradeHandler(
v6.UpgradeName,
v6.CreateUpgradeHandler(app.mm, app.configurator, *app.OnboardingKeeper, app.CoinswapKeeper),
)

// When a planned update height is reached, the old binary will panic
// writing on disk the height and name of the update that triggered it
// This will read that value, and execute the preparations for the upgrade.
Expand Down Expand Up @@ -1104,6 +1158,10 @@ func (app *Canto) setupUpgradeHandlers() {
storeUpgrades = &storetypes.StoreUpgrades{
Added: []string{csrtypes.StoreKey},
}
case v6.UpgradeName:
storeUpgrades = &storetypes.StoreUpgrades{
Added: []string{onboardingtypes.StoreKey, coinswaptypes.StoreKey},
}
}

if storeUpgrades != nil {
Expand Down
3 changes: 1 addition & 2 deletions app/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,14 @@ import (
func TestCantoExport(t *testing.T) {
db := dbm.NewMemDB()
app := NewCanto(log.NewTMLogger(log.NewSyncWriter(os.Stdout)), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, encoding.MakeConfig(ModuleBasics), simapp.EmptyAppOptions{})

genesisState := NewDefaultGenesisState()
stateBytes, err := json.MarshalIndent(genesisState, "", " ")
require.NoError(t, err)

// Initialize the chain
app.InitChain(
abci.RequestInitChain{
ChainId: types.MainnetChainID + "-1",
ChainId: types.TestnetChainID + "-1",
Validators: []abci.ValidatorUpdate{},
AppStateBytes: stateBytes,
},
Expand Down
43 changes: 33 additions & 10 deletions app/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ import (
"time"

sdk "github.com/cosmos/cosmos-sdk/types"
ibctesting "github.com/cosmos/ibc-go/v3/testing"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"

"github.com/cosmos/ibc-go/v3/testing/simapp"

abci "github.com/tendermint/tendermint/abci/types"
"github.com/tendermint/tendermint/libs/log"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
Expand All @@ -26,9 +29,6 @@ func init() {
config.SetBip44CoinType(cfg)
}

// DefaultTestingAppInit defines the IBC application used for testing
var DefaultTestingAppInit func() (ibctesting.TestingApp, map[string]json.RawMessage) = SetupTestingApp

// DefaultConsensusParams defines the default Tendermint consensus params used in
// canto testing.
var DefaultConsensusParams = &abci.ConsensusParams{
Expand Down Expand Up @@ -93,10 +93,33 @@ func Setup(
return app
}

// SetupTestingApp initializes the IBC-go testing application
func SetupTestingApp() (ibctesting.TestingApp, map[string]json.RawMessage) {
db := dbm.NewMemDB()
cfg := encoding.MakeConfig(ModuleBasics)
app := NewCanto(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, cfg, simapp.EmptyAppOptions{})
return app, NewDefaultGenesisState()
func SetupWithGenesisAccounts(genAccs []authtypes.GenesisAccount, balances ...banktypes.Balance) *Canto {
app := Setup(false, feemarkettypes.DefaultGenesisState())
genesisState := NewDefaultGenesisState()
authGenesis := authtypes.NewGenesisState(authtypes.DefaultParams(), genAccs)
genesisState[authtypes.ModuleName] = app.AppCodec().MustMarshalJSON(authGenesis)

totalSupply := sdk.NewCoins()
for _, b := range balances {
totalSupply = totalSupply.Add(b.Coins...)
}

bankGenesis := banktypes.NewGenesisState(banktypes.DefaultGenesisState().Params, balances, totalSupply, []banktypes.Metadata{})
genesisState[banktypes.ModuleName] = app.AppCodec().MustMarshalJSON(bankGenesis)

stateBytes, err := json.MarshalIndent(genesisState, "", " ")
if err != nil {
panic(err)
}

app.InitChain(
abci.RequestInitChain{
ChainId: types.MainnetChainID + "-1",
Validators: []abci.ValidatorUpdate{},
ConsensusParams: DefaultConsensusParams,
AppStateBytes: stateBytes,
},
)

return app
}
6 changes: 6 additions & 0 deletions app/upgrades/v6/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package v6

const (
//UpgradeName is the name of the upgrade to be associated with the chain upgrade
UpgradeName = "v6.0.0"
)
Loading