Solidity
如何在智能合約中呼叫合約?
我需要命令
solidity
的模擬web3
:const contract = new web3.eth.Contract(contractJSON.abi, deployedAddress)
上下文是:
- 合約 A 呼叫合約 B
- 合約 B 收到合約 A 實例的地址,該實例呼叫合約 B
- 合約 B 通過該地址恢復合約 A 的實例,包括其自定義的內部狀態。
- 合約 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";
從那裡,您可以通過呼叫來呼叫合約 B
ContractB(<0xaddressOfContract>).someFunction
看起來您正在嘗試與另一個 ERC-721 契約中的 ERC-721 契約進行互動。在這種情況下,您已經
ERC721.sol
導入了 OpenZeppelin。你可以簡單地打電話ERC721(<contractAddress>).function
,它會工作。如果您想呼叫該 ERC-721 合約中不是標準 ERC-721 函式的任何函式,那麼您需要導入該實際合約(或其介面)