Contract-Invocation
監控特定函式呼叫的乙太坊合約 - ABI 中缺少方法
我創建了一個腳本來接受合約地址並觀察該合約的特定“事件”。在這種情況下,我想在EvoSnails NFT 合約上每次呼叫 Loot for Snail 函式時進行檢查。
正如您在交易中看到的,該方法已被多次呼叫,並顯示在合約 tx 列表中。但是,當我嘗試執行腳本來檢查此事件時,契約中不存在該事件。
我的程式碼片段,它檢查契約 ABI 的事件和功能在這裡:
async function getContractABI(contractAddress) { let opts = { url: `http://api.etherscan.io/api?module=contract&action=getabi&address=${contractAddress}&apikey=${etherscanApiKey}`, responseType: 'json' } try { let response = await got(opts); const contractABI = JSON.parse(response.body.result); return contractABI; } catch (e) { console.log(e); } } const getContractEvents = async (contractAddress) => { let contractABI = await getContractABI(contractAddress); let contractEvents = contractABI.map(i => { // i.type would be event but it doesn't appear for event or 'function' if (i.type === 'event'){ return i.name; } }) var results = contractEvents.reduce((results, item) => { if (typeof item === 'string') results.push(item) // modify is a fictitious function that would apply some change to the items in the array return results; }, []) return results; } getContractEvents("0x8a6e948a30ee8cb1391712710c1c59be553ab008");
如您所見,Loot for Snail 不在這裡。呼叫此特定功能時,我將如何對其進行監視?
部署在0x8a6e948a30ee8cb1391712710c1c59be553ab008的合約是 OpenZeppelin TransparentUpgradeableProxy 代理(你的 NFT 合約的原始實現在這裡:0x9539EAC4e19d0627815b166330b83f9c931A9e88
這意味著您應該使用原始合約 (0x9539)中的 abi 收聽與代理(0x8a6e) 之間的交易。
查看 Openzepellin 文章以獲取更多詳細資訊:https ://blog.openzeppelin.com/the-transparent-proxy-pattern/