mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-02 09:21:39 +00:00
128 lines
4.7 KiB
Go
Executable File
128 lines
4.7 KiB
Go
Executable File
// Package app provides EVM precompiled contracts configuration for the Sonr blockchain.
|
|
package app
|
|
|
|
import (
|
|
"fmt"
|
|
"maps"
|
|
|
|
evidencekeeper "cosmossdk.io/x/evidence/keeper"
|
|
authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
|
|
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
|
distributionkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
|
|
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
|
|
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
|
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
|
|
bankprecompile "github.com/cosmos/evm/precompiles/bank"
|
|
"github.com/cosmos/evm/precompiles/bech32"
|
|
distprecompile "github.com/cosmos/evm/precompiles/distribution"
|
|
evidenceprecompile "github.com/cosmos/evm/precompiles/evidence"
|
|
govprecompile "github.com/cosmos/evm/precompiles/gov"
|
|
ics20precompile "github.com/cosmos/evm/precompiles/ics20"
|
|
"github.com/cosmos/evm/precompiles/p256"
|
|
slashingprecompile "github.com/cosmos/evm/precompiles/slashing"
|
|
stakingprecompile "github.com/cosmos/evm/precompiles/staking"
|
|
erc20Keeper "github.com/cosmos/evm/x/erc20/keeper"
|
|
transferkeeper "github.com/cosmos/evm/x/ibc/transfer/keeper"
|
|
"github.com/cosmos/evm/x/vm/core/vm"
|
|
evmkeeper "github.com/cosmos/evm/x/vm/keeper"
|
|
channelkeeper "github.com/cosmos/ibc-go/v8/modules/core/04-channel/keeper"
|
|
"github.com/ethereum/go-ethereum/common"
|
|
)
|
|
|
|
// bech32PrecompileBaseGas defines the base gas cost for bech32 address conversion operations.
|
|
const bech32PrecompileBaseGas = 6_000
|
|
|
|
// NewAvailableStaticPrecompiles returns the list of all available static precompiled contracts from EVM.
|
|
// These precompiles provide native Cosmos SDK functionality accessible from EVM contracts,
|
|
// including staking, distribution, governance, bank transfers, IBC transfers, and more.
|
|
//
|
|
// The function initializes both stateless precompiles (bech32, p256) and stateful precompiles
|
|
// that interact with Cosmos SDK modules.
|
|
//
|
|
// NOTE: this should only be used during initialization of the Keeper.
|
|
func NewAvailableStaticPrecompiles(
|
|
stakingKeeper stakingkeeper.Keeper,
|
|
distributionKeeper distributionkeeper.Keeper,
|
|
bankKeeper bankkeeper.Keeper,
|
|
erc20Keeper erc20Keeper.Keeper,
|
|
authzKeeper authzkeeper.Keeper,
|
|
transferKeeper transferkeeper.Keeper,
|
|
channelKeeper channelkeeper.Keeper,
|
|
evmKeeper *evmkeeper.Keeper,
|
|
govKeeper govkeeper.Keeper,
|
|
slashingKeeper slashingkeeper.Keeper,
|
|
evidenceKeeper evidencekeeper.Keeper,
|
|
) map[common.Address]vm.PrecompiledContract {
|
|
// Clone the mapping from the latest EVM fork.
|
|
precompiles := maps.Clone(vm.PrecompiledContractsBerlin)
|
|
|
|
// secp256r1 precompile as per EIP-7212
|
|
p256Precompile := &p256.Precompile{}
|
|
|
|
bech32Precompile, err := bech32.NewPrecompile(bech32PrecompileBaseGas)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate bech32 precompile: %w", err))
|
|
}
|
|
|
|
stakingPrecompile, err := stakingprecompile.NewPrecompile(stakingKeeper, authzKeeper)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate staking precompile: %w", err))
|
|
}
|
|
|
|
distributionPrecompile, err := distprecompile.NewPrecompile(
|
|
distributionKeeper,
|
|
stakingKeeper,
|
|
authzKeeper,
|
|
evmKeeper,
|
|
)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate distribution precompile: %w", err))
|
|
}
|
|
|
|
ibcTransferPrecompile, err := ics20precompile.NewPrecompile(
|
|
stakingKeeper,
|
|
transferKeeper,
|
|
channelKeeper,
|
|
authzKeeper,
|
|
evmKeeper,
|
|
)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate ICS20 precompile: %w", err))
|
|
}
|
|
|
|
bankPrecompile, err := bankprecompile.NewPrecompile(bankKeeper, erc20Keeper)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate bank precompile: %w", err))
|
|
}
|
|
|
|
govPrecompile, err := govprecompile.NewPrecompile(govKeeper, authzKeeper)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate gov precompile: %w", err))
|
|
}
|
|
|
|
slashingPrecompile, err := slashingprecompile.NewPrecompile(slashingKeeper, authzKeeper)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate slashing precompile: %w", err))
|
|
}
|
|
|
|
evidencePrecompile, err := evidenceprecompile.NewPrecompile(evidenceKeeper, authzKeeper)
|
|
if err != nil {
|
|
panic(fmt.Errorf("failed to instantiate evidence precompile: %w", err))
|
|
}
|
|
|
|
// Stateless precompiles
|
|
precompiles[bech32Precompile.Address()] = bech32Precompile
|
|
precompiles[p256Precompile.Address()] = p256Precompile
|
|
|
|
// Stateful precompiles
|
|
precompiles[stakingPrecompile.Address()] = stakingPrecompile
|
|
precompiles[distributionPrecompile.Address()] = distributionPrecompile
|
|
precompiles[ibcTransferPrecompile.Address()] = ibcTransferPrecompile
|
|
precompiles[bankPrecompile.Address()] = bankPrecompile
|
|
precompiles[govPrecompile.Address()] = govPrecompile
|
|
precompiles[slashingPrecompile.Address()] = slashingPrecompile
|
|
precompiles[evidencePrecompile.Address()] = evidencePrecompile
|
|
|
|
return precompiles
|
|
}
|