From 0a305433ba67826b712e3350d6b1487074bafcff Mon Sep 17 00:00:00 2001 From: tornadocontrib Date: Thu, 10 Oct 2024 23:23:55 +0000 Subject: [PATCH] Optimize mainnet fees --- dist/cli.js | 269 +++++++++++++++++++++++++++++-------------------- package.json | 2 +- src/program.ts | 51 +++++----- yarn.lock | 4 +- 4 files changed, 185 insertions(+), 141 deletions(-) diff --git a/dist/cli.js b/dist/cli.js index 0de99bd..38cdf8b 100644 --- a/dist/cli.js +++ b/dist/cli.js @@ -178283,7 +178283,7 @@ var groth16 = __webpack_require__(36336); -var __async$h = (__this, __arguments, generator) => { +var __async$i = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -178392,7 +178392,7 @@ function substring(str, length = 10) { return `${str.substring(0, length)}...${str.substring(str.length - length)}`; } function digest(bytes, algo = "SHA-384") { - return __async$h(this, null, function* () { + return __async$i(this, null, function* () { return new Uint8Array(yield dist_crypto.subtle.digest(algo, bytes)); }); } @@ -178419,7 +178419,7 @@ var __spreadValues$8 = (a, b) => { }; var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b)); var __superGet$2 = (cls, obj, key) => __reflectGet$2(__getProtoOf$2(cls), key, obj); -var __async$g = (__this, __arguments, generator) => { +var __async$h = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -178468,7 +178468,7 @@ function getHttpAgent({ } } function fetchData(_0) { - return __async$g(this, arguments, function* (url, options = {}) { + return __async$h(this, arguments, function* (url, options = {}) { var _a, _b, _c; const MAX_RETRY = (_a = options.maxRetry) != null ? _a : 3; const RETRY_ON = (_b = options.retryOn) != null ? _b : 500; @@ -178560,7 +178560,7 @@ function fetchData(_0) { throw errorObject; }); } -const fetchGetUrlFunc = (options = {}) => (req, _signal) => __async$g(void 0, null, function* () { +const fetchGetUrlFunc = (options = {}) => (req, _signal) => __async$h(void 0, null, function* () { let signal; if (_signal) { const controller = new AbortController(); @@ -178591,7 +178591,7 @@ const fetchGetUrlFunc = (options = {}) => (req, _signal) => __async$g(void 0, nu }; }); function dist_getProvider(rpcUrl, fetchOptions) { - return __async$g(this, null, function* () { + return __async$h(this, null, function* () { const fetchReq = new fetch_FetchRequest(rpcUrl); fetchReq.getUrlFunc = fetchGetUrlFunc(fetchOptions); const staticNetwork = yield new provider_jsonrpc_JsonRpcProvider(fetchReq).getNetwork(); @@ -178622,7 +178622,7 @@ function getProviderWithNetId(netId, rpcUrl, config, fetchOptions) { }); return provider; } -const populateTransaction = (signer, tx) => __async$g(void 0, null, function* () { +const populateTransaction = (signer, tx) => __async$h(void 0, null, function* () { const provider = signer.provider; if (!tx.from) { tx.from = signer.address; @@ -178683,7 +178683,7 @@ class TornadoWallet extends Wallet { return new TornadoWallet(privateKey, provider, options); } populateTransaction(tx) { - return __async$g(this, null, function* () { + return __async$h(this, null, function* () { const txObject = yield populateTransaction(this, tx); this.nonce = Number(txObject.nonce); return __superGet$2(TornadoWallet.prototype, this, "populateTransaction").call(this, txObject); @@ -178699,7 +178699,7 @@ class TornadoVoidSigner extends VoidSigner { this.bumpNonce = bumpNonce != null ? bumpNonce : false; } populateTransaction(tx) { - return __async$g(this, null, function* () { + return __async$h(this, null, function* () { const txObject = yield populateTransaction(this, tx); this.nonce = Number(txObject.nonce); return __superGet$2(TornadoVoidSigner.prototype, this, "populateTransaction").call(this, txObject); @@ -178715,7 +178715,7 @@ class TornadoRpcSigner extends JsonRpcSigner { this.bumpNonce = bumpNonce != null ? bumpNonce : false; } sendUncheckedTransaction(tx) { - return __async$g(this, null, function* () { + return __async$h(this, null, function* () { return __superGet$2(TornadoRpcSigner.prototype, this, "sendUncheckedTransaction").call(this, yield populateTransaction(this, tx)); }); } @@ -178726,7 +178726,7 @@ class TornadoBrowserProvider extends BrowserProvider { this.options = options; } getSigner(address) { - return __async$g(this, null, function* () { + return __async$h(this, null, function* () { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j; const signerAddress = (yield __superGet$2(TornadoBrowserProvider.prototype, this, "getSigner").call(this, address)).address; if (((_a = this.options) == null ? void 0 : _a.netId) && ((_b = this.options) == null ? void 0 : _b.connectWallet) && Number(yield __superGet$2(TornadoBrowserProvider.prototype, this, "send").call(this, "net_version", [])) !== ((_c = this.options) == null ? void 0 : _c.netId)) { @@ -178954,7 +178954,7 @@ var __spreadValues$7 = (a, b) => { return a; }; var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b)); -var __async$f = (__this, __arguments, generator) => { +var __async$g = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -178977,7 +178977,7 @@ var __async$f = (__this, __arguments, generator) => { const isEmptyArray = (arr) => !Array.isArray(arr) || !arr.length; const GRAPHQL_LIMIT = 1e3; function queryGraph(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, query, @@ -179006,7 +179006,7 @@ function queryGraph(_0) { }); } function getStatistic(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, currency, @@ -179053,7 +179053,7 @@ function getStatistic(_0) { }); } function getMeta(_0) { - return __async$f(this, arguments, function* ({ graphApi, subgraphName, fetchDataOptions: fetchDataOptions2 }) { + return __async$g(this, arguments, function* ({ graphApi, subgraphName, fetchDataOptions: fetchDataOptions2 }) { try { const { _meta: { @@ -179098,7 +179098,7 @@ function getRegisters({ }); } function getAllRegisters(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, fromBlock, @@ -179187,7 +179187,7 @@ function getDeposits({ }); } function getAllDeposits(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, currency, @@ -179284,7 +179284,7 @@ function getWithdrawals({ }); } function getAllWithdrawals(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, currency, @@ -179360,7 +179360,7 @@ function getAllWithdrawals(_0) { }); } function getNoteAccounts(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, address, @@ -179413,7 +179413,7 @@ function getGraphEchoEvents({ }); } function getAllGraphEchoEvents(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, fromBlock, @@ -179502,7 +179502,7 @@ function getEncryptedNotes({ }); } function getAllEncryptedNotes(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, fromBlock, @@ -179587,7 +179587,7 @@ function getGovernanceEvents({ }); } function getAllGovernanceEvents(_0) { - return __async$f(this, arguments, function* ({ + return __async$g(this, arguments, function* ({ graphApi, subgraphName, fromBlock, @@ -179746,7 +179746,7 @@ var graph = /*#__PURE__*/Object.freeze({ queryGraph: queryGraph }); -var __async$e = (__this, __arguments, generator) => { +var __async$f = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -179785,7 +179785,7 @@ class BatchBlockService { this.retryOn = retryOn; } getBlock(blockTag) { - return __async$e(this, null, function* () { + return __async$f(this, null, function* () { const blockObject = yield this.provider.getBlock(blockTag); if (!blockObject) { const errMsg = `No block for ${blockTag}`; @@ -179795,9 +179795,9 @@ class BatchBlockService { }); } createBatchRequest(batchArray) { - return batchArray.map((blocks, index) => __async$e(this, null, function* () { + return batchArray.map((blocks, index) => __async$f(this, null, function* () { yield dist_sleep(20 * index); - return (() => __async$e(this, null, function* () { + return (() => __async$f(this, null, function* () { let retries = 0; let err; while (!this.shouldRetry && retries === 0 || this.shouldRetry && retries < this.retryMax) { @@ -179814,7 +179814,7 @@ class BatchBlockService { })); } getBatchBlocks(blocks) { - return __async$e(this, null, function* () { + return __async$f(this, null, function* () { let blockCount = 0; const results = []; for (const chunks of chunk(blocks, this.concurrencySize * this.batchSize)) { @@ -179852,7 +179852,7 @@ class BatchTransactionService { this.retryOn = retryOn; } getTransaction(txHash) { - return __async$e(this, null, function* () { + return __async$f(this, null, function* () { const txObject = yield this.provider.getTransaction(txHash); if (!txObject) { const errMsg = `No transaction for ${txHash}`; @@ -179862,9 +179862,9 @@ class BatchTransactionService { }); } createBatchRequest(batchArray) { - return batchArray.map((txs, index) => __async$e(this, null, function* () { + return batchArray.map((txs, index) => __async$f(this, null, function* () { yield dist_sleep(20 * index); - return (() => __async$e(this, null, function* () { + return (() => __async$f(this, null, function* () { let retries = 0; let err; while (!this.shouldRetry && retries === 0 || this.shouldRetry && retries < this.retryMax) { @@ -179881,7 +179881,7 @@ class BatchTransactionService { })); } getBatchTransactions(txs) { - return __async$e(this, null, function* () { + return __async$f(this, null, function* () { let txCount = 0; const results = []; for (const chunks of chunk(txs, this.concurrencySize * this.batchSize)) { @@ -179917,7 +179917,7 @@ class BatchEventsService { this.retryOn = retryOn; } getPastEvents(_0) { - return __async$e(this, arguments, function* ({ fromBlock, toBlock, type }) { + return __async$f(this, arguments, function* ({ fromBlock, toBlock, type }) { let err; let retries = 0; while (!this.shouldRetry && retries === 0 || this.shouldRetry && retries < this.retryMax) { @@ -179937,13 +179937,13 @@ class BatchEventsService { }); } createBatchRequest(batchArray) { - return batchArray.map((event, index) => __async$e(this, null, function* () { + return batchArray.map((event, index) => __async$f(this, null, function* () { yield dist_sleep(20 * index); return this.getPastEvents(event); })); } getBatchEvents(_0) { - return __async$e(this, arguments, function* ({ fromBlock, toBlock, type = "*" }) { + return __async$f(this, arguments, function* ({ fromBlock, toBlock, type = "*" }) { if (!toBlock) { toBlock = yield this.provider.getBlockNumber(); } @@ -180984,7 +180984,7 @@ var __spreadValues$3 = (a, b) => { return a; }; var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b)); -var __async$d = (__this, __arguments, generator) => { +var __async$e = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -181050,7 +181050,7 @@ class RelayerClient { this.tovarish = false; } askRelayerStatus(_0) { - return __async$d(this, arguments, function* ({ + return __async$e(this, arguments, function* ({ hostname, url, relayerAddress @@ -181090,7 +181090,7 @@ class RelayerClient { }); } filterRelayer(relayer) { - return __async$d(this, null, function* () { + return __async$e(this, null, function* () { var _a; const hostname = relayer.hostnames[this.netId]; const { ensName, relayerAddress } = relayer; @@ -181124,7 +181124,7 @@ class RelayerClient { }); } getValidRelayers(relayers) { - return __async$d(this, null, function* () { + return __async$e(this, null, function* () { const invalidRelayers = []; const validRelayers = (yield Promise.all(relayers.map((relayer) => this.filterRelayer(relayer)))).filter((r) => { if (!r) { @@ -181146,7 +181146,7 @@ class RelayerClient { return pickWeightedRandomRelayer(relayers); } tornadoWithdraw(_0, _1) { - return __async$d(this, arguments, function* ({ contract, proof, args }, callback) { + return __async$e(this, arguments, function* ({ contract, proof, args }, callback) { const { url } = this.selectedRelayer; const withdrawResponse = yield fetchData(`${url}v1/tornadoWithdraw`, __spreadProps$2(__spreadValues$3({}, this.fetchDataOptions), { method: "POST", @@ -181233,7 +181233,7 @@ var __spreadValues$2 = (a, b) => { }; var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b)); var __superGet$1 = (cls, obj, key) => __reflectGet$1(__getProtoOf$1(cls), key, obj); -var __async$c = (__this, __arguments, generator) => { +var __async$d = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -181313,7 +181313,7 @@ class BaseEventsService { } /* eslint-enable @typescript-eslint/no-unused-vars */ formatEvents(events) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return yield new Promise((resolve) => resolve(events)); }); } @@ -181321,7 +181321,7 @@ class BaseEventsService { * Get saved or cached events */ getEventsFromDB() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return { events: [], lastBlock: 0 @@ -181332,7 +181332,7 @@ class BaseEventsService { * Events from remote cache (Either from local cache, CDN, or from IPFS) */ getEventsFromCache() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return { events: [], lastBlock: 0, @@ -181341,7 +181341,7 @@ class BaseEventsService { }); } getSavedEvents() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { let dbEvents = yield this.getEventsFromDB(); if (!dbEvents.lastBlock) { dbEvents = yield this.getEventsFromCache(); @@ -181353,7 +181353,7 @@ class BaseEventsService { * Get latest events */ getEventsFromGraph(_0) { - return __async$c(this, arguments, function* ({ + return __async$d(this, arguments, function* ({ fromBlock, methodName = "" }) { @@ -181373,7 +181373,7 @@ class BaseEventsService { }); } getEventsFromRpc(_0) { - return __async$c(this, arguments, function* ({ + return __async$d(this, arguments, function* ({ fromBlock, toBlock }) { @@ -181405,7 +181405,7 @@ class BaseEventsService { }); } getLatestEvents(_0) { - return __async$c(this, arguments, function* ({ fromBlock }) { + return __async$d(this, arguments, function* ({ fromBlock }) { var _a; if (((_a = this.tovarishClient) == null ? void 0 : _a.selectedRelayer) && ![DEPOSIT, WITHDRAWAL].includes(this.type.toLowerCase())) { const { events, lastSyncBlock: lastBlock } = yield this.tovarishClient.getEvents({ @@ -181434,14 +181434,14 @@ class BaseEventsService { */ // eslint-disable-next-line @typescript-eslint/no-unused-vars saveEvents(_0) { - return __async$c(this, arguments, function* ({ events, lastBlock }) { + return __async$d(this, arguments, function* ({ events, lastBlock }) { }); } /** * Trigger saving and receiving latest events */ updateEvents() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { var _a; const savedEvents = yield this.getSavedEvents(); let fromBlock = this.deployedBlock; @@ -181526,7 +181526,7 @@ class BaseTornadoService extends BaseEventsService { }; } formatEvents(events) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { const type = this.getType().toLowerCase(); if (type === DEPOSIT) { const formattedEvents = events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { @@ -181583,7 +181583,7 @@ class BaseTornadoService extends BaseEventsService { } } getLatestEvents(_0) { - return __async$c(this, arguments, function* ({ fromBlock }) { + return __async$d(this, arguments, function* ({ fromBlock }) { var _a; if ((_a = this.tovarishClient) == null ? void 0 : _a.selectedRelayer) { const { events, lastSyncBlock: lastBlock } = yield this.tovarishClient.getEvents({ @@ -181633,7 +181633,7 @@ class BaseEchoService extends BaseEventsService { return "getAllGraphEchoEvents"; } formatEvents(events) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { const { who, data } = args; if (who && data) { @@ -181651,7 +181651,7 @@ class BaseEchoService extends BaseEventsService { }); } getEventsFromGraph(_0) { - return __async$c(this, arguments, function* ({ fromBlock }) { + return __async$d(this, arguments, function* ({ fromBlock }) { if (!this.graphApi || this.graphApi.includes("api.thegraph.com")) { return { events: [], @@ -181697,7 +181697,7 @@ class BaseEncryptedNotesService extends BaseEventsService { return "getAllEncryptedNotes"; } formatEvents(events) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { const { encryptedNote } = args; if (encryptedNote && encryptedNote !== "0x") { @@ -181753,7 +181753,7 @@ class BaseGovernanceService extends BaseEventsService { return "getAllGovernanceEvents"; } formatEvents(events) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { const proposalEvents = []; const votedEvents = []; const delegatedEvents = []; @@ -181820,7 +181820,7 @@ class BaseGovernanceService extends BaseEventsService { }); } getEventsFromGraph(_0) { - return __async$c(this, arguments, function* ({ fromBlock }) { + return __async$d(this, arguments, function* ({ fromBlock }) { if (!this.graphApi || !this.subgraphName || this.graphApi.includes("api.thegraph.com")) { return { events: [], @@ -181832,9 +181832,9 @@ class BaseGovernanceService extends BaseEventsService { } } function getTovarishNetworks(registryService, relayers) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { yield Promise.all( - relayers.filter((r) => r.tovarishHost).map((relayer) => __async$c(this, null, function* () { + relayers.filter((r) => r.tovarishHost).map((relayer) => __async$d(this, null, function* () { var _a; try { relayer.tovarishNetworks = yield fetchData(relayer.tovarishHost, __spreadProps$1(__spreadValues$2({}, registryService.fetchDataOptions), { @@ -181902,7 +181902,7 @@ class BaseRegistryService extends BaseEventsService { return "getAllRegisters"; } formatEvents(events) { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return events.map(({ blockNumber, index: logIndex, transactionHash, args }) => { const eventObjects = { blockNumber, @@ -181920,7 +181920,7 @@ class BaseRegistryService extends BaseEventsService { * Get saved or cached relayers */ getRelayersFromDB() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return { lastBlock: 0, timestamp: 0, @@ -181932,7 +181932,7 @@ class BaseRegistryService extends BaseEventsService { * Relayers from remote cache (Either from local cache, CDN, or from IPFS) */ getRelayersFromCache() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { return { lastBlock: 0, timestamp: 0, @@ -181942,7 +181942,7 @@ class BaseRegistryService extends BaseEventsService { }); } getSavedRelayers() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { let cachedRelayers = yield this.getRelayersFromDB(); if (!cachedRelayers || !cachedRelayers.relayers.length) { cachedRelayers = yield this.getRelayersFromCache(); @@ -181951,7 +181951,7 @@ class BaseRegistryService extends BaseEventsService { }); } getLatestRelayers() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { const { events, lastBlock } = yield this.updateEvents(); const subdomains = Object.values(this.relayerEnsSubdomains); const registerSet = /* @__PURE__ */ new Set(); @@ -182011,14 +182011,14 @@ class BaseRegistryService extends BaseEventsService { */ // eslint-disable-next-line @typescript-eslint/no-unused-vars saveRelayers(_0) { - return __async$c(this, arguments, function* ({ lastBlock, timestamp, relayers }) { + return __async$d(this, arguments, function* ({ lastBlock, timestamp, relayers }) { }); } /** * Get cached or latest relayer and save to local */ updateRelayers() { - return __async$c(this, null, function* () { + return __async$d(this, null, function* () { let { lastBlock, timestamp, relayers, fromCache } = yield this.getSavedRelayers(); let shouldSave = fromCache != null ? fromCache : false; if (!relayers.length || timestamp + this.updateInterval < Math.floor(Date.now() / 1e3)) { @@ -182034,7 +182034,7 @@ class BaseRegistryService extends BaseEventsService { } } -var __async$b = (__this, __arguments, generator) => { +var __async$c = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -182077,7 +182077,7 @@ function unzipAsync(data) { }); } function downloadZip(_0) { - return __async$b(this, arguments, function* ({ + return __async$c(this, arguments, function* ({ staticUrl = "", zipName, zipDigest, @@ -182105,7 +182105,7 @@ function downloadZip(_0) { }); } -var __async$a = (__this, __arguments, generator) => { +var __async$b = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -182126,7 +182126,7 @@ var __async$a = (__this, __arguments, generator) => { }); }; function saveDBEvents(_0) { - return __async$a(this, arguments, function* ({ + return __async$b(this, arguments, function* ({ idb, instanceName, events, @@ -182151,7 +182151,7 @@ function saveDBEvents(_0) { }); } function loadDBEvents(_0) { - return __async$a(this, arguments, function* ({ + return __async$b(this, arguments, function* ({ idb, instanceName }) { @@ -182181,7 +182181,7 @@ function loadDBEvents(_0) { }); } function loadRemoteEvents(_0) { - return __async$a(this, arguments, function* ({ + return __async$b(this, arguments, function* ({ staticUrl, instanceName, deployedBlock, @@ -182222,7 +182222,7 @@ class DBTornadoService extends BaseTornadoService { this.idb = params.idb; } getEventsFromDB() { - return __async$a(this, null, function* () { + return __async$b(this, null, function* () { return yield loadDBEvents({ idb: this.idb, instanceName: this.getInstanceName() @@ -182230,7 +182230,7 @@ class DBTornadoService extends BaseTornadoService { }); } getEventsFromCache() { - return __async$a(this, null, function* () { + return __async$b(this, null, function* () { return yield loadRemoteEvents({ staticUrl: this.staticUrl, instanceName: this.getInstanceName(), @@ -182240,7 +182240,7 @@ class DBTornadoService extends BaseTornadoService { }); } saveEvents(_0) { - return __async$a(this, arguments, function* ({ events, lastBlock }) { + return __async$b(this, arguments, function* ({ events, lastBlock }) { yield saveDBEvents({ idb: this.idb, instanceName: this.getInstanceName(), @@ -184588,7 +184588,7 @@ var dist_index = /*#__PURE__*/Object.freeze({ ReverseRecords__factory: ReverseRecords__factory }); -var __async$9 = (__this, __arguments, generator) => { +var __async$a = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -184613,13 +184613,13 @@ class Pedersen { this.pedersenPromise = this.initPedersen(); } initPedersen() { - return __async$9(this, null, function* () { + return __async$a(this, null, function* () { this.pedersenHash = yield pedersen_hash_buildPedersenHash(); this.babyJub = this.pedersenHash.babyJub; }); } unpackPoint(buffer) { - return __async$9(this, null, function* () { + return __async$a(this, null, function* () { var _a, _b; yield this.pedersenPromise; return (_b = this.babyJub) == null ? void 0 : _b.unpackPoint((_a = this.pedersenHash) == null ? void 0 : _a.hash(buffer)); @@ -184632,13 +184632,13 @@ class Pedersen { } const pedersen = new Pedersen(); function buffPedersenHash(buffer) { - return __async$9(this, null, function* () { + return __async$a(this, null, function* () { const [hash] = yield pedersen.unpackPoint(buffer); return pedersen.toStringBuffer(hash); }); } -var __async$8 = (__this, __arguments, generator) => { +var __async$9 = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { @@ -184659,7 +184659,7 @@ var __async$8 = (__this, __arguments, generator) => { }); }; function createDeposit(_0) { - return __async$8(this, arguments, function* ({ nullifier, secret }) { + return __async$9(this, arguments, function* ({ nullifier, secret }) { const preimage = new Uint8Array([...dist_leInt2Buff(nullifier), ...dist_leInt2Buff(secret)]); const noteHex = toFixedHex(bytesToBN(preimage), 62); const commitment = BigInt(yield buffPedersenHash(preimage)); @@ -184719,7 +184719,7 @@ class Deposit { ); } static createNote(_0) { - return __async$8(this, arguments, function* ({ currency, amount, netId, nullifier, secret }) { + return __async$9(this, arguments, function* ({ currency, amount, netId, nullifier, secret }) { if (!nullifier) { nullifier = rBigInt(31); } @@ -184746,7 +184746,7 @@ class Deposit { }); } static parseNote(noteString) { - return __async$8(this, null, function* () { + return __async$9(this, null, function* () { const noteRegex = new RegExp("tornado-(?\\w+)-(?[\\d.]+)-(?\\d+)-0x(?[0-9a-fA-F]{124})", "g"); const match = noteRegex.exec(noteString); if (!match) { @@ -184931,6 +184931,26 @@ class NoteAccount { } } +var __async$8 = (__this, __arguments, generator) => { + return new Promise((resolve, reject) => { + var fulfilled = (value) => { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + }; + var rejected = (value) => { + try { + step(generator.throw(value)); + } catch (e) { + reject(e); + } + }; + var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); + step((generator = generator.apply(__this, __arguments)).next()); + }); +}; const DUMMY_ADDRESS = "0x1111111111111111111111111111111111111111"; const DUMMY_NONCE = 1024; const DUMMY_WITHDRAW_DATA = "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"; @@ -184939,11 +184959,41 @@ function convertETHToTokenAmount(amountInWei, tokenPriceInWei, tokenDecimals = 1 return BigInt(amountInWei) * tokenDecimalsMultiplier / BigInt(tokenPriceInWei); } class TornadoFeeOracle { - constructor(ovmGasPriceOracle) { + constructor(provider, ovmGasPriceOracle) { + this.provider = provider; if (ovmGasPriceOracle) { this.ovmGasPriceOracle = ovmGasPriceOracle; } } + /** + * Calculates Gas Price + * We apply 50% premium of EIP-1559 network fees instead of 100% from ethers.js + * (This should cover up to 4 full blocks which is equivalent of minute) + * (A single block can bump 12.5% of fees, see the methodology https://hackmd.io/@tvanepps/1559-wallets) + * (Still it is recommended to use 100% premium for sending transactions to prevent stucking it) + */ + gasPrice() { + return __async$8(this, null, function* () { + const [block, getGasPrice, getPriorityFee] = yield Promise.all([ + this.provider.getBlock("latest"), + (() => __async$8(this, null, function* () { + try { + return BigInt(yield this.provider.send("eth_gasPrice", [])); + } catch (e) { + return parseUnits("1", "gwei"); + } + }))(), + (() => __async$8(this, null, function* () { + try { + return BigInt(yield this.provider.send("eth_maxPriorityFeePerGas", [])); + } catch (e) { + return BigInt(0); + } + }))() + ]); + return (block == null ? void 0 : block.baseFeePerGas) ? block.baseFeePerGas * BigInt(15) / BigInt(10) + getPriorityFee : getGasPrice; + }); + } /** * Calculate L1 fee for op-stack chains * @@ -187815,7 +187865,7 @@ function tornadoProgram() { "Withdraw a note to a recipient account using relayer or specified private key. \n\nYou can exchange some of your deposit`s tokens to ETH during the withdrawal by specifing ETH_purchase (e.g. 0.01) to pay for gas in future transactions. \n\nAlso see the --relayer option.\n\n" ).argument("", "Tornado Cash Deposit Note").argument("", "Recipient to receive withdrawn amount", parseAddress).argument("[ETH_purchase]", "ETH to purchase", parseNumber).action( (note, recipient, ethPurchase, cmdOptions) => program_async(this, null, function* () { - var _a; + var _a, _b, _c, _d; const { options, fetchDataOptions: fetchDataOptions2 } = yield getProgramOptions(cmdOptions); const { rpc, walletWithdrawal, disableTovarish } = options; initGroth16(); @@ -187861,6 +187911,11 @@ function tornadoProgram() { Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null ? void 0 : _a.url} `); } + if (!walletWithdrawal && !(relayerClient == null ? void 0 : relayerClient.selectedRelayer)) { + throw new Error( + "No valid relayer found for the network, you can either try again, or find any relayers using the relayers command and set with --relayer option" + ); + } const signer = getProgramSigner({ options, provider @@ -187874,6 +187929,7 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null const TornadoProxy = TornadoRouter__factory.connect(routerContract, !walletWithdrawal ? provider : signer); const Multicall = Multicall__factory.connect(multicallContract, provider); const tornadoFeeOracle = new TornadoFeeOracle( + provider, ovmGasPriceOracleContract ? OvmGasPriceOracle__factory.connect(ovmGasPriceOracleContract, provider) : void 0 ); const tokenPriceOracle = new TokenPriceOracle( @@ -187910,7 +187966,7 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null merkleWorkerPath }); const depositEvents = (yield depositsService.updateEvents()).events; - const depositTreePromise = merkleTreeService.verifyTree(depositEvents); + const tree = yield merkleTreeService.verifyTree(depositEvents); const withdrawalEvents = (yield withdrawalsService.updateEvents()).events; const depositEvent = depositEvents.find(({ commitment }) => commitment === commitmentHex); const withdrawalEvent = withdrawalEvents.find(({ nullifierHash }) => nullifierHash === nullifierHex); @@ -187950,21 +188006,15 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null if (withdrawalEvent) { throw new Error("Note is already spent"); } - const [circuit, provingKey, tree, l1Fee, tokenPriceInWei, feeData] = yield Promise.all([ + const [circuit, provingKey, netGasPrice, l1Fee, tokenPriceInWei] = yield Promise.all([ (0,promises_namespaceObject.readFile)(CIRCUIT_PATH, { encoding: "utf8" }).then((s) => JSON.parse(s)), (0,promises_namespaceObject.readFile)(KEY_PATH).then((b) => new Uint8Array(b).buffer), - depositTreePromise, + tornadoFeeOracle.gasPrice(), tornadoFeeOracle.fetchL1OptimismFee(), - !isEth ? tokenPriceOracle.fetchPrices([{ tokenAddress, decimals }]).then((p) => p[0]) : BigInt(0), - provider.getFeeData() + !isEth ? tokenPriceOracle.fetchPrices([{ tokenAddress, decimals }]).then((p) => p[0]) : BigInt(0) ]); const { pathElements, pathIndices } = tree.path(depositEvent.leafIndex); - if (!walletWithdrawal && !(relayerClient == null ? void 0 : relayerClient.selectedRelayer)) { - throw new Error( - "No valid relayer found for the network, you can either try again, or find any relayers using the relayers command and set with --relayer option" - ); - } - let gasPrice = feeData.maxFeePerGas ? feeData.maxFeePerGas + (feeData.maxPriorityFeePerGas || BigInt(0)) : feeData.gasPrice; + let gasPrice = netGasPrice; if (!walletWithdrawal && !tovarishClient && netId === NetId.BSC) { gasPrice = parseUnits("3.3", "gwei"); } @@ -187973,14 +188023,14 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null const refundGasLimit = isFirstAmount && tokenGasLimit ? BigInt(tokenGasLimit) : void 0; function getProof() { return program_async(this, null, function* () { - let relayer2 = ZeroAddress; + let relayer = ZeroAddress; let fee2 = BigInt(0); let refund2 = BigInt(0); - const { url: url2, rewardAccount, tornadoServiceFee } = (relayerClient == null ? void 0 : relayerClient.selectedRelayer) || {}; if (!walletWithdrawal) { if (!isEth) { refund2 = ethPurchase ? parseEther(`${ethPurchase}`) : tornadoFeeOracle.defaultEthRefund(gasPrice, refundGasLimit); } + const { rewardAccount, tornadoServiceFee: relayerFeePercent } = (relayerClient == null ? void 0 : relayerClient.selectedRelayer) || {}; fee2 = tornadoFeeOracle.calculateRelayerFee({ gasPrice, gasLimit, @@ -187989,10 +188039,10 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null ethRefund: refund2, tokenPriceInWei, tokenDecimals: decimals, - relayerFeePercent: tornadoServiceFee, + relayerFeePercent, isEth }); - relayer2 = rewardAccount; + relayer = rewardAccount; if (fee2 > denomination) { const errMsg = `Relayer fee ${formatUnits(fee2, decimals)} ${currency.toUpperCase()} exceeds the deposit amount ${amount} ${currency.toUpperCase()}.`; throw new Error(errMsg); @@ -188003,7 +188053,7 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null root: tree.root, nullifierHex, recipient, - relayer: relayer2, + relayer, fee: fee2, refund: refund2, nullifier, @@ -188015,38 +188065,35 @@ Connected with Tovarish Relayer ${(_a = tovarishClient.selectedRelayer) == null provingKey ); return { - url: url2, - relayer: relayer2, fee: fee2, - feePercent: tornadoServiceFee, refund: refund2, proof: proof2, args: args2 }; }); } - let { url, relayer, fee, feePercent, refund, proof, args } = yield getProof(); + let { fee, refund, proof, args } = yield getProof(); const withdrawOverrides = { - from: !walletWithdrawal ? relayer : signer == null ? void 0 : signer.address, + from: !walletWithdrawal ? (_b = relayerClient == null ? void 0 : relayerClient.selectedRelayer) == null ? void 0 : _b.rewardAccount : signer == null ? void 0 : signer.address, value: args[5] || 0 }; gasLimit = yield TornadoProxy.withdraw.estimateGas(instanceAddress, proof, ...args, withdrawOverrides); - if (gasLimit > defaultGasLimit) { - ({ url, relayer, fee, feePercent, refund, proof, args } = yield getProof()); - gasLimit = yield TornadoProxy.withdraw.estimateGas(instanceAddress, proof, ...args, withdrawOverrides); + if (fee) { + ({ fee, refund, proof, args } = yield getProof()); + yield TornadoProxy.withdraw.estimateGas(instanceAddress, proof, ...args, withdrawOverrides); } const withdrawTable = new (cli_table3_default())(); withdrawTable.push([{ colSpan: 2, content: "Withdrawal Info", hAlign: "center" }]); - if (!walletWithdrawal && (relayerClient == null ? void 0 : relayerClient.selectedRelayer)) { + if (!walletWithdrawal) { withdrawTable.push( [{ colSpan: 2, content: "Withdraw", hAlign: "center" }], ["Withdrawal", `${amount} ${currency.toUpperCase()}`], - ["Relayer", `${url}`], + ["Relayer", `${(_c = relayerClient == null ? void 0 : relayerClient.selectedRelayer) == null ? void 0 : _c.url}`], [ "Relayer Fee", `${formatUnits(fee, decimals)} ${currency.toUpperCase()} (${(Number(fee) / Number(denomination) * 100).toFixed(5)}%)` ], - ["Relayer Fee Percent", `${feePercent}%`], + ["Relayer Fee Percent", `${(_d = relayerClient == null ? void 0 : relayerClient.selectedRelayer) == null ? void 0 : _d.tornadoServiceFee}%`], [ "Amount to receive", `${Number(formatUnits(denomination - fee, decimals)).toFixed(5)} ${currency.toUpperCase()}` diff --git a/package.json b/package.json index 5d20cfb..9e09617 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "optionalDependencies": {}, "devDependencies": { "@colors/colors": "^1.6.0", - "@tornado/core": "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#d87e6c51f7fddc9e03d62cb0247cea78a8d588a3", + "@tornado/core": "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#4f0aaea790ff26bb8902bbf60f101ec240704685", "@typechain/ethers-v6": "^0.5.1", "@types/figlet": "^1.7.0", "@typescript-eslint/eslint-plugin": "^8.8.1", diff --git a/src/program.ts b/src/program.ts index 341b7c1..8a748e0 100644 --- a/src/program.ts +++ b/src/program.ts @@ -978,6 +978,12 @@ export function tornadoProgram() { console.log(`\nConnected with Tovarish Relayer ${tovarishClient.selectedRelayer?.url}\n`); } + if (!walletWithdrawal && !relayerClient?.selectedRelayer) { + throw new Error( + 'No valid relayer found for the network, you can either try again, or find any relayers using the relayers command and set with --relayer option', + ); + } + const signer = getProgramSigner({ options, provider, @@ -995,6 +1001,7 @@ export function tornadoProgram() { const Multicall = Multicall__factory.connect(multicallContract, provider); const tornadoFeeOracle = new TornadoFeeOracle( + provider, ovmGasPriceOracleContract ? OvmGasPriceOracle__factory.connect(ovmGasPriceOracleContract, provider) : undefined, @@ -1043,7 +1050,7 @@ export function tornadoProgram() { const depositEvents = (await depositsService.updateEvents()).events as DepositsEvents[]; // Create tree using node workers which would spawn another dedicated thread to create trees - const depositTreePromise = merkleTreeService.verifyTree(depositEvents); + const tree = await merkleTreeService.verifyTree(depositEvents); const withdrawalEvents = (await withdrawalsService.updateEvents()).events as WithdrawalsEvents[]; @@ -1095,28 +1102,19 @@ export function tornadoProgram() { throw new Error('Note is already spent'); } - const [circuit, provingKey, tree, l1Fee, tokenPriceInWei, feeData] = await Promise.all([ + const [circuit, provingKey, netGasPrice, l1Fee, tokenPriceInWei] = await Promise.all([ readFile(CIRCUIT_PATH, { encoding: 'utf8' }).then((s) => JSON.parse(s)), readFile(KEY_PATH).then((b) => new Uint8Array(b).buffer), - depositTreePromise, + tornadoFeeOracle.gasPrice(), tornadoFeeOracle.fetchL1OptimismFee(), !isEth ? tokenPriceOracle.fetchPrices([{ tokenAddress: tokenAddress as string, decimals }]).then((p) => p[0]) : BigInt(0), - provider.getFeeData(), ]); const { pathElements, pathIndices } = tree.path((depositEvent as DepositsEvents).leafIndex); - if (!walletWithdrawal && !relayerClient?.selectedRelayer) { - throw new Error( - 'No valid relayer found for the network, you can either try again, or find any relayers using the relayers command and set with --relayer option', - ); - } - - let gasPrice: bigint = feeData.maxFeePerGas - ? feeData.maxFeePerGas + (feeData.maxPriorityFeePerGas || BigInt(0)) - : (feeData.gasPrice as bigint); + let gasPrice = netGasPrice; if (!walletWithdrawal && !tovarishClient && netId === NetId.BSC) { gasPrice = parseUnits('3.3', 'gwei'); @@ -1134,8 +1132,6 @@ export function tornadoProgram() { let fee = BigInt(0); let refund = BigInt(0); - const { url, rewardAccount, tornadoServiceFee } = relayerClient?.selectedRelayer || {}; - if (!walletWithdrawal) { if (!isEth) { refund = ethPurchase @@ -1143,6 +1139,8 @@ export function tornadoProgram() { : tornadoFeeOracle.defaultEthRefund(gasPrice, refundGasLimit); } + const { rewardAccount, tornadoServiceFee: relayerFeePercent } = relayerClient?.selectedRelayer || {}; + fee = tornadoFeeOracle.calculateRelayerFee({ gasPrice, gasLimit, @@ -1151,7 +1149,7 @@ export function tornadoProgram() { ethRefund: refund, tokenPriceInWei, tokenDecimals: decimals, - relayerFeePercent: tornadoServiceFee, + relayerFeePercent, isEth, }); @@ -1183,45 +1181,44 @@ export function tornadoProgram() { ); return { - url, - relayer, fee, - feePercent: tornadoServiceFee, refund, proof, args, }; } - let { url, relayer, fee, feePercent, refund, proof, args } = await getProof(); + let { fee, refund, proof, args } = await getProof(); const withdrawOverrides = { - from: !walletWithdrawal ? relayer : (signer?.address as string), + from: !walletWithdrawal ? relayerClient?.selectedRelayer?.rewardAccount : (signer?.address as string), value: args[5] || 0, }; gasLimit = await TornadoProxy.withdraw.estimateGas(instanceAddress, proof, ...args, withdrawOverrides); - if (gasLimit > defaultGasLimit) { - ({ url, relayer, fee, feePercent, refund, proof, args } = await getProof()); - gasLimit = await TornadoProxy.withdraw.estimateGas(instanceAddress, proof, ...args, withdrawOverrides); + if (fee) { + ({ fee, refund, proof, args } = await getProof()); + + // Verify if our recalculated proof can be withdrawn + await TornadoProxy.withdraw.estimateGas(instanceAddress, proof, ...args, withdrawOverrides); } const withdrawTable = new Table(); withdrawTable.push([{ colSpan: 2, content: 'Withdrawal Info', hAlign: 'center' }]); // withdraw using relayer - if (!walletWithdrawal && relayerClient?.selectedRelayer) { + if (!walletWithdrawal) { withdrawTable.push( [{ colSpan: 2, content: 'Withdraw', hAlign: 'center' }], ['Withdrawal', `${amount} ${currency.toUpperCase()}`], - ['Relayer', `${url}`], + ['Relayer', `${relayerClient?.selectedRelayer?.url}`], [ 'Relayer Fee', `${formatUnits(fee, decimals)} ${currency.toUpperCase()} ` + `(${((Number(fee) / Number(denomination)) * 100).toFixed(5)}%)`, ], - ['Relayer Fee Percent', `${feePercent}%`], + ['Relayer Fee Percent', `${relayerClient?.selectedRelayer?.tornadoServiceFee}%`], [ 'Amount to receive', `${Number(formatUnits(denomination - fee, decimals)).toFixed(5)} ${currency.toUpperCase()}`, diff --git a/yarn.lock b/yarn.lock index b5dcce1..1363024 100644 --- a/yarn.lock +++ b/yarn.lock @@ -786,9 +786,9 @@ "@openzeppelin/contracts-v3" "npm:@openzeppelin/contracts@3.2.0-rc.0" ethers "^6.4.0" -"@tornado/core@git+https://git.tornado.ws/tornadocontrib/tornado-core.git#d87e6c51f7fddc9e03d62cb0247cea78a8d588a3": +"@tornado/core@git+https://git.tornado.ws/tornadocontrib/tornado-core.git#4f0aaea790ff26bb8902bbf60f101ec240704685": version "1.0.19" - resolved "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#d87e6c51f7fddc9e03d62cb0247cea78a8d588a3" + resolved "git+https://git.tornado.ws/tornadocontrib/tornado-core.git#4f0aaea790ff26bb8902bbf60f101ec240704685" dependencies: "@metamask/eth-sig-util" "^7.0.3" "@tornado/contracts" "^1.0.1"