Contract-Invocation

從另一個可升級的代理智能合約呼叫函式

  • February 4, 2022

我有 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)

引用自:https://ethereum.stackexchange.com/questions/120665