Skip to main content
StableNet runs the Anzeon EVM — a go-ethereum fork that implements London + Shanghai opcodes, plus a subset of Cancun (blob operations excluded). All standard EVM tooling works without modification, with two StableNet-specific requirements you must account for.

Prerequisites

Before using the tool snippets on this page, make sure you have:
  • Foundry (forge, cast) or Hardhat installed
  • A testnet wallet with WKRC balance to pay gas fees

Faucet

Get free testnet WKRC — no sign-up required.

EVM Version

PropertyValue
Basego-ethereum fork (Anzeon WBFT)
EVM Instruction SetLondon + Shanghai + partial Cancun
PUSH0✅ Supported (Shanghai)
Blob transactions (type 0x03)❌ Not supported
Max call depth1,024
Solidity targetparis or shanghai recommended
Blob opcodes (BLOBHASH, BLOBBASEFEE) are not available. Do not use --evm-version cancun in your compiler settings.

Supported Tools

All tools below work with StableNet using the standard Testnet RPC and Chain ID. Copy the snippets below and replace any placeholder values.
ToolStatusNotes
Foundry (forge, cast)Set --priority-gas-price on every broadcast
HardhatSet maxPriorityFeePerGas in deploy scripts
MetaMaskAdd custom network via wallet_addEthereumChain
Remix IDEUse “External HTTP Provider” with Testnet RPC
ethers.js / viemPass maxPriorityFeePerGas on each transaction

Foundry

Add the StableNet Testnet endpoint to foundry.toml:
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
# Blob opcodes are not supported — use paris or shanghai
evm_version = "shanghai"

[rpc_endpoints]
stablenet_testnet = "https://api.test.stablenet.network"
Every forge script and cast send broadcast requires --priority-gas-price:
forge script script/Deploy.s.sol \
  --rpc-url https://api.test.stablenet.network \
  --private-key $PRIVATE_KEY \
  --priority-gas-price 27600000000000 \
  --broadcast
cast send $CONTRACT "myFunction()" \
  --rpc-url https://api.test.stablenet.network \
  --private-key $PRIVATE_KEY \
  --priority-gas-price 27600000000000

Hardhat

// hardhat.config.js
require("@nomicfoundation/hardhat-toolbox");

module.exports = {
  solidity: {
    version: "0.8.20",
    settings: {
      evmVersion: "shanghai",  // do not use cancun
    },
  },
  networks: {
    stablenet_testnet: {
      url: "https://api.test.stablenet.network",
      chainId: 8283,
      accounts: [process.env.PRIVATE_KEY],
    },
  },
};
Pass the priority fee in your deploy script:
// scripts/deploy.js
const { ethers } = require("hardhat");

async function main() {
  const MyContract = await ethers.getContractFactory("MyContract");
  const contract = await MyContract.deploy({
    maxPriorityFeePerGas: ethers.parseUnits("27600", "gwei"),
  });
  await contract.waitForDeployment();
  console.log("Deployed to:", await contract.getAddress());
}

main().catch(console.error);

MetaMask

Run this in your browser console to add StableNet Testnet to MetaMask:
await window.ethereum.request({
  method: "wallet_addEthereumChain",
  params: [
    {
      chainId: "0x205B",            // 8283 in hex
      chainName: "StableNet Testnet",
      nativeCurrency: {
        name: "WKRC",
        symbol: "WKRC",
        decimals: 18,
      },
      rpcUrls: ["https://api.test.stablenet.network"],
      blockExplorerUrls: ["https://explorer.stablenet.network"],
    },
  ],
});

Remix IDE

  1. Open Remix IDE
  2. In the Deploy & Run panel, set Environment to External HTTP Provider
  3. Enter https://api.test.stablenet.network when prompted for the RPC URL
  4. Remix will detect Chain ID 8283 automatically
Remix does not expose a maxPriorityFeePerGas field in its UI. Transactions submitted via Remix may fail if the injected wallet (MetaMask) does not set the priority fee high enough. Use Foundry or Hardhat for reliable deployments.

ethers.js

Connect to the Testnet and always pass maxPriorityFeePerGas on every transaction:
import { ethers } from "ethers";

const provider = new ethers.JsonRpcProvider("https://api.test.stablenet.network");
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

// StableNet enforces a 27,600 Gwei minimum — include it on every tx
const tx = await wallet.sendTransaction({
  to: "0xRecipientAddress",
  value: ethers.parseEther("1.0"),
  maxPriorityFeePerGas: ethers.parseUnits("27600", "gwei"),
});
await tx.wait();
console.log("confirmed in block", tx.blockNumber);

viem

Define the StableNet Testnet chain object once and reuse it across clients:
import {
  createPublicClient,
  createWalletClient,
  http,
  parseEther,
  parseGwei,
} from "viem";
import { privateKeyToAccount } from "viem/accounts";

const stablenetTestnet = {
  id: 8283,
  name: "StableNet Testnet",
  nativeCurrency: { name: "WKRC", symbol: "WKRC", decimals: 18 },
  rpcUrls: {
    default: { http: ["https://api.test.stablenet.network"] },
  },
};

const publicClient = createPublicClient({
  chain: stablenetTestnet,
  transport: http(),
});

const account = privateKeyToAccount(process.env.PRIVATE_KEY);
const walletClient = createWalletClient({
  chain: stablenetTestnet,
  transport: http(),
  account,
});

// StableNet enforces a 27,600 Gwei minimum — include it on every tx
const hash = await walletClient.sendTransaction({
  to: "0xRecipientAddress",
  value: parseEther("1.0"),
  maxPriorityFeePerGas: parseGwei("27600"),
});

StableNet-Specific Behavior

Minimum Priority Fee: 27,600 Gwei

The GovValidator governance contract enforces a network-wide minimum priority fee. Any transaction with maxPriorityFeePerGas below this value is rejected at the transaction pool level.
ParameterValue
Minimum maxPriorityFeePerGas27,600 Gwei (27600000000000 wei)
EnforcementTransaction pool — rejected before inclusion
This applies to every transaction type: deploys, calls, and native token transfers. Use eth_maxPriorityFeePerGas to query the current enforced value:
curl -X POST https://api.test.stablenet.network \
  -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0","method":"eth_maxPriorityFeePerGas","params":[],"id":1}'
Unlike Ethereum, this method returns the governance-controlled value from the GovValidator contract — not an oracle estimate based on recent blocks.

Gas Fee Policy

  • Base fee: Dynamic (adjusts with network utilization), paid to validators — not burned
  • Priority fee: Governance-controlled minimum, enforced by GovValidator
  • Block gas limit: 105,000,000
  • Block time: ~1 second

Fee Delegation (Transaction Type 0x16)

StableNet supports a dedicated fee delegation transaction type that lets a separate account (FeePayer) pay gas on behalf of the sender. This enables user-facing apps to absorb gas costs.
PropertyValue
Transaction type0x16 (decimal 22)
Required forkApplepie
Signatures required2 — sender + fee payer (independent)
tx.origin in EVMAlways the sender, never the fee payer
To sign a fee-delegated transaction, use the StableNet RPC extensions:
RPC MethodDescription
personal_signRawFeeDelegateTransactionFee-payer signs with a password-unlocked account
eth_signRawFeeDelegateTransactionFee-payer signs with an already-unlocked account
The signed transaction is submitted via eth_sendRawTransaction. Signing flow with ethers.js (provider.send) Type 0x16 is a StableNet-specific transaction type. Use provider.send() to call the RPC methods directly:
import { ethers } from "ethers";

const provider = new ethers.JsonRpcProvider("https://api.test.stablenet.network");

const SENDER      = "0xSenderAddress";
const FEE_PAYER   = "0xFeePayerAddress";
const RECIPIENT   = "0xRecipientAddress";

// Step 1: Sender builds and signs the type 0x16 transaction
// (SENDER account must be unlocked on the node)
const senderSignedRlp = await provider.send("eth_signTransaction", [{
  type:                 "0x16",
  from:                 SENDER,
  to:                   RECIPIENT,
  value:                ethers.toBeHex(ethers.parseEther("1.0")),
  gas:                  "0x5208",
  maxFeePerGas:         ethers.toBeHex(ethers.parseUnits("50000", "gwei")),
  maxPriorityFeePerGas: ethers.toBeHex(ethers.parseUnits("27600", "gwei")),
  nonce:                ethers.toBeHex(await provider.getTransactionCount(SENDER)),
  chainId:              "0x205B",   // 8283
  feePayer:             FEE_PAYER,
}]);

// Step 2: Fee payer appends their independent signature
// Use eth_signRawFeeDelegateTransaction (account already unlocked)
// or personal_signRawFeeDelegateTransaction (password-based unlock)
const fullySignedRlp = await provider.send("eth_signRawFeeDelegateTransaction", [
  senderSignedRlp,
  FEE_PAYER,
]);

// Step 3: Broadcast — gas is charged to FEE_PAYER, value is transferred from SENDER
const txHash = await provider.send("eth_sendRawTransaction", [fullySignedRlp]);
console.log("txHash:", txHash);
tx.origin inside the EVM is always the sender (SENDER), not the fee payer. Smart contracts cannot detect whether fee delegation was used.

Native Token as ERC-20

The native gas coin (KRC) is simultaneously a standard ERC-20 token via the NativeCoinAdapter system contract. No wrapping step is required — the same balance used for gas is the balance returned by balanceOf().
PropertyValue
Contract address0x0000000000000000000000000000000000001000
SymbolWKRC
Decimals18
InterfaceERC-20, FiatTokenV2_2 (USDC-compatible)
Standard approve / transferFrom patterns work exactly as on Ethereum.

Unsupported / Limited Features

FeatureStatusNotes
Blob transactions (type 0x03)❌ Not supportedAnzeon does not include blob Cancun opcodes
BLOBHASH opcode (0x49)❌ Not available
BLOBBASEFEE opcode (0x4a)❌ Not available
eth_maxPriorityFeePerGas as oracle⚠️ Different behaviorReturns governance value, not a fee estimation
personal / admin / debug namespaces⚠️ Not on public RPCAvailable on local/dev nodes only
Gas tip below 27,600 Gwei❌ RejectedTransaction pool enforcement

RPC Namespaces

Standard namespaces available on the public RPC endpoint:
NamespaceAvailable
eth
net
web3
txpool
istanbul✅ (WBFT consensus info)
personal / admin / debugLocal / dev nodes only

Next Steps

Deploy Your First Contract

Step-by-step Foundry tutorial — deploy a WKRC payment contract in ~15 minutes.

Network Information

Chain IDs, RPC endpoints, and system contract addresses.

API Reference

Full JSON-RPC method reference with curl and ethers.js examples.

Explorer

Inspect transactions, contracts, and accounts on-chain.

Get Testnet WKRC

Request free testnet WKRC from the faucet.