Add Ethereum bridge module (#1211)

* Add bridge module

* Add bridge module to app

* Add relayer/user address, bridge params to init chain script

* Update bridge to v0.1.0

* Enable bridge, add min withdraw limits in devnet script

* update to v0.1.1

* Move savings, evmutil, bridge initgenesis orders

Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com>
This commit is contained in:
Derrick Lee 2022-04-22 09:01:43 -07:00 committed by GitHub
parent 812b03af2a
commit 8aa176f05a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 509 additions and 11 deletions

View File

@ -92,6 +92,10 @@ import (
feemarketkeeper "github.com/tharsis/ethermint/x/feemarket/keeper" feemarketkeeper "github.com/tharsis/ethermint/x/feemarket/keeper"
feemarkettypes "github.com/tharsis/ethermint/x/feemarket/types" feemarkettypes "github.com/tharsis/ethermint/x/feemarket/types"
"github.com/kava-labs/kava-bridge/x/bridge"
bridgekeeper "github.com/kava-labs/kava-bridge/x/bridge/keeper"
bridgetypes "github.com/kava-labs/kava-bridge/x/bridge/types"
"github.com/kava-labs/kava/app/ante" "github.com/kava-labs/kava/app/ante"
kavaparams "github.com/kava-labs/kava/app/params" kavaparams "github.com/kava-labs/kava/app/params"
"github.com/kava-labs/kava/x/auction" "github.com/kava-labs/kava/x/auction"
@ -189,6 +193,7 @@ var (
savings.AppModuleBasic{}, savings.AppModuleBasic{},
validatorvesting.AppModuleBasic{}, validatorvesting.AppModuleBasic{},
evmutil.AppModuleBasic{}, evmutil.AppModuleBasic{},
bridge.AppModuleBasic{},
) )
// module account permissions // module account permissions
@ -213,6 +218,7 @@ var (
cdptypes.LiquidatorMacc: {authtypes.Minter, authtypes.Burner}, cdptypes.LiquidatorMacc: {authtypes.Minter, authtypes.Burner},
hardtypes.ModuleAccountName: {authtypes.Minter}, hardtypes.ModuleAccountName: {authtypes.Minter},
savingstypes.ModuleAccountName: nil, savingstypes.ModuleAccountName: nil,
bridgetypes.ModuleName: {authtypes.Minter, authtypes.Burner},
} }
) )
@ -283,6 +289,8 @@ type App struct {
incentiveKeeper incentivekeeper.Keeper incentiveKeeper incentivekeeper.Keeper
savingsKeeper savingskeeper.Keeper savingsKeeper savingskeeper.Keeper
bridgeKeeper bridgekeeper.Keeper
// make scoped keepers public for test purposes // make scoped keepers public for test purposes
ScopedIBCKeeper capabilitykeeper.ScopedKeeper ScopedIBCKeeper capabilitykeeper.ScopedKeeper
ScopedTransferKeeper capabilitykeeper.ScopedKeeper ScopedTransferKeeper capabilitykeeper.ScopedKeeper
@ -336,7 +344,7 @@ func NewApp(
issuancetypes.StoreKey, bep3types.StoreKey, pricefeedtypes.StoreKey, issuancetypes.StoreKey, bep3types.StoreKey, pricefeedtypes.StoreKey,
swaptypes.StoreKey, cdptypes.StoreKey, hardtypes.StoreKey, swaptypes.StoreKey, cdptypes.StoreKey, hardtypes.StoreKey,
committeetypes.StoreKey, incentivetypes.StoreKey, evmutiltypes.StoreKey, committeetypes.StoreKey, incentivetypes.StoreKey, evmutiltypes.StoreKey,
savingstypes.StoreKey, savingstypes.StoreKey, bridgetypes.StoreKey,
) )
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey, evmtypes.TransientKey)
memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
@ -380,6 +388,7 @@ func NewApp(
ibctransferSubspace := app.paramsKeeper.Subspace(ibctransfertypes.ModuleName) ibctransferSubspace := app.paramsKeeper.Subspace(ibctransfertypes.ModuleName)
feemarketSubspace := app.paramsKeeper.Subspace(feemarkettypes.ModuleName) feemarketSubspace := app.paramsKeeper.Subspace(feemarkettypes.ModuleName)
evmSubspace := app.paramsKeeper.Subspace(evmtypes.ModuleName) evmSubspace := app.paramsKeeper.Subspace(evmtypes.ModuleName)
bridgeSubspace := app.paramsKeeper.Subspace(bridgetypes.ModuleName)
bApp.SetParamStore( bApp.SetParamStore(
app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable()), app.paramsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable()),
@ -495,6 +504,23 @@ func NewApp(
app.ModuleAccountAddrs(), app.ModuleAccountAddrs(),
) )
// BridgeKeeper must be assigned before EvmKeeper hooks are set
app.bridgeKeeper = bridgekeeper.NewKeeper(
appCodec,
keys[bridgetypes.StoreKey],
bridgeSubspace,
app.bankKeeper,
app.accountKeeper,
app.evmKeeper,
)
app.evmKeeper = app.evmKeeper.SetHooks(
evmkeeper.NewMultiEvmHooks(
app.bridgeKeeper.WithdrawHooks(),
app.bridgeKeeper.ConversionHooks(),
),
)
govRouter := govtypes.NewRouter() govRouter := govtypes.NewRouter()
govRouter. govRouter.
AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). AddRoute(govtypes.RouterKey, govtypes.ProposalHandler).
@ -668,6 +694,7 @@ func NewApp(
incentive.NewAppModule(app.incentiveKeeper, app.accountKeeper, app.bankKeeper, app.cdpKeeper), incentive.NewAppModule(app.incentiveKeeper, app.accountKeeper, app.bankKeeper, app.cdpKeeper),
evmutil.NewAppModule(app.evmutilKeeper, app.bankKeeper), evmutil.NewAppModule(app.evmutilKeeper, app.bankKeeper),
savings.NewAppModule(app.savingsKeeper, app.accountKeeper, app.bankKeeper), savings.NewAppModule(app.savingsKeeper, app.accountKeeper, app.bankKeeper),
bridge.NewAppModule(app.bridgeKeeper, app.accountKeeper),
) )
app.mm.SetOrderBeginBlockers( app.mm.SetOrderBeginBlockers(
@ -704,7 +731,16 @@ func NewApp(
vestingtypes.ModuleName, vestingtypes.ModuleName,
pricefeedtypes.ModuleName, pricefeedtypes.ModuleName,
validatorvestingtypes.ModuleName, validatorvestingtypes.ModuleName,
authtypes.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, ibctransfertypes.ModuleName, paramstypes.ModuleName, evmutiltypes.ModuleName, savingstypes.ModuleName, authtypes.ModuleName,
banktypes.ModuleName,
govtypes.ModuleName,
crisistypes.ModuleName,
genutiltypes.ModuleName,
ibctransfertypes.ModuleName,
paramstypes.ModuleName,
evmutiltypes.ModuleName,
savingstypes.ModuleName,
bridgetypes.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.
@ -737,7 +773,16 @@ func NewApp(
pricefeedtypes.ModuleName, pricefeedtypes.ModuleName,
ibchost.ModuleName, ibchost.ModuleName,
validatorvestingtypes.ModuleName, validatorvestingtypes.ModuleName,
authtypes.ModuleName, banktypes.ModuleName, govtypes.ModuleName, crisistypes.ModuleName, genutiltypes.ModuleName, ibctransfertypes.ModuleName, paramstypes.ModuleName, evmutiltypes.ModuleName, savingstypes.ModuleName, authtypes.ModuleName,
banktypes.ModuleName,
govtypes.ModuleName,
crisistypes.ModuleName,
genutiltypes.ModuleName,
ibctransfertypes.ModuleName,
paramstypes.ModuleName,
evmutiltypes.ModuleName,
savingstypes.ModuleName,
bridgetypes.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
@ -766,6 +811,9 @@ func NewApp(
hardtypes.ModuleName, hardtypes.ModuleName,
incentivetypes.ModuleName, // reads cdp params, so must run after cdp genesis incentivetypes.ModuleName, // reads cdp params, so must run after cdp genesis
committeetypes.ModuleName, committeetypes.ModuleName,
evmutiltypes.ModuleName,
savingstypes.ModuleName,
bridgetypes.ModuleName,
genutiltypes.ModuleName, // runs arbitrary txs included in genisis state, so run after modules have been initialized genutiltypes.ModuleName, // runs arbitrary txs included in genisis state, so run after modules have been initialized
crisistypes.ModuleName, // runs the invariants at genesis, should run after other modules crisistypes.ModuleName, // runs the invariants at genesis, should run after other modules
// Add all remaining modules with an empty InitGenesis below since cosmos 0.45.0 requires it // Add all remaining modules with an empty InitGenesis below since cosmos 0.45.0 requires it
@ -773,8 +821,6 @@ func NewApp(
paramstypes.ModuleName, paramstypes.ModuleName,
upgradetypes.ModuleName, upgradetypes.ModuleName,
validatorvestingtypes.ModuleName, validatorvestingtypes.ModuleName,
evmutiltypes.ModuleName,
savingstypes.ModuleName,
) )
app.mm.RegisterInvariants(&app.crisisKeeper) app.mm.RegisterInvariants(&app.crisisKeeper)

View File

@ -11,6 +11,14 @@ evmFaucetMnemonic="hundred flash cattle inquiry gorilla quick enact lazy galaxy
# 0x3C854F92F726A7897C8B23F55B2D6E2C482EF3E0 # 0x3C854F92F726A7897C8B23F55B2D6E2C482EF3E0
# kava18jz5lyhhy6ncjlyty064kttw93yzaulq7rlptu # kava18jz5lyhhy6ncjlyty064kttw93yzaulq7rlptu
userMnemonic="news tornado sponsor drastic dolphin awful plastic select true lizard width idle ability pigeon runway lift oppose isolate maple aspect safe jungle author hole"
# 0x7Bbf300890857b8c241b219C6a489431669b3aFA
# kava10wlnqzyss4accfqmyxwx5jy5x9nfkwh6qm7n4t
relayerMnemonic="never reject sniff east arctic funny twin feed upper series stay shoot vivid adapt defense economy pledge fetch invite approve ceiling admit gloom exit"
# 0xa2F728F997f62F47D4262a70947F6c36885dF9fa
# kava15tmj37vh7ch504px9fcfglmvx6y9m70646ev8t
DATA=~/.kava DATA=~/.kava
# remove any old state and config # remove any old state and config
rm -rf $DATA rm -rf $DATA
@ -47,6 +55,14 @@ evmFaucetKeyName="evm-faucet"
printf "$evmFaucetMnemonic\n" | $BINARY keys add $evmFaucetKeyName --eth --recover printf "$evmFaucetMnemonic\n" | $BINARY keys add $evmFaucetKeyName --eth --recover
$BINARY add-genesis-account $evmFaucetKeyName 1000000000ukava $BINARY add-genesis-account $evmFaucetKeyName 1000000000ukava
userKeyName="user"
printf "$userMnemonic\n" | $BINARY keys add $userKeyName --eth --recover
$BINARY add-genesis-account $userKeyName 1000000000ukava
relayerKeyName="relayer"
printf "$relayerMnemonic\n" | $BINARY keys add $relayerKeyName --eth --recover
$BINARY add-genesis-account $relayerKeyName 1000000000ukava
# Create a delegation tx for the validator and add to genesis # Create a delegation tx for the validator and add to genesis
$BINARY gentx $validatorKeyName 1000000000ukava --keyring-backend test --chain-id $chainID $BINARY gentx $validatorKeyName 1000000000ukava --keyring-backend test --chain-id $chainID
$BINARY collect-gentxs $BINARY collect-gentxs
@ -59,3 +75,35 @@ sed -in-place='' 's/aphoton/akava/g' $DATA/config/genesis.json
# Zero out the total supply so it gets recalculated during InitGenesis # Zero out the total supply so it gets recalculated during InitGenesis
jq '.app_state.bank.supply = []' $DATA/config/genesis.json|sponge $DATA/config/genesis.json jq '.app_state.bank.supply = []' $DATA/config/genesis.json|sponge $DATA/config/genesis.json
# Enable bridge
jq '.app_state.bridge.params.bridge_enabled = true' $DATA/config/genesis.json | sponge $DATA/config/genesis.json
# Set relayer to devnet relayer address
jq '.app_state.bridge.params.relayer = "kava15tmj37vh7ch504px9fcfglmvx6y9m70646ev8t"' $DATA/config/genesis.json | sponge $DATA/config/genesis.json
# Set enabled erc20 tokens to match local geth testnet
jq '.app_state.bridge.params.enabled_erc20_tokens = [
{
address: "0x6098c27D41ec6dc280c2200A737D443b0AaA2E8F",
name: "Wrapped ETH",
symbol: "WETH",
decimals: 18,
minimum_withdraw_amount: "10000000000000000"
},
{
address: "0x4Fb48E68842bb59f07569c623ACa5826b600F8F7",
name: "USDC",
symbol: "USDC",
decimals: 6,
minimum_withdraw_amount: "10000000"
}]' $DATA/config/genesis.json | sponge $DATA/config/genesis.json
# Set enabled conversion pairs - weth address is the first contract bridge module
# deploys
jq '.app_state.bridge.params.enabled_conversion_pairs = [
{
kava_erc20_address: "0x404F9466d758eA33eA84CeBE9E444b06533b369e",
denom: "erc20/weth",
}]' $DATA/config/genesis.json | sponge $DATA/config/genesis.json

7
go.mod
View File

@ -3,7 +3,7 @@ module github.com/kava-labs/kava
go 1.17 go 1.17
require ( require (
github.com/cosmos/cosmos-proto v0.0.0-20211020182451-c7ca7198c2f8 github.com/cosmos/cosmos-proto v1.0.0-alpha6
github.com/cosmos/cosmos-sdk v0.45.1 github.com/cosmos/cosmos-sdk v0.45.1
github.com/cosmos/ibc-go/v3 v3.0.0 github.com/cosmos/ibc-go/v3 v3.0.0
github.com/ethereum/go-ethereum v1.10.16 github.com/ethereum/go-ethereum v1.10.16
@ -12,6 +12,7 @@ require (
github.com/golang/protobuf v1.5.2 github.com/golang/protobuf v1.5.2
github.com/gorilla/mux v1.8.0 github.com/gorilla/mux v1.8.0
github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0
github.com/kava-labs/kava-bridge v0.1.1
github.com/spf13/cast v1.4.1 github.com/spf13/cast v1.4.1
github.com/spf13/cobra v1.4.0 github.com/spf13/cobra v1.4.0
github.com/stretchr/testify v1.7.1 github.com/stretchr/testify v1.7.1
@ -21,7 +22,7 @@ require (
google.golang.org/genproto v0.0.0-20220211171837-173942840c17 google.golang.org/genproto v0.0.0-20220211171837-173942840c17
google.golang.org/grpc v1.44.0 google.golang.org/grpc v1.44.0
google.golang.org/protobuf v1.28.0 google.golang.org/protobuf v1.28.0
sigs.k8s.io/yaml v1.2.0 sigs.k8s.io/yaml v1.3.0
) )
require ( require (
@ -32,6 +33,7 @@ require (
github.com/StackExchange/wmi v1.2.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect
github.com/VictoriaMetrics/fastcache v1.6.0 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 // indirect
github.com/Workiva/go-datastructures v1.0.53 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect
github.com/allegro/bigcache v1.2.1 // indirect
github.com/armon/go-metrics v0.3.10 // indirect github.com/armon/go-metrics v0.3.10 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/bgentry/speakeasy v0.1.0 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect
@ -152,6 +154,7 @@ require (
replace ( replace (
// Use the cosmos keyring code // Use the cosmos keyring code
github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76 github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210622111912-ef00f8ac3d76
// See https://github.com/cosmos/cosmos-sdk/pull/10401, https://github.com/cosmos/cosmos-sdk/commit/0592ba6158cd0bf49d894be1cef4faeec59e8320 // See https://github.com/cosmos/cosmos-sdk/pull/10401, https://github.com/cosmos/cosmos-sdk/commit/0592ba6158cd0bf49d894be1cef4faeec59e8320
github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0
// Use the cosmos modified protobufs // Use the cosmos modified protobufs

409
go.sum

File diff suppressed because it is too large Load Diff