是否有可能監聽 MakerDAO 的 LogNote 事件?
我想知道是否有可能監聽 MakerDAO 的 LogNote 事件,就像我們能夠處理標準事件一樣。
我設法研究的內容:
我看到LogNote 被列為契約詳細資訊中的事件
let contractIntanse = await new web3.eth.Contract(abi, contractAddress); console.log("contractIntanse.events: ", contractIntanse.events) contractIntanse.events: { Approval: [Function: bound ], '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925': [Function: bound ], 'Approval(address,address,uint256)': [Function: bound ], LogNote: [Function: bound ], '0xd3d8bec38a91a5f4411247483bc030a174e77cda9c0351924c759f41453aa5e8': [Function: bound ], 'LogNote(bytes4,address,bytes32,bytes32,bytes)': [Function: bound ], Transfer: [Function: bound ], '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef': [Function: bound ], 'Transfer(address,address,uint256)': [Function: bound ], allEvents: [Function: bound ] }
但是,我無法正確檢查,例如:
1. event.watch對我不起作用,因為 web3 v1
2.我嘗試使用WebsocketProvider
web3.eth.subscribe("logs", { address: "0x23..." }, function(error, result) { console.log("subscribe result:",result); console.log("subscribe error:",error); }) .on("connected", function(subscriptionId) { console.log("subscriptionId:" + subscriptionId); }) .on("data", function(log) { console.log("data:" + log); }) .on("changed", function(log) { console.log("changed:" + log); });
但是,當我觸發事件時,我看不到 smth
await contractIntanse.methods.rely(address1);
這是我設法找到的相關問題 https://github.com/ethereum/web3.js/issues/1752
3.我也嘗試使用getPastEvents,正如最新
issues/1752
建議的那樣const eventOptions = { filter: {}, fromBlock: 0, toBlock: 'latest' }; const events = await contractIntanse.getPastEvents('LogNote', eventOptions);
它適用於標準事件。但是,對於LogNote ,我得到一個錯誤:
Error: overflow (operation="setValue", fault="overflow", details="Number can only safely store up to 53 bits")
最後,我很困惑,我們能不能聽 MakerDAO 的 LogNote?感謝任何幫助,連結到文件,討論等。謝謝!
額外的:
我正在使用 DAI 合約 https://etherscan.io/address/0x6b175474e89094c44da98b954eedeac495271d0f#contracts
這是用於在主網上部署的送出。我用作基礎。 https://github.com/makerdao/dss/blob/6fa55812a5fcfcfa325ad4d9a4d0ca4033c38cab/src/dai.sol
LogNote 取自 LibNote。這是我想听的。 https://github.com/makerdao/dss/blob/6fa55812a5fcfcfa325ad4d9a4d0ca4033c38cab/src/lib.sol
因為
LogNote
是匿名事件,所以它更便宜,但另一方面,您無法使用主題對其進行過濾。有關更多詳細資訊,請參閱此已回答的問題。無論如何,您可以監聽所有合約事件,然後在 Javascript 中進行過濾。DAI實際上只有 3 種類型的事件:
Transfer
和Approval
- 帶有 3 個參數 - 和LogNote
- 帶有 4 個參數。LogNote
僅由rely
anddeny
函式觸發,因此您可以使用下面的程式碼來監聽這些事件:const Web3 = require("web3"); const web3 = new Web3("ws://localhost:8546"); web3.eth.subscribe("logs", { address: "0x731830527c286469E89b5e43030C1fA3D9d78f03" }, function (error, result) { if (error) { console.error("subscribe error:", error); return; } if (result.topics.length == 4) { // This is a `rely` or `deny` event let signature = result.topics[0]; let sender = result.topics[1]; let arg1 = result.topics[2]; let arg2 = result.topics[3]; //this is always 0x0 } }) .on("connected", function (subscriptionId) { console.log("subscriptionId:" + subscriptionId); });
請注意,您無法區分
rely
或deny
僅查看日誌,但您必須檢查原始事務有效負載。