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
Copy file name to clipboardExpand all lines: plugins/radius/skills/dripping-faucet/SKILL.md
+52-46Lines changed: 52 additions & 46 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,7 +30,7 @@ Determine the target network **before** doing anything else — it controls the
30
30
- "mainnet" / "production" / "live" → use **Mainnet**
31
31
- Ambiguous (e.g. "fund my wallet", "get some SBC") → **ask the user** before proceeding.
32
32
33
-
2.**Default: never silently pick mainnet.** Mainnet drips are rate-limited to 1/day and always require a signature. An accidental mainnet request wastes the user's daily quota and cannot easily be undone. When in doubt, confirm.
33
+
2.**Default: never silently pick mainnet.** Mainnet drips are rate-limited to 1/day and currently require a signature. An accidental mainnet request wastes the user's daily quota and cannot easily be undone. When in doubt, confirm.
34
34
35
35
| Situation | Network |
36
36
|-----------|---------|
@@ -43,10 +43,10 @@ Determine the target network **before** doing anything else — it controls the
43
43
44
44
| Network | URL | Notes |
45
45
|---------|-----|-------|
46
-
| Testnet |`https://testnet.radiustech.xyz/api/v1/faucet`| Signatures not currently required. ~0.5 SBC per drip. 60 requests/min. |
| Testnet |`https://testnet.radiustech.xyz/api/v1/faucet`| Signatures currently required by server configuration. ~0.5 SBC per drip. 5 requests/min. |
47
+
| Mainnet |`https://network.radiustech.xyz/api/v1/faucet`| Signatures currently required by server configuration. ~0.01 SBC per drip. 1 request/day. |
48
48
49
-
> **Signatures can be re-enabled on testnet at any time.** Always handle a `signature_required`error from `/drip` by falling back to the signed flow. Never assume unsigned will work permanently.
49
+
> The OpenAPI request schema marks `signature` as optional because signature enforcement is a server-side configuration setting. Live verification on 2026-08-21 showed `signature_required`on both Testnet and Mainnet. Treat signing as required for the currently deployed services, while still handling configuration changes from the API response.
50
50
51
51
## Chain Configuration
52
52
@@ -92,10 +92,10 @@ Before calling the faucet, determine the wallet situation. This decides which fl
92
92
|-----------|:---:|:---:|---|
93
93
| We created or selected a testnet `radius-cli` wallet | ✅ | ✅ | Full `radius-cli` signing flow available |
94
94
| User's wallet, we have key material or an operator-approved signer | ✅ | ✅ | Full flow available |
95
-
| User's wallet, we do NOT have the key — **Testnet**|✅| ❌ |Unsigned only — if`signature_required`, ask the user to provide the key or use the [testnet web faucet](https://testnet.radiustech.xyz/wallet)|
96
-
| User's wallet, we do NOT have the key — **Mainnet**| ⚠️ | ❌ |Unsigned will almost certainly fail (`signature_required`). Ask for the key upfront, or direct the user to the [mainnet web faucet](https://network.radiustech.xyz/wallet) before attempting anything. |
95
+
| User's wallet, we do NOT have signing access — **Testnet**|⚠️| ❌ |The current deployment returns`signature_required`. Use an operator-approved signer, or use the [testnet web faucet](https://testnet.radiustech.xyz/wallet)|
96
+
| User's wallet, we do NOT have signing access — **Mainnet**| ⚠️ | ❌ |The current deployment returns `signature_required`. Use an operator-approved signer, or direct the user to the [mainnet web faucet](https://network.radiustech.xyz/wallet) before attempting anything. |
97
97
98
-
**Key rule:** never attempt the signed flow without confirmed signing access through `radius-cli`, app-code key material, or another operator-approved signer. On mainnet, if you only have an address, proactively tell the user that a signature will be required and ask for signing access before making any requests.
98
+
**Key rule:** never attempt the signed flow without confirmed signing access through `radius-cli`, app-code key material, or another operator-approved signer. With the current configuration on either network, an address alone is insufficient. Never ask the user to paste a private key.
99
99
100
100
## Flow Overview
101
101
@@ -105,7 +105,7 @@ Before calling the faucet, determine the wallet situation. This decides which fl
105
105
→ signature_required? → continue to signed flow
106
106
→ rate_limited? → wait retry_after_ms, then retry
107
107
108
-
2. Signed flow (only if step 1 returns signature_required, OR when targeting mainnet and we know a signature is required):
108
+
2. Signed flow (when step 1 returns `signature_required`, as both deployments did during the latest verification):
109
109
a. Check status → rate_limited? → wait, then retry
110
110
b. Get challenge → extract "message" field only
111
111
c. Sign challenge (EIP-191 personal_sign)
@@ -115,9 +115,9 @@ Before calling the faucet, determine the wallet situation. This decides which fl
On testnet today, step 1 succeeds without a signature. But always implement the full flow — signatures can be re-enabled at any time.
118
+
On both deployed services, step 1 currently returns `signature_required`. The unsigned probe is useful for configuration discovery and returns a challenge in `error.details.challenge`; callers may instead fetch `/challenge` directly when signing access is already confirmed.
119
119
120
-
**On mainnet, step 1 will always return `signature_required`.** If you already know the target network is mainnet and you have the key, you may skip straight to the signed flow to avoid the extra round-trip. If you don't have the key, stop immediately and direct the user to the [mainnet web faucet](https://network.radiustech.xyz/wallet).
120
+
With the current configuration on either network, callers with an approved signer may skip straight to the signed flow to avoid the unsigned probe. If signing access is unavailable, stop and direct the user to the matching web faucet.
## Bash Example (address-only — we do NOT own the wallet)
433
+
## Bash Example (address-only — no signing access)
428
434
429
-
If you only have an address and no private key, you can only use the unsigned flow.
435
+
If you only have an address and no approved signer, you can only probe the unsigned flow. Both deployments currently reject it with `signature_required`.
430
436
431
-
- On **testnet**: if the faucet requires a signature, stop and tell the user.
432
-
- On **mainnet**: the faucet **always** requires a signature. Do not even attempt this flow on mainnet — direct the user to the web faucet immediately.
437
+
- On **testnet**: the current deployment requires a signature, so stop and tell the user or direct them to the web faucet.
438
+
- On **mainnet**: the current deployment requires a signature. Do not attempt an address-only flow; direct the user to the web faucet immediately.
433
439
434
440
```bash
435
441
#!/usr/bin/env bash
@@ -440,7 +446,7 @@ NETWORK="${NETWORK:-testnet}"
440
446
441
447
if [ "$NETWORK"="mainnet" ];then
442
448
echo"ERROR: address-only (unsigned) flow cannot be used on mainnet."
443
-
echo"Mainnet always requires a signature. Provide the private key/keystore, or use:"
449
+
echo"The current mainnet faucet configuration requires a signature. Use an approved signer, or visit:"
@@ -500,10 +506,10 @@ These mistakes are easy to make and have been observed in practice:
500
506
| Silent curl |`curl -sf` captures to variable but agent sees `(No output)`|`curl -s` + `echo "Response: $VAR"` on the next line |
501
507
| Using Foundry as the agent wallet surface |`cast wallet new` / `cast wallet sign` for a fresh agent demo | Use `RADIUS_HOME=.radius radius-cli wallet address` and `radius-cli wallet sign`|
502
508
| Mixing wallet scopes | Reusing one global wallet across unrelated agent demos | Set a distinct `RADIUS_HOME` per project or agent |
503
-
| Assuming signing access from an address | Treating `0x...` as enough for mainnet signed flow | Confirm `radius-cli` or another signer can sign for the address before calling the faucet |
509
+
| Assuming signing access from an address | Treating `0x...` as enough for the currently configured signed flow | Confirm `radius-cli` or another approved signer can sign for the address before calling either faucet |
504
510
| Variables across shells | Setting `FAUCET_URL=...` in one agent bash call, using `$FAUCET_URL` in the next → empty | Run the entire flow in one command, or inline all values |
505
511
| Wrong network after copy-paste | Copying a testnet example without updating `FAUCET_URL` / `RPC_URL` → drip hits testnet faucet but on-chain check queries testnet RPC; mainnet balance stays 0 | Always set both `FAUCET_URL`**and**`RPC_URL` from the same `NETWORK` variable |
506
-
|Unsigned flow on mainnet | Sending a `/drip` request without a signature to the mainnet faucet and waiting for it to succeed | Mainnet **always** returns `signature_required`. Either go straight to the signed flow, or fail fast if you don't have the key|
512
+
|Treating OpenAPI optionality as deployed behavior | Assuming an optional `signature` schema field means unsigned drips are accepted | Signature enforcement is configuration-driven; both services returned `signature_required` in live verification on 2026-08-21|
507
513
| Retrying after mainnet rate limit | Looping on a `rate_limited` error from mainnet with the same wait-and-retry logic used on testnet | Mainnet `retry_after_ms` is ~86 400 000 ms (24 hours). Stop immediately, report the wait time to the user, and do not retry in-process |
508
514
| Using testnet chain for mainnet on-chain check | Hardcoding `chain: radiusTestnet` in `createPublicClient` regardless of network → `balanceOf` query goes to the wrong chain, always returns 0 | Derive the chain from the `network` parameter; use `NETWORK_CONFIG[network].chain`|
509
515
| Creating a wallet you'll forget about | Generating a fresh mainnet wallet in an unclear scope | Mainnet tokens have real value — set `RADIUS_HOME` intentionally and record which project owns it |
@@ -523,7 +529,7 @@ When an agent executes this skill, it should follow the evaluator-optimizer patt
523
529
|-------|-----------|--------------|
524
530
|`rate_limited` (testnet) | Too many requests from this address | Wait `retry_after_ms`, then retry |
525
531
|`rate_limited` (mainnet) | Daily quota exhausted | Stop. Report to user. Retry tomorrow. Do not loop. |
526
-
|`signature_required`| Faucet has signatures enabled (always on mainnet) | Fall back to signed flow — but **only if we have the private key**. If not, stop and tell the user. |
532
+
|`signature_required`| Faucet has signature enforcement enabled (currently both networks) | Fall back to signed flow — but **only with an operator-approved signer**. If none is available, stop and tell the user. |
527
533
|`invalid_signature`| Wrong key or stale challenge | Re-fetch challenge, re-sign, retry |
528
534
|`faucet_empty`| Faucet wallet is drained | Stop. Report to user. Retry later. |
529
535
|`sbc_not_configured`| Server misconfiguration | Stop. Report to user. |
0 commit comments