Skip to content

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

AddressModuleMethods
0x0000000000000000000000000000000000000800Stakingdelegate · undelegate · redelegate · createValidator
0x0000000000000000000000000000000000000801DistributionclaimRewards · withdrawDelegatorRewards · setWithdrawAddress
0x0000000000000000000000000000000000000804BankmultiSend
0x0000000000000000000000000000000000000805GovernancesubmitProposal · vote · deposit
0x0000000000000000000000000000000000000806Slashingunjail
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeEWERC20 (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);
    }
}