首页 > 解决方案 > 我如何从 UI 中调用实心发射

问题描述

我这里有这个功能

 function reinvest() onlyDivis public {
        address _customerAddress = msg.sender;
        uint256 _dividends = myDividends(false);
        payoutsTo_[_customerAddress] +=  (int256) (_dividends * magnitude);
        _dividends += referralBalance_[_customerAddress];
        referralBalance_[_customerAddress] = 0;
        uint256 _tokens = purchaseTokens(0x0, _customerAddress, _dividends);
        emit onReinvestment(_customerAddress, _dividends, _tokens);

我可以从我的 UI 调用 reinvest 函数,但是如何使用 emit (函数)以便我可以使用它来更新我的 UI 上的信息?

标签: solidityweb3jsmetamask

解决方案


发出事件实际上是一种非常好的方法,可以稍后搜索一些东西。

太好了,以至于有些人开发了ethql,甚至还有TheGraph

但是,虽然这两个一开始可能看起来有点复杂,但您可以通过使用ethers轻松地做您想做的事情。

这是一个例子

let tx = await contractWithSigner.setValue("I like turtles.");

contract.on("ValueChanged", (author, oldValue, newValue, event) => {
  // Called when anyone changes the value

  console.log(author);
  // "0x14791697260E4c9A71f18484C9f997B308e59325"

  console.log(oldValue);
  // "Hello World"

  console.log(newValue);
  // "Ilike turtles."

  // See Event Emitter below for all properties on Event
  console.log(event.blockNumber);
  // 4115004
});
await tx.wait();

使用以下合约

pragma solidity ^0.4.24;

contract SimpleStorage {

  event ValueChanged(address indexed author, string oldValue, string newValue);

  string _value;

  constructor(string value) public {
    emit ValueChanged(msg.sender, _value, value);
    _value = value;
  }

  function getValue() view public returns (string) {
    return _value;
  }

  function setValue(string value) public {
    emit ValueChanged(msg.sender, _value, value);
    _value = value;
  }
}

推荐阅读