我正在尝试制作一个中继智能合约,该合约可以在另一个已部署的智能合约的函数调用中传递msg.value
和msg.sender
。
上下文:目标是使用一个主要智能合约使用多个DeFi协议(已部署且不属于我的合约)进行铸造/借用,以仅处理一个钱包。这意味着资金(msg.value
?)和所有者(msg.sender
?)在调用交易的功能内转移到DeFi智能合约。
EOA =带有少量ETH来支付费用的钱包
中继 =中继智能合约,该合约必须从DeFi智能合约获得资金(= msg.sender
吗?)
proxyDeFi =代理智能合约,允许在一项交易中向一个或多个DeFi智能合约发送多个请求
在我看来,delegatecall
允许在执行另一个智能合约的功能时传递msg.sender
和msg.value
,所以到目前为止,我所做的是:
由EOA调用proxyDeFi时,其工作正常,但proxyDeFi是查询的DeFi智能合约而非EOA的msg.sender
。
我们将需要几个可以经常更新的代理合同,所以我尝试做一个简单的中继:
contract Relay {
address public proxyDeFi;
address owner = msg.sender;
modifier isOwner() {
require(msg.sender == owner, "Forbidden");
_;
}
function update(address newAddress) isOwner public {
proxyDeFi = newAddress;
}
fallback() isOwner external payable {
proxyDeFi.delegatecall(msg.data);
}
}
我试图将proxyDeFi的功能调用到Relay(带有EOA),但是交易在deletegateCall
上被系统地还原。我尝试在proxyDeFi端添加调试,但没有任何输出,我是Solidity的新手,所以肯定有些我不理解的东西。
粗略地讲,我希望proxyDeFi只能被视为中继的库,只是proxyDeFi是另一个已部署的智能合约,因此我们可以对其进行修改而不必重新部署中继。我觉得我想要实现的实际上比这更复杂,或者也许我的方法不是正确/最好的方法。非常感谢您的建议。