Solidity

複製合約 (EIP-1167):如何從實現合約連接呼叫函式?

  • September 3, 2022

我正在建構一個使用 OpenZeppelin 複製庫 (EIP-1167) 的 dApp,這將使我的使用者能夠廉價地部署複製並獲得實施契約的功能。我已經編寫了我的實施契約,並且有一些關於創建複製並將它們連接到我的前端的問題。

這是 CloneFactory 契約:

pragma solidity ^0.8.8;

import "./Whoopy.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/proxy/Clones.sol";

contract WhoopFactory is Ownable {
   address public implementationContract;
   address instance;

   mapping(address => address[]) public allClones;

   // address[] public allClones;

   event NewClone(address _clone, address _whoopyCreator);

   struct whoopy {
       uint256 index;
       address whoopyCreator;
   }

   mapping(address => whoopy) whoopyList;


   constructor(address _implementation) {
       implementationContract = _implementation;
   }

   function createClone() external {
       address instance = Clones.clone(implementationContract);
       allClones[msg.sender].push(instance);
       Whoopy(instance).initialize(msg.sender);
       emit NewClone(instance, msg.sender);
   }

   function returnClones(address _whoopCreator) external view returns (address[] memory) {
       return allClones[_whoopCreator];
   }

我想知道在創建複製並初始化它之後如何從我的實現契約中呼叫其他函式。我是否必須將我想從實現契約呼叫的功能編碼到“WhoopyFactory”契約中,還是有其他方法可以解決這個問題?

(我在網上看了很多教程,但是它們都只教到初始化階段,沒有一個會呼叫其他函式。)

此外,我的實施契約繼承了大約 3 個其他契約。我需要在 CloneFactory 中考慮這些契約還是自動處理這些契約。我已經確保從所有祖先合約中刪除建構子並改用初始化,如 OpenZeppelin docs here所指示的那樣。

任何幫助將不勝感激!提前致謝!

答案很簡單:只需將複製合約視為完全正常且獨立的合約即可。

因此,要從前端與之互動,您只需要它的地址和 ABI。使用醚:

const contract = new ethers.Contract(contractAddress, Whoopy_ABI, provider)

contractAddress是從 回來的returnClones(_whoopCreator)Whoopy_ABI是大家共同的。要從solidity與它進行互動,您可以使用與實現相同的介面;事實上,你已經在你的例子中這樣做了:Whoopy(instance).initialize(...).

幾乎從不應該與實現契約本身進行互動。

此外,我的實施契約繼承了大約 3 個其他契約。我需要在 CloneFactory 中考慮這些契約還是自動處理這些契約。我已經確保從所有祖先契約中刪除建構子並改用初始化,如 OpenZeppelin docs here 所指示的那樣。

如果編譯器沒有引發錯誤,那麼你已經很好了。否則只需要在 interface/ABI 中添加繼承的函式即可。

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