首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >克隆契约(EIP-1167):如何将调用函数与实现契约连接起来?

克隆契约(EIP-1167):如何将调用函数与实现契约连接起来?
EN

Ethereum用户
提问于 2022-09-02 12:32:27
回答 1查看 154关注 0票数 1

我正在构建一个dApp,它使用OpenZeppelin克隆库(EIP-1167),这将允许我的用户廉价地部署克隆并获得实现契约的功能。我已经写好了我的实现合同,并且有一些关于创建克隆并将它们连接到我的前端的问题。

以下是CloneFactory合同:

代码语言:javascript
复制
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 这里的指示使用初始化。

任何帮助都将不胜感激!提前感谢!

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-09-03 23:17:46

答案很简单:只要把克隆的合同看作是一个完全正常和独立的契约就可以了。

因此,要从前端与它交互,只需要它的地址和ABI。使用醚:

代码语言:javascript
复制
const contract = new ethers.Contract(contractAddress, Whoopy_ABI, provider)

contractAddress是从returnClones(_whoopCreator)返回的,Whoopy_ABI是每个人都有的。要从坚固性与它进行交互,您可以使用与实现相同的接口;事实上,您已经在您的示例Whoopy(instance).initialize(...)中这样做了。

几乎从来不应该与实现契约本身交互。

此外,我的执行合同继承了大约3份其他合同。我是否需要在CloneFactory中说明这些合同,还是自动处理。我已经确保从所有祖先契约中删除构造函数,并按照这里OpenZeppelin文档的指示使用初始化。

如果编译器没有引发错误,那么您已经很好了。否则,只需在接口/ABI中添加继承的函数。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/134862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档