solidity-debug
1
总安装量
1
周安装量
#52838
全站排名
安装命令
npx skills add https://github.com/0xlayerghost/solidity-agent-kit --skill solidity-debug
Agent 安装分布
claude-code
1
Skill 文档
Failed Transaction Debug Workflow (cast)
Language Rule
- Always respond in the same language the user is using. If the user asks in Chinese, respond in Chinese. If in English, respond in English.
Step 1: è·å交æåæ§ â 夿æå/失败
source .env
cast receipt <tx_hash> --rpc-url $RPC_URL
å ³æ³¨åæ®µï¼
| åæ®µ | å«ä¹ |
|---|---|
status |
0 = 失败, 1 = æå |
gasUsed |
å®é æ¶èç gas |
logs |
空æ°ç» [] = 交æ revertï¼æ äºä»¶ååº |
to |
ç®æ å约å°å |
Step 2: è·å交æè¯¦æ â æ¿å° gas limit å input
cast tx <tx_hash> --rpc-url $RPC_URL
å ³æ³¨åæ®µï¼
| åæ®µ | å«ä¹ |
|---|---|
gas |
åéæ¹è®¾ç½®ç gas limit |
input |
è°ç¨ç calldataï¼å½æ°éæ©å¨ + åæ°ç¼ç ï¼ |
from / to |
åéæ¹åç®æ å约 |
value |
åéçåç代叿°é |
Step 3: å¤æå¤±è´¥ç±»å â gasUsed vs gas limit
| ç°è±¡ | 夿 | è§£å³æ¹å |
|---|---|---|
| gasUsed / gas â 100%ï¼å¦ 999,472 / 1,000,000ï¼ | Out of Gas (OOG) | æé« gas limit æç¨ eth_estimateGas |
| gasUsed è¿ä½äº gas limitï¼å¦ 50,000 / 1,000,000ï¼ | Revert | éè·å revert reasonï¼è§ Step 6 |
| gasUsed æ£å¸¸ä½ status=0 | å é¨è°ç¨å¤±è´¥ | æ£æ¥ä½é¢ãææãå é¨ call è¿åå¼ |
| äº¤ææ ¹æ¬æ²¡ä¸é¾ | Nonce/Gas Price é®é¢ | æ£æ¥ pending éå |
Step 4: è§£ç 彿°éæ©å¨ â ç¡®å®è°ç¨äºä»ä¹å½æ°
# ä» input çå 4 åèæ¥å½æ°ç¾å
cast 4byte 0xb51a038a
# è¾åºç¤ºä¾: unstake(uint256,address[],uint256[])
Step 5: è§£ç 宿´ calldata â è¿åè°ç¨åæ°
# ç¨ Step 4 å¾å°ç彿°ç¾åè§£ç
cast calldata-decode "unstake(uint256,address[],uint256[])" <宿´input_data>
è§£ç åçåæ°å¯ç¨äºï¼
- åæå ¥åæ¯å¦æè¯¯
- ç´æ¥ç¨äºéè¯äº¤æ
Step 6: è·å Revert Reasonï¼é OOG åºæ¯ï¼
# æ¹æ³ A: cast call 模æï¼æå®å¤±è´¥åºåå·ï¼ç¨äº¤ææå¨åºåï¼
cast call <to> <input_data> \
--from <from> \
--block-number <block_number> \
--rpc-url $RPC_URL
# æ¹æ³ B: cast run éæ¾äº¤æï¼éè¦ archive èç¹ï¼
cast run <tx_hash> --rpc-url <archive_rpc_url>
# æ¹æ³ C: å¨çº¿å·¥å
·ï¼å¤ç¨ï¼
# Tenderly: https://dashboard.tenderly.co/tx/<chain>/<tx_hash>
# Blocksec: https://phalcon.blocksec.com/
Step 7: æ¥è¯¢é¾ä¸ç¶æ â 确认交æå¤±è´¥åæ°æ®å·²åæ»
# æ¥è¯¢ public åé/æ å°
cast call <contract> "orderLocations(uint256)(address,uint256,bool)" <id> --rpc-url $RPC_URL
# æ¥è¯¢ struct åæ®µï¼æ ABI é¡ºåºæå®è¿åç±»åï¼
cast call <contract> "userStakeRecord(address,uint256)(uint40,uint160,bool,uint8,uint256)" <user> <index> --rpc-url $RPC_URL
失败交æçç¶æåæ´ä¼å®å ¨åæ»ï¼éç¡®è®¤æ°æ®ä»å¨åå§ç¶æã
Step 8: å¯¹æ¯æå vs 失败交æ â æ¾å·®å¼
å°æåå失败çäº¤ææ¾å¨ä¸èµ·å¯¹æ¯ï¼
| 对æ¯ç»´åº¦ | 说æ |
|---|---|
| gas æ¶è | 夿æ¯å¦ OOG |
| è°ç¨åæ° | 夿æ¯å¦å ¥åé®é¢ |
| ç®æ å°å | 夿æ¯å¦è°éå约 |
| åºåæ¶é´ | 夿æ¯å¦ææ¶é´éçéå¶ |
| åçº¦ç¶æ | 夿æ¯å¦åç½®æ¡ä»¶ä¸æ»¡è¶³ |
Step 9: éè¯äº¤æ
source .env
# ä¸æå® gas limitï¼è®©èç¹èªå¨ä¼°ç®ï¼æ¨èï¼
cast send <contract> "functionName(uint256,address[],uint256[])" <arg1> "[<addr1>,<addr2>]" "[<amt1>,<amt2>]" \
--private-key $PRIVATE_KEY \
--rpc-url $RPC_URL \
--legacy
# æå®è¾é« gas limitï¼éç¨äºå·²ç¥æ¶èèå´çåºæ¯ï¼
cast send <contract> "functionName(uint256)" <arg1> \
--private-key $PRIVATE_KEY \
--rpc-url $RPC_URL \
--gas-limit 2000000 \
--legacy
å®å ¨æ³¨æäºé¡¹
| è§å | 说æ |
|---|---|
| ç§é¥ç®¡ç | æ°¸è¿ä½¿ç¨ source .env å è½½ç§é¥ï¼ç¦æ¢å¨å½ä»¤ä¸ææä¼ å
¥ |
| 模æä¼å | çå®åéåå
ç¨ cast call 模æï¼ç¡®è®¤ä¸ä¼ revert |
| éç¬åé | æ¹ééè¯æ¶å åä¸ç¬éªè¯ï¼æååååå©ä½ |
| ç¶æç¡®è®¤ | åéåç¨ cast receipt 确认 status=1ï¼åç¨ cast call 确认é¾ä¸ç¶æå·²åæ´ |
宿´ç¤ºä¾æµç¨
source .env
# 1. çåæ§
cast receipt 0x4ca1...414f --rpc-url $RPC_URL
# 2. ç交æè¯¦æ
cast tx 0x4ca1...414f --rpc-url $RPC_URL
# 3. åç° gas=1000000, gasUsed=999472, status=0 â OOG
# 4. è§£ç 彿°éæ©å¨
cast 4byte 0xb51a038a
# â unstake(uint256,address[],uint256[])
# 5. è§£ç 宿´åæ°
cast calldata-decode "unstake(uint256,address[],uint256[])" 0xb51a038a...
# 6. 模æç¡®è®¤è½éè¿
cast call <contract> "unstake(uint256,address[],uint256[])" 35 "[addr1,addr2]" "[amt1,amt2]" \
--from <from> --rpc-url $RPC_URL
# 7. æ¥é¾ä¸ç¶æç¡®è®¤è®¢å仿ªå¤ç
cast call <contract> "orderLocations(uint256)(address,uint256,bool)" 35 --rpc-url $RPC_URL
# 8. ç¡®è®¤æ¯ OOG â ä¸é gas éè¯
cast send <contract> "unstake(uint256,address[],uint256[])" 35 "[addr1,addr2]" "[amt1,amt2]" \
--private-key $PRIVATE_KEY --rpc-url $RPC_URL --legacy
# 9. 确认æå
cast receipt <new_tx_hash> --rpc-url $RPC_URL