Contract-Invocation

監控特定函式呼叫的乙太坊合約 - ABI 中缺少方法

  • November 25, 2021

我創建了一個腳本來接受合約地址並觀察該合約的特定“事件”。在這種情況下,我想在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/

引用自:https://ethereum.stackexchange.com/questions/114256