Compare commits

..

No commits in common. "development" and "v1.0.4" have entirely different histories.

169 changed files with 12805 additions and 27852 deletions

View File

@ -1,44 +1,65 @@
module.exports = { module.exports = {
env: { "env": {
es2021: true, "es2021": true,
node: true, "node": true
}, },
extends: [ "extends": [
'prettier', "eslint:recommended",
'eslint:recommended', "plugin:@typescript-eslint/recommended",
'plugin:@typescript-eslint/recommended', "plugin:import/recommended",
'plugin:import/recommended', "plugin:import/typescript",
'plugin:import/typescript', "prettier",
'plugin:prettier/recommended', "plugin:prettier/recommended",
], ],
overrides: [ "overrides": [
{ {
env: { "env": {
node: true, "node": true
},
files: ['.eslintrc.{js,cjs}'],
parserOptions: {
sourceType: 'script',
},
}, },
"files": [
".eslintrc.{js,cjs}"
], ],
parser: '@typescript-eslint/parser', "parserOptions": {
parserOptions: { "sourceType": "script"
ecmaVersion: 'latest', }
sourceType: 'module', }
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
}, },
plugins: ['@typescript-eslint', 'prettier'], "plugins": [
rules: { "@typescript-eslint",
'prettier/prettier': [ "prettier"
'error', ],
"rules": {
"prettier/prettier": [
"error",
{ {
tabWidth: 4,
printWidth: 120,
singleQuote: true, singleQuote: true,
}, printWidth: 120
}
], ],
'import/order': ['error'], "import/order": ["error"],
'@typescript-eslint/no-unused-vars': ['warn'], /**
'@typescript-eslint/no-unused-expressions': ['off'], "indent": [
}, "error",
}; 2
],
**/
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single"
],
"semi": [
"error",
"always"
],
"@typescript-eslint/no-unused-vars": ["warn"]
}
}

1
.npmrc
View File

@ -1 +0,0 @@
@tornado:registry=https://git.tornado.ws/api/packages/tornado-packages/npm/

30017
dist/cli.js vendored

File diff suppressed because one or more lines are too long

30
dist/program.d.ts vendored
View File

@ -1,11 +1,13 @@
import 'dotenv/config'; import 'dotenv/config';
import { Command } from 'commander'; import { Command } from 'commander';
import { JsonRpcProvider, Provider, TransactionLike, Wallet, VoidSigner } from 'ethers'; import { JsonRpcProvider, Provider, TransactionLike, Wallet, VoidSigner } from 'ethers';
import { getProviderOptions, TornadoWallet, TornadoVoidSigner, RelayerInfo, RelayerError, RelayerClient, fetchDataOptions, NetIdType, TovarishClient, TovarishInfo } from '@tornado/core'; import { getProviderOptions, TornadoWallet, TornadoVoidSigner, RelayerInfo, RelayerError, RelayerClient, fetchDataOptions, NetIdType, Config } from '@tornado/core';
export interface commonProgramOptions { export type commonProgramOptions = {
rpc?: string; rpc?: string;
ethRpc?: string; ethRpc?: string;
disableTovarish?: boolean; graph?: string;
ethGraph?: string;
disableGraph?: boolean;
accountKey?: string; accountKey?: string;
relayer?: string; relayer?: string;
walletWithdrawal?: boolean; walletWithdrawal?: boolean;
@ -17,7 +19,7 @@ export interface commonProgramOptions {
privateKey?: string; privateKey?: string;
nonInteractive?: boolean; nonInteractive?: boolean;
localRpc?: boolean; localRpc?: boolean;
} };
export declare function promptConfirmation(nonInteractive?: boolean): Promise<void>; export declare function promptConfirmation(nonInteractive?: boolean): Promise<void>;
export declare function getIPAddress(fetchDataOptions: fetchDataOptions): Promise<{ export declare function getIPAddress(fetchDataOptions: fetchDataOptions): Promise<{
ip: any; ip: any;
@ -27,7 +29,8 @@ export declare function getProgramOptions(options: commonProgramOptions): Promis
options: commonProgramOptions; options: commonProgramOptions;
fetchDataOptions: fetchDataOptions; fetchDataOptions: fetchDataOptions;
}>; }>;
export declare function getProgramProvider(rpcUrl: string | undefined, providerOptions: getProviderOptions): Promise<JsonRpcProvider>; 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 getProgramSigner({ options, provider, }: { export declare function getProgramSigner({ options, provider, }: {
options: commonProgramOptions; options: commonProgramOptions;
provider: Provider; provider: Provider;
@ -37,22 +40,13 @@ export declare function getProgramRelayer({ options, fetchDataOptions, netId, }:
fetchDataOptions?: fetchDataOptions; fetchDataOptions?: fetchDataOptions;
netId: NetIdType; netId: NetIdType;
}): Promise<{ }): Promise<{
validRelayers: RelayerInfo[]; validRelayers?: RelayerInfo[];
invalidRelayers: RelayerError[]; invalidRelayers?: RelayerError[];
relayerClient: RelayerClient; 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, }: { export declare function programSendTransaction({ signer, options, populatedTransaction, }: {
signer: VoidSigner | Wallet; signer: VoidSigner | Wallet;
options: commonProgramOptions; options: commonProgramOptions;
populatedTransaction: TransactionLike; populatedTransaction: TransactionLike;
}): Promise<import("ethers").TransactionResponse | undefined>; }): Promise<void>;
export declare function tornadoProgram(): Command; export declare function tornadoProgram(): Command;

View File

@ -1,9 +1,12 @@
import { AsyncZippable, Unzipped } from 'fflate';
import { BaseEvents, CachedEvents, MinimalEvents } from '@tornado/core'; import { BaseEvents, CachedEvents, MinimalEvents } from '@tornado/core';
export declare function existsAsync(fileOrDir: string): Promise<boolean>; export declare function existsAsync(fileOrDir: string): Promise<boolean>;
/** /**
* Supports legacy gz format for legacy UI * Supports legacy gz format for legacy UI
*/ */
export declare function deflateAsync(data: Uint8Array): Promise<Buffer>; 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, }: { export declare function saveLegacyFile({ fileName, userDirectory, dataString, }: {
fileName: string; fileName: string;
userDirectory: string; userDirectory: string;
@ -14,9 +17,10 @@ export declare function saveUserFile({ fileName, userDirectory, dataString, }: {
userDirectory: string; userDirectory: string;
dataString: string; dataString: string;
}): Promise<void>; }): Promise<void>;
export declare function loadSavedEvents<T extends MinimalEvents>({ name, userDirectory, }: { export declare function loadSavedEvents<T extends MinimalEvents>({ name, userDirectory, deployedBlock, }: {
name: string; name: string;
userDirectory: string; userDirectory: string;
deployedBlock: number;
}): Promise<BaseEvents<T>>; }): Promise<BaseEvents<T>>;
export declare function download({ name, cacheDirectory }: { export declare function download({ name, cacheDirectory }: {
name: string; name: string;

View File

@ -1,82 +1,78 @@
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 { BatchBlockOnProgress, BatchEventOnProgress, BaseTornadoService, BaseEncryptedNotesService, BaseGovernanceService, BaseRegistryService, BaseTornadoServiceConstructor, BaseEncryptedNotesServiceConstructor, BaseGovernanceServiceConstructor, BaseRegistryServiceConstructor, BaseEchoServiceConstructor, BaseEchoService, CachedRelayers } from '@tornado/core';
import { TreeCache } from './treeCache'; import type { BaseEvents, DepositsEvents, WithdrawalsEvents, EncryptedNotesEvents, RegistersEvents, AllGovernanceEvents, EchoEvents } from '@tornado/core';
export type NodeServiceConstructor = { export type NodeTornadoServiceConstructor = BaseTornadoServiceConstructor & {
cacheDirectory: string; cacheDirectory?: string;
userDirectory: string; userDirectory?: string;
};
export type NodeTornadoServiceConstructor = BaseTornadoServiceConstructor & NodeServiceConstructor & {
nativeCurrency: string;
treeCache?: TreeCache;
}; };
export declare class NodeTornadoService extends BaseTornadoService { export declare class NodeTornadoService extends BaseTornadoService {
cacheDirectory: string; cacheDirectory?: string;
userDirectory: string; userDirectory?: string;
nativeCurrency: string; constructor({ netId, provider, graphApi, subgraphName, Tornado, type, amount, currency, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeTornadoServiceConstructor);
treeCache?: TreeCache;
constructor(serviceConstructor: NodeTornadoServiceConstructor);
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void; updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
updateTransactionProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void; updateTransactionProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
updateBlockProgress({ 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>>; getEventsFromDB(): Promise<BaseEvents<DepositsEvents | WithdrawalsEvents>>;
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<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>; saveEvents({ events, lastBlock }: BaseEvents<DepositsEvents | WithdrawalsEvents>): Promise<void>;
} }
export type NodeEchoServiceConstructor = BaseEchoServiceConstructor & NodeServiceConstructor; export type NodeEchoServiceConstructor = BaseEchoServiceConstructor & {
cacheDirectory?: string;
userDirectory?: string;
};
export declare class NodeEchoService extends BaseEchoService { export declare class NodeEchoService extends BaseEchoService {
cacheDirectory: string; cacheDirectory?: string;
userDirectory: string; userDirectory?: string;
constructor(serviceConstructor: NodeEchoServiceConstructor); constructor({ netId, provider, graphApi, subgraphName, Echoer, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeEchoServiceConstructor);
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void; updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
getEventsFromDB(): Promise<BaseEvents<EchoEvents>>; getEventsFromDB(): Promise<BaseEvents<EchoEvents>>;
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<EchoEvents>>; getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<EchoEvents>>;
saveEvents({ events, lastBlock }: BaseEvents<EchoEvents>): Promise<void>; saveEvents({ events, lastBlock }: BaseEvents<EchoEvents>): Promise<void>;
} }
export type NodeEncryptedNotesServiceConstructor = BaseEncryptedNotesServiceConstructor & NodeServiceConstructor; export type NodeEncryptedNotesServiceConstructor = BaseEncryptedNotesServiceConstructor & {
cacheDirectory?: string;
userDirectory?: string;
};
export declare class NodeEncryptedNotesService extends BaseEncryptedNotesService { export declare class NodeEncryptedNotesService extends BaseEncryptedNotesService {
cacheDirectory: string; cacheDirectory?: string;
userDirectory: string; userDirectory?: string;
constructor(serviceConstructor: NodeEncryptedNotesServiceConstructor); constructor({ netId, provider, graphApi, subgraphName, Router, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeEncryptedNotesServiceConstructor);
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void; updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
getEventsFromDB(): Promise<BaseEvents<EncryptedNotesEvents>>; getEventsFromDB(): Promise<BaseEvents<EncryptedNotesEvents>>;
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<EncryptedNotesEvents>>; getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<EncryptedNotesEvents>>;
saveEvents({ events, lastBlock }: BaseEvents<EncryptedNotesEvents>): Promise<void>; saveEvents({ events, lastBlock }: BaseEvents<EncryptedNotesEvents>): Promise<void>;
} }
export type NodeGovernanceServiceConstructor = BaseGovernanceServiceConstructor & NodeServiceConstructor; export type NodeGovernanceServiceConstructor = BaseGovernanceServiceConstructor & {
cacheDirectory?: string;
userDirectory?: string;
};
export declare class NodeGovernanceService extends BaseGovernanceService { export declare class NodeGovernanceService extends BaseGovernanceService {
cacheDirectory: string; cacheDirectory?: string;
userDirectory: string; userDirectory?: string;
constructor(serviceConstructor: NodeGovernanceServiceConstructor); constructor({ netId, provider, graphApi, subgraphName, Governance, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeGovernanceServiceConstructor);
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void; 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; updateTransactionProgress({ currentIndex, totalIndex }: Parameters<BatchBlockOnProgress>[0]): void;
getEventsFromDB(): Promise<BaseEvents<AllGovernanceEvents>>; getEventsFromDB(): Promise<BaseEvents<AllGovernanceEvents>>;
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<AllGovernanceEvents>>; getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<AllGovernanceEvents>>;
saveEvents({ events, lastBlock }: BaseEvents<AllGovernanceEvents>): Promise<void>; saveEvents({ events, lastBlock }: BaseEvents<AllGovernanceEvents>): Promise<void>;
} }
export type NodeRegistryServiceConstructor = BaseRegistryServiceConstructor & NodeServiceConstructor; export type NodeRegistryServiceConstructor = BaseRegistryServiceConstructor & {
cacheDirectory?: string;
userDirectory?: string;
};
export declare class NodeRegistryService extends BaseRegistryService { export declare class NodeRegistryService extends BaseRegistryService {
cacheDirectory: string; cacheDirectory?: string;
userDirectory: string; userDirectory?: string;
constructor(serviceConstructor: NodeRegistryServiceConstructor); constructor({ netId, provider, graphApi, subgraphName, RelayerRegistry, Aggregator, relayerEnsSubdomains, deployedBlock, fetchDataOptions, cacheDirectory, userDirectory, }: NodeRegistryServiceConstructor);
updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void; updateEventProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
getEventsFromDB(): Promise<BaseEvents<AllRelayerRegistryEvents>>; updateGraphProgress({ type, fromBlock, toBlock, count }: Parameters<BatchEventOnProgress>[0]): void;
getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<AllRelayerRegistryEvents>>; getEventsFromDB(): Promise<BaseEvents<RegistersEvents>>;
saveEvents({ events, lastBlock }: BaseEvents<AllRelayerRegistryEvents>): Promise<void>; getEventsFromCache(): Promise<import("@tornado/core").CachedEvents<RegistersEvents>>;
saveEvents({ events, lastBlock }: BaseEvents<RegistersEvents>): Promise<void>;
getRelayersFromDB(): Promise<CachedRelayers>; getRelayersFromDB(): Promise<CachedRelayers>;
getRelayersFromCache(): Promise<CachedRelayers>; getRelayersFromCache(): Promise<CachedRelayers>;
saveRelayers({ lastBlock, timestamp, relayers }: CachedRelayers): Promise<void>; saveRelayers({ 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>;
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@tornado/cli", "name": "@tornado/cli",
"version": "1.0.11-alpha", "version": "1.0.4-alpha",
"description": "Modern Toolsets for Privacy Pools on Ethereum", "description": "Modern Toolsets for Privacy Pools on Ethereum",
"main": "./dist/cli.js", "main": "./dist/cli.js",
"types": "./dist/cli.d.ts", "types": "./dist/cli.d.ts",
@ -24,14 +24,11 @@
"updateEvents": "ts-node src/cli.ts updateEvents", "updateEvents": "ts-node src/cli.ts updateEvents",
"relayers": "ts-node src/cli.ts relayers", "relayers": "ts-node src/cli.ts relayers",
"createAccount": "ts-node src/cli.ts createAccount", "createAccount": "ts-node src/cli.ts createAccount",
"decrypt": "ts-node src/cli.ts decrypt", "decryptNotes": "ts-node src/cli.ts decryptNotes",
"send": "ts-node src/cli.ts send", "send": "ts-node src/cli.ts send",
"balance": "ts-node src/cli.ts balance", "balance": "ts-node src/cli.ts balance",
"sign": "ts-node src/cli.ts sign", "sign": "ts-node src/cli.ts sign",
"broadcast": "ts-node src/cli.ts broadcast", "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": "", "author": "",
"license": "MIT", "license": "MIT",
@ -53,12 +50,12 @@
"dependencies": {}, "dependencies": {},
"optionalDependencies": {}, "optionalDependencies": {},
"devDependencies": { "devDependencies": {
"@colors/colors": "^1.6.0", "@colors/colors": "1.5.0",
"@tornado/core": "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#092989ebaa2fcd84eff7d4aed66433e77c790c60", "@tornado/core": "git+https://codeberg.org/tornadocash/tornado-core.git#ef56beb29b3dc8808167acefe2bd23c2680643b2",
"@typechain/ethers-v6": "^0.5.1", "@typechain/ethers-v6": "^0.5.1",
"@types/figlet": "^1.7.0", "@types/figlet": "^1.5.8",
"@typescript-eslint/eslint-plugin": "^8.11.0", "@typescript-eslint/eslint-plugin": "^8.6.0",
"@typescript-eslint/parser": "^8.11.0", "@typescript-eslint/parser": "^8.6.0",
"bloomfilter.js": "^1.0.2", "bloomfilter.js": "^1.0.2",
"cli-table3": "^0.6.4", "cli-table3": "^0.6.4",
"commander": "^12.0.0", "commander": "^12.0.0",
@ -67,9 +64,9 @@
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-typescript": "^3.6.3", "eslint-import-resolver-typescript": "^3.6.3",
"eslint-plugin-import": "^2.31.0", "eslint-plugin-import": "^2.30.0",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"figlet": "^1.8.0", "figlet": "^1.7.0",
"http-proxy-agent": "^7.0.2", "http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.4", "https-proxy-agent": "^7.0.4",
"moment": "^2.30.1", "moment": "^2.30.1",
@ -78,8 +75,8 @@
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tsc": "^2.0.4", "tsc": "^2.0.4",
"typechain": "^8.3.2", "typechain": "^8.3.2",
"typescript": "^5.6.3", "typescript": "^5.6.2",
"webpack": "^5.95.0", "webpack": "^5.94.0",
"webpack-cli": "^5.1.4" "webpack-cli": "^5.1.4"
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,8 @@
import path from 'path'; import path from 'path';
import { deflate, constants } from 'zlib'; import { deflate, constants } from 'zlib';
import { stat, mkdir, readFile, writeFile } from 'fs/promises'; import { stat, mkdir, readFile, writeFile } from 'fs/promises';
import { BaseEvents, CachedEvents, MinimalEvents, zipAsync, unzipAsync } from '@tornado/core'; import { zip, unzip, AsyncZippable, Unzipped } from 'fflate';
import { BaseEvents, CachedEvents, MinimalEvents } from '@tornado/core';
export async function existsAsync(fileOrDir: string): Promise<boolean> { export async function existsAsync(fileOrDir: string): Promise<boolean> {
try { try {
@ -35,6 +36,30 @@ export function deflateAsync(data: Uint8Array): Promise<Buffer> {
}); });
} }
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);
});
});
}
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({ export async function saveLegacyFile({
fileName, fileName,
userDirectory, userDirectory,
@ -85,16 +110,18 @@ export async function saveUserFile({
export async function loadSavedEvents<T extends MinimalEvents>({ export async function loadSavedEvents<T extends MinimalEvents>({
name, name,
userDirectory, userDirectory,
deployedBlock,
}: { }: {
name: string; name: string;
userDirectory: string; userDirectory: string;
deployedBlock: number;
}): Promise<BaseEvents<T>> { }): Promise<BaseEvents<T>> {
const filePath = path.join(userDirectory, `${name}.json`.toLowerCase()); const filePath = path.join(userDirectory, `${name}.json`.toLowerCase());
if (!(await existsAsync(filePath))) { if (!(await existsAsync(filePath))) {
return { return {
events: [] as T[], events: [] as T[],
lastBlock: 0, lastBlock: null,
}; };
} }
@ -103,14 +130,14 @@ export async function loadSavedEvents<T extends MinimalEvents>({
return { return {
events, events,
lastBlock: events[events.length - 1]?.blockNumber || 0, lastBlock: events && events.length ? events[events.length - 1].blockNumber : deployedBlock,
}; };
} catch (err) { } catch (err) {
console.log('Method loadSavedEvents has error'); console.log('Method loadSavedEvents has error');
console.log(err); console.log(err);
return { return {
events: [], events: [],
lastBlock: 0, lastBlock: deployedBlock,
}; };
} }
} }

File diff suppressed because it is too large Load Diff

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.

View File

@ -1,100 +1,262 @@
{ {
"lastBlock": 20874000, "timestamp": 1726890359,
"timestamp": 1727826179,
"relayers": [ "relayers": [
{ {
"ensName": "tornadowithdraw.eth", "ensName": "okrelayer.eth",
"relayerAddress": "0x40c3d1656a26C9266f4A10fed0D87EFf79F54E64", "relayerAddress": "0x0e9D9a828247F5eed7f6D31D213A39805De52441",
"hostnames": {},
"tovarishHost": "tornadowithdraw.com",
"tovarishNetworks": [
1,
56,
137,
10,
42161,
100,
43114,
11155111
]
},
{
"ensName": "therelayer.eth",
"relayerAddress": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
"isRegistered": true, "isRegistered": true,
"owner": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1", "owner": "0x0e9D9a828247F5eed7f6D31D213A39805De52441",
"stakeBalance": "1335.888771359625809238", "stakeBalance": "4666.679387946529032297",
"hostnames": { "hostnames": {
"1": "mainnet.therelayer.xyz", "1": "okrelayer.xyz",
"10": "optimism.therelayer.xyz", "56": "binance.okrelayer.xyz",
"56": "bsc.therelayer.xyz", "137": "polygon.okrelayer.xyz",
"100": "xdai.therelayer.xyz", "42161": "arb.okrelayer.xyz"
"137": "polygon.therelayer.xyz",
"42161": "arbitrum.therelayer.xyz",
"43114": "avalanche.therelayer.xyz"
} }
}, },
{ {
"ensName": "cheap-relayer.eth", "ensName": "quick-relayer.eth",
"relayerAddress": "0x076D4E32C6A5D888fC4658281539c94E778C796d", "relayerAddress": "0x187541D7D312F742040f270d0221B4Fe577934B0",
"isRegistered": true, "isRegistered": true,
"owner": "0x076D4E32C6A5D888fC4658281539c94E778C796d", "owner": "0x187541D7D312F742040f270d0221B4Fe577934B0",
"stakeBalance": "500.878420081833044818", "stakeBalance": "2931.033250737658918569",
"hostnames": { "hostnames": {
"1": "mainnet-tornado.cheap-relayer.xyz", "1": "quick-relayer.xyz"
"56": "bsc-tornado.cheap-relayer.xyz",
"137": "polygon-tornado.cheap-relayer.xyz",
"43114": "avalanche-tornado.cheap-relayer.xyz"
} }
}, },
{ {
"ensName": "lowcost.eth", "ensName": "safety-relayer.eth",
"relayerAddress": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d", "relayerAddress": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8",
"isRegistered": true, "isRegistered": true,
"owner": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d", "owner": "0xF1F4F76c9969eFbFB5C9A90a6E44c0E3696D3EF8",
"stakeBalance": "500.279638085962965981", "stakeBalance": "500.879215977529089999",
"hostnames": { "hostnames": {
"1": "mainnet-tornado.low-fee.xyz", "1": "a-relayer.top",
"56": "bsc-tornado.low-fee.xyz", "56": "bsc.a-relayer.top",
"137": "polygon-tornado.low-fee.xyz", "137": "polygon.a-relayer.top"
"43114": "avalanche-tornado.low-fee.xyz"
} }
}, },
{ {
"ensName": "relayernews.eth", "ensName": "k-relayer.eth",
"relayerAddress": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70", "relayerAddress": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c",
"isRegistered": true, "isRegistered": true,
"owner": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70", "owner": "0xC49415493eB3Ec64a0F13D8AA5056f1CfC4ce35c",
"stakeBalance": "1661.181918638614466424", "stakeBalance": "2194.529689989084430299",
"hostnames": { "hostnames": {
"1": "mainnet-tornado.relayernews.xyz", "1": "black-hardy.com",
"56": "bsc-tornado.relayernews.xyz" "56": "bsc.black-hardy.com"
} }
}, },
{ {
"ensName": "on-sale.eth", "ensName": "relayer007.eth",
"relayerAddress": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E", "relayerAddress": "0xa0109274F53609f6Be97ec5f3052C659AB80f012",
"isRegistered": true, "isRegistered": true,
"owner": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E", "owner": "0xa0109274F53609f6Be97ec5f3052C659AB80f012",
"stakeBalance": "4476.543684932880020592", "stakeBalance": "4989.637826137906607638",
"hostnames": { "hostnames": {
"1": "mainnet-tornado.appleworld.club", "1": "torn.relayersdao.finance",
"56": "bsc-tornado.appleworld.club" "56": "bsc.relayersdao.finance",
"137": "matic.relayersdao.finance"
} }
}, },
{ {
"ensName": "em3tornado.eth", "ensName": "reltor.eth",
"relayerAddress": "0x3a1d526D09b7E59Fd88De4726f68A8246dDC2742", "relayerAddress": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5",
"isRegistered": true, "isRegistered": true,
"owner": "0x3a1d526D09b7E59Fd88De4726f68A8246dDC2742", "owner": "0x4750BCfcC340AA4B31be7e71fa072716d28c29C5",
"stakeBalance": "16864.242955629118561145", "stakeBalance": "19999.983956326624881327",
"hostnames": { "hostnames": {
"1": "em3torn.com", "1": "eth.reltor.su",
"10": "optimism.em3torn.com", "56": "binance.reltor.su",
"56": "bsc.em3torn.com", "137": "polygon.reltor.su"
"137": "polygon.em3torn.com", }
"42161": "arbitrum.em3torn.com", },
"43114": "avax.em3torn.com" {
"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"
} }
}, },
{ {
@ -113,271 +275,82 @@
} }
}, },
{ {
"ensName": "0xtorn.eth", "ensName": "em3tornado.eth",
"relayerAddress": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B", "relayerAddress": "0x3a1d526D09b7E59Fd88De4726f68A8246dDC2742",
"isRegistered": true, "isRegistered": true,
"owner": "0x9Ffbd3f9eE795A4fDa880ED553A2A4BD6D45CE5B", "owner": "0x3a1d526D09b7E59Fd88De4726f68A8246dDC2742",
"stakeBalance": "4627.036617270139345308", "stakeBalance": "16864.242955629118561145",
"hostnames": { "hostnames": {
"1": "mainnet.al1n.cc", "1": "em3torn.com",
"56": "bsc-tornado.al1n.cc" "10": "optimism.em3torn.com",
"56": "bsc.em3torn.com",
"137": "polygon.em3torn.com",
"42161": "arbitrum.em3torn.com",
"43114": "avax.em3torn.com"
} }
}, },
{ {
"ensName": "wetez.eth", "ensName": "on-sale.eth",
"relayerAddress": "0xe6184DA55174Cc0263a17eA2fc24E48511766505", "relayerAddress": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E",
"isRegistered": true, "isRegistered": true,
"owner": "0xe6184DA55174Cc0263a17eA2fc24E48511766505", "owner": "0x63606C4011e97a73BCd844Cde6a38D45a728BC0E",
"stakeBalance": "567.980734786905511868", "stakeBalance": "4476.543684932880020592",
"hostnames": { "hostnames": {
"1": "tornado-1.wetez.io" "1": "mainnet-tornado.appleworld.club",
"56": "bsc-tornado.appleworld.club"
} }
}, },
{ {
"ensName": "0xproxy.eth", "ensName": "relayernews.eth",
"relayerAddress": "0x08657a1f4C1F06d657F31767831421EE7FaDf549", "relayerAddress": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70",
"isRegistered": true, "isRegistered": true,
"owner": "0x08657a1f4C1F06d657F31767831421EE7FaDf549", "owner": "0x6289C8a70EE2Ed6914834CaEa431F9a82c7eAf70",
"stakeBalance": "705.605817336537209483", "stakeBalance": "1661.181918638614466424",
"hostnames": { "hostnames": {
"1": "mainnet.0x0relayer.xyz", "1": "mainnet-tornado.relayernews.xyz",
"56": "bsc.0x0relayer.xyz", "56": "bsc-tornado.relayernews.xyz"
"137": "polygon.0x0relayer.xyz"
} }
}, },
{ {
"ensName": "torn-eth.eth", "ensName": "lowcost.eth",
"relayerAddress": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E", "relayerAddress": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d",
"isRegistered": true, "isRegistered": true,
"owner": "0x42FecB4137aFF76E0E85702ff4F339DbFe6D859E", "owner": "0x28907F21F43B419F34226d6f10aCbCf1832b1D4d",
"stakeBalance": "978.62598484549460861", "stakeBalance": "500.279638085962965981",
"hostnames": { "hostnames": {
"1": "mainnet-tornado.50swap.com" "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": "shadow-out.eth", "ensName": "cheap-relayer.eth",
"relayerAddress": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151", "relayerAddress": "0x076D4E32C6A5D888fC4658281539c94E778C796d",
"isRegistered": true, "isRegistered": true,
"owner": "0x9Ee26a4bFd731E8e742B65bF955814EADdd7F151", "owner": "0x076D4E32C6A5D888fC4658281539c94E778C796d",
"stakeBalance": "3571.639136672079169166", "stakeBalance": "500.878420081833044818",
"hostnames": { "hostnames": {
"1": "livetobecomeavillain", "1": "mainnet-tornado.cheap-relayer.xyz",
"56": "justarandomdude", "56": "bsc-tornado.cheap-relayer.xyz",
"100": "everythingisburning" "137": "polygon-tornado.cheap-relayer.xyz",
"43114": "avalanche-tornado.cheap-relayer.xyz"
} }
}, },
{ {
"ensName": "bitah.eth", "ensName": "therelayer.eth",
"relayerAddress": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42", "relayerAddress": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
"isRegistered": true, "isRegistered": true,
"owner": "0x7E3893725d4e238B4c8c83375bBAd024a66Ffa42", "owner": "0xA0F0287683E820FF4211e67C03cf46a87431f4E1",
"stakeBalance": "503.237718892072788154", "stakeBalance": "1335.888771359625809238",
"hostnames": { "hostnames": {
"1": "tornado.bitah.link", "1": "mainnet.therelayer.xyz",
"56": "bsc-tornado.bitah.link", "10": "optimism.therelayer.xyz",
"137": "polygon-tornado.bitah.link" "56": "bsc.therelayer.xyz",
} "100": "xdai.therelayer.xyz",
}, "137": "polygon.therelayer.xyz",
{ "42161": "arbitrum.therelayer.xyz",
"ensName": "torntorn.eth", "43114": "avalanche.therelayer.xyz"
"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"
} }
} }
] ]

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.

Some files were not shown because too many files have changed in this diff Show More