Skip to main content

Chain Configuration

Define the Specter chain for your frontend library.

viem chain definition

import { defineChain } from 'viem';

export const specterTestnet = defineChain({
id: 5445,
name: 'Specter Testnet',
nativeCurrency: {
name: 'GHOST',
symbol: 'GHOST',
decimals: 18,
},
rpcUrls: {
default: {
http: ['https://testnet.specterchain.com'],
webSocket: ['wss://testnet.specterchain.com/ws'],
},
},
blockExplorers: {
default: {
name: 'Blockscout',
url: 'https://explorer.specterchain.com',
},
},
});

ethers.js provider

import { ethers } from 'ethers';

const provider = new ethers.JsonRpcProvider('https://testnet.specterchain.com', {
name: 'specter-testnet',
chainId: 5445,
});

// With WebSocket
const wsProvider = new ethers.WebSocketProvider('wss://testnet.specterchain.com/ws', {
name: 'specter-testnet',
chainId: 5445,
});

wagmi config

import { createConfig, http } from 'wagmi';
import { specterTestnet } from './chains';

export const config = createConfig({
chains: [specterTestnet],
transports: {
[specterTestnet.id]: http('https://testnet.specterchain.com'),
},
});

RainbowKit

import '@rainbow-me/rainbowkit/styles.css';
import { getDefaultConfig } from '@rainbow-me/rainbowkit';
import { specterTestnet } from './chains';

const config = getDefaultConfig({
appName: 'My Specter dApp',
projectId: 'YOUR_WALLETCONNECT_PROJECT_ID',
chains: [specterTestnet],
});

Contract addresses

export const CONTRACTS = {
GHOST_VAULT: '0x443434113980Ab9d5Eef0Ace7d1A29AB68Af6c70',
COMMITMENT_TREE: '0xB7E37E652F3024bAaaf84b12ae301f8E1feC4D87',
NULLIFIER_REGISTRY: '0x0987cc3dE6f76c4c8834Dc6205De24968091C58b',
GHOST_ERC20_FACTORY: '0x925B548F059C0B8B6CF7168Efb84881252F88C8E',
NATIVE_HANDLER: '0x35cdaE691037fcBb3ff9D0518725F1ae98d502b7',
PROOF_VERIFIER: '0x2C8Fb67874E5f380efB995a9Ab59b2Ef327E5bd2',
POSEIDON_T3: '0xa786eDD407eb9EbaCA5E624B7Ee7C31E3b7f9521',
OPEN_GHOST_VAULT: '0x45B022fEB169AF906CaBa8086c977AA7b15faAf1',
} as const;

export const GAS_PRICE = 1_000_000_000n; // 1 gwei

Important: gas price

Always set gasPrice explicitly. The Cosmos EVM module may return 0 from eth_gasPrice:

const tx = await contract.someFunction({
gasPrice: 1_000_000_000n,
});