Solidity

合約呼叫另一個合約中的函式:TypeError

  • February 17, 2022

我有三個契約Ignition.sol ,,,, Ignition 應該在工廠契約Factory.solCookie.sol呼叫函式’factoryStart()’。newCookie()Cookie.sol根據傳遞的參數創建新合約。

為便於閱讀,省略了部分程式碼。

點火.溶膠:

pragma solidity ^0.7.0;

contract Ignition {

uint256 attr1;
uint256 attr2;

constructor(uint256 _attr1, uint256 _attr2){
  attr1 = _attr1;
  attr2 = _attr2;
}

// do stuff...

   function factoryStart() public {

    Factory.newCookie( attr1, attr2 );
   }

}

工廠.sol:

pragma solidity ^0.7.0;

contract Factory {

uint256 attr1;
uint256 attr2;

constructor(uint256 _attr1, uint256 _attr2){
attr1 = _attr1;
attr2 = _attr2;
}

// do stuff...

function newCookie() public {

Cookie newCookie = new Cookie(attr1, attr2);
}

}

現在,我得到一個編譯錯誤;

TypeError:無法通過合約類型名稱呼叫函式。

我知道我的解決方案一定是錯誤的,因為我需要Factory在 Ignition 中的 ABI/地址,以便可以進行互動,但我不知道如何。

任何幫助表示讚賞。

我知道我的解決方案一定是錯誤的,因為我需要 in 的 ABI/地址Factory才能Ignition進行互動,但我不知道如何進行。

不,您的解決方案是錯誤的,因為您需要通過合約實例呼叫合約函式,而不是通過合約名稱。

給定的合約可以在多個不同的地址部署多個實例,因此通過合約名稱呼叫合約函式是沒有意義的。

從技術上講,您需要執行以下操作:

function factoryStart(Factory factory) public {
   factory.newCookie(attr1, attr2);
}

或者,Factory factory可以是合約中的全域變數,您需要Factory在呼叫 function 之前對其進行初始化以指向實例factoryStart,例如:

Factory factory;
uint256 attr1;
uint256 attr2;

constructor(Factory _factory, uint256 _attr1, uint256 _attr2) public {
   factory = _factory;
   attr1 = _attr1;
   attr2 = _attr2;
}

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