diff options
author | Fabio Berger <me@fabioberger.com> | 2018-12-19 22:16:35 +0800 |
---|---|---|
committer | Fabio Berger <me@fabioberger.com> | 2018-12-19 22:16:35 +0800 |
commit | 293dadc22aedcaf540f2dc17c8c38087e7ace037 (patch) | |
tree | 79f624ab03071a28da83c7bf542acfe0dd7af8cb /packages/pipeline/src/scripts/pull_erc20_events.ts | |
parent | ddf3bb7c0446f2d85b6fa55cbe0b00b227f08af7 (diff) | |
parent | 040b402b6d558d13f2f4e032297b6723cdf2aafe (diff) | |
download | dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.tar dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.tar.gz dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.tar.bz2 dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.tar.lz dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.tar.xz dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.tar.zst dexon-sol-tools-293dadc22aedcaf540f2dc17c8c38087e7ace037.zip |
Merge branch 'development' into website/addPySRA
* development: (141 commits)
Add missing CHANGELOG entry for OrderWatcher WS interface
Bump up stale to close to 30 days
Move onMessageAsync outside of tests and add comments
Fix WS tests to remove race-condition and be more specific about the message expected
Add temporary console.log to test failing on CI
Make @0x/contracts-test-utils a dependency instead of a devDependency
Fix test-publish failure in contracts packages
Fixed solhint errors
Added documentation to `LibAddressArray.append` and switched `if` to `require` smt
Updated changelogs for new contracts
Added `gas` field so tests pass on Geth;
Added Changelog for new Extensions
Updated comment `Execute fillOrder` -> `Execute exchange function`
Explicit returns
Prettier / Linter on contracts + TS
Refactoring balance threshold filter
Moved exchange calldata functions to separate mixin
Less Assembly. More Solidity. Less Efficiency. More Readability.
Run all tests for extensions
Cleaned up tests for balance threshold filter
...
Diffstat (limited to 'packages/pipeline/src/scripts/pull_erc20_events.ts')
-rw-r--r-- | packages/pipeline/src/scripts/pull_erc20_events.ts | 68 |
1 files changed, 49 insertions, 19 deletions
diff --git a/packages/pipeline/src/scripts/pull_erc20_events.ts b/packages/pipeline/src/scripts/pull_erc20_events.ts index 0ad12c97a..bd520c610 100644 --- a/packages/pipeline/src/scripts/pull_erc20_events.ts +++ b/packages/pipeline/src/scripts/pull_erc20_events.ts @@ -1,10 +1,10 @@ -// tslint:disable:no-console import { getContractAddressesForNetworkOrThrow } from '@0x/contract-addresses'; import { web3Factory } from '@0x/dev-utils'; import { Web3ProviderEngine } from '@0x/subproviders'; +import { logUtils } from '@0x/utils'; import { Web3Wrapper } from '@0x/web3-wrapper'; import 'reflect-metadata'; -import { Connection, ConnectionOptions, createConnection, Repository } from 'typeorm'; +import { Connection, ConnectionOptions, createConnection } from 'typeorm'; import { ERC20EventsSource } from '../data_sources/contract-wrappers/erc20_events'; import { ERC20ApprovalEvent } from '../entities'; @@ -16,33 +16,63 @@ const NETWORK_ID = 1; const START_BLOCK_OFFSET = 100; // Number of blocks before the last known block to consider when updating fill events. const BATCH_SAVE_SIZE = 1000; // Number of events to save at once. const BLOCK_FINALITY_THRESHOLD = 10; // When to consider blocks as final. Used to compute default endBlock. -const WETH_START_BLOCK = 4719568; // Block number when the WETH contract was deployed. let connection: Connection; +interface Token { + // name is used for logging only. + name: string; + address: string; + defaultStartBlock: number; +} + +const tokensToGetApprovalEvents: Token[] = [ + { + name: 'WETH', + address: getContractAddressesForNetworkOrThrow(NETWORK_ID).etherToken, + defaultStartBlock: 4719568, // Block when the WETH contract was deployed. + }, + { + name: 'ZRX', + address: getContractAddressesForNetworkOrThrow(NETWORK_ID).zrxToken, + defaultStartBlock: 4145415, // Block when the ZRX contract was deployed. + }, + { + name: 'DAI', + address: '0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', + defaultStartBlock: 4752008, // Block when the DAI contract was deployed. + }, +]; + (async () => { connection = await createConnection(ormConfig as ConnectionOptions); const provider = web3Factory.getRpcProvider({ rpcUrl: INFURA_ROOT_URL, }); const endBlock = await calculateEndBlockAsync(provider); - await getAndSaveWETHApprovalEventsAsync(provider, endBlock); + for (const token of tokensToGetApprovalEvents) { + await getAndSaveApprovalEventsAsync(provider, token, endBlock); + } process.exit(0); })().catch(handleError); -async function getAndSaveWETHApprovalEventsAsync(provider: Web3ProviderEngine, endBlock: number): Promise<void> { - console.log('Checking existing approval events...'); +async function getAndSaveApprovalEventsAsync( + provider: Web3ProviderEngine, + token: Token, + endBlock: number, +): Promise<void> { + logUtils.log(`Getting approval events for ${token.name}...`); + logUtils.log('Checking existing approval events...'); const repository = connection.getRepository(ERC20ApprovalEvent); - const startBlock = (await getStartBlockAsync(repository)) || WETH_START_BLOCK; + const startBlock = (await getStartBlockAsync(token)) || token.defaultStartBlock; - console.log(`Getting WETH approval events starting at ${startBlock}...`); - const wethTokenAddress = getContractAddressesForNetworkOrThrow(NETWORK_ID).etherToken; - const eventsSource = new ERC20EventsSource(provider, NETWORK_ID, wethTokenAddress); + logUtils.log(`Getting approval events starting at ${startBlock}...`); + const eventsSource = new ERC20EventsSource(provider, NETWORK_ID, token.address); const eventLogs = await eventsSource.getApprovalEventsAsync(startBlock, endBlock); - console.log(`Parsing ${eventLogs.length} WETH approval events...`); + logUtils.log(`Parsing ${eventLogs.length} approval events...`); const events = parseERC20ApprovalEvents(eventLogs); - console.log(`Retrieved and parsed ${events.length} total WETH approval events.`); + logUtils.log(`Retrieved and parsed ${events.length} total approval events.`); await repository.save(events, { chunk: Math.ceil(events.length / BATCH_SAVE_SIZE) }); } @@ -52,15 +82,15 @@ async function calculateEndBlockAsync(provider: Web3ProviderEngine): Promise<num return currentBlock - BLOCK_FINALITY_THRESHOLD; } -async function getStartBlockAsync(repository: Repository<ERC20ApprovalEvent>): Promise<number | null> { - const fillEventCount = await repository.count(); - if (fillEventCount === 0) { - console.log(`No existing approval events found.`); - return null; - } +async function getStartBlockAsync(token: Token): Promise<number | null> { const queryResult = await connection.query( - `SELECT block_number FROM raw.erc20_approval_events ORDER BY block_number DESC LIMIT 1`, + `SELECT block_number FROM raw.erc20_approval_events WHERE token_address = $1 ORDER BY block_number DESC LIMIT 1`, + [token.address], ); + if (queryResult.length === 0) { + logUtils.log(`No existing approval events found for ${token.name}.`); + return null; + } const lastKnownBlock = queryResult[0].block_number; return lastKnownBlock - START_BLOCK_OFFSET; } |