Everything protocol-level worked first try: unchanged Solidity/Foundry (solc 0.8.30, osaka), USDC as native gas,
CREATE2 + constructor-SELFDESTRUCT moving a pre-funded balance exactly as evm-differences.md documents, and CCTP FAST +
the Forwarding Service landing the first USDC in one call. The friction was all tooling and early-mainnet:
- First USDC on Arc is a chicken-and-egg: the CCTP
receiveMessage mint is paid in USDC on Arc, which a fresh wallet
has none of. useForwarder: true solves it — but that is the answer to the first question every new builder has, and it
is not where they look first (the bridge guide).
forge script with a CREATE2 salt fails "Chain 5042 not supported" — Foundry's deterministic-deployer path guards on
a known-chains list. Workaround: the Arachnid factory directly. A note in the Foundry section would save an hour.
msg.sender inside startBroadcast is Foundry's default sender, not the keystore. A probe sent funds to the wrong
address this way. Pass owner/treasury explicitly — worth a warning in the deploy docs.
eth_getLogs is capped at 10,000 blocks per call (9,999-block span answers; 10,000 → -32012), and sustained rate
on the public RPC is ≈0.5 getLogs/s (1/s is refused indefinitely with -32005; 1 per 2 s always succeeds — 40/40 each).
Both numbers belong on the RPC page.
rpc-endpoints.md says mainnet RPC/explorer are "permissioned"; both answer anonymously. A backend-less page depends
on which of those is the commitment.
- Docs address drift:
integrate_exchanges_cctp-bridging.md names MessageTransmitter 0xE737e5cE… (no code on mainnet);
the live one is 0x81D40F21… per the contract-addresses reference.
Full report with dates and tx hashes: https://github.com/edycutjong/pigeonhole/blob/main/docs/DX-REPORT.md
Everything protocol-level worked first try: unchanged Solidity/Foundry (
solc 0.8.30,osaka), USDC as native gas,CREATE2 + constructor-
SELFDESTRUCTmoving a pre-funded balance exactly asevm-differences.mddocuments, and CCTP FAST +the Forwarding Service landing the first USDC in one call. The friction was all tooling and early-mainnet:
receiveMessagemint is paid in USDC on Arc, which a fresh wallethas none of.
useForwarder: truesolves it — but that is the answer to the first question every new builder has, and itis not where they look first (the bridge guide).
forge scriptwith a CREATE2 salt fails "Chain 5042 not supported" — Foundry's deterministic-deployer path guards ona known-chains list. Workaround: the Arachnid factory directly. A note in the Foundry section would save an hour.
msg.senderinsidestartBroadcastis Foundry's default sender, not the keystore. A probe sent funds to the wrongaddress this way. Pass owner/treasury explicitly — worth a warning in the deploy docs.
eth_getLogsis capped at 10,000 blocks per call (9,999-block span answers; 10,000 →-32012), and sustained rateon the public RPC is ≈0.5
getLogs/s (1/s is refused indefinitely with-32005; 1 per 2 s always succeeds — 40/40 each).Both numbers belong on the RPC page.
rpc-endpoints.mdsays mainnet RPC/explorer are "permissioned"; both answer anonymously. A backend-less page dependson which of those is the commitment.
integrate_exchanges_cctp-bridging.mdnames MessageTransmitter0xE737e5cE…(no code on mainnet);the live one is
0x81D40F21…per the contract-addresses reference.Full report with dates and tx hashes: https://github.com/edycutjong/pigeonhole/blob/main/docs/DX-REPORT.md