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.
Quickstart.
Three ways to point a toolchain at the network. Confirmations land in about one block — roughly 400 ms.
export default { networks: { sanect: { url: "https://rpc.sanect.com/", chainId: 7628, accounts: [process.env.PK], }, }, }
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/
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.
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.
import { Contract, parseEther } from "ethers"; const staking = new Contract( "0x0000000000000000000000000000000000000800", STAKING_ABI, signer ); await staking.delegate(validatorAddr, parseEther("100"));
Deployed contracts.
Mainnet addresses for the core protocol surfaces. Full tables, including all 14 bridged assets and 17 DEX pairs, live in the repository.
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.
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);