You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`eth_sendRawTransactionSync`| N/A | EIP-7966: sync tx+receipt (~50% less latency) |
164
+
|`eth_getProof`| Merkle state proofs | Unsupported (error `-33000`) — instant-final state model, no proofs needed |
165
+
|`eth_getBlockReceipts`| All receipts in a block | Unsupported (error `-33000`) — txs executed individually, not in blocks |
166
+
|`eth_sendRawTransactionSync`| EIP-7966 sync tx submission (returns the receipt directly) | On Radius the receipt is **instant + final** (~100ms, no reorg) vs an L2 inclusion receipt (~460ms, reorg-able) |
165
167
|`rad_getBalanceRaw`| N/A | Raw RUSD only (excludes convertible SBC) |
166
168
| State queries | Historical state by block tag |`latest`/`pending`/`safe`/`finalized` return current state; historical block numbers rejected (error `-32000`) |
167
169
| SBC decimals | — | 6 decimals (NOT 18) |
@@ -220,7 +222,7 @@ Always be explicit about:
220
222
### 4. Watch for production gotchas
221
223
Before shipping, review [gotchas.md](references/gotchas.md) for:
222
224
- Wallet compatibility (MetaMask is the only wallet that reliably adds Radius)
223
-
- Nonce collision handling under concurrent load
225
+
- Nonce management for unmanaged concurrent sends from one wallet (contiguous-nonce batches like `forge script --broadcast` need no special handling)
224
226
- Block number is a timestamp (use BigInt, never parseInt)
225
227
- Transaction receipts can be null even for confirmed transactions
226
228
- EIP-2612 permit domain must match exactly: `{ name: "Stable Coin", version: "1" }`
Copy file name to clipboardExpand all lines: plugins/radius/skills/radius-dev/references/gotchas.md
+15-4Lines changed: 15 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -132,11 +132,13 @@ if (!receipt) {
132
132
133
133
---
134
134
135
-
## 7. Nonce collisions under concurrent load
135
+
## 7. Nonce management for concurrent sends from one wallet
136
136
137
-
When sending multiple transactions from the same wallet (hot wallet, settlement wallet), concurrent sends cause nonce errors. Radius enforces strict sequential nonces.
137
+
Batches with pre-assigned contiguous nonces land fine — Radius's pseudo-mempool accepts and orders them. A single `forge script --broadcast` deploying many contracts confirms all of them in one run (verified: a 29-transaction script landed with contiguous nonces, 29/29 successful). **You do not need to deploy one contract at a time, run `--slow`, or add fixed delays between transactions.**
138
138
139
-
**Solution: serial queue + nonce retry.**
139
+
The one case that still needs care is firing *unmanaged concurrent* transactions from the same wallet — e.g. a hot/settlement wallet that calls `sendTransaction` from many requests at once without coordinating nonces. As on any EVM chain, those can race and collide because each read of the pending nonce returns the same value before the earlier tx is accounted for.
140
+
141
+
For that case, let viem manage nonces (it tracks them per account by default), or serialize sends through a queue and retry on the occasional collision:
140
142
141
143
```typescript
142
144
function isNonceError(err:any):boolean {
@@ -172,7 +174,7 @@ async function sendWithRetry(
172
174
}
173
175
```
174
176
175
-
Also add a ~200ms delay between consecutive transactions. Without it, the RPC sometimes returns stale nonce values.
177
+
This applies only to unmanaged concurrent sends from a single wallet — not to normal sequential sends or pre-signed contiguous-nonce batches, both of which land without special handling.
176
178
177
179
---
178
180
@@ -422,6 +424,15 @@ Best practice: read chain ID dynamically from the connected provider rather than
422
424
423
425
---
424
426
427
+
## 22. Some standard read methods are unsupported (`eth_getProof`, `eth_getBlockReceipts`)
428
+
429
+
Two standard Ethereum read methods return error `-33000` on Radius:
430
+
431
+
-**`eth_getProof`** — Radius stores state across a parallelized, sharded infrastructure with no single global Merkle-Patricia trie, so it does not issue state proofs; its instant, deterministic finality removes the need for them. Read state directly with `eth_getBalance`, `eth_getCode`, and `eth_getStorageAt`.
432
+
-**`eth_getBlockReceipts`** — Radius executes transactions individually, not in blocks (the block number is wall-clock time for tooling compatibility), so "every receipt in a block" is not a meaningful unit. To fetch a block's receipts, enumerate its transactions with `eth_getBlockByNumber` (full) and call `eth_getTransactionReceipt` for each; for event indexing of known contracts, use address-filtered `eth_getLogs` (see #18).
-[EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) — Set EOA account code
83
-
-[EIP-7966](https://eips.ethereum.org/EIPS/eip-7966) — `eth_sendRawTransactionSync` (synchronous tx submission; supported on Radius)
83
+
-[EIP-7966](https://eips.ethereum.org/EIPS/eip-7966) — `eth_sendRawTransactionSync` (synchronous tx submission; on Radius the sync receipt is instant + final, no reorg)
> **Gotcha:**If you send concurrent transactions from the same wallet, you will hit nonce collisions. Radius enforces strict sequential nonces. Always send sequentially from a single wallet, or use a nonce-aware queue. See [gotchas.md](gotchas.md#7-nonce-collisions-under-concurrent-load).
346
+
> **Gotcha:***Unmanaged*concurrent sends from the same wallet can collide on the nonce — as on any EVM chain, parallel calls may each read the same pending nonce before the earlier tx is accounted for. Let viem manage nonces (its default), serialize through a queue, or pre-assign contiguous nonces. Pre-signed contiguous-nonce batches (e.g. `forge script --broadcast`) land fine — you do **not** need to send one at a time or add delays. See [gotchas.md](gotchas.md#7-nonce-management-for-concurrent-sends-from-one-wallet).
347
347
348
348
For batching **reads**, use Multicall3 (deployed at `0xcA11bde05977b3631167028862bE2a173976CA11`):
349
349
@@ -511,6 +511,8 @@ async function transfer(
511
511
512
512
Radius supports `eth_sendRawTransactionSync` (EIP-7966), which submits a transaction and waits for the receipt in a single RPC call — roughly 50% less latency than the standard `sendTransaction` + `waitForTransactionReceipt` polling pattern.
513
513
514
+
On Radius, what makes `eth_sendRawTransactionSync` valuable is what the returned receipt means: because Radius has instant finality, the sync receipt is fast **and final** (~100ms, no reorg). On a typical L2 the equivalent sync receipt reflects only inclusion (~460ms in our testing) and can reorg until it settles on L1.
0 commit comments