Contract-Invocation
從另一個可升級的代理智能合約呼叫函式
我有 2 個不同的 NFT 集合。它們都是 transparentUpgradableProxy 智能合約。在將它們升級到 transparentUpgradableProxy 之前,我曾經呼叫過這樣的另一個函式。
function mint(uint256 tokenId) public payable { IERC721 token = IERC721(mainContractAddress); uint256 ownedAmount = token.balanceOf(msg.sender); require((ownedAmount / requiredNftAmountFirstStage) - claimedAmountFirstStage[msg.sender] > 0, "You are not eligible for free NFT!"); require(ownerOf(tokenId) == address(0), "NFT already claimed!"); _safeMint(msg.sender, tokenId); claimedAmountFirstStage[msg.sender] += 1; }
將其更改為 transparentUpgradableProxy 後,我嘗試這樣做:
IERC721Upgradeable token = IERC721Upgradeable(mainContractAddress); uint256 ownedAmount = token.balanceOf(msg.sender);
我猜這不是它的工作原理。如何訪問另一個可升級的智能合約功能?
謝謝!
編輯1:我不能使用delegatecall,因為它說它不安全。我的兩個智能合約都是可升級代理。我試著做它會呼叫,它返回布爾和字節。
IERC721Upgradeable token = IERC721Upgradeable(mainContractAddress); (bool success, bytes memory result) = address(token).call(abi.encodeWithSignature("balanceOf(address)", msg.sender)); require(success); uint256 ownedAmount = toUint256(result);
仍然無法正常工作:(我的另一個問題是,我需要從代理智能合約中呼叫該函式嗎?
(bool success, bytes memory result) = address(mainContractAddress).call(abi.encodeWithSignature("balanceOf(address)", msg.sender)); require(success, "Failed to get balance..."); uint256 ownedAmount = toUint256(result);
由於安全問題,無法使用 Delegatecall,但通話效果很好。我從我的第二個邏輯合約呼叫它到主代理地址。它返回布爾值和字節。一些庫可以將字節轉換為 uint。
您可以使用帶有函式簽名的編碼的 delegatecall():
uint256 ownedAmount = token.delegatecall(abi.encodeWithSignature("balanceOf(address)", msg.sender)