我正在构建一个dApp,它使用OpenZeppelin克隆库(EIP-1167),这将允许我的用户廉价地部署克隆并获得实现契约的功能。我已经写好了我的实现合同,并且有一些关于创建克隆并将它们连接到我的前端的问题。
以下是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 这里的指示使用初始化。
任何帮助都将不胜感激!提前感谢!
发布于 2022-09-03 23:17:46
答案很简单:只要把克隆的合同看作是一个完全正常和独立的契约就可以了。
因此,要从前端与它交互,只需要它的地址和ABI。使用醚:
const contract = new ethers.Contract(contractAddress, Whoopy_ABI, provider)contractAddress是从returnClones(_whoopCreator)返回的,Whoopy_ABI是每个人都有的。要从坚固性与它进行交互,您可以使用与实现相同的接口;事实上,您已经在您的示例Whoopy(instance).initialize(...)中这样做了。
几乎从来不应该与实现契约本身交互。
此外,我的执行合同继承了大约3份其他合同。我是否需要在CloneFactory中说明这些合同,还是自动处理。我已经确保从所有祖先契约中删除构造函数,并按照这里OpenZeppelin文档的指示使用初始化。
如果编译器没有引发错误,那么您已经很好了。否则,只需在接口/ABI中添加继承的函数。
https://ethereum.stackexchange.com/questions/134862
复制相似问题