Developerschain 7628 · 0x1dcc · SNCT

Ship the samebytecode. Get aprivate path.

Sanect runs cosmos/evm — a standard EVM behind standard JSON-RPC. Hardhat, Foundry, ethers and viem work unchanged. Staking, governance and rewards are precompiles; the shielded pool is a contract. Nothing to fork, nothing to relearn.

Documentation ↗

Quickstart.

Three ways to point a toolchain at the network. Confirmations land in about one block — roughly 400 ms.

hardhat.config.ts
export default {
  networks: {
    sanect: {
      url: "https://rpc.sanect.com/",
      chainId: 7628,
      accounts: [process.env.PK],
    },
  },
}
foundry
forge create src/MyContract.sol:MyContract \
  --rpc-url https://rpc.sanect.com/ \
  --private-key $PK

cast call $ADDR "totalSupply()(uint256)" \
  --rpc-url https://rpc.sanect.com/
viem
import { defineChain } from "viem"

export const sanect = defineChain({
  id: 7628, name: "Sanect",
  nativeCurrency: { name: "Sanect", symbol: "SNCT", decimals: 18 },
  rpcUrls: { default: { http: ["https://rpc.sanect.com/"] } },
  blockExplorers: { default: { name: "Scan", url: "https://scan.sanect.com" } },
})

Endpoints.

Public endpoints for mainnet. Heavy historical reads belong on the archive node.

urlEVM JSON-RPChttps://rpc.sanect.com/
urlEVM WebSocketwss://rpc.sanect.com/ws
urlArchive RPC (full history)https://archive.sanect.com
urlCosmos RESThttps://rpc.sanect.com/rest
urlCometBFT RPChttps://rpc.sanect.com/rpc
urlExplorerhttps://scan.sanect.com
urlTestnet RPC (chain 76287)https://rpc.testnet.sanect.com/

Chain modules, callable from Solidity.

The Cosmos SDK modules underneath the EVM are exposed as precompiled contracts. Any wallet can delegate, vote or claim rewards with a normal transaction — and any contract can compose them.

delegate.ts · ethers v6
import { Contract, parseEther } from "ethers";

const staking = new Contract(
  "0x0000000000000000000000000000000000000800",
  STAKING_ABI, signer
);
await staking.delegate(validatorAddr, parseEther("100"));
0x0000…0800Stakingdelegate · undelegate · redelegate · createValidator · delegation (read)
0x0000…0801DistributionclaimRewards · withdrawDelegatorRewards · delegationTotalRewards (read)
0x0000…0804Bankmulti-send
0x0000…0805Governancesubmit proposal · vote
0x0000…0806Slashingunjail (msg.sender must be the validator operator)
0xEeee…EEeEWERC20native SNCT behind an ERC-20 interface — transfer / balanceOf move the same coins

Deployed contracts.

Mainnet addresses for the core protocol surfaces. Full tables, including all 14 bridged assets and 17 DEX pairs, live in the repository.

PrivacyShieldedPool v1.40x5532Dc2B743D45Fd0121E382696521ED62DD3ecf
PrivacyHonkVerifier0x580d7c1Ff04a5761D58a8Db08C37fb33c5e395f2
DEXWSNCT0x4f35BD61FEd919aA9933C6333e388b3B7E1108Dc
DEXUniswapV2Factory0xDF03522CEc5bd2a609863De38da2eEf1267EE0c8
DEXUniswapV2Router020xBf08497825CFcF04037efD852C9bBd0C9C64d175
DEXMasterChef0xa8264E2c8EC09b0251A789860388f70e0Ef563A7
CLOBOrderBookFactory0xE850462927f45C1d782A6aBF1dD2306EB7daC35f
CLOBOrderBookRouterV20x8f7c84113AE8C2007fEd4D3Ef5095aFD5c0c5dfC
Names.snct Registry0xdC7bB6f4d1c217bd5729a719AFf55de4Cf3EaE23
NamesBaseRegistrar0xd45357B67C82311eD3e36DE279599CD84CE15AcA
BridgeHyperlane Mailbox0x2CB7861CC3dA9148763538C75DdCf5772e5c03e1
BridgeUSDC (bridged)0x1777479878760049ebE06f3c14bF1cc92D8dFE25

Calling the shielded pool.

The pool is a normal contract. Proof generation happens client-side with @noir-lang/noir_js and the UltraHonk backend; the wallet code in staking-app/lib/ is the reference integration. A standalone SDK is on the roadmap.

shielded pool · interface (abridged)privacy/contracts
function transact(
  bytes calldata    proof,
  bytes32[] calldata inputNullifiers,    // exactly 2
  bytes32[] calldata outputCommitments,  // exactly 2
  bytes[] calldata   encryptedMemos,     // 240 bytes each
  bytes32 historicRoot,     // any of the 32 recent roots
  int256  publicAmount,     // >0 shield · 0 internal · <0 unshield
  address publicAsset,      // address(0) = native SNCT
  address publicRecipient   // unshield target
) external payable;

mapping(bytes32 => bool) public nullifierSpent;
function commitmentCount() external view returns (uint256);