实现ERC20购买ERC1155

准备

需要部署wyvern协议中的以下合约: - atomicizer > 在一个订单中执行多笔交易,如果有一笔失败,所有交易都撤回 - exchange > 交换合约 - registry > 代理合约 > WyvernRegistry 实例化时,会调用父类ProxyRegistry的父类Ownable构造函数,设定当前操作者为合约的所有者 - statici

WyvernRegistry构造函数中,会创建一个AuthenticatedProxy,AuthenticatedProxy接收两个参数,一个是当前操作者用户地址,该用户将拥有吊销或者不吊销代理的权限,启动是会吊销代理权限,使得只有他自己可以调用AuthenticatedProxyproxy(address dest, HowToCall howToCall, bytes memory data)方法。 构造函数还会将delegateProxyImplementation(委托代理执行)指定为上面的AuthenticatedProxy实例地址。

继承关系:WyvernRegistry is ProxyRegistry is OwnableOwnable的构造函数会把当前操作者设置为合约的_owner(拥有者)。_owner将可以执行grantInitialAuthentication,grantInitialAuthentication接收一个合约地址,这个合约地址将被保存在contracts动态变量中,contracts的合约可以调用代理。

WyvernRegistry is ProxyRegistry有一个registerProxy()方法,该方法将当前操作者添加到动态变量mapping(address => OwnableDelegateProxy) public override proxies 中,key为用户的地址,值为一个OwnableDelegateProxy合约,这个合约在构造函数中,有三个参数: - 参数1:接收当前操作者的address - 参数2:接收前面的delegateProxyImplementation - 参数3:接收delegateProxyImplementationinitialize的abi方法:

proxy = new OwnableDelegateProxy(user, delegateProxyImplementation, abi.encodeWithSignature("initialize(address,address)", user, address(this)));

OwnedUpgradeabilityStorage 是一个用来保存_implementation_upgradeabilityOwner

分析过程看到一段这样的代码,对于其中的address(impl),这只是一个内部引用,AuthenticatedProxy并没有部署,不应该有地址,经过验证发现solidity中每一个合约不管理是否部署,都会有地址

constructor ()  
    public  
{     
    AuthenticatedProxy impl = new AuthenticatedProxy();  
    impl.initialize(address(this), this);  
    impl.setRevoke(true);  
    delegateProxyImplementation = address(impl);  
  
    emit addr("hello",address(this),address(impl));  
}