@hammerock/cca-sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +145 -0
- package/dist/chunk-ABCX23D6.js +446 -0
- package/dist/chunk-ABCX23D6.js.map +1 -0
- package/dist/erc20-C3yff839.d.cts +231 -0
- package/dist/erc20-C3yff839.d.ts +231 -0
- package/dist/index.cjs +998 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2717 -0
- package/dist/index.d.ts +2717 -0
- package/dist/index.js +485 -0
- package/dist/index.js.map +1 -0
- package/dist/node.cjs +448 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +97 -0
- package/dist/node.d.ts +97 -0
- package/dist/node.js +277 -0
- package/dist/node.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/erc20.ts","../src/abis/auction.ts","../src/abis/factory.ts","../src/read.ts","../src/enrich.ts","../src/store.ts","../src/discover.ts","../src/sync.ts"],"names":["sepolia","baseSepolia","unichainSepolia","readFile","mkdir","dirname","writeFile","getAbiItem"],"mappings":"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","file":"node.cjs","sourcesContent":["/**\r\n * Deployment addresses and chain configuration.\r\n *\r\n * Beacon is testnet-only by design. Mainnet chain ids are deliberately absent\r\n * from {@link SUPPORTED_CHAINS} so that every surface - directory, widget, bot\r\n * and agent - fails closed rather than touching real funds.\r\n */\r\nimport { baseSepolia, sepolia, unichainSepolia } from \"viem/chains\";\r\nimport type { Address } from \"viem\";\r\n\r\n/**\r\n * `ContinuousClearingAuctionFactory` v1.1.0.\r\n *\r\n * Deployed through the deterministic CREATE2 deployer (`0x4e59b448...`), so the\r\n * address is identical on every chain Uniswap has launched CCA on.\r\n *\r\n * VERIFIED on Sepolia: the deployed runtime bytecode is byte-for-byte identical\r\n * to a local `forge build` of upstream tag v1.1.0. Re-check with\r\n * `./contracts/sync-abis.sh` and a bytecode diff before trusting a new chain.\r\n */\r\nexport const FACTORY_ADDRESS: Address = \"0xCCccCcCAE7503Cac057829BF2811De42E16e0bD5\";\r\n\r\n/**\r\n * Block each chain's factory was created at - where auction discovery starts\r\n * scanning. Scanning from 0 instead wastes thousands of RPC calls.\r\n */\r\nexport const FACTORY_DEPLOY_BLOCK: Record<number, bigint> = {\r\n [sepolia.id]: 10130119n,\r\n};\r\n\r\n/**\r\n * Testnets Beacon is allowed to talk to.\r\n *\r\n * Only Sepolia is verified end-to-end today; the other two are listed because\r\n * the factory is a cross-chain singleton, but their deploy blocks are unknown\r\n * (discovery will need an explicit `fromBlock`).\r\n */\r\nexport const SUPPORTED_CHAINS = {\r\n [sepolia.id]: sepolia,\r\n [baseSepolia.id]: baseSepolia,\r\n [unichainSepolia.id]: unichainSepolia,\r\n} as const;\r\n\r\nexport type SupportedChainId = keyof typeof SUPPORTED_CHAINS;\r\n\r\n/**\r\n * Approximate seconds per block, used to turn a block countdown into a human\r\n * \"time remaining\". Estimates - block times drift.\r\n */\r\nexport const BLOCK_TIME_SECONDS: Record<number, number> = {\r\n [sepolia.id]: 12,\r\n [baseSepolia.id]: 2,\r\n [unichainSepolia.id]: 1,\r\n};\r\n\r\n/**\r\n * Maximum block span for a single `eth_getLogs` call.\r\n *\r\n * Public Sepolia RPCs reject anything wider with\r\n * `-32701: exceed maximum block range: 50000`, and some clients surface that as\r\n * an empty result rather than an error - which looks exactly like \"no auctions\r\n * exist\". Discovery always chunks.\r\n */\r\nexport const DEFAULT_LOG_CHUNK_SIZE = 50_000n;\r\n\r\n/** `address(0)` - the currency sentinel meaning native ETH. */\r\nexport const NATIVE_CURRENCY: Address = \"0x0000000000000000000000000000000000000000\";\r\n\r\n/**\r\n * Canonical Permit2, deployed at the same address on every chain.\r\n *\r\n * ERC-20 bids do NOT approve the auction. `ContinuousClearingAuction.submitBid`\r\n * pulls the bid currency with `SafeTransferLib.permit2TransferFrom`, which\r\n * calls Permit2's `transferFrom(from,to,uint160,token)`. A bidder therefore\r\n * needs an ERC-20 approval to THIS address, plus a Permit2 allowance naming the\r\n * auction as spender. Matches solady's `SafeTransferLib.PERMIT2`.\r\n */\r\nexport const PERMIT2_ADDRESS: Address = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\";\r\n","/**\r\n * Minimal ERC-20 metadata reads.\r\n *\r\n * CCA auctions are NOT always denominated in native ETH - the auctions live on\r\n * Sepolia today bid in an ERC-20. Anything that shows an amount to a human has\r\n * to show the real symbol and scale by the real decimals, so this lives in the\r\n * SDK and every surface (bot, widget, directory, agent) uses it.\r\n */\r\nimport { formatUnits } from \"viem\";\r\nimport type { Address } from \"viem\";\r\nimport type { BeaconClient } from \"./client\";\r\nimport { NATIVE_CURRENCY } from \"./constants\";\r\n\r\n/** ERC-20 reads Beacon needs. Hand-written because it is the standard, not a CCA ABI. */\r\nexport const erc20MetadataAbi = [\r\n { type: \"function\", name: \"symbol\", inputs: [], outputs: [{ type: \"string\" }], stateMutability: \"view\" },\r\n { type: \"function\", name: \"name\", inputs: [], outputs: [{ type: \"string\" }], stateMutability: \"view\" },\r\n { type: \"function\", name: \"decimals\", inputs: [], outputs: [{ type: \"uint8\" }], stateMutability: \"view\" },\r\n] as const;\r\n\r\nexport interface TokenMetadata {\r\n address: Address;\r\n symbol: string;\r\n name: string;\r\n decimals: number;\r\n /** True when this is the chain's native currency rather than an ERC-20. */\r\n isNative: boolean;\r\n}\r\n\r\n/**\r\n * Read a currency's symbol, name and decimals.\r\n *\r\n * `address(0)` is the CCA sentinel for native currency, and resolves to the\r\n * chain's own native currency rather than an on-chain call.\r\n *\r\n * Tolerant by design: a token that omits `symbol`/`name` (or returns bytes32\r\n * instead of string) still yields usable metadata rather than throwing, because\r\n * failing to render an alert is worse than rendering a shortened address.\r\n */\r\nexport async function getTokenMetadata(\r\n client: BeaconClient,\r\n address: Address,\r\n): Promise<TokenMetadata> {\r\n if (address === NATIVE_CURRENCY) {\r\n const native = client.chain.nativeCurrency;\r\n return {\r\n address,\r\n symbol: native.symbol,\r\n name: native.name,\r\n decimals: native.decimals,\r\n isNative: true,\r\n };\r\n }\r\n\r\n const contract = { address, abi: erc20MetadataAbi } as const;\r\n const [symbol, name, decimals] = await client.publicClient.multicall({\r\n allowFailure: true,\r\n contracts: [\r\n { ...contract, functionName: \"symbol\" },\r\n { ...contract, functionName: \"name\" },\r\n { ...contract, functionName: \"decimals\" },\r\n ],\r\n });\r\n\r\n return {\r\n address,\r\n symbol: symbol.status === \"success\" ? symbol.result : shortAddress(address),\r\n name: name.status === \"success\" ? name.result : shortAddress(address),\r\n // 18 is the overwhelmingly common default; better than refusing to render.\r\n decimals: decimals.status === \"success\" ? Number(decimals.result) : 18,\r\n isNative: false,\r\n };\r\n}\r\n\r\n/** Read metadata for several currencies at once, de-duplicated by address. */\r\nexport async function getTokenMetadataBatch(\r\n client: BeaconClient,\r\n addresses: readonly Address[],\r\n): Promise<Map<Address, TokenMetadata>> {\r\n const unique = [...new Set(addresses)];\r\n const entries = await Promise.all(\r\n unique.map(async (address) => [address, await getTokenMetadata(client, address)] as const),\r\n );\r\n return new Map(entries);\r\n}\r\n\r\n/**\r\n * Render a raw token amount with its symbol, e.g. `\"1,000 BEACON\"`.\r\n *\r\n * A nonzero amount is NEVER rendered as \"0\". Real CCA test auctions raise\r\n * amounts like 52 wei, and truncating those to \"0 ETH\" makes a live auction\r\n * look dead. When an amount is too small for `maxFractionDigits`, the output\r\n * widens to show four significant digits instead.\r\n *\r\n * @param maxFractionDigits Fractional digits to keep for ordinary amounts.\r\n */\r\nexport function formatTokenAmount(\r\n amount: bigint,\r\n token: Pick<TokenMetadata, \"symbol\" | \"decimals\">,\r\n maxFractionDigits = 4,\r\n): string {\r\n if (amount === 0n) return `0 ${token.symbol}`;\r\n\r\n const negative = amount < 0n;\r\n const whole = formatUnits(negative ? -amount : amount, token.decimals);\r\n const [integerPart = \"0\", fractionalPart = \"\"] = whole.split(\".\");\r\n\r\n const grouped = BigInt(integerPart).toLocaleString(\"en-US\");\r\n let trimmed = fractionalPart.slice(0, maxFractionDigits).replace(/0+$/, \"\");\r\n\r\n // Too small to show at the requested precision: widen rather than say \"0\".\r\n if (integerPart === \"0\" && trimmed.length === 0) {\r\n const firstSignificant = fractionalPart.search(/[1-9]/);\r\n if (firstSignificant !== -1) {\r\n trimmed = fractionalPart.slice(0, firstSignificant + 4).replace(/0+$/, \"\");\r\n }\r\n }\r\n\r\n const sign = negative ? \"-\" : \"\";\r\n return trimmed.length > 0\r\n ? `${sign}${grouped}.${trimmed} ${token.symbol}`\r\n : `${sign}${grouped} ${token.symbol}`;\r\n}\r\n\r\nfunction shortAddress(address: Address): string {\r\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\r\n}\r\n","// GENERATED FILE - DO NOT EDIT.\n// Source: Uniswap/continuous-clearing-auction @ v1.1.0 (a0aabaa45d8677a4944fc04d5dea2c4b499b3d3a)\n// Contract: ContinuousClearingAuction\n// Regenerate with: ./contracts/sync-abis.sh\n\nexport const auctionAbi = [{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_totalSupply\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_parameters\",\"type\":\"tuple\",\"internalType\":\"struct AuctionParameters\",\"components\":[{\"name\":\"currency\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokensRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fundsRecipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"startBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"claimBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tickSpacing\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validationHook\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"floorPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requiredCurrencyRaised\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"auctionStepsData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_BID_PRICE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_BLOCK_NUMBER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TICK_PTR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bids\",\"inputs\":[{\"name\":\"bidId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Bid\",\"components\":[{\"name\":\"startBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startCumulativeMps\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"exitedBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountQ96\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokensFilled\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Checkpoint\",\"components\":[{\"name\":\"clearingPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currencyRaisedAtClearingPriceQ96_X7\",\"type\":\"uint256\",\"internalType\":\"ValueX7\"},{\"name\":\"cumulativeMpsPerPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cumulativeMps\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"prev\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"next\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Checkpoint\",\"components\":[{\"name\":\"clearingPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currencyRaisedAtClearingPriceQ96_X7\",\"type\":\"uint256\",\"internalType\":\"ValueX7\"},{\"name\":\"cumulativeMpsPerPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cumulativeMps\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"prev\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"next\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimTokens\",\"inputs\":[{\"name\":\"_bidId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimTokensBatch\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_bidIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearingPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currency\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currencyRaised\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currencyRaisedQ96_X7\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"ValueX7\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"endBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exitBid\",\"inputs\":[{\"name\":\"_bidId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"exitPartiallyFilledBid\",\"inputs\":[{\"name\":\"_bidId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_lastFullyFilledCheckpointBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_outbidBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"floorPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceIterateOverTicks\",\"inputs\":[{\"name\":\"_untilTickPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"fundsRecipient\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isGraduated\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lastCheckpointedBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Checkpoint\",\"components\":[{\"name\":\"clearingPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currencyRaisedAtClearingPriceQ96_X7\",\"type\":\"uint256\",\"internalType\":\"ValueX7\"},{\"name\":\"cumulativeMpsPerPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"cumulativeMps\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"prev\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"next\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lbpInitializationParams\",\"inputs\":[],\"outputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"struct LBPInitializationParams\",\"components\":[{\"name\":\"initialPriceX96\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokensSold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currencyRaised\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextActiveTickPrice\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextBidId\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onTokensReceived\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pointer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"step\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct AuctionStep\",\"components\":[{\"name\":\"mps\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"startBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitBid\",\"inputs\":[{\"name\":\"_maxPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_hookData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"submitBid\",\"inputs\":[{\"name\":\"_maxPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_prevTickPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_hookData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sumCurrencyDemandAboveClearingQ96\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"sweepCurrency\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sweepCurrencyBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sweepUnsoldTokens\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sweepUnsoldTokensBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tickSpacing\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ticks\",\"inputs\":[{\"name\":\"price\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"struct Tick\",\"components\":[{\"name\":\"next\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"currencyDemandQ96\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"token\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"tokensRecipient\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalCleared\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalClearedQ96_X7\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"ValueX7\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validationHook\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contract IValidationHook\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AuctionStepRecorded\",\"inputs\":[{\"name\":\"startBlock\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endBlock\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"mps\",\"type\":\"uint24\",\"indexed\":false,\"internalType\":\"uint24\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidExited\",\"inputs\":[{\"name\":\"bidId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokensFilled\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"currencyRefunded\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BidSubmitted\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"price\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointUpdated\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"clearingPrice\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"cumulativeMps\",\"type\":\"uint24\",\"indexed\":false,\"internalType\":\"uint24\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClearingPriceUpdated\",\"inputs\":[{\"name\":\"blockNumber\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"clearingPrice\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CurrencySwept\",\"inputs\":[{\"name\":\"fundsRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currencyAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NextActiveTickUpdated\",\"inputs\":[{\"name\":\"price\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TickInitialized\",\"inputs\":[{\"name\":\"price\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensClaimed\",\"inputs\":[{\"name\":\"bidId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokensFilled\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensReceived\",\"inputs\":[{\"name\":\"totalSupply\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensSwept\",\"inputs\":[{\"name\":\"tokensRecipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokensAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AuctionIsNotFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AuctionIsNotOver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AuctionIsOver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AuctionNotStarted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"AuctionSoldOut\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BatchClaimDifferentOwner\",\"inputs\":[{\"name\":\"expectedOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"receivedOwner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"BidAlreadyExited\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidAmountTooSmall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidIdDoesNotExist\",\"inputs\":[{\"name\":\"bidId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"BidMustBeAboveClearingPrice\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidNotExited\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BidOwnerCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotExitBid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotPartiallyExitBidBeforeEndBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotPartiallyExitBidBeforeGraduation\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotSweepCurrency\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotSweepTokens\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotUpdateUninitializedTick\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointBlockNotIncreasing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ClaimBlockIsBeforeEndBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrencyIsNotNative\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC20TransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FloorPriceAndTickSpacingGreaterThanMaxBidPrice\",\"inputs\":[{\"name\":\"nextTick\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxBidPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"FloorPriceAndTickSpacingTooLarge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FloorPriceIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FloorPriceTooLow\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FundsRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAuctionDataLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBidPriceTooHigh\",\"inputs\":[{\"name\":\"maxPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxBidPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBidUnableToClear\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEndBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEndBlockGivenStepData\",\"inputs\":[{\"name\":\"actualEndBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"expectedEndBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidLastFullyFilledCheckpointHint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOutbidBlockCheckpointHint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStepDataMps\",\"inputs\":[{\"name\":\"actualMps\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expectedMps\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidTickPrice\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenAmountReceived\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MpsRemainingIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NativeTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotClaimable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotGraduated\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Reentrancy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StepBlockDeltaCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StepLib__InvalidOffsetNotAtStepBoundary\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StepLib__InvalidOffsetTooLarge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TickHintMustBeGreaterThanNextActiveTickPrice\",\"inputs\":[{\"name\":\"tickPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nextActiveTickPrice\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TickNotInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TickPreviousPriceInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TickPriceNotAtBoundary\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TickPriceNotIncreasing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TickSpacingTooSmall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokenAndCurrencyCannotBeTheSame\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokenIsAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokenTransferFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokensNotReceived\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokensRecipientIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSupplyIsTooLarge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TotalSupplyIsZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidationHookCallFailed\",\"inputs\":[{\"name\":\"reason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}] as const;\n","// GENERATED FILE - DO NOT EDIT.\n// Source: Uniswap/continuous-clearing-auction @ v1.1.0 (a0aabaa45d8677a4944fc04d5dea2c4b499b3d3a)\n// Contract: ContinuousClearingAuctionFactory\n// Regenerate with: ./contracts/sync-abis.sh\n\nexport const factoryAbi = [{\"type\":\"function\",\"name\":\"getAuctionAddress\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"configData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initializeDistribution\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"configData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"distributionContract\",\"type\":\"address\",\"internalType\":\"contract IDistributionContract\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuctionCreated\",\"inputs\":[{\"name\":\"auction\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"configData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidTokenAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}] as const;\n","/**\r\n * Read wrappers around `AuctionStateLens` and the auction's own view functions.\r\n *\r\n * Two things here are non-obvious, and are the reason this lives in the SDK\r\n * rather than being reimplemented per app:\r\n *\r\n * 1. `AuctionStateLens.state()` is NOT a view function. It calls the\r\n * state-mutating `auction.checkpoint()` and returns its result by reverting\r\n * with ABI-encoded data. It therefore has to be invoked with `eth_call`\r\n * semantics; a plain `readContract` fails.\r\n *\r\n * 2. Uniswap publishes no canonical lens address on any network. Rather than\r\n * forcing every user to deploy one, Beacon can inject the lens bytecode into\r\n * a single `eth_call` via a state override, so reads work against a bare RPC\r\n * with no deployment and no funded wallet. Set `lensAddress` on the client\r\n * to use a real deployed lens instead.\r\n */\r\nimport { decodeFunctionResult, encodeFunctionData } from \"viem\";\r\nimport type { Address } from \"viem\";\r\nimport { auctionAbi, auctionStateLensAbi, auctionStateLensDeployedBytecode } from \"./abis\";\r\nimport type { BeaconClient } from \"./client\";\r\nimport { formatQ96, mpsToFraction } from \"./q96\";\r\nimport type { AuctionInfo, AuctionState, AuctionStatus, AuctionSummary, Checkpoint } from \"./types\";\r\n\r\n/**\r\n * Address the lens bytecode is injected at when no deployed lens is configured.\r\n * Arbitrary and unused on-chain: it only has to be an address nothing else\r\n * occupies for the duration of the call. Must be EIP-55 checksummed - viem\r\n * rejects a mixed-case address whose checksum does not validate.\r\n */\r\nexport const LENS_OVERRIDE_ADDRESS: Address = \"0x00000000000000000000000000000000BEAC0E75\";\r\n\r\n/** Shape `decodeFunctionResult` produces for the lens's `AuctionState` tuple. */\r\ntype RawAuctionState = {\r\n checkpoint: {\r\n clearingPrice: bigint;\r\n currencyRaisedAtClearingPriceQ96_X7: bigint;\r\n cumulativeMpsPerPrice: bigint;\r\n cumulativeMps: number;\r\n prev: bigint;\r\n next: bigint;\r\n };\r\n currencyRaised: bigint;\r\n totalCleared: bigint;\r\n isGraduated: boolean;\r\n};\r\n\r\nfunction toCheckpoint(raw: RawAuctionState[\"checkpoint\"]): Checkpoint {\r\n return {\r\n clearingPriceQ96: raw.clearingPrice,\r\n currencyRaisedAtClearingPriceQ96X7: raw.currencyRaisedAtClearingPriceQ96_X7,\r\n cumulativeMpsPerPrice: raw.cumulativeMpsPerPrice,\r\n cumulativeMps: Number(raw.cumulativeMps),\r\n prevBlock: BigInt(raw.prev),\r\n nextBlock: BigInt(raw.next),\r\n };\r\n}\r\n\r\n/**\r\n * Read an auction's live state through `AuctionStateLens.state()`.\r\n *\r\n * This is the freshest possible view: the lens checkpoints the auction inside\r\n * the simulated call, so the clearing price reflects the current block rather\r\n * than the last block someone happened to bid in.\r\n */\r\nexport async function getAuctionState(client: BeaconClient, auction: Address): Promise<AuctionState> {\r\n const data = encodeFunctionData({\r\n abi: auctionStateLensAbi,\r\n functionName: \"state\",\r\n args: [auction],\r\n });\r\n\r\n const useOverride = client.lensAddress === undefined;\r\n const target = client.lensAddress ?? LENS_OVERRIDE_ADDRESS;\r\n\r\n const { data: returnData } = await client.publicClient.call({\r\n to: target,\r\n data,\r\n ...(useOverride\r\n ? {\r\n stateOverride: [\r\n { address: LENS_OVERRIDE_ADDRESS, code: auctionStateLensDeployedBytecode },\r\n ],\r\n }\r\n : {}),\r\n });\r\n\r\n if (!returnData) {\r\n throw new Error(\r\n `AuctionStateLens.state(${auction}) returned no data. ` +\r\n `Is ${auction} really a ContinuousClearingAuction on ${client.chain.name}?`,\r\n );\r\n }\r\n\r\n const raw = decodeFunctionResult({\r\n abi: auctionStateLensAbi,\r\n functionName: \"state\",\r\n data: returnData,\r\n }) as unknown as RawAuctionState;\r\n\r\n return {\r\n checkpoint: toCheckpoint(raw.checkpoint),\r\n currencyRaised: raw.currencyRaised,\r\n totalCleared: raw.totalCleared,\r\n isGraduated: raw.isGraduated,\r\n };\r\n}\r\n\r\n/**\r\n * Read an auction's static configuration in a single multicall.\r\n * These values never change, so callers can cache them freely.\r\n */\r\nexport async function getAuctionInfo(client: BeaconClient, auction: Address): Promise<AuctionInfo> {\r\n const contract = { address: auction, abi: auctionAbi } as const;\r\n\r\n const [token, currency, totalSupply, startBlock, endBlock, floorPrice, tickSpacing] =\r\n await client.publicClient.multicall({\r\n allowFailure: false,\r\n contracts: [\r\n { ...contract, functionName: \"token\" },\r\n { ...contract, functionName: \"currency\" },\r\n { ...contract, functionName: \"totalSupply\" },\r\n { ...contract, functionName: \"startBlock\" },\r\n { ...contract, functionName: \"endBlock\" },\r\n { ...contract, functionName: \"floorPrice\" },\r\n { ...contract, functionName: \"tickSpacing\" },\r\n ],\r\n });\r\n\r\n return {\r\n auction,\r\n token,\r\n currency,\r\n totalSupply,\r\n startBlock: BigInt(startBlock),\r\n endBlock: BigInt(endBlock),\r\n floorPriceQ96: floorPrice,\r\n tickSpacing,\r\n };\r\n}\r\n\r\n/** The auction's current clearing price, Q96-encoded. A cheap `view` read. */\r\nexport async function getClearingPrice(client: BeaconClient, auction: Address): Promise<bigint> {\r\n return client.publicClient.readContract({\r\n address: auction,\r\n abi: auctionAbi,\r\n functionName: \"clearingPrice\",\r\n });\r\n}\r\n\r\n/** Whether the auction has raised enough to seed the pool. */\r\nexport async function isGraduated(client: BeaconClient, auction: Address): Promise<boolean> {\r\n return client.publicClient.readContract({\r\n address: auction,\r\n abi: auctionAbi,\r\n functionName: \"isGraduated\",\r\n });\r\n}\r\n\r\n/** Derive an auction's lifecycle position from the current block. */\r\nexport function deriveStatus(info: AuctionInfo, blockNumber: bigint): AuctionStatus {\r\n if (blockNumber < info.startBlock) return \"pending\";\r\n if (blockNumber <= info.endBlock) return \"live\";\r\n return \"ended\";\r\n}\r\n\r\n/**\r\n * Everything a UI needs about one auction, with the derived values (status,\r\n * progress, time remaining) computed once here instead of in each app.\r\n */\r\nexport async function getAuctionSummary(\r\n client: BeaconClient,\r\n auction: Address,\r\n options: { info?: AuctionInfo; blockNumber?: bigint } = {},\r\n): Promise<AuctionSummary> {\r\n const [info, state, blockNumber] = await Promise.all([\r\n options.info ?? getAuctionInfo(client, auction),\r\n getAuctionState(client, auction),\r\n options.blockNumber ?? client.publicClient.getBlockNumber(),\r\n ]);\r\n\r\n const status = deriveStatus(info, blockNumber);\r\n const blocksRemaining =\r\n status === \"pending\"\r\n ? info.startBlock - blockNumber\r\n : status === \"live\"\r\n ? info.endBlock - blockNumber\r\n : 0n;\r\n\r\n return {\r\n info,\r\n state,\r\n blockNumber,\r\n status,\r\n clearingPrice: formatQ96(state.checkpoint.clearingPriceQ96),\r\n supplyScheduleProgress: mpsToFraction(state.checkpoint.cumulativeMps),\r\n hasClearedSupply: state.totalCleared > 0n,\r\n blocksRemaining,\r\n secondsRemaining: Number(blocksRemaining) * client.blockTimeSeconds,\r\n };\r\n}\r\n\r\n/** A summary that failed to load, so one bad auction cannot blank a directory page. */\r\nexport interface FailedAuctionSummary {\r\n auction: Address;\r\n error: Error;\r\n}\r\n\r\nexport function isFailedSummary(\r\n result: AuctionSummary | FailedAuctionSummary,\r\n): result is FailedAuctionSummary {\r\n return \"error\" in result;\r\n}\r\n\r\n/**\r\n * Summarise many auctions with bounded concurrency, so a directory page listing\r\n * dozens of auctions does not open dozens of simultaneous RPC calls.\r\n */\r\nexport async function getAuctionSummaries(\r\n client: BeaconClient,\r\n auctions: readonly Address[],\r\n options: { concurrency?: number } = {},\r\n): Promise<(AuctionSummary | FailedAuctionSummary)[]> {\r\n const concurrency = options.concurrency ?? 5;\r\n const blockNumber = await client.publicClient.getBlockNumber();\r\n const results: (AuctionSummary | FailedAuctionSummary)[] = [];\r\n\r\n for (let i = 0; i < auctions.length; i += concurrency) {\r\n const batch = auctions.slice(i, i + concurrency);\r\n const settled = await Promise.all(\r\n batch.map(async (auction) => {\r\n try {\r\n return await getAuctionSummary(client, auction, { blockNumber });\r\n } catch (error) {\r\n return { auction, error: error as Error };\r\n }\r\n }),\r\n );\r\n results.push(...settled);\r\n }\r\n\r\n return results;\r\n}\r\n\n/**\n * The cheap, batchable slice of live state used by directory list views.\n *\n * Every field here is a `view` function on the auction, so a whole page of\n * auctions resolves in one multicall - no lens, no per-auction round trips.\n * Use {@link getAuctionState} when you need the freshest checkpointed state.\n */\nexport interface AuctionListState {\n auction: Address;\n clearingPriceQ96: bigint;\n isGraduated: boolean;\n currencyRaised: bigint;\n totalCleared: bigint;\n}\n\n/** Read {@link AuctionListState} for many auctions in a single multicall. */\nexport async function getAuctionListStates(\n client: BeaconClient,\n auctions: readonly Address[],\n): Promise<Map<Address, AuctionListState>> {\n const result = new Map<Address, AuctionListState>();\n if (auctions.length === 0) return result;\n\n const contracts = auctions.flatMap((auction) => {\n const base = { address: auction, abi: auctionAbi } as const;\n return [\n { ...base, functionName: \"clearingPrice\" },\n { ...base, functionName: \"isGraduated\" },\n { ...base, functionName: \"currencyRaised\" },\n { ...base, functionName: \"totalCleared\" },\n ];\n });\n\n // allowFailure: one broken auction must not blank the whole page.\n const responses = await client.publicClient.multicall({ allowFailure: true, contracts });\n\n auctions.forEach((auction, index) => {\n const [price, graduated, raised, cleared] = responses.slice(index * 4, index * 4 + 4);\n if (price?.status !== \"success\") return;\n result.set(auction, {\n auction,\n clearingPriceQ96: price.result as bigint,\n isGraduated: graduated?.status === \"success\" ? (graduated.result as boolean) : false,\n currencyRaised: raised?.status === \"success\" ? (raised.result as bigint) : 0n,\n totalCleared: cleared?.status === \"success\" ? (cleared.result as bigint) : 0n,\n });\n });\n\n return result;\n}\n","/**\n * Fill in the immutable detail the directory needs, once, and cache it.\n *\n * An auction's configuration (start/end block, token, currency, supply, floor\n * price) and its token/currency metadata (symbol, decimals) can never change.\n * Reading them on every page load would be hundreds of wasted RPC calls, so\n * they are fetched once here and persisted by the store.\n */\nimport { getTokenMetadata } from \"./erc20\";\nimport { getAuctionInfo } from \"./read\";\nimport type { BeaconClient } from \"./client\";\nimport type { TokenMetadata } from \"./erc20\";\nimport type { AuctionRecord, AuctionStore } from \"./store\";\nimport type { Address } from \"./types\";\n\nexport interface EnrichResult {\n enriched: number;\n alreadyComplete: number;\n failed: number;\n total: number;\n}\n\nexport async function enrichStore(\n client: BeaconClient,\n store: AuctionStore,\n options: { concurrency?: number; onProgress?: (message: string) => void } = {},\n): Promise<EnrichResult> {\n const snapshot = await store.read();\n if (!snapshot) {\n return { enriched: 0, alreadyComplete: 0, failed: 0, total: 0 };\n }\n\n const needsWork = snapshot.auctions.filter(\n (record) => !record.info || !record.tokenMeta || !record.currencyMeta,\n );\n const alreadyComplete = snapshot.auctions.length - needsWork.length;\n\n if (needsWork.length === 0) {\n return { enriched: 0, alreadyComplete, failed: 0, total: snapshot.auctions.length };\n }\n\n options.onProgress?.(\n `${needsWork.length} auction(s) need enrichment, ${alreadyComplete} already complete`,\n );\n\n // Token metadata repeats across auctions, so resolve each address once.\n const metadataCache = new Map<string, TokenMetadata>();\n const metadata = async (address: Address): Promise<TokenMetadata> => {\n const key = address.toLowerCase();\n const cached = metadataCache.get(key);\n if (cached) return cached;\n const fetched = await getTokenMetadata(client, address);\n metadataCache.set(key, fetched);\n return fetched;\n };\n\n const concurrency = options.concurrency ?? 5;\n const updated: AuctionRecord[] = [];\n let failed = 0;\n\n for (let i = 0; i < needsWork.length; i += concurrency) {\n const batch = needsWork.slice(i, i + concurrency);\n const settled = await Promise.all(\n batch.map(async (record): Promise<AuctionRecord | null> => {\n try {\n const info = record.info ?? (await getAuctionInfo(client, record.auction));\n const [tokenMeta, currencyMeta] = await Promise.all([\n record.tokenMeta ?? metadata(info.token),\n record.currencyMeta ?? metadata(info.currency),\n ]);\n return { ...record, info, tokenMeta, currencyMeta };\n } catch {\n return null;\n }\n }),\n );\n\n for (const record of settled) {\n if (record) updated.push(record);\n else failed++;\n }\n\n options.onProgress?.(\n `enriched ${updated.length}/${needsWork.length}${failed > 0 ? ` (${failed} failed)` : \"\"}`,\n );\n }\n\n if (updated.length > 0) {\n await store.merge({\n chainId: snapshot.chainId,\n factoryAddress: snapshot.factoryAddress,\n lastSyncedBlock: snapshot.lastSyncedBlock,\n auctions: updated,\n });\n }\n\n return {\n enriched: updated.length,\n alreadyComplete,\n failed,\n total: snapshot.auctions.length,\n };\n}\n","/**\n * A durable record of discovered auctions, plus their immutable configuration.\n *\n * Why this exists: discovery and state reads have incompatible RPC needs.\n *\n * - `eth_getLogs` over 1.5M blocks needs a provider that allows wide ranges.\n * Alchemy's free tier caps `eth_getLogs` at a TEN block range, which would be\n * ~153,000 requests for a full backfill.\n * - Public wide-range endpoints allow the range but are unreliable: an\n * identical query on ethereum-sepolia-rpc.publicnode.com returns the real\n * logs about half the time and an empty array the rest, silently. Four scans\n * of the same range returned 52, 60, 44 and 55 auctions.\n *\n * So the auction list is built up over repeated scans and persisted. The\n * directory then reads a complete list instantly instead of re-scanning the\n * chain (and re-rolling that dice) on every page load.\n *\n * The store also caches each auction's IMMUTABLE data - start/end block, token,\n * currency, supply, floor price, and the token/currency symbol and decimals.\n * None of that can change, and caching it means the directory can render status\n * badges and currency labels for every auction with zero RPC calls. Only live\n * state (clearing price, amount raised, graduated) is read from chain.\n *\n * Storage is a JSON file. For the ~130 auctions that exist this is simpler than\n * SQLite and needs no native module, which matters on Windows where pnpm blocks\n * build scripts by default. `AuctionStore` is an interface so a SQLite or\n * Postgres implementation can replace it without touching callers.\n */\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Address } from \"viem\";\nimport type { TokenMetadata } from \"./erc20\";\nimport type { AuctionInfo, DiscoveredAuction } from \"./types\";\n\n/** A discovered auction plus whatever immutable detail has been cached for it. */\nexport interface AuctionRecord extends DiscoveredAuction {\n info?: AuctionInfo;\n tokenMeta?: TokenMetadata;\n currencyMeta?: TokenMetadata;\n}\n\nexport interface AuctionStoreSnapshot {\n chainId: number;\n factoryAddress: Address;\n /** Highest block that has been scanned. Discovery resumes from here. */\n lastSyncedBlock: bigint;\n auctions: AuctionRecord[];\n}\n\nexport interface StoreUpdate {\n chainId: number;\n factoryAddress: Address;\n lastSyncedBlock: bigint;\n auctions: readonly AuctionRecord[];\n}\n\nexport interface AuctionStore {\n read(): Promise<AuctionStoreSnapshot | undefined>;\n /** Merge new auctions in and advance the sync watermark. */\n merge(update: StoreUpdate): Promise<{ added: number; total: number }>;\n}\n\n// --- serialization ---------------------------------------------------------\n// bigints are not JSON, so every numeric field crosses as a decimal string.\n\ntype Serialized = Record<string, unknown>;\n\nfunction serializeInfo(info: AuctionInfo): Serialized {\n return {\n auction: info.auction,\n token: info.token,\n currency: info.currency,\n totalSupply: info.totalSupply.toString(),\n startBlock: info.startBlock.toString(),\n endBlock: info.endBlock.toString(),\n floorPriceQ96: info.floorPriceQ96.toString(),\n tickSpacing: info.tickSpacing.toString(),\n };\n}\n\nfunction deserializeInfo(raw: Serialized): AuctionInfo {\n return {\n auction: raw.auction as Address,\n token: raw.token as Address,\n currency: raw.currency as Address,\n totalSupply: BigInt(raw.totalSupply as string),\n startBlock: BigInt(raw.startBlock as string),\n endBlock: BigInt(raw.endBlock as string),\n floorPriceQ96: BigInt(raw.floorPriceQ96 as string),\n tickSpacing: BigInt(raw.tickSpacing as string),\n };\n}\n\nfunction serializeRecord(record: AuctionRecord): Serialized {\n return {\n auction: record.auction,\n token: record.token,\n amount: record.amount.toString(),\n configData: record.configData,\n blockNumber: record.blockNumber.toString(),\n transactionHash: record.transactionHash,\n logIndex: record.logIndex,\n ...(record.info ? { info: serializeInfo(record.info) } : {}),\n ...(record.tokenMeta ? { tokenMeta: record.tokenMeta } : {}),\n ...(record.currencyMeta ? { currencyMeta: record.currencyMeta } : {}),\n };\n}\n\nfunction deserializeRecord(raw: Serialized): AuctionRecord {\n return {\n auction: raw.auction as Address,\n token: raw.token as Address,\n amount: BigInt(raw.amount as string),\n configData: raw.configData as `0x${string}`,\n blockNumber: BigInt(raw.blockNumber as string),\n transactionHash: raw.transactionHash as `0x${string}`,\n logIndex: raw.logIndex as number,\n info: raw.info ? deserializeInfo(raw.info as Serialized) : undefined,\n tokenMeta: raw.tokenMeta as TokenMetadata | undefined,\n currencyMeta: raw.currencyMeta as TokenMetadata | undefined,\n };\n}\n\nfunction sortRecords(records: AuctionRecord[]): AuctionRecord[] {\n return records.sort((a, b) =>\n a.blockNumber === b.blockNumber\n ? a.logIndex - b.logIndex\n : a.blockNumber < b.blockNumber\n ? -1\n : 1,\n );\n}\n\n/**\n * Merge incoming records over existing ones without losing cached detail.\n * A plain discovery re-scan carries no `info`, and must not wipe it.\n */\nfunction mergeRecords(\n existing: readonly AuctionRecord[],\n incoming: readonly AuctionRecord[],\n): { merged: AuctionRecord[]; added: number } {\n const byAddress = new Map<string, AuctionRecord>();\n for (const record of existing) byAddress.set(record.auction.toLowerCase(), record);\n\n let added = 0;\n for (const record of incoming) {\n const key = record.auction.toLowerCase();\n const previous = byAddress.get(key);\n if (!previous) added++;\n byAddress.set(key, {\n ...previous,\n ...record,\n info: record.info ?? previous?.info,\n tokenMeta: record.tokenMeta ?? previous?.tokenMeta,\n currencyMeta: record.currencyMeta ?? previous?.currencyMeta,\n });\n }\n\n return { merged: sortRecords([...byAddress.values()]), added };\n}\n\n/** JSON-file backed store. */\nexport class JsonAuctionStore implements AuctionStore {\n constructor(private readonly filePath: string) {}\n\n async read(): Promise<AuctionStoreSnapshot | undefined> {\n let raw: string;\n try {\n raw = await readFile(this.filePath, \"utf8\");\n } catch {\n return undefined;\n }\n\n const parsed = JSON.parse(raw) as {\n chainId: number;\n factoryAddress: Address;\n lastSyncedBlock: string;\n auctions: Serialized[];\n };\n\n return {\n chainId: parsed.chainId,\n factoryAddress: parsed.factoryAddress,\n lastSyncedBlock: BigInt(parsed.lastSyncedBlock),\n auctions: sortRecords(parsed.auctions.map(deserializeRecord)),\n };\n }\n\n async merge(update: StoreUpdate): Promise<{ added: number; total: number }> {\n const existing = await this.read();\n\n // A store built against a different chain or factory is not ours to merge.\n if (\n existing &&\n (existing.chainId !== update.chainId ||\n existing.factoryAddress.toLowerCase() !== update.factoryAddress.toLowerCase())\n ) {\n throw new Error(\n `Auction store at ${this.filePath} holds chain ${existing.chainId}/${existing.factoryAddress}, ` +\n `refusing to merge chain ${update.chainId}/${update.factoryAddress}.`,\n );\n }\n\n const { merged, added } = mergeRecords(existing?.auctions ?? [], update.auctions);\n\n // Never move the watermark backwards - a partial re-scan must not cause a\n // later sync to skip blocks it has not actually covered.\n const watermark =\n existing && existing.lastSyncedBlock > update.lastSyncedBlock\n ? existing.lastSyncedBlock\n : update.lastSyncedBlock;\n\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(\n this.filePath,\n JSON.stringify(\n {\n chainId: update.chainId,\n factoryAddress: update.factoryAddress,\n lastSyncedBlock: watermark.toString(),\n auctions: merged.map(serializeRecord),\n },\n null,\n 2,\n ) + \"\\n\",\n \"utf8\",\n );\n\n return { added, total: merged.length };\n }\n}\n\n/** In-memory store, for tests. */\nexport class MemoryAuctionStore implements AuctionStore {\n private snapshot: AuctionStoreSnapshot | undefined;\n\n async read(): Promise<AuctionStoreSnapshot | undefined> {\n return this.snapshot;\n }\n\n async merge(update: StoreUpdate): Promise<{ added: number; total: number }> {\n const { merged, added } = mergeRecords(this.snapshot?.auctions ?? [], update.auctions);\n const watermark =\n this.snapshot && this.snapshot.lastSyncedBlock > update.lastSyncedBlock\n ? this.snapshot.lastSyncedBlock\n : update.lastSyncedBlock;\n\n this.snapshot = {\n chainId: update.chainId,\n factoryAddress: update.factoryAddress,\n lastSyncedBlock: watermark,\n auctions: merged,\n };\n return { added, total: merged.length };\n }\n}\n","/**\r\n * Auction discovery: finding every CCA auction ever deployed by scanning the\r\n * factory's `AuctionCreated` event.\r\n *\r\n * `eth_getLogs` MUST be chunked. Public Sepolia RPCs reject spans wider than\r\n * 50,000 blocks with `-32701: exceed maximum block range`, and some clients\r\n * report that as an empty result rather than an error, which looks exactly like\r\n * \"this factory has never created an auction\". Everything here chunks, and\r\n * halves the chunk size on failure rather than silently returning a short list.\r\n */\r\nimport { getAbiItem } from \"viem\";\r\nimport type { Address, Log } from \"viem\";\r\nimport { factoryAbi } from \"./abis\";\r\nimport type { BeaconClient } from \"./client\";\r\nimport { DEFAULT_LOG_CHUNK_SIZE } from \"./constants\";\r\nimport type { DiscoveredAuction } from \"./types\";\r\n\r\n/** The factory event that announces every new auction. */\r\nexport const auctionCreatedEvent = getAbiItem({ abi: factoryAbi, name: \"AuctionCreated\" });\r\n\r\nexport interface ScanOptions {\r\n /** First block to scan. Defaults to the factory's deploy block. */\r\n fromBlock?: bigint;\r\n /** Last block to scan. Defaults to the current head. */\r\n toBlock?: bigint;\r\n /** Blocks per `eth_getLogs` request. Defaults to 50,000. */\r\n chunkSize?: bigint;\r\n /**\r\n * Re-query a chunk that came back empty, this many times, before believing it.\r\n *\r\n * Some public RPCs (observed on ethereum-sepolia-rpc.publicnode.com) are load\r\n * balanced across backends with incomplete log indexes and answer an\r\n * identical `eth_getLogs` with either the real logs or an empty array, with no\r\n * error. That silently under-reports auctions. Re-querying an empty chunk\r\n * reduces the chance of believing a false empty, but CANNOT eliminate it -\r\n * the real fix is a reliable RPC endpoint. Defaults to 2.\r\n */\r\n emptyChunkRetries?: number;\r\n /**\r\n * Called when an empty chunk turned out to be a lie on retry. A caller seeing\r\n * these should switch RPC providers rather than trust the scan.\r\n */\r\n onAnomaly?: (anomaly: { fromBlock: bigint; toBlock: bigint; recoveredLogs: number }) => void;\r\n /** Called after each chunk, for progress reporting on long scans. */\r\n onProgress?: (progress: {\r\n fromBlock: bigint;\r\n toBlock: bigint;\r\n scannedTo: bigint;\r\n headBlock: bigint;\r\n found: number;\r\n }) => void;\r\n}\r\n\r\ntype AuctionCreatedLog = Log<bigint, number, false, typeof auctionCreatedEvent>;\r\n\r\nfunction toDiscoveredAuction(log: AuctionCreatedLog): DiscoveredAuction {\r\n const { auction, token, amount, configData } = log.args;\r\n\r\n // Indexed address args are always present on a well-formed log, but viem\r\n // types them optional because a filter could omit them.\r\n if (!auction || !token) {\r\n throw new Error(`Malformed AuctionCreated log in block ${log.blockNumber}: missing auction/token`);\r\n }\r\n\r\n return {\r\n auction,\r\n token,\r\n amount: amount ?? 0n,\r\n configData: configData ?? \"0x\",\r\n blockNumber: log.blockNumber,\r\n transactionHash: log.transactionHash,\r\n logIndex: log.logIndex,\r\n };\r\n}\r\n\r\n/**\r\n * Scan a block range for `AuctionCreated` events, chunked.\r\n *\r\n * Returns auctions in chain order (oldest first). On a chunk failure the chunk\r\n * size is halved and retried, so a stricter-than-expected RPC degrades into a\r\n * slower scan rather than a wrong answer.\r\n */\r\nexport async function scanAuctions(\r\n client: BeaconClient,\r\n options: ScanOptions = {},\r\n): Promise<DiscoveredAuction[]> {\r\n const headBlock = options.toBlock ?? (await client.publicClient.getBlockNumber());\r\n const startBlock = options.fromBlock ?? client.factoryDeployBlock;\r\n const maxChunk = options.chunkSize ?? DEFAULT_LOG_CHUNK_SIZE;\r\n\r\n if (startBlock > headBlock) return [];\r\n\r\n const emptyChunkRetries = options.emptyChunkRetries ?? 2;\r\n const found: DiscoveredAuction[] = [];\r\n let cursor = startBlock;\r\n let chunkSize = maxChunk;\r\n\r\n while (cursor <= headBlock) {\r\n const chunkEnd = min(cursor + chunkSize - 1n, headBlock);\r\n\r\n // Log scanning may use a different provider than state reads.\r\n const fetchChunk = async (from: bigint, to: bigint): Promise<AuctionCreatedLog[]> =>\r\n (await client.logsClient.getLogs({\r\n address: client.factoryAddress,\r\n event: auctionCreatedEvent,\r\n fromBlock: from,\r\n toBlock: to,\r\n })) as AuctionCreatedLog[];\r\n\r\n let logs: AuctionCreatedLog[];\r\n try {\r\n logs = await fetchChunk(cursor, chunkEnd);\r\n\r\n // An empty result from an unreliable endpoint may be a lie. Re-ask.\r\n for (let attempt = 0; logs.length === 0 && attempt < emptyChunkRetries; attempt++) {\r\n const retry = await fetchChunk(cursor, chunkEnd);\r\n if (retry.length > 0) {\r\n options.onAnomaly?.({\r\n fromBlock: cursor,\r\n toBlock: chunkEnd,\r\n recoveredLogs: retry.length,\r\n });\r\n logs = retry;\r\n }\r\n }\r\n } catch (error) {\r\n // Most likely a provider-specific range or response-size cap. Back off and\r\n // retry rather than losing auctions.\r\n if (chunkSize > 1n) {\r\n chunkSize = chunkSize / 2n;\r\n continue;\r\n }\r\n throw new Error(\r\n `eth_getLogs failed for a single block (${cursor}) on ${client.chain.name}: ${\r\n (error as Error).message\r\n }`,\r\n );\r\n }\r\n\r\n for (const log of logs) found.push(toDiscoveredAuction(log));\r\n\r\n options.onProgress?.({\r\n fromBlock: cursor,\r\n toBlock: chunkEnd,\r\n scannedTo: chunkEnd,\r\n headBlock,\r\n found: found.length,\r\n });\r\n\r\n cursor = chunkEnd + 1n;\r\n // Recover toward the configured chunk size after a successful request.\r\n if (chunkSize < maxChunk) chunkSize = min(chunkSize * 2n, maxChunk);\r\n }\r\n\r\n found.sort((a, b) =>\r\n a.blockNumber === b.blockNumber\r\n ? a.logIndex - b.logIndex\r\n : a.blockNumber < b.blockNumber\r\n ? -1\r\n : 1,\r\n );\r\n\r\n return found;\r\n}\r\n\r\n/**\r\n * Watch for auctions created from now on.\r\n *\r\n * Polls rather than subscribing, so it works over plain HTTP RPC with no\r\n * WebSocket endpoint. Returns an unwatch function.\r\n */\r\nexport function watchAuctions(\r\n client: BeaconClient,\r\n onAuction: (auction: DiscoveredAuction) => void,\r\n options: { pollingIntervalMs?: number; onError?: (error: Error) => void } = {},\r\n): () => void {\r\n return client.logsClient.watchEvent({\r\n address: client.factoryAddress,\r\n event: auctionCreatedEvent,\r\n poll: true,\r\n pollingInterval: options.pollingIntervalMs ?? 12_000,\r\n onError: options.onError,\r\n onLogs: (logs) => {\r\n for (const log of logs as AuctionCreatedLog[]) {\r\n try {\r\n onAuction(toDiscoveredAuction(log));\r\n } catch (error) {\r\n options.onError?.(error as Error);\r\n }\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Auctions created for a specific token.\r\n * Uses an indexed-topic filter so the RPC does the work, not the client.\r\n */\r\nexport async function scanAuctionsForToken(\r\n client: BeaconClient,\r\n token: Address,\r\n options: ScanOptions = {},\r\n): Promise<DiscoveredAuction[]> {\r\n const all = await scanAuctions(client, options);\r\n return all.filter((entry) => entry.token.toLowerCase() === token.toLowerCase());\r\n}\r\n\r\nfunction min(a: bigint, b: bigint): bigint {\r\n return a < b ? a : b;\r\n}\r\n","/**\n * Keeping the auction store up to date.\n *\n * `syncAuctions` scans forward from the store's watermark and merges what it\n * finds. Because the store merges rather than replaces, running it repeatedly\n * against an unreliable endpoint converges on the true set: each pass can only\n * add auctions, never lose ones already recorded.\n */\nimport { scanAuctions } from \"./discover\";\nimport type { BeaconClient } from \"./client\";\nimport type { AuctionStore } from \"./store\";\nimport type { DiscoveredAuction } from \"./types\";\n\nexport interface SyncOptions {\n /**\n * Re-scan from the factory deploy block rather than the store's watermark.\n * Use when converging a list built on an unreliable RPC.\n */\n full?: boolean;\n /** Blocks per getLogs request. */\n chunkSize?: bigint;\n /** How many times to re-scan the range in one call, unioning results. */\n passes?: number;\n onProgress?: (message: string) => void;\n}\n\nexport interface SyncResult {\n added: number;\n total: number;\n scannedFrom: bigint;\n scannedTo: bigint;\n anomalies: number;\n passes: number;\n}\n\nexport async function syncAuctions(\n client: BeaconClient,\n store: AuctionStore,\n options: SyncOptions = {},\n): Promise<SyncResult> {\n const head = await client.publicClient.getBlockNumber();\n const existing = await store.read();\n const passes = Math.max(1, options.passes ?? 1);\n\n const from =\n options.full || !existing\n ? client.factoryDeployBlock\n : // Re-scan the last block already covered, in case it was mid-block.\n existing.lastSyncedBlock;\n\n if (from > head) {\n return {\n added: 0,\n total: existing?.auctions.length ?? 0,\n scannedFrom: from,\n scannedTo: head,\n anomalies: 0,\n passes: 0,\n };\n }\n\n let anomalies = 0;\n const union = new Map<string, DiscoveredAuction>();\n\n for (let pass = 1; pass <= passes; pass++) {\n options.onProgress?.(`pass ${pass}/${passes}: scanning ${from} -> ${head}`);\n\n const found = await scanAuctions(client, {\n fromBlock: from,\n toBlock: head,\n chunkSize: options.chunkSize,\n onAnomaly: () => {\n anomalies++;\n },\n });\n\n let newThisPass = 0;\n for (const auction of found) {\n const key = auction.auction.toLowerCase();\n if (!union.has(key)) newThisPass++;\n union.set(key, auction);\n }\n\n options.onProgress?.(\n `pass ${pass}/${passes}: ${found.length} found, ${newThisPass} new (union ${union.size})`,\n );\n }\n\n const { added, total } = await store.merge({\n chainId: client.chainId,\n factoryAddress: client.factoryAddress,\n lastSyncedBlock: head,\n auctions: [...union.values()],\n });\n\n return { added, total, scannedFrom: from, scannedTo: head, anomalies, passes };\n}\n\n/**\n * Read the auction list, preferring the store and falling back to a live scan.\n *\n * This is what the directory uses. A cached list is correct because auctions are\n * append-only; only very recently created auctions could be missing, which the\n * next sync picks up.\n */\nexport async function loadAuctions(\n client: BeaconClient,\n store: AuctionStore | undefined,\n options: { fallbackToScan?: boolean } = {},\n): Promise<{ auctions: DiscoveredAuction[]; source: \"store\" | \"scan\" | \"empty\" }> {\n if (store) {\n const snapshot = await store.read();\n if (snapshot && snapshot.auctions.length > 0) {\n return { auctions: snapshot.auctions, source: \"store\" };\n }\n }\n\n if (options.fallbackToScan) {\n const auctions = await scanAuctions(client);\n return { auctions, source: \"scan\" };\n }\n\n return { auctions: [], source: \"empty\" };\n}\n"]}
|
package/dist/node.d.cts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { D as DiscoveredAuction, A as AuctionInfo, T as TokenMetadata, B as BeaconClient } from './erc20-C3yff839.cjs';
|
|
2
|
+
import { Address } from 'viem';
|
|
3
|
+
|
|
4
|
+
/** A discovered auction plus whatever immutable detail has been cached for it. */
|
|
5
|
+
interface AuctionRecord extends DiscoveredAuction {
|
|
6
|
+
info?: AuctionInfo;
|
|
7
|
+
tokenMeta?: TokenMetadata;
|
|
8
|
+
currencyMeta?: TokenMetadata;
|
|
9
|
+
}
|
|
10
|
+
interface AuctionStoreSnapshot {
|
|
11
|
+
chainId: number;
|
|
12
|
+
factoryAddress: Address;
|
|
13
|
+
/** Highest block that has been scanned. Discovery resumes from here. */
|
|
14
|
+
lastSyncedBlock: bigint;
|
|
15
|
+
auctions: AuctionRecord[];
|
|
16
|
+
}
|
|
17
|
+
interface StoreUpdate {
|
|
18
|
+
chainId: number;
|
|
19
|
+
factoryAddress: Address;
|
|
20
|
+
lastSyncedBlock: bigint;
|
|
21
|
+
auctions: readonly AuctionRecord[];
|
|
22
|
+
}
|
|
23
|
+
interface AuctionStore {
|
|
24
|
+
read(): Promise<AuctionStoreSnapshot | undefined>;
|
|
25
|
+
/** Merge new auctions in and advance the sync watermark. */
|
|
26
|
+
merge(update: StoreUpdate): Promise<{
|
|
27
|
+
added: number;
|
|
28
|
+
total: number;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
/** JSON-file backed store. */
|
|
32
|
+
declare class JsonAuctionStore implements AuctionStore {
|
|
33
|
+
private readonly filePath;
|
|
34
|
+
constructor(filePath: string);
|
|
35
|
+
read(): Promise<AuctionStoreSnapshot | undefined>;
|
|
36
|
+
merge(update: StoreUpdate): Promise<{
|
|
37
|
+
added: number;
|
|
38
|
+
total: number;
|
|
39
|
+
}>;
|
|
40
|
+
}
|
|
41
|
+
/** In-memory store, for tests. */
|
|
42
|
+
declare class MemoryAuctionStore implements AuctionStore {
|
|
43
|
+
private snapshot;
|
|
44
|
+
read(): Promise<AuctionStoreSnapshot | undefined>;
|
|
45
|
+
merge(update: StoreUpdate): Promise<{
|
|
46
|
+
added: number;
|
|
47
|
+
total: number;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface EnrichResult {
|
|
52
|
+
enriched: number;
|
|
53
|
+
alreadyComplete: number;
|
|
54
|
+
failed: number;
|
|
55
|
+
total: number;
|
|
56
|
+
}
|
|
57
|
+
declare function enrichStore(client: BeaconClient, store: AuctionStore, options?: {
|
|
58
|
+
concurrency?: number;
|
|
59
|
+
onProgress?: (message: string) => void;
|
|
60
|
+
}): Promise<EnrichResult>;
|
|
61
|
+
|
|
62
|
+
interface SyncOptions {
|
|
63
|
+
/**
|
|
64
|
+
* Re-scan from the factory deploy block rather than the store's watermark.
|
|
65
|
+
* Use when converging a list built on an unreliable RPC.
|
|
66
|
+
*/
|
|
67
|
+
full?: boolean;
|
|
68
|
+
/** Blocks per getLogs request. */
|
|
69
|
+
chunkSize?: bigint;
|
|
70
|
+
/** How many times to re-scan the range in one call, unioning results. */
|
|
71
|
+
passes?: number;
|
|
72
|
+
onProgress?: (message: string) => void;
|
|
73
|
+
}
|
|
74
|
+
interface SyncResult {
|
|
75
|
+
added: number;
|
|
76
|
+
total: number;
|
|
77
|
+
scannedFrom: bigint;
|
|
78
|
+
scannedTo: bigint;
|
|
79
|
+
anomalies: number;
|
|
80
|
+
passes: number;
|
|
81
|
+
}
|
|
82
|
+
declare function syncAuctions(client: BeaconClient, store: AuctionStore, options?: SyncOptions): Promise<SyncResult>;
|
|
83
|
+
/**
|
|
84
|
+
* Read the auction list, preferring the store and falling back to a live scan.
|
|
85
|
+
*
|
|
86
|
+
* This is what the directory uses. A cached list is correct because auctions are
|
|
87
|
+
* append-only; only very recently created auctions could be missing, which the
|
|
88
|
+
* next sync picks up.
|
|
89
|
+
*/
|
|
90
|
+
declare function loadAuctions(client: BeaconClient, store: AuctionStore | undefined, options?: {
|
|
91
|
+
fallbackToScan?: boolean;
|
|
92
|
+
}): Promise<{
|
|
93
|
+
auctions: DiscoveredAuction[];
|
|
94
|
+
source: "store" | "scan" | "empty";
|
|
95
|
+
}>;
|
|
96
|
+
|
|
97
|
+
export { type AuctionRecord, type AuctionStore, type AuctionStoreSnapshot, type EnrichResult, JsonAuctionStore, MemoryAuctionStore, type StoreUpdate, type SyncOptions, type SyncResult, enrichStore, loadAuctions, syncAuctions };
|
package/dist/node.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { D as DiscoveredAuction, A as AuctionInfo, T as TokenMetadata, B as BeaconClient } from './erc20-C3yff839.js';
|
|
2
|
+
import { Address } from 'viem';
|
|
3
|
+
|
|
4
|
+
/** A discovered auction plus whatever immutable detail has been cached for it. */
|
|
5
|
+
interface AuctionRecord extends DiscoveredAuction {
|
|
6
|
+
info?: AuctionInfo;
|
|
7
|
+
tokenMeta?: TokenMetadata;
|
|
8
|
+
currencyMeta?: TokenMetadata;
|
|
9
|
+
}
|
|
10
|
+
interface AuctionStoreSnapshot {
|
|
11
|
+
chainId: number;
|
|
12
|
+
factoryAddress: Address;
|
|
13
|
+
/** Highest block that has been scanned. Discovery resumes from here. */
|
|
14
|
+
lastSyncedBlock: bigint;
|
|
15
|
+
auctions: AuctionRecord[];
|
|
16
|
+
}
|
|
17
|
+
interface StoreUpdate {
|
|
18
|
+
chainId: number;
|
|
19
|
+
factoryAddress: Address;
|
|
20
|
+
lastSyncedBlock: bigint;
|
|
21
|
+
auctions: readonly AuctionRecord[];
|
|
22
|
+
}
|
|
23
|
+
interface AuctionStore {
|
|
24
|
+
read(): Promise<AuctionStoreSnapshot | undefined>;
|
|
25
|
+
/** Merge new auctions in and advance the sync watermark. */
|
|
26
|
+
merge(update: StoreUpdate): Promise<{
|
|
27
|
+
added: number;
|
|
28
|
+
total: number;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
/** JSON-file backed store. */
|
|
32
|
+
declare class JsonAuctionStore implements AuctionStore {
|
|
33
|
+
private readonly filePath;
|
|
34
|
+
constructor(filePath: string);
|
|
35
|
+
read(): Promise<AuctionStoreSnapshot | undefined>;
|
|
36
|
+
merge(update: StoreUpdate): Promise<{
|
|
37
|
+
added: number;
|
|
38
|
+
total: number;
|
|
39
|
+
}>;
|
|
40
|
+
}
|
|
41
|
+
/** In-memory store, for tests. */
|
|
42
|
+
declare class MemoryAuctionStore implements AuctionStore {
|
|
43
|
+
private snapshot;
|
|
44
|
+
read(): Promise<AuctionStoreSnapshot | undefined>;
|
|
45
|
+
merge(update: StoreUpdate): Promise<{
|
|
46
|
+
added: number;
|
|
47
|
+
total: number;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface EnrichResult {
|
|
52
|
+
enriched: number;
|
|
53
|
+
alreadyComplete: number;
|
|
54
|
+
failed: number;
|
|
55
|
+
total: number;
|
|
56
|
+
}
|
|
57
|
+
declare function enrichStore(client: BeaconClient, store: AuctionStore, options?: {
|
|
58
|
+
concurrency?: number;
|
|
59
|
+
onProgress?: (message: string) => void;
|
|
60
|
+
}): Promise<EnrichResult>;
|
|
61
|
+
|
|
62
|
+
interface SyncOptions {
|
|
63
|
+
/**
|
|
64
|
+
* Re-scan from the factory deploy block rather than the store's watermark.
|
|
65
|
+
* Use when converging a list built on an unreliable RPC.
|
|
66
|
+
*/
|
|
67
|
+
full?: boolean;
|
|
68
|
+
/** Blocks per getLogs request. */
|
|
69
|
+
chunkSize?: bigint;
|
|
70
|
+
/** How many times to re-scan the range in one call, unioning results. */
|
|
71
|
+
passes?: number;
|
|
72
|
+
onProgress?: (message: string) => void;
|
|
73
|
+
}
|
|
74
|
+
interface SyncResult {
|
|
75
|
+
added: number;
|
|
76
|
+
total: number;
|
|
77
|
+
scannedFrom: bigint;
|
|
78
|
+
scannedTo: bigint;
|
|
79
|
+
anomalies: number;
|
|
80
|
+
passes: number;
|
|
81
|
+
}
|
|
82
|
+
declare function syncAuctions(client: BeaconClient, store: AuctionStore, options?: SyncOptions): Promise<SyncResult>;
|
|
83
|
+
/**
|
|
84
|
+
* Read the auction list, preferring the store and falling back to a live scan.
|
|
85
|
+
*
|
|
86
|
+
* This is what the directory uses. A cached list is correct because auctions are
|
|
87
|
+
* append-only; only very recently created auctions could be missing, which the
|
|
88
|
+
* next sync picks up.
|
|
89
|
+
*/
|
|
90
|
+
declare function loadAuctions(client: BeaconClient, store: AuctionStore | undefined, options?: {
|
|
91
|
+
fallbackToScan?: boolean;
|
|
92
|
+
}): Promise<{
|
|
93
|
+
auctions: DiscoveredAuction[];
|
|
94
|
+
source: "store" | "scan" | "empty";
|
|
95
|
+
}>;
|
|
96
|
+
|
|
97
|
+
export { type AuctionRecord, type AuctionStore, type AuctionStoreSnapshot, type EnrichResult, JsonAuctionStore, MemoryAuctionStore, type StoreUpdate, type SyncOptions, type SyncResult, enrichStore, loadAuctions, syncAuctions };
|