首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用相同的msg.sender地址从另一个合同调用合同

使用相同的msg.sender地址从另一个合同调用合同
EN

Ethereum用户
提问于 2022-10-18 05:42:54
回答 1查看 153关注 0票数 0

目前主链上有一个已发布的合同(合同A),我必须使用另一个合同.somefunction (合同B)来调用A.somefunction(),但是A.somefunction()已经使用msg.sender引入使用。以下是一些例子

代码语言:javascript
复制
Contract Acoin is ERC20{
    struct Staking {
    uint256 Coin;
    uint256 ArriveCoin;
    uint256 ArriveTime;
    uint256 Time;
    uint256 State; 
    }
    mapping(address => Staking[]) public All_Staking;
    constructor(string memory name, string memory symbol) ERC20(name,symbol){}
    function SearchStaking() public view returns (Staking[] memory) {
        require(All_Staking[msg.sender].length > 0,"Sorry, This account does not have any Token staking");
        return All_Staking[msg.sender];
    }
}

因此,我需要编写B协议来使用msg.sender(调用方不是B契约)调用A合同的SearchStaking并获得AContract.Staking[]数组,如果我使用All_Staking调用,我可以得到一个结果,但没有数组长度。

代码语言:javascript
复制
import "./ACoin.sol";

Contract B is ERC20{
    Acoin public ACoin;
    Acoin.Staking[] private Staking;
    constructor(string memory name, string memory symbol,address _A) ERC20(name,symbol){
    ACoin = Acoin(_A);
    }
    function GetUserAllStaking() public view returns(Acoin.Staking[] memory){
        return ACoin.SearchStaking();    ---->Here should using msg.sender not Contract B address
    }
}
EN

回答 1

Ethereum用户

发布于 2022-10-18 07:43:12

使用委派权

代码语言:javascript
复制
(bool success, bytes memory data) = ACoin.delegatecall(
        abi.encodeWithSignature("SearchStaking()")
);

注意:为了工作,您需要购买的合同A和B将有相同的存储布局。

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

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

复制
相关文章

相似问题

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