Skip to content

SNCT as an ERC-20 token

sanect's native token SNCT is exposed as a real ERC-20 at the canonical address:

0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE

That contract has no Solidity source — it's a native precompile (part of the chain binary). Calls to it behave exactly like a normal ERC-20:

ERC-20 callWhat it does
balanceOf(addr)returns the asnct bank balance of addr — no separate ledger
transfer(to, amount)moves the same coins a MsgSend would; emits Transfer(from, to, amount)
approve(spender, amount)standard allowance
transferFrom(from, to, amount)spends from an allowance
symbol()"SNCT"
name()"SNCT"
decimals()18
totalSupply()matches the bank module's total asnct supply
deposit() / withdraw()no-ops on the bond denom (no wrapping needed)

What this enables

  • MetaMask "Add Token" — paste the address above; balance + sends in the native MetaMask UI.
  • Send in Blockscout / EVM tooling — every transfer() emits the standard Transfer event, so Blockscout indexes it like any ERC-20 tx.
  • Solidity contracts can treat SNCT as IERC20 — swap pools, vaults, wrappers — without any deploy step.
  • No separate balance, no wrapping: 100 SNCT bank balance = 100 SNCT ERC-20 balance. Always. They're the same coins viewed two ways.

Add to MetaMask

After connecting MetaMask to sanect:

  1. MetaMask → Tokens → Import tokens.
  2. Token contract address: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
  3. Symbol and decimals auto-fill (SNCT / 18).
  4. The token shows in your wallet with the same balance as the chain's bank module.

You can now send SNCT from MetaMask — those transfers will appear in Blockscout. You can also still send via the Cosmos path (the staking app's Send button) — those land at the same destination but don't appear in Blockscout because they're not EVM transactions.

Verify the precompile is live

bash
# symbol()
curl -s -X POST https://rpc.testnet.sanect.com/ \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE","data":"0x95d89b41"},"latest"],"id":1}'
# expected to return ABI-encoded "SNCT"

# decimals()
curl -s -X POST https://rpc.testnet.sanect.com/ \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE","data":"0x313ce567"},"latest"],"id":1}'
# expected -> 0x...12  (= 18)

A 0x empty result means the precompile is not registered on the running chain — see "Enable on an existing chain" below.

Enable on an existing chain

This is genesis state — registering SNCT as an ERC-20 needs to be in genesis.json before the chain starts. If your running chain doesn't have the registration (e.g. it was bootstrapped before this was added to scripts/localnet.sh), you have two paths:

A) Wipe the chain and restart (testnet only)

Cleanest fix, but you lose all history.

  1. Pull latest main so the node service builds with the updated scripts/localnet.sh (which now registers SNCT as ERC-20 in genesis).
  2. Railway → node service → Volume → delete contents (or detach + re-add a fresh empty volume at /data).
  3. Redeploy. Genesis is regenerated with the registration. From block 1, SNCT is queryable at 0xEeeeeEee….

For a development testnet this is usually fine — explorer + dApp re-index from the new genesis automatically.

B) Keep the chain, deploy a wrapped contract yourself (no chain restart)

Write or deploy a standard WETH9-style WSNCT Solidity contract that:

  • Holds SNCT in its balance via payable deposit().
  • Mints/burns wSNCT against deposits/withdraws.
  • Exposes the full ERC-20 interface for wSNCT.

Users deposit() SNCT → get wSNCT → use wSNCT in EVM (visible in Blockscout) → withdraw() to get SNCT back.

This is more friction (users must wrap before using EVM/Blockscout) but doesn't need a chain restart. Useful for an existing mainnet you can't wipe.

Why Blockscout was silent on your Cosmos Send

Blockscout indexes the chain's EVM RPC. A Cosmos MsgSend is not an EVM transaction — it never appears in eth_getBlockByNumber, has no Ethereum- style tx hash format, doesn't emit Solidity events. The bank module just moves balances in the next block.

Once SNCT is registered as ERC-20:

  • EVM transfer() calls on 0xEeeeeEee… emit Transfer events, appear as ERC-20 transactions in Blockscout, and have an Ethereum tx hash (0xabc…).
  • Cosmos MsgSend still works for the same coins, still doesn't show in Blockscout. Use the staking-app's Send for these, or query the Cosmos REST directly.