Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Rotates the shared SC-owned **Dev** wallet (the staging LiFiDiamond owner) end-to-end — funds the new wallet, transfers staging diamond ownership old→new, moves the Tron energy delegation, updates config, and gates on a completeness check. Thin orchestrator: it CALLS the L1 skills (`sweep-wallet-funds`, `move-tron-delegation`, `update-wallet-config`, `check-rotation-status`) and existing skills, never reimplements them. Use when the user says "rotate the dev wallet", "replace the staging owner w
.claude/skills/lifinance-rotate-dev-wallet/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 234% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 30% | 0% |
Rotate the shared Dev wallet — the EOA that owns each network's staging LiFiDiamond (config/global.json.devWallet + tronWallets.devWallet). Because it is SC-owned it is rotatable; because it governs only staging it is the lowest-stakes of the rotations and the reference implementation the heavier siblings mirror.
This skill is a thin orchestrator: every moving part is owned by an L1 or existing skill; this file only sequences them, enforces the guardrails, and gates on the final check — it reimplements none of their logic.
Use when the user says:
Do NOT use for:
safeOwners[0] + Timelock CANCELLER_ROLE → rotate-deployer-wallet (governance-heavy, Safe proposals).rotate-pauser-wallet (immutable pauserWallet, needs a facet redeploy).offboard-sc-dev (the orchestrator that calls this skill).Required for rotation runs:
0x…). If not supplied, ask once; never generate it inside the skill (see Guardrails). Required only when --check is not set.Optional:
check-rotation-status, changes nothing) and stop; when set, the new-address requirement is skipped. Use to preview state before rotating or to re-verify after.The old dev address is derived from config/global.json.devWallet for reference, but every funds/ownership step derives the acting sender from the private key in .env, never from global.json (which can be mid-rotation-inconsistent).
multisig-rollout — never an owner shortcut.config/global.json.--check and confirm the plan with the user before broadcasting anything.Foundry/bun may need export PATH="$HOME/.foundry/bin:$HOME/.bun/bin:$PATH".
--check is absent, confirm --new-address is present, checksum-valid, and NOT any current SC/CTO wallet in config/global.json (a no-op or a self-collision is a mistake). (With --check, skip straight to the completeness gate — no address required.)update-wallet-config / move-tron-delegation).sweep-wallet-funds)Sweep native gas from the old dev wallet to the new one across all active EVM chains, so the new wallet can pay for its own ownership-acceptance / delegation txs.
text/sweep-wallet-funds --new-address <NEW> --old-key-env PRIVATE_KEY # staging dev key
sweep-wallet-funds previews balances first (read-only cast balance — the mover script has no dry-run flag), sweeps native LAST to avoid stranding gas, and reports per-network moved/skipped. It owns the human-confirmed pre-send report and secrets hygiene — do not reimplement cast send or moveNativeFundsToNewWallet.ts here.
> HyperEVM big blocks (manual, per-address). The new dev EOA cannot deploy on hyperevm until big blocks are enabled for it — an L1 setting that does not carry over on rotation (register the address as a HyperCore Core user, then toggle big blocks ON). Follow the runbook: docs/HyperEVMBigBlocks.md.
Staging diamonds are EOA-owned by the dev wallet, so this is a direct owner transfer per EVM network (the old dev key sets the new dev address as owner; the new wallet accepts if the diamond uses a two-step handover). Run the preview/dry-run first, confirm, then execute one network at a time.
On Tron staging (tronshasta) ownership does not go to an EOA — hand the diamond to the Timelock via the existing script (env-derived network: staging → tronshasta, NOT a flag):
bashbunx tsx script/deploy/tron/transfer-ownership-to-timelock.ts --dryRun # preview bunx tsx script/deploy/tron/transfer-ownership-to-timelock.ts --step 1 # then --step 2
This script may prompt for --currentOwnerPrivateKey; supply the old dev key via env, never inline. If any step needs Ledger signing, it is a human step — never self-sign.
move-tron-delegation)Re-point the Tron staked-resource (energy/bandwidth) delegation from the old dev Tron address to the new one. There is no repo tooling and the delegation is delegator-controlled, so this is executed off-repo by the resource-provider wallet holder.
text/move-tron-delegation --old-address <old dev 0x…> --new-address <NEW> --role dev
move-tron-delegation derives both Tron base58 addresses, drafts the undelegate→re-delegate request, and after execution VERIFIES on Tronscan (new address shows the energy, old shows 0). Do not derive addresses or draft the request here.
update-wallet-config)Open the PR that rotates the devWallet role in config.
text/update-wallet-config --role dev --new-address <NEW>
update-wallet-config updates the EVM devWallet field AND the matching tronWallets.devWallet (Tron base58 derived via troncast address to-base58, cross-checked with the reverse to-hex), honors config-structure rule 004, and ends by calling /create-pr. The Notion registry update is a follow-up it flags (needs auth — don't fake it).
check-rotation-status)Run the read-only completeness gate scoped to the dev rotation:
text/check-rotation-status --old-address <old dev 0x…> --new-address <NEW> --role dev
For the dev role the relevant checks are: staging-diamond owner() = new (old no longer owner) on every EVM network, the Tron staging owner/delegation state, and the CI wallet-funding check. Only declare the rotation complete when every network passes.
Summarize per network: swept (moved/skipped), staging ownership transferred, Tron delegation moved + verified, config PR URL, and the check-rotation-status result. Call out any network still failing the check and the remaining human follow-ups (Notion registry update, decommissioning the old dev key).
The rotation is complete only when check-rotation-status (Phase 5) passes for every active network: new dev owns each staging diamond, old dev owns none, Tron staging + delegation reflect the new address, and funding passes. Re-run /rotate-dev-wallet --check any time to re-confirm without changing state.
| Step | Delegates to | Owns | |---|---|---| | Fund new wallet | sweep-wallet-funds | native sweep across EVM chains, pre-send report, secrets hygiene | | Tron ownership → Timelock | script/deploy/tron/transfer-ownership-to-timelock.ts | env-derived Tron network handover (staging → tronshasta) | | Tron delegation | move-tron-delegation | undelegate→re-delegate request + Tronscan verify | | Config PR | update-wallet-config | global.json devWallet + tronWallets.devWallet, /create-pr | | Completeness gate | check-rotation-status | read-only cross-network verification |
This skill adds only sequencing, the custody/self-sign guardrails, and the confirm-before-broadcast gate — no funds-moving, address-deriving, or config-editing logic of its own.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 14,623 | 4,489 | -69% | 1 | 1 | 0% | 2,806 | 2,870 | +2% | 0 | 0 | — |
case-02 | fail→pass | 15,163 | 8,862 | -42% | 1 | 1 | 0% | 2,729 | 3,755 | +38% | 0 | 0 | — |
case-03 | fail→fail | 22,486 | 4,444 | -80% | 1 | 1 | 0% | 4,440 | 2,895 | -35% | 0 | 0 | — |
case-04 | fail→pass | 15,754 | 4,208 | -73% | 1 | 1 | 0% | 2,867 | 2,984 | +4% | 0 | 0 | — |
case-05 | fail→pass | 6,513 | 4,354 | -33% | 1 | 1 | 0% | 883 | 2,949 | +234% | 0 | 0 | — |
case-06 | fail→pass | 11,773 | 3,701 | -69% | 1 | 1 | 0% | 1,890 | 2,751 | +46% | 0 | 0 | — |
case-07 | fail→fail | 13,092 | 9,598 | -27% | 1 | 1 | 0% | 1,956 | 3,785 | +94% | 0 | 0 | — |
case-08 | fail→pass | 15,213 | 5,620 | -63% | 1 | 1 | 0% | 2,452 | 3,184 | +30% | 0 | 0 | — |
case-09 | fail→pass | 11,029 | 5,241 | -52% | 1 | 1 | 0% | 1,668 | 3,251 | +95% | 0 | 0 | — |
case-10 | pass→pass | 7,170 | 4,447 | -38% | 1 | 1 | 0% | 1,014 | 2,981 | +194% | 0 | 0 | — |
case-11 | pass→pass | 12,031 | 3,947 | -67% | 1 | 1 | 0% | 1,803 | 2,855 | +58% | 0 | 0 | — |
case-12 | fail→fail | 5,578 | 6,549 | +17% | 1 | 1 | 0% | 800 | 3,425 | +328% | 0 | 0 | — |
case-13 | fail→pass | 15,842 | 6,253 | -61% | 1 | 1 | 0% | 2,429 | 3,289 | +35% | 0 | 0 | — |
case-14 | fail→pass | 11,170 | 4,508 | -60% | 1 | 1 | 0% | 1,712 | 3,042 | +78% | 0 | 0 | — |
case-15 | fail→pass | 12,988 | 4,076 | -69% | 1 | 1 | 0% | 1,905 | 2,807 | +47% | 0 | 0 | — |
case-16 | fail→pass | 10,595 | 3,094 | -71% | 1 | 1 | 0% | 1,648 | 2,729 | +66% | 0 | 0 | — |
case-17 | pass→pass | 9,610 | 4,436 | -54% | 1 | 1 | 0% | 1,487 | 2,991 | +101% | 0 | 0 | — |
case-18 | fail→pass | 10,355 | 3,663 | -65% | 1 | 1 | 0% | 1,658 | 2,813 | +70% | 0 | 0 | — |
case-19 | fail→pass | 8,955 | 2,207 | -75% | 1 | 1 | 0% | 1,197 | 2,564 | +114% | 0 | 0 | — |
case-20 | pass→pass | 15,622 | 5,225 | -67% | 1 | 1 | 0% | 2,359 | 3,090 | +31% | 0 | 0 | — |
case-21 | fail→pass | 14,912 | 3,526 | -76% | 1 | 1 | 0% | 2,132 | 2,741 | +29% | 0 | 0 | — |
case-22 | pass→pass | 12,849 | 3,263 | -75% | 1 | 1 | 0% | 2,137 | 2,768 | +30% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +59 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.