Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Move Tron staked-resource (energy/bandwidth) delegation from a rotated-OUT wallet's Tron address to the new wallet's Tron address during a wallet rotation. There is NO repo tooling for this and the delegation is delegator-controlled — the actual undelegate/re-delegate is executed off-repo by the resource-provider wallet holder (Max), not by this skill or any of our keys. This skill derives old+new Tron base58 addresses, drafts the exact move request for the provider, then AFTER the provider exec
.claude/skills/lifinance-move-tron-delegation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 232% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 115% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 127% | 0% |
During an SC-wallet rotation (dev / deployer), the rotated-OUT wallet's Tron address is the recipient of staked-resource delegation (energy, and sometimes bandwidth) from a separate resource-provider wallet. Deploying and operating on Tron consumes energy; without a delegation the new wallet would have to burn TRX for every transaction. This skill moves that delegation from the old wallet's Tron address to the new one so the new wallet inherits the free energy the old one had.
The move itself is not something this repo or our keys can do. Tron resource delegation is controlled by the delegator — the wallet that staked the TRX and delegated the resulting energy. That wallet is held by the resource provider (Max), off-repo. This skill's job is the parts we own: derive the correct addresses, draft an unambiguous request, and verify the result on-chain afterward.
See EXSC-562 for the ticket that documents this delegation-handoff step.
Use when the user says any of:
Called as a phase by rotate-dev-wallet and rotate-deployer-wallet.
Do NOT use for:
owner() to the Timelock is a different, on-chain action performed with bunx tsx script/deploy/tron/transfer-ownership-to-timelock.ts and is owned by rotate-deployer-wallet (staging equivalent runs against tronshasta). Delegation ≠ ownership — do not conflate them.
not the delegator. If someone asks this skill to broadcast the delegation, stop and explain that only the provider wallet can.
sweep-wallet-funds.Required:
0x… EVM address of the rotated-OUT wallet (dev ordeployer). Its Tron base58 is derived below, never trusted from config.
0x… EVM address of the new wallet.Optional:
dev or deployer, for the request text and theupdate-wallet-config follow-up. Ask once if unclear.
energy, bandwidth, or both. Default: energy. Confirm theactual delegated amount from Tronscan in Step 3 rather than assuming.
Derive the old wallet's address from the private key or the user-supplied value — never read it from config/global.json, which can be mid-rotation-inconsistent (a documented trap).
dev, pauser. NEVER move delegation associated with refund / feeCollector / withdraw wallets — those are CTO-owned. If the old address maps to one of those, stop.
the provider (Max) with the delegator wallet, off-repo. This skill drafts and verifies only. Do not attempt troncast send or any broadcast for the move.
that stays with transfer-ownership-to-timelock.ts / multisig-rollout.
dummy RPC env (ETH_NODE_URI_TRON). Never print a private key or a full RPC URL. Derive the old Tron address from the old EVM address, not from config.
--check / dry-run. This skill is inherently read-only on our side: itproduces a request document and a verification report and changes nothing on-chain. Address derivation (Step 1) is the dry-run — run it and show the base58 pair before drafting anything.
troncast address conversion is offline but aborts without an RPC env, so prefix a dummy URL. Convert both EVM addresses and cross-check each with the reverse conversion so a typo can't slip through.
bashexport PATH="$HOME/.foundry/bin:$HOME/.bun/bin:$PATH" OLD_EVM="<oldWalletEvmAddress>" NEW_EVM="<newWalletEvmAddress>" OLD_TRON=$(ETH_NODE_URI_TRON="https://dummy" bun troncast address to-base58 "$OLD_EVM") NEW_TRON=$(ETH_NODE_URI_TRON="https://dummy" bun troncast address to-base58 "$NEW_EVM") # reverse-check: to-hex of each base58 must return the original EVM address ETH_NODE_URI_TRON="https://dummy" bun troncast address to-hex "$OLD_TRON,$NEW_TRON"
troncast address uses kebab-case subcommands (to-base58, to-hex) and takes the address as a positional argument; comma-separate to convert several at once. If the reverse to-hex does not return the original EVM address for either, stop — an input is wrong.
Show the derived pair to the user before proceeding:
textOld (rotated-out) : <OLD_EVM> = <OLD_TRON> New : <NEW_EVM> = <NEW_TRON>
Look up the OLD Tron address on Tronscan and record the actual delegated resource so the request quotes a real number rather than a guess:
https://tronscan.org/#/address/<OLD_TRON> → Resources tab →the energy/bandwidth delegated to this address (and by which delegator).
Note the delegator address, the resource type(s), and the amount. If nothing is delegated to the old address, there is nothing to move — report that and stop (the rotation does not need this step for that role).
Produce a short, unambiguous message for the resource-provider wallet holder (Max). It must name both Tron base58 addresses, the resource type, and the amount observed in Step 2. Template:
textTron resource delegation move (rotation EXSC-<ticket>, role: <dev|deployer>) Please move the staked-resource delegation from our old wallet to the new one: UNDELEGATE ~<N> <energy|bandwidth> FROM <OLD_TRON> RE-DELEGATE the same TO <NEW_TRON> Delegator wallet (yours): <delegator T-address from Step 2> This is delegatee-side only; we cannot execute it from our keys. Ping here once done and I'll verify on Tronscan.
Hand this to the user to relay (or post per the rotation's coordination channel). This skill does not send it anywhere itself unless the user asks.
The move happens off-repo. Pause here until the provider confirms it is done. Do not fabricate a completion, and do not mark the rotation's Tron step complete until Step 5 passes on-chain.
After the provider confirms, verify both sides on Tronscan:
https://tronscan.org/#/address/<NEW_TRON> → Resources → shows the expected energy/bandwidth delegated in from the provider.
https://tronscan.org/#/address/<OLD_TRON> → Resources → shows 0 of that delegation remaining.
Both must hold. If the new address shows the energy but the old still shows a residual, the undelegate half is incomplete — report it and re-request; do not call the step done.
tronWallets is updatedThe config side of the Tron rotation (updating config/global.json tronWallets.<role> to the new base58) is owned by update-wallet-config. If that PR has not already landed as part of the rotation, invoke /update-wallet-config for this role now so the repo's recorded Tron address matches the wallet that now holds the delegation. Derive the base58 there via the same troncast conversion — do not trust a possibly-stale global.json.
Report the outcome explicitly — do not claim success without the Step 5 evidence:
tronWallets.<role> now reflects the new base58 (Step 6), or thatthe update-wallet-config PR is still pending.
If any of these is unmet, state which and that the Tron delegation step of the rotation is NOT complete.
troncast address to-base58 / to-hex — offline EVM↔Tron address conversion(needs a dummy ETH_NODE_URI_TRON; kebab-case). See script/troncast/README.md.
update-wallet-config — lands the tronWallets.<role> config change (Step 6).transfer-ownership-to-timelock.ts — the SEPARATE Tron diamond-ownershipmove; owned by rotate-deployer-wallet, explicitly not this skill.
rotate-dev-wallet / rotate-deployer-wallet — the rotations that invokethis skill as their Tron-delegation phase.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 19,007 | 19,916 | +5% | 1 | 1 | 0% | 3,780 | 3,111 | -18% | 0 | 0 | — |
case-02 | fail→fail | 41,513 | 10,225 | -75% | 1 | 1 | 0% | 3,615 | 3,116 | -14% | 0 | 0 | — |
case-08 | fail→pass | 14,609 | 3,915 | -73% | 1 | 1 | 0% | 2,795 | 3,157 | +13% | 0 | 0 | — |
case-03 | fail→fail | 20,278 | 9,448 | -53% | 1 | 1 | 0% | 4,133 | 3,057 | -26% | 0 | 0 | — |
case-04 | fail→pass | 6,244 | 6,238 | -0% | 1 | 1 | 0% | 1,061 | 3,519 | +232% | 0 | 0 | — |
case-05 | fail→pass | 9,511 | 6,170 | -35% | 1 | 1 | 0% | 1,657 | 3,560 | +115% | 0 | 0 | — |
case-06 | fail→pass | 19,927 | 3,560 | -82% | 1 | 1 | 0% | 3,752 | 3,003 | -20% | 0 | 0 | — |
case-07 | fail→pass | 8,234 | 6,736 | -18% | 1 | 1 | 0% | 1,595 | 3,621 | +127% | 0 | 0 | — |
case-09 | fail→pass | 30,567 | 4,687 | -85% | 1 | 1 | 0% | 2,692 | 3,262 | +21% | 0 | 0 | — |
case-10 | fail→pass | 12,391 | 4,599 | -63% | 1 | 1 | 0% | 2,204 | 3,269 | +48% | 0 | 0 | — |
case-11 | pass→pass | 9,387 | 2,985 | -68% | 1 | 1 | 0% | 1,712 | 2,960 | +73% | 0 | 0 | — |
case-12 | fail→pass | 9,522 | 4,315 | -55% | 1 | 1 | 0% | 1,432 | 3,196 | +123% | 0 | 0 | — |
case-13 | fail→fail | 13,799 | 4,595 | -67% | 1 | 1 | 0% | 2,270 | 3,098 | +36% | 0 | 0 | — |
case-14 | pass→pass | 6,134 | 3,717 | -39% | 1 | 1 | 0% | 1,082 | 3,100 | +187% | 0 | 0 | — |
case-15 | fail→pass | 9,705 | 5,031 | -48% | 1 | 1 | 0% | 1,536 | 3,220 | +110% | 0 | 0 | — |
case-16 | fail→pass | 15,008 | 4,085 | -73% | 1 | 1 | 0% | 2,255 | 3,072 | +36% | 0 | 0 | — |
case-21 | pass→pass | 10,137 | 7,615 | -25% | 1 | 1 | 0% | 1,314 | 3,652 | +178% | 0 | 0 | — |
case-17 | fail→pass | 8,908 | 5,212 | -41% | 1 | 1 | 0% | 1,422 | 3,497 | +146% | 0 | 0 | — |
case-18 | fail→pass | 18,857 | 3,231 | -83% | 1 | 1 | 0% | 3,312 | 2,945 | -11% | 0 | 0 | — |
case-19 | fail→pass | 7,963 | 3,360 | -58% | 1 | 1 | 0% | 1,086 | 2,902 | +167% | 0 | 0 | — |
case-20 | fail→fail | 6,626 | 5,478 | -17% | 1 | 1 | 0% | 1,087 | 3,394 | +212% | 0 | 0 | — |
case-22 | fail→pass | 13,494 | 3,766 | -72% | 1 | 1 | 0% | 2,117 | 2,982 | +41% | 0 | 0 | — |
case-23 | fail→pass | 10,863 | 2,692 | -75% | 1 | 1 | 0% | 1,875 | 2,865 | +53% | 0 | 0 | — |
case-24 | fail→pass | 15,738 | 6,089 | -61% | 1 | 1 | 0% | 2,495 | 3,375 | +35% | 0 | 0 | — |
case-25 | fail→pass | 16,381 | 5,732 | -65% | 1 | 1 | 0% | 2,620 | 3,467 | +32% | 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. 25 cases were attempted, and 22 counted toward the lift figure. The other 3 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 +68 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.