Add tests for etherscan events
This commit is contained in:
@@ -31,7 +31,12 @@
|
||||
"devDependencies": {
|
||||
"@0xproject/tslint-config": "^1.0.7",
|
||||
"tslint": "5.11.0",
|
||||
"typescript": "3.0.1"
|
||||
"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"
|
||||
},
|
||||
"dependencies": {
|
||||
"@0xproject/contract-wrappers": "^1.0.1",
|
||||
|
||||
@@ -25,21 +25,30 @@ export interface EventsResponseResult {
|
||||
transactionIndex: string;
|
||||
}
|
||||
|
||||
function convertResponseToLogEntry(result: EventsResponseResult): LogEntry {
|
||||
const radix = 10;
|
||||
const hexRadix = 16;
|
||||
|
||||
function hexToInt(hex: string): number {
|
||||
return parseInt(hex.replace('0x', ''), hexRadix);
|
||||
}
|
||||
|
||||
// Converts a raw event response to a LogEntry
|
||||
// tslint:disable-next-line:completed-docs
|
||||
export function _convertResponseToLogEntry(result: EventsResponseResult): LogEntry {
|
||||
return {
|
||||
logIndex: parseInt(result.logIndex, radix),
|
||||
transactionIndex: parseInt(result.logIndex, radix),
|
||||
logIndex: hexToInt(result.logIndex),
|
||||
transactionIndex: hexToInt(result.transactionIndex),
|
||||
transactionHash: result.transactionHash,
|
||||
blockHash: '',
|
||||
blockNumber: parseInt(result.blockNumber, radix),
|
||||
blockNumber: hexToInt(result.blockNumber),
|
||||
address: result.address,
|
||||
data: result.data,
|
||||
topics: result.topics,
|
||||
};
|
||||
}
|
||||
|
||||
function tryToDecodeLogOrNoop(log: LogEntry): LogWithDecodedArgs<DecodedLogArgs> {
|
||||
// Decodes a LogEntry into a LogWithDecodedArgs
|
||||
// tslint:disable-next-line:completed-docs
|
||||
export function _decodeLogEntry(log: LogEntry): LogWithDecodedArgs<DecodedLogArgs> {
|
||||
const abiDecoder = new AbiDecoder([artifacts.Exchange.compilerOutput.abi]);
|
||||
const logWithDecodedArgs = abiDecoder.tryToDecodeLogOrNoop(log);
|
||||
// tslint:disable-next-line:no-unnecessary-type-assertion
|
||||
@@ -51,4 +60,4 @@ function tryToDecodeLogOrNoop(log: LogEntry): LogWithDecodedArgs<DecodedLogArgs>
|
||||
* @param rawEventsResponse The raw events response from etherescan.io.
|
||||
* @returns Parsed and decoded events.
|
||||
*/
|
||||
export const parseRawEventsResponse = R.pipe(R.map(convertResponseToLogEntry), R.map(tryToDecodeLogOrNoop));
|
||||
export const parseRawEventsResponse = R.pipe(R.map(_convertResponseToLogEntry), R.map(_decodeLogEntry));
|
||||
|
||||
@@ -3,6 +3,5 @@ import { Etherscan } from './data-sources/etherscan';
|
||||
const etherscan = new Etherscan(process.env.ETHERSCAN_API_KEY as string);
|
||||
|
||||
(async () => {
|
||||
const events = await etherscan.getContractEventsAsync('0x4f833a24e1f95d70f028921e27040ca56e09ab0b');
|
||||
console.log(events);
|
||||
await etherscan.getContractEventsAsync('0x4f833a24e1f95d70f028921e27040ca56e09ab0b');
|
||||
})();
|
||||
|
||||
88
packages/pipeline/test/data-sources/etherscan/events_test.ts
Normal file
88
packages/pipeline/test/data-sources/etherscan/events_test.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { BigNumber } from '@0xproject/utils';
|
||||
import * as chai from 'chai';
|
||||
import { DecodedLogArgs, LogEntry, LogWithDecodedArgs } from 'ethereum-types';
|
||||
import 'mocha';
|
||||
|
||||
import {
|
||||
_convertResponseToLogEntry,
|
||||
_decodeLogEntry,
|
||||
EventsResponseResult,
|
||||
} from '../../../src/data-sources/etherscan/events';
|
||||
import { chaiSetup } from '../../utils/chai_setup';
|
||||
|
||||
chaiSetup.configure();
|
||||
const expect = chai.expect;
|
||||
|
||||
describe('etherscan#events', () => {
|
||||
describe('_convertResponseToLogEntry', () => {
|
||||
it('converts EventsResponseResult to LogEntry', () => {
|
||||
const input: EventsResponseResult = {
|
||||
address: '0x4f833a24e1f95d70f028921e27040ca56e09ab0b',
|
||||
topics: [
|
||||
'0x82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f0',
|
||||
'0x00000000000000000000000067032ef7be8fa07c4335d0134099db0f3875e930',
|
||||
'0x0000000000000000000000000000000000000000000000000000000000000000',
|
||||
],
|
||||
data: '0x00000000000000000000000000000000000000000000000000000165f2d3f94d',
|
||||
blockNumber: '0x61127b',
|
||||
timeStamp: '0x5ba2878e',
|
||||
gasPrice: '0x1a13b8600',
|
||||
gasUsed: '0xd9dc',
|
||||
logIndex: '0x63',
|
||||
transactionHash: '0xa3f71931ddab6e758b9d1755b2715b376759f49f23fff60755f7e073367d61b5',
|
||||
transactionIndex: '0x35',
|
||||
};
|
||||
const expected: LogEntry = {
|
||||
logIndex: 99,
|
||||
transactionIndex: 53,
|
||||
transactionHash: input.transactionHash,
|
||||
blockHash: '',
|
||||
blockNumber: 6361723,
|
||||
address: input.address,
|
||||
data: input.data,
|
||||
topics: input.topics,
|
||||
};
|
||||
const actual = _convertResponseToLogEntry(input);
|
||||
expect(actual).deep.equal(expected);
|
||||
});
|
||||
});
|
||||
describe('_decodeLogEntry', () => {
|
||||
it('decodes LogEntry into LogWithDecodedArgs', () => {
|
||||
const input: LogEntry = {
|
||||
logIndex: 96,
|
||||
transactionIndex: 52,
|
||||
transactionHash: '0x02b59043e9b38b430c8c66abe67ab4a9e5509def8f8552b54231e88db1839831',
|
||||
blockHash: '',
|
||||
blockNumber: 6361723,
|
||||
address: '0x4f833a24e1f95d70f028921e27040ca56e09ab0b',
|
||||
data:
|
||||
'0x00000000000000000000000067032ef7be8fa07c4335d0134099db0f3875e93000000000000000000000000067032ef7be8fa07c4335d0134099db0f3875e930000000000000000000000000000000000000000000000000000000174876e8000000000000000000000000000000000000000000000000000000000013ab668000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000000000000000000000000000000000000',
|
||||
topics: [
|
||||
'0x0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129',
|
||||
'0x0000000000000000000000003f7f832abb3be28442c0e48b7222e02b322c78f3',
|
||||
'0x000000000000000000000000a258b39954cef5cb142fd567a46cddb31a670124',
|
||||
'0x523404b4e6f847d9aefcf5be024be396449b4635590291fd7a28a8c940843858',
|
||||
],
|
||||
};
|
||||
const expected: LogWithDecodedArgs<DecodedLogArgs> = {
|
||||
...input,
|
||||
event: 'Fill',
|
||||
args: {
|
||||
makerAddress: '0x3f7f832abb3be28442c0e48b7222e02b322c78f3',
|
||||
feeRecipientAddress: '0xa258b39954cef5cb142fd567a46cddb31a670124',
|
||||
takerAddress: '0x67032ef7be8fa07c4335d0134099db0f3875e930',
|
||||
senderAddress: '0x67032ef7be8fa07c4335d0134099db0f3875e930',
|
||||
makerAssetFilledAmount: new BigNumber('100000000000'),
|
||||
takerAssetFilledAmount: new BigNumber('330000000'),
|
||||
makerFeePaid: new BigNumber('0'),
|
||||
takerFeePaid: new BigNumber('0'),
|
||||
orderHash: '0x523404b4e6f847d9aefcf5be024be396449b4635590291fd7a28a8c940843858',
|
||||
makerAssetData: '0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498',
|
||||
takerAssetData: '0xf47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
|
||||
},
|
||||
};
|
||||
const actual = _decodeLogEntry(input);
|
||||
expect(actual).deep.equal(expected);
|
||||
});
|
||||
});
|
||||
});
|
||||
13
packages/pipeline/test/utils/chai_setup.ts
Normal file
13
packages/pipeline/test/utils/chai_setup.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import * as chai from 'chai';
|
||||
import chaiAsPromised = require('chai-as-promised');
|
||||
import ChaiBigNumber = require('chai-bignumber');
|
||||
import * as dirtyChai from 'dirty-chai';
|
||||
|
||||
export const chaiSetup = {
|
||||
configure(): void {
|
||||
chai.config.includeStack = true;
|
||||
chai.use(ChaiBigNumber());
|
||||
chai.use(dirtyChai);
|
||||
chai.use(chaiAsPromised);
|
||||
},
|
||||
};
|
||||
@@ -3876,7 +3876,7 @@ center-align@^0.1.1:
|
||||
align-text "^0.1.3"
|
||||
lazy-cache "^1.0.3"
|
||||
|
||||
chai-as-promised@^7.1.0:
|
||||
chai-as-promised@^7.1.0, chai-as-promised@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0"
|
||||
dependencies:
|
||||
|
||||
Reference in New Issue
Block a user