Compare commits
21 Commits
v1.0.4
...
developmen
Author | SHA1 | Date | |
---|---|---|---|
7befb1288d | |||
b8ebf21cb4 | |||
b2f31b4e43 | |||
42e6b1713b | |||
48774c321e | |||
53e60da285 | |||
1217d411c2 | |||
4512834388 | |||
0a305433ba | |||
2eb489979c | |||
f51183f2c7 | |||
d19c062847 | |||
620d46580b | |||
75bb730713 | |||
29236fe7fd | |||
de6b929c51 | |||
4c9fc48ad5 | |||
37ce302ca5 | |||
a8fc72ccda | |||
083479bafc | |||
b5c7dace45 |
.eslintrc.js.npmrc
dist
package.jsonscripts
src
static/events
deposits_10_eth_0.001.json.zipdeposits_10_eth_0.01.json.zipdeposits_10_eth_0.1.json.zipdeposits_11155111_eth_0.1.json.zipdeposits_11155111_eth_1.json.zipdeposits_137_matic_100.json.zipdeposits_137_matic_1000.json.zipdeposits_137_matic_10000.json.zipdeposits_137_matic_100000.json.zipdeposits_1_dai_100.json.zipdeposits_1_dai_10000.json.zipdeposits_1_dai_100000.json.zipdeposits_1_eth_0.1.json.zipdeposits_1_eth_1.json.zipdeposits_1_eth_10.json.zipdeposits_1_eth_100.json.zipdeposits_42161_eth_0.001.json.zipdeposits_42161_eth_0.01.json.zipdeposits_42161_eth_0.1.json.zipdeposits_42161_eth_1.json.zipdeposits_42161_eth_10.json.zipdeposits_43114_avax_10.json.zipdeposits_43114_avax_100.json.zipdeposits_43114_avax_500.json.zipdeposits_56_bnb_0.1.json.zipdeposits_56_bnb_1.json.zipdeposits_56_bnb_10.json.zipdeposits_56_bnb_100.json.zipdeposits_56_btcb_0.0001.json.zipdeposits_56_btcb_0.001.json.zipdeposits_56_btcb_0.01.json.zipdeposits_56_btcb_0.1.json.zipdeposits_56_usdt_10.json.zipdeposits_56_usdt_100.json.zipdeposits_56_usdt_1000.json.zipdeposits_56_usdt_10000.json.zipdeposits_81457_eth_0.001.json.zipdeposits_81457_eth_0.01.json.zipdeposits_81457_eth_0.1.json.zipdeposits_81457_eth_1.json.zipdeposits_81457_eth_10.json.zipdeposits_81457_eth_100.json.zipdeposits_8453_dai_10.json.zipdeposits_8453_dai_100.json.zipdeposits_8453_dai_1000.json.zipdeposits_8453_dai_10000.json.zipdeposits_8453_dai_100000.json.zipdeposits_8453_eth_0.001.json.zipdeposits_8453_eth_0.01.json.zipdeposits_8453_eth_0.1.json.zipdeposits_8453_eth_1.json.zipdeposits_8453_eth_10.json.zipdeposits_8453_eth_100.json.zipdeposits_8453_tbtc_0.0001.json.zipdeposits_8453_tbtc_0.001.json.zipdeposits_8453_tbtc_0.01.json.zipdeposits_8453_tbtc_0.1.json.zipdeposits_8453_tbtc_1.json.zipecho_1.json.zipecho_10.json.zipecho_11155111.json.zipecho_137.json.zipecho_42161.json.zipecho_56.json.zipecho_81457.json.zipecho_8453.json.zipencrypted_notes_1.json.zipencrypted_notes_10.json.zipencrypted_notes_11155111.json.zipencrypted_notes_137.json.zipencrypted_notes_42161.json.zipencrypted_notes_56.json.zipencrypted_notes_81457.json.zipencrypted_notes_8453.json.zipgovernance_1.json.zipregistered_1.json.zipregistered_11155111.json.zipregistry_1.json.zipregistry_11155111.json.ziprelayers.jsonrelayers.json.ziprevenue_1.json.ziprevenue_11155111.json.ziptornado_1.json.ziptornado_10.json.ziptornado_100.json.zip
103
.eslintrc.js
103
.eslintrc.js
@ -1,65 +1,44 @@
|
||||
module.exports = {
|
||||
"env": {
|
||||
"es2021": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:import/recommended",
|
||||
"plugin:import/typescript",
|
||||
"prettier",
|
||||
"plugin:prettier/recommended",
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
"files": [
|
||||
".eslintrc.{js,cjs}"
|
||||
],
|
||||
"parserOptions": {
|
||||
"sourceType": "script"
|
||||
}
|
||||
}
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": [
|
||||
"@typescript-eslint",
|
||||
"prettier"
|
||||
],
|
||||
"rules": {
|
||||
"prettier/prettier": [
|
||||
"error",
|
||||
{
|
||||
singleQuote: true,
|
||||
printWidth: 120
|
||||
}
|
||||
env: {
|
||||
es2021: true,
|
||||
node: true,
|
||||
},
|
||||
extends: [
|
||||
'prettier',
|
||||
'eslint:recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:import/recommended',
|
||||
'plugin:import/typescript',
|
||||
'plugin:prettier/recommended',
|
||||
],
|
||||
"import/order": ["error"],
|
||||
/**
|
||||
"indent": [
|
||||
"error",
|
||||
2
|
||||
overrides: [
|
||||
{
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
files: ['.eslintrc.{js,cjs}'],
|
||||
parserOptions: {
|
||||
sourceType: 'script',
|
||||
},
|
||||
},
|
||||
],
|
||||
**/
|
||||
"linebreak-style": [
|
||||
"error",
|
||||
"unix"
|
||||
],
|
||||
"quotes": [
|
||||
"error",
|
||||
"single"
|
||||
],
|
||||
"semi": [
|
||||
"error",
|
||||
"always"
|
||||
],
|
||||
"@typescript-eslint/no-unused-vars": ["warn"]
|
||||
}
|
||||
}
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['@typescript-eslint', 'prettier'],
|
||||
rules: {
|
||||
'prettier/prettier': [
|
||||
'error',
|
||||
{
|
||||
tabWidth: 4,
|
||||
printWidth: 120,
|
||||
singleQuote: true,
|
||||
},
|
||||
],
|
||||
'import/order': ['error'],
|
||||
'@typescript-eslint/no-unused-vars': ['warn'],
|
||||
'@typescript-eslint/no-unused-expressions': ['off'],
|
||||
},
|
||||
};
|
||||
|
1
.npmrc
Normal file
1
.npmrc
Normal file
@ -0,0 +1 @@
|
||||
@tornado:registry=https://git.tornado.ws/api/packages/tornado-packages/npm/
|
33019
dist/cli.js
vendored
33019
dist/cli.js
vendored
File diff suppressed because one or more lines are too long
30
dist/program.d.ts
vendored
30
dist/program.d.ts
vendored
@ -1,13 +1,11 @@
|
||||
import 'dotenv/config';
|
||||
import { Command } from 'commander';
|
||||
import { JsonRpcProvider, Provider, TransactionLike, Wallet, VoidSigner } from 'ethers';
|
||||
import { getProviderOptions, TornadoWallet, TornadoVoidSigner, RelayerInfo, RelayerError, RelayerClient, fetchDataOptions, NetIdType, Config } from '@tornado/core';
|
||||
export type commonProgramOptions = {
|
||||
import { getProviderOptions, TornadoWallet, TornadoVoidSigner, RelayerInfo, RelayerError, RelayerClient, fetchDataOptions, NetIdType, TovarishClient, TovarishInfo } from '@tornado/core';
|
||||
export interface commonProgramOptions {
|
||||
rpc?: string;
|
||||
ethRpc?: string;
|
||||
graph?: string;
|
||||
ethGraph?: string;
|
||||
disableGraph?: boolean;
|
||||
disableTovarish?: boolean;
|
||||
accountKey?: string;
|
||||
relayer?: string;
|
||||
walletWithdrawal?: boolean;
|
||||
@ -19,7 +17,7 @@ export type commonProgramOptions = {
|
||||
privateKey?: string;
|
||||
nonInteractive?: boolean;
|
||||
localRpc?: boolean;
|
||||
};
|
||||
}
|
||||
export declare function promptConfirmation(nonInteractive?: boolean): Promise<void>;
|
||||
export declare function getIPAddress(fetchDataOptions: fetchDataOptions): Promise<{
|
||||
ip: any;
|
||||
@ -29,8 +27,7 @@ export declare function getProgramOptions(options: commonProgramOptions): Promis
|
||||
options: commonProgramOptions;
|
||||
fetchDataOptions: fetchDataOptions;
|
||||
}>;
|
||||
export declare function getProgramGraphAPI(options: commonProgramOptions, config: Config): string;
|
||||
export declare function getProgramProvider(netId: NetIdType, rpcUrl: string | undefined, config: Config, providerOptions?: getProviderOptions): JsonRpcProvider;
|
||||
export declare function getProgramProvider(rpcUrl: string | undefined, providerOptions: getProviderOptions): Promise<JsonRpcProvider>;
|
||||
export declare function getProgramSigner({ options, provider, }: {
|
||||
options: commonProgramOptions;
|
||||
provider: Provider;
|
||||
@ -40,13 +37,22 @@ export declare function getProgramRelayer({ options, fetchDataOptions, netId, }:
|
||||
fetchDataOptions?: fetchDataOptions;
|
||||
netId: NetIdType;
|
||||
}): Promise<{
|
||||
validRelayers?: RelayerInfo[];
|
||||
invalidRelayers?: RelayerError[];
|
||||
relayerClient?: RelayerClient;
|
||||
validRelayers: RelayerInfo[];
|
||||
invalidRelayers: RelayerError[];
|
||||
relayerClient: RelayerClient;
|
||||
}>;
|
||||
export declare function getTovarishRelayer({ options, fetchDataOptions, netId, }: {
|
||||
options: commonProgramOptions;
|
||||
fetchDataOptions?: fetchDataOptions;
|
||||
netId: NetIdType;
|
||||
}): Promise<{
|
||||
validRelayers: TovarishInfo[];
|
||||
invalidRelayers: RelayerError[];
|
||||
relayerClient: TovarishClient;
|
||||
}>;
|
||||
export declare function programSendTransaction({ signer, options, populatedTransaction, }: {
|
||||
signer: VoidSigner | Wallet;
|
||||
options: commonProgramOptions;
|
||||
populatedTransaction: TransactionLike;
|
||||
}): Promise<void>;
|
||||
}): Promise<import("ethers").TransactionResponse | undefined>;
|
||||
export declare function tornadoProgram(): Command;
|
||||
|
6
dist/services/data.d.ts
vendored
6
dist/services/data.d.ts
vendored
@ -1,12 +1,9 @@
|
||||
import { AsyncZippable, Unzipped } from 'fflate';
|
||||
import { BaseEvents, CachedEvents, MinimalEvents } from '@tornado/core';
|
||||
export declare function existsAsync(fileOrDir: string): Promise<boolean>;
|
||||
/**
|
||||
* Supports legacy gz format for legacy UI
|
||||
*/
|
||||
export declare function deflateAsync(data: Uint8Array): Promise<Buffer>;
|
||||
export declare function zipAsync(file: AsyncZippable): Promise<Uint8Array>;
|
||||
export declare function unzipAsync(data: Uint8Array): Promise<Unzipped>;
|
||||
export declare function saveLegacyFile({ fileName, userDirectory, dataString, }: {
|
||||
fileName: string;
|
||||
userDirectory: string;
|
||||
@ -17,10 +14,9 @@ export declare function saveUserFile({ fileName, userDirectory, dataString, }: {
|
||||
userDirectory: string;
|
||||
dataString: string;
|
||||
}): Promise<void>;
|
||||
export declare function loadSavedEvents<T extends MinimalEvents>({ name, userDirectory, deployedBlock, }: {
|
||||
export declare function loadSavedEvents<T extends MinimalEvents>({ name, userDirectory, }: {
|
||||
name: string;
|
||||
userDirectory: string;
|
||||
deployedBlock: number;
|
||||
}): Promise<BaseEvents<T>>;
|
||||
export declare function download({ name, cacheDirectory }: {
|
||||
name: string;
|
||||
|
94
dist/services/nodeEvents.d.ts
vendored
94
dist/services/nodeEvents.d.ts
vendored
@ -1,78 +1,82 @@
|
||||
import { BatchBlockOnProgress, BatchEventOnProgress, BaseTornadoService, BaseEncryptedNotesService, BaseGovernanceService, BaseRegistryService, BaseTornadoServiceConstructor, BaseEncryptedNotesServiceConstructor, BaseGovernanceServiceConstructor, BaseRegistryServiceConstructor, BaseEchoServiceConstructor, BaseEchoService, CachedRelayers } from '@tornado/core';
|
||||
import type { BaseEvents, DepositsEvents, WithdrawalsEvents, EncryptedNotesEvents, RegistersEvents, AllGovernanceEvents, EchoEvents } from '@tornado/core';
|
||||
export type NodeTornadoServiceConstructor = BaseTornadoServiceConstructor & {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
import { BatchBlockOnProgress, BatchEventOnProgress, BaseTornadoService, BaseEncryptedNotesService, BaseGovernanceService, BaseRegistryService, BaseRevenueService, BaseTornadoServiceConstructor, BaseEncryptedNotesServiceConstructor, BaseGovernanceServiceConstructor, BaseRegistryServiceConstructor, BaseRevenueServiceConstructor, BaseEchoServiceConstructor, BaseEchoService, CachedRelayers, BaseEvents, DepositsEvents, WithdrawalsEvents, EncryptedNotesEvents, AllRelayerRegistryEvents, AllGovernanceEvents, EchoEvents, StakeBurnedEvents } from '@tornado/core';
|
||||
import { TreeCache } from './treeCache';
|
||||
export type NodeServiceConstructor = {
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
};
|
||||
export type NodeTornadoServiceConstructor = BaseTornadoServiceConstructor & NodeServiceConstructor & {
|
||||
nativeCurrency: string;
|
||||
treeCache?: TreeCache;
|
||||
};
|
||||
export declare class NodeTornadoService extends BaseTornadoService {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
constructor({ netId, provider, graphApi, subgraphName, Tornado, type, amount, currency, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeTornadoServiceConstructor);
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
nativeCurrency: string;
|
||||
treeCache?: TreeCache;
|
||||
constructor(serviceConstructor: NodeTornadoServiceConstructor);
|
||||
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateTransactionProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
|
||||
updateBlockProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
|
||||
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
getEventsFromDB(): Promise<BaseEvents<DepositsEvents | WithdrawalsEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<DepositsEvents | WithdrawalsEvents>>;
|
||||
validateEvents<S>({ events, lastBlock, hasNewEvents, }: BaseEvents<DepositsEvents | WithdrawalsEvents> & {
|
||||
hasNewEvents?: boolean;
|
||||
}): Promise<S>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<DepositsEvents | WithdrawalsEvents>): Promise<void>;
|
||||
}
|
||||
export type NodeEchoServiceConstructor = BaseEchoServiceConstructor & {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
};
|
||||
export type NodeEchoServiceConstructor = BaseEchoServiceConstructor & NodeServiceConstructor;
|
||||
export declare class NodeEchoService extends BaseEchoService {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
constructor({ netId, provider, graphApi, subgraphName, Echoer, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeEchoServiceConstructor);
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
constructor(serviceConstructor: NodeEchoServiceConstructor);
|
||||
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
getEventsFromDB(): Promise<BaseEvents<EchoEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<EchoEvents>>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<EchoEvents>): Promise<void>;
|
||||
}
|
||||
export type NodeEncryptedNotesServiceConstructor = BaseEncryptedNotesServiceConstructor & {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
};
|
||||
export type NodeEncryptedNotesServiceConstructor = BaseEncryptedNotesServiceConstructor & NodeServiceConstructor;
|
||||
export declare class NodeEncryptedNotesService extends BaseEncryptedNotesService {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
constructor({ netId, provider, graphApi, subgraphName, Router, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeEncryptedNotesServiceConstructor);
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
constructor(serviceConstructor: NodeEncryptedNotesServiceConstructor);
|
||||
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
getEventsFromDB(): Promise<BaseEvents<EncryptedNotesEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<EncryptedNotesEvents>>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<EncryptedNotesEvents>): Promise<void>;
|
||||
}
|
||||
export type NodeGovernanceServiceConstructor = BaseGovernanceServiceConstructor & {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
};
|
||||
export type NodeGovernanceServiceConstructor = BaseGovernanceServiceConstructor & NodeServiceConstructor;
|
||||
export declare class NodeGovernanceService extends BaseGovernanceService {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
constructor({ netId, provider, graphApi, subgraphName, Governance, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeGovernanceServiceConstructor);
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
constructor(serviceConstructor: NodeGovernanceServiceConstructor);
|
||||
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateTransactionProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
|
||||
getEventsFromDB(): Promise<BaseEvents<AllGovernanceEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<AllGovernanceEvents>>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<AllGovernanceEvents>): Promise<void>;
|
||||
}
|
||||
export type NodeRegistryServiceConstructor = BaseRegistryServiceConstructor & {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
};
|
||||
export type NodeRegistryServiceConstructor = BaseRegistryServiceConstructor & NodeServiceConstructor;
|
||||
export declare class NodeRegistryService extends BaseRegistryService {
|
||||
cacheDirectory?: string;
|
||||
userDirectory?: string;
|
||||
constructor({ netId, provider, graphApi, subgraphName, RelayerRegistry, Aggregator, relayerEnsSubdomains, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeRegistryServiceConstructor);
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
constructor(serviceConstructor: NodeRegistryServiceConstructor);
|
||||
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
getEventsFromDB(): Promise<BaseEvents<RegistersEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<RegistersEvents>>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<RegistersEvents>): Promise<void>;
|
||||
getEventsFromDB(): Promise<BaseEvents<AllRelayerRegistryEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<AllRelayerRegistryEvents>>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<AllRelayerRegistryEvents>): Promise<void>;
|
||||
getRelayersFromDB(): Promise<CachedRelayers>;
|
||||
getRelayersFromCache(): Promise<CachedRelayers>;
|
||||
saveRelayers({ timestamp, relayers }: CachedRelayers): Promise<void>;
|
||||
saveRelayers({ lastBlock, timestamp, relayers }: CachedRelayers): Promise<void>;
|
||||
}
|
||||
export type NodeRevenueServiceConstructor = BaseRevenueServiceConstructor & NodeServiceConstructor;
|
||||
export declare class NodeRevenueService extends BaseRevenueService {
|
||||
cacheDirectory: string;
|
||||
userDirectory: string;
|
||||
constructor(serviceConstructor: NodeRevenueServiceConstructor);
|
||||
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
|
||||
updateTransactionProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
|
||||
updateBlockProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
|
||||
getEventsFromDB(): Promise<BaseEvents<StakeBurnedEvents>>;
|
||||
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<StakeBurnedEvents>>;
|
||||
saveEvents({ events, lastBlock }: BaseEvents<StakeBurnedEvents>): Promise<void>;
|
||||
}
|
||||
|
163
package.json
163
package.json
@ -1,82 +1,85 @@
|
||||
{
|
||||
"name": "@tornado/cli",
|
||||
"version": "1.0.4-alpha",
|
||||
"description": "Modern Toolsets for Privacy Pools on Ethereum",
|
||||
"main": "./dist/cli.js",
|
||||
"types": "./dist/cli.d.ts",
|
||||
"bin": {
|
||||
"tornado-cli": "./dist/cli.js"
|
||||
},
|
||||
"scripts": {
|
||||
"typechain": "typechain --target ethers-v6 --out-dir src/typechain src/abi/*.json",
|
||||
"types": "tsc --declaration --emitDeclarationOnly",
|
||||
"lint": "eslint src/**/*.ts --ext .ts --ignore-pattern src/typechain",
|
||||
"copy:worker": "ts-node scripts/copyFile.ts node_modules/@tornado/core/dist/merkleTreeWorker.js static/merkleTreeWorker.js",
|
||||
"build:node": "webpack",
|
||||
"build": "yarn types && yarn build:node",
|
||||
"start": "ts-node src/cli.ts",
|
||||
"help": "ts-node src/cli.ts help",
|
||||
"create": "ts-node src/cli.ts create",
|
||||
"deposit": "ts-node src/cli.ts deposit",
|
||||
"depositInvoice": "ts-node src/cli.ts depositInvoice",
|
||||
"withdraw": "ts-node src/cli.ts withdraw",
|
||||
"compliance": "ts-node src/cli.ts compliance",
|
||||
"updateEvents": "ts-node src/cli.ts updateEvents",
|
||||
"relayers": "ts-node src/cli.ts relayers",
|
||||
"createAccount": "ts-node src/cli.ts createAccount",
|
||||
"decryptNotes": "ts-node src/cli.ts decryptNotes",
|
||||
"send": "ts-node src/cli.ts send",
|
||||
"balance": "ts-node src/cli.ts balance",
|
||||
"sign": "ts-node src/cli.ts sign",
|
||||
"broadcast": "ts-node src/cli.ts broadcast"
|
||||
},
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"dist",
|
||||
"scripts",
|
||||
"src",
|
||||
"static",
|
||||
".env.example",
|
||||
".eslintrc.js",
|
||||
".gitattributes",
|
||||
".gitignore",
|
||||
".npmrc",
|
||||
"logo.png",
|
||||
"logo2.png",
|
||||
"tsconfig.json",
|
||||
"yarn.lock"
|
||||
],
|
||||
"dependencies": {},
|
||||
"optionalDependencies": {},
|
||||
"devDependencies": {
|
||||
"@colors/colors": "1.5.0",
|
||||
"@tornado/core": "git+https://codeberg.org/tornadocash/tornado-core.git#ef56beb29b3dc8808167acefe2bd23c2680643b2",
|
||||
"@typechain/ethers-v6": "^0.5.1",
|
||||
"@types/figlet": "^1.5.8",
|
||||
"@typescript-eslint/eslint-plugin": "^8.6.0",
|
||||
"@typescript-eslint/parser": "^8.6.0",
|
||||
"bloomfilter.js": "^1.0.2",
|
||||
"cli-table3": "^0.6.4",
|
||||
"commander": "^12.0.0",
|
||||
"dotenv": "^16.4.5",
|
||||
"esbuild-loader": "^4.2.2",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-import-resolver-typescript": "^3.6.3",
|
||||
"eslint-plugin-import": "^2.30.0",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"figlet": "^1.7.0",
|
||||
"http-proxy-agent": "^7.0.2",
|
||||
"https-proxy-agent": "^7.0.4",
|
||||
"moment": "^2.30.1",
|
||||
"prettier": "^3.2.5",
|
||||
"socks-proxy-agent": "^8.0.3",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsc": "^2.0.4",
|
||||
"typechain": "^8.3.2",
|
||||
"typescript": "^5.6.2",
|
||||
"webpack": "^5.94.0",
|
||||
"webpack-cli": "^5.1.4"
|
||||
}
|
||||
"name": "@tornado/cli",
|
||||
"version": "1.0.11-alpha",
|
||||
"description": "Modern Toolsets for Privacy Pools on Ethereum",
|
||||
"main": "./dist/cli.js",
|
||||
"types": "./dist/cli.d.ts",
|
||||
"bin": {
|
||||
"tornado-cli": "./dist/cli.js"
|
||||
},
|
||||
"scripts": {
|
||||
"typechain": "typechain --target ethers-v6 --out-dir src/typechain src/abi/*.json",
|
||||
"types": "tsc --declaration --emitDeclarationOnly",
|
||||
"lint": "eslint src/**/*.ts --ext .ts --ignore-pattern src/typechain",
|
||||
"copy:worker": "ts-node scripts/copyFile.ts node_modules/@tornado/core/dist/merkleTreeWorker.js static/merkleTreeWorker.js",
|
||||
"build:node": "webpack",
|
||||
"build": "yarn types && yarn build:node",
|
||||
"start": "ts-node src/cli.ts",
|
||||
"help": "ts-node src/cli.ts help",
|
||||
"create": "ts-node src/cli.ts create",
|
||||
"deposit": "ts-node src/cli.ts deposit",
|
||||
"depositInvoice": "ts-node src/cli.ts depositInvoice",
|
||||
"withdraw": "ts-node src/cli.ts withdraw",
|
||||
"compliance": "ts-node src/cli.ts compliance",
|
||||
"updateEvents": "ts-node src/cli.ts updateEvents",
|
||||
"relayers": "ts-node src/cli.ts relayers",
|
||||
"createAccount": "ts-node src/cli.ts createAccount",
|
||||
"decrypt": "ts-node src/cli.ts decrypt",
|
||||
"send": "ts-node src/cli.ts send",
|
||||
"balance": "ts-node src/cli.ts balance",
|
||||
"sign": "ts-node src/cli.ts sign",
|
||||
"broadcast": "ts-node src/cli.ts broadcast",
|
||||
"proposals": "ts-node src/cli.ts proposals",
|
||||
"delegates": "ts-node src/cli.ts delegates",
|
||||
"apy": "ts-node src/cli.ts apy"
|
||||
},
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"dist",
|
||||
"scripts",
|
||||
"src",
|
||||
"static",
|
||||
".env.example",
|
||||
".eslintrc.js",
|
||||
".gitattributes",
|
||||
".gitignore",
|
||||
".npmrc",
|
||||
"logo.png",
|
||||
"logo2.png",
|
||||
"tsconfig.json",
|
||||
"yarn.lock"
|
||||
],
|
||||
"dependencies": {},
|
||||
"optionalDependencies": {},
|
||||
"devDependencies": {
|
||||
"@colors/colors": "^1.6.0",
|
||||
"@tornado/core": "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#092989ebaa2fcd84eff7d4aed66433e77c790c60",
|
||||
"@typechain/ethers-v6": "^0.5.1",
|
||||
"@types/figlet": "^1.7.0",
|
||||
"@typescript-eslint/eslint-plugin": "^8.11.0",
|
||||
"@typescript-eslint/parser": "^8.11.0",
|
||||
"bloomfilter.js": "^1.0.2",
|
||||
"cli-table3": "^0.6.4",
|
||||
"commander": "^12.0.0",
|
||||
"dotenv": "^16.4.5",
|
||||
"esbuild-loader": "^4.2.2",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-import-resolver-typescript": "^3.6.3",
|
||||
"eslint-plugin-import": "^2.31.0",
|
||||
"eslint-plugin-prettier": "^5.2.1",
|
||||
"figlet": "^1.8.0",
|
||||
"http-proxy-agent": "^7.0.2",
|
||||
"https-proxy-agent": "^7.0.4",
|
||||
"moment": "^2.30.1",
|
||||
"prettier": "^3.2.5",
|
||||
"socks-proxy-agent": "^8.0.3",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsc": "^2.0.4",
|
||||
"typechain": "^8.3.2",
|
||||
"typescript": "^5.6.3",
|
||||
"webpack": "^5.95.0",
|
||||
"webpack-cli": "^5.1.4"
|
||||
}
|
||||
}
|
||||
|
@ -2,14 +2,14 @@ import { argv } from 'process';
|
||||
import { copyFile } from 'fs';
|
||||
|
||||
function copyFiles() {
|
||||
const [, , inFile, outFile] = argv;
|
||||
const [, , inFile, outFile] = argv;
|
||||
|
||||
copyFile(inFile, outFile, function(err) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
copyFile(inFile, outFile, function(err) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
console.log(`Copied ${inFile} to ${outFile}`)
|
||||
})
|
||||
console.log(`Copied ${inFile} to ${outFile}`)
|
||||
})
|
||||
}
|
||||
copyFiles()
|
4430
src/program.ts
4430
src/program.ts
File diff suppressed because it is too large
Load Diff
@ -1,194 +1,167 @@
|
||||
import path from 'path';
|
||||
import { deflate, constants } from 'zlib';
|
||||
import { stat, mkdir, readFile, writeFile } from 'fs/promises';
|
||||
import { zip, unzip, AsyncZippable, Unzipped } from 'fflate';
|
||||
import { BaseEvents, CachedEvents, MinimalEvents } from '@tornado/core';
|
||||
import { BaseEvents, CachedEvents, MinimalEvents, zipAsync, unzipAsync } from '@tornado/core';
|
||||
|
||||
export async function existsAsync(fileOrDir: string): Promise<boolean> {
|
||||
try {
|
||||
await stat(fileOrDir);
|
||||
try {
|
||||
await stat(fileOrDir);
|
||||
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Supports legacy gz format for legacy UI
|
||||
*/
|
||||
export function deflateAsync(data: Uint8Array): Promise<Buffer> {
|
||||
return new Promise((resolve, reject) => {
|
||||
deflate(
|
||||
data,
|
||||
{
|
||||
level: constants.Z_BEST_COMPRESSION,
|
||||
strategy: constants.Z_FILTERED,
|
||||
},
|
||||
(err, buffer) => {
|
||||
if (!err) {
|
||||
resolve(buffer);
|
||||
} else {
|
||||
reject(err);
|
||||
}
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
export function zipAsync(file: AsyncZippable): Promise<Uint8Array> {
|
||||
return new Promise((res, rej) => {
|
||||
zip(file, { mtime: new Date('1/1/1980') }, (err, data) => {
|
||||
if (err) {
|
||||
rej(err);
|
||||
return;
|
||||
}
|
||||
res(data);
|
||||
return new Promise((resolve, reject) => {
|
||||
deflate(
|
||||
data,
|
||||
{
|
||||
level: constants.Z_BEST_COMPRESSION,
|
||||
strategy: constants.Z_FILTERED,
|
||||
},
|
||||
(err, buffer) => {
|
||||
if (!err) {
|
||||
resolve(buffer);
|
||||
} else {
|
||||
reject(err);
|
||||
}
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function unzipAsync(data: Uint8Array): Promise<Unzipped> {
|
||||
return new Promise((res, rej) => {
|
||||
unzip(data, {}, (err, data) => {
|
||||
if (err) {
|
||||
rej(err);
|
||||
return;
|
||||
}
|
||||
res(data);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export async function saveLegacyFile({
|
||||
fileName,
|
||||
userDirectory,
|
||||
dataString,
|
||||
fileName,
|
||||
userDirectory,
|
||||
dataString,
|
||||
}: {
|
||||
fileName: string;
|
||||
userDirectory: string;
|
||||
dataString: string;
|
||||
fileName: string;
|
||||
userDirectory: string;
|
||||
dataString: string;
|
||||
}) {
|
||||
fileName = fileName.toLowerCase();
|
||||
fileName = fileName.toLowerCase();
|
||||
|
||||
const filePath = path.join(userDirectory, fileName);
|
||||
const filePath = path.join(userDirectory, fileName);
|
||||
|
||||
const payload = await deflateAsync(new TextEncoder().encode(dataString));
|
||||
const payload = await deflateAsync(new TextEncoder().encode(dataString));
|
||||
|
||||
if (!(await existsAsync(userDirectory))) {
|
||||
await mkdir(userDirectory, { recursive: true });
|
||||
}
|
||||
if (!(await existsAsync(userDirectory))) {
|
||||
await mkdir(userDirectory, { recursive: true });
|
||||
}
|
||||
|
||||
await writeFile(filePath + '.gz', payload);
|
||||
await writeFile(filePath + '.gz', payload);
|
||||
}
|
||||
|
||||
export async function saveUserFile({
|
||||
fileName,
|
||||
userDirectory,
|
||||
dataString,
|
||||
fileName,
|
||||
userDirectory,
|
||||
dataString,
|
||||
}: {
|
||||
fileName: string;
|
||||
userDirectory: string;
|
||||
dataString: string;
|
||||
fileName: string;
|
||||
userDirectory: string;
|
||||
dataString: string;
|
||||
}) {
|
||||
fileName = fileName.toLowerCase();
|
||||
fileName = fileName.toLowerCase();
|
||||
|
||||
const filePath = path.join(userDirectory, fileName);
|
||||
const filePath = path.join(userDirectory, fileName);
|
||||
|
||||
const payload = await zipAsync({
|
||||
[fileName]: new TextEncoder().encode(dataString),
|
||||
});
|
||||
const payload = await zipAsync({
|
||||
[fileName]: new TextEncoder().encode(dataString),
|
||||
});
|
||||
|
||||
if (!(await existsAsync(userDirectory))) {
|
||||
await mkdir(userDirectory, { recursive: true });
|
||||
}
|
||||
if (!(await existsAsync(userDirectory))) {
|
||||
await mkdir(userDirectory, { recursive: true });
|
||||
}
|
||||
|
||||
await writeFile(filePath + '.zip', payload);
|
||||
await writeFile(filePath, dataString);
|
||||
await writeFile(filePath + '.zip', payload);
|
||||
await writeFile(filePath, dataString);
|
||||
}
|
||||
|
||||
export async function loadSavedEvents<T extends MinimalEvents>({
|
||||
name,
|
||||
userDirectory,
|
||||
deployedBlock,
|
||||
name,
|
||||
userDirectory,
|
||||
}: {
|
||||
name: string;
|
||||
userDirectory: string;
|
||||
deployedBlock: number;
|
||||
name: string;
|
||||
userDirectory: string;
|
||||
}): Promise<BaseEvents<T>> {
|
||||
const filePath = path.join(userDirectory, `${name}.json`.toLowerCase());
|
||||
const filePath = path.join(userDirectory, `${name}.json`.toLowerCase());
|
||||
|
||||
if (!(await existsAsync(filePath))) {
|
||||
return {
|
||||
events: [] as T[],
|
||||
lastBlock: null,
|
||||
};
|
||||
}
|
||||
if (!(await existsAsync(filePath))) {
|
||||
return {
|
||||
events: [] as T[],
|
||||
lastBlock: 0,
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const events = JSON.parse(await readFile(filePath, { encoding: 'utf8' })) as T[];
|
||||
try {
|
||||
const events = JSON.parse(await readFile(filePath, { encoding: 'utf8' })) as T[];
|
||||
|
||||
return {
|
||||
events,
|
||||
lastBlock: events && events.length ? events[events.length - 1].blockNumber : deployedBlock,
|
||||
};
|
||||
} catch (err) {
|
||||
console.log('Method loadSavedEvents has error');
|
||||
console.log(err);
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock,
|
||||
};
|
||||
}
|
||||
return {
|
||||
events,
|
||||
lastBlock: events[events.length - 1]?.blockNumber || 0,
|
||||
};
|
||||
} catch (err) {
|
||||
console.log('Method loadSavedEvents has error');
|
||||
console.log(err);
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export async function download({ name, cacheDirectory }: { name: string; cacheDirectory: string }) {
|
||||
const fileName = `${name}.json`.toLowerCase();
|
||||
const zipName = `${fileName}.zip`;
|
||||
const zipPath = path.join(cacheDirectory, zipName);
|
||||
const fileName = `${name}.json`.toLowerCase();
|
||||
const zipName = `${fileName}.zip`;
|
||||
const zipPath = path.join(cacheDirectory, zipName);
|
||||
|
||||
const data = await readFile(zipPath);
|
||||
const { [fileName]: content } = await unzipAsync(data);
|
||||
const data = await readFile(zipPath);
|
||||
const { [fileName]: content } = await unzipAsync(data);
|
||||
|
||||
return new TextDecoder().decode(content);
|
||||
return new TextDecoder().decode(content);
|
||||
}
|
||||
|
||||
export async function loadCachedEvents<T extends MinimalEvents>({
|
||||
name,
|
||||
cacheDirectory,
|
||||
deployedBlock,
|
||||
name,
|
||||
cacheDirectory,
|
||||
deployedBlock,
|
||||
}: {
|
||||
name: string;
|
||||
cacheDirectory: string;
|
||||
deployedBlock: number;
|
||||
name: string;
|
||||
cacheDirectory: string;
|
||||
deployedBlock: number;
|
||||
}): Promise<CachedEvents<T>> {
|
||||
try {
|
||||
const module = await download({ cacheDirectory, name });
|
||||
try {
|
||||
const module = await download({ cacheDirectory, name });
|
||||
|
||||
if (module) {
|
||||
const events = JSON.parse(module);
|
||||
if (module) {
|
||||
const events = JSON.parse(module);
|
||||
|
||||
const lastBlock = events && events.length ? events[events.length - 1].blockNumber : deployedBlock;
|
||||
const lastBlock = events && events.length ? events[events.length - 1].blockNumber : deployedBlock;
|
||||
|
||||
return {
|
||||
events,
|
||||
lastBlock,
|
||||
fromCache: true,
|
||||
};
|
||||
return {
|
||||
events,
|
||||
lastBlock,
|
||||
fromCache: true,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock,
|
||||
fromCache: true,
|
||||
};
|
||||
} catch (err) {
|
||||
console.log('Method loadCachedEvents has error');
|
||||
console.log(err);
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock,
|
||||
fromCache: true,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock,
|
||||
fromCache: true,
|
||||
};
|
||||
} catch (err) {
|
||||
console.log('Method loadCachedEvents has error');
|
||||
console.log(err);
|
||||
return {
|
||||
events: [],
|
||||
lastBlock: deployedBlock,
|
||||
fromCache: true,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3,75 +3,75 @@ import { computeAddress, getAddress, Mnemonic } from 'ethers';
|
||||
import { validateUrl } from '@tornado/core';
|
||||
|
||||
export function parseNumber(value?: string | number): number {
|
||||
if (!value || isNaN(Number(value))) {
|
||||
throw new InvalidArgumentError('Invalid Number');
|
||||
}
|
||||
return Number(value);
|
||||
if (!value || isNaN(Number(value))) {
|
||||
throw new InvalidArgumentError('Invalid Number');
|
||||
}
|
||||
return Number(value);
|
||||
}
|
||||
|
||||
export function parseUrl(value?: string): string {
|
||||
if (!value || !validateUrl(value, ['http:', 'https:'])) {
|
||||
throw new InvalidArgumentError('Invalid URL');
|
||||
}
|
||||
return value;
|
||||
if (!value || !validateUrl(value, ['http:', 'https:'])) {
|
||||
throw new InvalidArgumentError('Invalid URL');
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
export function parseRelayer(value?: string): string {
|
||||
if (!value || !(value.endsWith('.eth') || validateUrl(value, ['http:', 'https:']))) {
|
||||
throw new InvalidArgumentError('Invalid Relayer ETH address or URL');
|
||||
}
|
||||
return value;
|
||||
if (!value || !(value.endsWith('.eth') || validateUrl(value, ['http:', 'https:']))) {
|
||||
throw new InvalidArgumentError('Invalid Relayer ETH address or URL');
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
export function parseAddress(value?: string): string {
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Address');
|
||||
}
|
||||
try {
|
||||
return getAddress(value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Address');
|
||||
}
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Address');
|
||||
}
|
||||
try {
|
||||
return getAddress(value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Address');
|
||||
}
|
||||
}
|
||||
|
||||
export function parseMnemonic(value?: string): string {
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Mnemonic');
|
||||
}
|
||||
try {
|
||||
Mnemonic.fromPhrase(value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Mnemonic');
|
||||
}
|
||||
return value;
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Mnemonic');
|
||||
}
|
||||
try {
|
||||
Mnemonic.fromPhrase(value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Mnemonic');
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
export function parseKey(value?: string): string {
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Private Key');
|
||||
}
|
||||
if (value.length === 64) {
|
||||
value = '0x' + value;
|
||||
}
|
||||
try {
|
||||
computeAddress(value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Private Key');
|
||||
}
|
||||
return value;
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Private Key');
|
||||
}
|
||||
if (value.length === 64) {
|
||||
value = '0x' + value;
|
||||
}
|
||||
try {
|
||||
computeAddress(value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Private Key');
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Recovery key shouldn't have a 0x prefix (Also this is how the UI generates)
|
||||
*/
|
||||
export function parseRecoveryKey(value?: string): string {
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Recovery Key');
|
||||
}
|
||||
try {
|
||||
computeAddress('0x' + value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Recovery Key');
|
||||
}
|
||||
return value;
|
||||
if (!value) {
|
||||
throw new InvalidArgumentError('Invalid Recovery Key');
|
||||
}
|
||||
try {
|
||||
computeAddress('0x' + value);
|
||||
} catch {
|
||||
throw new InvalidArgumentError('Invalid Recovery Key');
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
@ -10,104 +10,104 @@ import type { NetIdType } from '@tornado/core';
|
||||
import { saveUserFile } from './data';
|
||||
|
||||
export interface TreeCacheConstructor {
|
||||
netId: NetIdType;
|
||||
amount: string;
|
||||
currency: string;
|
||||
userDirectory: string;
|
||||
PARTS_COUNT?: number;
|
||||
LEAVES?: number;
|
||||
zeroElement?: string;
|
||||
netId: NetIdType;
|
||||
amount: string;
|
||||
currency: string;
|
||||
userDirectory: string;
|
||||
PARTS_COUNT?: number;
|
||||
LEAVES?: number;
|
||||
zeroElement?: string;
|
||||
}
|
||||
|
||||
export interface treeMetadata {
|
||||
blockNumber: number;
|
||||
logIndex: number;
|
||||
transactionHash: string;
|
||||
timestamp: number;
|
||||
from: string;
|
||||
leafIndex: number;
|
||||
blockNumber: number;
|
||||
logIndex: number;
|
||||
transactionHash: string;
|
||||
timestamp: number;
|
||||
from: string;
|
||||
leafIndex: number;
|
||||
}
|
||||
|
||||
export class TreeCache {
|
||||
netId: NetIdType;
|
||||
amount: string;
|
||||
currency: string;
|
||||
userDirectory: string;
|
||||
netId: NetIdType;
|
||||
amount: string;
|
||||
currency: string;
|
||||
userDirectory: string;
|
||||
|
||||
PARTS_COUNT: number;
|
||||
PARTS_COUNT: number;
|
||||
|
||||
constructor({ netId, amount, currency, userDirectory, PARTS_COUNT = 4 }: TreeCacheConstructor) {
|
||||
this.netId = netId;
|
||||
this.amount = amount;
|
||||
this.currency = currency;
|
||||
this.userDirectory = userDirectory;
|
||||
constructor({ netId, amount, currency, userDirectory, PARTS_COUNT = 4 }: TreeCacheConstructor) {
|
||||
this.netId = netId;
|
||||
this.amount = amount;
|
||||
this.currency = currency;
|
||||
this.userDirectory = userDirectory;
|
||||
|
||||
this.PARTS_COUNT = PARTS_COUNT;
|
||||
}
|
||||
this.PARTS_COUNT = PARTS_COUNT;
|
||||
}
|
||||
|
||||
getInstanceName(): string {
|
||||
return `deposits_${this.netId}_${this.currency}_${this.amount}`;
|
||||
}
|
||||
getInstanceName(): string {
|
||||
return `deposits_${this.netId}_${this.currency}_${this.amount}`;
|
||||
}
|
||||
|
||||
async createTree(events: DepositsEvents[], tree: MerkleTree) {
|
||||
const bloom = new BloomFilter(events.length);
|
||||
async createTree(events: DepositsEvents[], tree: MerkleTree) {
|
||||
const bloom = new BloomFilter(events.length);
|
||||
|
||||
console.log(`Creating cached tree for ${this.getInstanceName()}\n`);
|
||||
console.log(`Creating cached tree for ${this.getInstanceName()}\n`);
|
||||
|
||||
// events indexed by commitment
|
||||
const eventsData = events.reduce(
|
||||
(acc, { leafIndex, commitment, ...rest }, i) => {
|
||||
if (leafIndex !== i) {
|
||||
throw new Error(`leafIndex (${leafIndex}) !== i (${i})`);
|
||||
}
|
||||
// events indexed by commitment
|
||||
const eventsData = events.reduce(
|
||||
(acc, { leafIndex, commitment, ...rest }, i) => {
|
||||
if (leafIndex !== i) {
|
||||
throw new Error(`leafIndex (${leafIndex}) !== i (${i})`);
|
||||
}
|
||||
|
||||
acc[commitment] = { ...rest, leafIndex };
|
||||
acc[commitment] = { ...rest, leafIndex };
|
||||
|
||||
return acc;
|
||||
},
|
||||
{} as { [key in string]: treeMetadata },
|
||||
);
|
||||
|
||||
const slices = tree.getTreeSlices(this.PARTS_COUNT);
|
||||
|
||||
await Promise.all(
|
||||
slices.map(async (slice, index) => {
|
||||
const metadata = slice.elements.reduce((acc, curr) => {
|
||||
if (index < this.PARTS_COUNT - 1) {
|
||||
bloom.add(curr);
|
||||
}
|
||||
acc.push(eventsData[curr]);
|
||||
return acc;
|
||||
}, [] as treeMetadata[]);
|
||||
|
||||
const dataString =
|
||||
JSON.stringify(
|
||||
{
|
||||
...slice,
|
||||
metadata,
|
||||
return acc;
|
||||
},
|
||||
null,
|
||||
2,
|
||||
) + '\n';
|
||||
{} as { [key in string]: treeMetadata },
|
||||
);
|
||||
|
||||
const fileName = `${this.getInstanceName()}_slice${index + 1}.json`;
|
||||
const slices = tree.getTreeSlices(this.PARTS_COUNT);
|
||||
|
||||
await Promise.all(
|
||||
slices.map(async (slice, index) => {
|
||||
const metadata = slice.elements.reduce((acc, curr) => {
|
||||
if (index < this.PARTS_COUNT - 1) {
|
||||
bloom.add(curr);
|
||||
}
|
||||
acc.push(eventsData[curr]);
|
||||
return acc;
|
||||
}, [] as treeMetadata[]);
|
||||
|
||||
const dataString =
|
||||
JSON.stringify(
|
||||
{
|
||||
...slice,
|
||||
metadata,
|
||||
},
|
||||
null,
|
||||
2,
|
||||
) + '\n';
|
||||
|
||||
const fileName = `${this.getInstanceName()}_slice${index + 1}.json`;
|
||||
|
||||
await saveUserFile({
|
||||
fileName,
|
||||
userDirectory: this.userDirectory,
|
||||
dataString,
|
||||
});
|
||||
}),
|
||||
);
|
||||
|
||||
const dataString = bloom.serialize() + '\n';
|
||||
|
||||
const fileName = `${this.getInstanceName()}_bloom.json`;
|
||||
|
||||
await saveUserFile({
|
||||
fileName,
|
||||
userDirectory: this.userDirectory,
|
||||
dataString,
|
||||
fileName,
|
||||
userDirectory: this.userDirectory,
|
||||
dataString,
|
||||
});
|
||||
}),
|
||||
);
|
||||
|
||||
const dataString = bloom.serialize() + '\n';
|
||||
|
||||
const fileName = `${this.getInstanceName()}_bloom.json`;
|
||||
|
||||
await saveUserFile({
|
||||
fileName,
|
||||
userDirectory: this.userDirectory,
|
||||
dataString,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
28
src/types/bloomfilter.js.d.ts
vendored
28
src/types/bloomfilter.js.d.ts
vendored
@ -1,25 +1,25 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
declare module 'bloomfilter.js' {
|
||||
export default class BloomFilter {
|
||||
m: number;
|
||||
k: number;
|
||||
size: number;
|
||||
bitview: any;
|
||||
export default class BloomFilter {
|
||||
m: number;
|
||||
k: number;
|
||||
size: number;
|
||||
bitview: any;
|
||||
|
||||
constructor(n: number, false_postive_tolerance?: number);
|
||||
constructor(n: number, false_postive_tolerance?: number);
|
||||
|
||||
calculateHash(x: number, m: number, i: number): number;
|
||||
calculateHash(x: number, m: number, i: number): number;
|
||||
|
||||
test(data: any): boolean;
|
||||
test(data: any): boolean;
|
||||
|
||||
add(data: any): void;
|
||||
add(data: any): void;
|
||||
|
||||
bytelength(): number;
|
||||
bytelength(): number;
|
||||
|
||||
view(): Uint8Array;
|
||||
view(): Uint8Array;
|
||||
|
||||
serialize(): string;
|
||||
serialize(): string;
|
||||
|
||||
deserialize(serialized: string): BloomFilter;
|
||||
}
|
||||
deserialize(serialized: string): BloomFilter;
|
||||
}
|
||||
}
|
||||
|
BIN
static/events/deposits_10_eth_0.001.json.zip
Normal file
BIN
static/events/deposits_10_eth_0.001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_10_eth_0.01.json.zip
Normal file
BIN
static/events/deposits_10_eth_0.01.json.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
static/events/deposits_42161_eth_0.001.json.zip
Normal file
BIN
static/events/deposits_42161_eth_0.001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_42161_eth_0.01.json.zip
Normal file
BIN
static/events/deposits_42161_eth_0.01.json.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
static/events/deposits_56_btcb_0.0001.json.zip
Normal file
BIN
static/events/deposits_56_btcb_0.0001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_btcb_0.001.json.zip
Normal file
BIN
static/events/deposits_56_btcb_0.001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_btcb_0.01.json.zip
Normal file
BIN
static/events/deposits_56_btcb_0.01.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_btcb_0.1.json.zip
Normal file
BIN
static/events/deposits_56_btcb_0.1.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_usdt_10.json.zip
Normal file
BIN
static/events/deposits_56_usdt_10.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_usdt_100.json.zip
Normal file
BIN
static/events/deposits_56_usdt_100.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_usdt_1000.json.zip
Normal file
BIN
static/events/deposits_56_usdt_1000.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_56_usdt_10000.json.zip
Normal file
BIN
static/events/deposits_56_usdt_10000.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_81457_eth_0.001.json.zip
Normal file
BIN
static/events/deposits_81457_eth_0.001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_81457_eth_0.01.json.zip
Normal file
BIN
static/events/deposits_81457_eth_0.01.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_81457_eth_0.1.json.zip
Normal file
BIN
static/events/deposits_81457_eth_0.1.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_81457_eth_1.json.zip
Normal file
BIN
static/events/deposits_81457_eth_1.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_81457_eth_10.json.zip
Normal file
BIN
static/events/deposits_81457_eth_10.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_81457_eth_100.json.zip
Normal file
BIN
static/events/deposits_81457_eth_100.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_dai_10.json.zip
Normal file
BIN
static/events/deposits_8453_dai_10.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_dai_100.json.zip
Normal file
BIN
static/events/deposits_8453_dai_100.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_dai_1000.json.zip
Normal file
BIN
static/events/deposits_8453_dai_1000.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_dai_10000.json.zip
Normal file
BIN
static/events/deposits_8453_dai_10000.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_dai_100000.json.zip
Normal file
BIN
static/events/deposits_8453_dai_100000.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_eth_0.001.json.zip
Normal file
BIN
static/events/deposits_8453_eth_0.001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_eth_0.01.json.zip
Normal file
BIN
static/events/deposits_8453_eth_0.01.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_eth_0.1.json.zip
Normal file
BIN
static/events/deposits_8453_eth_0.1.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_eth_1.json.zip
Normal file
BIN
static/events/deposits_8453_eth_1.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_eth_10.json.zip
Normal file
BIN
static/events/deposits_8453_eth_10.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_eth_100.json.zip
Normal file
BIN
static/events/deposits_8453_eth_100.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_tbtc_0.0001.json.zip
Normal file
BIN
static/events/deposits_8453_tbtc_0.0001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_tbtc_0.001.json.zip
Normal file
BIN
static/events/deposits_8453_tbtc_0.001.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_tbtc_0.01.json.zip
Normal file
BIN
static/events/deposits_8453_tbtc_0.01.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_tbtc_0.1.json.zip
Normal file
BIN
static/events/deposits_8453_tbtc_0.1.json.zip
Normal file
Binary file not shown.
BIN
static/events/deposits_8453_tbtc_1.json.zip
Normal file
BIN
static/events/deposits_8453_tbtc_1.json.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
static/events/echo_81457.json.zip
Normal file
BIN
static/events/echo_81457.json.zip
Normal file
Binary file not shown.
BIN
static/events/echo_8453.json.zip
Normal file
BIN
static/events/echo_8453.json.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
static/events/encrypted_notes_81457.json.zip
Normal file
BIN
static/events/encrypted_notes_81457.json.zip
Normal file
Binary file not shown.
BIN
static/events/encrypted_notes_8453.json.zip
Normal file
BIN
static/events/encrypted_notes_8453.json.zip
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
static/events/registry_1.json.zip
Normal file
BIN
static/events/registry_1.json.zip
Normal file
Binary file not shown.
BIN
static/events/registry_11155111.json.zip
Normal file
BIN
static/events/registry_11155111.json.zip
Normal file
Binary file not shown.
@ -1,277 +1,85 @@
|
||||
{
|
||||
"timestamp": 1726890359,
|
||||
"lastBlock": 20874000,
|
||||
"timestamp": 1727826179,
|
||||
"relayers": [
|
||||
{
|
||||
"ensName": "okrelayer.eth",
|
||||
"relayerAddress": "0x0e9D9a828247F5eed7f6D31D213A39805De52441",
|
||||
"ensName": "tornadowithdraw.eth",
|
||||
"relayerAddress": "0x40c3d1656a26C9266f4A10fed0D87EFf79F54E64",
|
||||
"hostnames": {},
|
||||
"tovarishHost": "tornadowithdraw.com",
|
||||
"tovarishNetworks": [
|
||||
1,
|
||||
56,
|
||||
137,
|
||||
10,
|
||||
42161,
|
||||
100,
|
||||
43114,
|
||||
11155111
|
||||
]
|
||||
},
|
||||
{
|
||||
"ensName": "therelayer.eth",
|
||||
"relayerAddress": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
|
||||
"isRegistered": true,
|
||||
"owner": "0x0e9D9a828247F5eed7f6D31D213A39805De52441",
|
||||
"stakeBalance": "4666.679387946529032297",
|
||||
"owner": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
|
||||
"stakeBalance": "1335.888771359625809238",
|
||||
"hostnames": {
|
||||
"1": "okrelayer.xyz",
|
||||
"56": "binance.okrelayer.xyz",
|
||||
"137": "polygon.okrelayer.xyz",
|
||||
"42161": "arb.okrelayer.xyz"
|
||||
"1": "mainnet.therelayer.xyz",
|
||||
"10": "optimism.therelayer.xyz",
|
||||
"56": "bsc.therelayer.xyz",
|
||||
"100": "xdai.therelayer.xyz",
|
||||
"137": "polygon.therelayer.xyz",
|
||||
"42161": "arbitrum.therelayer.xyz",
|
||||
"43114": "avalanche.therelayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "quick-relayer.eth",
|
||||
"relayerAddress": "0x187541D7D312F742040f270d0221B4Fe577934B0",
|
||||
"ensName": "cheap-relayer.eth",
|
||||
"relayerAddress": "0x076D4E32C6A5D888fC4658281539c94E778C796d",
|
||||
"isRegistered": true,
|
||||
"owner": "0x187541D7D312F742040f270d0221B4Fe577934B0",
|
||||
"stakeBalance": "2931.033250737658918569",
|
||||
"owner": "0x076D4E32C6A5D888fC4658281539c94E778C796d",
|
||||
"stakeBalance": "500.878420081833044818",
|
||||
"hostnames": {
|
||||
"1": "quick-relayer.xyz"
|
||||
"1": "mainnet-tornado.cheap-relayer.xyz",
|
||||
"56": "bsc-tornado.cheap-relayer.xyz",
|
||||
"137": "polygon-tornado.cheap-relayer.xyz",
|
||||
"43114": "avalanche-tornado.cheap-relayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "safety-relayer.eth",
|
||||
"relayerAddress": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8",
|
||||
"ensName": "lowcost.eth",
|
||||
"relayerAddress": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d",
|
||||
"isRegistered": true,
|
||||
"owner": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8",
|
||||
"stakeBalance": "500.879215977529089999",
|
||||
"owner": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d",
|
||||
"stakeBalance": "500.279638085962965981",
|
||||
"hostnames": {
|
||||
"1": "a-relayer.top",
|
||||
"56": "bsc.a-relayer.top",
|
||||
"137": "polygon.a-relayer.top"
|
||||
"1": "mainnet-tornado.low-fee.xyz",
|
||||
"56": "bsc-tornado.low-fee.xyz",
|
||||
"137": "polygon-tornado.low-fee.xyz",
|
||||
"43114": "avalanche-tornado.low-fee.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "k-relayer.eth",
|
||||
"relayerAddress": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c",
|
||||
"ensName": "relayernews.eth",
|
||||
"relayerAddress": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70",
|
||||
"isRegistered": true,
|
||||
"owner": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c",
|
||||
"stakeBalance": "2194.529689989084430299",
|
||||
"owner": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70",
|
||||
"stakeBalance": "1661.181918638614466424",
|
||||
"hostnames": {
|
||||
"1": "black-hardy.com",
|
||||
"56": "bsc.black-hardy.com"
|
||||
"1": "mainnet-tornado.relayernews.xyz",
|
||||
"56": "bsc-tornado.relayernews.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "relayer007.eth",
|
||||
"relayerAddress": "0xa0109274F53609f6Be97ec5f3052C659AB80f012",
|
||||
"ensName": "on-sale.eth",
|
||||
"relayerAddress": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E",
|
||||
"isRegistered": true,
|
||||
"owner": "0xa0109274F53609f6Be97ec5f3052C659AB80f012",
|
||||
"stakeBalance": "4989.637826137906607638",
|
||||
"owner": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E",
|
||||
"stakeBalance": "4476.543684932880020592",
|
||||
"hostnames": {
|
||||
"1": "torn.relayersdao.finance",
|
||||
"56": "bsc.relayersdao.finance",
|
||||
"137": "matic.relayersdao.finance"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "reltor.eth",
|
||||
"relayerAddress": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5",
|
||||
"isRegistered": true,
|
||||
"owner": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5",
|
||||
"stakeBalance": "19999.983956326624881327",
|
||||
"hostnames": {
|
||||
"1": "eth.reltor.su",
|
||||
"56": "binance.reltor.su",
|
||||
"137": "polygon.reltor.su"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "best-relay.eth",
|
||||
"relayerAddress": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E",
|
||||
"isRegistered": true,
|
||||
"owner": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E",
|
||||
"stakeBalance": "2002.0",
|
||||
"hostnames": {
|
||||
"1": "best-relay.gato-miaouw.xyz",
|
||||
"56": "bsc.gato-miaouw.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "crelayer.eth",
|
||||
"relayerAddress": "0x180c58B7305152357142b33Eea94cBB152058B61",
|
||||
"isRegistered": true,
|
||||
"owner": "0x180c58B7305152357142b33Eea94cBB152058B61",
|
||||
"stakeBalance": "1460.389956347917729137",
|
||||
"hostnames": {
|
||||
"1": "eth.crelayer.xyz",
|
||||
"56": "bsc.crelayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torn-city.eth",
|
||||
"relayerAddress": "0xd04e9f0945DEA8373D882C730e2c93a74B591796",
|
||||
"isRegistered": true,
|
||||
"owner": "0xd04e9f0945DEA8373D882C730e2c93a74B591796",
|
||||
"stakeBalance": "6715.49550101901162633",
|
||||
"hostnames": {
|
||||
"1": "torn-city.com",
|
||||
"56": "bsc.torn-city.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torrelayer.eth",
|
||||
"relayerAddress": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C",
|
||||
"isRegistered": true,
|
||||
"owner": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C",
|
||||
"stakeBalance": "3734.220945056618867324",
|
||||
"hostnames": {
|
||||
"1": "tornima.xyz",
|
||||
"56": "binance.tornima.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "tornxdo.eth",
|
||||
"relayerAddress": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD",
|
||||
"isRegistered": true,
|
||||
"owner": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD",
|
||||
"stakeBalance": "983.310689667160962345",
|
||||
"hostnames": {
|
||||
"1": "tornado.evmjunkie.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "0xgm777.eth",
|
||||
"relayerAddress": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c",
|
||||
"isRegistered": true,
|
||||
"owner": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c",
|
||||
"stakeBalance": "1979.261700994868938309",
|
||||
"hostnames": {
|
||||
"1": "main.gm777.xyz",
|
||||
"56": "bsc.gm777.xyz",
|
||||
"42161": "arb.gm777.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "relayer-secure.eth",
|
||||
"relayerAddress": "0xCEdac436cEA98E93F471331eCC693fF41D730921",
|
||||
"isRegistered": true,
|
||||
"owner": "0xCEdac436cEA98E93F471331eCC693fF41D730921",
|
||||
"stakeBalance": "548.198082306127582623",
|
||||
"hostnames": {
|
||||
"1": "relsecc-mainnet.moon-relayer.app"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "default-relayer.eth",
|
||||
"relayerAddress": "0x5555555731006f71f121144534Ca7C8799F66AA3",
|
||||
"isRegistered": true,
|
||||
"owner": "0x5555555731006f71f121144534Ca7C8799F66AA3",
|
||||
"stakeBalance": "5011.216884015043970278",
|
||||
"hostnames": {
|
||||
"1": "eth.default-relayer.com",
|
||||
"56": "bsc.default-relayer.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "t-relayer.eth",
|
||||
"relayerAddress": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe",
|
||||
"isRegistered": true,
|
||||
"owner": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe",
|
||||
"stakeBalance": "6079.008889316501226288",
|
||||
"hostnames": {
|
||||
"1": "eth.t-relayer.com",
|
||||
"56": "bsc.t-relayer.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "secure-relay.eth",
|
||||
"relayerAddress": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA",
|
||||
"isRegistered": true,
|
||||
"owner": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA",
|
||||
"stakeBalance": "6751.661507930994067422",
|
||||
"hostnames": {
|
||||
"1": "torn-relayer.duckdns.org"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torntorn.eth",
|
||||
"relayerAddress": "0x1247749d7E28D357B4279110af0802603AC526cE",
|
||||
"isRegistered": true,
|
||||
"owner": "0x1247749d7E28D357B4279110af0802603AC526cE",
|
||||
"stakeBalance": "5535.435044583932530913",
|
||||
"hostnames": {
|
||||
"1": "eth.fsdhreu39jfk.com",
|
||||
"56": "bsc.fsdhreu39jfk.com",
|
||||
"100": "gnosis.tornad0.com",
|
||||
"137": "polygon.tornad0.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "bitah.eth",
|
||||
"relayerAddress": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42",
|
||||
"isRegistered": true,
|
||||
"owner": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42",
|
||||
"stakeBalance": "503.237718892072788154",
|
||||
"hostnames": {
|
||||
"1": "tornado.bitah.link",
|
||||
"56": "bsc-tornado.bitah.link",
|
||||
"137": "polygon-tornado.bitah.link"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "shadow-out.eth",
|
||||
"relayerAddress": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151",
|
||||
"isRegistered": true,
|
||||
"owner": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151",
|
||||
"stakeBalance": "3571.639136672079169166",
|
||||
"hostnames": {
|
||||
"1": "livetobecomeavillain",
|
||||
"56": "justarandomdude",
|
||||
"100": "everythingisburning"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torn-eth.eth",
|
||||
"relayerAddress": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E",
|
||||
"isRegistered": true,
|
||||
"owner": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E",
|
||||
"stakeBalance": "978.62598484549460861",
|
||||
"hostnames": {
|
||||
"1": "mainnet-tornado.50swap.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "0xproxy.eth",
|
||||
"relayerAddress": "0x08657a1f4C1F06d657F31767831421EE7FaDf549",
|
||||
"isRegistered": true,
|
||||
"owner": "0x08657a1f4C1F06d657F31767831421EE7FaDf549",
|
||||
"stakeBalance": "705.605817336537209483",
|
||||
"hostnames": {
|
||||
"1": "mainnet.0x0relayer.xyz",
|
||||
"56": "bsc.0x0relayer.xyz",
|
||||
"137": "polygon.0x0relayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "wetez.eth",
|
||||
"relayerAddress": "0xe6184DA55174Cc0263a17eA2fc24E48511766505",
|
||||
"isRegistered": true,
|
||||
"owner": "0xe6184DA55174Cc0263a17eA2fc24E48511766505",
|
||||
"stakeBalance": "567.980734786905511868",
|
||||
"hostnames": {
|
||||
"1": "tornado-1.wetez.io"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "0xtorn.eth",
|
||||
"relayerAddress": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B",
|
||||
"isRegistered": true,
|
||||
"owner": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B",
|
||||
"stakeBalance": "4627.036617270139345308",
|
||||
"hostnames": {
|
||||
"1": "mainnet.al1n.cc",
|
||||
"56": "bsc-tornado.al1n.cc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "reslayer.eth",
|
||||
"relayerAddress": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81",
|
||||
"isRegistered": true,
|
||||
"owner": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81",
|
||||
"stakeBalance": "879.305690438201312145",
|
||||
"hostnames": {
|
||||
"1": "mainnet-tornado.reslayer.xyz",
|
||||
"56": "bsc-tornado.reslayer.xyz",
|
||||
"100": "gnosis-tornado.reslayer.xyz",
|
||||
"137": "polygon-tornado.reslayer.xyz",
|
||||
"42161": "arbitrum-tornado.reslayer.xyz",
|
||||
"43114": "avalanche-tornado.reslayer.xyz"
|
||||
"1": "mainnet-tornado.appleworld.club",
|
||||
"56": "bsc-tornado.appleworld.club"
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -290,67 +98,286 @@
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "on-sale.eth",
|
||||
"relayerAddress": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E",
|
||||
"ensName": "reslayer.eth",
|
||||
"relayerAddress": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81",
|
||||
"isRegistered": true,
|
||||
"owner": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E",
|
||||
"stakeBalance": "4476.543684932880020592",
|
||||
"owner": "0x7Ba6781620c91676B070D319E7E894BFd4A9eC81",
|
||||
"stakeBalance": "879.305690438201312145",
|
||||
"hostnames": {
|
||||
"1": "mainnet-tornado.appleworld.club",
|
||||
"56": "bsc-tornado.appleworld.club"
|
||||
"1": "mainnet-tornado.reslayer.xyz",
|
||||
"56": "bsc-tornado.reslayer.xyz",
|
||||
"100": "gnosis-tornado.reslayer.xyz",
|
||||
"137": "polygon-tornado.reslayer.xyz",
|
||||
"42161": "arbitrum-tornado.reslayer.xyz",
|
||||
"43114": "avalanche-tornado.reslayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "relayernews.eth",
|
||||
"relayerAddress": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70",
|
||||
"ensName": "0xtorn.eth",
|
||||
"relayerAddress": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B",
|
||||
"isRegistered": true,
|
||||
"owner": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70",
|
||||
"stakeBalance": "1661.181918638614466424",
|
||||
"owner": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B",
|
||||
"stakeBalance": "4627.036617270139345308",
|
||||
"hostnames": {
|
||||
"1": "mainnet-tornado.relayernews.xyz",
|
||||
"56": "bsc-tornado.relayernews.xyz"
|
||||
"1": "mainnet.al1n.cc",
|
||||
"56": "bsc-tornado.al1n.cc"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "lowcost.eth",
|
||||
"relayerAddress": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d",
|
||||
"ensName": "wetez.eth",
|
||||
"relayerAddress": "0xe6184DA55174Cc0263a17eA2fc24E48511766505",
|
||||
"isRegistered": true,
|
||||
"owner": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d",
|
||||
"stakeBalance": "500.279638085962965981",
|
||||
"owner": "0xe6184DA55174Cc0263a17eA2fc24E48511766505",
|
||||
"stakeBalance": "567.980734786905511868",
|
||||
"hostnames": {
|
||||
"1": "mainnet-tornado.low-fee.xyz",
|
||||
"56": "bsc-tornado.low-fee.xyz",
|
||||
"137": "polygon-tornado.low-fee.xyz",
|
||||
"43114": "avalanche-tornado.low-fee.xyz"
|
||||
"1": "tornado-1.wetez.io"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "cheap-relayer.eth",
|
||||
"relayerAddress": "0x076D4E32C6A5D888fC4658281539c94E778C796d",
|
||||
"ensName": "0xproxy.eth",
|
||||
"relayerAddress": "0x08657a1f4C1F06d657F31767831421EE7FaDf549",
|
||||
"isRegistered": true,
|
||||
"owner": "0x076D4E32C6A5D888fC4658281539c94E778C796d",
|
||||
"stakeBalance": "500.878420081833044818",
|
||||
"owner": "0x08657a1f4C1F06d657F31767831421EE7FaDf549",
|
||||
"stakeBalance": "705.605817336537209483",
|
||||
"hostnames": {
|
||||
"1": "mainnet-tornado.cheap-relayer.xyz",
|
||||
"56": "bsc-tornado.cheap-relayer.xyz",
|
||||
"137": "polygon-tornado.cheap-relayer.xyz",
|
||||
"43114": "avalanche-tornado.cheap-relayer.xyz"
|
||||
"1": "mainnet.0x0relayer.xyz",
|
||||
"56": "bsc.0x0relayer.xyz",
|
||||
"137": "polygon.0x0relayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "therelayer.eth",
|
||||
"relayerAddress": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
|
||||
"ensName": "torn-eth.eth",
|
||||
"relayerAddress": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E",
|
||||
"isRegistered": true,
|
||||
"owner": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
|
||||
"stakeBalance": "1335.888771359625809238",
|
||||
"owner": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E",
|
||||
"stakeBalance": "978.62598484549460861",
|
||||
"hostnames": {
|
||||
"1": "mainnet.therelayer.xyz",
|
||||
"10": "optimism.therelayer.xyz",
|
||||
"56": "bsc.therelayer.xyz",
|
||||
"100": "xdai.therelayer.xyz",
|
||||
"137": "polygon.therelayer.xyz",
|
||||
"42161": "arbitrum.therelayer.xyz",
|
||||
"43114": "avalanche.therelayer.xyz"
|
||||
"1": "mainnet-tornado.50swap.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "shadow-out.eth",
|
||||
"relayerAddress": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151",
|
||||
"isRegistered": true,
|
||||
"owner": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151",
|
||||
"stakeBalance": "3571.639136672079169166",
|
||||
"hostnames": {
|
||||
"1": "livetobecomeavillain",
|
||||
"56": "justarandomdude",
|
||||
"100": "everythingisburning"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "bitah.eth",
|
||||
"relayerAddress": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42",
|
||||
"isRegistered": true,
|
||||
"owner": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42",
|
||||
"stakeBalance": "503.237718892072788154",
|
||||
"hostnames": {
|
||||
"1": "tornado.bitah.link",
|
||||
"56": "bsc-tornado.bitah.link",
|
||||
"137": "polygon-tornado.bitah.link"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torntorn.eth",
|
||||
"relayerAddress": "0x1247749d7E28D357B4279110af0802603AC526cE",
|
||||
"isRegistered": true,
|
||||
"owner": "0x1247749d7E28D357B4279110af0802603AC526cE",
|
||||
"stakeBalance": "5535.435044583932530913",
|
||||
"hostnames": {
|
||||
"1": "eth.fsdhreu39jfk.com",
|
||||
"56": "bsc.fsdhreu39jfk.com",
|
||||
"100": "gnosis.tornad0.com",
|
||||
"137": "polygon.tornad0.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "secure-relay.eth",
|
||||
"relayerAddress": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA",
|
||||
"isRegistered": true,
|
||||
"owner": "0x1036AF02bCDb2e3A4db2d3D40b29e5054EDc79BA",
|
||||
"stakeBalance": "6751.661507930994067422",
|
||||
"hostnames": {
|
||||
"1": "torn-relayer.duckdns.org"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "relayer007.eth",
|
||||
"relayerAddress": "0xa0109274F53609f6Be97ec5f3052C659AB80f012",
|
||||
"isRegistered": true,
|
||||
"owner": "0xa0109274F53609f6Be97ec5f3052C659AB80f012",
|
||||
"stakeBalance": "2075.677151387681021207",
|
||||
"hostnames": {
|
||||
"1": "torn.relayersdao.finance",
|
||||
"56": "bsc.relayersdao.finance",
|
||||
"137": "matic.relayersdao.finance"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "reltor.eth",
|
||||
"relayerAddress": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5",
|
||||
"isRegistered": true,
|
||||
"owner": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5",
|
||||
"stakeBalance": "17078.896444585792890283",
|
||||
"hostnames": {
|
||||
"1": "eth.reltor.su",
|
||||
"56": "binance.reltor.su",
|
||||
"137": "polygon.reltor.su"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "t-relayer.eth",
|
||||
"relayerAddress": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe",
|
||||
"isRegistered": true,
|
||||
"owner": "0x000000Cd6521Ed1a65FAe0678eA15aF4EEAD74fe",
|
||||
"stakeBalance": "9393.81613250700489948",
|
||||
"hostnames": {
|
||||
"1": "eth.t-relayer.com",
|
||||
"56": "bsc.t-relayer.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "default-relayer.eth",
|
||||
"relayerAddress": "0x5555555731006f71f121144534Ca7C8799F66AA3",
|
||||
"isRegistered": true,
|
||||
"owner": "0x5555555731006f71f121144534Ca7C8799F66AA3",
|
||||
"stakeBalance": "12244.203047120053584442",
|
||||
"hostnames": {
|
||||
"1": "eth.default-relayer.com",
|
||||
"56": "bsc.default-relayer.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "relayer-secure.eth",
|
||||
"relayerAddress": "0xCEdac436cEA98E93F471331eCC693fF41D730921",
|
||||
"isRegistered": true,
|
||||
"owner": "0xCEdac436cEA98E93F471331eCC693fF41D730921",
|
||||
"stakeBalance": "548.198082306127582623",
|
||||
"hostnames": {
|
||||
"1": "relsecc-mainnet.moon-relayer.app"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "0xgm777.eth",
|
||||
"relayerAddress": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c",
|
||||
"isRegistered": true,
|
||||
"owner": "0x94596B6A626392F5D972D6CC4D929a42c2f0008c",
|
||||
"stakeBalance": "1649.22629774180421325",
|
||||
"hostnames": {
|
||||
"1": "main.gm777.xyz",
|
||||
"56": "bsc.gm777.xyz",
|
||||
"42161": "arb.gm777.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "k-relayer.eth",
|
||||
"relayerAddress": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c",
|
||||
"isRegistered": true,
|
||||
"owner": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c",
|
||||
"stakeBalance": "2392.026618435010858225",
|
||||
"hostnames": {
|
||||
"1": "black-hardy.com",
|
||||
"56": "bsc.black-hardy.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "tornxdo.eth",
|
||||
"relayerAddress": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD",
|
||||
"isRegistered": true,
|
||||
"owner": "0xB399aa4c2F1678f72529Cd125F82cEA2c2a823eD",
|
||||
"stakeBalance": "983.310689667160962345",
|
||||
"hostnames": {
|
||||
"1": "tornado.evmjunkie.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torrelayer.eth",
|
||||
"relayerAddress": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C",
|
||||
"isRegistered": true,
|
||||
"owner": "0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C",
|
||||
"stakeBalance": "4150.327987173762878437",
|
||||
"hostnames": {
|
||||
"1": "tornima.xyz",
|
||||
"56": "binance.tornima.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "torn-city.eth",
|
||||
"relayerAddress": "0xd04e9f0945DEA8373D882C730e2c93a74B591796",
|
||||
"isRegistered": true,
|
||||
"owner": "0xd04e9f0945DEA8373D882C730e2c93a74B591796",
|
||||
"stakeBalance": "6636.564618899564311691",
|
||||
"hostnames": {
|
||||
"1": "torn-city.com",
|
||||
"56": "bsc.torn-city.com"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "crelayer.eth",
|
||||
"relayerAddress": "0x180c58B7305152357142b33Eea94cBB152058B61",
|
||||
"isRegistered": true,
|
||||
"owner": "0x180c58B7305152357142b33Eea94cBB152058B61",
|
||||
"stakeBalance": "1460.389956347917729137",
|
||||
"hostnames": {
|
||||
"1": "eth.crelayer.xyz",
|
||||
"56": "bsc.crelayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "best-relay.eth",
|
||||
"relayerAddress": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E",
|
||||
"isRegistered": true,
|
||||
"owner": "0xe5A4c70113b90566BC5f80a3866935d0d52F990E",
|
||||
"stakeBalance": "2002.0",
|
||||
"hostnames": {
|
||||
"1": "best-relay.gato-miaouw.xyz",
|
||||
"56": "bsc.gato-miaouw.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "safety-relayer.eth",
|
||||
"relayerAddress": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8",
|
||||
"isRegistered": true,
|
||||
"owner": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8",
|
||||
"stakeBalance": "500.879215977529089999",
|
||||
"hostnames": {
|
||||
"1": "a-relayer.top",
|
||||
"56": "bsc.a-relayer.top",
|
||||
"137": "polygon.a-relayer.top"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "quick-relayer.eth",
|
||||
"relayerAddress": "0x187541D7D312F742040f270d0221B4Fe577934B0",
|
||||
"isRegistered": true,
|
||||
"owner": "0x187541D7D312F742040f270d0221B4Fe577934B0",
|
||||
"stakeBalance": "2931.033250737658918569",
|
||||
"hostnames": {
|
||||
"1": "quick-relayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "okrelayer.eth",
|
||||
"relayerAddress": "0x0e9D9a828247F5eed7f6D31D213A39805De52441",
|
||||
"isRegistered": true,
|
||||
"owner": "0x0e9D9a828247F5eed7f6D31D213A39805De52441",
|
||||
"stakeBalance": "4668.726167448982243314",
|
||||
"hostnames": {
|
||||
"1": "okrelayer.xyz",
|
||||
"56": "binance.okrelayer.xyz",
|
||||
"137": "polygon.okrelayer.xyz",
|
||||
"42161": "arb.okrelayer.xyz"
|
||||
}
|
||||
},
|
||||
{
|
||||
"ensName": "s-relayer.eth",
|
||||
"relayerAddress": "0xc6398b4e8B60720051ed33f5C5a692f9785f5580",
|
||||
"isRegistered": true,
|
||||
"owner": "0xc6398b4e8B60720051ed33f5C5a692f9785f5580",
|
||||
"stakeBalance": "5000.0",
|
||||
"hostnames": {
|
||||
"1": "s-relayer.xyz"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
BIN
static/events/relayers.json.zip
Normal file
BIN
static/events/relayers.json.zip
Normal file
Binary file not shown.
BIN
static/events/revenue_1.json.zip
Normal file
BIN
static/events/revenue_1.json.zip
Normal file
Binary file not shown.
BIN
static/events/revenue_11155111.json.zip
Normal file
BIN
static/events/revenue_11155111.json.zip
Normal file
Binary file not shown.
BIN
static/events/tornado_1.json.zip
Normal file
BIN
static/events/tornado_1.json.zip
Normal file
Binary file not shown.
BIN
static/events/tornado_10.json.zip
Normal file
BIN
static/events/tornado_10.json.zip
Normal file
Binary file not shown.
BIN
static/events/tornado_100.json.zip
Normal file
BIN
static/events/tornado_100.json.zip
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user