UNPKG

@0xsplits/splits-sdk

Version:

SDK for the 0xSplits protocol

634 lines 34 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.searchLogs = exports.LOGS_SEARCH_BATCH_SIZE = exports.getSplitCreateAndUpdateLogs = exports.getLargestValidBlockRange = exports.isInfuraPublicClient = exports.isAlchemyPublicClient = exports.isLogsPublicClient = void 0; exports.retryExponentialBackoff = retryExponentialBackoff; var viem_1 = require("viem"); var types_1 = require("../types"); var constants_1 = require("../constants"); var splitV2Factory_1 = require("../constants/abi/splitV2Factory"); var _1 = require("."); var errors_1 = require("../errors"); var splitV2o1_1 = require("../constants/abi/splitV2o1"); /** * Retries a function n number of times with exponential backoff before giving up */ function retryExponentialBackoff(fn_1, args_1, maxTry_1) { return __awaiter(this, arguments, void 0, function (fn, args, maxTry, retryCount) { var currRetry, result, e_1; if (retryCount === void 0) { retryCount = 1; } return __generator(this, function (_a) { switch (_a.label) { case 0: currRetry = typeof retryCount === 'number' ? retryCount : 1; _a.label = 1; case 1: _a.trys.push([1, 3, , 5]); return [4 /*yield*/, fn.apply(void 0, __spreadArray([], __read(args), false))]; case 2: result = _a.sent(); return [2 /*return*/, result]; case 3: e_1 = _a.sent(); if (currRetry >= maxTry) { throw e_1; } return [4 /*yield*/, delay(1000 * Math.pow(2, retryCount - 1))]; case 4: _a.sent(); return [2 /*return*/, retryExponentialBackoff(fn, args, maxTry, currRetry + 1)]; case 5: return [2 /*return*/]; } }); }); } var delay = function (timeoutMs) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, new Promise(function (resolve) { // Add a random 0 - 100 ms to timeout to avoid requests syncing up return setTimeout(resolve, timeoutMs + getRandomTimeMs(100)); })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; var getRandomTimeMs = function (maxMs) { return Math.random() * maxMs; }; // Return true if the public client supports a large enough logs request to fetch erc20 tranfer history var isLogsPublicClient = function (publicClient) { return ((0, exports.isAlchemyPublicClient)(publicClient) || (0, exports.isInfuraPublicClient)(publicClient)); }; exports.isLogsPublicClient = isLogsPublicClient; var isAlchemyPublicClient = function (rpcPublicClient) { var _a, _b, _c, _d; if ((_b = (_a = rpcPublicClient.transport) === null || _a === void 0 ? void 0 : _a.url) === null || _b === void 0 ? void 0 : _b.includes('.alchemy.')) return true; if ((_d = (_c = rpcPublicClient.transport) === null || _c === void 0 ? void 0 : _c.url) === null || _d === void 0 ? void 0 : _d.includes('.alchemyapi.')) return true; return false; }; exports.isAlchemyPublicClient = isAlchemyPublicClient; var isInfuraPublicClient = function (rpcPublicClient) { var _a, _b; if ((_b = (_a = rpcPublicClient.transport) === null || _a === void 0 ? void 0 : _a.url) === null || _b === void 0 ? void 0 : _b.includes('.infura.')) return true; return false; }; exports.isInfuraPublicClient = isInfuraPublicClient; // Returns the block ranges in reverse order, so the end block is in the first // range and the start block is in the last range var getReverseBlockRanges = function (startBlock, endBlock, stepSize) { var blockRanges = []; var currentBlockNumber = endBlock; // eslint-disable-next-line no-loops/no-loops while (currentBlockNumber > startBlock) { var nextBlockNumber = currentBlockNumber - stepSize > startBlock ? currentBlockNumber - stepSize : startBlock; blockRanges.push({ from: nextBlockNumber, to: currentBlockNumber }); currentBlockNumber = nextBlockNumber; } return blockRanges; }; var getLargestValidBlockRange = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var fallbackBlockRange, chainId, startBlockNumber, blockRangeOptions, blockRangeTests, blockRange; var maxBlockRange = _b.maxBlockRange, publicClient = _b.publicClient; return __generator(this, function (_c) { switch (_c.label) { case 0: fallbackBlockRange = BigInt(625); chainId = publicClient.chain.id; startBlockNumber = (0, constants_1.getSplitV2FactoriesStartBlock)(chainId); blockRangeOptions = [ BigInt(1000000), BigInt(10000), BigInt(5000), BigInt(1800), ].filter(function (range) { return (maxBlockRange ? range < maxBlockRange : true); }); return [4 /*yield*/, Promise.allSettled(blockRangeOptions.map(function (testBlockRange) { return publicClient.getLogs({ events: [splitV2Factory_1.splitV2FactoryABI[8]], address: [ (0, constants_1.getSplitV2FactoryAddress)(chainId, types_1.SplitV2Type.Pull), (0, constants_1.getSplitV2FactoryAddress)(chainId, types_1.SplitV2Type.Push), ], strict: true, fromBlock: startBlockNumber, toBlock: startBlockNumber + BigInt(testBlockRange), }); }))]; case 1: blockRangeTests = _c.sent(); blockRange = fallbackBlockRange; blockRangeTests.forEach(function (result, index) { if (result.status === 'fulfilled') { if (blockRangeOptions[index] > blockRange) { blockRange = blockRangeOptions[index]; } } }); return [2 /*return*/, blockRange]; } }); }); }; exports.getLargestValidBlockRange = getLargestValidBlockRange; var getSplitCreateAndUpdateLogs = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var formattedSplitAddress, createLog, updateLog, endBlock, _c, startBlock, _d, blockRange, searchCreateLog, searchUpdateLog, logs, logs_1, logs_1_1, log, error_1, logs, logs_2, logs_2_1, log, shouldSet, shouldSet, error_2; var e_2, _e, e_3, _f; var _g, _h; var splitAddress = _b.splitAddress, publicClient = _b.publicClient, splitCreatedEvent = _b.splitCreatedEvent, splitUpdatedEvent = _b.splitUpdatedEvent, addresses = _b.addresses, startBlockNumber = _b.startBlockNumber, defaultBlockRange = _b.defaultBlockRange, currentUpdateLog = _b.currentUpdateLog, currentEndBlockNumber = _b.currentEndBlockNumber, maxBlockRange = _b.maxBlockRange, cachedBlocks = _b.cachedBlocks, splitV2Version = _b.splitV2Version; return __generator(this, function (_j) { switch (_j.label) { case 0: formattedSplitAddress = (0, viem_1.getAddress)(splitAddress); createLog = undefined; updateLog = currentUpdateLog; if (!(currentEndBlockNumber !== null && currentEndBlockNumber !== void 0)) return [3 /*break*/, 1]; _c = currentEndBlockNumber; return [3 /*break*/, 3]; case 1: return [4 /*yield*/, publicClient.getBlockNumber()]; case 2: _c = (_j.sent()); _j.label = 3; case 3: endBlock = _c; startBlock = (_h = (_g = cachedBlocks === null || cachedBlocks === void 0 ? void 0 : cachedBlocks.latestScannedBlock) !== null && _g !== void 0 ? _g : cachedBlocks === null || cachedBlocks === void 0 ? void 0 : cachedBlocks.createBlock) !== null && _h !== void 0 ? _h : startBlockNumber; return [4 /*yield*/, (0, exports.searchLogs)({ formattedSplitAddress: formattedSplitAddress, publicClient: publicClient, addresses: addresses, splitCreatedEvent: splitCreatedEvent, splitUpdatedEvent: splitUpdatedEvent, startBlock: startBlock, endBlock: endBlock, defaultBlockRange: defaultBlockRange, maxBlockRange: maxBlockRange, splitV2Version: splitV2Version, })]; case 4: _d = _j.sent(), blockRange = _d.blockRange, searchCreateLog = _d.createLog, searchUpdateLog = _d.updateLog; createLog = searchCreateLog; updateLog = searchUpdateLog; if (!!createLog) return [3 /*break*/, 10]; if (!(cachedBlocks === null || cachedBlocks === void 0 ? void 0 : cachedBlocks.createBlock)) return [3 /*break*/, 9]; _j.label = 5; case 5: _j.trys.push([5, 7, , 9]); return [4 /*yield*/, publicClient.getLogs({ events: [splitCreatedEvent], address: addresses, strict: true, fromBlock: cachedBlocks.createBlock, toBlock: cachedBlocks.createBlock, }) // eslint-disable-next-line no-loops/no-loops ]; case 6: logs = _j.sent(); try { // eslint-disable-next-line no-loops/no-loops for (logs_1 = __values(logs), logs_1_1 = logs_1.next(); !logs_1_1.done; logs_1_1 = logs_1.next()) { log = logs_1_1.value; if ((0, viem_1.getAddress)(log.args.split) === formattedSplitAddress) { if (createLog) throw new Error('Found multiple create split logs'); createLog = log; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (logs_1_1 && !logs_1_1.done && (_e = logs_1.return)) _e.call(logs_1); } finally { if (e_2) throw e_2.error; } } return [3 /*break*/, 9]; case 7: error_1 = _j.sent(); if (!(error_1 instanceof Error)) throw error_1; return [4 /*yield*/, handleLogsError({ error: error_1, callback: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var defaultBlockRange = _b.defaultBlockRange, maxBlockRange = _b.maxBlockRange; return __generator(this, function (_c) { switch (_c.label) { case 0: return [4 /*yield*/, (0, exports.getSplitCreateAndUpdateLogs)({ splitAddress: splitAddress, publicClient: publicClient, defaultBlockRange: defaultBlockRange, maxBlockRange: maxBlockRange, currentUpdateLog: updateLog, currentEndBlockNumber: startBlock, splitCreatedEvent: splitCreatedEvent, splitUpdatedEvent: splitUpdatedEvent, addresses: addresses, startBlockNumber: startBlockNumber, cachedBlocks: cachedBlocks, splitV2Version: splitV2Version, })]; case 1: return [2 /*return*/, _c.sent()]; } }); }); }, blockRange: blockRange, })]; case 8: return [2 /*return*/, _j.sent()]; case 9: if (!createLog && splitV2Version === 'splitV2') throw new errors_1.AccountNotFoundError('Split', formattedSplitAddress, publicClient.chain.id); _j.label = 10; case 10: if (!!updateLog) return [3 /*break*/, 15]; if (!(cachedBlocks === null || cachedBlocks === void 0 ? void 0 : cachedBlocks.updateBlock)) return [3 /*break*/, 15]; _j.label = 11; case 11: _j.trys.push([11, 13, , 15]); return [4 /*yield*/, publicClient.getLogs({ events: [splitUpdatedEvent], address: addresses, strict: true, fromBlock: cachedBlocks.createBlock, toBlock: cachedBlocks.createBlock, }) // eslint-disable-next-line no-loops/no-loops ]; case 12: logs = _j.sent(); try { // eslint-disable-next-line no-loops/no-loops for (logs_2 = __values(logs), logs_2_1 = logs_2.next(); !logs_2_1.done; logs_2_1 = logs_2.next()) { log = logs_2_1.value; if (log.eventName === 'SplitUpdated') { shouldSet = (0, viem_1.getAddress)(log.address) === formattedSplitAddress && (!updateLog || log.blockNumber > updateLog.blockNumber || (log.blockNumber === updateLog.blockNumber && log.logIndex > updateLog.logIndex)); if (shouldSet) updateLog = log; } else if (log.eventName === 'UpdateSplit') { shouldSet = (0, viem_1.getAddress)(log.args.split) === formattedSplitAddress && (!updateLog || log.blockNumber > updateLog.blockNumber || (log.blockNumber === updateLog.blockNumber && log.logIndex > updateLog.logIndex)); if (shouldSet) updateLog = log; } } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (logs_2_1 && !logs_2_1.done && (_f = logs_2.return)) _f.call(logs_2); } finally { if (e_3) throw e_3.error; } } return [3 /*break*/, 15]; case 13: error_2 = _j.sent(); if (!(error_2 instanceof Error)) throw error_2; return [4 /*yield*/, handleLogsError({ error: error_2, callback: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var defaultBlockRange = _b.defaultBlockRange, maxBlockRange = _b.maxBlockRange; return __generator(this, function (_c) { switch (_c.label) { case 0: return [4 /*yield*/, (0, exports.getSplitCreateAndUpdateLogs)({ splitAddress: splitAddress, publicClient: publicClient, defaultBlockRange: defaultBlockRange, maxBlockRange: maxBlockRange, currentUpdateLog: updateLog, currentEndBlockNumber: startBlock, splitCreatedEvent: splitCreatedEvent, splitUpdatedEvent: splitUpdatedEvent, addresses: addresses, startBlockNumber: startBlockNumber, cachedBlocks: cachedBlocks, splitV2Version: splitV2Version, })]; case 1: return [2 /*return*/, _c.sent()]; } }); }); }, blockRange: blockRange, })]; case 14: return [2 /*return*/, _j.sent()]; case 15: return [2 /*return*/, { blockRange: blockRange, createLog: createLog, updateLog: updateLog, }]; } }); }); }; exports.getSplitCreateAndUpdateLogs = getSplitCreateAndUpdateLogs; exports.LOGS_SEARCH_BATCH_SIZE = 10; var searchLogs = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var createLog, updateLog, splitContract, blockNumber, logs, blockRange, searchBlockRanges, batchRequests, lastBlockInBatch, _c, _d, _e, index, _f, from, to, shouldAwait, results, results_1, results_1_1, log, shouldSet, shouldSet, error_3, e_4_1; var e_4, _g, e_5, _h; var _j; var formattedSplitAddress = _b.formattedSplitAddress, publicClient = _b.publicClient, addresses = _b.addresses, splitCreatedEvent = _b.splitCreatedEvent, splitUpdatedEvent = _b.splitUpdatedEvent, startBlock = _b.startBlock, endBlock = _b.endBlock, defaultBlockRange = _b.defaultBlockRange, maxBlockRange = _b.maxBlockRange, currentUpdateLog = _b.currentUpdateLog, cachedBlocks = _b.cachedBlocks, splitV2Version = _b.splitV2Version; return __generator(this, function (_k) { switch (_k.label) { case 0: createLog = undefined; updateLog = currentUpdateLog; if (!(splitV2Version === 'splitV2o1' && !constants_1.INVALID_BLOCK_NUMBER_CHAIN_IDS.includes((_j = publicClient.chain) === null || _j === void 0 ? void 0 : _j.id))) return [3 /*break*/, 4]; splitContract = (0, viem_1.getContract)({ address: formattedSplitAddress, abi: splitV2o1_1.splitV2o1Abi, client: publicClient, }); return [4 /*yield*/, splitContract.read.updateBlockNumber()]; case 1: blockNumber = _k.sent(); if (!(currentUpdateLog && blockNumber === currentUpdateLog.blockNumber)) return [3 /*break*/, 2]; return [2 /*return*/, { blockRange: BigInt(1), updateLog: updateLog, createLog: createLog, }]; case 2: return [4 /*yield*/, publicClient.getLogs({ events: [splitUpdatedEvent], address: [formattedSplitAddress], strict: true, fromBlock: blockNumber, toBlock: blockNumber, })]; case 3: logs = _k.sent(); logs.forEach(function (log) { if (log.eventName === 'SplitUpdated') { var shouldSet = (0, viem_1.getAddress)(log.address) === formattedSplitAddress && (!updateLog || log.blockNumber > updateLog.blockNumber || (log.blockNumber === updateLog.blockNumber && log.logIndex > updateLog.logIndex)); if (shouldSet) updateLog = log; } }); return [2 /*return*/, { blockRange: BigInt(1), updateLog: updateLog, createLog: createLog, }]; case 4: if (!defaultBlockRange) return [3 /*break*/, 5]; blockRange = defaultBlockRange; return [3 /*break*/, 7]; case 5: return [4 /*yield*/, (0, exports.getLargestValidBlockRange)({ maxBlockRange: maxBlockRange, publicClient: publicClient, })]; case 6: // Try to determine the largest possible block range. Sometimes these rpc's do not always // throw a block range error though...so that means this request could succeed, but then down // below we will get a block range error. So we still need to catch/handle that down below. blockRange = _k.sent(); _k.label = 7; case 7: searchBlockRanges = getReverseBlockRanges(startBlock, endBlock, blockRange); batchRequests = []; lastBlockInBatch = undefined; _k.label = 8; case 8: _k.trys.push([8, 17, 18, 19]); _c = __values(searchBlockRanges.entries()), _d = _c.next(); _k.label = 9; case 9: if (!!_d.done) return [3 /*break*/, 16]; _e = __read(_d.value, 2), index = _e[0], _f = _e[1], from = _f.from, to = _f.to; if (!lastBlockInBatch) lastBlockInBatch = to; batchRequests.push(publicClient.getLogs({ events: [splitCreatedEvent, splitUpdatedEvent], address: addresses, strict: true, fromBlock: from, toBlock: to, })); shouldAwait = batchRequests.length >= exports.LOGS_SEARCH_BATCH_SIZE || index === searchBlockRanges.length - 1; if (!shouldAwait) return [3 /*break*/, 15]; _k.label = 10; case 10: _k.trys.push([10, 12, , 14]); return [4 /*yield*/, Promise.all(batchRequests)]; case 11: results = (_k.sent()).flat(); try { // eslint-disable-next-line no-loops/no-loops for (results_1 = (e_5 = void 0, __values(results)), results_1_1 = results_1.next(); !results_1_1.done; results_1_1 = results_1.next()) { log = results_1_1.value; if (log.eventName === 'SplitUpdated') { shouldSet = (0, viem_1.getAddress)(log.address) === formattedSplitAddress && (!updateLog || log.blockNumber > updateLog.blockNumber || (log.blockNumber === updateLog.blockNumber && log.logIndex > updateLog.logIndex)); if (shouldSet) updateLog = log; } else if (log.eventName === 'UpdateSplit') { shouldSet = (0, viem_1.getAddress)(log.args.split) === formattedSplitAddress && (!updateLog || log.blockNumber > updateLog.blockNumber || (log.blockNumber === updateLog.blockNumber && log.logIndex > updateLog.logIndex)); if (shouldSet) updateLog = log; } else { if ((0, viem_1.getAddress)(log.args.split) === formattedSplitAddress) { if (createLog) throw new Error('Found multiple create split logs'); createLog = log; } } } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (results_1_1 && !results_1_1.done && (_h = results_1.return)) _h.call(results_1); } finally { if (e_5) throw e_5.error; } } return [3 /*break*/, 14]; case 12: error_3 = _k.sent(); if (!(error_3 instanceof Error)) throw error_3; return [4 /*yield*/, handleLogsError({ error: error_3, callback: function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var defaultBlockRange = _b.defaultBlockRange, maxBlockRange = _b.maxBlockRange; return __generator(this, function (_c) { switch (_c.label) { case 0: return [4 /*yield*/, (0, exports.searchLogs)({ formattedSplitAddress: formattedSplitAddress, publicClient: publicClient, addresses: addresses, splitCreatedEvent: splitCreatedEvent, splitUpdatedEvent: splitUpdatedEvent, startBlock: startBlock, endBlock: lastBlockInBatch, defaultBlockRange: defaultBlockRange, maxBlockRange: maxBlockRange, currentUpdateLog: updateLog, cachedBlocks: cachedBlocks, })]; case 1: return [2 /*return*/, _c.sent()]; } }); }); }, blockRange: blockRange, })]; case 13: return [2 /*return*/, _k.sent()]; case 14: if (createLog) return [3 /*break*/, 16]; if ((cachedBlocks === null || cachedBlocks === void 0 ? void 0 : cachedBlocks.createBlock) && updateLog) return [3 /*break*/, 16]; batchRequests = []; lastBlockInBatch = undefined; _k.label = 15; case 15: _d = _c.next(); return [3 /*break*/, 9]; case 16: return [3 /*break*/, 19]; case 17: e_4_1 = _k.sent(); e_4 = { error: e_4_1 }; return [3 /*break*/, 19]; case 18: try { if (_d && !_d.done && (_g = _c.return)) _g.call(_c); } finally { if (e_4) throw e_4.error; } return [7 /*endfinally*/]; case 19: return [2 /*return*/, { blockRange: blockRange, createLog: createLog, updateLog: updateLog }]; } }); }); }; exports.searchLogs = searchLogs; var handleLogsError = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) { var sleepTimeMs, lowerCaseDetails, lowerCaseMessage; var error = _b.error, callback = _b.callback, blockRange = _b.blockRange; return __generator(this, function (_c) { switch (_c.label) { case 0: sleepTimeMs = 10000; if (!('status' in error && error.status === 429)) return [3 /*break*/, 3]; return [4 /*yield*/, (0, _1.sleep)(sleepTimeMs)]; case 1: _c.sent(); return [4 /*yield*/, callback({ defaultBlockRange: blockRange, })]; case 2: return [2 /*return*/, _c.sent()]; case 3: if (!('details' in error && typeof error.details === 'string')) return [3 /*break*/, 5]; lowerCaseDetails = error.details.toLowerCase(); if (!(lowerCaseDetails.includes('block') && lowerCaseDetails.includes('range'))) return [3 /*break*/, 5]; return [4 /*yield*/, callback({ maxBlockRange: blockRange, })]; case 4: return [2 /*return*/, _c.sent()]; case 5: lowerCaseMessage = error.message.toLowerCase(); if (!(lowerCaseMessage.includes('block') && lowerCaseMessage.includes('range'))) return [3 /*break*/, 7]; return [4 /*yield*/, callback({ maxBlockRange: blockRange, })]; case 6: return [2 /*return*/, _c.sent()]; case 7: throw error; } }); }); }; //# sourceMappingURL=requests.js.map