Precompiles
Cosmos power through an EVM interface. These precompiles are deployed at fixed addresses and are callable from any EVM wallet, ethers, viem, Foundry, or Solidity contract — no Keplr, no CLI required.
Address table
| Address | Module | Methods |
|---|---|---|
0x0000000000000000000000000000000000000800 | Staking | delegate · undelegate · redelegate · createValidator |
0x0000000000000000000000000000000000000801 | Distribution | claimRewards · withdrawDelegatorRewards · setWithdrawAddress |
0x0000000000000000000000000000000000000804 | Bank | multiSend |
0x0000000000000000000000000000000000000805 | Governance | submitProposal · vote · deposit |
0x0000000000000000000000000000000000000806 | Slashing | unjail |
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE | WERC20 (SNCT) | Full ERC-20 — transfer · approve · balanceOf · transferFrom |
Staking — delegate
typescript
import { Contract, parseEther } from "ethers";
const STAKING_ABI = [
"function delegate(address delegatorAddress, string memory validatorAddress, uint256 amount) returns (bool success)"
];
const staking = new Contract(
"0x0000000000000000000000000000000000000800",
STAKING_ABI,
signer
);
await staking.delegate(
await signer.getAddress(),
"snctvaloper1...",
parseEther("100") // 100 SNCT
);Distribution — claim rewards
typescript
const DISTRIBUTION_ABI = [
"function claimRewards(address delegatorAddress, string[] memory validatorAddresses) returns (bool success)"
];
const dist = new Contract(
"0x0000000000000000000000000000000000000801",
DISTRIBUTION_ABI,
signer
);
await dist.claimRewards(
await signer.getAddress(),
["snctvaloper1..."]
);Slashing — unjail a validator
typescript
const SLASHING_ABI = [
"function unjail(address validatorAddress) returns (bool success)"
];
const slashing = new Contract(
"0x0000000000000000000000000000000000000806",
SLASHING_ABI,
signer
);
await slashing.unjail(await signer.getAddress());WERC20 — SNCT as ERC-20
The WERC20 precompile wraps the native SNCT token as a standard ERC-20 so it works in any DEX, dApp, or contract that expects the ERC-20 interface. No wrapping transaction needed — the precompile handles it.
typescript
const ERC20_ABI = [
"function balanceOf(address account) view returns (uint256)",
"function transfer(address to, uint256 amount) returns (bool)",
"function approve(address spender, uint256 amount) returns (bool)"
];
const snct = new Contract(
"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
ERC20_ABI,
signer
);
const balance = await snct.balanceOf(await signer.getAddress());See SNCT as an ERC-20 for a full walkthrough.
Calling from Solidity
solidity
interface IStaking {
function delegate(
address delegatorAddress,
string memory validatorAddress,
uint256 amount
) external returns (bool success);
}
contract MyStaker {
IStaking constant STAKING =
IStaking(0x0000000000000000000000000000000000000800);
function stake(string memory validator) external payable {
STAKING.delegate(msg.sender, validator, msg.value);
}
}