这是如何在事务中识别令牌传输?的后续报道。
我有一个事务,它会导致令牌的转移。
From PancakeSwap: Router v2
To 0xd423fde466315d45fb0da457df28d5eeb92be580
For 0.005 ($2.97) Wrapped BNB (WBNB)
From 0xd423fde466315d45fb0da457df28d5eeb92be580
To 0xb54eb0cc6457e9d74e20672d8961fad3cde4511c
For 0.154823285118196657 ($2.94) Bogged Finan... (BOG)
我可以使用getTransactionReceipt
访问事务日志。
{
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
blockNumber: 7460735,
contractAddress: null,
cumulativeGasUsed: '39606975',
from: '0xb54eb0cc6457e9d74e20672d8961fad3cde4511c',
gasUsed: '292724',
logs: [
{
address: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
topics: [
'0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e'
],
data: '0x0000000000000000000000000000000000000000000000000011c37937e08000',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1007,
removed: false,
id: 'log_9d934f9a'
},
{
address: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e',
'0x000000000000000000000000d423fde466315d45fb0da457df28d5eeb92be580'
],
data: '0x0000000000000000000000000000000000000000000000000011c37937e08000',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1008,
removed: false,
id: 'log_f759d019'
},
{
address: '0xD7B729ef857Aa773f47D37088A1181bB3fbF0099',
topics: [
'0x63be20cc905d5ba0cf65db405c4999f99f2575e521875f13a8009d6eed7a09d9'
],
data: '0x000000000000000000000000d423fde466315d45fb0da457df28d5eeb92be580000000000000000000000000000000000000000000000000000aa739b8dd5525',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1009,
removed: false,
id: 'log_e07c5a40'
},
{
address: '0xD7B729ef857Aa773f47D37088A1181bB3fbF0099',
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x000000000000000000000000d423fde466315d45fb0da457df28d5eeb92be580',
'0x000000000000000000000000b54eb0cc6457e9d74e20672d8961fad3cde4511c'
],
data: '0x00000000000000000000000000000000000000000000000002260af5206ddbb1',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1010,
removed: false,
id: 'log_4051d23e'
},
{
address: '0xD423fDe466315D45fB0da457dF28D5EEB92be580',
topics: [
'0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1'
],
data: '0x0000000000000000000000000000000000000000000000257558ffc7c1bb7c9d0000000000000000000000000000000000000000000004a14e4339975756b2ea',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1011,
removed: false,
id: 'log_382fd81b'
},
{
address: '0xD423fDe466315D45fB0da457dF28D5EEB92be580',
topics: [
'0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e',
'0x000000000000000000000000b54eb0cc6457e9d74e20672d8961fad3cde4511c'
],
data: '0x0000000000000000000000000000000000000000000000000011c37937e08000000000000000000000000000000000000000000000000000000aa739b8dd552600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000230b22ed94b30d7',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1012,
removed: false,
id: 'log_abf4a762'
}
],
logsBloom: '0x002002000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000401000000000008000080000002000000000000000000004000080000000100000000000000002000000000000000000000000000000000000100000000000000000000000000040000000000000002400010000000800000040000000000000000c0000000000000000020000000000000000000400000000000000000000000002000000000000000000020080000000000000001000000000000080000080000000000000020000000000000000000000000000400000000000000000',
status: true,
to: '0x10ed43c718714eb63d5aa57b78b54704e256024e',
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265
}
事实上,事件是不可读的;我需要对它们进行解码,据我所知,我应该使用web3js web3.eth.abi.decodeLog(inputs, hexString, topics)
。但是,我不清楚如何获得inputs
值。
据我所知,产生事件的必须是合同的ABI,例如,在发生事件时:
{
address: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
topics: [
'0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e'
],
data: '0x0000000000000000000000000000000000000000000000000011c37937e08000',
blockNumber: 7460735,
transactionHash: '0xcf95271d63836f17c0c3a7beda7df2ea7029ce9161dc6808da86f5f9ce740830',
transactionIndex: 265,
blockHash: '0x7a3e03a2eaaf39ba85e5513205545d2509c24e8a58f03bb77d82f136f7028697',
logIndex: 1007,
removed: false,
id: 'log_9d934f9a'
}
我需要得到合同0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c的ABI。
我试过:
web3.eth.abi.decodeLog(
abi,
'0x0000000000000000000000000000000000000000000000000011c37937e08000',
[
'0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e',
],
);
但是,这产生了错误:
错误:无效类型(argument=" type ",value="_factory",code=INVALID_ARGUMENT,version=abi/5.0.7)
似乎我提供了错误的价值。
我怎么知道我用什么ABI来解码这个日志呢?
发布于 2021-05-16 17:22:07
这不是一个完整的答案,但这是我到目前为止所得到的。
如果您查看契约0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
代码,它看起来就像实现了BEP20 20接口。我不知道如何以编程方式确定这一点,但情况似乎是这样的。
我查找了BEP20 ABI并使用它构造了web3.eth.Contract
。
const contract = new web3.eth.Contract(bep20, '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c');
然后提取描述事件的ABI令牌:
const knownEventTokens = contract.options.jsonInterface.filter((token) => {
return token.type === 'event';
});
如果您研究knownEventTokens
的值,则令牌现在具有一个signature
属性:
[
{
anonymous: false,
inputs: [
{ indexed: true, name: 'owner', type: 'address' },
{ indexed: true, name: 'spender', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Approval',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925'
},
{
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{ indexed: true, name: 'to', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Transfer',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
}
]
据我所知,只要签名与日志事件中的第一个主题匹配,那么inputs
就可以用于解码日志事件值。
const events = [
{
address: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
blockHash: '0xbeecdeddd358fca1df274a2545ce5b55cf1938faa377b11c0f78c638d4734868',
blockNumber: 7_463_306,
data: '0x000000000000000000000000000000000000000000000000002386f26fc10000',
id: 'log_041e02ed',
logIndex: 143,
removed: false,
topics: [
'0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e',
],
transactionHash: '0xea00edb3e568701901b56c37c4b185be66dd5bc6398cf3f9298e8542091421f1',
transactionIndex: 53,
},
{
address: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
blockHash: '0xbeecdeddd358fca1df274a2545ce5b55cf1938faa377b11c0f78c638d4734868',
blockNumber: 7_463_306,
data: '0x000000000000000000000000000000000000000000000000002386f26fc10000',
id: 'log_cdebb74e',
logIndex: 144,
removed: false,
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e',
'0x000000000000000000000000ed726e312afd8f856ab96170fd7225c8cb731f05',
],
transactionHash: '0xea00edb3e568701901b56c37c4b185be66dd5bc6398cf3f9298e8542091421f1',
transactionIndex: 53,
},
{
address: '0xA528Ed9059e3D418324371C011b7bff8a1c838EB',
blockHash: '0xbeecdeddd358fca1df274a2545ce5b55cf1938faa377b11c0f78c638d4734868',
blockNumber: 7_463_306,
data: '0x0000000000000000000000000000000000000000000000de45e400f02a502361',
id: 'log_b6e3762a',
logIndex: 145,
removed: false,
topics: [
'0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
'0x000000000000000000000000ed726e312afd8f856ab96170fd7225c8cb731f05',
'0x0000000000000000000000008e622e3c0c46b20e96ce61e3ce0180fd2fb5baa2',
],
transactionHash: '0xea00edb3e568701901b56c37c4b185be66dd5bc6398cf3f9298e8542091421f1',
transactionIndex: 53,
},
{
address: '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
blockHash: '0xbeecdeddd358fca1df274a2545ce5b55cf1938faa377b11c0f78c638d4734868',
blockNumber: 7_463_306,
data: '0x00000000000000000000000000000000000000000000ca2de3365dab3b230ce40000000000000000000000000000000000000000000000001d24b2dfac520000',
id: 'log_5e101161',
logIndex: 146,
removed: false,
topics: [
'0x1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1',
],
transactionHash: '0xea00edb3e568701901b56c37c4b185be66dd5bc6398cf3f9298e8542091421f1',
transactionIndex: 53,
},
{
address: '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
blockHash: '0xbeecdeddd358fca1df274a2545ce5b55cf1938faa377b11c0f78c638d4734868',
blockNumber: 7_463_306,
data: '0x00000000000000000000000000000000000000000000000bca378b643e734cc5000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000f6f852abb584590add0000000000000000000000000000000000000000000000000000000000000000',
id: 'log_1b3a7700',
logIndex: 147,
removed: false,
topics: [
'0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822',
'0x00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e',
'0x0000000000000000000000008e622e3c0c46b20e96ce61e3ce0180fd2fb5baa2',
],
transactionHash: '0xea00edb3e568701901b56c37c4b185be66dd5bc6398cf3f9298e8542091421f1',
transactionIndex: 53,
},
];
for (const event of events) {
const eventToken = knownEventTokens.find((knownEventToken) => {
return knownEventToken.signature === event.topics[0];
});
if (!eventToken) {
console.log('cannot process log %d', event.logIndex);
continue;
}
console.log({
eventToken,
values: web3.eth.abi.decodeLog(
eventToken.inputs,
event.data,
event.topics.slice(1),
),
});
}
这意味着:
cannot process log 143
{
eventToken: {
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{ indexed: true, name: 'to', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Transfer',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
},
values: Result {
'0': '0x10ED43C718714eb63d5aA57B78B54704E256024E',
'1': '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
'2': '10000000000000000',
__length__: 3,
from: '0x10ED43C718714eb63d5aA57B78B54704E256024E',
to: '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
value: '10000000000000000'
}
}
{
eventToken: {
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{ indexed: true, name: 'to', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Transfer',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
},
values: Result {
'0': '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
'1': '0x8e622e3c0c46B20e96cE61E3Ce0180Fd2fb5bAA2',
'2': '4100213335678329561953',
__length__: 3,
from: '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
to: '0x8e622e3c0c46B20e96cE61E3Ce0180Fd2fb5bAA2',
value: '4100213335678329561953'
}
}
cannot process log 146
cannot process log 147
https://quiet-black-snowflake.bsc.quiknode.pro/3650b4c6695bbc00b5aaf2bbc6bf794e447538a2/
(node:75758) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
(Use `node --trace-warnings ...` to show where the warning was created)
^[[A^C
gke_applaudience_europe-west4-c_juice-boost (dxcoin) in dxcoin-api on master [$✘!+?] took 6m31s
12:18:41 ➜ babel-node src/bin/test.js | roarr
[
{
anonymous: false,
inputs: [
{ indexed: true, name: 'owner', type: 'address' },
{ indexed: true, name: 'spender', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Approval',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925'
},
{
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{ indexed: true, name: 'to', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Transfer',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
}
]
cannot process log 143
{
eventToken: {
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{ indexed: true, name: 'to', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Transfer',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
},
values: Result {
'0': '0x10ED43C718714eb63d5aA57B78B54704E256024E',
'1': '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
'2': '10000000000000000',
__length__: 3,
from: '0x10ED43C718714eb63d5aA57B78B54704E256024E',
to: '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
value: '10000000000000000'
}
}
{
eventToken: {
anonymous: false,
inputs: [
{ indexed: true, name: 'from', type: 'address' },
{ indexed: true, name: 'to', type: 'address' },
{ indexed: false, name: 'value', type: 'uint256' }
],
name: 'Transfer',
type: 'event',
constant: undefined,
payable: undefined,
signature: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
},
values: Result {
'0': '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
'1': '0x8e622e3c0c46B20e96cE61E3Ce0180Fd2fb5bAA2',
'2': '4100213335678329561953',
__length__: 3,
from: '0xeD726e312AfD8f856AB96170fd7225c8cb731f05',
to: '0x8e622e3c0c46B20e96cE61E3Ce0180Fd2fb5bAA2',
value: '4100213335678329561953'
}
}
这对于我的用例来说已经足够好了。不过,我不明白如何:
https://ethereum.stackexchange.com/questions/99071
复制相似问题