@sentio/sdk 2.57.12-rc.1 → 2.57.12-rc.a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/aptos/ext/token.d.ts.map +1 -1
- package/lib/aptos/ext/token.js +4 -6
- package/lib/aptos/ext/token.js.map +1 -1
- package/lib/chunk-24EEMT46.js +3 -0
- package/lib/chunk-24EEMT46.js.map +1 -0
- package/lib/chunk-2R7O6UGY.js +3 -0
- package/lib/chunk-2R7O6UGY.js.map +1 -0
- package/lib/chunk-4JXRK4YH.js +29 -0
- package/lib/chunk-4JXRK4YH.js.map +1 -0
- package/lib/chunk-7QZC3R57.js +3 -0
- package/lib/chunk-7QZC3R57.js.map +1 -0
- package/lib/chunk-AK5E6DKD.js +6 -0
- package/lib/chunk-AK5E6DKD.js.map +1 -0
- package/lib/chunk-ATZBHPQN.js +3 -0
- package/lib/chunk-ATZBHPQN.js.map +1 -0
- package/lib/chunk-B6U7F4GY.js +29 -0
- package/lib/chunk-B6U7F4GY.js.map +1 -0
- package/lib/chunk-DGKULIPW.js +3 -0
- package/lib/chunk-DGKULIPW.js.map +1 -0
- package/lib/chunk-DS2LOABN.js +3 -0
- package/lib/chunk-DS2LOABN.js.map +1 -0
- package/lib/chunk-FMBGZMT4.js +6 -0
- package/lib/chunk-FMBGZMT4.js.map +1 -0
- package/lib/chunk-FMZDKD72.js +8 -0
- package/lib/chunk-FMZDKD72.js.map +1 -0
- package/lib/chunk-G5BIPHMS.js +3 -0
- package/lib/chunk-G5BIPHMS.js.map +1 -0
- package/lib/chunk-G6XPDWDE.js +3 -0
- package/lib/chunk-G6XPDWDE.js.map +1 -0
- package/lib/chunk-GJX3DL4J.js +499 -0
- package/lib/chunk-GJX3DL4J.js.map +1 -0
- package/lib/chunk-GTITFWMU.js +259 -0
- package/lib/chunk-GTITFWMU.js.map +1 -0
- package/lib/chunk-J7Z2TKQE.js +33 -0
- package/lib/chunk-J7Z2TKQE.js.map +1 -0
- package/lib/chunk-JQ4LTUIX.js +995 -0
- package/lib/chunk-JQ4LTUIX.js.map +1 -0
- package/lib/chunk-LG2TF5WR.js +8 -0
- package/lib/chunk-LG2TF5WR.js.map +1 -0
- package/lib/chunk-LVWOFGF2.js +3 -0
- package/lib/chunk-LVWOFGF2.js.map +1 -0
- package/lib/chunk-O564J2U6.js +11 -0
- package/lib/chunk-O564J2U6.js.map +1 -0
- package/lib/chunk-QGIFUSFI.js +84 -0
- package/lib/chunk-QGIFUSFI.js.map +1 -0
- package/lib/chunk-QGPJOTWP.js +3 -0
- package/lib/chunk-QGPJOTWP.js.map +1 -0
- package/lib/chunk-RA75ESSD.js +3 -0
- package/lib/chunk-RA75ESSD.js.map +1 -0
- package/lib/chunk-RVAYZJ7X.js +5 -0
- package/lib/chunk-RVAYZJ7X.js.map +1 -0
- package/lib/chunk-SPY3PKUB.js +3 -0
- package/lib/chunk-SPY3PKUB.js.map +1 -0
- package/lib/chunk-SUCYR7EB.js +3 -0
- package/lib/chunk-SUCYR7EB.js.map +1 -0
- package/lib/chunk-TGIXVAHB.js +7 -0
- package/lib/chunk-TGIXVAHB.js.map +1 -0
- package/lib/chunk-TSEQGMTN.js +5 -0
- package/lib/chunk-TSEQGMTN.js.map +1 -0
- package/lib/chunk-ZHI6ULD5.js +3 -0
- package/lib/chunk-ZHI6ULD5.js.map +1 -0
- package/lib/multipart-parser-J6QPYJHT.js +4 -0
- package/lib/multipart-parser-J6QPYJHT.js.map +1 -0
- package/package.json +4 -4
- package/src/aptos/builtin/0x1.d.ts +6451 -0
- package/src/aptos/builtin/0x1.d.ts.map +1 -0
- package/src/aptos/builtin/0x1.js +7138 -0
- package/src/aptos/builtin/0x1.js.map +1 -0
- package/src/aptos/builtin/0x3.d.ts +1122 -0
- package/src/aptos/builtin/0x3.d.ts.map +1 -0
- package/src/aptos/builtin/0x3.js +937 -0
- package/src/aptos/builtin/0x3.js.map +1 -0
- package/src/aptos/builtin/0x4.d.ts +551 -0
- package/src/aptos/builtin/0x4.d.ts.map +1 -0
- package/src/aptos/builtin/0x4.js +529 -0
- package/src/aptos/builtin/0x4.js.map +1 -0
- package/src/aptos/builtin/index.d.ts +4 -0
- package/src/aptos/builtin/index.d.ts.map +1 -0
- package/src/aptos/builtin/index.js +7 -0
- package/src/aptos/builtin/index.js.map +1 -0
- package/src/aptos/ext/token.ts +4 -6
- package/src/eth/builtin/eacaggregatorproxy.d.ts +5 -0
- package/src/eth/builtin/eacaggregatorproxy.d.ts.map +1 -0
- package/src/eth/builtin/eacaggregatorproxy.js +8 -0
- package/src/eth/builtin/eacaggregatorproxy.js.map +1 -0
- package/src/eth/builtin/erc1155.d.ts +5 -0
- package/src/eth/builtin/erc1155.d.ts.map +1 -0
- package/src/eth/builtin/erc1155.js +8 -0
- package/src/eth/builtin/erc1155.js.map +1 -0
- package/src/eth/builtin/erc20.d.ts +5 -0
- package/src/eth/builtin/erc20.d.ts.map +1 -0
- package/src/eth/builtin/erc20.js +8 -0
- package/src/eth/builtin/erc20.js.map +1 -0
- package/src/eth/builtin/erc20bytes.d.ts +5 -0
- package/src/eth/builtin/erc20bytes.d.ts.map +1 -0
- package/src/eth/builtin/erc20bytes.js +8 -0
- package/src/eth/builtin/erc20bytes.js.map +1 -0
- package/src/eth/builtin/erc721.d.ts +5 -0
- package/src/eth/builtin/erc721.d.ts.map +1 -0
- package/src/eth/builtin/erc721.js +8 -0
- package/src/eth/builtin/erc721.js.map +1 -0
- package/src/eth/builtin/index.d.ts +13 -0
- package/src/eth/builtin/index.d.ts.map +1 -0
- package/src/eth/builtin/index.js +16 -0
- package/src/eth/builtin/index.js.map +1 -0
- package/src/eth/builtin/internal/EACAggregatorProxy.d.ts +50 -0
- package/src/eth/builtin/internal/EACAggregatorProxy.d.ts.map +1 -0
- package/src/eth/builtin/internal/EACAggregatorProxy.js +2 -0
- package/src/eth/builtin/internal/EACAggregatorProxy.js.map +1 -0
- package/src/eth/builtin/internal/ERC1155.d.ts +57 -0
- package/src/eth/builtin/internal/ERC1155.d.ts.map +1 -0
- package/src/eth/builtin/internal/ERC1155.js +2 -0
- package/src/eth/builtin/internal/ERC1155.js.map +1 -0
- package/src/eth/builtin/internal/ERC20.d.ts +41 -0
- package/src/eth/builtin/internal/ERC20.d.ts.map +1 -0
- package/src/eth/builtin/internal/ERC20.js +2 -0
- package/src/eth/builtin/internal/ERC20.js.map +1 -0
- package/src/eth/builtin/internal/ERC20Bytes.d.ts +32 -0
- package/src/eth/builtin/internal/ERC20Bytes.d.ts.map +1 -0
- package/src/eth/builtin/internal/ERC20Bytes.js +2 -0
- package/src/eth/builtin/internal/ERC20Bytes.js.map +1 -0
- package/src/eth/builtin/internal/ERC721.d.ts +43 -0
- package/src/eth/builtin/internal/ERC721.d.ts.map +1 -0
- package/src/eth/builtin/internal/ERC721.js +2 -0
- package/src/eth/builtin/internal/ERC721.js.map +1 -0
- package/src/eth/builtin/internal/WETH9.d.ts +47 -0
- package/src/eth/builtin/internal/WETH9.d.ts.map +1 -0
- package/src/eth/builtin/internal/WETH9.js +2 -0
- package/src/eth/builtin/internal/WETH9.js.map +1 -0
- package/src/eth/builtin/internal/common.d.ts +3 -0
- package/src/eth/builtin/internal/common.d.ts.map +1 -0
- package/src/eth/builtin/internal/common.js +8 -0
- package/src/eth/builtin/internal/common.js.map +1 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-processor.d.ts +373 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-processor.d.ts.map +1 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-processor.js +1355 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-processor.js.map +1 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-test-utils.d.ts +7 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-test-utils.d.ts.map +1 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-test-utils.js +55 -0
- package/src/eth/builtin/internal/eacaggregatorproxy-test-utils.js.map +1 -0
- package/src/eth/builtin/internal/erc1155-processor.d.ts +173 -0
- package/src/eth/builtin/internal/erc1155-processor.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc1155-processor.js +596 -0
- package/src/eth/builtin/internal/erc1155-processor.js.map +1 -0
- package/src/eth/builtin/internal/erc1155-test-utils.d.ts +7 -0
- package/src/eth/builtin/internal/erc1155-test-utils.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc1155-test-utils.js +55 -0
- package/src/eth/builtin/internal/erc1155-test-utils.js.map +1 -0
- package/src/eth/builtin/internal/erc20-processor.d.ts +244 -0
- package/src/eth/builtin/internal/erc20-processor.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc20-processor.js +1109 -0
- package/src/eth/builtin/internal/erc20-processor.js.map +1 -0
- package/src/eth/builtin/internal/erc20-test-utils.d.ts +6 -0
- package/src/eth/builtin/internal/erc20-test-utils.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc20-test-utils.js +44 -0
- package/src/eth/builtin/internal/erc20-test-utils.js.map +1 -0
- package/src/eth/builtin/internal/erc20bytes-processor.d.ts +144 -0
- package/src/eth/builtin/internal/erc20bytes-processor.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc20bytes-processor.js +594 -0
- package/src/eth/builtin/internal/erc20bytes-processor.js.map +1 -0
- package/src/eth/builtin/internal/erc20bytes-test-utils.d.ts +5 -0
- package/src/eth/builtin/internal/erc20bytes-test-utils.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc20bytes-test-utils.js +33 -0
- package/src/eth/builtin/internal/erc20bytes-test-utils.js.map +1 -0
- package/src/eth/builtin/internal/erc721-processor.d.ts +215 -0
- package/src/eth/builtin/internal/erc721-processor.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc721-processor.js +895 -0
- package/src/eth/builtin/internal/erc721-processor.js.map +1 -0
- package/src/eth/builtin/internal/erc721-test-utils.d.ts +6 -0
- package/src/eth/builtin/internal/erc721-test-utils.d.ts.map +1 -0
- package/src/eth/builtin/internal/erc721-test-utils.js +44 -0
- package/src/eth/builtin/internal/erc721-test-utils.js.map +1 -0
- package/src/eth/builtin/internal/factories/EACAggregatorProxy__factory.d.ts +400 -0
- package/src/eth/builtin/internal/factories/EACAggregatorProxy__factory.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/EACAggregatorProxy__factory.js +524 -0
- package/src/eth/builtin/internal/factories/EACAggregatorProxy__factory.js.map +1 -0
- package/src/eth/builtin/internal/factories/ERC1155__factory.d.ts +251 -0
- package/src/eth/builtin/internal/factories/ERC1155__factory.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/ERC1155__factory.js +329 -0
- package/src/eth/builtin/internal/factories/ERC1155__factory.js.map +1 -0
- package/src/eth/builtin/internal/factories/ERC20Bytes__factory.d.ts +185 -0
- package/src/eth/builtin/internal/factories/ERC20Bytes__factory.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/ERC20Bytes__factory.js +251 -0
- package/src/eth/builtin/internal/factories/ERC20Bytes__factory.js.map +1 -0
- package/src/eth/builtin/internal/factories/ERC20__factory.d.ts +303 -0
- package/src/eth/builtin/internal/factories/ERC20__factory.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/ERC20__factory.js +401 -0
- package/src/eth/builtin/internal/factories/ERC20__factory.js.map +1 -0
- package/src/eth/builtin/internal/factories/ERC721__factory.d.ts +273 -0
- package/src/eth/builtin/internal/factories/ERC721__factory.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/ERC721__factory.js +361 -0
- package/src/eth/builtin/internal/factories/ERC721__factory.js.map +1 -0
- package/src/eth/builtin/internal/factories/WETH9__factory.d.ts +220 -0
- package/src/eth/builtin/internal/factories/WETH9__factory.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/WETH9__factory.js +294 -0
- package/src/eth/builtin/internal/factories/WETH9__factory.js.map +1 -0
- package/src/eth/builtin/internal/factories/index.d.ts +7 -0
- package/src/eth/builtin/internal/factories/index.d.ts.map +1 -0
- package/src/eth/builtin/internal/factories/index.js +10 -0
- package/src/eth/builtin/internal/factories/index.js.map +1 -0
- package/src/eth/builtin/internal/index.d.ts +14 -0
- package/src/eth/builtin/internal/index.d.ts.map +1 -0
- package/src/eth/builtin/internal/index.js +8 -0
- package/src/eth/builtin/internal/index.js.map +1 -0
- package/src/eth/builtin/internal/weth9-processor.d.ts +172 -0
- package/src/eth/builtin/internal/weth9-processor.d.ts.map +1 -0
- package/src/eth/builtin/internal/weth9-processor.js +729 -0
- package/src/eth/builtin/internal/weth9-processor.js.map +1 -0
- package/src/eth/builtin/internal/weth9-test-utils.d.ts +7 -0
- package/src/eth/builtin/internal/weth9-test-utils.d.ts.map +1 -0
- package/src/eth/builtin/internal/weth9-test-utils.js +55 -0
- package/src/eth/builtin/internal/weth9-test-utils.js.map +1 -0
- package/src/eth/builtin/weth9.d.ts +5 -0
- package/src/eth/builtin/weth9.d.ts.map +1 -0
- package/src/eth/builtin/weth9.js +8 -0
- package/src/eth/builtin/weth9.js.map +1 -0
- package/src/solana/builtin/index.d.ts +2 -0
- package/src/solana/builtin/index.d.ts.map +1 -0
- package/src/solana/builtin/index.js +2 -0
- package/src/solana/builtin/index.js.map +1 -0
- package/src/solana/builtin/spl-token-processor.d.ts +40 -0
- package/src/solana/builtin/spl-token-processor.d.ts.map +1 -0
- package/src/solana/builtin/spl-token-processor.js +254 -0
- package/src/solana/builtin/spl-token-processor.js.map +1 -0
- package/src/solana/builtin/types.d.ts +428 -0
- package/src/solana/builtin/types.d.ts.map +1 -0
- package/src/solana/builtin/types.js +201 -0
- package/src/solana/builtin/types.js.map +1 -0
- package/src/sui/builtin/0x1.d.ts +114 -0
- package/src/sui/builtin/0x1.d.ts.map +1 -0
- package/src/sui/builtin/0x1.js +159 -0
- package/src/sui/builtin/0x1.js.map +1 -0
- package/src/sui/builtin/0x2.d.ts +1250 -0
- package/src/sui/builtin/0x2.d.ts.map +1 -0
- package/src/sui/builtin/0x2.js +1511 -0
- package/src/sui/builtin/0x2.js.map +1 -0
- package/src/sui/builtin/0x3.d.ts +774 -0
- package/src/sui/builtin/0x3.d.ts.map +1 -0
- package/src/sui/builtin/0x3.js +720 -0
- package/src/sui/builtin/0x3.js.map +1 -0
- package/src/sui/builtin/index.d.ts +4 -0
- package/src/sui/builtin/index.d.ts.map +1 -0
- package/src/sui/builtin/index.js +7 -0
- package/src/sui/builtin/index.js.map +1 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/utils/block.ts","../src/utils/conversion.ts","../src/utils/token.ts","../../../node_modules/.pnpm/lru-cache@11.0.0/node_modules/lru-cache/src/index.ts","../src/utils/dex-price.ts","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/CsvError.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/utils/is_object.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/normalize_columns_array.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/utils/ResizeableBuffer.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/init_state.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/utils/underscore.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/normalize_options.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/api/index.js","../../../node_modules/.pnpm/csv-parse@5.5.6/node_modules/csv-parse/lib/sync.js","../src/utils/price.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/runtime.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceGetPriceResponse.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceBatchGetPricesResponseCoinPricePrice.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceCoinIDAddressIdentifier.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceCoinID.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceBatchGetPricesResponseCoinPrice.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceBatchGetPricesResponse.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceCheckLatestPriceResponseCoinPrice.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceCheckLatestPriceResponse.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/models/PriceServiceListCoinsResponse.ts","../../../node_modules/.pnpm/@sentio+api@1.0.2-rc.11/node_modules/@sentio/api/src/apis/PriceApi.ts","../src/utils/call.ts","../src/utils/index.ts"],"sourcesContent":["import { Block, Provider } from 'ethers'\n\nasync function getBlockSafely(provider: Provider, blockNumber: number | string): Promise<Block> {\n const block = await provider.getBlock(blockNumber)\n if (!block) {\n throw new Error(`Block ${blockNumber} not found.`)\n }\n return block\n}\n\nexport async function estimateBlockNumberAtDate(\n provider: Provider,\n targetDate: Date,\n startBlock?: number\n): Promise<number> {\n // Convert the Date object to a Unix timestamp (in seconds)\n const targetTimestamp = Math.floor(targetDate.getTime() / 1000)\n\n // Step 1: Get the current block number and its timestamp\n const latestBlock = await getBlockSafely(provider, 'latest')\n const earliestBlockNumber = startBlock !== undefined ? startBlock : 0\n const earliestBlock = await getBlockSafely(provider, earliestBlockNumber)\n\n // Binary search initialization\n let low = earliestBlock.number\n let high = latestBlock.number\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2)\n const midBlock = await getBlockSafely(provider, mid)\n\n if (midBlock.timestamp === targetTimestamp) {\n return midBlock.number // Exact match\n } else if (midBlock.timestamp < targetTimestamp) {\n low = mid + 1 // Target is in the upper half\n } else {\n high = mid - 1 // Target is in the lower half\n }\n }\n\n // If exact timestamp is not found, return the closest block number\n const closestBlock = await getBlockSafely(provider, high)\n return closestBlock.number\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","// import { BigDecimal } from '../core/big-decimal.js'\n// import { Numberish } from '../core/index.js'\n// import { MetricValue } from '@sentio/protos'\n\nexport function bytesToBigInt(bytes: Uint8Array) {\n let intValue = BigInt(0)\n for (let i = 0; i < bytes.length; i++) {\n intValue = intValue * BigInt(256) + BigInt(bytes[i])\n }\n return intValue\n}\n\n// export function metricValueToNumberish(v: MetricValue): Numberish {\n// if (v.doubleValue) {\n// return v.doubleValue\n// }\n// if (v.bigInteger) {\n// let intValue = bytesToBigInt(v.bigInteger.data)\n// if (v.bigInteger.negative) {\n// intValue = -intValue\n// }\n// return intValue\n// }\n//\n// if (v.bigDecimal) {\n// return new BigDecimal(v.bigDecimal)\n// }\n//\n// throw Error(\"MetricValue doesn't contain any of possible value\")\n// }\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","import { getERC20Contract } from '../eth/builtin/erc20.js'\nimport { getERC20BytesContract } from '../eth/builtin/erc20bytes.js'\nimport { BigDecimal, scaleDown } from '../core/big-decimal.js'\nimport { PromiseOrValue } from '../eth/builtin/internal/common.js'\nimport { decodeBytes32String } from 'ethers'\nimport { EthChainId, EthContext } from '../eth/index.js'\nimport { BaseContext } from '../core/index.js'\nimport { LRUCache } from 'lru-cache'\n\nexport interface TokenInfo {\n symbol: string\n name: string\n decimal: number\n}\n\nexport const NATIVE_ETH = {\n symbol: 'ETH',\n decimal: 18,\n name: 'Native ETH'\n}\n\nconst TOKEN_INFOS = new LRUCache<string, Promise<TokenInfo>>({\n max: 10000,\n ttl: 1000 * 60 * 60 // 1 hour\n})\n\nasync function getTokenInfoPromise(\n symbol: PromiseOrValue<string> | string,\n name: PromiseOrValue<string> | string,\n decimal: PromiseOrValue<bigint>\n): Promise<TokenInfo> {\n return {\n symbol: await symbol,\n name: await name,\n decimal: Number(await decimal)\n }\n}\n\nexport async function getERC20TokenInfo(\n contextOrNetworkish: EthContext | EthChainId,\n tokenAddress: string\n): Promise<TokenInfo> {\n let chainId: EthChainId\n if (contextOrNetworkish instanceof BaseContext) {\n chainId = contextOrNetworkish.getChainId()\n } else {\n chainId = contextOrNetworkish || EthChainId.ETHEREUM\n }\n\n const key = chainId + tokenAddress\n const res = TOKEN_INFOS.get(key)\n if (res) {\n return res\n }\n const contract = getERC20Contract(chainId, tokenAddress)\n const bytesContract = getERC20BytesContract(chainId, tokenAddress)\n\n let name = ''\n try {\n name = await contract.name()\n } catch (e) {\n name = decodeBytes32String(await bytesContract.name())\n }\n\n let symbol = ''\n try {\n symbol = await contract.symbol()\n } catch (e) {\n symbol = decodeBytes32String(await bytesContract.symbol())\n }\n\n const decimal = await contract.decimals()\n const info = getTokenInfoPromise(symbol, name, decimal)\n\n TOKEN_INFOS.set(key, info)\n return info\n}\n\nexport async function getER20NormalizedAmount(\n contextOrNetworkish: EthContext | EthChainId,\n tokenAddress: string,\n amount: bigint\n): Promise<BigDecimal> {\n const tokenInfo = await getERC20TokenInfo(contextOrNetworkish, tokenAddress)\n return scaleDown(amount, tokenInfo.decimal)\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","/**\n * @module LRUCache\n */\n\n// module-private names and types\ntype Perf = { now: () => number }\nconst perf: Perf =\n typeof performance === 'object' &&\n performance &&\n typeof performance.now === 'function'\n ? performance\n : Date\n\nconst warned = new Set<string>()\n\n// either a function or a class\ntype ForC = ((...a: any[]) => any) | { new (...a: any[]): any }\n\n/* c8 ignore start */\nconst PROCESS = (\n typeof process === 'object' && !!process ? process : {}\n) as { [k: string]: any }\n/* c8 ignore start */\n\nconst emitWarning = (\n msg: string,\n type: string,\n code: string,\n fn: ForC\n) => {\n typeof PROCESS.emitWarning === 'function'\n ? PROCESS.emitWarning(msg, type, code, fn)\n : console.error(`[${code}] ${type}: ${msg}`)\n}\n\nlet AC = globalThis.AbortController\nlet AS = globalThis.AbortSignal\n\n/* c8 ignore start */\nif (typeof AC === 'undefined') {\n //@ts-ignore\n AS = class AbortSignal {\n onabort?: (...a: any[]) => any\n _onabort: ((...a: any[]) => any)[] = []\n reason?: any\n aborted: boolean = false\n addEventListener(_: string, fn: (...a: any[]) => any) {\n this._onabort.push(fn)\n }\n }\n //@ts-ignore\n AC = class AbortController {\n constructor() {\n warnACPolyfill()\n }\n signal = new AS()\n abort(reason: any) {\n if (this.signal.aborted) return\n //@ts-ignore\n this.signal.reason = reason\n //@ts-ignore\n this.signal.aborted = true\n //@ts-ignore\n for (const fn of this.signal._onabort) {\n fn(reason)\n }\n this.signal.onabort?.(reason)\n }\n }\n let printACPolyfillWarning =\n PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== '1'\n const warnACPolyfill = () => {\n if (!printACPolyfillWarning) return\n printACPolyfillWarning = false\n emitWarning(\n 'AbortController is not defined. If using lru-cache in ' +\n 'node 14, load an AbortController polyfill from the ' +\n '`node-abort-controller` package. A minimal polyfill is ' +\n 'provided for use by LRUCache.fetch(), but it should not be ' +\n 'relied upon in other contexts (eg, passing it to other APIs that ' +\n 'use AbortController/AbortSignal might have undesirable effects). ' +\n 'You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.',\n 'NO_ABORT_CONTROLLER',\n 'ENOTSUP',\n warnACPolyfill\n )\n }\n}\n/* c8 ignore stop */\n\nconst shouldWarn = (code: string) => !warned.has(code)\n\nconst TYPE = Symbol('type')\nexport type PosInt = number & { [TYPE]: 'Positive Integer' }\nexport type Index = number & { [TYPE]: 'LRUCache Index' }\n\nconst isPosInt = (n: any): n is PosInt =>\n n && n === Math.floor(n) && n > 0 && isFinite(n)\n\nexport type UintArray = Uint8Array | Uint16Array | Uint32Array\nexport type NumberArray = UintArray | number[]\n\n/* c8 ignore start */\n// This is a little bit ridiculous, tbh.\n// The maximum array length is 2^32-1 or thereabouts on most JS impls.\n// And well before that point, you're caching the entire world, I mean,\n// that's ~32GB of just integers for the next/prev links, plus whatever\n// else to hold that many keys and values. Just filling the memory with\n// zeroes at init time is brutal when you get that big.\n// But why not be complete?\n// Maybe in the future, these limits will have expanded.\nconst getUintArray = (max: number) =>\n !isPosInt(max)\n ? null\n : max <= Math.pow(2, 8)\n ? Uint8Array\n : max <= Math.pow(2, 16)\n ? Uint16Array\n : max <= Math.pow(2, 32)\n ? Uint32Array\n : max <= Number.MAX_SAFE_INTEGER\n ? ZeroArray\n : null\n/* c8 ignore stop */\n\nclass ZeroArray extends Array<number> {\n constructor(size: number) {\n super(size)\n this.fill(0)\n }\n}\nexport type { ZeroArray }\nexport type { Stack }\n\nexport type StackLike = Stack | Index[]\nclass Stack {\n heap: NumberArray\n length: number\n // private constructor\n static #constructing: boolean = false\n static create(max: number): StackLike {\n const HeapCls = getUintArray(max)\n if (!HeapCls) return []\n Stack.#constructing = true\n const s = new Stack(max, HeapCls)\n Stack.#constructing = false\n return s\n }\n constructor(\n max: number,\n HeapCls: { new (n: number): NumberArray }\n ) {\n /* c8 ignore start */\n if (!Stack.#constructing) {\n throw new TypeError('instantiate Stack using Stack.create(n)')\n }\n /* c8 ignore stop */\n this.heap = new HeapCls(max)\n this.length = 0\n }\n push(n: Index) {\n this.heap[this.length++] = n\n }\n pop(): Index {\n return this.heap[--this.length] as Index\n }\n}\n\n/**\n * Promise representing an in-progress {@link LRUCache#fetch} call\n */\nexport type BackgroundFetch<V> = Promise<V | undefined> & {\n __returned: BackgroundFetch<V> | undefined\n __abortController: AbortController\n __staleWhileFetching: V | undefined\n}\n\nexport type DisposeTask<K, V> = [\n value: V,\n key: K,\n reason: LRUCache.DisposeReason\n]\n\nexport namespace LRUCache {\n /**\n * An integer greater than 0, reflecting the calculated size of items\n */\n export type Size = number\n\n /**\n * Integer greater than 0, representing some number of milliseconds, or the\n * time at which a TTL started counting from.\n */\n export type Milliseconds = number\n\n /**\n * An integer greater than 0, reflecting a number of items\n */\n export type Count = number\n\n /**\n * The reason why an item was removed from the cache, passed\n * to the {@link Disposer} methods.\n *\n * - `evict`: The item was evicted because it is the least recently used,\n * and the cache is full.\n * - `set`: A new value was set, overwriting the old value being disposed.\n * - `delete`: The item was explicitly deleted, either by calling\n * {@link LRUCache#delete}, {@link LRUCache#clear}, or\n * {@link LRUCache#set} with an undefined value.\n * - `expire`: The item was removed due to exceeding its TTL.\n * - `fetch`: A {@link OptionsBase#fetchMethod} operation returned\n * `undefined` or was aborted, causing the item to be deleted.\n */\n export type DisposeReason =\n | 'evict'\n | 'set'\n | 'delete'\n | 'expire'\n | 'fetch'\n /**\n * A method called upon item removal, passed as the\n * {@link OptionsBase.dispose} and/or\n * {@link OptionsBase.disposeAfter} options.\n */\n export type Disposer<K, V> = (\n value: V,\n key: K,\n reason: DisposeReason\n ) => void\n\n /**\n * A function that returns the effective calculated size\n * of an entry in the cache.\n */\n export type SizeCalculator<K, V> = (value: V, key: K) => Size\n\n /**\n * Options provided to the\n * {@link OptionsBase.fetchMethod} function.\n */\n export interface FetcherOptions<K, V, FC = unknown> {\n signal: AbortSignal\n options: FetcherFetchOptions<K, V, FC>\n /**\n * Object provided in the {@link FetchOptions.context} option to\n * {@link LRUCache#fetch}\n */\n context: FC\n }\n\n /**\n * Occasionally, it may be useful to track the internal behavior of the\n * cache, particularly for logging, debugging, or for behavior within the\n * `fetchMethod`. To do this, you can pass a `status` object to the\n * {@link LRUCache#fetch}, {@link LRUCache#get}, {@link LRUCache#set},\n * {@link LRUCache#memo}, and {@link LRUCache#has} methods.\n *\n * The `status` option should be a plain JavaScript object. The following\n * fields will be set on it appropriately, depending on the situation.\n */\n export interface Status<V> {\n /**\n * The status of a set() operation.\n *\n * - add: the item was not found in the cache, and was added\n * - update: the item was in the cache, with the same value provided\n * - replace: the item was in the cache, and replaced\n * - miss: the item was not added to the cache for some reason\n */\n set?: 'add' | 'update' | 'replace' | 'miss'\n\n /**\n * the ttl stored for the item, or undefined if ttls are not used.\n */\n ttl?: Milliseconds\n\n /**\n * the start time for the item, or undefined if ttls are not used.\n */\n start?: Milliseconds\n\n /**\n * The timestamp used for TTL calculation\n */\n now?: Milliseconds\n\n /**\n * the remaining ttl for the item, or undefined if ttls are not used.\n */\n remainingTTL?: Milliseconds\n\n /**\n * The calculated size for the item, if sizes are used.\n */\n entrySize?: Size\n\n /**\n * The total calculated size of the cache, if sizes are used.\n */\n totalCalculatedSize?: Size\n\n /**\n * A flag indicating that the item was not stored, due to exceeding the\n * {@link OptionsBase.maxEntrySize}\n */\n maxEntrySizeExceeded?: true\n\n /**\n * The old value, specified in the case of `set:'update'` or\n * `set:'replace'`\n */\n oldValue?: V\n\n /**\n * The results of a {@link LRUCache#has} operation\n *\n * - hit: the item was found in the cache\n * - stale: the item was found in the cache, but is stale\n * - miss: the item was not found in the cache\n */\n has?: 'hit' | 'stale' | 'miss'\n\n /**\n * The status of a {@link LRUCache#fetch} operation.\n * Note that this can change as the underlying fetch() moves through\n * various states.\n *\n * - inflight: there is another fetch() for this key which is in process\n * - get: there is no {@link OptionsBase.fetchMethod}, so\n * {@link LRUCache#get} was called.\n * - miss: the item is not in cache, and will be fetched.\n * - hit: the item is in the cache, and was resolved immediately.\n * - stale: the item is in the cache, but stale.\n * - refresh: the item is in the cache, and not stale, but\n * {@link FetchOptions.forceRefresh} was specified.\n */\n fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'\n\n /**\n * The {@link OptionsBase.fetchMethod} was called\n */\n fetchDispatched?: true\n\n /**\n * The cached value was updated after a successful call to\n * {@link OptionsBase.fetchMethod}\n */\n fetchUpdated?: true\n\n /**\n * The reason for a fetch() rejection. Either the error raised by the\n * {@link OptionsBase.fetchMethod}, or the reason for an\n * AbortSignal.\n */\n fetchError?: Error\n\n /**\n * The fetch received an abort signal\n */\n fetchAborted?: true\n\n /**\n * The abort signal received was ignored, and the fetch was allowed to\n * continue.\n */\n fetchAbortIgnored?: true\n\n /**\n * The fetchMethod promise resolved successfully\n */\n fetchResolved?: true\n\n /**\n * The fetchMethod promise was rejected\n */\n fetchRejected?: true\n\n /**\n * The status of a {@link LRUCache#get} operation.\n *\n * - fetching: The item is currently being fetched. If a previous value\n * is present and allowed, that will be returned.\n * - stale: The item is in the cache, and is stale.\n * - hit: the item is in the cache\n * - miss: the item is not in the cache\n */\n get?: 'stale' | 'hit' | 'miss'\n\n /**\n * A fetch or get operation returned a stale value.\n */\n returnedStale?: true\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#fetch}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link OptionsBase.noDeleteOnFetchRejection},\n * {@link OptionsBase.allowStaleOnFetchRejection},\n * {@link FetchOptions.forceRefresh}, and\n * {@link FetcherOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.fetchMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the fetchMethod is called.\n */\n export interface FetcherFetchOptions<K, V, FC = unknown>\n extends Pick<\n OptionsBase<K, V, FC>,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n status?: Status<V>\n size?: Size\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#fetch} method.\n */\n export interface FetchOptions<K, V, FC>\n extends FetcherFetchOptions<K, V, FC> {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.fetchMethod} as\n * the {@link FetcherOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n signal?: AbortSignal\n status?: Status<V>\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface FetchOptionsWithContext<K, V, FC>\n extends FetchOptions<K, V, FC> {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#fetch} when the FC type is\n * `undefined` or `void`\n */\n export interface FetchOptionsNoContext<K, V>\n extends FetchOptions<K, V, undefined> {\n context?: undefined\n }\n\n export interface MemoOptions<K, V, FC = unknown>\n extends Pick<\n OptionsBase<K, V, FC>,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n | 'noDeleteOnFetchRejection'\n | 'allowStaleOnFetchRejection'\n | 'ignoreFetchAbort'\n | 'allowStaleOnFetchAbort'\n > {\n /**\n * Set to true to force a re-load of the existing data, even if it\n * is not yet stale.\n */\n forceRefresh?: boolean\n /**\n * Context provided to the {@link OptionsBase.memoMethod} as\n * the {@link MemoizerOptions.context} param.\n *\n * If the FC type is specified as unknown (the default),\n * undefined or void, then this is optional. Otherwise, it will\n * be required.\n */\n context?: FC\n status?: Status<V>\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is something\n * other than `unknown`, `undefined`, or `void`\n */\n export interface MemoOptionsWithContext<K, V, FC>\n extends MemoOptions<K, V, FC> {\n context: FC\n }\n /**\n * Options provided to {@link LRUCache#memo} when the FC type is\n * `undefined` or `void`\n */\n export interface MemoOptionsNoContext<K, V>\n extends MemoOptions<K, V, undefined> {\n context?: undefined\n }\n\n /**\n * Options provided to the\n * {@link OptionsBase.memoMethod} function.\n */\n export interface MemoizerOptions<K, V, FC = unknown> {\n options: MemoizerMemoOptions<K, V, FC>\n /**\n * Object provided in the {@link MemoOptions.context} option to\n * {@link LRUCache#memo}\n */\n context: FC\n }\n\n /**\n * options which override the options set in the LRUCache constructor\n * when calling {@link LRUCache#memo}.\n *\n * This is the union of {@link GetOptions} and {@link SetOptions}, plus\n * {@link MemoOptions.forceRefresh}, and\n * {@link MemoerOptions.context}\n *\n * Any of these may be modified in the {@link OptionsBase.memoMethod}\n * function, but the {@link GetOptions} fields will of course have no\n * effect, as the {@link LRUCache#get} call already happened by the time\n * the memoMethod is called.\n */\n export interface MemoizerMemoOptions<K, V, FC = unknown>\n extends Pick<\n OptionsBase<K, V, FC>,\n | 'allowStale'\n | 'updateAgeOnGet'\n | 'noDeleteOnStaleGet'\n | 'sizeCalculation'\n | 'ttl'\n | 'noDisposeOnSet'\n | 'noUpdateTTL'\n > {\n status?: Status<V>\n size?: Size\n start?: Milliseconds\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#has} method.\n */\n export interface HasOptions<K, V, FC>\n extends Pick<OptionsBase<K, V, FC>, 'updateAgeOnHas'> {\n status?: Status<V>\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#get} method.\n */\n export interface GetOptions<K, V, FC>\n extends Pick<\n OptionsBase<K, V, FC>,\n 'allowStale' | 'updateAgeOnGet' | 'noDeleteOnStaleGet'\n > {\n status?: Status<V>\n }\n\n /**\n * Options that may be passed to the {@link LRUCache#peek} method.\n */\n export interface PeekOptions<K, V, FC>\n extends Pick<OptionsBase<K, V, FC>, 'allowStale'> {}\n\n /**\n * Options that may be passed to the {@link LRUCache#set} method.\n */\n export interface SetOptions<K, V, FC>\n extends Pick<\n OptionsBase<K, V, FC>,\n 'sizeCalculation' | 'ttl' | 'noDisposeOnSet' | 'noUpdateTTL'\n > {\n /**\n * If size tracking is enabled, then setting an explicit size\n * in the {@link LRUCache#set} call will prevent calling the\n * {@link OptionsBase.sizeCalculation} function.\n */\n size?: Size\n /**\n * If TTL tracking is enabled, then setting an explicit start\n * time in the {@link LRUCache#set} call will override the\n * default time from `performance.now()` or `Date.now()`.\n *\n * Note that it must be a valid value for whichever time-tracking\n * method is in use.\n */\n start?: Milliseconds\n status?: Status<V>\n }\n\n /**\n * The type signature for the {@link OptionsBase.fetchMethod} option.\n */\n export type Fetcher<K, V, FC = unknown> = (\n key: K,\n staleValue: V | undefined,\n options: FetcherOptions<K, V, FC>\n ) => Promise<V | undefined | void> | V | undefined | void\n\n /**\n * the type signature for the {@link OptionsBase.memoMethod} option.\n */\n export type Memoizer<K, V, FC = unknown> = (\n key: K,\n staleValue: V | undefined,\n options: MemoizerOptions<K, V, FC>\n ) => V\n\n /**\n * Options which may be passed to the {@link LRUCache} constructor.\n *\n * Most of these may be overridden in the various options that use\n * them.\n *\n * Despite all being technically optional, the constructor requires that\n * a cache is at minimum limited by one or more of {@link OptionsBase.max},\n * {@link OptionsBase.ttl}, or {@link OptionsBase.maxSize}.\n *\n * If {@link OptionsBase.ttl} is used alone, then it is strongly advised\n * (and in fact required by the type definitions here) that the cache\n * also set {@link OptionsBase.ttlAutopurge}, to prevent potentially\n * unbounded storage.\n *\n * All options are also available on the {@link LRUCache} instance, making\n * it safe to pass an LRUCache instance as the options argumemnt to\n * make another empty cache of the same type.\n *\n * Some options are marked as read-only, because changing them after\n * instantiation is not safe. Changing any of the other options will of\n * course only have an effect on subsequent method calls.\n */\n export interface OptionsBase<K, V, FC> {\n /**\n * The maximum number of items to store in the cache before evicting\n * old entries. This is read-only on the {@link LRUCache} instance,\n * and may not be overridden.\n *\n * If set, then storage space will be pre-allocated at construction\n * time, and the cache will perform significantly faster.\n *\n * Note that significantly fewer items may be stored, if\n * {@link OptionsBase.maxSize} and/or {@link OptionsBase.ttl} are also\n * set.\n *\n * **It is strongly recommended to set a `max` to prevent unbounded growth\n * of the cache.**\n */\n max?: Count\n\n /**\n * Max time in milliseconds for items to live in cache before they are\n * considered stale. Note that stale items are NOT preemptively removed by\n * default, and MAY live in the cache, contributing to its LRU max, long\n * after they have expired, unless {@link OptionsBase.ttlAutopurge} is\n * set.\n *\n * If set to `0` (the default value), then that means \"do not track\n * TTL\", not \"expire immediately\".\n *\n * Also, as this cache is optimized for LRU/MRU operations, some of\n * the staleness/TTL checks will reduce performance, as they will incur\n * overhead by deleting items.\n *\n * This is not primarily a TTL cache, and does not make strong TTL\n * guarantees. There is no pre-emptive pruning of expired items, but you\n * _may_ set a TTL on the cache, and it will treat expired items as missing\n * when they are fetched, and delete them.\n *\n * Optional, but must be a non-negative integer in ms if specified.\n *\n * This may be overridden by passing an options object to `cache.set()`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if ttl tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * If ttl tracking is enabled, and `max` and `maxSize` are not set,\n * and `ttlAutopurge` is not set, then a warning will be emitted\n * cautioning about the potential for unbounded memory consumption.\n * (The TypeScript definitions will also discourage this.)\n */\n ttl?: Milliseconds\n\n /**\n * Minimum amount of time in ms in which to check for staleness.\n * Defaults to 1, which means that the current time is checked\n * at most once per millisecond.\n *\n * Set to 0 to check the current time every time staleness is tested.\n * (This reduces performance, and is theoretically unnecessary.)\n *\n * Setting this to a higher value will improve performance somewhat\n * while using ttl tracking, albeit at the expense of keeping stale\n * items around a bit longer than their TTLs would indicate.\n *\n * @default 1\n */\n ttlResolution?: Milliseconds\n\n /**\n * Preemptively remove stale items from the cache.\n *\n * Note that this may *significantly* degrade performance, especially if\n * the cache is storing a large number of items. It is almost always best\n * to just leave the stale items in the cache, and let them fall out as new\n * items are added.\n *\n * Note that this means that {@link OptionsBase.allowStale} is a bit\n * pointless, as stale items will be deleted almost as soon as they\n * expire.\n *\n * Use with caution!\n */\n ttlAutopurge?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever it is retrieved from cache with\n * {@link LRUCache#get}, causing it to not expire. (It can still fall out\n * of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n */\n updateAgeOnGet?: boolean\n\n /**\n * When using time-expiring entries with `ttl`, setting this to `true` will\n * make each item's age reset to 0 whenever its presence in the cache is\n * checked with {@link LRUCache#has}, causing it to not expire. (It can\n * still fall out of cache based on recency of use, of course.)\n *\n * Has no effect if {@link OptionsBase.ttl} is not set.\n */\n updateAgeOnHas?: boolean\n\n /**\n * Allow {@link LRUCache#get} and {@link LRUCache#fetch} calls to return\n * stale data, if available.\n *\n * By default, if you set `ttl`, stale items will only be deleted from the\n * cache when you `get(key)`. That is, it's not preemptively pruning items,\n * unless {@link OptionsBase.ttlAutopurge} is set.\n *\n * If you set `allowStale:true`, it'll return the stale value *as well as*\n * deleting it. If you don't set this, then it'll return `undefined` when\n * you try to get a stale entry.\n *\n * Note that when a stale entry is fetched, _even if it is returned due to\n * `allowStale` being set_, it is removed from the cache immediately. You\n * can suppress this behavior by setting\n * {@link OptionsBase.noDeleteOnStaleGet}, either in the constructor, or in\n * the options provided to {@link LRUCache#get}.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n * The `cache.has()` method will always return `false` for stale items.\n *\n * Only relevant if a ttl is set.\n */\n allowStale?: boolean\n\n /**\n * Function that is called on items when they are dropped from the\n * cache, as `dispose(value, key, reason)`.\n *\n * This can be handy if you want to close file descriptors or do\n * other cleanup tasks when items are no longer stored in the cache.\n *\n * **NOTE**: It is called _before_ the item has been fully removed\n * from the cache, so if you want to put it right back in, you need\n * to wait until the next tick. If you try to add it back in during\n * the `dispose()` function call, it will break things in subtle and\n * weird ways.\n *\n * Unlike several other options, this may _not_ be overridden by\n * passing an option to `set()`, for performance reasons.\n *\n * The `reason` will be one of the following strings, corresponding\n * to the reason for the item's deletion:\n *\n * - `evict` Item was evicted to make space for a new addition\n * - `set` Item was overwritten by a new value\n * - `expire` Item expired its TTL\n * - `fetch` Item was deleted due to a failed or aborted fetch, or a\n * fetchMethod returning `undefined.\n * - `delete` Item was removed by explicit `cache.delete(key)`,\n * `cache.clear()`, or `cache.set(key, undefined)`.\n */\n dispose?: Disposer<K, V>\n\n /**\n * The same as {@link OptionsBase.dispose}, but called *after* the entry\n * is completely removed and the cache is once again in a clean state.\n *\n * It is safe to add an item right back into the cache at this point.\n * However, note that it is *very* easy to inadvertently create infinite\n * recursion this way.\n */\n disposeAfter?: Disposer<K, V>\n\n /**\n * Set to true to suppress calling the\n * {@link OptionsBase.dispose} function if the entry key is\n * still accessible within the cache.\n *\n * This may be overridden by passing an options object to\n * {@link LRUCache#set}.\n *\n * Only relevant if `dispose` or `disposeAfter` are set.\n */\n noDisposeOnSet?: boolean\n\n /**\n * Boolean flag to tell the cache to not update the TTL when setting a new\n * value for an existing key (ie, when updating a value rather than\n * inserting a new value). Note that the TTL value is _always_ set (if\n * provided) when adding a new entry into the cache.\n *\n * Has no effect if a {@link OptionsBase.ttl} is not set.\n *\n * May be passed as an option to {@link LRUCache#set}.\n */\n noUpdateTTL?: boolean\n\n /**\n * Set to a positive integer to track the sizes of items added to the\n * cache, and automatically evict items in order to stay below this size.\n * Note that this may result in fewer than `max` items being stored.\n *\n * Attempting to add an item to the cache whose calculated size is greater\n * that this amount will be a no-op. The item will not be cached, and no\n * other items will be evicted.\n *\n * Optional, must be a positive integer if provided.\n *\n * Sets `maxEntrySize` to the same value, unless a different value is\n * provided for `maxEntrySize`.\n *\n * At least one of `max`, `maxSize`, or `TTL` is required. This must be a\n * positive integer if set.\n *\n * Even if size tracking is enabled, **it is strongly recommended to set a\n * `max` to prevent unbounded growth of the cache.**\n *\n * Note also that size tracking can negatively impact performance,\n * though for most cases, only minimally.\n */\n maxSize?: Size\n\n /**\n * The maximum allowed size for any single item in the cache.\n *\n * If a larger item is passed to {@link LRUCache#set} or returned by a\n * {@link OptionsBase.fetchMethod} or {@link OptionsBase.memoMethod}, then\n * it will not be stored in the cache.\n *\n * Attempting to add an item whose calculated size is greater than\n * this amount will not cache the item or evict any old items, but\n * WILL delete an existing value if one is already present.\n *\n * Optional, must be a positive integer if provided. Defaults to\n * the value of `maxSize` if provided.\n */\n maxEntrySize?: Size\n\n /**\n * A function that returns a number indicating the item's size.\n *\n * Requires {@link OptionsBase.maxSize} to be set.\n *\n * If not provided, and {@link OptionsBase.maxSize} or\n * {@link OptionsBase.maxEntrySize} are set, then all\n * {@link LRUCache#set} calls **must** provide an explicit\n * {@link SetOptions.size} or sizeCalculation param.\n */\n sizeCalculation?: SizeCalculator<K, V>\n\n /**\n * Method that provides the implementation for {@link LRUCache#fetch}\n *\n * ```ts\n * fetchMethod(key, staleValue, { signal, options, context })\n * ```\n *\n * If `fetchMethod` is not provided, then `cache.fetch(key)` is equivalent\n * to `Promise.resolve(cache.get(key))`.\n *\n * If at any time, `signal.aborted` is set to `true`, or if the\n * `signal.onabort` method is called, or if it emits an `'abort'` event\n * which you can listen to with `addEventListener`, then that means that\n * the fetch should be abandoned. This may be passed along to async\n * functions aware of AbortController/AbortSignal behavior.\n *\n * The `fetchMethod` should **only** return `undefined` or a Promise\n * resolving to `undefined` if the AbortController signaled an `abort`\n * event. In all other cases, it should return or resolve to a value\n * suitable for adding to the cache.\n *\n * The `options` object is a union of the options that may be provided to\n * `set()` and `get()`. If they are modified, then that will result in\n * modifying the settings to `cache.set()` when the value is resolved, and\n * in the case of\n * {@link OptionsBase.noDeleteOnFetchRejection} and\n * {@link OptionsBase.allowStaleOnFetchRejection}, the handling of\n * `fetchMethod` failures.\n *\n * For example, a DNS cache may update the TTL based on the value returned\n * from a remote DNS server by changing `options.ttl` in the `fetchMethod`.\n */\n fetchMethod?: Fetcher<K, V, FC>\n\n /**\n * Method that provides the implementation for {@link LRUCache#memo}\n */\n memoMethod?: Memoizer<K, V, FC>\n\n /**\n * Set to true to suppress the deletion of stale data when a\n * {@link OptionsBase.fetchMethod} returns a rejected promise.\n */\n noDeleteOnFetchRejection?: boolean\n\n /**\n * Do not delete stale items when they are retrieved with\n * {@link LRUCache#get}.\n *\n * Note that the `get` return value will still be `undefined`\n * unless {@link OptionsBase.allowStale} is true.\n *\n * When using time-expiring entries with `ttl`, by default stale\n * items will be removed from the cache when the key is accessed\n * with `cache.get()`.\n *\n * Setting this option will cause stale items to remain in the cache, until\n * they are explicitly deleted with `cache.delete(key)`, or retrieved with\n * `noDeleteOnStaleGet` set to `false`.\n *\n * This may be overridden by passing an options object to `cache.get()`.\n *\n * Only relevant if a ttl is used.\n */\n noDeleteOnStaleGet?: boolean\n\n /**\n * Set to true to allow returning stale data when a\n * {@link OptionsBase.fetchMethod} throws an error or returns a rejected\n * promise.\n *\n * This differs from using {@link OptionsBase.allowStale} in that stale\n * data will ONLY be returned in the case that the {@link LRUCache#fetch}\n * fails, not any other times.\n *\n * If a `fetchMethod` fails, and there is no stale value available, the\n * `fetch()` will resolve to `undefined`. Ie, all `fetchMethod` errors are\n * suppressed.\n *\n * Implies `noDeleteOnFetchRejection`.\n *\n * This may be set in calls to `fetch()`, or defaulted on the constructor,\n * or overridden by modifying the options object in the `fetchMethod`.\n */\n allowStaleOnFetchRejection?: boolean\n\n /**\n * Set to true to return a stale value from the cache when the\n * `AbortSignal` passed to the {@link OptionsBase.fetchMethod} dispatches\n * an `'abort'` event, whether user-triggered, or due to internal cache\n * behavior.\n *\n * Unless {@link OptionsBase.ignoreFetchAbort} is also set, the underlying\n * {@link OptionsBase.fetchMethod} will still be considered canceled, and\n * any value it returns will be ignored and not cached.\n *\n * Caveat: since fetches are aborted when a new value is explicitly\n * set in the cache, this can lead to fetch returning a stale value,\n * since that was the fallback value _at the moment the `fetch()` was\n * initiated_, even though the new updated value is now present in\n * the cache.\n *\n * For example:\n *\n * ```ts\n * const cache = new LRUCache<string, any>({\n * ttl: 100,\n * fetchMethod: async (url, oldValue, { signal }) => {\n * const res = await fetch(url, { signal })\n * return await res.json()\n * }\n * })\n * cache.set('https://example.com/', { some: 'data' })\n * // 100ms go by...\n * const result = cache.fetch('https://example.com/')\n * cache.set('https://example.com/', { other: 'thing' })\n * console.log(await result) // { some: 'data' }\n * console.log(cache.get('https://example.com/')) // { other: 'thing' }\n * ```\n */\n allowStaleOnFetchAbort?: boolean\n\n /**\n * Set to true to ignore the `abort` event emitted by the `AbortSignal`\n * object passed to {@link OptionsBase.fetchMethod}, and still cache the\n * resulting resolution value, as long as it is not `undefined`.\n *\n * When used on its own, this means aborted {@link LRUCache#fetch} calls\n * are not immediately resolved or rejected when they are aborted, and\n * instead take the full time to await.\n *\n * When used with {@link OptionsBase.allowStaleOnFetchAbort}, aborted\n * {@link LRUCache#fetch} calls will resolve immediately to their stale\n * cached value or `undefined`, and will continue to process and eventually\n * update the cache when they resolve, as long as the resulting value is\n * not `undefined`, thus supporting a \"return stale on timeout while\n * refreshing\" mechanism by passing `AbortSignal.timeout(n)` as the signal.\n *\n * For example:\n *\n * ```ts\n * const c = new LRUCache({\n * ttl: 100,\n * ignoreFetchAbort: true,\n * allowStaleOnFetchAbort: true,\n * fetchMethod: async (key, oldValue, { signal }) => {\n * // note: do NOT pass the signal to fetch()!\n * // let's say this fetch can take a long time.\n * const res = await fetch(`https://slow-backend-server/${key}`)\n * return await res.json()\n * },\n * })\n *\n * // this will return the stale value after 100ms, while still\n * // updating in the background for next time.\n * const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })\n * ```\n *\n * **Note**: regardless of this setting, an `abort` event _is still\n * emitted on the `AbortSignal` object_, so may result in invalid results\n * when passed to other underlying APIs that use AbortSignals.\n *\n * This may be overridden in the {@link OptionsBase.fetchMethod} or the\n * call to {@link LRUCache#fetch}.\n */\n ignoreFetchAbort?: boolean\n }\n\n export interface OptionsMaxLimit<K, V, FC>\n extends OptionsBase<K, V, FC> {\n max: Count\n }\n export interface OptionsTTLLimit<K, V, FC>\n extends OptionsBase<K, V, FC> {\n ttl: Milliseconds\n ttlAutopurge: boolean\n }\n export interface OptionsSizeLimit<K, V, FC>\n extends OptionsBase<K, V, FC> {\n maxSize: Size\n }\n\n /**\n * The valid safe options for the {@link LRUCache} constructor\n */\n export type Options<K, V, FC> =\n | OptionsMaxLimit<K, V, FC>\n | OptionsSizeLimit<K, V, FC>\n | OptionsTTLLimit<K, V, FC>\n\n /**\n * Entry objects used by {@link LRUCache#load} and {@link LRUCache#dump},\n * and returned by {@link LRUCache#info}.\n */\n export interface Entry<V> {\n value: V\n ttl?: Milliseconds\n size?: Size\n start?: Milliseconds\n }\n}\n\n/**\n * Default export, the thing you're using this module to get.\n *\n * The `K` and `V` types define the key and value types, respectively. The\n * optional `FC` type defines the type of the `context` object passed to\n * `cache.fetch()` and `cache.memo()`.\n *\n * Keys and values **must not** be `null` or `undefined`.\n *\n * All properties from the options object (with the exception of `max`,\n * `maxSize`, `fetchMethod`, `memoMethod`, `dispose` and `disposeAfter`) are\n * added as normal public members. (The listed options are read-only getters.)\n *\n * Changing any of these will alter the defaults for subsequent method calls.\n */\nexport class LRUCache<K extends {}, V extends {}, FC = unknown>\n implements Map<K, V>\n{\n // options that cannot be changed without disaster\n readonly #max: LRUCache.Count\n readonly #maxSize: LRUCache.Size\n readonly #dispose?: LRUCache.Disposer<K, V>\n readonly #disposeAfter?: LRUCache.Disposer<K, V>\n readonly #fetchMethod?: LRUCache.Fetcher<K, V, FC>\n readonly #memoMethod?: LRUCache.Memoizer<K, V, FC>\n\n /**\n * {@link LRUCache.OptionsBase.ttl}\n */\n ttl: LRUCache.Milliseconds\n\n /**\n * {@link LRUCache.OptionsBase.ttlResolution}\n */\n ttlResolution: LRUCache.Milliseconds\n /**\n * {@link LRUCache.OptionsBase.ttlAutopurge}\n */\n ttlAutopurge: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnGet}\n */\n updateAgeOnGet: boolean\n /**\n * {@link LRUCache.OptionsBase.updateAgeOnHas}\n */\n updateAgeOnHas: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStale}\n */\n allowStale: boolean\n\n /**\n * {@link LRUCache.OptionsBase.noDisposeOnSet}\n */\n noDisposeOnSet: boolean\n /**\n * {@link LRUCache.OptionsBase.noUpdateTTL}\n */\n noUpdateTTL: boolean\n /**\n * {@link LRUCache.OptionsBase.maxEntrySize}\n */\n maxEntrySize: LRUCache.Size\n /**\n * {@link LRUCache.OptionsBase.sizeCalculation}\n */\n sizeCalculation?: LRUCache.SizeCalculator<K, V>\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnFetchRejection}\n */\n noDeleteOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.noDeleteOnStaleGet}\n */\n noDeleteOnStaleGet: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort}\n */\n allowStaleOnFetchAbort: boolean\n /**\n * {@link LRUCache.OptionsBase.allowStaleOnFetchRejection}\n */\n allowStaleOnFetchRejection: boolean\n /**\n * {@link LRUCache.OptionsBase.ignoreFetchAbort}\n */\n ignoreFetchAbort: boolean\n\n // computed properties\n #size: LRUCache.Count\n #calculatedSize: LRUCache.Size\n #keyMap: Map<K, Index>\n #keyList: (K | undefined)[]\n #valList: (V | BackgroundFetch<V> | undefined)[]\n #next: NumberArray\n #prev: NumberArray\n #head: Index\n #tail: Index\n #free: StackLike\n #disposed?: DisposeTask<K, V>[]\n #sizes?: ZeroArray\n #starts?: ZeroArray\n #ttls?: ZeroArray\n\n #hasDispose: boolean\n #hasFetchMethod: boolean\n #hasDisposeAfter: boolean\n\n /**\n * Do not call this method unless you need to inspect the\n * inner workings of the cache. If anything returned by this\n * object is modified in any way, strange breakage may occur.\n *\n * These fields are private for a reason!\n *\n * @internal\n */\n static unsafeExposeInternals<\n K extends {},\n V extends {},\n FC extends unknown = unknown\n >(c: LRUCache<K, V, FC>) {\n return {\n // properties\n starts: c.#starts,\n ttls: c.#ttls,\n sizes: c.#sizes,\n keyMap: c.#keyMap as Map<K, number>,\n keyList: c.#keyList,\n valList: c.#valList,\n next: c.#next,\n prev: c.#prev,\n get head() {\n return c.#head\n },\n get tail() {\n return c.#tail\n },\n free: c.#free,\n // methods\n isBackgroundFetch: (p: any) => c.#isBackgroundFetch(p),\n backgroundFetch: (\n k: K,\n index: number | undefined,\n options: LRUCache.FetchOptions<K, V, FC>,\n context: any\n ): BackgroundFetch<V> =>\n c.#backgroundFetch(\n k,\n index as Index | undefined,\n options,\n context\n ),\n moveToTail: (index: number): void =>\n c.#moveToTail(index as Index),\n indexes: (options?: { allowStale: boolean }) =>\n c.#indexes(options),\n rindexes: (options?: { allowStale: boolean }) =>\n c.#rindexes(options),\n isStale: (index: number | undefined) =>\n c.#isStale(index as Index),\n }\n }\n\n // Protected read-only members\n\n /**\n * {@link LRUCache.OptionsBase.max} (read-only)\n */\n get max(): LRUCache.Count {\n return this.#max\n }\n /**\n * {@link LRUCache.OptionsBase.maxSize} (read-only)\n */\n get maxSize(): LRUCache.Count {\n return this.#maxSize\n }\n /**\n * The total computed size of items in the cache (read-only)\n */\n get calculatedSize(): LRUCache.Size {\n return this.#calculatedSize\n }\n /**\n * The number of items stored in the cache (read-only)\n */\n get size(): LRUCache.Count {\n return this.#size\n }\n /**\n * {@link LRUCache.OptionsBase.fetchMethod} (read-only)\n */\n get fetchMethod(): LRUCache.Fetcher<K, V, FC> | undefined {\n return this.#fetchMethod\n }\n get memoMethod(): LRUCache.Memoizer<K, V, FC> | undefined {\n return this.#memoMethod\n }\n /**\n * {@link LRUCache.OptionsBase.dispose} (read-only)\n */\n get dispose() {\n return this.#dispose\n }\n /**\n * {@link LRUCache.OptionsBase.disposeAfter} (read-only)\n */\n get disposeAfter() {\n return this.#disposeAfter\n }\n\n constructor(\n options: LRUCache.Options<K, V, FC> | LRUCache<K, V, FC>\n ) {\n const {\n max = 0,\n ttl,\n ttlResolution = 1,\n ttlAutopurge,\n updateAgeOnGet,\n updateAgeOnHas,\n allowStale,\n dispose,\n disposeAfter,\n noDisposeOnSet,\n noUpdateTTL,\n maxSize = 0,\n maxEntrySize = 0,\n sizeCalculation,\n fetchMethod,\n memoMethod,\n noDeleteOnFetchRejection,\n noDeleteOnStaleGet,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n } = options\n\n if (max !== 0 && !isPosInt(max)) {\n throw new TypeError('max option must be a nonnegative integer')\n }\n\n const UintArray = max ? getUintArray(max) : Array\n if (!UintArray) {\n throw new Error('invalid max value: ' + max)\n }\n\n this.#max = max\n this.#maxSize = maxSize\n this.maxEntrySize = maxEntrySize || this.#maxSize\n this.sizeCalculation = sizeCalculation\n if (this.sizeCalculation) {\n if (!this.#maxSize && !this.maxEntrySize) {\n throw new TypeError(\n 'cannot set sizeCalculation without setting maxSize or maxEntrySize'\n )\n }\n if (typeof this.sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation set to non-function')\n }\n }\n\n if (\n memoMethod !== undefined &&\n typeof memoMethod !== 'function'\n ) {\n throw new TypeError('memoMethod must be a function if defined')\n }\n this.#memoMethod = memoMethod\n\n if (\n fetchMethod !== undefined &&\n typeof fetchMethod !== 'function'\n ) {\n throw new TypeError(\n 'fetchMethod must be a function if specified'\n )\n }\n this.#fetchMethod = fetchMethod\n this.#hasFetchMethod = !!fetchMethod\n\n this.#keyMap = new Map()\n this.#keyList = new Array(max).fill(undefined)\n this.#valList = new Array(max).fill(undefined)\n this.#next = new UintArray(max)\n this.#prev = new UintArray(max)\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free = Stack.create(max)\n this.#size = 0\n this.#calculatedSize = 0\n\n if (typeof dispose === 'function') {\n this.#dispose = dispose\n }\n if (typeof disposeAfter === 'function') {\n this.#disposeAfter = disposeAfter\n this.#disposed = []\n } else {\n this.#disposeAfter = undefined\n this.#disposed = undefined\n }\n this.#hasDispose = !!this.#dispose\n this.#hasDisposeAfter = !!this.#disposeAfter\n\n this.noDisposeOnSet = !!noDisposeOnSet\n this.noUpdateTTL = !!noUpdateTTL\n this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection\n this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection\n this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort\n this.ignoreFetchAbort = !!ignoreFetchAbort\n\n // NB: maxEntrySize is set to maxSize if it's set\n if (this.maxEntrySize !== 0) {\n if (this.#maxSize !== 0) {\n if (!isPosInt(this.#maxSize)) {\n throw new TypeError(\n 'maxSize must be a positive integer if specified'\n )\n }\n }\n if (!isPosInt(this.maxEntrySize)) {\n throw new TypeError(\n 'maxEntrySize must be a positive integer if specified'\n )\n }\n this.#initializeSizeTracking()\n }\n\n this.allowStale = !!allowStale\n this.noDeleteOnStaleGet = !!noDeleteOnStaleGet\n this.updateAgeOnGet = !!updateAgeOnGet\n this.updateAgeOnHas = !!updateAgeOnHas\n this.ttlResolution =\n isPosInt(ttlResolution) || ttlResolution === 0\n ? ttlResolution\n : 1\n this.ttlAutopurge = !!ttlAutopurge\n this.ttl = ttl || 0\n if (this.ttl) {\n if (!isPosInt(this.ttl)) {\n throw new TypeError(\n 'ttl must be a positive integer if specified'\n )\n }\n this.#initializeTTLTracking()\n }\n\n // do not allow completely unbounded caches\n if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) {\n throw new TypeError(\n 'At least one of max, maxSize, or ttl is required'\n )\n }\n if (!this.ttlAutopurge && !this.#max && !this.#maxSize) {\n const code = 'LRU_CACHE_UNBOUNDED'\n if (shouldWarn(code)) {\n warned.add(code)\n const msg =\n 'TTL caching without ttlAutopurge, max, or maxSize can ' +\n 'result in unbounded memory consumption.'\n emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)\n }\n }\n }\n\n /**\n * Return the number of ms left in the item's TTL. If item is not in cache,\n * returns `0`. Returns `Infinity` if item is in cache without a defined TTL.\n */\n getRemainingTTL(key: K) {\n return this.#keyMap.has(key) ? Infinity : 0\n }\n\n #initializeTTLTracking() {\n const ttls = new ZeroArray(this.#max)\n const starts = new ZeroArray(this.#max)\n this.#ttls = ttls\n this.#starts = starts\n\n this.#setItemTTL = (index, ttl, start = perf.now()) => {\n starts[index] = ttl !== 0 ? start : 0\n ttls[index] = ttl\n if (ttl !== 0 && this.ttlAutopurge) {\n const t = setTimeout(() => {\n if (this.#isStale(index)) {\n this.#delete(this.#keyList[index] as K, 'expire')\n }\n }, ttl + 1)\n // unref() not supported on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n }\n\n this.#updateItemAge = index => {\n starts[index] = ttls[index] !== 0 ? perf.now() : 0\n }\n\n this.#statusTTL = (status, index) => {\n if (ttls[index]) {\n const ttl = ttls[index]\n const start = starts[index]\n /* c8 ignore next */\n if (!ttl || !start) return\n status.ttl = ttl\n status.start = start\n status.now = cachedNow || getNow()\n const age = status.now - start\n status.remainingTTL = ttl - age\n }\n }\n\n // debounce calls to perf.now() to 1s so we're not hitting\n // that costly call repeatedly.\n let cachedNow = 0\n const getNow = () => {\n const n = perf.now()\n if (this.ttlResolution > 0) {\n cachedNow = n\n const t = setTimeout(\n () => (cachedNow = 0),\n this.ttlResolution\n )\n // not available on all platforms\n /* c8 ignore start */\n if (t.unref) {\n t.unref()\n }\n /* c8 ignore stop */\n }\n return n\n }\n\n this.getRemainingTTL = key => {\n const index = this.#keyMap.get(key)\n if (index === undefined) {\n return 0\n }\n const ttl = ttls[index]\n const start = starts[index]\n if (!ttl || !start) {\n return Infinity\n }\n const age = (cachedNow || getNow()) - start\n return ttl - age\n }\n\n this.#isStale = index => {\n const s = starts[index]\n const t = ttls[index]\n return !!t && !!s && (cachedNow || getNow()) - s > t\n }\n }\n\n // conditionally set private methods related to TTL\n #updateItemAge: (index: Index) => void = () => {}\n #statusTTL: (status: LRUCache.Status<V>, index: Index) => void =\n () => {}\n #setItemTTL: (\n index: Index,\n ttl: LRUCache.Milliseconds,\n start?: LRUCache.Milliseconds\n // ignore because we never call this if we're not already in TTL mode\n /* c8 ignore start */\n ) => void = () => {}\n /* c8 ignore stop */\n\n #isStale: (index: Index) => boolean = () => false\n\n #initializeSizeTracking() {\n const sizes = new ZeroArray(this.#max)\n this.#calculatedSize = 0\n this.#sizes = sizes\n this.#removeItemSize = index => {\n this.#calculatedSize -= sizes[index] as number\n sizes[index] = 0\n }\n this.#requireSize = (k, v, size, sizeCalculation) => {\n // provisionally accept background fetches.\n // actual value size will be checked when they return.\n if (this.#isBackgroundFetch(v)) {\n return 0\n }\n if (!isPosInt(size)) {\n if (sizeCalculation) {\n if (typeof sizeCalculation !== 'function') {\n throw new TypeError('sizeCalculation must be a function')\n }\n size = sizeCalculation(v, k)\n if (!isPosInt(size)) {\n throw new TypeError(\n 'sizeCalculation return invalid (expect positive integer)'\n )\n }\n } else {\n throw new TypeError(\n 'invalid size value (must be positive integer). ' +\n 'When maxSize or maxEntrySize is used, sizeCalculation ' +\n 'or size must be set.'\n )\n }\n }\n return size\n }\n this.#addItemSize = (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status<V>\n ) => {\n sizes[index] = size\n if (this.#maxSize) {\n const maxSize = this.#maxSize - (sizes[index] as number)\n while (this.#calculatedSize > maxSize) {\n this.#evict(true)\n }\n }\n this.#calculatedSize += sizes[index] as number\n if (status) {\n status.entrySize = size\n status.totalCalculatedSize = this.#calculatedSize\n }\n }\n }\n\n #removeItemSize: (index: Index) => void = _i => {}\n #addItemSize: (\n index: Index,\n size: LRUCache.Size,\n status?: LRUCache.Status<V>\n ) => void = (_i, _s, _st) => {}\n #requireSize: (\n k: K,\n v: V | BackgroundFetch<V>,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator<K, V>\n ) => LRUCache.Size = (\n _k: K,\n _v: V | BackgroundFetch<V>,\n size?: LRUCache.Size,\n sizeCalculation?: LRUCache.SizeCalculator<K, V>\n ) => {\n if (size || sizeCalculation) {\n throw new TypeError(\n 'cannot set size without setting maxSize or maxEntrySize on cache'\n )\n }\n return 0\n };\n\n *#indexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#tail; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#head) {\n break\n } else {\n i = this.#prev[i] as Index\n }\n }\n }\n }\n\n *#rindexes({ allowStale = this.allowStale } = {}) {\n if (this.#size) {\n for (let i = this.#head; true; ) {\n if (!this.#isValidIndex(i)) {\n break\n }\n if (allowStale || !this.#isStale(i)) {\n yield i\n }\n if (i === this.#tail) {\n break\n } else {\n i = this.#next[i] as Index\n }\n }\n }\n }\n\n #isValidIndex(index: Index) {\n return (\n index !== undefined &&\n this.#keyMap.get(this.#keyList[index] as K) === index\n )\n }\n\n /**\n * Return a generator yielding `[key, value]` pairs,\n * in order from most recently used to least recently used.\n */\n *entries() {\n for (const i of this.#indexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]] as [K, V]\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.entries}\n *\n * Return a generator yielding `[key, value]` pairs,\n * in order from least recently used to most recently used.\n */\n *rentries() {\n for (const i of this.#rindexes()) {\n if (\n this.#valList[i] !== undefined &&\n this.#keyList[i] !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield [this.#keyList[i], this.#valList[i]]\n }\n }\n }\n\n /**\n * Return a generator yielding the keys in the cache,\n * in order from most recently used to least recently used.\n */\n *keys() {\n for (const i of this.#indexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.keys}\n *\n * Return a generator yielding the keys in the cache,\n * in order from least recently used to most recently used.\n */\n *rkeys() {\n for (const i of this.#rindexes()) {\n const k = this.#keyList[i]\n if (\n k !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield k\n }\n }\n }\n\n /**\n * Return a generator yielding the values in the cache,\n * in order from most recently used to least recently used.\n */\n *values() {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i] as V\n }\n }\n }\n\n /**\n * Inverse order version of {@link LRUCache.values}\n *\n * Return a generator yielding the values in the cache,\n * in order from least recently used to most recently used.\n */\n *rvalues() {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n if (\n v !== undefined &&\n !this.#isBackgroundFetch(this.#valList[i])\n ) {\n yield this.#valList[i]\n }\n }\n }\n\n /**\n * Iterating over the cache itself yields the same results as\n * {@link LRUCache.entries}\n */\n [Symbol.iterator]() {\n return this.entries()\n }\n\n /**\n * A String value that is used in the creation of the default string\n * description of an object. Called by the built-in method\n * `Object.prototype.toString`.\n */\n [Symbol.toStringTag] = 'LRUCache'\n\n /**\n * Find a value for which the supplied fn method returns a truthy value,\n * similar to `Array.find()`. fn is called as `fn(value, key, cache)`.\n */\n find(\n fn: (v: V, k: K, self: LRUCache<K, V, FC>) => boolean,\n getOptions: LRUCache.GetOptions<K, V, FC> = {}\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n if (fn(value, this.#keyList[i] as K, this)) {\n return this.get(this.#keyList[i] as K, getOptions)\n }\n }\n }\n\n /**\n * Call the supplied function on each item in the cache, in order from most\n * recently used to least recently used.\n *\n * `fn` is called as `fn(value, key, cache)`.\n *\n * If `thisp` is provided, function will be called in the `this`-context of\n * the provided object, or the cache if no `thisp` object is provided.\n *\n * Does not update age or recenty of use, or iterate over stale values.\n */\n forEach(\n fn: (v: V, k: K, self: LRUCache<K, V, FC>) => any,\n thisp: any = this\n ) {\n for (const i of this.#indexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * The same as {@link LRUCache.forEach} but items are iterated over in\n * reverse order. (ie, less recently used items are iterated over first.)\n */\n rforEach(\n fn: (v: V, k: K, self: LRUCache<K, V, FC>) => any,\n thisp: any = this\n ) {\n for (const i of this.#rindexes()) {\n const v = this.#valList[i]\n const value = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) continue\n fn.call(thisp, value, this.#keyList[i] as K, this)\n }\n }\n\n /**\n * Delete any stale entries. Returns true if anything was removed,\n * false otherwise.\n */\n purgeStale() {\n let deleted = false\n for (const i of this.#rindexes({ allowStale: true })) {\n if (this.#isStale(i)) {\n this.#delete(this.#keyList[i] as K, 'expire')\n deleted = true\n }\n }\n return deleted\n }\n\n /**\n * Get the extended info about a given entry, to get its value, size, and\n * TTL info simultaneously. Returns `undefined` if the key is not present.\n *\n * Unlike {@link LRUCache#dump}, which is designed to be portable and survive\n * serialization, the `start` value is always the current timestamp, and the\n * `ttl` is a calculated remaining time to live (negative if expired).\n *\n * Always returns stale values, if their info is found in the cache, so be\n * sure to check for expirations (ie, a negative {@link LRUCache.Entry#ttl})\n * if relevant.\n */\n info(key: K): LRUCache.Entry<V> | undefined {\n const i = this.#keyMap.get(key)\n if (i === undefined) return undefined\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined) return undefined\n const entry: LRUCache.Entry<V> = { value }\n if (this.#ttls && this.#starts) {\n const ttl = this.#ttls[i]\n const start = this.#starts[i]\n if (ttl && start) {\n const remain = ttl - (perf.now() - start)\n entry.ttl = remain\n entry.start = Date.now()\n }\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n return entry\n }\n\n /**\n * Return an array of [key, {@link LRUCache.Entry}] tuples which can be\n * passed to {@link LRLUCache#load}.\n *\n * The `start` fields are calculated relative to a portable `Date.now()`\n * timestamp, even if `performance.now()` is available.\n *\n * Stale entries are always included in the `dump`, even if\n * {@link LRUCache.OptionsBase.allowStale} is false.\n *\n * Note: this returns an actual array, not a generator, so it can be more\n * easily passed around.\n */\n dump() {\n const arr: [K, LRUCache.Entry<V>][] = []\n for (const i of this.#indexes({ allowStale: true })) {\n const key = this.#keyList[i]\n const v = this.#valList[i]\n const value: V | undefined = this.#isBackgroundFetch(v)\n ? v.__staleWhileFetching\n : v\n if (value === undefined || key === undefined) continue\n const entry: LRUCache.Entry<V> = { value }\n if (this.#ttls && this.#starts) {\n entry.ttl = this.#ttls[i]\n // always dump the start relative to a portable timestamp\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = perf.now() - (this.#starts[i] as number)\n entry.start = Math.floor(Date.now() - age)\n }\n if (this.#sizes) {\n entry.size = this.#sizes[i]\n }\n arr.unshift([key, entry])\n }\n return arr\n }\n\n /**\n * Reset the cache and load in the items in entries in the order listed.\n *\n * The shape of the resulting cache may be different if the same options are\n * not used in both caches.\n *\n * The `start` fields are assumed to be calculated relative to a portable\n * `Date.now()` timestamp, even if `performance.now()` is available.\n */\n load(arr: [K, LRUCache.Entry<V>][]) {\n this.clear()\n for (const [key, entry] of arr) {\n if (entry.start) {\n // entry.start is a portable timestamp, but we may be using\n // node's performance.now(), so calculate the offset, so that\n // we get the intended remaining TTL, no matter how long it's\n // been on ice.\n //\n // it's ok for this to be a bit slow, it's a rare operation.\n const age = Date.now() - entry.start\n entry.start = perf.now() - age\n }\n this.set(key, entry.value, entry)\n }\n }\n\n /**\n * Add a value to the cache.\n *\n * Note: if `undefined` is specified as a value, this is an alias for\n * {@link LRUCache#delete}\n *\n * Fields on the {@link LRUCache.SetOptions} options param will override\n * their corresponding values in the constructor options for the scope\n * of this single `set()` operation.\n *\n * If `start` is provided, then that will set the effective start\n * time for the TTL calculation. Note that this must be a previous\n * value of `performance.now()` if supported, or a previous value of\n * `Date.now()` if not.\n *\n * Options object may also include `size`, which will prevent\n * calling the `sizeCalculation` function and just use the specified\n * number if it is a positive integer, and `noDisposeOnSet` which\n * will prevent calling a `dispose` function in the case of\n * overwrites.\n *\n * If the `size` (or return value of `sizeCalculation`) for a given\n * entry is greater than `maxEntrySize`, then the item will not be\n * added to the cache.\n *\n * Will update the recency of the entry.\n *\n * If the value is `undefined`, then this is an alias for\n * `cache.delete(key)`. `undefined` is never stored in the cache.\n */\n set(\n k: K,\n v: V | BackgroundFetch<V> | undefined,\n setOptions: LRUCache.SetOptions<K, V, FC> = {}\n ) {\n if (v === undefined) {\n this.delete(k)\n return this\n }\n const {\n ttl = this.ttl,\n start,\n noDisposeOnSet = this.noDisposeOnSet,\n sizeCalculation = this.sizeCalculation,\n status,\n } = setOptions\n let { noUpdateTTL = this.noUpdateTTL } = setOptions\n\n const size = this.#requireSize(\n k,\n v,\n setOptions.size || 0,\n sizeCalculation\n )\n // if the item doesn't fit, don't do anything\n // NB: maxEntrySize set to maxSize by default\n if (this.maxEntrySize && size > this.maxEntrySize) {\n if (status) {\n status.set = 'miss'\n status.maxEntrySizeExceeded = true\n }\n // have to delete, in case something is there already.\n this.#delete(k, 'set')\n return this\n }\n let index = this.#size === 0 ? undefined : this.#keyMap.get(k)\n if (index === undefined) {\n // addition\n index = (\n this.#size === 0\n ? this.#tail\n : this.#free.length !== 0\n ? this.#free.pop()\n : this.#size === this.#max\n ? this.#evict(false)\n : this.#size\n ) as Index\n this.#keyList[index] = k\n this.#valList[index] = v\n this.#keyMap.set(k, index)\n this.#next[this.#tail] = index\n this.#prev[index] = this.#tail\n this.#tail = index\n this.#size++\n this.#addItemSize(index, size, status)\n if (status) status.set = 'add'\n noUpdateTTL = false\n } else {\n // update\n this.#moveToTail(index)\n const oldVal = this.#valList[index] as V | BackgroundFetch<V>\n if (v !== oldVal) {\n if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) {\n oldVal.__abortController.abort(new Error('replaced'))\n const { __staleWhileFetching: s } = oldVal\n if (s !== undefined && !noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(s as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([s as V, k, 'set'])\n }\n }\n } else if (!noDisposeOnSet) {\n if (this.#hasDispose) {\n this.#dispose?.(oldVal as V, k, 'set')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([oldVal as V, k, 'set'])\n }\n }\n this.#removeItemSize(index)\n this.#addItemSize(index, size, status)\n this.#valList[index] = v\n if (status) {\n status.set = 'replace'\n const oldValue =\n oldVal && this.#isBackgroundFetch(oldVal)\n ? oldVal.__staleWhileFetching\n : oldVal\n if (oldValue !== undefined) status.oldValue = oldValue\n }\n } else if (status) {\n status.set = 'update'\n }\n }\n if (ttl !== 0 && !this.#ttls) {\n this.#initializeTTLTracking()\n }\n if (this.#ttls) {\n if (!noUpdateTTL) {\n this.#setItemTTL(index, ttl, start)\n }\n if (status) this.#statusTTL(status, index)\n }\n if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return this\n }\n\n /**\n * Evict the least recently used item, returning its value or\n * `undefined` if cache is empty.\n */\n pop(): V | undefined {\n try {\n while (this.#size) {\n const val = this.#valList[this.#head]\n this.#evict(true)\n if (this.#isBackgroundFetch(val)) {\n if (val.__staleWhileFetching) {\n return val.__staleWhileFetching\n }\n } else if (val !== undefined) {\n return val\n }\n }\n } finally {\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n }\n\n #evict(free: boolean) {\n const head = this.#head\n const k = this.#keyList[head] as K\n const v = this.#valList[head] as V\n if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('evicted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v, k, 'evict')\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v, k, 'evict'])\n }\n }\n this.#removeItemSize(head)\n // if we aren't about to use the index, then null these out\n if (free) {\n this.#keyList[head] = undefined\n this.#valList[head] = undefined\n this.#free.push(head)\n }\n if (this.#size === 1) {\n this.#head = this.#tail = 0 as Index\n this.#free.length = 0\n } else {\n this.#head = this.#next[head] as Index\n }\n this.#keyMap.delete(k)\n this.#size--\n return head\n }\n\n /**\n * Check if a key is in the cache, without updating the recency of use.\n * Will return false if the item is stale, even though it is technically\n * in the cache.\n *\n * Check if a key is in the cache, without updating the recency of\n * use. Age is updated if {@link LRUCache.OptionsBase.updateAgeOnHas} is set\n * to `true` in either the options or the constructor.\n *\n * Will return `false` if the item is stale, even though it is technically in\n * the cache. The difference can be determined (if it matters) by using a\n * `status` argument, and inspecting the `has` field.\n *\n * Will not update item age unless\n * {@link LRUCache.OptionsBase.updateAgeOnHas} is set.\n */\n has(k: K, hasOptions: LRUCache.HasOptions<K, V, FC> = {}) {\n const { updateAgeOnHas = this.updateAgeOnHas, status } =\n hasOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const v = this.#valList[index]\n if (\n this.#isBackgroundFetch(v) &&\n v.__staleWhileFetching === undefined\n ) {\n return false\n }\n if (!this.#isStale(index)) {\n if (updateAgeOnHas) {\n this.#updateItemAge(index)\n }\n if (status) {\n status.has = 'hit'\n this.#statusTTL(status, index)\n }\n return true\n } else if (status) {\n status.has = 'stale'\n this.#statusTTL(status, index)\n }\n } else if (status) {\n status.has = 'miss'\n }\n return false\n }\n\n /**\n * Like {@link LRUCache#get} but doesn't update recency or delete stale\n * items.\n *\n * Returns `undefined` if the item is stale, unless\n * {@link LRUCache.OptionsBase.allowStale} is set.\n */\n peek(k: K, peekOptions: LRUCache.PeekOptions<K, V, FC> = {}) {\n const { allowStale = this.allowStale } = peekOptions\n const index = this.#keyMap.get(k)\n if (\n index === undefined ||\n (!allowStale && this.#isStale(index))\n ) {\n return\n }\n const v = this.#valList[index]\n // either stale and allowed, or forcing a refresh of non-stale value\n return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v\n }\n\n #backgroundFetch(\n k: K,\n index: Index | undefined,\n options: LRUCache.FetchOptions<K, V, FC>,\n context: any\n ): BackgroundFetch<V> {\n const v = index === undefined ? undefined : this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n return v\n }\n\n const ac = new AC()\n const { signal } = options\n // when/if our AC signals, then stop listening to theirs.\n signal?.addEventListener('abort', () => ac.abort(signal.reason), {\n signal: ac.signal,\n })\n\n const fetchOpts = {\n signal: ac.signal,\n options,\n context,\n }\n\n const cb = (\n v: V | undefined,\n updateCache = false\n ): V | undefined => {\n const { aborted } = ac.signal\n const ignoreAbort = options.ignoreFetchAbort && v !== undefined\n if (options.status) {\n if (aborted && !updateCache) {\n options.status.fetchAborted = true\n options.status.fetchError = ac.signal.reason\n if (ignoreAbort) options.status.fetchAbortIgnored = true\n } else {\n options.status.fetchResolved = true\n }\n }\n if (aborted && !ignoreAbort && !updateCache) {\n return fetchFail(ac.signal.reason)\n }\n // either we didn't abort, and are still here, or we did, and ignored\n const bf = p as BackgroundFetch<V>\n if (this.#valList[index as Index] === p) {\n if (v === undefined) {\n if (bf.__staleWhileFetching) {\n this.#valList[index as Index] = bf.__staleWhileFetching\n } else {\n this.#delete(k, 'fetch')\n }\n } else {\n if (options.status) options.status.fetchUpdated = true\n this.set(k, v, fetchOpts.options)\n }\n }\n return v\n }\n\n const eb = (er: any) => {\n if (options.status) {\n options.status.fetchRejected = true\n options.status.fetchError = er\n }\n return fetchFail(er)\n }\n\n const fetchFail = (er: any): V | undefined => {\n const { aborted } = ac.signal\n const allowStaleAborted =\n aborted && options.allowStaleOnFetchAbort\n const allowStale =\n allowStaleAborted || options.allowStaleOnFetchRejection\n const noDelete = allowStale || options.noDeleteOnFetchRejection\n const bf = p as BackgroundFetch<V>\n if (this.#valList[index as Index] === p) {\n // if we allow stale on fetch rejections, then we need to ensure that\n // the stale value is not removed from the cache when the fetch fails.\n const del = !noDelete || bf.__staleWhileFetching === undefined\n if (del) {\n this.#delete(k, 'fetch')\n } else if (!allowStaleAborted) {\n // still replace the *promise* with the stale value,\n // since we are done with the promise at this point.\n // leave it untouched if we're still waiting for an\n // aborted background fetch that hasn't yet returned.\n this.#valList[index as Index] = bf.__staleWhileFetching\n }\n }\n if (allowStale) {\n if (options.status && bf.__staleWhileFetching !== undefined) {\n options.status.returnedStale = true\n }\n return bf.__staleWhileFetching\n } else if (bf.__returned === bf) {\n throw er\n }\n }\n\n const pcall = (\n res: (v: V | undefined) => void,\n rej: (e: any) => void\n ) => {\n const fmp = this.#fetchMethod?.(k, v, fetchOpts)\n if (fmp && fmp instanceof Promise) {\n fmp.then(v => res(v === undefined ? undefined : v), rej)\n }\n // ignored, we go until we finish, regardless.\n // defer check until we are actually aborting,\n // so fetchMethod can override.\n ac.signal.addEventListener('abort', () => {\n if (\n !options.ignoreFetchAbort ||\n options.allowStaleOnFetchAbort\n ) {\n res(undefined)\n // when it eventually resolves, update the cache.\n if (options.allowStaleOnFetchAbort) {\n res = v => cb(v, true)\n }\n }\n })\n }\n\n if (options.status) options.status.fetchDispatched = true\n const p = new Promise(pcall).then(cb, eb)\n const bf: BackgroundFetch<V> = Object.assign(p, {\n __abortController: ac,\n __staleWhileFetching: v,\n __returned: undefined,\n })\n\n if (index === undefined) {\n // internal, don't expose status.\n this.set(k, bf, { ...fetchOpts.options, status: undefined })\n index = this.#keyMap.get(k)\n } else {\n this.#valList[index] = bf\n }\n return bf\n }\n\n #isBackgroundFetch(p: any): p is BackgroundFetch<V> {\n if (!this.#hasFetchMethod) return false\n const b = p as BackgroundFetch<V>\n return (\n !!b &&\n b instanceof Promise &&\n b.hasOwnProperty('__staleWhileFetching') &&\n b.__abortController instanceof AC\n )\n }\n\n /**\n * Make an asynchronous cached fetch using the\n * {@link LRUCache.OptionsBase.fetchMethod} function.\n *\n * If the value is in the cache and not stale, then the returned\n * Promise resolves to the value.\n *\n * If not in the cache, or beyond its TTL staleness, then\n * `fetchMethod(key, staleValue, { options, signal, context })` is\n * called, and the value returned will be added to the cache once\n * resolved.\n *\n * If called with `allowStale`, and an asynchronous fetch is\n * currently in progress to reload a stale value, then the former\n * stale value will be returned.\n *\n * If called with `forceRefresh`, then the cached item will be\n * re-fetched, even if it is not stale. However, if `allowStale` is also\n * set, then the old value will still be returned. This is useful\n * in cases where you want to force a reload of a cached value. If\n * a background fetch is already in progress, then `forceRefresh`\n * has no effect.\n *\n * If multiple fetches for the same key are issued, then they will all be\n * coalesced into a single call to fetchMethod.\n *\n * Note that this means that handling options such as\n * {@link LRUCache.OptionsBase.allowStaleOnFetchAbort},\n * {@link LRUCache.FetchOptions.signal},\n * and {@link LRUCache.OptionsBase.allowStaleOnFetchRejection} will be\n * determined by the FIRST fetch() call for a given key.\n *\n * This is a known (fixable) shortcoming which will be addresed on when\n * someone complains about it, as the fix would involve added complexity and\n * may not be worth the costs for this edge case.\n *\n * If {@link LRUCache.OptionsBase.fetchMethod} is not specified, then this is\n * effectively an alias for `Promise.resolve(cache.get(key))`.\n *\n * When the fetch method resolves to a value, if the fetch has not\n * been aborted due to deletion, eviction, or being overwritten,\n * then it is added to the cache using the options provided.\n *\n * If the key is evicted or deleted before the `fetchMethod`\n * resolves, then the AbortSignal passed to the `fetchMethod` will\n * receive an `abort` event, and the promise returned by `fetch()`\n * will reject with the reason for the abort.\n *\n * If a `signal` is passed to the `fetch()` call, then aborting the\n * signal will abort the fetch and cause the `fetch()` promise to\n * reject with the reason provided.\n *\n * **Setting `context`**\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the {@link LRUCache} constructor, then all\n * calls to `cache.fetch()` _must_ provide a `context` option. If\n * set to `undefined` or `void`, then calls to fetch _must not_\n * provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that\n * might be relevant in the course of fetching the data. It is only\n * relevant for the course of a single `fetch()` operation, and\n * discarded afterwards.\n *\n * **Note: `fetch()` calls are inflight-unique**\n *\n * If you call `fetch()` multiple times with the same key value,\n * then every call after the first will resolve on the same\n * promise<sup>1</sup>,\n * _even if they have different settings that would otherwise change\n * the behavior of the fetch_, such as `noDeleteOnFetchRejection`\n * or `ignoreFetchAbort`.\n *\n * In most cases, this is not a problem (in fact, only fetching\n * something once is what you probably want, if you're caching in\n * the first place). If you are changing the fetch() options\n * dramatically between runs, there's a good chance that you might\n * be trying to fit divergent semantics into a single object, and\n * would be better off with multiple cache instances.\n *\n * **1**: Ie, they're not the \"same Promise\", but they resolve at\n * the same time, because they're both waiting on the same\n * underlying fetchMethod response.\n */\n\n fetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : LRUCache.FetchOptionsWithContext<K, V, FC>\n ): Promise<undefined | V>\n\n // this overload not allowed if context is required\n fetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : never\n ): Promise<undefined | V>\n\n async fetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions<K, V, FC> = {}\n ): Promise<undefined | V> {\n const {\n // get options\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n // set options\n ttl = this.ttl,\n noDisposeOnSet = this.noDisposeOnSet,\n size = 0,\n sizeCalculation = this.sizeCalculation,\n noUpdateTTL = this.noUpdateTTL,\n // fetch exclusive options\n noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,\n allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,\n ignoreFetchAbort = this.ignoreFetchAbort,\n allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,\n context,\n forceRefresh = false,\n status,\n signal,\n } = fetchOptions\n\n if (!this.#hasFetchMethod) {\n if (status) status.fetch = 'get'\n return this.get(k, {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n status,\n })\n }\n\n const options = {\n allowStale,\n updateAgeOnGet,\n noDeleteOnStaleGet,\n ttl,\n noDisposeOnSet,\n size,\n sizeCalculation,\n noUpdateTTL,\n noDeleteOnFetchRejection,\n allowStaleOnFetchRejection,\n allowStaleOnFetchAbort,\n ignoreFetchAbort,\n status,\n signal,\n }\n\n let index = this.#keyMap.get(k)\n if (index === undefined) {\n if (status) status.fetch = 'miss'\n const p = this.#backgroundFetch(k, index, options, context)\n return (p.__returned = p)\n } else {\n // in cache, maybe already fetching\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n const stale =\n allowStale && v.__staleWhileFetching !== undefined\n if (status) {\n status.fetch = 'inflight'\n if (stale) status.returnedStale = true\n }\n return stale ? v.__staleWhileFetching : (v.__returned = v)\n }\n\n // if we force a refresh, that means do NOT serve the cached value,\n // unless we are already in the process of refreshing the cache.\n const isStale = this.#isStale(index)\n if (!forceRefresh && !isStale) {\n if (status) status.fetch = 'hit'\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n if (status) this.#statusTTL(status, index)\n return v\n }\n\n // ok, it is stale or a forced refresh, and not already fetching.\n // refresh the cache.\n const p = this.#backgroundFetch(k, index, options, context)\n const hasStale = p.__staleWhileFetching !== undefined\n const staleVal = hasStale && allowStale\n if (status) {\n status.fetch = isStale ? 'stale' : 'refresh'\n if (staleVal && isStale) status.returnedStale = true\n }\n return staleVal ? p.__staleWhileFetching : (p.__returned = p)\n }\n }\n\n /**\n * In some cases, `cache.fetch()` may resolve to `undefined`, either because\n * a {@link LRUCache.OptionsBase#fetchMethod} was not provided (turning\n * `cache.fetch(k)` into just an async wrapper around `cache.get(k)`) or\n * because `ignoreFetchAbort` was specified (either to the constructor or\n * in the {@link LRUCache.FetchOptions}). Also, the\n * {@link OptionsBase.fetchMethod} may return `undefined` or `void`, making\n * the test even more complicated.\n *\n * Because inferring the cases where `undefined` might be returned are so\n * cumbersome, but testing for `undefined` can also be annoying, this method\n * can be used, which will reject if `this.fetch()` resolves to undefined.\n */\n forceFetch(\n k: K,\n fetchOptions: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : LRUCache.FetchOptionsWithContext<K, V, FC>\n ): Promise<V>\n // this overload not allowed if context is required\n forceFetch(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n fetchOptions?: unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : never\n ): Promise<V>\n async forceFetch(\n k: K,\n fetchOptions: LRUCache.FetchOptions<K, V, FC> = {}\n ): Promise<V> {\n const v = await this.fetch(\n k,\n fetchOptions as unknown extends FC\n ? LRUCache.FetchOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.FetchOptionsNoContext<K, V>\n : LRUCache.FetchOptionsWithContext<K, V, FC>\n )\n if (v === undefined) throw new Error('fetch() returned undefined')\n return v\n }\n\n /**\n * If the key is found in the cache, then this is equivalent to\n * {@link LRUCache#get}. If not, in the cache, then calculate the value using\n * the {@link LRUCache.OptionsBase.memoMethod}, and add it to the cache.\n *\n * If an `FC` type is set to a type other than `unknown`, `void`, or\n * `undefined` in the LRUCache constructor, then all calls to `cache.memo()`\n * _must_ provide a `context` option. If set to `undefined` or `void`, then\n * calls to memo _must not_ provide a `context` option.\n *\n * The `context` param allows you to provide arbitrary data that might be\n * relevant in the course of fetching the data. It is only relevant for the\n * course of a single `memo()` operation, and discarded afterwards.\n */\n memo(\n k: K,\n memoOptions: unknown extends FC\n ? LRUCache.MemoOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext<K, V>\n : LRUCache.MemoOptionsWithContext<K, V, FC>\n ): V\n // this overload not allowed if context is required\n memo(\n k: unknown extends FC\n ? K\n : FC extends undefined | void\n ? K\n : never,\n memoOptions?: unknown extends FC\n ? LRUCache.MemoOptions<K, V, FC>\n : FC extends undefined | void\n ? LRUCache.MemoOptionsNoContext<K, V>\n : never\n ): V\n memo(k: K, memoOptions: LRUCache.MemoOptions<K, V, FC> = {}) {\n const memoMethod = this.#memoMethod\n if (!memoMethod) {\n throw new Error('no memoMethod provided to constructor')\n }\n const { context, forceRefresh, ...options } = memoOptions\n const v = this.get(k, options)\n if (!forceRefresh && v !== undefined) return v\n const vv = memoMethod(k, v, {\n options,\n context,\n } as LRUCache.MemoizerOptions<K, V, FC>)\n this.set(k, vv, options)\n return vv\n }\n\n /**\n * Return a value from the cache. Will update the recency of the cache\n * entry found.\n *\n * If the key is not found, get() will return `undefined`.\n */\n get(k: K, getOptions: LRUCache.GetOptions<K, V, FC> = {}) {\n const {\n allowStale = this.allowStale,\n updateAgeOnGet = this.updateAgeOnGet,\n noDeleteOnStaleGet = this.noDeleteOnStaleGet,\n status,\n } = getOptions\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n const value = this.#valList[index]\n const fetching = this.#isBackgroundFetch(value)\n if (status) this.#statusTTL(status, index)\n if (this.#isStale(index)) {\n if (status) status.get = 'stale'\n // delete only if not an in-flight background fetch\n if (!fetching) {\n if (!noDeleteOnStaleGet) {\n this.#delete(k, 'expire')\n }\n if (status && allowStale) status.returnedStale = true\n return allowStale ? value : undefined\n } else {\n if (\n status &&\n allowStale &&\n value.__staleWhileFetching !== undefined\n ) {\n status.returnedStale = true\n }\n return allowStale ? value.__staleWhileFetching : undefined\n }\n } else {\n if (status) status.get = 'hit'\n // if we're currently fetching it, we don't actually have it yet\n // it's not stale, which means this isn't a staleWhileRefetching.\n // If it's not stale, and fetching, AND has a __staleWhileFetching\n // value, then that means the user fetched with {forceRefresh:true},\n // so it's safe to return that value.\n if (fetching) {\n return value.__staleWhileFetching\n }\n this.#moveToTail(index)\n if (updateAgeOnGet) {\n this.#updateItemAge(index)\n }\n return value\n }\n } else if (status) {\n status.get = 'miss'\n }\n }\n\n #connect(p: Index, n: Index) {\n this.#prev[n] = p\n this.#next[p] = n\n }\n\n #moveToTail(index: Index): void {\n // if tail already, nothing to do\n // if head, move head to next[index]\n // else\n // move next[prev[index]] to next[index] (head has no prev)\n // move prev[next[index]] to prev[index]\n // prev[index] = tail\n // next[tail] = index\n // tail = index\n if (index !== this.#tail) {\n if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n this.#connect(\n this.#prev[index] as Index,\n this.#next[index] as Index\n )\n }\n this.#connect(this.#tail, index)\n this.#tail = index\n }\n }\n\n /**\n * Deletes a key out of the cache.\n *\n * Returns true if the key was deleted, false otherwise.\n */\n delete(k: K) {\n return this.#delete(k, 'delete')\n }\n\n #delete(k: K, reason: LRUCache.DisposeReason) {\n let deleted = false\n if (this.#size !== 0) {\n const index = this.#keyMap.get(k)\n if (index !== undefined) {\n deleted = true\n if (this.#size === 1) {\n this.#clear(reason)\n } else {\n this.#removeItemSize(index)\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else if (this.#hasDispose || this.#hasDisposeAfter) {\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k, reason])\n }\n }\n this.#keyMap.delete(k)\n this.#keyList[index] = undefined\n this.#valList[index] = undefined\n if (index === this.#tail) {\n this.#tail = this.#prev[index] as Index\n } else if (index === this.#head) {\n this.#head = this.#next[index] as Index\n } else {\n const pi = this.#prev[index] as number\n this.#next[pi] = this.#next[index] as number\n const ni = this.#next[index] as number\n this.#prev[ni] = this.#prev[index] as number\n }\n this.#size--\n this.#free.push(index)\n }\n }\n }\n if (this.#hasDisposeAfter && this.#disposed?.length) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n return deleted\n }\n\n /**\n * Clear the cache entirely, throwing away all values.\n */\n clear() {\n return this.#clear('delete')\n }\n #clear(reason: LRUCache.DisposeReason) {\n for (const index of this.#rindexes({ allowStale: true })) {\n const v = this.#valList[index]\n if (this.#isBackgroundFetch(v)) {\n v.__abortController.abort(new Error('deleted'))\n } else {\n const k = this.#keyList[index]\n if (this.#hasDispose) {\n this.#dispose?.(v as V, k as K, reason)\n }\n if (this.#hasDisposeAfter) {\n this.#disposed?.push([v as V, k as K, reason])\n }\n }\n }\n\n this.#keyMap.clear()\n this.#valList.fill(undefined)\n this.#keyList.fill(undefined)\n if (this.#ttls && this.#starts) {\n this.#ttls.fill(0)\n this.#starts.fill(0)\n }\n if (this.#sizes) {\n this.#sizes.fill(0)\n }\n this.#head = 0 as Index\n this.#tail = 0 as Index\n this.#free.length = 0\n this.#calculatedSize = 0\n this.#size = 0\n if (this.#hasDisposeAfter && this.#disposed) {\n const dt = this.#disposed\n let task: DisposeTask<K, V> | undefined\n while ((task = dt?.shift())) {\n this.#disposeAfter?.(...task)\n }\n }\n }\n}\n","import { getEACAggregatorProxyContract } from '../eth/builtin/eacaggregatorproxy.js'\nimport fs from 'fs'\nimport { parse } from 'csv-parse/sync'\nimport { BlockTag } from 'ethers/providers'\nimport { scaleDown } from '../core/big-decimal.js'\nimport { EthChainId } from '@sentio/chain'\nimport { createRequire } from 'module'\nimport path from 'path'\n\ntype OralceRecord = {\n Pair: string\n Asset: string\n Type: string\n Address: string\n}\n\nexport enum PriceUnit {\n USD = 0,\n ETH = 1,\n BTC = 2\n}\n\nexport interface DexPriceResult {\n price?: number\n error?: string\n}\n\nexport function getPackageRoot(pkgId: string): string {\n const require = createRequire(import.meta.url)\n const m = require.resolve(pkgId)\n\n let dir = path.dirname(m)\n while (!fs.existsSync(path.join(dir, 'package.json'))) {\n dir = path.dirname(dir)\n }\n return dir\n}\n\n// Load price feed from https://docs.chain.link/docs/data-feeds/price-feeds/addresses/?network=ethereum\n// and then use EACAggregatorProxy contract to get price\nclass DexPrice {\n USD_ORACLE_MAP = new Map<string, string>()\n ETH_ORACLE_MAP = new Map<string, string>()\n BTC_ORACLE_MAP = new Map<string, string>()\n ASSETS_INFOS = new Map<string, number>()\n\n readonly chainId: EthChainId\n\n constructor(csvFileName: string, chainId: EthChainId) {\n this.chainId = chainId\n const packageRoot = getPackageRoot('@sentio/sdk')\n const csvFilePath = path.join(packageRoot, 'assets', csvFileName)\n const fileContent = fs.readFileSync(csvFilePath, { encoding: 'utf-8' })\n const headers = ['Pair', 'Asset', 'Type', 'Address']\n\n const records: OralceRecord[] = parse(fileContent, {\n delimiter: ',',\n columns: headers,\n skip_empty_lines: true\n })\n\n for (const record of records) {\n const pair = record.Pair.split('/')\n const asset = pair[0].trim().toLowerCase()\n const target = pair[1].trim().toLowerCase()\n const address = record.Address.toLowerCase()\n if (target === 'usd') {\n this.USD_ORACLE_MAP.set(asset, address)\n } else if (target === 'eth') {\n this.ETH_ORACLE_MAP.set(asset, address)\n } else if (target == 'btc') {\n this.BTC_ORACLE_MAP.set(asset, address)\n } else {\n console.error('wrong asset record:' + JSON.stringify(record))\n }\n\n // console.log(asset, target, address)\n }\n }\n\n // asset: symbol of the asset\n // unit: usd, eth or btc\n // blockTag: blockNumber of block symbol like \"latest\"\n // returns the asset price,\n // throw exception if calling to price feed failed, e.g. due to a invalid block number\n async getPrice(\n asset: string,\n blockTag: BlockTag = 'latest',\n unit: PriceUnit = PriceUnit.USD\n ): Promise<DexPriceResult> {\n // if (chainId !== 1 && chainId !== 5) {\n // return {\n // error: \"current dex price only support chain 1 (mainnet) or 5 (goerli)\"\n // }\n // }\n\n let oracleMap = this.USD_ORACLE_MAP\n switch (unit) {\n case PriceUnit.ETH:\n oracleMap = this.ETH_ORACLE_MAP\n break\n case PriceUnit.BTC:\n oracleMap = this.BTC_ORACLE_MAP\n break\n default:\n }\n\n asset = asset.trim().toLowerCase()\n\n const addr = oracleMap.get(asset)\n if (!addr) {\n return {\n error: 'No price feed found for asset'\n }\n }\n\n const contract = getEACAggregatorProxyContract(this.chainId, addr)\n try {\n const price = await contract.latestAnswer({\n blockTag: blockTag\n })\n\n let decimal = this.ASSETS_INFOS.get(asset)\n if (!decimal) {\n decimal = Number(await contract.decimals())\n this.ASSETS_INFOS.set(asset, decimal)\n }\n\n return {\n price: scaleDown(price, decimal).toNumber()\n }\n } catch (e) {\n return {\n error:\n 'Price query error for ' +\n asset +\n ' failed at ' +\n addr +\n ' at chain ' +\n this.chainId +\n '. Details: ' +\n e.toString()\n }\n }\n }\n}\n\nexport const EthereumDexPrice = new DexPrice('chainlink-oracles.csv', EthChainId.ETHEREUM)\nexport const SepoliaDexPrice = new DexPrice('chainlink-oracles-sepolia.csv', EthChainId.SEPOLIA)\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","\nclass CsvError extends Error {\n constructor(code, message, options, ...contexts) {\n if(Array.isArray(message)) message = message.join(' ').trim();\n super(message);\n if(Error.captureStackTrace !== undefined){\n Error.captureStackTrace(this, CsvError);\n }\n this.code = code;\n for(const context of contexts){\n for(const key in context){\n const value = context[key];\n this[key] = Buffer.isBuffer(value) ? value.toString(options.encoding) : value == null ? value : JSON.parse(JSON.stringify(value));\n }\n }\n }\n}\n\nexport {CsvError};\n","\nconst is_object = function(obj){\n return (typeof obj === 'object' && obj !== null && !Array.isArray(obj));\n};\n\nexport {is_object};\n","\nimport {CsvError} from './CsvError.js';\nimport {is_object} from '../utils/is_object.js';\n\nconst normalize_columns_array = function(columns){\n const normalizedColumns = [];\n for(let i = 0, l = columns.length; i < l; i++){\n const column = columns[i];\n if(column === undefined || column === null || column === false){\n normalizedColumns[i] = { disabled: true };\n }else if(typeof column === 'string'){\n normalizedColumns[i] = { name: column };\n }else if(is_object(column)){\n if(typeof column.name !== 'string'){\n throw new CsvError('CSV_OPTION_COLUMNS_MISSING_NAME', [\n 'Option columns missing name:',\n `property \"name\" is required at position ${i}`,\n 'when column is an object literal'\n ]);\n }\n normalizedColumns[i] = column;\n }else{\n throw new CsvError('CSV_INVALID_COLUMN_DEFINITION', [\n 'Invalid column definition:',\n 'expect a string or a literal object,',\n `got ${JSON.stringify(column)} at position ${i}`\n ]);\n }\n }\n return normalizedColumns;\n};\n\nexport {normalize_columns_array};\n","\nclass ResizeableBuffer{\n constructor(size=100){\n this.size = size;\n this.length = 0;\n this.buf = Buffer.allocUnsafe(size);\n }\n prepend(val){\n if(Buffer.isBuffer(val)){\n const length = this.length + val.length;\n if(length >= this.size){\n this.resize();\n if(length >= this.size){\n throw Error('INVALID_BUFFER_STATE');\n }\n }\n const buf = this.buf;\n this.buf = Buffer.allocUnsafe(this.size);\n val.copy(this.buf, 0);\n buf.copy(this.buf, val.length);\n this.length += val.length;\n }else{\n const length = this.length++;\n if(length === this.size){\n this.resize();\n }\n const buf = this.clone();\n this.buf[0] = val;\n buf.copy(this.buf,1, 0, length);\n }\n }\n append(val){\n const length = this.length++;\n if(length === this.size){\n this.resize();\n }\n this.buf[length] = val;\n }\n clone(){\n return Buffer.from(this.buf.slice(0, this.length));\n }\n resize(){\n const length = this.length;\n this.size = this.size * 2;\n const buf = Buffer.allocUnsafe(this.size);\n this.buf.copy(buf,0, 0, length);\n this.buf = buf;\n }\n toString(encoding){\n if(encoding){\n return this.buf.slice(0, this.length).toString(encoding);\n }else{\n return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length));\n }\n }\n toJSON(){\n return this.toString('utf8');\n }\n reset(){\n this.length = 0;\n }\n}\n\nexport default ResizeableBuffer;\n","\nimport ResizeableBuffer from '../utils/ResizeableBuffer.js';\n\n// white space characters\n// https://en.wikipedia.org/wiki/Whitespace_character\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes#Types\n// \\f\\n\\r\\t\\v\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\nconst np = 12;\nconst cr = 13; // `\\r`, carriage return, 0x0D in hexadécimal, 13 in decimal\nconst nl = 10; // `\\n`, newline, 0x0A in hexadecimal, 10 in decimal\nconst space = 32;\nconst tab = 9;\n\nconst init_state = function(options){\n return {\n bomSkipped: false,\n bufBytesStart: 0,\n castField: options.cast_function,\n commenting: false,\n // Current error encountered by a record\n error: undefined,\n enabled: options.from_line === 1,\n escaping: false,\n escapeIsQuote: Buffer.isBuffer(options.escape) && Buffer.isBuffer(options.quote) && Buffer.compare(options.escape, options.quote) === 0,\n // columns can be `false`, `true`, `Array`\n expectedRecordLength: Array.isArray(options.columns) ? options.columns.length : undefined,\n field: new ResizeableBuffer(20),\n firstLineToHeaders: options.cast_first_line_to_header,\n needMoreDataSize: Math.max(\n // Skip if the remaining buffer smaller than comment\n options.comment !== null ? options.comment.length : 0,\n // Skip if the remaining buffer can be delimiter\n ...options.delimiter.map((delimiter) => delimiter.length),\n // Skip if the remaining buffer can be escape sequence\n options.quote !== null ? options.quote.length : 0,\n ),\n previousBuf: undefined,\n quoting: false,\n stop: false,\n rawBuffer: new ResizeableBuffer(100),\n record: [],\n recordHasError: false,\n record_length: 0,\n recordDelimiterMaxLength: options.record_delimiter.length === 0 ? 0 : Math.max(...options.record_delimiter.map((v) => v.length)),\n trimChars: [Buffer.from(' ', options.encoding)[0], Buffer.from('\\t', options.encoding)[0]],\n wasQuoting: false,\n wasRowDelimiter: false,\n timchars: [\n Buffer.from(Buffer.from([cr], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([nl], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([np], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([space], 'utf8').toString(), options.encoding),\n Buffer.from(Buffer.from([tab], 'utf8').toString(), options.encoding),\n ]\n };\n};\n\nexport {init_state};\n","\nconst underscore = function(str){\n return str.replace(/([A-Z])/g, function(_, match){\n return '_' + match.toLowerCase();\n });\n};\n\nexport {underscore};\n","\nimport {normalize_columns_array} from './normalize_columns_array.js';\nimport {CsvError} from './CsvError.js';\nimport {underscore} from '../utils/underscore.js';\n\nconst normalize_options = function(opts){\n const options = {};\n // Merge with user options\n for(const opt in opts){\n options[underscore(opt)] = opts[opt];\n }\n // Normalize option `encoding`\n // Note: defined first because other options depends on it\n // to convert chars/strings into buffers.\n if(options.encoding === undefined || options.encoding === true){\n options.encoding = 'utf8';\n }else if(options.encoding === null || options.encoding === false){\n options.encoding = null;\n }else if(typeof options.encoding !== 'string' && options.encoding !== null){\n throw new CsvError('CSV_INVALID_OPTION_ENCODING', [\n 'Invalid option encoding:',\n 'encoding must be a string or null to return a buffer,',\n `got ${JSON.stringify(options.encoding)}`\n ], options);\n }\n // Normalize option `bom`\n if(options.bom === undefined || options.bom === null || options.bom === false){\n options.bom = false;\n }else if(options.bom !== true){\n throw new CsvError('CSV_INVALID_OPTION_BOM', [\n 'Invalid option bom:', 'bom must be true,',\n `got ${JSON.stringify(options.bom)}`\n ], options);\n }\n // Normalize option `cast`\n options.cast_function = null;\n if(options.cast === undefined || options.cast === null || options.cast === false || options.cast === ''){\n options.cast = undefined;\n }else if(typeof options.cast === 'function'){\n options.cast_function = options.cast;\n options.cast = true;\n }else if(options.cast !== true){\n throw new CsvError('CSV_INVALID_OPTION_CAST', [\n 'Invalid option cast:', 'cast must be true or a function,',\n `got ${JSON.stringify(options.cast)}`\n ], options);\n }\n // Normalize option `cast_date`\n if(options.cast_date === undefined || options.cast_date === null || options.cast_date === false || options.cast_date === ''){\n options.cast_date = false;\n }else if(options.cast_date === true){\n options.cast_date = function(value){\n const date = Date.parse(value);\n return !isNaN(date) ? new Date(date) : value;\n };\n }else if (typeof options.cast_date !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_CAST_DATE', [\n 'Invalid option cast_date:', 'cast_date must be true or a function,',\n `got ${JSON.stringify(options.cast_date)}`\n ], options);\n }\n // Normalize option `columns`\n options.cast_first_line_to_header = null;\n if(options.columns === true){\n // Fields in the first line are converted as-is to columns\n options.cast_first_line_to_header = undefined;\n }else if(typeof options.columns === 'function'){\n options.cast_first_line_to_header = options.columns;\n options.columns = true;\n }else if(Array.isArray(options.columns)){\n options.columns = normalize_columns_array(options.columns);\n }else if(options.columns === undefined || options.columns === null || options.columns === false){\n options.columns = false;\n }else{\n throw new CsvError('CSV_INVALID_OPTION_COLUMNS', [\n 'Invalid option columns:',\n 'expect an array, a function or true,',\n `got ${JSON.stringify(options.columns)}`\n ], options);\n }\n // Normalize option `group_columns_by_name`\n if(options.group_columns_by_name === undefined || options.group_columns_by_name === null || options.group_columns_by_name === false){\n options.group_columns_by_name = false;\n }else if(options.group_columns_by_name !== true){\n throw new CsvError('CSV_INVALID_OPTION_GROUP_COLUMNS_BY_NAME', [\n 'Invalid option group_columns_by_name:',\n 'expect an boolean,',\n `got ${JSON.stringify(options.group_columns_by_name)}`\n ], options);\n }else if(options.columns === false){\n throw new CsvError('CSV_INVALID_OPTION_GROUP_COLUMNS_BY_NAME', [\n 'Invalid option group_columns_by_name:',\n 'the `columns` mode must be activated.'\n ], options);\n }\n // Normalize option `comment`\n if(options.comment === undefined || options.comment === null || options.comment === false || options.comment === ''){\n options.comment = null;\n }else{\n if(typeof options.comment === 'string'){\n options.comment = Buffer.from(options.comment, options.encoding);\n }\n if(!Buffer.isBuffer(options.comment)){\n throw new CsvError('CSV_INVALID_OPTION_COMMENT', [\n 'Invalid option comment:',\n 'comment must be a buffer or a string,',\n `got ${JSON.stringify(options.comment)}`\n ], options);\n }\n }\n // Normalize option `comment_no_infix`\n if(options.comment_no_infix === undefined || options.comment_no_infix === null || options.comment_no_infix === false){\n options.comment_no_infix = false;\n }else if(options.comment_no_infix !== true){\n throw new CsvError('CSV_INVALID_OPTION_COMMENT', [\n 'Invalid option comment_no_infix:',\n 'value must be a boolean,',\n `got ${JSON.stringify(options.comment_no_infix)}`\n ], options);\n }\n // Normalize option `delimiter`\n const delimiter_json = JSON.stringify(options.delimiter);\n if(!Array.isArray(options.delimiter)) options.delimiter = [options.delimiter];\n if(options.delimiter.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [\n 'Invalid option delimiter:',\n 'delimiter must be a non empty string or buffer or array of string|buffer,',\n `got ${delimiter_json}`\n ], options);\n }\n options.delimiter = options.delimiter.map(function(delimiter){\n if(delimiter === undefined || delimiter === null || delimiter === false){\n return Buffer.from(',', options.encoding);\n }\n if(typeof delimiter === 'string'){\n delimiter = Buffer.from(delimiter, options.encoding);\n }\n if(!Buffer.isBuffer(delimiter) || delimiter.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_DELIMITER', [\n 'Invalid option delimiter:',\n 'delimiter must be a non empty string or buffer or array of string|buffer,',\n `got ${delimiter_json}`\n ], options);\n }\n return delimiter;\n });\n // Normalize option `escape`\n if(options.escape === undefined || options.escape === true){\n options.escape = Buffer.from('\"', options.encoding);\n }else if(typeof options.escape === 'string'){\n options.escape = Buffer.from(options.escape, options.encoding);\n }else if (options.escape === null || options.escape === false){\n options.escape = null;\n }\n if(options.escape !== null){\n if(!Buffer.isBuffer(options.escape)){\n throw new Error(`Invalid Option: escape must be a buffer, a string or a boolean, got ${JSON.stringify(options.escape)}`);\n }\n }\n // Normalize option `from`\n if(options.from === undefined || options.from === null){\n options.from = 1;\n }else{\n if(typeof options.from === 'string' && /\\d+/.test(options.from)){\n options.from = parseInt(options.from);\n }\n if(Number.isInteger(options.from)){\n if(options.from < 0){\n throw new Error(`Invalid Option: from must be a positive integer, got ${JSON.stringify(opts.from)}`);\n }\n }else{\n throw new Error(`Invalid Option: from must be an integer, got ${JSON.stringify(options.from)}`);\n }\n }\n // Normalize option `from_line`\n if(options.from_line === undefined || options.from_line === null){\n options.from_line = 1;\n }else{\n if(typeof options.from_line === 'string' && /\\d+/.test(options.from_line)){\n options.from_line = parseInt(options.from_line);\n }\n if(Number.isInteger(options.from_line)){\n if(options.from_line <= 0){\n throw new Error(`Invalid Option: from_line must be a positive integer greater than 0, got ${JSON.stringify(opts.from_line)}`);\n }\n }else{\n throw new Error(`Invalid Option: from_line must be an integer, got ${JSON.stringify(opts.from_line)}`);\n }\n }\n // Normalize options `ignore_last_delimiters`\n if(options.ignore_last_delimiters === undefined || options.ignore_last_delimiters === null){\n options.ignore_last_delimiters = false;\n }else if(typeof options.ignore_last_delimiters === 'number'){\n options.ignore_last_delimiters = Math.floor(options.ignore_last_delimiters);\n if(options.ignore_last_delimiters === 0){\n options.ignore_last_delimiters = false;\n }\n }else if(typeof options.ignore_last_delimiters !== 'boolean'){\n throw new CsvError('CSV_INVALID_OPTION_IGNORE_LAST_DELIMITERS', [\n 'Invalid option `ignore_last_delimiters`:',\n 'the value must be a boolean value or an integer,',\n `got ${JSON.stringify(options.ignore_last_delimiters)}`\n ], options);\n }\n if(options.ignore_last_delimiters === true && options.columns === false){\n throw new CsvError('CSV_IGNORE_LAST_DELIMITERS_REQUIRES_COLUMNS', [\n 'The option `ignore_last_delimiters`',\n 'requires the activation of the `columns` option'\n ], options);\n }\n // Normalize option `info`\n if(options.info === undefined || options.info === null || options.info === false){\n options.info = false;\n }else if(options.info !== true){\n throw new Error(`Invalid Option: info must be true, got ${JSON.stringify(options.info)}`);\n }\n // Normalize option `max_record_size`\n if(options.max_record_size === undefined || options.max_record_size === null || options.max_record_size === false){\n options.max_record_size = 0;\n }else if(Number.isInteger(options.max_record_size) && options.max_record_size >= 0){\n // Great, nothing to do\n }else if(typeof options.max_record_size === 'string' && /\\d+/.test(options.max_record_size)){\n options.max_record_size = parseInt(options.max_record_size);\n }else{\n throw new Error(`Invalid Option: max_record_size must be a positive integer, got ${JSON.stringify(options.max_record_size)}`);\n }\n // Normalize option `objname`\n if(options.objname === undefined || options.objname === null || options.objname === false){\n options.objname = undefined;\n }else if(Buffer.isBuffer(options.objname)){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty buffer`);\n }\n if(options.encoding === null){\n // Don't call `toString`, leave objname as a buffer\n }else{\n options.objname = options.objname.toString(options.encoding);\n }\n }else if(typeof options.objname === 'string'){\n if(options.objname.length === 0){\n throw new Error(`Invalid Option: objname must be a non empty string`);\n }\n // Great, nothing to do\n }else if(typeof options.objname === 'number'){\n // if(options.objname.length === 0){\n // throw new Error(`Invalid Option: objname must be a non empty string`);\n // }\n // Great, nothing to do\n }else{\n throw new Error(`Invalid Option: objname must be a string or a buffer, got ${options.objname}`);\n }\n if(options.objname !== undefined){\n if(typeof options.objname === 'number'){\n if(options.columns !== false){\n throw Error('Invalid Option: objname index cannot be combined with columns or be defined as a field');\n }\n }else{ // A string or a buffer\n if(options.columns === false){\n throw Error('Invalid Option: objname field must be combined with columns or be defined as an index');\n }\n }\n }\n // Normalize option `on_record`\n if(options.on_record === undefined || options.on_record === null){\n options.on_record = undefined;\n }else if(typeof options.on_record !== 'function'){\n throw new CsvError('CSV_INVALID_OPTION_ON_RECORD', [\n 'Invalid option `on_record`:',\n 'expect a function,',\n `got ${JSON.stringify(options.on_record)}`\n ], options);\n }\n // Normalize option `on_skip`\n // options.on_skip ??= (err, chunk) => {\n // this.emit('skip', err, chunk);\n // };\n if(options.on_skip !== undefined && options.on_skip !== null && typeof options.on_skip !== 'function'){\n throw new Error(`Invalid Option: on_skip must be a function, got ${JSON.stringify(options.on_skip)}`);\n }\n // Normalize option `quote`\n if(options.quote === null || options.quote === false || options.quote === ''){\n options.quote = null;\n }else{\n if(options.quote === undefined || options.quote === true){\n options.quote = Buffer.from('\"', options.encoding);\n }else if(typeof options.quote === 'string'){\n options.quote = Buffer.from(options.quote, options.encoding);\n }\n if(!Buffer.isBuffer(options.quote)){\n throw new Error(`Invalid Option: quote must be a buffer or a string, got ${JSON.stringify(options.quote)}`);\n }\n }\n // Normalize option `raw`\n if(options.raw === undefined || options.raw === null || options.raw === false){\n options.raw = false;\n }else if(options.raw !== true){\n throw new Error(`Invalid Option: raw must be true, got ${JSON.stringify(options.raw)}`);\n }\n // Normalize option `record_delimiter`\n if(options.record_delimiter === undefined){\n options.record_delimiter = [];\n }else if(typeof options.record_delimiter === 'string' || Buffer.isBuffer(options.record_delimiter)){\n if(options.record_delimiter.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a non empty string or buffer,',\n `got ${JSON.stringify(options.record_delimiter)}`\n ], options);\n }\n options.record_delimiter = [options.record_delimiter];\n }else if(!Array.isArray(options.record_delimiter)){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a string, a buffer or array of string|buffer,',\n `got ${JSON.stringify(options.record_delimiter)}`\n ], options);\n }\n options.record_delimiter = options.record_delimiter.map(function(rd, i){\n if(typeof rd !== 'string' && ! Buffer.isBuffer(rd)){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a string, a buffer or array of string|buffer',\n `at index ${i},`,\n `got ${JSON.stringify(rd)}`\n ], options);\n }else if(rd.length === 0){\n throw new CsvError('CSV_INVALID_OPTION_RECORD_DELIMITER', [\n 'Invalid option `record_delimiter`:',\n 'value must be a non empty string or buffer',\n `at index ${i},`,\n `got ${JSON.stringify(rd)}`\n ], options);\n }\n if(typeof rd === 'string'){\n rd = Buffer.from(rd, options.encoding);\n }\n return rd;\n });\n // Normalize option `relax_column_count`\n if(typeof options.relax_column_count === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count === undefined || options.relax_column_count === null){\n options.relax_column_count = false;\n }else{\n throw new Error(`Invalid Option: relax_column_count must be a boolean, got ${JSON.stringify(options.relax_column_count)}`);\n }\n if(typeof options.relax_column_count_less === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_less === undefined || options.relax_column_count_less === null){\n options.relax_column_count_less = false;\n }else{\n throw new Error(`Invalid Option: relax_column_count_less must be a boolean, got ${JSON.stringify(options.relax_column_count_less)}`);\n }\n if(typeof options.relax_column_count_more === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_column_count_more === undefined || options.relax_column_count_more === null){\n options.relax_column_count_more = false;\n }else{\n throw new Error(`Invalid Option: relax_column_count_more must be a boolean, got ${JSON.stringify(options.relax_column_count_more)}`);\n }\n // Normalize option `relax_quotes`\n if(typeof options.relax_quotes === 'boolean'){\n // Great, nothing to do\n }else if(options.relax_quotes === undefined || options.relax_quotes === null){\n options.relax_quotes = false;\n }else{\n throw new Error(`Invalid Option: relax_quotes must be a boolean, got ${JSON.stringify(options.relax_quotes)}`);\n }\n // Normalize option `skip_empty_lines`\n if(typeof options.skip_empty_lines === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_empty_lines === undefined || options.skip_empty_lines === null){\n options.skip_empty_lines = false;\n }else{\n throw new Error(`Invalid Option: skip_empty_lines must be a boolean, got ${JSON.stringify(options.skip_empty_lines)}`);\n }\n // Normalize option `skip_records_with_empty_values`\n if(typeof options.skip_records_with_empty_values === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_records_with_empty_values === undefined || options.skip_records_with_empty_values === null){\n options.skip_records_with_empty_values = false;\n }else{\n throw new Error(`Invalid Option: skip_records_with_empty_values must be a boolean, got ${JSON.stringify(options.skip_records_with_empty_values)}`);\n }\n // Normalize option `skip_records_with_error`\n if(typeof options.skip_records_with_error === 'boolean'){\n // Great, nothing to do\n }else if(options.skip_records_with_error === undefined || options.skip_records_with_error === null){\n options.skip_records_with_error = false;\n }else{\n throw new Error(`Invalid Option: skip_records_with_error must be a boolean, got ${JSON.stringify(options.skip_records_with_error)}`);\n }\n // Normalize option `rtrim`\n if(options.rtrim === undefined || options.rtrim === null || options.rtrim === false){\n options.rtrim = false;\n }else if(options.rtrim !== true){\n throw new Error(`Invalid Option: rtrim must be a boolean, got ${JSON.stringify(options.rtrim)}`);\n }\n // Normalize option `ltrim`\n if(options.ltrim === undefined || options.ltrim === null || options.ltrim === false){\n options.ltrim = false;\n }else if(options.ltrim !== true){\n throw new Error(`Invalid Option: ltrim must be a boolean, got ${JSON.stringify(options.ltrim)}`);\n }\n // Normalize option `trim`\n if(options.trim === undefined || options.trim === null || options.trim === false){\n options.trim = false;\n }else if(options.trim !== true){\n throw new Error(`Invalid Option: trim must be a boolean, got ${JSON.stringify(options.trim)}`);\n }\n // Normalize options `trim`, `ltrim` and `rtrim`\n if(options.trim === true && opts.ltrim !== false){\n options.ltrim = true;\n }else if(options.ltrim !== true){\n options.ltrim = false;\n }\n if(options.trim === true && opts.rtrim !== false){\n options.rtrim = true;\n }else if(options.rtrim !== true){\n options.rtrim = false;\n }\n // Normalize option `to`\n if(options.to === undefined || options.to === null){\n options.to = -1;\n }else{\n if(typeof options.to === 'string' && /\\d+/.test(options.to)){\n options.to = parseInt(options.to);\n }\n if(Number.isInteger(options.to)){\n if(options.to <= 0){\n throw new Error(`Invalid Option: to must be a positive integer greater than 0, got ${JSON.stringify(opts.to)}`);\n }\n }else{\n throw new Error(`Invalid Option: to must be an integer, got ${JSON.stringify(opts.to)}`);\n }\n }\n // Normalize option `to_line`\n if(options.to_line === undefined || options.to_line === null){\n options.to_line = -1;\n }else{\n if(typeof options.to_line === 'string' && /\\d+/.test(options.to_line)){\n options.to_line = parseInt(options.to_line);\n }\n if(Number.isInteger(options.to_line)){\n if(options.to_line <= 0){\n throw new Error(`Invalid Option: to_line must be a positive integer greater than 0, got ${JSON.stringify(opts.to_line)}`);\n }\n }else{\n throw new Error(`Invalid Option: to_line must be an integer, got ${JSON.stringify(opts.to_line)}`);\n }\n }\n return options;\n};\n\nexport {normalize_options};\n","\nimport {normalize_columns_array} from './normalize_columns_array.js';\nimport {init_state} from './init_state.js';\nimport {normalize_options} from './normalize_options.js';\nimport {CsvError} from './CsvError.js';\n\nconst isRecordEmpty = function(record){\n return record.every((field) => field == null || field.toString && field.toString().trim() === '');\n};\n\nconst cr = 13; // `\\r`, carriage return, 0x0D in hexadécimal, 13 in decimal\nconst nl = 10; // `\\n`, newline, 0x0A in hexadecimal, 10 in decimal\n\nconst boms = {\n // Note, the following are equals:\n // Buffer.from(\"\\ufeff\")\n // Buffer.from([239, 187, 191])\n // Buffer.from('EFBBBF', 'hex')\n 'utf8': Buffer.from([239, 187, 191]),\n // Note, the following are equals:\n // Buffer.from \"\\ufeff\", 'utf16le\n // Buffer.from([255, 254])\n 'utf16le': Buffer.from([255, 254])\n};\n\nconst transform = function(original_options = {}) {\n const info = {\n bytes: 0,\n comment_lines: 0,\n empty_lines: 0,\n invalid_field_length: 0,\n lines: 1,\n records: 0\n };\n const options = normalize_options(original_options);\n return {\n info: info,\n original_options: original_options,\n options: options,\n state: init_state(options),\n __needMoreData: function(i, bufLen, end){\n if(end) return false;\n const {encoding, escape, quote} = this.options;\n const {quoting, needMoreDataSize, recordDelimiterMaxLength} = this.state;\n const numOfCharLeft = bufLen - i - 1;\n const requiredLength = Math.max(\n needMoreDataSize,\n // Skip if the remaining buffer smaller than record delimiter\n // If \"record_delimiter\" is yet to be discovered:\n // 1. It is equals to `[]` and \"recordDelimiterMaxLength\" equals `0`\n // 2. We set the length to windows line ending in the current encoding\n // Note, that encoding is known from user or bom discovery at that point\n // recordDelimiterMaxLength,\n recordDelimiterMaxLength === 0 ? Buffer.from('\\r\\n', encoding).length : recordDelimiterMaxLength,\n // Skip if remaining buffer can be an escaped quote\n quoting ? ((escape === null ? 0 : escape.length) + quote.length) : 0,\n // Skip if remaining buffer can be record delimiter following the closing quote\n quoting ? (quote.length + recordDelimiterMaxLength) : 0,\n );\n return numOfCharLeft < requiredLength;\n },\n // Central parser implementation\n parse: function(nextBuf, end, push, close){\n const {bom, comment_no_infix, encoding, from_line, ltrim, max_record_size,raw, relax_quotes, rtrim, skip_empty_lines, to, to_line} = this.options;\n let {comment, escape, quote, record_delimiter} = this.options;\n const {bomSkipped, previousBuf, rawBuffer, escapeIsQuote} = this.state;\n let buf;\n if(previousBuf === undefined){\n if(nextBuf === undefined){\n // Handle empty string\n close();\n return;\n }else{\n buf = nextBuf;\n }\n }else if(previousBuf !== undefined && nextBuf === undefined){\n buf = previousBuf;\n }else{\n buf = Buffer.concat([previousBuf, nextBuf]);\n }\n // Handle UTF BOM\n if(bomSkipped === false){\n if(bom === false){\n this.state.bomSkipped = true;\n }else if(buf.length < 3){\n // No enough data\n if(end === false){\n // Wait for more data\n this.state.previousBuf = buf;\n return;\n }\n }else{\n for(const encoding in boms){\n if(boms[encoding].compare(buf, 0, boms[encoding].length) === 0){\n // Skip BOM\n const bomLength = boms[encoding].length;\n this.state.bufBytesStart += bomLength;\n buf = buf.slice(bomLength);\n // Renormalize original options with the new encoding\n this.options = normalize_options({...this.original_options, encoding: encoding});\n // Options will re-evaluate the Buffer with the new encoding\n ({comment, escape, quote } = this.options);\n break;\n }\n }\n this.state.bomSkipped = true;\n }\n }\n const bufLen = buf.length;\n let pos;\n for(pos = 0; pos < bufLen; pos++){\n // Ensure we get enough space to look ahead\n // There should be a way to move this out of the loop\n if(this.__needMoreData(pos, bufLen, end)){\n break;\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++;\n this.state.wasRowDelimiter = false;\n }\n if(to_line !== -1 && this.info.lines > to_line){\n this.state.stop = true;\n close();\n return;\n }\n // Auto discovery of record_delimiter, unix, mac and windows supported\n if(this.state.quoting === false && record_delimiter.length === 0){\n const record_delimiterCount = this.__autoDiscoverRecordDelimiter(buf, pos);\n if(record_delimiterCount){\n record_delimiter = this.options.record_delimiter;\n }\n }\n const chr = buf[pos];\n if(raw === true){\n rawBuffer.append(chr);\n }\n if((chr === cr || chr === nl) && this.state.wasRowDelimiter === false){\n this.state.wasRowDelimiter = true;\n }\n // Previous char was a valid escape char\n // treat the current char as a regular char\n if(this.state.escaping === true){\n this.state.escaping = false;\n }else{\n // Escape is only active inside quoted fields\n // We are quoting, the char is an escape chr and there is a chr to escape\n // if(escape !== null && this.state.quoting === true && chr === escape && pos + 1 < bufLen){\n if(escape !== null && this.state.quoting === true && this.__isEscape(buf, pos, chr) && pos + escape.length < bufLen){\n if(escapeIsQuote){\n if(this.__isQuote(buf, pos+escape.length)){\n this.state.escaping = true;\n pos += escape.length - 1;\n continue;\n }\n }else{\n this.state.escaping = true;\n pos += escape.length - 1;\n continue;\n }\n }\n // Not currently escaping and chr is a quote\n // TODO: need to compare bytes instead of single char\n if(this.state.commenting === false && this.__isQuote(buf, pos)){\n if(this.state.quoting === true){\n const nextChr = buf[pos+quote.length];\n const isNextChrTrimable = rtrim && this.__isCharTrimable(buf, pos+quote.length);\n const isNextChrComment = comment !== null && this.__compareBytes(comment, buf, pos+quote.length, nextChr);\n const isNextChrDelimiter = this.__isDelimiter(buf, pos+quote.length, nextChr);\n const isNextChrRecordDelimiter = record_delimiter.length === 0 ? this.__autoDiscoverRecordDelimiter(buf, pos+quote.length) : this.__isRecordDelimiter(nextChr, buf, pos+quote.length);\n // Escape a quote\n // Treat next char as a regular character\n if(escape !== null && this.__isEscape(buf, pos, chr) && this.__isQuote(buf, pos + escape.length)){\n pos += escape.length - 1;\n }else if(!nextChr || isNextChrDelimiter || isNextChrRecordDelimiter || isNextChrComment || isNextChrTrimable){\n this.state.quoting = false;\n this.state.wasQuoting = true;\n pos += quote.length - 1;\n continue;\n }else if(relax_quotes === false){\n const err = this.__error(\n new CsvError('CSV_INVALID_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n `got \"${String.fromCharCode(nextChr)}\"`,\n `at line ${this.info.lines}`,\n 'instead of delimiter, record delimiter, trimable character',\n '(if activated) or comment',\n ], this.options, this.__infoField())\n );\n if(err !== undefined) return err;\n }else{\n this.state.quoting = false;\n this.state.wasQuoting = true;\n this.state.field.prepend(quote);\n pos += quote.length - 1;\n }\n }else{\n if(this.state.field.length !== 0){\n // In relax_quotes mode, treat opening quote preceded by chrs as regular\n if(relax_quotes === false){\n const info = this.__infoField();\n const bom = Object.keys(boms).map(b => boms[b].equals(this.state.field.toString()) ? b : false).filter(Boolean)[0];\n const err = this.__error(\n new CsvError('INVALID_OPENING_QUOTE', [\n 'Invalid Opening Quote:',\n `a quote is found on field ${JSON.stringify(info.column)} at line ${info.lines}, value is ${JSON.stringify(this.state.field.toString(encoding))}`,\n bom ? `(${bom} bom)` : undefined\n ], this.options, info, {\n field: this.state.field,\n })\n );\n if(err !== undefined) return err;\n }\n }else{\n this.state.quoting = true;\n pos += quote.length - 1;\n continue;\n }\n }\n }\n if(this.state.quoting === false){\n const recordDelimiterLength = this.__isRecordDelimiter(chr, buf, pos);\n if(recordDelimiterLength !== 0){\n // Do not emit comments which take a full line\n const skipCommentLine = this.state.commenting && (this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0);\n if(skipCommentLine){\n this.info.comment_lines++;\n // Skip full comment line\n }else{\n // Activate records emition if above from_line\n if(this.state.enabled === false && this.info.lines + (this.state.wasRowDelimiter === true ? 1: 0) >= from_line){\n this.state.enabled = true;\n this.__resetField();\n this.__resetRecord();\n pos += recordDelimiterLength - 1;\n continue;\n }\n // Skip if line is empty and skip_empty_lines activated\n if(skip_empty_lines === true && this.state.wasQuoting === false && this.state.record.length === 0 && this.state.field.length === 0){\n this.info.empty_lines++;\n pos += recordDelimiterLength - 1;\n continue;\n }\n this.info.bytes = this.state.bufBytesStart + pos;\n const errField = this.__onField();\n if(errField !== undefined) return errField;\n this.info.bytes = this.state.bufBytesStart + pos + recordDelimiterLength;\n const errRecord = this.__onRecord(push);\n if(errRecord !== undefined) return errRecord;\n if(to !== -1 && this.info.records >= to){\n this.state.stop = true;\n close();\n return;\n }\n }\n this.state.commenting = false;\n pos += recordDelimiterLength - 1;\n continue;\n }\n if(this.state.commenting){\n continue;\n }\n if(comment !== null && (comment_no_infix === false || (this.state.record.length === 0 && this.state.field.length === 0))) {\n const commentCount = this.__compareBytes(comment, buf, pos, chr);\n if(commentCount !== 0){\n this.state.commenting = true;\n continue;\n }\n }\n const delimiterLength = this.__isDelimiter(buf, pos, chr);\n if(delimiterLength !== 0){\n this.info.bytes = this.state.bufBytesStart + pos;\n const errField = this.__onField();\n if(errField !== undefined) return errField;\n pos += delimiterLength - 1;\n continue;\n }\n }\n }\n if(this.state.commenting === false){\n if(max_record_size !== 0 && this.state.record_length + this.state.field.length > max_record_size){\n return this.__error(\n new CsvError('CSV_MAX_RECORD_SIZE', [\n 'Max Record Size:',\n 'record exceed the maximum number of tolerated bytes',\n `of ${max_record_size}`,\n `at line ${this.info.lines}`,\n ], this.options, this.__infoField())\n );\n }\n }\n const lappend = ltrim === false || this.state.quoting === true || this.state.field.length !== 0 || !this.__isCharTrimable(buf, pos);\n // rtrim in non quoting is handle in __onField\n const rappend = rtrim === false || this.state.wasQuoting === false;\n if(lappend === true && rappend === true){\n this.state.field.append(chr);\n }else if(rtrim === true && !this.__isCharTrimable(buf, pos)){\n return this.__error(\n new CsvError('CSV_NON_TRIMABLE_CHAR_AFTER_CLOSING_QUOTE', [\n 'Invalid Closing Quote:',\n 'found non trimable byte after quote',\n `at line ${this.info.lines}`,\n ], this.options, this.__infoField())\n );\n }else{\n if(lappend === false){\n pos += this.__isCharTrimable(buf, pos) - 1;\n }\n continue;\n }\n }\n if(end === true){\n // Ensure we are not ending in a quoting state\n if(this.state.quoting === true){\n const err = this.__error(\n new CsvError('CSV_QUOTE_NOT_CLOSED', [\n 'Quote Not Closed:',\n `the parsing is finished with an opening quote at line ${this.info.lines}`,\n ], this.options, this.__infoField())\n );\n if(err !== undefined) return err;\n }else{\n // Skip last line if it has no characters\n if(this.state.wasQuoting === true || this.state.record.length !== 0 || this.state.field.length !== 0){\n this.info.bytes = this.state.bufBytesStart + pos;\n const errField = this.__onField();\n if(errField !== undefined) return errField;\n const errRecord = this.__onRecord(push);\n if(errRecord !== undefined) return errRecord;\n }else if(this.state.wasRowDelimiter === true){\n this.info.empty_lines++;\n }else if(this.state.commenting === true){\n this.info.comment_lines++;\n }\n }\n }else{\n this.state.bufBytesStart += pos;\n this.state.previousBuf = buf.slice(pos);\n }\n if(this.state.wasRowDelimiter === true){\n this.info.lines++;\n this.state.wasRowDelimiter = false;\n }\n },\n __onRecord: function(push){\n const {columns, group_columns_by_name, encoding, info, from, relax_column_count, relax_column_count_less, relax_column_count_more, raw, skip_records_with_empty_values} = this.options;\n const {enabled, record} = this.state;\n if(enabled === false){\n return this.__resetRecord();\n }\n // Convert the first line into column names\n const recordLength = record.length;\n if(columns === true){\n if(skip_records_with_empty_values === true && isRecordEmpty(record)){\n this.__resetRecord();\n return;\n }\n return this.__firstLineToColumns(record);\n }\n if(columns === false && this.info.records === 0){\n this.state.expectedRecordLength = recordLength;\n }\n if(recordLength !== this.state.expectedRecordLength){\n const err = columns === false ?\n new CsvError('CSV_RECORD_INCONSISTENT_FIELDS_LENGTH', [\n 'Invalid Record Length:',\n `expect ${this.state.expectedRecordLength},`,\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.options, this.__infoField(), {\n record: record,\n })\n :\n new CsvError('CSV_RECORD_INCONSISTENT_COLUMNS', [\n 'Invalid Record Length:',\n `columns length is ${columns.length},`, // rename columns\n `got ${recordLength} on line ${this.info.lines}`,\n ], this.options, this.__infoField(), {\n record: record,\n });\n if(relax_column_count === true ||\n (relax_column_count_less === true && recordLength < this.state.expectedRecordLength) ||\n (relax_column_count_more === true && recordLength > this.state.expectedRecordLength)){\n this.info.invalid_field_length++;\n this.state.error = err;\n // Error is undefined with skip_records_with_error\n }else{\n const finalErr = this.__error(err);\n if(finalErr) return finalErr;\n }\n }\n if(skip_records_with_empty_values === true && isRecordEmpty(record)){\n this.__resetRecord();\n return;\n }\n if(this.state.recordHasError === true){\n this.__resetRecord();\n this.state.recordHasError = false;\n return;\n }\n this.info.records++;\n if(from === 1 || this.info.records >= from){\n const {objname} = this.options;\n // With columns, records are object\n if(columns !== false){\n const obj = {};\n // Transform record array to an object\n for(let i = 0, l = record.length; i < l; i++){\n if(columns[i] === undefined || columns[i].disabled) continue;\n // Turn duplicate columns into an array\n if (group_columns_by_name === true && obj[columns[i].name] !== undefined) {\n if (Array.isArray(obj[columns[i].name])) {\n obj[columns[i].name] = obj[columns[i].name].concat(record[i]);\n } else {\n obj[columns[i].name] = [obj[columns[i].name], record[i]];\n }\n } else {\n obj[columns[i].name] = record[i];\n }\n }\n // Without objname (default)\n if(raw === true || info === true){\n const extRecord = Object.assign(\n {record: obj},\n (raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {}),\n (info === true ? {info: this.__infoRecord()}: {})\n );\n const err = this.__push(\n objname === undefined ? extRecord : [obj[objname], extRecord]\n , push);\n if(err){\n return err;\n }\n }else{\n const err = this.__push(\n objname === undefined ? obj : [obj[objname], obj]\n , push);\n if(err){\n return err;\n }\n }\n // Without columns, records are array\n }else{\n if(raw === true || info === true){\n const extRecord = Object.assign(\n {record: record},\n raw === true ? {raw: this.state.rawBuffer.toString(encoding)}: {},\n info === true ? {info: this.__infoRecord()}: {}\n );\n const err = this.__push(\n objname === undefined ? extRecord : [record[objname], extRecord]\n , push);\n if(err){\n return err;\n }\n }else{\n const err = this.__push(\n objname === undefined ? record : [record[objname], record]\n , push);\n if(err){\n return err;\n }\n }\n }\n }\n this.__resetRecord();\n },\n __firstLineToColumns: function(record){\n const {firstLineToHeaders} = this.state;\n try{\n const headers = firstLineToHeaders === undefined ? record : firstLineToHeaders.call(null, record);\n if(!Array.isArray(headers)){\n return this.__error(\n new CsvError('CSV_INVALID_COLUMN_MAPPING', [\n 'Invalid Column Mapping:',\n 'expect an array from column function,',\n `got ${JSON.stringify(headers)}`\n ], this.options, this.__infoField(), {\n headers: headers,\n })\n );\n }\n const normalizedHeaders = normalize_columns_array(headers);\n this.state.expectedRecordLength = normalizedHeaders.length;\n this.options.columns = normalizedHeaders;\n this.__resetRecord();\n return;\n }catch(err){\n return err;\n }\n },\n __resetRecord: function(){\n if(this.options.raw === true){\n this.state.rawBuffer.reset();\n }\n this.state.error = undefined;\n this.state.record = [];\n this.state.record_length = 0;\n },\n __onField: function(){\n const {cast, encoding, rtrim, max_record_size} = this.options;\n const {enabled, wasQuoting} = this.state;\n // Short circuit for the from_line options\n if(enabled === false){\n return this.__resetField();\n }\n let field = this.state.field.toString(encoding);\n if(rtrim === true && wasQuoting === false){\n field = field.trimRight();\n }\n if(cast === true){\n const [err, f] = this.__cast(field);\n if(err !== undefined) return err;\n field = f;\n }\n this.state.record.push(field);\n // Increment record length if record size must not exceed a limit\n if(max_record_size !== 0 && typeof field === 'string'){\n this.state.record_length += field.length;\n }\n this.__resetField();\n },\n __resetField: function(){\n this.state.field.reset();\n this.state.wasQuoting = false;\n },\n __push: function(record, push){\n const {on_record} = this.options;\n if(on_record !== undefined){\n const info = this.__infoRecord();\n try{\n record = on_record.call(null, record, info);\n }catch(err){\n return err;\n }\n if(record === undefined || record === null){ return; }\n }\n push(record);\n },\n // Return a tuple with the error and the casted value\n __cast: function(field){\n const {columns, relax_column_count} = this.options;\n const isColumns = Array.isArray(columns);\n // Dont loose time calling cast\n // because the final record is an object\n // and this field can't be associated to a key present in columns\n if(isColumns === true && relax_column_count && this.options.columns.length <= this.state.record.length){\n return [undefined, undefined];\n }\n if(this.state.castField !== null){\n try{\n const info = this.__infoField();\n return [undefined, this.state.castField.call(null, field, info)];\n }catch(err){\n return [err];\n }\n }\n if(this.__isFloat(field)){\n return [undefined, parseFloat(field)];\n }else if(this.options.cast_date !== false){\n const info = this.__infoField();\n return [undefined, this.options.cast_date.call(null, field, info)];\n }\n return [undefined, field];\n },\n // Helper to test if a character is a space or a line delimiter\n __isCharTrimable: function(buf, pos){\n const isTrim = (buf, pos) => {\n const {timchars} = this.state;\n loop1: for(let i = 0; i < timchars.length; i++){\n const timchar = timchars[i];\n for(let j = 0; j < timchar.length; j++){\n if(timchar[j] !== buf[pos+j]) continue loop1;\n }\n return timchar.length;\n }\n return 0;\n };\n return isTrim(buf, pos);\n },\n // Keep it in case we implement the `cast_int` option\n // __isInt(value){\n // // return Number.isInteger(parseInt(value))\n // // return !isNaN( parseInt( obj ) );\n // return /^(\\-|\\+)?[1-9][0-9]*$/.test(value)\n // }\n __isFloat: function(value){\n return (value - parseFloat(value) + 1) >= 0; // Borrowed from jquery\n },\n __compareBytes: function(sourceBuf, targetBuf, targetPos, firstByte){\n if(sourceBuf[0] !== firstByte) return 0;\n const sourceLength = sourceBuf.length;\n for(let i = 1; i < sourceLength; i++){\n if(sourceBuf[i] !== targetBuf[targetPos+i]) return 0;\n }\n return sourceLength;\n },\n __isDelimiter: function(buf, pos, chr){\n const {delimiter, ignore_last_delimiters} = this.options;\n if(ignore_last_delimiters === true && this.state.record.length === this.options.columns.length - 1){\n return 0;\n }else if(ignore_last_delimiters !== false && typeof ignore_last_delimiters === 'number' && this.state.record.length === ignore_last_delimiters - 1){\n return 0;\n }\n loop1: for(let i = 0; i < delimiter.length; i++){\n const del = delimiter[i];\n if(del[0] === chr){\n for(let j = 1; j < del.length; j++){\n if(del[j] !== buf[pos+j]) continue loop1;\n }\n return del.length;\n }\n }\n return 0;\n },\n __isRecordDelimiter: function(chr, buf, pos){\n const {record_delimiter} = this.options;\n const recordDelimiterLength = record_delimiter.length;\n loop1: for(let i = 0; i < recordDelimiterLength; i++){\n const rd = record_delimiter[i];\n const rdLength = rd.length;\n if(rd[0] !== chr){\n continue;\n }\n for(let j = 1; j < rdLength; j++){\n if(rd[j] !== buf[pos+j]){\n continue loop1;\n }\n }\n return rd.length;\n }\n return 0;\n },\n __isEscape: function(buf, pos, chr){\n const {escape} = this.options;\n if(escape === null) return false;\n const l = escape.length;\n if(escape[0] === chr){\n for(let i = 0; i < l; i++){\n if(escape[i] !== buf[pos+i]){\n return false;\n }\n }\n return true;\n }\n return false;\n },\n __isQuote: function(buf, pos){\n const {quote} = this.options;\n if(quote === null) return false;\n const l = quote.length;\n for(let i = 0; i < l; i++){\n if(quote[i] !== buf[pos+i]){\n return false;\n }\n }\n return true;\n },\n __autoDiscoverRecordDelimiter: function(buf, pos){\n const { encoding } = this.options;\n // Note, we don't need to cache this information in state,\n // It is only called on the first line until we find out a suitable\n // record delimiter.\n const rds = [\n // Important, the windows line ending must be before mac os 9\n Buffer.from('\\r\\n', encoding),\n Buffer.from('\\n', encoding),\n Buffer.from('\\r', encoding),\n ];\n loop: for(let i = 0; i < rds.length; i++){\n const l = rds[i].length;\n for(let j = 0; j < l; j++){\n if(rds[i][j] !== buf[pos + j]){\n continue loop;\n }\n }\n this.options.record_delimiter.push(rds[i]);\n this.state.recordDelimiterMaxLength = rds[i].length;\n return rds[i].length;\n }\n return 0;\n },\n __error: function(msg){\n const {encoding, raw, skip_records_with_error} = this.options;\n const err = typeof msg === 'string' ? new Error(msg) : msg;\n if(skip_records_with_error){\n this.state.recordHasError = true;\n if(this.options.on_skip !== undefined){\n this.options.on_skip(err, raw ? this.state.rawBuffer.toString(encoding) : undefined);\n }\n // this.emit('skip', err, raw ? this.state.rawBuffer.toString(encoding) : undefined);\n return undefined;\n }else{\n return err;\n }\n },\n __infoDataSet: function(){\n return {\n ...this.info,\n columns: this.options.columns\n };\n },\n __infoRecord: function(){\n const {columns, raw, encoding} = this.options;\n return {\n ...this.__infoDataSet(),\n error: this.state.error,\n header: columns === true,\n index: this.state.record.length,\n raw: raw ? this.state.rawBuffer.toString(encoding) : undefined\n };\n },\n __infoField: function(){\n const {columns} = this.options;\n const isColumns = Array.isArray(columns);\n return {\n ...this.__infoRecord(),\n column: isColumns === true ?\n (columns.length > this.state.record.length ?\n columns[this.state.record.length].name :\n null\n ) :\n this.state.record.length,\n quoting: this.state.wasQuoting,\n };\n }\n };\n};\n\n\nexport {transform, CsvError};\n","\nimport {CsvError, transform} from './api/index.js';\n\nconst parse = function(data, opts={}){\n if(typeof data === 'string'){\n data = Buffer.from(data);\n }\n const records = opts && opts.objname ? {} : [];\n const parser = transform(opts);\n const push = (record) => {\n if(parser.options.objname === undefined)\n records.push(record);\n else{\n records[record[0]] = record[1];\n }\n };\n const close = () => {};\n const err1 = parser.parse(data, false, push, close);\n if(err1 !== undefined) throw err1;\n const err2 = parser.parse(undefined, true, push, close);\n if(err2 !== undefined) throw err2;\n return records;\n};\n\n// export default parse\nexport { parse };\nexport { CsvError };\n","import { CoinID } from '@sentio/protos'\nimport { Endpoints, processMetrics } from '@sentio/runtime'\nimport { ChainId } from '@sentio/chain'\nimport { LRUCache } from 'lru-cache'\nimport { Configuration, PriceApi } from '@sentio/api'\nimport path from 'path'\nimport fs from 'fs'\nimport os from 'os'\n\nfunction getApiKey() {\n try {\n const content = fs.readFileSync(path.join(os.homedir(), '.sentio', 'config.json'), 'utf8')\n const config = JSON.parse(content)\n return config['https://app.sentio.xyz']?.api_keys\n } catch (e) {}\n}\n\nexport function getPriceClient(basePath = Endpoints.INSTANCE.priceFeedAPI) {\n if (!basePath.startsWith('http')) {\n basePath = 'http://' + basePath\n }\n if (basePath.endsWith('/')) {\n basePath = basePath.slice(0, -1)\n }\n const config = new Configuration({\n basePath,\n apiKey: getApiKey()\n })\n const api = new PriceApi(config)\n return api\n}\n\nconst priceMap = new LRUCache<string, Promise<number | undefined>>({\n max: 100000,\n ttl: 1000 * 60 * 5 // 5 minutes\n})\n\nlet priceClient: PriceApi\n\ninterface PriceOptions {\n toleranceInDays?: number\n}\nasync function getPriceByTypeOrSymbol(date: Date, coinId: CoinID, options?: PriceOptions): Promise<number | undefined> {\n if (!priceClient) {\n priceClient = getPriceClient()\n }\n return getPriceByTypeOrSymbolInternal(priceClient, date, coinId, options)\n}\n\nexport async function getPriceByTypeOrSymbolInternal(\n priceClient: PriceApi,\n date: Date,\n coinId: CoinID,\n options?: PriceOptions\n): Promise<number | undefined> {\n const dateStr = dateString(date)\n const todayDateString = dateString(new Date())\n\n let key: string\n if (coinId.symbol) {\n key = `${coinId.symbol}-${dateStr}`\n } else {\n key = `${coinId.address?.address}-${coinId.address?.chain}-${dateStr}`\n }\n let price = priceMap.get(key)\n if (price) {\n return price\n }\n\n processMetrics.process_pricecall_count.add(1)\n const response = priceClient.getPrice({\n timestamp: date,\n coinIdSymbol: coinId.symbol,\n coinIdAddressAddress: coinId.address?.address,\n coinIdAddressChain: coinId.address?.chain\n })\n price = response\n .then((res) => {\n if (res.timestamp) {\n const responseDateString = dateString(res.timestamp)\n if (responseDateString === todayDateString) {\n priceMap.delete(key)\n } else {\n // https://www.javatpoint.com/javascript-date-difference\n const diff = Math.abs(res.timestamp.getTime() - date.getTime())\n const daysDiff = diff / (1000 * 60 * 60 * 24)\n const tolerance = options?.toleranceInDays || 2\n if (daysDiff > tolerance) {\n priceMap.delete(key)\n return undefined\n }\n }\n } else {\n priceMap.delete(key)\n }\n return res.price\n })\n .catch((e) => {\n setTimeout(() => {\n priceMap.delete(key)\n }, 1000)\n\n if (e.response?.status === 404) {\n console.error('price not found for ', JSON.stringify(coinId), ' at ', dateStr)\n return undefined\n }\n // TODO maybe use small set of error\n priceMap.delete(key)\n throw e\n })\n priceMap.set(key, price)\n return price\n}\n\n/**\n *\n * @param chainId chain id refers to CHAIN_MAP\n * @param coinType\n * @param date\n * @param options other behavior options\n */\nexport async function getPriceByType(\n chainId: ChainId,\n coinType: string,\n date: Date,\n options?: PriceOptions\n): Promise<number | undefined> {\n return getPriceByTypeOrSymbol(\n date,\n {\n address: {\n chain: chainId,\n address: coinType\n }\n },\n options\n )\n}\n\n/**\n * @param symbol token symbol like BTC, etc\n * @param date\n * @param options other behavior options\n */\nexport async function getPriceBySymbol(\n symbol: string,\n date: Date,\n options?: PriceOptions\n): Promise<number | undefined> {\n return getPriceByTypeOrSymbol(date, { symbol }, options)\n}\n\nfunction dateString(date: Date) {\n return [date.getHours(), date.getUTCDate(), date.getUTCMonth() + 1, date.getUTCFullYear()].join('-')\n}\n\n/**\n * get coins that has price, return results are list of coin id with both symbol and address field set\n * @param chainId\n */\nexport async function getCoinsThatHasPrice(chainId: ChainId) {\n if (!priceClient) {\n priceClient = getPriceClient()\n }\n const response = await priceClient.priceListCoins({\n chain: chainId,\n limit: 1000\n })\n\n if (!response.coinAddressesInChain) {\n return []\n }\n return Object.entries(response.coinAddressesInChain).map(([symbol, coin]) => {\n coin.symbol = symbol\n return coin\n })\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\n\nexport const BASE_PATH = \"https://app.sentio.xyz\".replace(/\\/+$/, \"\");\n\nexport interface ConfigurationParameters {\n basePath?: string; // override base path\n fetchApi?: FetchAPI; // override for fetch implementation\n middleware?: Middleware[]; // middleware to apply before/after fetch requests\n queryParamsStringify?: (params: HTTPQuery) => string; // stringify function for query strings\n username?: string; // parameter for basic security\n password?: string; // parameter for basic security\n apiKey?: string | Promise<string> | ((name: string) => string | Promise<string>); // parameter for apiKey security\n accessToken?: string | Promise<string> | ((name?: string, scopes?: string[]) => string | Promise<string>); // parameter for oauth2 security\n headers?: HTTPHeaders; //header params we want to use on every request\n credentials?: RequestCredentials; //value for the credentials param we want to use on each request\n}\n\nexport class Configuration {\n constructor(private configuration: ConfigurationParameters = {}) {}\n\n set config(configuration: Configuration) {\n this.configuration = configuration;\n }\n\n get basePath(): string {\n return this.configuration.basePath != null ? this.configuration.basePath : BASE_PATH;\n }\n\n get fetchApi(): FetchAPI | undefined {\n return this.configuration.fetchApi;\n }\n\n get middleware(): Middleware[] {\n return this.configuration.middleware || [];\n }\n\n get queryParamsStringify(): (params: HTTPQuery) => string {\n return this.configuration.queryParamsStringify || querystring;\n }\n\n get username(): string | undefined {\n return this.configuration.username;\n }\n\n get password(): string | undefined {\n return this.configuration.password;\n }\n\n get apiKey(): ((name: string) => string | Promise<string>) | undefined {\n const apiKey = this.configuration.apiKey;\n if (apiKey) {\n return typeof apiKey === 'function' ? apiKey : () => apiKey;\n }\n return undefined;\n }\n\n get accessToken(): ((name?: string, scopes?: string[]) => string | Promise<string>) | undefined {\n const accessToken = this.configuration.accessToken;\n if (accessToken) {\n return typeof accessToken === 'function' ? accessToken : async () => accessToken;\n }\n return undefined;\n }\n\n get headers(): HTTPHeaders | undefined {\n return this.configuration.headers;\n }\n\n get credentials(): RequestCredentials | undefined {\n return this.configuration.credentials;\n }\n}\n\nexport const DefaultConfig = new Configuration();\n\n/**\n * This is the base class for all generated API classes.\n */\nexport class BaseAPI {\n\n private static readonly jsonRegex = new RegExp('^(:?application\\/json|[^;/ \\t]+\\/[^;/ \\t]+[+]json)[ \\t]*(:?;.*)?$', 'i');\n private middleware: Middleware[];\n\n constructor(protected configuration = DefaultConfig) {\n this.middleware = configuration.middleware;\n }\n\n withMiddleware<T extends BaseAPI>(this: T, ...middlewares: Middleware[]) {\n const next = this.clone<T>();\n next.middleware = next.middleware.concat(...middlewares);\n return next;\n }\n\n withPreMiddleware<T extends BaseAPI>(this: T, ...preMiddlewares: Array<Middleware['pre']>) {\n const middlewares = preMiddlewares.map((pre) => ({ pre }));\n return this.withMiddleware<T>(...middlewares);\n }\n\n withPostMiddleware<T extends BaseAPI>(this: T, ...postMiddlewares: Array<Middleware['post']>) {\n const middlewares = postMiddlewares.map((post) => ({ post }));\n return this.withMiddleware<T>(...middlewares);\n }\n\n /**\n * Check if the given MIME is a JSON MIME.\n * JSON MIME examples:\n * application/json\n * application/json; charset=UTF8\n * APPLICATION/JSON\n * application/vnd.company+json\n * @param mime - MIME (Multipurpose Internet Mail Extensions)\n * @return True if the given MIME is JSON, false otherwise.\n */\n protected isJsonMime(mime: string | null | undefined): boolean {\n if (!mime) {\n return false;\n }\n return BaseAPI.jsonRegex.test(mime);\n }\n\n protected async request(context: RequestOpts, initOverrides?: RequestInit | InitOverrideFunction): Promise<Response> {\n const { url, init } = await this.createFetchParams(context, initOverrides);\n const response = await this.fetchApi(url, init);\n if (response && (response.status >= 200 && response.status < 300)) {\n return response;\n }\n throw new ResponseError(response, 'Response returned an error code');\n }\n\n private async createFetchParams(context: RequestOpts, initOverrides?: RequestInit | InitOverrideFunction) {\n let url = this.configuration.basePath + context.path;\n if (context.query !== undefined && Object.keys(context.query).length !== 0) {\n // only add the querystring to the URL if there are query parameters.\n // this is done to avoid urls ending with a \"?\" character which buggy webservers\n // do not handle correctly sometimes.\n url += '?' + this.configuration.queryParamsStringify(context.query);\n }\n\n const headers = Object.assign({}, this.configuration.headers, context.headers);\n Object.keys(headers).forEach(key => headers[key] === undefined ? delete headers[key] : {});\n\n const initOverrideFn =\n typeof initOverrides === \"function\"\n ? initOverrides\n : async () => initOverrides;\n\n const initParams = {\n method: context.method,\n headers,\n body: context.body,\n credentials: this.configuration.credentials,\n };\n\n const overriddenInit: RequestInit = {\n ...initParams,\n ...(await initOverrideFn({\n init: initParams,\n context,\n }))\n };\n\n let body: any;\n if (isFormData(overriddenInit.body)\n || (overriddenInit.body instanceof URLSearchParams)\n || isBlob(overriddenInit.body)) {\n body = overriddenInit.body;\n } else if (this.isJsonMime(headers['Content-Type'])) {\n body = JSON.stringify(overriddenInit.body);\n } else {\n body = overriddenInit.body;\n }\n\n const init: RequestInit = {\n ...overriddenInit,\n body\n };\n\n return { url, init };\n }\n\n private fetchApi = async (url: string, init: RequestInit) => {\n let fetchParams = { url, init };\n for (const middleware of this.middleware) {\n if (middleware.pre) {\n fetchParams = await middleware.pre({\n fetch: this.fetchApi,\n ...fetchParams,\n }) || fetchParams;\n }\n }\n let response: Response | undefined = undefined;\n try {\n response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);\n } catch (e) {\n for (const middleware of this.middleware) {\n if (middleware.onError) {\n response = await middleware.onError({\n fetch: this.fetchApi,\n url: fetchParams.url,\n init: fetchParams.init,\n error: e,\n response: response ? response.clone() : undefined,\n }) || response;\n }\n }\n if (response === undefined) {\n if (e instanceof Error) {\n throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');\n } else {\n throw e;\n }\n }\n }\n for (const middleware of this.middleware) {\n if (middleware.post) {\n response = await middleware.post({\n fetch: this.fetchApi,\n url: fetchParams.url,\n init: fetchParams.init,\n response: response.clone(),\n }) || response;\n }\n }\n return response;\n }\n\n /**\n * Create a shallow clone of `this` by constructing a new instance\n * and then shallow cloning data members.\n */\n private clone<T extends BaseAPI>(this: T): T {\n const constructor = this.constructor as any;\n const next = new constructor(this.configuration);\n next.middleware = this.middleware.slice();\n return next;\n }\n};\n\nfunction isBlob(value: any): value is Blob {\n return typeof Blob !== 'undefined' && value instanceof Blob;\n}\n\nfunction isFormData(value: any): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n\nexport class ResponseError extends Error {\n override name: \"ResponseError\" = \"ResponseError\";\n constructor(public response: Response, msg?: string) {\n super(msg);\n }\n}\n\nexport class FetchError extends Error {\n override name: \"FetchError\" = \"FetchError\";\n constructor(public cause: Error, msg?: string) {\n super(msg);\n }\n}\n\nexport class RequiredError extends Error {\n override name: \"RequiredError\" = \"RequiredError\";\n constructor(public field: string, msg?: string) {\n super(msg);\n }\n}\n\nexport const COLLECTION_FORMATS = {\n csv: \",\",\n ssv: \" \",\n tsv: \"\\t\",\n pipes: \"|\",\n};\n\nexport type FetchAPI = WindowOrWorkerGlobalScope['fetch'];\n\nexport type Json = any;\nexport type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\nexport type HTTPHeaders = { [key: string]: string };\nexport type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | Set<string | number | null | boolean> | HTTPQuery };\nexport type HTTPBody = Json | FormData | URLSearchParams;\nexport type HTTPRequestInit = { headers?: HTTPHeaders; method: HTTPMethod; credentials?: RequestCredentials; body?: HTTPBody };\nexport type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original';\n\nexport type InitOverrideFunction = (requestContext: { init: HTTPRequestInit, context: RequestOpts }) => Promise<RequestInit>\n\nexport interface FetchParams {\n url: string;\n init: RequestInit;\n}\n\nexport interface RequestOpts {\n path: string;\n method: HTTPMethod;\n headers: HTTPHeaders;\n query?: HTTPQuery;\n body?: HTTPBody;\n}\n\nexport function querystring(params: HTTPQuery, prefix: string = ''): string {\n return Object.keys(params)\n .map(key => querystringSingleKey(key, params[key], prefix))\n .filter(part => part.length > 0)\n .join('&');\n}\n\nfunction querystringSingleKey(key: string, value: string | number | null | undefined | boolean | Array<string | number | null | boolean> | Set<string | number | null | boolean> | HTTPQuery, keyPrefix: string = ''): string {\n const fullKey = keyPrefix + (keyPrefix.length ? `[${key}]` : key);\n if (value instanceof Array) {\n const multiValue = value.map(singleValue => encodeURIComponent(String(singleValue)))\n .join(`&${encodeURIComponent(fullKey)}=`);\n return `${encodeURIComponent(fullKey)}=${multiValue}`;\n }\n if (value instanceof Set) {\n const valueAsArray = Array.from(value);\n return querystringSingleKey(key, valueAsArray, keyPrefix);\n }\n if (value instanceof Date) {\n return `${encodeURIComponent(fullKey)}=${encodeURIComponent(value.toISOString())}`;\n }\n if (value instanceof Object) {\n return querystring(value as HTTPQuery, fullKey);\n }\n return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`;\n}\n\nexport function mapValues(data: any, fn: (item: any) => any) {\n return Object.keys(data).reduce(\n (acc, key) => ({ ...acc, [key]: fn(data[key]) }),\n {}\n );\n}\n\nexport function canConsumeForm(consumes: Consume[]): boolean {\n for (const consume of consumes) {\n if ('multipart/form-data' === consume.contentType) {\n return true;\n }\n }\n return false;\n}\n\nexport interface Consume {\n contentType: string;\n}\n\nexport interface RequestContext {\n fetch: FetchAPI;\n url: string;\n init: RequestInit;\n}\n\nexport interface ResponseContext {\n fetch: FetchAPI;\n url: string;\n init: RequestInit;\n response: Response;\n}\n\nexport interface ErrorContext {\n fetch: FetchAPI;\n url: string;\n init: RequestInit;\n error: unknown;\n response?: Response;\n}\n\nexport interface Middleware {\n pre?(context: RequestContext): Promise<FetchParams | void>;\n post?(context: ResponseContext): Promise<Response | void>;\n onError?(context: ErrorContext): Promise<Response | void>;\n}\n\nexport interface ApiResponse<T> {\n raw: Response;\n value(): Promise<T>;\n}\n\nexport interface ResponseTransformer<T> {\n (json: any): T;\n}\n\nexport class JSONApiResponse<T> {\n constructor(public raw: Response, private transformer: ResponseTransformer<T> = (jsonValue: any) => jsonValue) {}\n\n async value(): Promise<T> {\n return this.transformer(await this.raw.json());\n }\n}\n\nexport class VoidApiResponse {\n constructor(public raw: Response) {}\n\n async value(): Promise<void> {\n return undefined;\n }\n}\n\nexport class BlobApiResponse {\n constructor(public raw: Response) {}\n\n async value(): Promise<Blob> {\n return await this.raw.blob();\n };\n}\n\nexport class TextApiResponse {\n constructor(public raw: Response) {}\n\n async value(): Promise<string> {\n return await this.raw.text();\n };\n}\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\n/**\n * GetPriceResponse is the response for GetPrice.\n * @export\n * @interface PriceServiceGetPriceResponse\n */\nexport interface PriceServiceGetPriceResponse {\n /**\n * Price in USD.\n * @type {number}\n * @memberof PriceServiceGetPriceResponse\n */\n price?: number;\n /**\n * The actual timestamp of the price returned.\n * @type {Date}\n * @memberof PriceServiceGetPriceResponse\n */\n timestamp?: Date;\n}\n\n/**\n * Check if a given object implements the PriceServiceGetPriceResponse interface.\n */\nexport function instanceOfPriceServiceGetPriceResponse(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceGetPriceResponseFromJSON(json: any): PriceServiceGetPriceResponse {\n return PriceServiceGetPriceResponseFromJSONTyped(json, false);\n}\n\nexport function PriceServiceGetPriceResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceGetPriceResponse {\n if (json == null) {\n return json;\n }\n return {\n \n 'price': json['price'] == null ? undefined : json['price'],\n 'timestamp': json['timestamp'] == null ? undefined : (new Date(json['timestamp'])),\n };\n}\n\nexport function PriceServiceGetPriceResponseToJSON(value?: PriceServiceGetPriceResponse | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'price': value['price'],\n 'timestamp': value['timestamp'] == null ? undefined : ((value['timestamp']).toISOString()),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceGetPriceResponse } from './PriceServiceGetPriceResponse.js';\nimport {\n PriceServiceGetPriceResponseFromJSON,\n PriceServiceGetPriceResponseFromJSONTyped,\n PriceServiceGetPriceResponseToJSON,\n} from './PriceServiceGetPriceResponse.js';\n\n/**\n * \n * @export\n * @interface PriceServiceBatchGetPricesResponseCoinPricePrice\n */\nexport interface PriceServiceBatchGetPricesResponseCoinPricePrice {\n /**\n * \n * @type {Array<PriceServiceGetPriceResponse>}\n * @memberof PriceServiceBatchGetPricesResponseCoinPricePrice\n */\n results?: Array<PriceServiceGetPriceResponse>;\n}\n\n/**\n * Check if a given object implements the PriceServiceBatchGetPricesResponseCoinPricePrice interface.\n */\nexport function instanceOfPriceServiceBatchGetPricesResponseCoinPricePrice(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceBatchGetPricesResponseCoinPricePriceFromJSON(json: any): PriceServiceBatchGetPricesResponseCoinPricePrice {\n return PriceServiceBatchGetPricesResponseCoinPricePriceFromJSONTyped(json, false);\n}\n\nexport function PriceServiceBatchGetPricesResponseCoinPricePriceFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceBatchGetPricesResponseCoinPricePrice {\n if (json == null) {\n return json;\n }\n return {\n \n 'results': json['results'] == null ? undefined : ((json['results'] as Array<any>).map(PriceServiceGetPriceResponseFromJSON)),\n };\n}\n\nexport function PriceServiceBatchGetPricesResponseCoinPricePriceToJSON(value?: PriceServiceBatchGetPricesResponseCoinPricePrice | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'results': value['results'] == null ? undefined : ((value['results'] as Array<any>).map(PriceServiceGetPriceResponseToJSON)),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\n/**\n * The coin can be defined as a symbol, e.g. BTC, ETH, etc, or an address + chain.\n * The format of the chain is consistent with the Sentio internal representation.\n * @export\n * @interface PriceServiceCoinIDAddressIdentifier\n */\nexport interface PriceServiceCoinIDAddressIdentifier {\n /**\n * \n * @type {string}\n * @memberof PriceServiceCoinIDAddressIdentifier\n */\n address?: string;\n /**\n * \n * @type {string}\n * @memberof PriceServiceCoinIDAddressIdentifier\n */\n chain?: string;\n}\n\n/**\n * Check if a given object implements the PriceServiceCoinIDAddressIdentifier interface.\n */\nexport function instanceOfPriceServiceCoinIDAddressIdentifier(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceCoinIDAddressIdentifierFromJSON(json: any): PriceServiceCoinIDAddressIdentifier {\n return PriceServiceCoinIDAddressIdentifierFromJSONTyped(json, false);\n}\n\nexport function PriceServiceCoinIDAddressIdentifierFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceCoinIDAddressIdentifier {\n if (json == null) {\n return json;\n }\n return {\n \n 'address': json['address'] == null ? undefined : json['address'],\n 'chain': json['chain'] == null ? undefined : json['chain'],\n };\n}\n\nexport function PriceServiceCoinIDAddressIdentifierToJSON(value?: PriceServiceCoinIDAddressIdentifier | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'address': value['address'],\n 'chain': value['chain'],\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceCoinIDAddressIdentifier } from './PriceServiceCoinIDAddressIdentifier.js';\nimport {\n PriceServiceCoinIDAddressIdentifierFromJSON,\n PriceServiceCoinIDAddressIdentifierFromJSONTyped,\n PriceServiceCoinIDAddressIdentifierToJSON,\n} from './PriceServiceCoinIDAddressIdentifier.js';\n\n/**\n * The identifier of a coin.\n * @export\n * @interface PriceServiceCoinID\n */\nexport interface PriceServiceCoinID {\n /**\n * \n * @type {string}\n * @memberof PriceServiceCoinID\n */\n symbol?: string;\n /**\n * \n * @type {PriceServiceCoinIDAddressIdentifier}\n * @memberof PriceServiceCoinID\n */\n address?: PriceServiceCoinIDAddressIdentifier;\n}\n\n/**\n * Check if a given object implements the PriceServiceCoinID interface.\n */\nexport function instanceOfPriceServiceCoinID(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceCoinIDFromJSON(json: any): PriceServiceCoinID {\n return PriceServiceCoinIDFromJSONTyped(json, false);\n}\n\nexport function PriceServiceCoinIDFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceCoinID {\n if (json == null) {\n return json;\n }\n return {\n \n 'symbol': json['symbol'] == null ? undefined : json['symbol'],\n 'address': json['address'] == null ? undefined : PriceServiceCoinIDAddressIdentifierFromJSON(json['address']),\n };\n}\n\nexport function PriceServiceCoinIDToJSON(value?: PriceServiceCoinID | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'symbol': value['symbol'],\n 'address': PriceServiceCoinIDAddressIdentifierToJSON(value['address']),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceBatchGetPricesResponseCoinPricePrice } from './PriceServiceBatchGetPricesResponseCoinPricePrice.js';\nimport {\n PriceServiceBatchGetPricesResponseCoinPricePriceFromJSON,\n PriceServiceBatchGetPricesResponseCoinPricePriceFromJSONTyped,\n PriceServiceBatchGetPricesResponseCoinPricePriceToJSON,\n} from './PriceServiceBatchGetPricesResponseCoinPricePrice.js';\nimport type { PriceServiceCoinID } from './PriceServiceCoinID.js';\nimport {\n PriceServiceCoinIDFromJSON,\n PriceServiceCoinIDFromJSONTyped,\n PriceServiceCoinIDToJSON,\n} from './PriceServiceCoinID.js';\n\n/**\n * \n * @export\n * @interface PriceServiceBatchGetPricesResponseCoinPrice\n */\nexport interface PriceServiceBatchGetPricesResponseCoinPrice {\n /**\n * \n * @type {PriceServiceCoinID}\n * @memberof PriceServiceBatchGetPricesResponseCoinPrice\n */\n coinId?: PriceServiceCoinID;\n /**\n * \n * @type {PriceServiceBatchGetPricesResponseCoinPricePrice}\n * @memberof PriceServiceBatchGetPricesResponseCoinPrice\n */\n price?: PriceServiceBatchGetPricesResponseCoinPricePrice;\n /**\n * \n * @type {string}\n * @memberof PriceServiceBatchGetPricesResponseCoinPrice\n */\n error?: string;\n}\n\n/**\n * Check if a given object implements the PriceServiceBatchGetPricesResponseCoinPrice interface.\n */\nexport function instanceOfPriceServiceBatchGetPricesResponseCoinPrice(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceBatchGetPricesResponseCoinPriceFromJSON(json: any): PriceServiceBatchGetPricesResponseCoinPrice {\n return PriceServiceBatchGetPricesResponseCoinPriceFromJSONTyped(json, false);\n}\n\nexport function PriceServiceBatchGetPricesResponseCoinPriceFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceBatchGetPricesResponseCoinPrice {\n if (json == null) {\n return json;\n }\n return {\n \n 'coinId': json['coinId'] == null ? undefined : PriceServiceCoinIDFromJSON(json['coinId']),\n 'price': json['price'] == null ? undefined : PriceServiceBatchGetPricesResponseCoinPricePriceFromJSON(json['price']),\n 'error': json['error'] == null ? undefined : json['error'],\n };\n}\n\nexport function PriceServiceBatchGetPricesResponseCoinPriceToJSON(value?: PriceServiceBatchGetPricesResponseCoinPrice | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'coinId': PriceServiceCoinIDToJSON(value['coinId']),\n 'price': PriceServiceBatchGetPricesResponseCoinPricePriceToJSON(value['price']),\n 'error': value['error'],\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceBatchGetPricesResponseCoinPrice } from './PriceServiceBatchGetPricesResponseCoinPrice.js';\nimport {\n PriceServiceBatchGetPricesResponseCoinPriceFromJSON,\n PriceServiceBatchGetPricesResponseCoinPriceFromJSONTyped,\n PriceServiceBatchGetPricesResponseCoinPriceToJSON,\n} from './PriceServiceBatchGetPricesResponseCoinPrice.js';\n\n/**\n * \n * @export\n * @interface PriceServiceBatchGetPricesResponse\n */\nexport interface PriceServiceBatchGetPricesResponse {\n /**\n * \n * @type {Array<PriceServiceBatchGetPricesResponseCoinPrice>}\n * @memberof PriceServiceBatchGetPricesResponse\n */\n prices?: Array<PriceServiceBatchGetPricesResponseCoinPrice>;\n}\n\n/**\n * Check if a given object implements the PriceServiceBatchGetPricesResponse interface.\n */\nexport function instanceOfPriceServiceBatchGetPricesResponse(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceBatchGetPricesResponseFromJSON(json: any): PriceServiceBatchGetPricesResponse {\n return PriceServiceBatchGetPricesResponseFromJSONTyped(json, false);\n}\n\nexport function PriceServiceBatchGetPricesResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceBatchGetPricesResponse {\n if (json == null) {\n return json;\n }\n return {\n \n 'prices': json['prices'] == null ? undefined : ((json['prices'] as Array<any>).map(PriceServiceBatchGetPricesResponseCoinPriceFromJSON)),\n };\n}\n\nexport function PriceServiceBatchGetPricesResponseToJSON(value?: PriceServiceBatchGetPricesResponse | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'prices': value['prices'] == null ? undefined : ((value['prices'] as Array<any>).map(PriceServiceBatchGetPricesResponseCoinPriceToJSON)),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceCoinID } from './PriceServiceCoinID.js';\nimport {\n PriceServiceCoinIDFromJSON,\n PriceServiceCoinIDFromJSONTyped,\n PriceServiceCoinIDToJSON,\n} from './PriceServiceCoinID.js';\n\n/**\n * \n * @export\n * @interface PriceServiceCheckLatestPriceResponseCoinPrice\n */\nexport interface PriceServiceCheckLatestPriceResponseCoinPrice {\n /**\n * \n * @type {PriceServiceCoinID}\n * @memberof PriceServiceCheckLatestPriceResponseCoinPrice\n */\n coinId?: PriceServiceCoinID;\n /**\n * \n * @type {number}\n * @memberof PriceServiceCheckLatestPriceResponseCoinPrice\n */\n price?: number;\n /**\n * \n * @type {Date}\n * @memberof PriceServiceCheckLatestPriceResponseCoinPrice\n */\n timestamp?: Date;\n}\n\n/**\n * Check if a given object implements the PriceServiceCheckLatestPriceResponseCoinPrice interface.\n */\nexport function instanceOfPriceServiceCheckLatestPriceResponseCoinPrice(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceCheckLatestPriceResponseCoinPriceFromJSON(json: any): PriceServiceCheckLatestPriceResponseCoinPrice {\n return PriceServiceCheckLatestPriceResponseCoinPriceFromJSONTyped(json, false);\n}\n\nexport function PriceServiceCheckLatestPriceResponseCoinPriceFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceCheckLatestPriceResponseCoinPrice {\n if (json == null) {\n return json;\n }\n return {\n \n 'coinId': json['coinId'] == null ? undefined : PriceServiceCoinIDFromJSON(json['coinId']),\n 'price': json['price'] == null ? undefined : json['price'],\n 'timestamp': json['timestamp'] == null ? undefined : (new Date(json['timestamp'])),\n };\n}\n\nexport function PriceServiceCheckLatestPriceResponseCoinPriceToJSON(value?: PriceServiceCheckLatestPriceResponseCoinPrice | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'coinId': PriceServiceCoinIDToJSON(value['coinId']),\n 'price': value['price'],\n 'timestamp': value['timestamp'] == null ? undefined : ((value['timestamp']).toISOString()),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceCheckLatestPriceResponseCoinPrice } from './PriceServiceCheckLatestPriceResponseCoinPrice.js';\nimport {\n PriceServiceCheckLatestPriceResponseCoinPriceFromJSON,\n PriceServiceCheckLatestPriceResponseCoinPriceFromJSONTyped,\n PriceServiceCheckLatestPriceResponseCoinPriceToJSON,\n} from './PriceServiceCheckLatestPriceResponseCoinPrice.js';\n\n/**\n * \n * @export\n * @interface PriceServiceCheckLatestPriceResponse\n */\nexport interface PriceServiceCheckLatestPriceResponse {\n /**\n * \n * @type {Array<PriceServiceCheckLatestPriceResponseCoinPrice>}\n * @memberof PriceServiceCheckLatestPriceResponse\n */\n prices?: Array<PriceServiceCheckLatestPriceResponseCoinPrice>;\n /**\n * \n * @type {PriceServiceCheckLatestPriceResponseCoinPrice}\n * @memberof PriceServiceCheckLatestPriceResponse\n */\n latestPrice?: PriceServiceCheckLatestPriceResponseCoinPrice;\n}\n\n/**\n * Check if a given object implements the PriceServiceCheckLatestPriceResponse interface.\n */\nexport function instanceOfPriceServiceCheckLatestPriceResponse(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceCheckLatestPriceResponseFromJSON(json: any): PriceServiceCheckLatestPriceResponse {\n return PriceServiceCheckLatestPriceResponseFromJSONTyped(json, false);\n}\n\nexport function PriceServiceCheckLatestPriceResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceCheckLatestPriceResponse {\n if (json == null) {\n return json;\n }\n return {\n \n 'prices': json['prices'] == null ? undefined : ((json['prices'] as Array<any>).map(PriceServiceCheckLatestPriceResponseCoinPriceFromJSON)),\n 'latestPrice': json['latestPrice'] == null ? undefined : PriceServiceCheckLatestPriceResponseCoinPriceFromJSON(json['latestPrice']),\n };\n}\n\nexport function PriceServiceCheckLatestPriceResponseToJSON(value?: PriceServiceCheckLatestPriceResponse | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'prices': value['prices'] == null ? undefined : ((value['prices'] as Array<any>).map(PriceServiceCheckLatestPriceResponseCoinPriceToJSON)),\n 'latestPrice': PriceServiceCheckLatestPriceResponseCoinPriceToJSON(value['latestPrice']),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\nimport { mapValues } from '../runtime.js';\nimport type { PriceServiceCoinID } from './PriceServiceCoinID.js';\nimport {\n PriceServiceCoinIDFromJSON,\n PriceServiceCoinIDFromJSONTyped,\n PriceServiceCoinIDToJSON,\n} from './PriceServiceCoinID.js';\n\n/**\n * \n * @export\n * @interface PriceServiceListCoinsResponse\n */\nexport interface PriceServiceListCoinsResponse {\n /**\n * \n * @type {Array<PriceServiceCoinID>}\n * @memberof PriceServiceListCoinsResponse\n */\n coins?: Array<PriceServiceCoinID>;\n /**\n * \n * @type {{ [key: string]: PriceServiceCoinID; }}\n * @memberof PriceServiceListCoinsResponse\n */\n coinAddressesInChain?: { [key: string]: PriceServiceCoinID; };\n}\n\n/**\n * Check if a given object implements the PriceServiceListCoinsResponse interface.\n */\nexport function instanceOfPriceServiceListCoinsResponse(value: object): boolean {\n return true;\n}\n\nexport function PriceServiceListCoinsResponseFromJSON(json: any): PriceServiceListCoinsResponse {\n return PriceServiceListCoinsResponseFromJSONTyped(json, false);\n}\n\nexport function PriceServiceListCoinsResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): PriceServiceListCoinsResponse {\n if (json == null) {\n return json;\n }\n return {\n \n 'coins': json['coins'] == null ? undefined : ((json['coins'] as Array<any>).map(PriceServiceCoinIDFromJSON)),\n 'coinAddressesInChain': json['coinAddressesInChain'] == null ? undefined : (mapValues(json['coinAddressesInChain'], PriceServiceCoinIDFromJSON)),\n };\n}\n\nexport function PriceServiceListCoinsResponseToJSON(value?: PriceServiceListCoinsResponse | null): any {\n if (value == null) {\n return value;\n }\n return {\n \n 'coins': value['coins'] == null ? undefined : ((value['coins'] as Array<any>).map(PriceServiceCoinIDToJSON)),\n 'coinAddressesInChain': value['coinAddressesInChain'] == null ? undefined : (mapValues(value['coinAddressesInChain'], PriceServiceCoinIDToJSON)),\n };\n}\n\n","/* tslint:disable */\n/* eslint-disable */\n/**\n * Sentio API\n * Sentio Open API for query data\n *\n * The version of the OpenAPI document: version not set\n * \n *\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\n\n\nimport * as runtime from '../runtime.js';\nimport type {\n PriceServiceBatchGetPricesResponse,\n PriceServiceCheckLatestPriceResponse,\n PriceServiceGetPriceResponse,\n PriceServiceListCoinsResponse,\n} from '../models/index.js';\nimport {\n PriceServiceBatchGetPricesResponseFromJSON,\n PriceServiceBatchGetPricesResponseToJSON,\n PriceServiceCheckLatestPriceResponseFromJSON,\n PriceServiceCheckLatestPriceResponseToJSON,\n PriceServiceGetPriceResponseFromJSON,\n PriceServiceGetPriceResponseToJSON,\n PriceServiceListCoinsResponseFromJSON,\n PriceServiceListCoinsResponseToJSON,\n} from '../models/index.js';\n\nexport interface BatchGetPricesRequest {\n timestamps?: Array<Date>;\n}\n\nexport interface GetPriceRequest {\n timestamp?: Date;\n coinIdSymbol?: string;\n coinIdAddressAddress?: string;\n coinIdAddressChain?: string;\n source?: string;\n}\n\nexport interface PriceListCoinsRequest {\n limit?: number;\n offset?: number;\n searchQuery?: string;\n chain?: string;\n}\n\n/**\n * \n */\nexport class PriceApi extends runtime.BaseAPI {\n\n /**\n * Batch get prices\n */\n async batchGetPricesRaw(requestParameters: BatchGetPricesRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PriceServiceBatchGetPricesResponse>> {\n const queryParameters: any = {};\n\n if (requestParameters['timestamps'] != null) {\n queryParameters['timestamps'] = requestParameters['timestamps'];\n }\n\n const headerParameters: runtime.HTTPHeaders = {};\n\n if (this.configuration && this.configuration.apiKey) {\n headerParameters[\"api-key\"] = await this.configuration.apiKey(\"api-key\"); // ApiKeyAuth authentication\n }\n\n const response = await this.request({\n path: `/api/v1/prices/batch`,\n method: 'GET',\n headers: headerParameters,\n query: queryParameters,\n }, initOverrides);\n\n return new runtime.JSONApiResponse(response, (jsonValue) => PriceServiceBatchGetPricesResponseFromJSON(jsonValue));\n }\n\n /**\n * Batch get prices\n */\n async batchGetPrices(requestParameters: BatchGetPricesRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PriceServiceBatchGetPricesResponse> {\n const response = await this.batchGetPricesRaw(requestParameters, initOverrides);\n return await response.value();\n }\n\n /**\n * Check latest price\n */\n async checkLatestPriceRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PriceServiceCheckLatestPriceResponse>> {\n const queryParameters: any = {};\n\n const headerParameters: runtime.HTTPHeaders = {};\n\n if (this.configuration && this.configuration.apiKey) {\n headerParameters[\"api-key\"] = await this.configuration.apiKey(\"api-key\"); // ApiKeyAuth authentication\n }\n\n const response = await this.request({\n path: `/api/v1/prices/check_latest`,\n method: 'GET',\n headers: headerParameters,\n query: queryParameters,\n }, initOverrides);\n\n return new runtime.JSONApiResponse(response, (jsonValue) => PriceServiceCheckLatestPriceResponseFromJSON(jsonValue));\n }\n\n /**\n * Check latest price\n */\n async checkLatestPrice(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PriceServiceCheckLatestPriceResponse> {\n const response = await this.checkLatestPriceRaw(initOverrides);\n return await response.value();\n }\n\n /**\n * GetPrice returns the price of a given coin identifier, in a best effort way. If we do not have any price data for the given coin, we will return NOT_FOUND error. If we have at least one price data for the given coin, we will return it with the actual timestamp. Client is responsible for checking the timestamp and decide whether to use the price or not.\n * Get price\n */\n async getPriceRaw(requestParameters: GetPriceRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PriceServiceGetPriceResponse>> {\n const queryParameters: any = {};\n\n if (requestParameters['timestamp'] != null) {\n queryParameters['timestamp'] = (requestParameters['timestamp'] as any).toISOString();\n }\n\n if (requestParameters['coinIdSymbol'] != null) {\n queryParameters['coinId.symbol'] = requestParameters['coinIdSymbol'];\n }\n\n if (requestParameters['coinIdAddressAddress'] != null) {\n queryParameters['coinId.address.address'] = requestParameters['coinIdAddressAddress'];\n }\n\n if (requestParameters['coinIdAddressChain'] != null) {\n queryParameters['coinId.address.chain'] = requestParameters['coinIdAddressChain'];\n }\n\n if (requestParameters['source'] != null) {\n queryParameters['source'] = requestParameters['source'];\n }\n\n const headerParameters: runtime.HTTPHeaders = {};\n\n if (this.configuration && this.configuration.apiKey) {\n headerParameters[\"api-key\"] = await this.configuration.apiKey(\"api-key\"); // ApiKeyAuth authentication\n }\n\n const response = await this.request({\n path: `/api/v1/prices`,\n method: 'GET',\n headers: headerParameters,\n query: queryParameters,\n }, initOverrides);\n\n return new runtime.JSONApiResponse(response, (jsonValue) => PriceServiceGetPriceResponseFromJSON(jsonValue));\n }\n\n /**\n * GetPrice returns the price of a given coin identifier, in a best effort way. If we do not have any price data for the given coin, we will return NOT_FOUND error. If we have at least one price data for the given coin, we will return it with the actual timestamp. Client is responsible for checking the timestamp and decide whether to use the price or not.\n * Get price\n */\n async getPrice(requestParameters: GetPriceRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PriceServiceGetPriceResponse> {\n const response = await this.getPriceRaw(requestParameters, initOverrides);\n return await response.value();\n }\n\n /**\n * List coins\n */\n async priceListCoinsRaw(requestParameters: PriceListCoinsRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<PriceServiceListCoinsResponse>> {\n const queryParameters: any = {};\n\n if (requestParameters['limit'] != null) {\n queryParameters['limit'] = requestParameters['limit'];\n }\n\n if (requestParameters['offset'] != null) {\n queryParameters['offset'] = requestParameters['offset'];\n }\n\n if (requestParameters['searchQuery'] != null) {\n queryParameters['searchQuery'] = requestParameters['searchQuery'];\n }\n\n if (requestParameters['chain'] != null) {\n queryParameters['chain'] = requestParameters['chain'];\n }\n\n const headerParameters: runtime.HTTPHeaders = {};\n\n if (this.configuration && this.configuration.apiKey) {\n headerParameters[\"api-key\"] = await this.configuration.apiKey(\"api-key\"); // ApiKeyAuth authentication\n }\n\n const response = await this.request({\n path: `/api/v1/prices/coins`,\n method: 'GET',\n headers: headerParameters,\n query: queryParameters,\n }, initOverrides);\n\n return new runtime.JSONApiResponse(response, (jsonValue) => PriceServiceListCoinsResponseFromJSON(jsonValue));\n }\n\n /**\n * List coins\n */\n async priceListCoins(requestParameters: PriceListCoinsRequest = {}, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<PriceServiceListCoinsResponse> {\n const response = await this.priceListCoinsRaw(requestParameters, initOverrides);\n return await response.value();\n }\n\n}\n","import { SimpleEthersError } from '../eth/index.js'\n\n/**\n * ignore eth call exception and return undefined if that happened\n * @param promise promise return by eth call\n * @param logError whether to log error\n */\nexport async function ignoreEthCallException<Res>(promise: Promise<Res>, logError = false): Promise<Res | undefined> {\n try {\n return await promise\n } catch (err) {\n if (err instanceof SimpleEthersError || err.code === 'CALL_EXCEPTION' || err.code === 'BAD_DATA') {\n if (logError) {\n console.error('eth call exception, return undefined', err)\n }\n return undefined\n }\n throw err\n }\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));","export * from './block.js'\nexport * from './conversion.js'\nexport * as token from './token.js'\nexport * from './dex-price.js'\nexport { getPriceByType, getPriceClient, getPriceBySymbol, getCoinsThatHasPrice } from './price.js'\nexport * from './call.js'\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":["getBlockSafely","provider","blockNumber","block","__name","estimateBlockNumberAtDate","targetDate","startBlock","targetTimestamp","latestBlock","low","high","mid","midBlock","p","bytesToBigInt","bytes","intValue","i","__name","p","token_exports","__export","NATIVE_ETH","getER20NormalizedAmount","getERC20TokenInfo","perf","warned","PROCESS","emitWarning","__name","msg","type","code","fn","AC","AS","_","warnACPolyfill","reason","printACPolyfillWarning","shouldWarn","TYPE","isPosInt","getUintArray","max","ZeroArray","size","Stack","_Stack","#constructing","HeapCls","s","n","LRUCache","_LRUCache","#max","#maxSize","#dispose","#disposeAfter","#fetchMethod","#memoMethod","#size","#calculatedSize","#keyMap","#keyList","#valList","#next","#prev","#head","#tail","#free","#disposed","#sizes","#starts","#ttls","#hasDispose","#hasFetchMethod","#hasDisposeAfter","c","p","#isBackgroundFetch","k","index","options","context","#backgroundFetch","#moveToTail","#indexes","#rindexes","#isStale","ttl","ttlResolution","ttlAutopurge","updateAgeOnGet","updateAgeOnHas","allowStale","dispose","disposeAfter","noDisposeOnSet","noUpdateTTL","maxSize","maxEntrySize","sizeCalculation","fetchMethod","memoMethod","noDeleteOnFetchRejection","noDeleteOnStaleGet","allowStaleOnFetchRejection","allowStaleOnFetchAbort","ignoreFetchAbort","UintArray","#initializeSizeTracking","#initializeTTLTracking","key","ttls","starts","#setItemTTL","start","t","#delete","#updateItemAge","#statusTTL","status","cachedNow","getNow","age","sizes","#removeItemSize","#requireSize","v","#addItemSize","#evict","_i","_s","_st","_k","_v","i","#isValidIndex","getOptions","value","thisp","deleted","entry","remain","arr","setOptions","oldVal","oldValue","dt","task","val","free","head","hasOptions","peekOptions","ac","signal","fetchOpts","cb","updateCache","aborted","ignoreAbort","fetchFail","bf","eb","er","allowStaleAborted","noDelete","pcall","res","rej","fmp","b","fetchOptions","forceRefresh","stale","isStale","staleVal","memoOptions","vv","fetching","#connect","#clear","pi","ni","NATIVE_ETH","TOKEN_INFOS","LRUCache","getTokenInfoPromise","symbol","name","decimal","__name","getERC20TokenInfo","contextOrNetworkish","tokenAddress","chainId","BaseContext","EthChainId","key","res","contract","getERC20Contract","bytesContract","getERC20BytesContract","decodeBytes32String","info","getER20NormalizedAmount","amount","tokenInfo","scaleDown","p","fs","CsvError","_CsvError","__name","code","message","options","contexts","context","key","value","is_object","__name","obj","normalize_columns_array","__name","columns","normalizedColumns","i","l","column","is_object","CsvError","ResizeableBuffer","__name","size","val","length","buf","encoding","ResizeableBuffer_default","np","cr","nl","space","tab","init_state","__name","options","ResizeableBuffer_default","delimiter","v","underscore","__name","str","_","match","normalize_options","__name","opts","options","opt","underscore","CsvError","value","date","normalize_columns_array","delimiter_json","delimiter","rd","i","isRecordEmpty","__name","record","field","cr","nl","boms","transform","original_options","info","options","normalize_options","init_state","bufLen","end","encoding","escape","quote","quoting","needMoreDataSize","recordDelimiterMaxLength","numOfCharLeft","requiredLength","nextBuf","push","close","bom","comment_no_infix","from_line","ltrim","max_record_size","raw","relax_quotes","rtrim","skip_empty_lines","to","to_line","comment","record_delimiter","bomSkipped","previousBuf","rawBuffer","escapeIsQuote","buf","bomLength","pos","chr","nextChr","isNextChrTrimable","isNextChrComment","isNextChrDelimiter","isNextChrRecordDelimiter","err","CsvError","b","recordDelimiterLength","errField","errRecord","delimiterLength","lappend","rappend","columns","group_columns_by_name","from","relax_column_count","relax_column_count_less","relax_column_count_more","skip_records_with_empty_values","enabled","recordLength","finalErr","objname","obj","i","l","extRecord","firstLineToHeaders","headers","normalizedHeaders","normalize_columns_array","cast","wasQuoting","f","on_record","timchars","loop1","timchar","j","value","sourceBuf","targetBuf","targetPos","firstByte","sourceLength","delimiter","ignore_last_delimiters","del","rd","rdLength","rds","loop","msg","skip_records_with_error","isColumns","parse","__name","data","opts","records","parser","transform","push","record","close","err1","err2","EthChainId","createRequire","path","PriceUnit","getPackageRoot","pkgId","m","createRequire","dir","path","fs","__name","DexPrice","csvFileName","chainId","packageRoot","csvFilePath","fileContent","records","parse","record","pair","asset","target","address","blockTag","unit","oracleMap","addr","contract","getEACAggregatorProxyContract","price","decimal","scaleDown","e","EthereumDexPrice","EthChainId","SepoliaDexPrice","p","Endpoints","processMetrics","BASE_PATH","Configuration","__name","configuration","querystring","apiKey","accessToken","DefaultConfig","BaseAPI","_BaseAPI","middlewares","next","preMiddlewares","pre","postMiddlewares","post","mime","context","initOverrides","url","init","response","ResponseError","headers","key","initOverrideFn","initParams","overriddenInit","body","isFormData","isBlob","fetchParams","middleware","e","FetchError","constructor","value","msg","cause","querystring","params","prefix","key","querystringSingleKey","part","__name","value","keyPrefix","fullKey","multiValue","singleValue","valueAsArray","mapValues","data","fn","acc","JSONApiResponse","__name","raw","transformer","jsonValue","PriceServiceGetPriceResponseFromJSON","json","PriceServiceGetPriceResponseFromJSONTyped","__name","ignoreDiscriminator","PriceServiceBatchGetPricesResponseCoinPricePriceFromJSON","json","PriceServiceBatchGetPricesResponseCoinPricePriceFromJSONTyped","__name","ignoreDiscriminator","PriceServiceGetPriceResponseFromJSON","PriceServiceCoinIDAddressIdentifierFromJSON","json","PriceServiceCoinIDAddressIdentifierFromJSONTyped","__name","ignoreDiscriminator","PriceServiceCoinIDFromJSON","json","PriceServiceCoinIDFromJSONTyped","__name","ignoreDiscriminator","PriceServiceCoinIDAddressIdentifierFromJSON","PriceServiceBatchGetPricesResponseCoinPriceFromJSON","json","PriceServiceBatchGetPricesResponseCoinPriceFromJSONTyped","__name","ignoreDiscriminator","PriceServiceCoinIDFromJSON","PriceServiceBatchGetPricesResponseCoinPricePriceFromJSON","PriceServiceBatchGetPricesResponseFromJSON","json","PriceServiceBatchGetPricesResponseFromJSONTyped","__name","ignoreDiscriminator","PriceServiceBatchGetPricesResponseCoinPriceFromJSON","PriceServiceCheckLatestPriceResponseCoinPriceFromJSON","json","PriceServiceCheckLatestPriceResponseCoinPriceFromJSONTyped","__name","ignoreDiscriminator","PriceServiceCoinIDFromJSON","PriceServiceCheckLatestPriceResponseFromJSON","json","PriceServiceCheckLatestPriceResponseFromJSONTyped","__name","ignoreDiscriminator","PriceServiceCheckLatestPriceResponseCoinPriceFromJSON","PriceServiceListCoinsResponseFromJSON","json","PriceServiceListCoinsResponseFromJSONTyped","__name","ignoreDiscriminator","PriceServiceCoinIDFromJSON","mapValues","PriceApi","BaseAPI","__name","requestParameters","initOverrides","queryParameters","headerParameters","response","JSONApiResponse","jsonValue","PriceServiceBatchGetPricesResponseFromJSON","PriceServiceCheckLatestPriceResponseFromJSON","PriceServiceGetPriceResponseFromJSON","PriceServiceListCoinsResponseFromJSON","path","fs","os","getApiKey","content","fs","path","os","__name","getPriceClient","basePath","Endpoints","config","Configuration","PriceApi","priceMap","LRUCache","priceClient","getPriceByTypeOrSymbol","date","coinId","options","getPriceByTypeOrSymbolInternal","dateStr","dateString","todayDateString","key","price","processMetrics","res","daysDiff","tolerance","e","getPriceByType","chainId","coinType","getPriceBySymbol","symbol","getCoinsThatHasPrice","response","coin","p","ignoreEthCallException","promise","logError","err","SimpleEthersError","__name","p","p"]}
|