Skip to content

Commit

Permalink
Add ZID as QR ID parser
Browse files Browse the repository at this point in the history
  • Loading branch information
Ktl-XV committed Jul 21, 2023
1 parent 0c15501 commit 41ad2fb
Show file tree
Hide file tree
Showing 7 changed files with 1,681 additions and 33 deletions.
2 changes: 1 addition & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"lib/*"
],
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint", "eslint-plugin-import"],
"plugins": ["@typescript-eslint", "import", "jest"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
Expand Down
5 changes: 5 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
};
9 changes: 4 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@
"build": "yarn tsc -b",
"dev": "nodemon -r dotenv/config src/index.ts | pino-pretty",
"start": "node lib/src/index.js",
"test": "yarn run_mocha",
"test": "yarn jest",
"migrate_and_start": "yarn migrate:run && yarn start",
"rebuild_and_test": "run-s build test:all",
"test:db": "yarn run_mocha:db",
"test:all": "run-s test test:db",
"test:circleci": "yarn test:coverage",
"prettier": "prettier --write '{src,migrations}/**/*.{ts,tsx,json,md}'",
"prettier:ci": "prettier --list-different '{src,migrations}/**/*.{ts,tsx,json,md}'",
"run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.test.js' --bail --exit",
"run_mocha:db": "mocha --require source-map-support/register --require make-promises-safe lib/test/db_global_hooks.js 'lib/test/**/*.test.js' --bail --exit --timeout 60000",
"test:coverage": "nyc npm run test:all --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"clean": "rm -rf lib",
Expand All @@ -26,7 +23,7 @@
"migrate:create": "yarn typeorm migration:create --config ./lib/src/ormconfig --dir migrations"
},
"devDependencies": {
"@types/mocha": "^8.2.2",
"@types/jest": "^29.1.1",
"@types/node": "^8.0.29",
"@types/node-cron": "^2.0.2",
"@typescript-eslint/eslint-plugin": "^4.29.0",
Expand All @@ -35,9 +32,11 @@
"eslint-config-prettier": "^8.8.0",
"eslint-import-resolver-typescript": "^3.5.5",
"eslint-plugin-import": "^2.27.5",
"jest": "^29.5.0",
"make-promises-safe": "^5.1.0",
"nodemon": "^2.0.12",
"prettier": "^2.4.1",
"ts-jest": "^29.1.1",
"ts-node": "3.3.0"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions src/__tests__/qrid.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { BigNumber } from '@0x/utils';
import { parseTransaction, RawTx1559 } from '../parsers/web3/parse_web3_objects';
import { Transaction } from '../entities';

jest.useFakeTimers();

test('Old QR ID works', () => {
const expectedParsedOld: Transaction = {
affiliateAddress: '0x86003b044f70dac0abc80ac8957305b6370893ed',
blockHash: '0xc3153e3681ccab6366b3cf3339f61911facfa98833d56e0e75dd6a435974c306',
blockNumber: 17578209,
gas: new BigNumber('686198'),
gasPrice: new BigNumber('18606338856'),
input: '0x3d8d408200000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001ccc72c58f9fe589a75caa4ea7f8be99ddd86766b29667879345e5c604cdb6212140dedc2cc007df8dbe2b7400d9248b73fc9ed7f8aebcb8a053cd3c8006bb5b3f0000000000000000000000004303c46c71f6e48eaa96ab3f194b79fac082e46a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000649c3c15d9e46de315a88a299349b4378eee2dc9004c4dc8b2d1f0ad39dea222386914e400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000056fd409e1d7a124bd7017459dfea2f387b6d5cd000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000003080f3b31b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000bcd500000000000000000000000000000000000000000000000003770b5e7cadc7010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000056fd409e1d7a124bd7017459dfea2f387b6d5cd000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea497040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002b056fd409e1d7a124bd7017459dfea2f387b6d5cd0001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000042a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4be9895146f7af43049ca1c1ae358b0541ea49704000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000086003b044f70dac0abc80ac8957305b6370893ed0000000000000000000000000000000000000000000000c1379d79c9649c39bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000038f5e5b4da37531a6e85161e337e0238bb27aa90000000000000000000000000000000000000000000000000000000000000067b869584cd00000000000000000000000086003b044f70dac0abc80ac8957305b6370893ed0000000000000000000000000000000000000000000000e8fc7e9dec649c39e4',
maxFeePerGas: new BigNumber('38424865204'),
maxPriorityFeePerGas: new BigNumber('2000000000'),
nonce: 81,
observedTimestamp: jest.now(),
quoteId: 'c1379d79c9',
quoteTimestamp: 1687959996,
senderAddress: '0x7ff41ecd5db04431753d46e1b0873b9be2c97b5a',
toAddress: '0xdef1c0ded9bec7f1a1670819833240f027b25eff',
transactionHash: '0xca343cd9cff11f3b423a5237594dd0e20259a1402988aa2db6c30710d9c131ae',
transactionIndex: 81,
type: 2,
value: new BigNumber('0'),
};

const rawTransaction: RawTx1559 = {
blockHash: '0xc3153e3681ccab6366b3cf3339f61911facfa98833d56e0e75dd6a435974c306',
blockNumber: 17578209,
hash: '0xca343cd9cff11f3b423a5237594dd0e20259a1402988aa2db6c30710d9c131ae',
from: '0x7ff41ecd5db04431753d46e1b0873b9be2c97b5a',
gas: 686198,
gasPrice: new BigNumber('0x455063328'),
input: '0x3d8d408200000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001ccc72c58f9fe589a75caa4ea7f8be99ddd86766b29667879345e5c604cdb6212140dedc2cc007df8dbe2b7400d9248b73fc9ed7f8aebcb8a053cd3c8006bb5b3f0000000000000000000000004303c46c71f6e48eaa96ab3f194b79fac082e46a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000649c3c15d9e46de315a88a299349b4378eee2dc9004c4dc8b2d1f0ad39dea222386914e400000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000056fd409e1d7a124bd7017459dfea2f387b6d5cd000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000003080f3b31b200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000bcd500000000000000000000000000000000000000000000000003770b5e7cadc7010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000056fd409e1d7a124bd7017459dfea2f387b6d5cd000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea497040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002b056fd409e1d7a124bd7017459dfea2f387b6d5cd0001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000042a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20001f4be9895146f7af43049ca1c1ae358b0541ea49704000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000086003b044f70dac0abc80ac8957305b6370893ed0000000000000000000000000000000000000000000000c1379d79c9649c39bc000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000038f5e5b4da37531a6e85161e337e0238bb27aa90000000000000000000000000000000000000000000000000000000000000067b869584cd00000000000000000000000086003b044f70dac0abc80ac8957305b6370893ed0000000000000000000000000000000000000000000000e8fc7e9dec649c39e4',
maxFeePerGas: new BigNumber('0x8f24ce9b4'),
maxPriorityFeePerGas: new BigNumber('0x77359400'),
nonce: 81,
to: '0xdef1c0ded9bec7f1a1670819833240f027b25eff',
transactionIndex: 81,
type: 2,
value: new BigNumber('0x0'),
};
const parsedTransaction = parseTransaction(rawTransaction);
expect(parsedTransaction).toEqual(expectedParsedOld);
});

test('New ZID works', () => {
const expectedParsedNew: Transaction = {
affiliateAddress: '0x70a9f34f9b34c64957b9c401a97bfed35b95049e',
blockHash: '0xc3153e3681ccab6366b3cf3339f61911facfa98833d56e0e75dd6a435974c306',
blockNumber: 17578209,
gas: new BigNumber('686198'),
gasPrice: new BigNumber('18606338856'),
input: '0x7a1eb1b9000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000419d0d8bdd9af5e606ae2232ed285aff190e711b00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000004a817c800000000000000000000000000000000000000000000000000000107c5402193190000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000001a13b86000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000064419d0d8bdd9af5e606ae2232ed285aff190e711b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000001836e210000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000042a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000064dac17f958d2ee523a2206206994597c13d831ec7000064419d0d8bdd9af5e606ae2232ed285aff190e711b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000001836e210000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000042a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000646b175474e89094c44da98b954eedeac495271d0f000064419d0d8bdd9af5e606ae2232ed285aff190e711b000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000070a9f34f9b34c64957b9c401a97bfed35b95049e00000000000000000000000000000000197ad42db2c18b1741a897949417a872',
maxFeePerGas: new BigNumber('38424865204'),
maxPriorityFeePerGas: new BigNumber('2000000000'),
nonce: 81,
observedTimestamp: jest.now(),
quoteId: '0x197ad42db2c18b1741a897949417a872',
quoteTimestamp: null,
senderAddress: '0x7ff41ecd5db04431753d46e1b0873b9be2c97b5a',
toAddress: '0xdef1c0ded9bec7f1a1670819833240f027b25eff',
transactionHash: '0xca343cd9cff11f3b423a5237594dd0e20259a1402988aa2db6c30710d9c131ae',
transactionIndex: 81,
type: 2,
value: new BigNumber('0'),
};

const rawTransaction: RawTx1559 = {
blockHash: '0xc3153e3681ccab6366b3cf3339f61911facfa98833d56e0e75dd6a435974c306',
blockNumber: 17578209,
hash: '0xca343cd9cff11f3b423a5237594dd0e20259a1402988aa2db6c30710d9c131ae',
from: '0x7ff41ecd5db04431753d46e1b0873b9be2c97b5a',
gas: 686198,
gasPrice: new BigNumber('0x455063328'),
input: '0x7a1eb1b9000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000419d0d8bdd9af5e606ae2232ed285aff190e711b00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000004a817c800000000000000000000000000000000000000000000000000000107c5402193190000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000001a13b86000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000064419d0d8bdd9af5e606ae2232ed285aff190e711b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000001836e210000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000042a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000064dac17f958d2ee523a2206206994597c13d831ec7000064419d0d8bdd9af5e606ae2232ed285aff190e711b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000001836e210000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000042a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000646b175474e89094c44da98b954eedeac495271d0f000064419d0d8bdd9af5e606ae2232ed285aff190e711b000000000000000000000000000000000000000000000000000000000000869584cd00000000000000000000000070a9f34f9b34c64957b9c401a97bfed35b95049e00000000000000000000000000000000197ad42db2c18b1741a897949417a872',
maxFeePerGas: new BigNumber('0x8f24ce9b4'),
maxPriorityFeePerGas: new BigNumber('0x77359400'),
nonce: 81,
to: '0xdef1c0ded9bec7f1a1670819833240f027b25eff',
transactionIndex: 81,
type: 2,
value: new BigNumber('0x0'),
};
const parsedTransaction = parseTransaction(rawTransaction);
expect(parsedTransaction).toEqual(expectedParsedNew);
});
14 changes: 11 additions & 3 deletions src/parsers/web3/parse_web3_objects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,17 @@ export function parseTransaction(rawTx: RawTx1559): Transaction {
if (transaction.input.includes('869584cd')) {
const bytesPos = rawTx.input.indexOf('869584cd');
transaction.affiliateAddress = '0x'.concat(rawTx.input.slice(bytesPos + 32, bytesPos + 72));
const parsedQuoteTimestamp = parseInt(rawTx.input.slice(bytesPos + 128, bytesPos + 136), 16);
transaction.quoteTimestamp = isNaN(parsedQuoteTimestamp) ? null : parsedQuoteTimestamp;
transaction.quoteId = rawTx.input.slice(bytesPos + 118, bytesPos + 128);
const quoteId = rawTx.input.slice(bytesPos + 104, bytesPos + 136);
if (quoteId.slice(0, 14) === '00000000000000') {
// Pre ZID QR ID
const parsedQuoteTimestamp = parseInt(rawTx.input.slice(bytesPos + 128, bytesPos + 136), 16);
transaction.quoteTimestamp = isNaN(parsedQuoteTimestamp) ? null : parsedQuoteTimestamp;
transaction.quoteId = rawTx.input.slice(bytesPos + 118, bytesPos + 128);
} else {
// ZID
transaction.quoteTimestamp = null;
transaction.quoteId = '0x' + quoteId;
}
} else if (transaction.input.includes('fbc019a7')) {
const bytesPos = rawTx.input.indexOf('fbc019a7');
transaction.affiliateAddress = '0x'.concat(rawTx.input.slice(bytesPos + 32, bytesPos + 72));
Expand Down
5 changes: 0 additions & 5 deletions test/pipeline.test.ts

This file was deleted.

Loading

0 comments on commit 41ad2fb

Please sign in to comment.