История транзакций с токенами ERC20 с узла Ethereum

У меня есть паритетный узел. Поверх него я разработал интерфейс web3.js.

У меня есть API, чья работа заключается в получении балансов адресов и транзакций.

Пример ответа API транзакции:

{ tx_hash: '0xc4a2db4211686f740885ad72ef5d424f5ba6d953d583ef39382e7c1c594ecab7',
  nonce: 0,
  block_hash: '0xf2b173625cf874387302295f408ef0876c04e5778e6ccacec63fe28ff268f9a3',
  block_number: 5955478,
  transaction_index: 184,
  from: '0xAcc7662daDfCE9dA2C0d8ef7867C15A262c762D7',
  to: '0x3495Ffcee09012AB7D827abF3E3b3ae428a38443',
  value: '0',
  time: '1531467099 Fri, 13 Jul 2018 07:31:39 GMT',
  gas_price: '5000000000',
  gas: 37351,
  input: '0xa9059cbb000000000000000000000000c5c813994f9142d11d73b47e1437c81e27b4dae3000000000000000000000000000000000000000000000000b469471f80140000' }

Ключ значения предназначен только для передачи ether/wei.

Для токенов ERC20:

  • Я получаю toадрес и сравниваю его со списком поддерживаемых адресов контрактов erc20.
  • Если есть совпадение, транзакционный вызов заключался в контракте erc20, и он записывался в блокчейн ( contract.send())
  • В этот момент я потерян. Как выяснить, какая функция стандартного контракта ERC20 была вызвана?
  • Как получить, сколько токенов было передано и на какой адрес в этом вызове?

Спасибо, что прочитали мой запрос. Любая помощь будет действительно здорово. Вы можете свободно использовать связанный проект git.

ОБНОВЛЯТЬ

Если мы используем getPastEventsфункцию web3.js и извлекаем все события, то можно выполнить сопоставление со всеми транзакциями, и я смогу каким-то образом выяснить, сколько токенов было доставлено и когда.

Но это будет сложный поток, и он будет осуществляться на основе контракта. Что-нибудь, что может избежать вызова событий и выяснить детали транзакций erc20? что, если контракт не вызывает никакого события?

Если erc20 не регистрирует событие Transfer во время передачи, то это не erc20. Часть спецификации заключается в том, что токен требуется для регистрации этого события, поэтому вы можете быть уверены в его наличии.

Ответы (1)

с помощью ethersjs. Это вернет все журналы передачи для всех токенов в сети.

Под капотом он берет подпись события из ABI, который является первым элементом, необходимым в массиве тем (остальные необязательные аргументы — это индексированные аргументы события).

Затем он выполняет вызов RPC для этих событий на узел, который вы указали при создании поставщика.

При успешном ответе он анализирует полученные данные в шестнадцатеричном кодировании обратно в удобочитаемые данные путем чтения типов из ABI.

const provider = new providers.JsonRpcProvider('http...')
const event = (new Interface(StandardToken.abi)).events.Transfer
const topics = [event.topics[0]]
let logs = await provider.getLogs({
  fromBlock: 1,
  toBlock: 'latest',
  topics: topics
})

logs =  logs.map(log => event.parse(log.topics, log.data))