Solidity

從已部署的合約實例呼叫 get 函式時出錯

  • March 25, 2022

我在 Ganache 本地網路中使用 React 開發了一個 EnergyExchange DApp,其中包含一個主契約“EnergyExchange”。該主合約具有部署新代理合約的功能。

所以我所做的是將部署的代理契約儲存在映射中,以便稍後當我想與它們互動時,我呼叫下一個函式:

let contractInstance = await this.getAgentInstance();

該函式返回與正在使用元遮罩的瀏覽器中使用的帳戶關聯的特定代理實例。見下面實例的console.log:

實例的控制台日誌

如您所見,getAgentInstance() 函式返回所需的輸出雖然有一些錯誤。(知道為什麼嗎?)

但在發生其他事情之前,我並不擔心錯誤。在檢索到與我在 Metamask 中使用的帳戶關聯的代理契約實例後,我使用它與契約進行互動。即 next 函式修改 EnergyExchange 主合約數據:

async agentCancelSellOffer(){

 let contractInstance = await this.getAgentInstance();

 await contractInstance.cancelAddedSellOrder(this.state.inputCancelSellOrderId,{from:this.state.account});
 
}

並且該功能執行得很好。另請參閱檢索代理實例後執行良好的另一個函式:

async agentAddOffer(){

 let contractInstance = await this.getAgentInstance();

 await contractInstance.addSellOrder(this.state.inputUnitsOfEnergy,this.state.inputPricePerUnit,{from:this.state.account});
 
}

當我在邏輯中添加一個 get 函式時,問題就來了:

async agentGetDetails(){
 
 
 let contractInstance = await this.getAgentInstance();
 console.log(contractInstance);
 let details = await contractInstance.getAgentDetails({from:this.state.account});

 console.log('function get agentdetails executed');

執行下一步後 App 再次崩潰:

let details = await contractInstance.getAgentDetails({from:this.state.account});

下面詳細介紹 AgentContract 中的 getAgentDetails 函式:

function getAgentDetails() public view isOwner returns(address,uint,uint,uint){
   return (agentAddress,agentID,agentCreationDate,agentAvailableEnergyToSell);
   
}

錯誤如下:

錯誤日誌

關於我做錯了什麼的任何想法?

謝謝,

get 函式必須包含.call(),也許這就是問題所在

檢查您編譯的合約 abi JSON 表示。abi 中很可能缺少 getAgentDetails()。刪除您環境中的任何預設網路並正確設置測試網路地址並再次編譯。它應該工作。

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