259 lines
8.8 KiB
TypeScript
259 lines
8.8 KiB
TypeScript
import * as commandLineArgs from 'command-line-args';
|
|
|
|
import { postgresClient } from '../postgres';
|
|
import { formatters } from '../utils';
|
|
const tableQueries: any = {
|
|
events_full: `CREATE TABLE IF NOT EXISTS events_full (
|
|
timestamp TIMESTAMP WITH TIME ZONE,
|
|
event_type VARCHAR,
|
|
error_id VARCHAR,
|
|
order_hash CHAR(66),
|
|
maker CHAR(42),
|
|
maker_amount NUMERIC(78),
|
|
maker_fee NUMERIC(78),
|
|
maker_token CHAR(42),
|
|
taker CHAR(42),
|
|
taker_amount NUMERIC(78),
|
|
taker_fee NUMERIC(78),
|
|
taker_token CHAR(42),
|
|
txn_hash CHAR(66),
|
|
gas_used NUMERIC(78),
|
|
gas_price NUMERIC(78),
|
|
fee_recipient CHAR(42),
|
|
method_id CHAR(10),
|
|
salt VARCHAR,
|
|
block_number BIGINT,
|
|
log_index BIGINT,
|
|
taker_symbol VARCHAR,
|
|
taker_name VARCHAR,
|
|
taker_decimals BIGINT,
|
|
taker_usd_price NUMERIC(78),
|
|
taker_txn_usd_value NUMERIC(78),
|
|
maker_symbol VARCHAR,
|
|
maker_name VARCHAR,
|
|
maker_decimals BIGINT,
|
|
maker_usd_price NUMERIC(78),
|
|
maker_txn_usd_value NUMERIC(78),
|
|
PRIMARY KEY (txn_hash, order_hash, log_index)
|
|
)`,
|
|
events: `CREATE TABLE IF NOT EXISTS events (
|
|
timestamp TIMESTAMP WITH TIME ZONE,
|
|
event_type VARCHAR,
|
|
error_id VARCHAR,
|
|
order_hash CHAR(66),
|
|
maker CHAR(42),
|
|
maker_amount NUMERIC(78),
|
|
maker_fee NUMERIC(78),
|
|
maker_token CHAR(42),
|
|
taker CHAR(42),
|
|
taker_amount NUMERIC(78),
|
|
taker_fee NUMERIC(78),
|
|
taker_token CHAR(42),
|
|
txn_hash CHAR(66),
|
|
gas_used NUMERIC(78),
|
|
gas_price NUMERIC(78),
|
|
fee_recipient CHAR(42),
|
|
method_id CHAR(10),
|
|
salt VARCHAR,
|
|
block_number BIGINT,
|
|
log_index BIGINT,
|
|
PRIMARY KEY (txn_hash, order_hash, log_index)
|
|
)`,
|
|
events_staging: `CREATE TABLE IF NOT EXISTS events_staging (
|
|
timestamp TIMESTAMP WITH TIME ZONE,
|
|
event_type VARCHAR,
|
|
error_id VARCHAR,
|
|
order_hash CHAR(66),
|
|
maker CHAR(42),
|
|
maker_amount NUMERIC(78),
|
|
maker_fee NUMERIC(78),
|
|
maker_token CHAR(42),
|
|
taker CHAR(42),
|
|
taker_amount NUMERIC(78),
|
|
taker_fee NUMERIC(78),
|
|
taker_token CHAR(42),
|
|
txn_hash CHAR(66),
|
|
fee_recipient CHAR(42),
|
|
block_number BIGINT,
|
|
log_index BIGINT,
|
|
PRIMARY KEY (txn_hash, order_hash, log_index)
|
|
)`,
|
|
events_raw: `CREATE TABLE IF NOT EXISTS events_raw (
|
|
event_type VARCHAR,
|
|
error_id VARCHAR,
|
|
order_hash CHAR(66),
|
|
maker CHAR(42),
|
|
maker_amount NUMERIC(78),
|
|
maker_fee NUMERIC(78),
|
|
maker_token CHAR(42),
|
|
taker CHAR(42),
|
|
taker_amount NUMERIC(78),
|
|
taker_fee NUMERIC(78),
|
|
taker_token CHAR(42),
|
|
txn_hash CHAR(66),
|
|
fee_recipient CHAR(42),
|
|
block_number BIGINT,
|
|
log_index BIGINT,
|
|
PRIMARY KEY (txn_hash, order_hash, log_index)
|
|
)`,
|
|
blocks: `CREATE TABLE IF NOT EXISTS blocks (
|
|
timestamp TIMESTAMP WITH TIME ZONE,
|
|
block_hash CHAR(66) UNIQUE,
|
|
block_number BIGINT,
|
|
PRIMARY KEY (block_hash)
|
|
)`,
|
|
transactions: `CREATE TABLE IF NOT EXISTS transactions (
|
|
txn_hash CHAR(66) UNIQUE,
|
|
block_hash CHAR(66),
|
|
block_number BIGINT,
|
|
gas_used NUMERIC(78),
|
|
gas_price NUMERIC(78),
|
|
method_id CHAR(10),
|
|
salt VARCHAR,
|
|
PRIMARY KEY (txn_hash)
|
|
)`,
|
|
tokens: `CREATE TABLE IF NOT EXISTS tokens (
|
|
address CHAR(42) UNIQUE,
|
|
name VARCHAR,
|
|
symbol VARCHAR,
|
|
decimals INT,
|
|
PRIMARY KEY (address)
|
|
)`,
|
|
prices: `CREATE TABLE IF NOT EXISTS prices (
|
|
address CHAR(42) UNIQUE,
|
|
timestamp TIMESTAMP WITH TIME ZONE,
|
|
price NUMERIC(78, 18),
|
|
PRIMARY KEY (address, timestamp)
|
|
)`,
|
|
relayers: `CREATE TABLE IF NOT EXISTS relayers (
|
|
name VARCHAR UNIQUE,
|
|
url VARCHAR DEFAULT '',
|
|
sra_http_endpoint VARCHAR DEFAULT '',
|
|
sra_ws_endpoint VARCHAR DEFAULT '',
|
|
fee_recipient_addresses CHAR(42)[] DEFAULT '{}',
|
|
taker_addresses CHAR(42)[] DEFAULT '{}',
|
|
PRIMARY KEY(name)`,
|
|
historical_prices: `CREATE TABLE IF NOT EXISTS historical_prices (
|
|
token VARCHAR,
|
|
base VARCHAR,
|
|
timestamp TIMESTAMP WITH TIME ZONE,
|
|
close NUMERIC(78, 18),
|
|
high NUMERIC(78, 18),
|
|
low NUMERIC(78, 18),
|
|
open NUMERIC(78, 18),
|
|
volume_from NUMERIC(78, 18),
|
|
volume_to NUMERIC(78, 18),
|
|
PRIMARY KEY (token, base, timestamp)
|
|
)`,
|
|
orders: `CREATE TABLE IF NOT EXISTS orders (
|
|
relayer_id VARCHAR,
|
|
exchange_contract_address CHAR(42),
|
|
maker CHAR(42),
|
|
maker_amount NUMERIC(78),
|
|
maker_fee NUMERIC(78),
|
|
maker_token CHAR(42),
|
|
taker CHAR(42),
|
|
taker_amount NUMERIC(78),
|
|
taker_fee NUMERIC(78),
|
|
taker_token CHAR(42),
|
|
fee_recipient CHAR(42),
|
|
expiration_unix_timestamp_sec NUMERIC(78),
|
|
salt VARCHAR,
|
|
order_hash CHAR(66),
|
|
PRIMARY KEY (relayer_id, order_hash)
|
|
)`,
|
|
};
|
|
function _safeQuery(query: string): any {
|
|
return new Promise((resolve, reject) => {
|
|
postgresClient
|
|
.query(query)
|
|
.then((data: any) => {
|
|
resolve(data);
|
|
})
|
|
.catch((err: any) => {
|
|
reject(err);
|
|
});
|
|
});
|
|
}
|
|
export const tableScripts = {
|
|
createTable(query: string): any {
|
|
return _safeQuery(query);
|
|
},
|
|
createAllTables(): any {
|
|
for (const tableName of tableQueries) {
|
|
_safeQuery(tableQueries[tableName]);
|
|
}
|
|
},
|
|
};
|
|
export const insertDataScripts = {
|
|
insertSingleRow(table: string, object: any): any {
|
|
return new Promise((resolve, reject) => {
|
|
const columns = Object.keys(object);
|
|
const safeArray: any = [];
|
|
for (const key of columns) {
|
|
if (key in object) {
|
|
if (key === 'timestamp') {
|
|
safeArray.push('to_timestamp(' + object[key] + ')');
|
|
} else if (typeof object[key] === 'string' || object[key] instanceof String) {
|
|
safeArray.push(formatters.escapeSQLParam(object[key]));
|
|
} else {
|
|
safeArray.push(object[key]);
|
|
}
|
|
} else {
|
|
safeArray.push('default');
|
|
}
|
|
}
|
|
const queryString = `INSERT INTO ${table} (${columns}) VALUES (${safeArray}) ON CONFLICT DO NOTHING`;
|
|
console.log(queryString);
|
|
postgresClient
|
|
.query(queryString)
|
|
.then((data: any) => {
|
|
resolve(data);
|
|
})
|
|
.catch((err: any) => {
|
|
reject(err);
|
|
});
|
|
});
|
|
},
|
|
insertMultipleRows(table: string, rows: any[], columns: any[]): any {
|
|
return new Promise((resolve, reject) => {
|
|
if (rows.length > 0) {
|
|
const rowsSplit = rows.map((value, index) => {
|
|
const safeArray: any = [];
|
|
for (const key of columns) {
|
|
if (key in value) {
|
|
if (key === 'timestamp') {
|
|
safeArray.push('to_timestamp(' + value[key] + ')');
|
|
} else if (typeof value[key] === 'string' || value[key] instanceof String) {
|
|
safeArray.push(formatters.escapeSQLParam(value[key]));
|
|
} else if (value[key] instanceof Array) {
|
|
const escapedArray = value[key].map((subValue: string, subIndex: number) => {
|
|
return formatters.escapeSQLParam(subValue);
|
|
});
|
|
safeArray.push('ARRAY[' + escapedArray.toString() + ']');
|
|
} else {
|
|
safeArray.push(value[key]);
|
|
}
|
|
} else {
|
|
safeArray.push('default');
|
|
}
|
|
}
|
|
return '(' + safeArray + ')';
|
|
});
|
|
const queryString = `INSERT INTO ${table} (${columns}) VALUES ${rowsSplit} ON CONFLICT DO NOTHING`;
|
|
postgresClient
|
|
.query(queryString)
|
|
.then((data: any) => {
|
|
resolve(data);
|
|
})
|
|
.catch((err: any) => {
|
|
// console.log(err);
|
|
reject(err);
|
|
});
|
|
} else {
|
|
resolve({});
|
|
}
|
|
});
|
|
},
|
|
};
|