aboutsummaryrefslogtreecommitdiffstats
path: root/packages/pipeline
diff options
context:
space:
mode:
Diffstat (limited to 'packages/pipeline')
-rw-r--r--packages/pipeline/package.json13
-rw-r--r--packages/pipeline/src/data-sources/etherscan/events.ts9
-rw-r--r--packages/pipeline/src/entities/ExchangeFillEvent.ts24
-rw-r--r--packages/pipeline/src/index.ts38
-rw-r--r--packages/pipeline/src/ormconfig.ts14
-rw-r--r--packages/pipeline/tsconfig.json4
6 files changed, 89 insertions, 13 deletions
diff --git a/packages/pipeline/package.json b/packages/pipeline/package.json
index cdcd5ed18..d81ea2668 100644
--- a/packages/pipeline/package.json
+++ b/packages/pipeline/package.json
@@ -30,13 +30,13 @@
"license": "Apache-2.0",
"devDependencies": {
"@0xproject/tslint-config": "^1.0.7",
- "tslint": "5.11.0",
- "typescript": "3.0.1",
- "mocha": "^5.2.0",
"chai": "^4.1.2",
"chai-as-promised": "^7.1.1",
"chai-bignumber": "^2.0.2",
- "dirty-chai": "^2.0.1"
+ "dirty-chai": "^2.0.1",
+ "mocha": "^5.2.0",
+ "tslint": "5.11.0",
+ "typescript": "3.0.1"
},
"dependencies": {
"@0xproject/contract-wrappers": "^1.0.1",
@@ -45,6 +45,9 @@
"@types/ramda": "^0.25.38",
"axios": "^0.18.0",
"ethereum-types": "^1.0.6",
- "ramda": "^0.25.0"
+ "ramda": "^0.25.0",
+ "reflect-metadata": "^0.1.12",
+ "sqlite3": "^4.0.2",
+ "typeorm": "^0.2.7"
}
}
diff --git a/packages/pipeline/src/data-sources/etherscan/events.ts b/packages/pipeline/src/data-sources/etherscan/events.ts
index 89b3ffac1..edc8cde7b 100644
--- a/packages/pipeline/src/data-sources/etherscan/events.ts
+++ b/packages/pipeline/src/data-sources/etherscan/events.ts
@@ -1,5 +1,6 @@
+import { ExchangeEventArgs } from '@0xproject/contract-wrappers';
import { AbiDecoder } from '@0xproject/utils';
-import { AbiDefinition, DecodedLogArgs, LogEntry, LogWithDecodedArgs } from 'ethereum-types';
+import { AbiDefinition, LogEntry, LogWithDecodedArgs } from 'ethereum-types';
import * as R from 'ramda';
// Raw events response from etherescan.io
@@ -47,12 +48,12 @@ export function _convertResponseToLogEntry(result: EventsResponseResult): LogEnt
// Decodes a LogEntry into a LogWithDecodedArgs
// tslint:disable-next-line:completed-docs
export const _decodeLogEntry = R.curry((contractAbi: AbiDefinition[], log: LogEntry): LogWithDecodedArgs<
- DecodedLogArgs
+ ExchangeEventArgs
> => {
const abiDecoder = new AbiDecoder([contractAbi]);
const logWithDecodedArgs = abiDecoder.tryToDecodeLogOrNoop(log);
// tslint:disable-next-line:no-unnecessary-type-assertion
- return logWithDecodedArgs as LogWithDecodedArgs<DecodedLogArgs>;
+ return logWithDecodedArgs as LogWithDecodedArgs<ExchangeEventArgs>;
});
/**
@@ -64,7 +65,7 @@ export const _decodeLogEntry = R.curry((contractAbi: AbiDefinition[], log: LogEn
export function parseRawEventsResponse(
contractAbi: AbiDefinition[],
rawEventsResponse: EventsResponse,
-): Array<LogWithDecodedArgs<DecodedLogArgs>> {
+): Array<LogWithDecodedArgs<ExchangeEventArgs>> {
return R.pipe(R.map(_convertResponseToLogEntry), R.map(_decodeLogEntry(contractAbi)))(rawEventsResponse.result);
}
diff --git a/packages/pipeline/src/entities/ExchangeFillEvent.ts b/packages/pipeline/src/entities/ExchangeFillEvent.ts
new file mode 100644
index 000000000..1e9e8d986
--- /dev/null
+++ b/packages/pipeline/src/entities/ExchangeFillEvent.ts
@@ -0,0 +1,24 @@
+import { Column, Entity, PrimaryColumn } from 'typeorm';
+
+@Entity()
+export class ExchangeFillEvent {
+ @PrimaryColumn() public logIndex!: number;
+
+ @Column() public address!: string;
+ @Column() public rawData!: string;
+ @Column() public blockNumber!: number;
+
+ @Column() public makerAddress!: string;
+ @Column() public takerAddress!: string;
+ @Column() public feeRecepientAddress!: string;
+ @Column() public senderAddress!: string;
+ @Column() public makerAssetFilledAmount!: string;
+ @Column() public takerAssetFilledAmount!: string;
+ @Column() public makerFeePaid!: string;
+ @Column() public takerFeePaid!: string;
+ @Column() public orderHash!: string;
+ // TODO(albrow): Decode asset data.
+ @Column() public makerAssetData!: string;
+ @Column() public takerAssetData!: string;
+ // TODO(albrow): Include topics?
+}
diff --git a/packages/pipeline/src/index.ts b/packages/pipeline/src/index.ts
index eccb24d18..d70ec3e3e 100644
--- a/packages/pipeline/src/index.ts
+++ b/packages/pipeline/src/index.ts
@@ -1,13 +1,45 @@
-import { Etherscan } from './data-sources/etherscan';
+import { ExchangeFillEventArgs } from '@0xproject/contract-wrappers';
+import { LogWithDecodedArgs } from 'ethereum-types';
+import 'reflect-metadata';
+import { createConnection } from 'typeorm';
import { artifacts } from './artifacts';
+import { Etherscan } from './data-sources/etherscan';
+import { ExchangeFillEvent } from './entities/ExchangeFillEvent';
+import { config } from './ormconfig';
const etherscan = new Etherscan(process.env.ETHERSCAN_API_KEY as string);
(async () => {
- const events = await etherscan.getContractEventsAsync(
+ const connection = await createConnection(config);
+ const repository = connection.getRepository(ExchangeFillEvent);
+ console.log(`found ${await repository.count()} existing fill events`);
+ const eventLogs = await etherscan.getContractEventsAsync(
'0x4f833a24e1f95d70f028921e27040ca56e09ab0b',
artifacts.Exchange.compilerOutput.abi,
);
- console.log(events);
+ for (const eventLog of eventLogs) {
+ if (eventLog.event !== 'Fill') {
+ continue;
+ }
+ const fillEventLog = eventLog as LogWithDecodedArgs<ExchangeFillEventArgs>;
+ const exchangeFillEvent = new ExchangeFillEvent();
+ exchangeFillEvent.logIndex = fillEventLog.logIndex as number;
+ exchangeFillEvent.address = fillEventLog.address as string;
+ exchangeFillEvent.rawData = fillEventLog.data as string;
+ exchangeFillEvent.blockNumber = fillEventLog.blockNumber as number;
+ exchangeFillEvent.makerAddress = fillEventLog.args.makerAddress.toString();
+ exchangeFillEvent.takerAddress = fillEventLog.args.takerAddress.toString();
+ exchangeFillEvent.feeRecepientAddress = fillEventLog.args.feeRecipientAddress;
+ exchangeFillEvent.senderAddress = fillEventLog.args.senderAddress;
+ exchangeFillEvent.makerAssetFilledAmount = fillEventLog.args.makerAssetFilledAmount.toString();
+ exchangeFillEvent.takerAssetFilledAmount = fillEventLog.args.takerAssetFilledAmount.toString();
+ exchangeFillEvent.makerFeePaid = fillEventLog.args.makerFeePaid.toString();
+ exchangeFillEvent.takerFeePaid = fillEventLog.args.takerFeePaid.toString();
+ exchangeFillEvent.orderHash = fillEventLog.args.orderHash;
+ exchangeFillEvent.makerAssetData = fillEventLog.args.makerAssetData;
+ exchangeFillEvent.takerAssetData = fillEventLog.args.takerAssetData;
+ await repository.save(exchangeFillEvent);
+ }
+ console.log(`now ${await repository.count()} total fill events`);
})();
diff --git a/packages/pipeline/src/ormconfig.ts b/packages/pipeline/src/ormconfig.ts
new file mode 100644
index 000000000..48e316078
--- /dev/null
+++ b/packages/pipeline/src/ormconfig.ts
@@ -0,0 +1,14 @@
+import { ConnectionOptions } from 'typeorm';
+
+export const config: ConnectionOptions = {
+ type: 'sqlite',
+ database: 'database.sqlite',
+ synchronize: true,
+ logging: false,
+ entities: ['./lib/src/entities/**/*.js'],
+ migrations: ['./lib/src/migrations/**/*.js'],
+ cli: {
+ entitiesDir: 'lib/src/entities',
+ migrationsDir: 'lib/src/migrations',
+ },
+};
diff --git a/packages/pipeline/tsconfig.json b/packages/pipeline/tsconfig.json
index 2ee711adc..918d469ed 100644
--- a/packages/pipeline/tsconfig.json
+++ b/packages/pipeline/tsconfig.json
@@ -2,7 +2,9 @@
"extends": "../../tsconfig",
"compilerOptions": {
"outDir": "lib",
- "rootDir": "."
+ "rootDir": ".",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true
},
"include": ["./src/**/*", "./test/**/*"]
}