Web3js

在 React.js 中,如何從智能合約方法中獲取返回數據,包括事件和發射?

  • March 19, 2022

我有智能合約伺服器功能,該功能包括發射和事件。

event TokenMinted(
       address indexed _recipient, 
       uint256 indexed _tokenId
       );

function mintToken(address to, address[] memory bundle) public {
       // Mint new token
       uint256 tokenId = _tokenIdCounter.current();
       .........
       // Emit TokenMinted event
       emit TokenMinted(to, tokenId);
       // Increase the token counter
       _tokenIdCounter.increment();
   }

不是我要呼叫這個函式,希望得到tokenId。

但是在我的 React 前端程式碼中,我找不到獲取 tokenId 的方法。

export const mintToken = async (contract, to, address) => {
 let tokenId = await contract.mintToken(to, address);
 console.log('contracts', contract)
 // console.log('contract.events', contract.filters.TokenMinted())
 //get the latest blocknumber

 return tokenId;
}

合約是這樣生成的。

new ethers.Contract(ROCI_MINTER_ADDR, ROCI_MINTER_ABI, library.getSigner());

我怎樣才能正確獲得這個值?感謝關注。

那既不是 aview也不是pure函式,因此您可能正在尋找類似的東西(請查看此處的文件):

let tx = await contract.mintToken(to, address).send({from: '0x123123123123'});

let events = tx.receipt.events
console.log(events)

最新的文件說要執行以下操作:

contract.events.TokenMinted().on('data', this.contractEventHandler )

這取決於您擁有的 web3 版本。這是文件。https://web3js.readthedocs.io/en/v1.5.2/web3-eth-contract.html#id50

筆記; 當我嘗試在 contractEventHandler 中本地複制和操作反應狀態變數時遇到錯誤,但是,執行以下操作對我有用setState({tokens:[...this.state.tokens,token]});

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