Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Opens the PR that updates a rotated SC wallet role in `config/global.json` — both the EVM field (`deployerWallet` / `devWallet` / `pauserWallet`) and its matching `tronWallets.<role>` base58 — deriving the Tron address from the new EVM address via `troncast address to-base58` and cross-checking with the reverse `to-hex`. Use when the user says "update the wallet config", "bump the new deployer/dev/pauser in global.json", "open the config PR for the rotation", or when a `rotate-*` skill reaches i
.claude/skills/lifinance-update-wallet-config/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 235% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 211% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 98% | 0% |
Config-only step of a wallet rotation: point a role in config/global.json at the new wallet, in the same PR that rotates that role. For each rotated role this rewrites two coupled fields — the top-level EVM field and the parallel tronWallets.<role> base58 — keeping them in sync. It changes no on-chain state (no Safe, no diamond, no Timelock); it edits config and hands the branch/commit/PR mechanic to /create-pr.
Use when:
rotate-* skill reaches its config/global.json step.Do NOT use when:
CANCELLER_ROLE, transfer the diamond owner) → that is multisig-rollout. This skill only edits config; the on-chain move is a separate, governed flow.move-tron-delegation; a config edit does not move delegated resources.Required:
--role) — one of deployer / dev / pauser (maps to deployerWallet / devWallet / pauserWallet and the same key under tronWallets).--new-address, EVM 0x…) — the rotation's replacement.Optional:
.env PRODUCTION=true double-opt-in rail.If either required input is missing or the role is not one of the three SC-owned roles, ask once and stop (custody guard). The old address is not an input — it is whatever the config currently holds for that role, and is being replaced.
deployerWallet / devWallet / pauserWallet (+ their tronWallets twins) may be edited here. NEVER touch refundWallet / feeCollectorOwner / withdrawWallet (CTO-owned). Reject any request naming those.tronWallets.<role> from the new EVM address with troncast address to-base58, then round-trip it back with troncast address to-hex and assert it equals the new EVM address (checksum-insensitive). Known trap: config/global.json can be mid-rotation-inconsistent (EVM field already rotated, Tron twin not, or vice versa) — so derive both fields from --new-address, do not copy an existing base58 or assume the current pair is coherent.[CONV:CONFIG-STRUCTURE]). These are single top-level scalar fields plus a tronWallets object — edit the values in place; do not restructure, reorder, or change key names. No deployRequirements.json path change is implied (these are not per-network deploy params).multisig-rollout is. Landing this PR before/independently of the on-chain change is expected during a rotation; the config records intent, the chain enforces it.troncast address conversion is offline but the CLI aborts without an RPC env — prefix a dummy URL (below); never print a real RPC URL or any key.0 success (config edited, PR handed to /create-pr); 1 real error (Tron round-trip mismatch, jq write failure — report, stop, no retry); 2 recoverable misconfig (missing --role/--new-address, troncast not found — name what to fix).Run from the worktree root. export PATH="$HOME/.foundry/bin:$HOME/.bun/bin:$PATH" if troncast/bun are not found. Confirm the role is one of deployer/dev/pauser (custody guard) and --new-address is a valid EVM address. Report the current global.json pair for the role (EVM + tronWallets.<role>) so the reviewer sees old → new.
troncast address conversion is offline but aborts without an RPC env, so prefix a dummy URL. Flags on troncast address are kebab-case — verify at write time with troncast address --help.
bashNEW_EVM="<0xNEW>" NEW_TRON=$(ETH_NODE_URI_TRON="https://dummy" troncast address to-base58 "$NEW_EVM") # Round-trip guard: the base58 must convert back to the same EVM address. ROUNDTRIP=$(ETH_NODE_URI_TRON="https://dummy" troncast address to-hex "$NEW_TRON")
Assert ROUNDTRIP equals NEW_EVM (case-insensitive compare). On mismatch, stop with exit 1 and show both — do not write a base58 you could not round-trip. Do not read the base58 from the existing tronWallets entry (may be mid-rotation stale).
Rewrite exactly the two fields for the role, in place, preserving structure and key order (rule 004). Example for the deployer role:
bashjq --arg evm "$NEW_EVM" --arg tron "$NEW_TRON" \ '.deployerWallet = $evm | .tronWallets.deployerWallet = $tron' \ config/global.json > config/global.json.tmp && mv config/global.json.tmp config/global.json
Map the role to its fields: deployer → .deployerWallet / .tronWallets.deployerWallet; dev → .devWallet / .tronWallets.devWallet; pauser → .pauserWallet / .tronWallets.pauserWallet. Touch no other field. Show the resulting diff (git diff config/global.json) — it must be exactly those two lines.
Delegate branch / commit / template / push / create to /create-pr, passing:
config/global.json (never git add -A).multisig-rollout, and the linked rotation ticket./create-pr owns the plumbing and has a confirm gate — don't reimplement it here.
The team's Notion wallet registry is the human-facing record and is not in this repo — updating it needs Notion auth this skill does not assume. State explicitly that the Notion wallet-registry entry for this role still needs updating to the new address, as a manual follow-up. Do not claim it was updated.
git diff config/global.json shows exactly the two rotated fields changed to the new EVM + derived Tron base58, nothing else.to-hex of the written base58) equals the new EVM address./create-pr reported the PR URL.check-rotation-status after multisig-rollout lands the role change — this skill does not assert on-chain state.troncast address to-base58 / to-hex — EVM↔Tron address conversion + the round-trip guard (needs a dummy ETH_NODE_URI_TRON; kebab-case flags)./create-pr — owns branch / commit / PR-template / push / create; this skill only supplies the staged file and PR body.multisig-rollout — the sibling that performs the on-chain role change this config edit records; run in the same rotation, not by this skill.move-tron-delegation — moves staked Tron resources (separate from the config base58 update).check-rotation-status — read-only gate confirming the on-chain role change matches the new config.config/global.json (004-config-structure) — the edited file; single scalar wallet fields + the tronWallets object, edited in place.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 13,596 | 8,094 | -40% | 1 | 1 | 0% | 2,696 | 2,612 | -3% | 0 | 0 | — |
case-02 | fail→fail | 11,623 | 7,748 | -33% | 1 | 1 | 0% | 2,192 | 2,553 | +16% | 0 | 0 | — |
case-03 | fail→fail | 23,353 | 8,438 | -64% | 1 | 1 | 0% | 4,456 | 2,967 | -33% | 0 | 0 | — |
case-04 | fail→pass | 6,080 | 6,124 | +1% | 1 | 1 | 0% | 952 | 3,191 | +235% | 0 | 0 | — |
case-05 | fail→pass | 4,766 | 3,558 | -25% | 1 | 1 | 0% | 876 | 2,723 | +211% | 0 | 0 | — |
case-06 | fail→pass | 10,652 | 5,487 | -48% | 1 | 1 | 0% | 1,891 | 2,951 | +56% | 0 | 0 | — |
case-07 | fail→pass | 13,735 | 4,632 | -66% | 1 | 1 | 0% | 2,635 | 2,682 | +2% | 0 | 0 | — |
case-08 | fail→pass | 8,218 | 3,645 | -56% | 1 | 1 | 0% | 1,423 | 2,823 | +98% | 0 | 0 | — |
case-09 | fail→pass | 9,358 | 5,126 | -45% | 1 | 1 | 0% | 1,546 | 3,093 | +100% | 0 | 0 | — |
case-10 | fail→pass | 10,108 | 2,163 | -79% | 1 | 1 | 0% | 1,671 | 2,364 | +41% | 0 | 0 | — |
case-11 | fail→pass | 5,893 | 2,557 | -57% | 1 | 1 | 0% | 861 | 2,454 | +185% | 0 | 0 | — |
case-12 | fail→pass | 9,163 | 4,704 | -49% | 1 | 1 | 0% | 1,534 | 2,895 | +89% | 0 | 0 | — |
case-13 | fail→pass | 15,636 | 2,125 | -86% | 1 | 1 | 0% | 865 | 2,470 | +186% | 0 | 0 | — |
case-14 | pass→pass | 7,064 | 1,688 | -76% | 1 | 1 | 0% | 1,265 | 2,368 | +87% | 0 | 0 | — |
case-15 | pass→pass | 9,201 | 2,059 | -78% | 1 | 1 | 0% | 1,250 | 2,395 | +92% | 0 | 0 | — |
case-16 | pass→pass | 8,704 | 2,984 | -66% | 1 | 1 | 0% | 1,451 | 2,607 | +80% | 0 | 0 | — |
case-17 | pass→pass | 9,924 | 4,442 | -55% | 1 | 1 | 0% | 1,700 | 2,908 | +71% | 0 | 0 | — |
case-18 | pass→pass | 10,981 | 5,047 | -54% | 1 | 1 | 0% | 1,684 | 3,001 | +78% | 0 | 0 | — |
case-19 | fail→pass | 8,569 | 2,331 | -73% | 1 | 1 | 0% | 1,439 | 2,495 | +73% | 0 | 0 | — |
case-20 | fail→pass | 6,309 | 1,608 | -75% | 1 | 1 | 0% | 932 | 2,328 | +150% | 0 | 0 | — |
case-21 | fail→pass | 5,036 | 2,958 | -41% | 1 | 1 | 0% | 936 | 2,615 | +179% | 0 | 0 | — |
case-22 | fail→pass | 4,285 | 36,447 | +751% | 1 | 1 | 0% | 777 | 2,611 | +236% | 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, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 18 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.