This reference tracks the ctmd node source. That source will be published in a public GitHub repository (repository TBA); the paths on this page are paths inside that repository. The canonical ABI artifacts and Solidity interfaces live beside the precompile implementations under precompiles/*/. Most Cosmos-module and extension interfaces (all except ICS02) are also mirrored under contracts/solidity/precompiles.

Address catalog

ERC20 and WERC20 precompile addresses are created from registered token pairs and enabled by the ERC20 keeper; they are not part of the static address table. On mainnet, the only registered token pair is the native ctm denom at 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE, served by the WERC20 extension (name c8ntinuum, symbol CTM, 18 decimals).

Reference package and imports

contracts/package.json does not define main, files, exports, or types. Treat cosmos-evm-contracts as a local contracts package, not as a documented stable npm ABI package. Use static constants for fixed-address precompiles. For ERC20 and WERC20, use the registered token-pair address. For P256, use a raw low-level call because there is no Solidity ABI. State-changing staking, distribution, governance, slashing, and ICS20 methods that take an account argument (delegator, validator, depositor, proposer, voter, or ICS20 sender), and validator rewards depositValidatorRewardsPool, require that account to equal the immediate caller of the precompile. An EOA calling the precompile directly passes its own address. A contract passes address(this) and can act only for itself, as in the example below. Any other account reverts with msg.sender address ... does not match the requester address .... createValidator and editValidator cannot be called from a contract at all (EIP-7702 delegated accounts excepted) and revert with this method can only be called directly to the precompile, not from a smart contract.
No generated TypeScript binding package is committed today. Hardhat users can generate TypeChain bindings in their own workspace; viem users can pass the ABI array directly.

Core ABI catalog

Address table

Event: AddressRegistered(indexed address addr,indexed uint256 idx).

Bank

Events: none.

Bech32

Events: none.

Distribution

Events include ClaimRewards, DepositValidatorRewardsPool, FundCommunityPool, SetWithdrawerAddress, WithdrawDelegatorReward, and WithdrawValidatorCommission. On mainnet, x/distribution currently accrues nothing: inflation is 0, x/feeburn burns all transaction fees, and community tax and proposer rewards are 0. Reward and commission queries and withdrawals therefore return empty amounts. Validator compensation comes from validator rewards.

ECVRF

Supported suites are P256_SHA256_TAI and SECP256K1_SHA256_TAI (case-insensitive). pubKey is a SEC1 public key, 33 bytes compressed or 65 bytes uncompressed. An unsupported suite, a malformed key, or a failed proof returns ok = false with empty beta. An unknown selector, undecodable input, a suite longer than 32 bytes, or alpha longer than 65,536 bytes fails the call. Events: none.

Governance

Events include CancelProposal, Deposit, SubmitProposal, Vote, and VoteWeighted.

ICS02 and ICS20

ICS20 emits IBCTransfer(indexed address sender,indexed string receiver,string sourcePort,string sourceChannel,string denom,uint256 amount,string memo). transfer reverts unless sender is the immediate caller of the precompile. A contract passes address(this) and transfers tokens it holds.

Slashing

Event: ValidatorUnjailed(indexed address validator).

Staking

Events include CreateValidator, Delegate, EditValidator, Redelegate, Unbond, and CancelUnbondingDelegation.

Validator rewards

Despite its parameter name, delegationRewards takes a validator operator’s account address (the 0x... account that owns the c8valoper... address), not a delegator’s. It returns that validator’s own outstanding reward for the epoch, the same value as validatorOutstandingRewards, and fails with target address must be a validator operator for any other address. x/valrewards pays validators only, not delegators.

ERC20 and WERC20 extensions

ERC20 emits Approval and Transfer. WERC20 also emits Deposit and Withdrawal. WERC20 exposes the native CTM balance through an ERC-20 interface. deposit() and withdraw() exist only for WETH interface compatibility and do not change balances: deposit() sends msg.value straight back to the caller and emits Deposit, and withdraw(wad) reverts if the caller’s spendable balance is below wad, otherwise it only emits Withdrawal.

Reverts and errors

The checked ABI artifacts do not define custom Solidity error entries. ERC20 maps some SDK/bank errors to ERC20-style revert strings such as ERC20: transfer amount exceeds balance, ERC20: insufficient allowance, and ERC20: decreased allowance below zero.

Gas schedule

Variable-length stateless precompiles use:
Stateful Cosmos module precompiles use a minimum formula before SDK execution:
Actual SDK execution is also metered inside the precompile call.

Versioning rules

Use the repository tag as the compatibility boundary until a separate ABI package is formalized.