目前主链上有一个已发布的合同(合同A),我必须使用另一个合同.somefunction (合同B)来调用A.somefunction(),但是A.somefunction()已经使用msg.sender引入使用。以下是一些例子
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调用,我可以得到一个结果,但没有数组长度。
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
}
}发布于 2022-10-18 07:43:12
使用委派权。
(bool success, bytes memory data) = ACoin.delegatecall(
abi.encodeWithSignature("SearchStaking()")
);注意:为了工作,您需要购买的合同A和B将有相同的存储布局。
https://ethereum.stackexchange.com/questions/137682
复制相似问题