Implement scraping and parsing exchange CancelUpTo events
This commit is contained in:
committed by
Fred Carlsen
parent
dc04d025af
commit
1ae3592e45
@@ -1,18 +1,24 @@
|
||||
import { ExchangeCancelEventArgs, ExchangeEventArgs, ExchangeFillEventArgs } from '@0xproject/contract-wrappers';
|
||||
import {
|
||||
ExchangeCancelEventArgs,
|
||||
ExchangeCancelUpToEventArgs,
|
||||
ExchangeEventArgs,
|
||||
ExchangeFillEventArgs,
|
||||
} from '@0xproject/contract-wrappers';
|
||||
import { assetDataUtils } from '@0xproject/order-utils';
|
||||
import { AssetProxyId, ERC721AssetData } from '@0xproject/types';
|
||||
import { BigNumber } from '@0xproject/utils';
|
||||
import { LogEntry, LogWithDecodedArgs } from 'ethereum-types';
|
||||
import { LogWithDecodedArgs } from 'ethereum-types';
|
||||
import * as R from 'ramda';
|
||||
|
||||
import { artifacts } from '../../artifacts';
|
||||
import { EventsResponse } from '../../data_sources/etherscan';
|
||||
import { ExchangeCancelEvent } from '../../entities/ExchangeCancelEvent';
|
||||
import { ExchangeCancelUpToEvent } from '../../entities/ExchangeCancelUpToEvent';
|
||||
import { ExchangeFillEvent } from '../../entities/ExchangeFillEvent';
|
||||
|
||||
import { convertResponseToLogEntry, decodeLogEntry } from './event_utils';
|
||||
|
||||
export type ExchangeEventEntity = ExchangeFillEvent | ExchangeCancelEvent;
|
||||
export type ExchangeEventEntity = ExchangeFillEvent | ExchangeCancelEvent | ExchangeCancelUpToEvent;
|
||||
|
||||
const exchangeContractAbi = artifacts.Exchange.compilerOutput.abi;
|
||||
|
||||
@@ -27,7 +33,7 @@ export function parseExchangeEvents(rawEventsResponse: EventsResponse): Exchange
|
||||
}
|
||||
|
||||
export function shouldIncludeLogEntry(logEntry: LogWithDecodedArgs<ExchangeEventArgs>): boolean {
|
||||
if (!R.contains(logEntry.event, ['Fill', 'Cancel'])) {
|
||||
if (!R.contains(logEntry.event, ['Fill', 'Cancel', 'CancelUpTo'])) {
|
||||
return false;
|
||||
} else if (logEntry.logIndex == null || isNaN(logEntry.logIndex)) {
|
||||
return false;
|
||||
@@ -41,6 +47,8 @@ export function _convertToEntity(eventLog: LogWithDecodedArgs<ExchangeEventArgs>
|
||||
return _convertToExchangeFillEvent(eventLog as LogWithDecodedArgs<ExchangeFillEventArgs>);
|
||||
case 'Cancel':
|
||||
return _convertToExchangeCancelEvent(eventLog as LogWithDecodedArgs<ExchangeCancelEventArgs>);
|
||||
case 'CancelUpTo':
|
||||
return _convertToExchangeCancelUpToEvent(eventLog as LogWithDecodedArgs<ExchangeCancelUpToEventArgs>);
|
||||
default:
|
||||
throw new Error('unexpected eventLog.event type: ' + eventLog.event);
|
||||
}
|
||||
@@ -109,6 +117,20 @@ export function _convertToExchangeCancelEvent(
|
||||
return exchangeCancelEvent;
|
||||
}
|
||||
|
||||
export function _convertToExchangeCancelUpToEvent(
|
||||
eventLog: LogWithDecodedArgs<ExchangeCancelUpToEventArgs>,
|
||||
): ExchangeCancelUpToEvent {
|
||||
const exchangeCancelUpToEvent = new ExchangeCancelUpToEvent();
|
||||
exchangeCancelUpToEvent.logIndex = eventLog.logIndex as number;
|
||||
exchangeCancelUpToEvent.address = eventLog.address as string;
|
||||
exchangeCancelUpToEvent.rawData = eventLog.data as string;
|
||||
exchangeCancelUpToEvent.blockNumber = eventLog.blockNumber as number;
|
||||
exchangeCancelUpToEvent.makerAddress = eventLog.args.makerAddress.toString();
|
||||
exchangeCancelUpToEvent.senderAddress = eventLog.args.senderAddress.toString();
|
||||
exchangeCancelUpToEvent.orderEpoch = eventLog.args.orderEpoch.toString();
|
||||
return exchangeCancelUpToEvent;
|
||||
}
|
||||
|
||||
function bigNumbertoStringOrNull(n: BigNumber): string | null {
|
||||
if (n == null) {
|
||||
return null;
|
||||
|
||||
15
packages/pipeline/src/entities/ExchangeCancelUpToEvent.ts
Normal file
15
packages/pipeline/src/entities/ExchangeCancelUpToEvent.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm';
|
||||
|
||||
@Entity()
|
||||
export class ExchangeCancelUpToEvent extends BaseEntity {
|
||||
@PrimaryColumn() public logIndex!: number;
|
||||
@PrimaryColumn() public blockNumber!: number;
|
||||
|
||||
@Column() public address!: string;
|
||||
@Column() public rawData!: string;
|
||||
|
||||
@Column() public makerAddress!: string;
|
||||
@Column() public senderAddress!: string;
|
||||
@Column() public orderEpoch!: string;
|
||||
// TODO(albrow): Include topics?
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import { createConnection } from 'typeorm';
|
||||
import { Etherscan } from './data_sources/etherscan';
|
||||
import { parseExchangeEvents } from './data_types/events/exchange_events';
|
||||
import { ExchangeCancelEvent } from './entities/ExchangeCancelEvent';
|
||||
import { ExchangeCancelUpToEvent } from './entities/ExchangeCancelUpToEvent';
|
||||
import { ExchangeFillEvent } from './entities/ExchangeFillEvent';
|
||||
import { config } from './ormconfig';
|
||||
|
||||
@@ -15,14 +16,12 @@ const EXCHANGE_ADDRESS = '0x4f833a24e1f95d70f028921e27040ca56e09ab0b';
|
||||
const connection = await createConnection(config);
|
||||
const fillRepository = connection.getRepository(ExchangeFillEvent);
|
||||
const cancelRepository = connection.getRepository(ExchangeCancelEvent);
|
||||
console.log(`found ${await fillRepository.count()} existing fill events`);
|
||||
console.log(`found ${await cancelRepository.count()} existing cancel events`);
|
||||
const cancelUpToRepository = connection.getRepository(ExchangeCancelUpToEvent);
|
||||
console.log(`found ${(await fillRepository.count()) + (await cancelRepository.count())} existing events`);
|
||||
const rawEvents = await etherscan.getContractEventsAsync(EXCHANGE_ADDRESS);
|
||||
const events = parseExchangeEvents(rawEvents);
|
||||
console.log(`got ${events.length} parsed events`);
|
||||
for (const event of events) {
|
||||
await event.save();
|
||||
}
|
||||
console.log(`now ${await fillRepository.count()} total fill events`);
|
||||
console.log(`now ${await cancelRepository.count()} total cancel events`);
|
||||
console.log(`now there are ${(await fillRepository.count()) + (await cancelRepository.count())} total events`);
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user