Solidity

如何在智能合約中呼叫合約?

  • August 9, 2022

我需要命令solidity的模擬web3

const contract = new web3.eth.Contract(contractJSON.abi, deployedAddress)

上下文是:

  1. 合約 A 呼叫合約 B
  2. 合約 B 收到合約 A 實例的地址,該實例呼叫合約 B
  3. 合約 B 通過該地址恢復合約 A 的實例,包括其自定義的內部狀態。
  4. 合約 B 呼叫合約 A 的一些公共函式來達到定義的目的

這是關於oppen zeppelin 論壇的詳細資訊。請注意,由於 abi 是強制性的,我們正在討論契約 A 和契約 B 原始碼都可用的情況。

更新 昨天我正在研究文件樣本:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.2 <0.9.0;

contract InfoFeed {
   function info() public payable returns (uint ret) { return 42; }
}

contract Consumer {
   InfoFeed feed;
   function setFeed(InfoFeed addr) public { feed = addr; }
   function callFeed() public { feed.info{value: 10, gas: 800}(); }
}

沒有calFeed()例外:

[vm]
from: 0xAb8...35cb2
to: Consumer.callInfoPayable() 0x7EF...8CB47
value: 0 wei
data: 0x574...3ed13
logs: 0
hash: 0xbd4...90453

transact to Consumer.callInfoPayable errored: VM error: revert.

revert
   The transaction has been reverted to the initial state.
Note: The called function should be payable if you send value and the value you send should be less than your current balance.
Debug the transaction to get more information.

錯誤消息指出錯誤應付修飾符要求哪個功能已經具有。今天通過將範例剝離到簡單的外部呼叫,我能夠執行呼叫:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract InfoFeed {
   function info() public pure returns (uint) { return 42; }
   function infoPayable() public payable returns (uint) { return 42; }
}
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "./InfoFeed.sol";

contract Consumer {

   InfoFeed feed;

   function setInfoFeed(address addr) public { feed = InfoFeed(addr); }

   function getInfo() public view returns (uint) { return feed.info(); }

}

現在的問題是修復應付功能的契約呼叫。特別是當這個來自官方文件的樣本應該“按原樣”工作時。

在堅實的情況下,它將是這樣的

function bid(address _nft, uint _nftId, uint _startingBid) {
   // ..

   IERC721 nft = IERC721(_nft);
   nft.safeTransferFrom(msg.sender, address(this), _nftId);

   // ..
}

首先你需要在你的目錄中有第二個合約(或它的介面),然後你需要將它導入你的solidity合約

import "ContractB.sol";

從那裡,您可以通過呼叫來呼叫合約 BContractB(<0xaddressOfContract>).someFunction

看起來您正在嘗試與另一個 ERC-721 契約中的 ERC-721 契約進行互動。在這種情況下,您已經ERC721.sol導入了 OpenZeppelin。你可以簡單地打電話ERC721(<contractAddress>).function,它會工作。

如果您想呼叫該 ERC-721 合約中不是標準 ERC-721 函式的任何函式,那麼您需要導入該實際合約(或其介面)

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