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.
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 Solidityerror 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.