Невозможно экспортировать в csv все события передачи определенного контракта на Ethplorer.io

Я могу использовать функцию «Экспорт в CSV», но она дает мне только 1000 последних событий. Любые предложения о том, как получить ВСЕ (2100+) событий в файле csv?

https://ethplorer.io/address/0x2c2391f793f4f81475d87fffe366458ce5380a13#

Ответы (4)

Вместо этого используйте etherscan.ion .

Вот ссылка на адрес, который вы ищете: https://etherscan.io/txs?a=0x2c2391f793f4f81475d87fffe366458ce5380a13

Там вы можете найти все транзакции - 4856 на данный момент. Вы можете парсить все транзакции (если это устраивает etherscan.io) или проверять API, которые они предлагают .

Вот руководство о том, как экспортировать данные Ethereum в csv https://medium.com/@medvedev1088/exporting-and-analyzing-ethereum-blockchain-f5353414a94e .

Он использует https://github.com/medvedev1088/ethereum-etl , который выводит данные в файлы blocks.csv, transactions.csv, erc20_transfers.csv.

blocks.csv

Column                  | Type               |
------------------------|---------------------
block_number            | bigint             |
block_hash              | hex_string         |
block_parent_hash       | hex_string         |
block_nonce             | hex_string         |
block_sha3_uncles       | hex_string         |
block_logs_bloom        | hex_string         |
block_transactions_root | hex_string         |
block_state_root        | hex_string         |
block_miner             | hex_string         |
block_difficulty        | bigint             |
block_total_difficulty  | bigint             |
block_size              | bigint             |
block_extra_data        | hex_string         |
block_gas_limit         | bigint             |
block_gas_used          | bigint             |
block_timestamp         | bigint             |
block_transaction_count | bigint             |

transactions.csv

Column              |    Type     |
--------------------|--------------
tx_hash             | hex_string  |
tx_nonce            | bigint      |
tx_block_hash       | hex_string  |
tx_block_number     | bigint      |
tx_index            | bigint      |
tx_from             | hex_string  |
tx_to               | hex_string  |
tx_value            | bigint      |
tx_gas              | bigint      |
tx_gas_price        | bigint      |
tx_input            | hex_string  |

erc20_transfers.csv

Column              |    Type     |
--------------------|--------------
erc20_token         | hex_string  |
erc20_from          | hex_string  |
erc20_to            | hex_string  |
erc20_value         | bigint      |
erc20_tx_hash       | hex_string  |
erc20_block_number  | bigint      |

BlockScout.com предоставляет возможность экспортировать транзакции по каждому адресу в CSV (до 10 тыс. транзакций).

Посмотрите, например, внизу страницы https://blockscout.com/eth/mainnet/address/0x2c2391f793f4f81475d87fffe366458ce5380a13/transactions . Кнопка "Скачать CSV" есть.

введите описание изображения здесь

Вы можете сделать это довольно легко, используя ключ API Alchemy.com для доступа к архивным данным через их узлы.

Настройте соединение с их RPC, используя что-то вроде эфира, вот демонстрация кода:

const { AlchemyProvider } = require("@ethersproject/providers");
const { Contract } = require("@ethersproject/contracts");

// I'm just including the Transfer event in the ABI since that is all you want to query at the moment
const ABI = [
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "tokenId",
        "type": "uint256"
      },
    ],
    "name": "Transfer",
    "type": "event"
  }
]

const demo =  async () => {
  let alchemyApiKey = 'YOUR_ALCHEMY_API_KEY'
  let tokenContractAddress = '0x2c2391f793f4f81475d87fffe366458ce5380a13';
  let provider = AlchemyProvider.getWebSocketProvider(null, alchemyApiKey) // you could also use "homestead" instead of null (it defaults to homestead/mainnet)
  let contract = await new Contract(tokenContractAddress, ABI, provider);
  let events = [];
  let blocksPerBatch = 100000; // I just picked this because it seemed like a reasonable batch size
  let lastCheckedBlock = 5668829; // could set this to zero but I looked at where the first tx was on Etherscan and just set it to the previous block so we don't check all the blocks before it where the contract didn't exist yet
  let latestBlockNumber = await provider.getBlockNumber();
  let batchCount = Math.ceil(latestBlockNumber / blocksPerBatch);
  console.log({batchCount})
  for(let i = 0; i < batchCount; i++) {
    let toBlock = i === (batchCount - 1) ? latestBlockNumber : lastCheckedBlock + blocksPerBatch;
    let eventBatch = await contract.queryFilter('Transfer', lastCheckedBlock, toBlock);
    console.log(`Fetched ${eventBatch.length} events in batch #${i + 1}`);
    events = [...events, ...eventBatch];
    lastCheckedBlock = toBlock;
  }
  // At this point you should have all of the events
  console.log({events});
}

demo();