[英]How to get a contract by a transaction uising web3j?
我需要檢查交易是否是 ERC721/ERC1155 交易並獲取接收地址、代幣地址、價值等信息。如果我理解正確,我必須為交易加載合約並檢查它是否繼承 ERC165 以便確認它是 ERC721/ERC1155 交易。
問題:我不明白如何獲得具有交易對象的合同。 我也沒有找到獲取令牌地址的方法。
我在 Infura 上有一個以太坊節點,我從那里讀取塊並迭代事務。 我收到一筆交易及其收據。 我的代碼如下所示:
var tr = web3j.ethGetTransactionByBlockNumberAndIndex(blockIdParam, transactionIndex).sendAsync().get();
var hash = tr.getTransaction().get().getHash();
var receipt = web3.ethGetTransactionReceipt(hash).send().getTransactionReceipt();
現在我的工作方向是閱讀事務日志,檢查它們的主題並驗證它們是否包含Transfer
事件。 但是轉賬事件也是由 ERC20 交易發出的,所以我在這里有點困惑。
檢查Transfer()
事件日志的方向是正確的。 盡管ERC20和ERC721都使用相同的事件簽名,但 ERC721 (NFT) 標准將第三個主題(令牌 ID)定義為indexed
,它將其值存儲在索引主題集中。 而 ERC20 將第 3 個主題(數量)定義為非索引,使索引主題的總長度設置為 2。
我選擇了一個包含 ERC20 和 ERC721 傳輸事件日志的隨機事務。 看起來它背后的邏輯是以 ERC20 代幣的形式支付來鑄造一個新的 ERC721 代幣。
注意:我不是 Java 開發人員,因此我將在回答中使用 JS 代碼,希望您可以將其用作參考,以便在 Web3 庫的 Java 實現中找到正確的語法和方法。
const Web3 = require("web3");
const web3 = new Web3("<provider_url>");
// keccak256 of string "Transfer(address,address,uint256)"
const TRANSFER_SIGNATURE = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
async function run() {
const txHash = "0xfb4dc20b4a8d0b72442a396aced0fc537de757c6aac69609ab3d09d19f9c9aa8";
const txReceipt = await web3.eth.getTransactionReceipt(txHash);
for (let log of txReceipt.logs) {
if (_isERC20Log(log)) {
// Unindexed topics are concatenated in the `data` field.
// There's only one unindexed topic in this case,
// so you don't need to do any parsing and just use the whole value.
const amount = web3.utils.hexToNumberString(log.data);
console.log("ERC20 token amount: ", amount);
console.log("ERC20 token contract: ", log.address);
} else if (_isERC721Log(log)) {
// 3rd indexed topic
// index 0 of the array is the event signature, see `_isERC721Log()`
const tokenId = web3.utils.hexToNumberString(log.topics[3]);
console.log("ERC721 token ID: ", tokenId);
console.log("ERC721 token contract: ", log.address);
}
}
}
function _isERC20Log(log) {
return (
log.topics[0] == TRANSFER_SIGNATURE
&& log.topics.length == 3 // index 0 is the signature, and then 2 indexed topics
);
}
function _isERC721Log(log) {
return (
log.topics[0] == TRANSFER_SIGNATURE
&& log.topics.length == 4 // index 0 is the signature, and then 3 indexed topics
);
}
run();
輸出:
ERC20 token amount: 40000000000000000000
ERC20 token contract: 0x54a7cee7B02976ACE1bdd4aFad87273251Ed34Cf
ERC721 token ID: 12013
ERC721 token contract: 0x41cB4a771FdD019ADBF4685bd4885fbBeedE1784
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.