Deploy on Robinhood Chain with Foundry or Hardhat

Last updated:

Endpoint and plans: Robinhood Chain RPC endpoint.

At a glance

Symptom details
PropertyValue
Mainnet / testnet chain ID4663 (0x1237) / 46630 (0xb626)
Max contract code size96 KB (Ethereum: 24 KB, EIP-170 24,576 bytes)
Max init code size192 KB
VerifierBlockscout — https://robinhoodchain.blockscout.com/api/ (testnet: https://explorer.testnet.chain.robinhood.com/api/)
FeeL2 execution gas plus an L1 data (calldata) fee
Deployed whenReceipt status 0x1 with a contractAddress; eth_getCode is not "0x"

What you see

A contract that compiles and passes tests will not deploy or verify on Robinhood Chain: the wallet or library rejects the chain ID, a local devnet refuses a contract that the chain itself would accept, the deploy returns a transaction hash but no contract appears, or verification on the explorer fails.

Why this happens

Robinhood's deployment guide uses the standard toolchains: forge create with --rpc-url and --broadcast, forge verify-contract with --verifier blockscout --verifier-url https://robinhoodchain.blockscout.com/api/, and a Hardhat network named robinhood with chainId 4663 plus a custom chain whose apiURL is https://robinhoodchain.blockscout.com/api. Testnet uses chain ID 46630 and the verifier https://explorer.testnet.chain.robinhood.com/api/, so a config that mixes one network's chain ID with the other's RPC or verifier fails. Robinhood's differences page allows "a maximum code size of 96 KB (vs. Ethereum's 24 KB)" and "a max init code size of 192 KB"; local simulated networks enforce Ethereum's EIP-170 limit of 24,576 bytes unless you lift it. Transaction fees "have two components: L2 execution gas plus an L1 data (calldata) fee", so a gas limit copied from an Ethereum deploy can be too low; ask the node with eth_estimateGas instead. Finally, a transaction hash only means the RPC accepted the transaction: the contract exists once a receipt with status 0x1 and a contractAddress is returned.

Deploy errors on Robinhood Chain: cause and fix

Common deploy and verification failures (Robinhood Chain docs, checked 13 Oct 2026)
What you seeCauseFix
Wallet or library rejects the chain IDchainId 4663 paired with the testnet RPC, or 46630 with the mainnet RPCCall eth_chainId on the RPC (0x1237 mainnet, 0xb626 testnet) and set the matching chain ID
Contract code size exceeds the limit on a local devnetLocal networks enforce Ethereum's 24,576 bytes; Robinhood Chain allows 96 KB code and 192 KB init codeLift the limit locally (Hardhat allowUnlimitedContractSize, Anvil --code-size-limit) or test against the testnet
Out of gas or intrinsic gas too lowA gas limit copied from Ethereum ignores the L1 data fee componentLet the tool call eth_estimateGas; do not hard-code Ethereum gas limits
Hash returned, no contract at the addressThe transaction was accepted but not yet included, or it revertedPoll eth_getTransactionReceipt: status 0x1 plus contractAddress means deployed; 0x0 means it reverted
Verification fails or the source never appearsWrong verifier URL or network for the chain the contract is onUse --verifier blockscout with https://robinhoodchain.blockscout.com/api/ on mainnet or https://explorer.testnet.chain.robinhood.com/api/ on testnet

What to do

  1. Deploy to testnet first (chain ID 46630, RPC https://rpc.testnet.chain.robinhood.com), then repeat with the mainnet values; keep the RPC URL in an environment variable such as RH_RPC_URL.
  2. Keep the deployer key out of the repository: import it once into an encrypted Foundry keystore with cast wallet import and pass --account, or read it from an environment variable for a throwaway testnet key.
  3. Deploy with forge create (or npx hardhat run scripts/deploy.js --network robinhood) and wait for the receipt, not just the transaction hash.
  4. Verify on Blockscout with forge verify-contract --verifier blockscout and the explorer's /api/ URL, or npx hardhat verify --network robinhood <address>.
  5. Check the result with two RPC calls: eth_chainId returns the network you meant, and eth_getCode at the new address at "latest" returns bytecode rather than "0x".

Foundry: deploy and verify on mainnet

cast wallet import deployer --interactive

forge create src/HelloRobinhood.sol:HelloRobinhood \
  --rpc-url "$RH_RPC_URL" --account deployer --broadcast

forge verify-contract <contract_address> src/HelloRobinhood.sol:HelloRobinhood \
  --chain-id 4663 --rpc-url "$RH_RPC_URL" \
  --verifier blockscout --verifier-url https://robinhoodchain.blockscout.com/api/

Hardhat: network and verification config

// hardhat.config.js
module.exports = {
  solidity: "0.8.13",
  networks: {
    robinhood: { url: process.env.RH_RPC_URL, chainId: 4663, accounts: [process.env.PRIVATE_KEY] },
  },
  etherscan: {
    apiKey: { robinhood: "empty" },
    customChains: [{
      network: "robinhood",
      chainId: 4663,
      urls: { apiURL: "https://robinhoodchain.blockscout.com/api", browserURL: "https://robinhoodchain.blockscout.com" },
    }],
  },
};

Post-deploy check

cast chain-id --rpc-url "$RH_RPC_URL"          # 4663
cast code <contract_address> --rpc-url "$RH_RPC_URL"  # bytecode, not 0x

When this is not our problem

Chain IDs, the code size limit, the fee model and Blockscout verification are defined by Robinhood Chain and its explorer, the same whoever operates the RPC you deploy through, Triport included. Triport serves mainnet only: for a mainnet deploy set RH_RPC_URL to the keyed URL form https://triport.io/r/<YOUR_KEY>/robinhood; testnet deploys use Robinhood's public testnet RPC.

FAQ

How do I verify a contract on Robinhood Chain?
Through Blockscout: forge verify-contract with --verifier blockscout --verifier-url https://robinhoodchain.blockscout.com/api/ and --chain-id 4663, or Hardhat's verify task with a custom chain whose apiURL is https://robinhoodchain.blockscout.com/api.
What is the contract size limit on Robinhood Chain?
96 KB of code and 192 KB of init code, against Ethereum's 24 KB. Local devnets enforce the Ethereum limit unless you raise it.
Why did my deploy return a hash but no contract?
A hash means the RPC accepted the transaction. Poll eth_getTransactionReceipt: status 0x1 and a contractAddress confirm the deploy, status 0x0 means it reverted.

Sources