@dimes-dot-fi/sdk 1.2.0 → 1.3.1

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.
Files changed (51) hide show
  1. package/dist/{aliases-DzVxkXtK.d.cts → aliases-BGqwpyE-.d.cts} +39 -1
  2. package/dist/{aliases-DzVxkXtK.d.ts → aliases-BGqwpyE-.d.ts} +39 -1
  3. package/dist/{chunk-YUCGNELT.mjs → chunk-4MO3HKMS.mjs} +7 -1
  4. package/dist/chunk-4MO3HKMS.mjs.map +1 -0
  5. package/dist/{chunk-S65RABUT.mjs → chunk-BVILILIV.mjs} +13 -1
  6. package/dist/chunk-BVILILIV.mjs.map +1 -0
  7. package/dist/{chunk-JWAPH4GD.cjs → chunk-COSLZ5TM.cjs} +36 -11
  8. package/dist/chunk-COSLZ5TM.cjs.map +1 -0
  9. package/dist/{chunk-UUE4HG2H.cjs → chunk-DYPABUKC.cjs} +13 -1
  10. package/dist/chunk-DYPABUKC.cjs.map +1 -0
  11. package/dist/{chunk-EI5V5Z6G.mjs → chunk-SGA6OZEU.mjs} +33 -8
  12. package/dist/chunk-SGA6OZEU.mjs.map +1 -0
  13. package/dist/{chunk-ZK56XS4X.cjs → chunk-UHQZSMUD.cjs} +8 -2
  14. package/dist/chunk-UHQZSMUD.cjs.map +1 -0
  15. package/dist/contract/index.cjs +206 -14
  16. package/dist/contract/index.cjs.map +1 -1
  17. package/dist/contract/index.d.cts +155 -4
  18. package/dist/contract/index.d.ts +155 -4
  19. package/dist/contract/index.mjs +193 -1
  20. package/dist/contract/index.mjs.map +1 -1
  21. package/dist/{dimes-client-D88pW-Lm.d.ts → dimes-client-C2hT6mZ8.d.cts} +10 -2
  22. package/dist/{dimes-client-Bs6eTIvn.d.cts → dimes-client-DFAKtIeI.d.ts} +10 -2
  23. package/dist/{dimes-error-DxIoHQzj.d.cts → dimes-error-BW0wd1ib.d.cts} +1 -1
  24. package/dist/{dimes-error-BHVY6vDv.d.ts → dimes-error-IBJ5eff6.d.ts} +1 -1
  25. package/dist/index.cjs +12 -7
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +7 -7
  28. package/dist/index.d.ts +7 -7
  29. package/dist/index.mjs +8 -3
  30. package/dist/index.mjs.map +1 -1
  31. package/dist/{quote-Cy7ie8yT.d.ts → quote-BVMZb0T8.d.ts} +2 -2
  32. package/dist/{quote-CZqCqt8R.d.cts → quote-BcVJ0U0l.d.cts} +2 -2
  33. package/dist/react/index.cjs +4 -4
  34. package/dist/react/index.d.cts +3 -3
  35. package/dist/react/index.d.ts +3 -3
  36. package/dist/react/index.mjs +2 -2
  37. package/dist/{types-BcUKsoEs.d.ts → types-BwPF-kCK.d.cts} +20 -2
  38. package/dist/{types--ysRe5Os.d.cts → types-C7nWOxO-.d.ts} +20 -2
  39. package/dist/ws/index.cjs +114 -4
  40. package/dist/ws/index.cjs.map +1 -1
  41. package/dist/ws/index.d.cts +36 -9
  42. package/dist/ws/index.d.ts +36 -9
  43. package/dist/ws/index.mjs +111 -1
  44. package/dist/ws/index.mjs.map +1 -1
  45. package/package.json +1 -1
  46. package/dist/chunk-EI5V5Z6G.mjs.map +0 -1
  47. package/dist/chunk-JWAPH4GD.cjs.map +0 -1
  48. package/dist/chunk-S65RABUT.mjs.map +0 -1
  49. package/dist/chunk-UUE4HG2H.cjs.map +0 -1
  50. package/dist/chunk-YUCGNELT.mjs.map +0 -1
  51. package/dist/chunk-ZK56XS4X.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contract/vault-abi.json","../../src/contract/abi.ts","../../src/contract/evm.ts","../../src/contract/build-tx.ts","../../src/contract/verify-signature.ts","../../src/contract/error-messages.ts"],"sourcesContent":["{\n \"abi\": [\n {\n \"type\": \"function\",\n \"name\": \"createPosition\",\n \"inputs\": [\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"signatureExpiry\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"requestClose\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"CloseRequested\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PositionCreated\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"indexed\": false,\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"indexed\": false,\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"CancelDelayNotElapsed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"CollateralBelowMinimum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureLength\",\n \"inputs\": [\n {\n \"name\": \"length\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureS\",\n \"inputs\": [\n {\n \"name\": \"s\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"EmergencyOnlyMode\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EnforcedPause\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FailedCall\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FeeRateExceedsMaximum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InsufficientCapital\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidLeverage\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidNotional\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPositionState\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"MarketCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NewPositionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NoTokensToClose\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NotPositionOwner\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionAlreadyExists\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionNotFound\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SafeERC20FailedOperation\",\n \"inputs\": [\n {\n \"name\": \"token\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ServerHalted\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TokenCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TotalCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserActionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAddress\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAmount\",\n \"inputs\": []\n }\n ]\n}\n","import type { Abi } from \"viem\";\nimport vaultAbiJson from \"./vault-abi.json\";\n\nexport const vaultAbi = (vaultAbiJson as { abi: Abi }).abi;\n\nexport const erc20Abi = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { type Hex, type Address, isHex, isAddress, getAddress } from \"viem\";\nimport { DimesError } from \"../errors/dimes-error\";\n\nexport type { Hex, Address };\n\nexport function toHex(value: string): Hex {\n if (!isHex(value)) {\n const HEX_PREVIEW_LENGTH = 10;\n throw new DimesError(\n \"invalid_hex\",\n `Expected hex string starting with 0x, got: ${value.slice(0, HEX_PREVIEW_LENGTH)}`,\n );\n }\n\n return value;\n}\n\nexport function toAddress(value: string): Address {\n if (!isAddress(value)) {\n throw new DimesError(\"invalid_address\", `Invalid EVM address: ${value}`);\n }\n\n return getAddress(value);\n}\n","import type { Abi } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi, erc20Abi } from \"./abi\";\nimport { toHex, toAddress } from \"./evm\";\n\nexport interface CreatePositionTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"createPosition\";\n args: readonly [\n `0x${string}`,\n `0x${string}`,\n bigint,\n bigint,\n number,\n bigint,\n number,\n number,\n number,\n bigint,\n `0x${string}`,\n bigint,\n ];\n}\n\nexport interface ApproveTxData {\n address: `0x${string}`;\n abi: typeof erc20Abi;\n functionName: \"approve\";\n args: readonly [`0x${string}`, bigint];\n}\n\nexport interface RequestCloseTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"requestClose\";\n args: readonly [`0x${string}`];\n}\n\nexport function buildCreatePositionTx(offer: Offer): CreatePositionTxData {\n return {\n address: toAddress(offer.polygonVaultContractAddress),\n abi: vaultAbi,\n functionName: \"createPosition\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n };\n}\n\nexport function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData {\n return {\n address: usdcAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n };\n}\n\nexport function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData {\n return {\n address: vaultAddress,\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [positionKey],\n };\n}\n","import { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { DimesClient } from \"../client/dimes-client\";\nimport { DimesContractError } from \"../errors/dimes-error\";\nimport type { ContractInfo, Offer } from \"../types\";\nimport { toHex, toAddress } from \"./evm\";\n\nconst createPositionTypes = {\n CreatePosition: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"user\", type: \"address\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n} as const;\n\nexport async function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`> {\n return recoverTypedDataAddress({\n domain: {\n name: \"LeveragedPredictionVaultV1\",\n version: \"1\",\n chainId: Number(offer.evmChainId),\n verifyingContract: toAddress(offer.polygonVaultContractAddress),\n },\n types: createPositionTypes,\n primaryType: \"CreatePosition\",\n message: {\n positionSeed: toHex(offer.positionSeedHex),\n user: userAddress,\n marketId: toHex(offer.polymarketMarketId),\n tokenId: BigInt(offer.polymarketTokenId),\n collateralUsdcUnits: BigInt(offer.collateralUsdcUnits),\n leverageBps: offer.leverageBps,\n notionalUsdcUnits: BigInt(offer.notionalUsdcUnits),\n originationFeeBps: offer.originationFeeBps,\n lifetimeFeeAprBps: offer.lifetimeFeeAprBps,\n liquidationFeeBps: offer.liquidationFeeBps,\n venueFeeUsdcUnits: BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n signatureExpiry: BigInt(offer.signatureExpiry),\n },\n signature: toHex(offer.contractSignature),\n });\n}\n\nexport function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined {\n return apiSigner ? getAddress(apiSigner) : undefined;\n}\n\nconst contractInfoCache = new WeakMap<DimesClient, ContractInfo>();\n\nexport async function verifyOfferSignature(\n client: DimesClient,\n offer: Offer,\n userAddress: `0x${string}`,\n): Promise<void> {\n let info = contractInfoCache.get(client);\n if (!info) {\n info = await client.getContractInfo();\n contractInfoCache.set(client, info);\n }\n\n const recoveredSigner = await recoverCreatePositionSigner(offer, userAddress);\n const expectedSigner = getAddress(info.polygonSignerAddress);\n\n if (recoveredSigner !== expectedSigner) {\n throw new DimesContractError(\n \"invalid_signer\",\n `Recovered signer ${recoveredSigner} does not match expected authority ${expectedSigner}`,\n );\n }\n}\n","import {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionExecutionError,\n UserRejectedRequestError,\n formatUnits,\n} from \"viem\";\nimport { DimesContractError } from \"../errors/dimes-error\";\n\nconst USDC_DECIMALS = 6;\nconst BPS_PER_PCT = 100;\n\nconst fmtUsdc = (v: unknown): string => (typeof v === \"bigint\" ? `${formatUnits(v, USDC_DECIMALS)} USDC` : String(v));\n\nconst BPS_DECIMAL_PLACES = 2;\n\nconst fmtBps = (v: unknown): string => {\n if (typeof v === \"bigint\") {\n return `${(Number(v) / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n if (typeof v === \"number\") {\n return `${(v / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n return String(v);\n};\n\ntype Formatter = (args: readonly unknown[] | undefined) => string;\n\n/* eslint-disable no-magic-numbers -- array-length guards on contract error args */\nconst friendlyByErrorName: Record<string, Formatter> = {\n InvalidSignature: () => \"Quote signature is invalid. Refresh and try again.\",\n SignatureExpired: () => \"Quote has expired. Refresh and try again.\",\n TokenIdMismatch: () => \"Quote token mismatch. Refresh and try again.\",\n\n InsufficientCapital: () => \"Pool is short on capital right now. Try a smaller size.\",\n UserCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `You'd exceed your account cap of ${fmtUsdc(a[3])} (current ${fmtUsdc(a[1])}, requested ${fmtUsdc(a[2])}).`\n : \"You'd exceed your account capital cap.\",\n MarketCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `Market is at capacity (cap ${fmtUsdc(a[3])}, requested ${fmtUsdc(a[2])}).`\n : \"Market is at capacity.\",\n TotalCapitalExceeded: (a) =>\n a && a.length >= 3\n ? `Protocol is at capacity (cap ${fmtUsdc(a[2])}, requested ${fmtUsdc(a[1])}).`\n : \"Protocol is at capacity.\",\n TokenCapitalExceeded: () => \"This outcome is at capacity.\",\n\n InvalidLeverage: (a) => (a && a.length >= 1 ? `Invalid leverage (${fmtBps(a[0])}).` : \"Invalid leverage.\"),\n CollateralBelowMinimum: (a) =>\n a && a.length >= 2\n ? `Collateral ${fmtUsdc(a[0])} is below the minimum of ${fmtUsdc(a[1])}.`\n : \"Collateral is below the minimum.\",\n InvalidCollateral: (a) =>\n a && a.length >= 1 ? `Invalid collateral amount (${fmtUsdc(a[0])}).` : \"Invalid collateral amount.\",\n InvalidNotional: (a) => (a && a.length >= 1 ? `Invalid notional (${fmtUsdc(a[0])}).` : \"Invalid notional.\"),\n ZeroAmount: () => \"Amount cannot be zero.\",\n ZeroAddress: () => \"Address cannot be zero.\",\n\n PositionAlreadyExists: () => \"A position with this seed already exists.\",\n PositionNotFound: () => \"Position not found.\",\n PositionAlreadyFinalized: () => \"Position is already finalized.\",\n InvalidPositionState: () => \"Position is in the wrong state for this action.\",\n NotPositionOwner: () => \"You're not the owner of this position.\",\n\n NewPositionsPaused: () => \"New positions are paused.\",\n UserActionsPaused: () => \"User actions are temporarily paused.\",\n EmergencyOnlyMode: () => \"Protocol is in emergency-only mode.\",\n ServerHalted: () => \"Protocol is halted. Try again later.\",\n\n NoTokensToClose: () => \"Position has no tokens to close.\",\n InvalidProceeds: () => \"Invalid proceeds amount.\",\n InvalidMarketOutcome: () => \"Invalid market outcome.\",\n InvalidTokensToSell: () => \"Invalid token amount to sell.\",\n InvalidTargetLeverage: () => \"Target leverage must be lower than current.\",\n\n CancelDelayNotElapsed: () => \"Cancel delay has not elapsed yet.\",\n CancelDelayTooLong: () => \"Cancel delay exceeds the maximum allowed.\",\n\n SafeERC20FailedOperation: () => \"Token transfer failed.\",\n UnauthorizedTokenSender: () => \"Unauthorized token sender.\",\n CannotRescueOperationalToken: () => \"Cannot rescue operational tokens.\",\n\n ERC20InsufficientBalance: () => \"Insufficient USDC balance.\",\n ERC20InsufficientAllowance: () => \"Insufficient USDC allowance. Approve and try again.\",\n};\n/* eslint-enable no-magic-numbers */\n\nconst friendlyBySelector: Record<string, string> = {\n \"0xe450d38c\": \"Insufficient USDC balance.\",\n \"0xfb8f41b2\": \"Insufficient USDC allowance. Approve and try again.\",\n \"0x96c6fd1e\": \"Invalid token sender (zero address).\",\n \"0xec442f05\": \"Invalid token receiver (zero address).\",\n \"0xe602df05\": \"Invalid token approver (zero address).\",\n \"0x94280d62\": \"Invalid spender (zero address).\",\n \"0x03dee4c5\": \"Insufficient token balance for transfer.\",\n \"0x01a83514\": \"Invalid ERC-1155 sender (zero address).\",\n \"0x57f447ce\": \"Invalid ERC-1155 receiver.\",\n \"0xe237d922\": \"Missing ERC-1155 approval.\",\n \"0x3e31884e\": \"Invalid ERC-1155 approver (zero address).\",\n \"0xced3e100\": \"Invalid ERC-1155 operator (zero address).\",\n \"0x5b059991\": \"ERC-1155 array length mismatch.\",\n};\n\nconst HEX_SELECTOR_LENGTH = 10;\n\nfunction humanizeName(name: string): string {\n const spaced = name.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf(\"\\n\");\n return (i === -1 ? s : s.slice(0, i)).trim();\n}\n\n// eslint-disable-next-line complexity\nexport function formatContractError(err: unknown): DimesContractError {\n if (!err) {\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n }\n\n if (err instanceof BaseError) {\n const rejected = err.walk((e) => e instanceof UserRejectedRequestError);\n if (rejected) {\n return new DimesContractError(\"UserRejected\", \"Transaction rejected in wallet.\");\n }\n\n const reverted = err.walk(\n (e) => e instanceof ContractFunctionRevertedError,\n ) as ContractFunctionRevertedError | null;\n if (reverted) {\n const errorName = reverted.data?.errorName;\n const args = reverted.data?.args;\n if (errorName) {\n const fmt = friendlyByErrorName[errorName];\n const message = fmt ? fmt(args) : humanizeName(errorName);\n return new DimesContractError(errorName, message);\n }\n const raw = reverted.raw;\n const selector = raw && raw.length >= HEX_SELECTOR_LENGTH ? raw.slice(0, HEX_SELECTOR_LENGTH) : undefined;\n const selectorMessage = selector ? friendlyBySelector[selector] : undefined;\n return new DimesContractError(\n selector ?? \"unknown_revert\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n selectorMessage ?? reverted.shortMessage ?? \"Contract reverted.\",\n );\n }\n\n const exec = err.walk((e) => e instanceof ContractFunctionExecutionError) as ContractFunctionExecutionError | null;\n if (exec?.shortMessage) {\n return new DimesContractError(\"execution_error\", firstLine(exec.shortMessage));\n }\n\n if (err.shortMessage) {\n return new DimesContractError(\"base_error\", firstLine(err.shortMessage));\n }\n return new DimesContractError(\"base_error\", firstLine(err.message));\n }\n\n if (err instanceof Error) {\n return new DimesContractError(\"error\", firstLine(err.message));\n }\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n}\n"],"mappings":"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","names":["getAddress","getAddress"]}
1
+ {"version":3,"sources":["../../src/contract/vault-abi.json","../../src/contract/abi.ts","../../src/contract/evm.ts","../../src/contract/build-tx.ts","../../src/contract/deposit-wallet.ts","../../src/contract/verify-signature.ts","../../src/contract/error-messages.ts"],"sourcesContent":["{\n \"abi\": [\n {\n \"type\": \"function\",\n \"name\": \"createPosition\",\n \"inputs\": [\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"signature\",\n \"type\": \"bytes\",\n \"internalType\": \"bytes\"\n },\n {\n \"name\": \"signatureExpiry\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"function\",\n \"name\": \"requestClose\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ],\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\"\n },\n {\n \"type\": \"event\",\n \"name\": \"CloseRequested\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"event\",\n \"name\": \"PositionCreated\",\n \"inputs\": [\n {\n \"name\": \"positionKey\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"positionSeed\",\n \"type\": \"bytes16\",\n \"indexed\": false,\n \"internalType\": \"bytes16\"\n },\n {\n \"name\": \"owner\",\n \"type\": \"address\",\n \"indexed\": true,\n \"internalType\": \"address\"\n },\n {\n \"name\": \"marketId\",\n \"type\": \"bytes32\",\n \"indexed\": true,\n \"internalType\": \"bytes32\"\n },\n {\n \"name\": \"tokenId\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"collateralUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"leverageBps\",\n \"type\": \"uint32\",\n \"indexed\": false,\n \"internalType\": \"uint32\"\n },\n {\n \"name\": \"notionalUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"venueFeeUsdcUnits\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n },\n {\n \"name\": \"originationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"lifetimeFeeAprBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"liquidationFeeBps\",\n \"type\": \"uint16\",\n \"indexed\": false,\n \"internalType\": \"uint16\"\n },\n {\n \"name\": \"state\",\n \"type\": \"uint8\",\n \"indexed\": false,\n \"internalType\": \"uint8\"\n },\n {\n \"name\": \"timestamp\",\n \"type\": \"uint256\",\n \"indexed\": false,\n \"internalType\": \"uint256\"\n }\n ],\n \"anonymous\": false\n },\n {\n \"type\": \"error\",\n \"name\": \"CancelDelayNotElapsed\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"CollateralBelowMinimum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureLength\",\n \"inputs\": [\n {\n \"name\": \"length\",\n \"type\": \"uint256\",\n \"internalType\": \"uint256\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ECDSAInvalidSignatureS\",\n \"inputs\": [\n {\n \"name\": \"s\",\n \"type\": \"bytes32\",\n \"internalType\": \"bytes32\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"EmergencyOnlyMode\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"EnforcedPause\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FailedCall\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"FeeRateExceedsMaximum\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InsufficientCapital\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidLeverage\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidNotional\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidPositionState\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"InvalidSignature\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"MarketCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NewPositionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NoTokensToClose\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"NotPositionOwner\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionAlreadyExists\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"PositionNotFound\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SafeERC20FailedOperation\",\n \"inputs\": [\n {\n \"name\": \"token\",\n \"type\": \"address\",\n \"internalType\": \"address\"\n }\n ]\n },\n {\n \"type\": \"error\",\n \"name\": \"ServerHalted\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"SignatureExpired\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TokenCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"TotalCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserActionsPaused\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"UserCapitalExceeded\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAddress\",\n \"inputs\": []\n },\n {\n \"type\": \"error\",\n \"name\": \"ZeroAmount\",\n \"inputs\": []\n }\n ]\n}\n","import type { Abi } from \"viem\";\nimport vaultAbiJson from \"./vault-abi.json\";\n\nexport const vaultAbi = (vaultAbiJson as { abi: Abi }).abi;\n\nexport const erc20Abi = [\n {\n name: \"approve\",\n type: \"function\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n {\n name: \"allowance\",\n type: \"function\",\n stateMutability: \"view\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n },\n] as const;\n","import { type Hex, type Address, isHex, isAddress, getAddress } from \"viem\";\nimport { DimesError } from \"../errors/dimes-error\";\n\nexport type { Hex, Address };\n\nexport function toHex(value: string): Hex {\n if (!isHex(value)) {\n const HEX_PREVIEW_LENGTH = 10;\n throw new DimesError(\n \"invalid_hex\",\n `Expected hex string starting with 0x, got: ${value.slice(0, HEX_PREVIEW_LENGTH)}`,\n );\n }\n\n return value;\n}\n\nexport function toAddress(value: string): Address {\n if (!isAddress(value)) {\n throw new DimesError(\"invalid_address\", `Invalid EVM address: ${value}`);\n }\n\n return getAddress(value);\n}\n","import type { Abi } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi, erc20Abi } from \"./abi\";\nimport { toHex, toAddress } from \"./evm\";\n\nexport interface CreatePositionTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"createPosition\";\n args: readonly [\n `0x${string}`,\n `0x${string}`,\n bigint,\n bigint,\n number,\n bigint,\n number,\n number,\n number,\n bigint,\n `0x${string}`,\n bigint,\n ];\n}\n\nexport interface ApproveTxData {\n address: `0x${string}`;\n abi: typeof erc20Abi;\n functionName: \"approve\";\n args: readonly [`0x${string}`, bigint];\n}\n\nexport interface RequestCloseTxData {\n address: `0x${string}`;\n abi: Abi;\n functionName: \"requestClose\";\n args: readonly [`0x${string}`];\n}\n\nexport function buildCreatePositionTx(offer: Offer): CreatePositionTxData {\n return {\n address: toAddress(offer.polygonVaultContractAddress),\n abi: vaultAbi,\n functionName: \"createPosition\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n };\n}\n\nexport function buildApproveTx(usdcAddress: `0x${string}`, spender: `0x${string}`, amount: bigint): ApproveTxData {\n return {\n address: usdcAddress,\n abi: erc20Abi,\n functionName: \"approve\",\n args: [spender, amount],\n };\n}\n\nexport function buildRequestCloseTx(vaultAddress: `0x${string}`, positionKey: `0x${string}`): RequestCloseTxData {\n return {\n address: vaultAddress,\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [positionKey],\n };\n}\n","import { encodeFunctionData } from \"viem\";\nimport type { Offer } from \"../types\";\nimport { vaultAbi } from \"./abi\";\nimport { toAddress, toHex, type Address, type Hex } from \"./evm\";\n\n/**\n * Helpers for opening and closing positions from a Polymarket **deposit wallet** (DW).\n *\n * Deposit wallets cannot use the legacy `approve` + `createPosition` path: the Polymarket\n * relayer blocks `approve` to non-whitelisted spenders. Instead the DW submits an atomic\n * batch through Polymarket's deposit-wallet factory:\n *\n * 1. `vault.reserveDeposit(totalUserAmount)` — snapshot the vault pUSD balance\n * 2. `pUSD.transfer(vault, totalUserAmount)` — push the funds directly\n * 3. `vault.createPositionPushFunded(...)` — verify the balance delta + create\n *\n * Closing follows the same batch mechanics with a single inner call, `requestClose`.\n */\n\n/** Polymarket deposit-wallet factory (the `proxy` entrypoint), Polygon mainnet. */\nexport const depositWalletFactoryAddress: Address = \"0x00000000000Fb5C9ADea0298D729A0CB3823Cc07\";\n\n/** Base URL of Polymarket's v2 relayer. */\nexport const polymarketRelayerBaseUrl = \"https://relayer-v2.polymarket.com\";\n\n/** A single inner call inside a deposit-wallet batch. */\nexport interface DepositWalletCall {\n target: Address;\n value: bigint;\n data: Hex;\n}\n\n/** The EIP-712 `Batch` struct signed by the deposit-wallet owner. */\nexport interface DepositWalletBatch {\n wallet: Address;\n nonce: bigint;\n deadline: bigint;\n calls: DepositWalletCall[];\n}\n\n/** EIP-712 type definitions for the deposit-wallet `Batch` signature. */\nexport const depositWalletBatchTypes = {\n Batch: [\n { name: \"wallet\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"calls\", type: \"Call[]\" },\n ],\n Call: [\n { name: \"target\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"data\", type: \"bytes\" },\n ],\n} as const;\n\nconst reserveDepositAbi = [\n {\n type: \"function\",\n name: \"reserveDeposit\",\n stateMutability: \"nonpayable\",\n inputs: [{ name: \"expectedAmountUsdcUnits\", type: \"uint256\" }],\n outputs: [],\n },\n] as const;\n\nconst createPositionPushFundedAbi = [\n {\n type: \"function\",\n name: \"createPositionPushFunded\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signature\", type: \"bytes\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n outputs: [],\n },\n] as const;\n\nconst erc20TransferAbi = [\n {\n type: \"function\",\n name: \"transfer\",\n stateMutability: \"nonpayable\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n },\n] as const;\n\n/**\n * Build the three inner calls for a push-funded `createPosition`.\n *\n * The relayer submits these atomically; `offer.totalUserAmountUsdcUnits` is the\n * contract-ready amount (collateral + fees) used for both the reservation and the transfer.\n *\n * @param offer - the signed offer returned by the quote endpoint\n * @param pUsdAddress - the pUSD (USDC) token address (from `GET /contract-info`)\n */\nexport function buildPushFundedCreateCalls(offer: Offer, pUsdAddress: string): DepositWalletCall[] {\n const vaultAddress = toAddress(offer.polygonVaultContractAddress);\n const totalUserAmountUsdcUnits = BigInt(offer.totalUserAmountUsdcUnits);\n\n const reserveDepositData = encodeFunctionData({\n abi: reserveDepositAbi,\n functionName: \"reserveDeposit\",\n args: [totalUserAmountUsdcUnits],\n });\n\n const transferData = encodeFunctionData({\n abi: erc20TransferAbi,\n functionName: \"transfer\",\n args: [vaultAddress, totalUserAmountUsdcUnits],\n });\n\n const createPositionData = encodeFunctionData({\n abi: createPositionPushFundedAbi,\n functionName: \"createPositionPushFunded\",\n args: [\n toHex(offer.positionSeedHex),\n toHex(offer.polymarketMarketId),\n BigInt(offer.polymarketTokenId),\n BigInt(offer.collateralUsdcUnits),\n offer.leverageBps,\n BigInt(offer.notionalUsdcUnits),\n offer.originationFeeBps,\n offer.lifetimeFeeAprBps,\n offer.liquidationFeeBps,\n BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n toHex(offer.contractSignature),\n BigInt(offer.signatureExpiry),\n ],\n });\n\n return [\n { target: vaultAddress, value: 0n, data: reserveDepositData },\n { target: toAddress(pUsdAddress), value: 0n, data: transferData },\n { target: vaultAddress, value: 0n, data: createPositionData },\n ];\n}\n\n/**\n * Build the single inner call for a deposit-wallet `requestClose`.\n *\n * @param vaultAddress - the vault contract address\n * @param positionKey - the `on_chain_position_key` field from `GET /positions`\n */\nexport function buildRequestCloseCalls(vaultAddress: string, positionKey: string): DepositWalletCall[] {\n const closeData = encodeFunctionData({\n abi: vaultAbi,\n functionName: \"requestClose\",\n args: [toHex(positionKey)],\n });\n\n return [{ target: toAddress(vaultAddress), value: 0n, data: closeData }];\n}\n\ninterface BuildBatchParams {\n depositWalletAddress: string;\n /** Current `nonce()` read from the deposit wallet. */\n nonce: bigint;\n /** Unix-seconds deadline after which the relayer may no longer submit the batch. */\n deadline: bigint;\n calls: DepositWalletCall[];\n}\n\n/** Assemble a `DepositWalletBatch` ready for EIP-712 signing. */\nexport function buildDepositWalletBatch(params: BuildBatchParams): DepositWalletBatch {\n return {\n wallet: toAddress(params.depositWalletAddress),\n nonce: params.nonce,\n deadline: params.deadline,\n calls: params.calls,\n };\n}\n\n/** EIP-712 typed-data payload for a deposit-wallet `Batch` signature. */\nexport interface DepositWalletBatchTypedData {\n domain: { name: string; version: string; chainId: number; verifyingContract: Address };\n types: typeof depositWalletBatchTypes;\n primaryType: \"Batch\";\n message: DepositWalletBatch;\n}\n\n/**\n * Produce the EIP-712 typed-data object for a batch, ready to pass to a signer\n * (viem `signTypedData`, ethers `signTypedData`, etc.). The owner of the deposit\n * wallet must sign this.\n */\nexport function getDepositWalletBatchTypedData(batch: DepositWalletBatch): DepositWalletBatchTypedData {\n return {\n domain: {\n name: \"DepositWallet\",\n version: \"1\",\n chainId: 137,\n verifyingContract: batch.wallet,\n },\n types: depositWalletBatchTypes,\n primaryType: \"Batch\",\n message: batch,\n };\n}\n\ninterface RelayerSubmitPayload {\n type: \"WALLET\";\n from: Address;\n to: Address;\n nonce: string;\n signature: Hex;\n depositWalletParams: {\n depositWallet: Address;\n deadline: string;\n calls: { target: Address; value: string; data: Hex }[];\n };\n}\n\ninterface BuildRelayerPayloadParams {\n /** The deposit-wallet owner EOA that produced `signature`. */\n ownerAddress: string;\n batch: DepositWalletBatch;\n /** The EIP-712 signature over `getDepositWalletBatchTypedData(batch)`. */\n signature: Hex;\n}\n\n/**\n * Build the JSON body for `POST {polymarketRelayerBaseUrl}/submit`.\n *\n * Stringify the result and send it with headers from {@link buildRelayerAuthHeaders}.\n */\nexport function buildRelayerSubmitPayload(params: BuildRelayerPayloadParams): RelayerSubmitPayload {\n return {\n type: \"WALLET\",\n from: toAddress(params.ownerAddress),\n to: depositWalletFactoryAddress,\n nonce: params.batch.nonce.toString(),\n signature: params.signature,\n depositWalletParams: {\n depositWallet: params.batch.wallet,\n deadline: params.batch.deadline.toString(),\n calls: params.batch.calls.map((call) => ({\n target: call.target,\n value: call.value.toString(),\n data: call.data,\n })),\n },\n };\n}\n\ninterface BuildRelayerHeadersParams {\n /** Polymarket builder API key. */\n apiKey: string;\n /** Polymarket builder API secret (base64). */\n apiSecret: string;\n /** Polymarket builder API passphrase. */\n apiPassphrase: string;\n /** The exact request body string sent to `/submit` (the value passed to `fetch`). */\n body: string;\n /** Unix-seconds timestamp; defaults to now. Must match the request time. */\n timestamp?: string;\n}\n\nfunction base64ToBytes(value: string): ArrayBuffer {\n const binary = atob(value);\n const buffer = new ArrayBuffer(binary.length);\n const bytes = new Uint8Array(buffer);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return buffer;\n}\n\nfunction bytesToBase64Url(bytes: ArrayBuffer): string {\n let binary = \"\";\n const view = new Uint8Array(bytes);\n for (const byte of view) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\");\n}\n\n/**\n * Compute the HMAC-signed headers for a relayer `/submit` request.\n *\n * The relayer authenticates each call with an HMAC-SHA256 over\n * `timestamp + \"POST\" + \"/submit\" + body`, keyed by the base64-decoded API secret,\n * encoded as base64url. Uses the Web Crypto API (works in Node 20+ and browsers).\n */\nexport async function buildRelayerAuthHeaders(params: BuildRelayerHeadersParams): Promise<Record<string, string>> {\n const msPerSecond = 1000;\n const timestamp = params.timestamp ?? Math.floor(Date.now() / msPerSecond).toString();\n const key = await crypto.subtle.importKey(\n \"raw\",\n base64ToBytes(params.apiSecret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const encoded = new TextEncoder().encode(`${timestamp}POST/submit${params.body}`);\n const message = new Uint8Array(encoded).buffer;\n const signature = await crypto.subtle.sign(\"HMAC\", key, message);\n\n return {\n \"Content-Type\": \"application/json\",\n POLY_BUILDER_API_KEY: params.apiKey,\n POLY_BUILDER_TIMESTAMP: timestamp,\n POLY_BUILDER_PASSPHRASE: params.apiPassphrase,\n POLY_BUILDER_SIGNATURE: bytesToBase64Url(signature),\n };\n}\n","import { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { DimesClient } from \"../client/dimes-client\";\nimport { DimesContractError } from \"../errors/dimes-error\";\nimport type { ContractInfo, Offer } from \"../types\";\nimport { toHex, toAddress } from \"./evm\";\n\nconst createPositionTypes = {\n CreatePosition: [\n { name: \"positionSeed\", type: \"bytes16\" },\n { name: \"user\", type: \"address\" },\n { name: \"marketId\", type: \"bytes32\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"collateralUsdcUnits\", type: \"uint256\" },\n { name: \"leverageBps\", type: \"uint32\" },\n { name: \"notionalUsdcUnits\", type: \"uint256\" },\n { name: \"originationFeeBps\", type: \"uint16\" },\n { name: \"lifetimeFeeAprBps\", type: \"uint16\" },\n { name: \"liquidationFeeBps\", type: \"uint16\" },\n { name: \"venueFeeUsdcUnits\", type: \"uint256\" },\n { name: \"signatureExpiry\", type: \"uint256\" },\n ],\n} as const;\n\nexport async function recoverCreatePositionSigner(offer: Offer, userAddress: `0x${string}`): Promise<`0x${string}`> {\n return recoverTypedDataAddress({\n domain: {\n name: \"LeveragedPredictionVaultV1\",\n version: \"1\",\n chainId: Number(offer.evmChainId),\n verifyingContract: toAddress(offer.polygonVaultContractAddress),\n },\n types: createPositionTypes,\n primaryType: \"CreatePosition\",\n message: {\n positionSeed: toHex(offer.positionSeedHex),\n user: userAddress,\n marketId: toHex(offer.polymarketMarketId),\n tokenId: BigInt(offer.polymarketTokenId),\n collateralUsdcUnits: BigInt(offer.collateralUsdcUnits),\n leverageBps: offer.leverageBps,\n notionalUsdcUnits: BigInt(offer.notionalUsdcUnits),\n originationFeeBps: offer.originationFeeBps,\n lifetimeFeeAprBps: offer.lifetimeFeeAprBps,\n liquidationFeeBps: offer.liquidationFeeBps,\n venueFeeUsdcUnits: BigInt(offer.expectedOpenTradingFeeUsdcUnits),\n signatureExpiry: BigInt(offer.signatureExpiry),\n },\n signature: toHex(offer.contractSignature),\n });\n}\n\nexport function resolveExpectedSigner(apiSigner: string | undefined): `0x${string}` | undefined {\n return apiSigner ? getAddress(apiSigner) : undefined;\n}\n\nconst contractInfoCache = new WeakMap<DimesClient, ContractInfo>();\n\nexport async function verifyOfferSignature(\n client: DimesClient,\n offer: Offer,\n userAddress: `0x${string}`,\n): Promise<void> {\n let info = contractInfoCache.get(client);\n if (!info) {\n info = await client.getContractInfo();\n contractInfoCache.set(client, info);\n }\n\n const recoveredSigner = await recoverCreatePositionSigner(offer, userAddress);\n const expectedSigner = getAddress(info.polygonSignerAddress);\n\n if (recoveredSigner !== expectedSigner) {\n throw new DimesContractError(\n \"invalid_signer\",\n `Recovered signer ${recoveredSigner} does not match expected authority ${expectedSigner}`,\n );\n }\n}\n","import {\n BaseError,\n ContractFunctionRevertedError,\n ContractFunctionExecutionError,\n UserRejectedRequestError,\n formatUnits,\n} from \"viem\";\nimport { DimesContractError } from \"../errors/dimes-error\";\n\nconst USDC_DECIMALS = 6;\nconst BPS_PER_PCT = 100;\n\nconst fmtUsdc = (v: unknown): string => (typeof v === \"bigint\" ? `${formatUnits(v, USDC_DECIMALS)} USDC` : String(v));\n\nconst BPS_DECIMAL_PLACES = 2;\n\nconst fmtBps = (v: unknown): string => {\n if (typeof v === \"bigint\") {\n return `${(Number(v) / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n if (typeof v === \"number\") {\n return `${(v / BPS_PER_PCT).toFixed(BPS_DECIMAL_PLACES)}%`;\n }\n return String(v);\n};\n\ntype Formatter = (args: readonly unknown[] | undefined) => string;\n\n/* eslint-disable no-magic-numbers -- array-length guards on contract error args */\nconst friendlyByErrorName: Record<string, Formatter> = {\n InvalidSignature: () => \"Quote signature is invalid. Refresh and try again.\",\n SignatureExpired: () => \"Quote has expired. Refresh and try again.\",\n TokenIdMismatch: () => \"Quote token mismatch. Refresh and try again.\",\n\n InsufficientCapital: () => \"Pool is short on capital right now. Try a smaller size.\",\n UserCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `You'd exceed your account cap of ${fmtUsdc(a[3])} (current ${fmtUsdc(a[1])}, requested ${fmtUsdc(a[2])}).`\n : \"You'd exceed your account capital cap.\",\n MarketCapitalExceeded: (a) =>\n a && a.length >= 4\n ? `Market is at capacity (cap ${fmtUsdc(a[3])}, requested ${fmtUsdc(a[2])}).`\n : \"Market is at capacity.\",\n TotalCapitalExceeded: (a) =>\n a && a.length >= 3\n ? `Protocol is at capacity (cap ${fmtUsdc(a[2])}, requested ${fmtUsdc(a[1])}).`\n : \"Protocol is at capacity.\",\n TokenCapitalExceeded: () => \"This outcome is at capacity.\",\n\n InvalidLeverage: (a) => (a && a.length >= 1 ? `Invalid leverage (${fmtBps(a[0])}).` : \"Invalid leverage.\"),\n CollateralBelowMinimum: (a) =>\n a && a.length >= 2\n ? `Collateral ${fmtUsdc(a[0])} is below the minimum of ${fmtUsdc(a[1])}.`\n : \"Collateral is below the minimum.\",\n InvalidCollateral: (a) =>\n a && a.length >= 1 ? `Invalid collateral amount (${fmtUsdc(a[0])}).` : \"Invalid collateral amount.\",\n InvalidNotional: (a) => (a && a.length >= 1 ? `Invalid notional (${fmtUsdc(a[0])}).` : \"Invalid notional.\"),\n ZeroAmount: () => \"Amount cannot be zero.\",\n ZeroAddress: () => \"Address cannot be zero.\",\n\n PositionAlreadyExists: () => \"A position with this seed already exists.\",\n PositionNotFound: () => \"Position not found.\",\n PositionAlreadyFinalized: () => \"Position is already finalized.\",\n InvalidPositionState: () => \"Position is in the wrong state for this action.\",\n NotPositionOwner: () => \"You're not the owner of this position.\",\n\n NewPositionsPaused: () => \"New positions are paused.\",\n UserActionsPaused: () => \"User actions are temporarily paused.\",\n EmergencyOnlyMode: () => \"Protocol is in emergency-only mode.\",\n ServerHalted: () => \"Protocol is halted. Try again later.\",\n\n NoTokensToClose: () => \"Position has no tokens to close.\",\n InvalidProceeds: () => \"Invalid proceeds amount.\",\n InvalidMarketOutcome: () => \"Invalid market outcome.\",\n InvalidTokensToSell: () => \"Invalid token amount to sell.\",\n InvalidTargetLeverage: () => \"Target leverage must be lower than current.\",\n\n CancelDelayNotElapsed: () => \"Cancel delay has not elapsed yet.\",\n CancelDelayTooLong: () => \"Cancel delay exceeds the maximum allowed.\",\n\n SafeERC20FailedOperation: () => \"Token transfer failed.\",\n UnauthorizedTokenSender: () => \"Unauthorized token sender.\",\n CannotRescueOperationalToken: () => \"Cannot rescue operational tokens.\",\n\n ERC20InsufficientBalance: () => \"Insufficient USDC balance.\",\n ERC20InsufficientAllowance: () => \"Insufficient USDC allowance. Approve and try again.\",\n};\n/* eslint-enable no-magic-numbers */\n\nconst friendlyBySelector: Record<string, string> = {\n \"0xe450d38c\": \"Insufficient USDC balance.\",\n \"0xfb8f41b2\": \"Insufficient USDC allowance. Approve and try again.\",\n \"0x96c6fd1e\": \"Invalid token sender (zero address).\",\n \"0xec442f05\": \"Invalid token receiver (zero address).\",\n \"0xe602df05\": \"Invalid token approver (zero address).\",\n \"0x94280d62\": \"Invalid spender (zero address).\",\n \"0x03dee4c5\": \"Insufficient token balance for transfer.\",\n \"0x01a83514\": \"Invalid ERC-1155 sender (zero address).\",\n \"0x57f447ce\": \"Invalid ERC-1155 receiver.\",\n \"0xe237d922\": \"Missing ERC-1155 approval.\",\n \"0x3e31884e\": \"Invalid ERC-1155 approver (zero address).\",\n \"0xced3e100\": \"Invalid ERC-1155 operator (zero address).\",\n \"0x5b059991\": \"ERC-1155 array length mismatch.\",\n};\n\nconst HEX_SELECTOR_LENGTH = 10;\n\nfunction humanizeName(name: string): string {\n const spaced = name.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction firstLine(s: string): string {\n const i = s.indexOf(\"\\n\");\n return (i === -1 ? s : s.slice(0, i)).trim();\n}\n\n// eslint-disable-next-line complexity\nexport function formatContractError(err: unknown): DimesContractError {\n if (!err) {\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n }\n\n if (err instanceof BaseError) {\n const rejected = err.walk((e) => e instanceof UserRejectedRequestError);\n if (rejected) {\n return new DimesContractError(\"UserRejected\", \"Transaction rejected in wallet.\");\n }\n\n const reverted = err.walk(\n (e) => e instanceof ContractFunctionRevertedError,\n ) as ContractFunctionRevertedError | null;\n if (reverted) {\n const errorName = reverted.data?.errorName;\n const args = reverted.data?.args;\n if (errorName) {\n const fmt = friendlyByErrorName[errorName];\n const message = fmt ? fmt(args) : humanizeName(errorName);\n return new DimesContractError(errorName, message);\n }\n const raw = reverted.raw;\n const selector = raw && raw.length >= HEX_SELECTOR_LENGTH ? raw.slice(0, HEX_SELECTOR_LENGTH) : undefined;\n const selectorMessage = selector ? friendlyBySelector[selector] : undefined;\n return new DimesContractError(\n selector ?? \"unknown_revert\",\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n selectorMessage ?? reverted.shortMessage ?? \"Contract reverted.\",\n );\n }\n\n const exec = err.walk((e) => e instanceof ContractFunctionExecutionError) as ContractFunctionExecutionError | null;\n if (exec?.shortMessage) {\n return new DimesContractError(\"execution_error\", firstLine(exec.shortMessage));\n }\n\n if (err.shortMessage) {\n return new DimesContractError(\"base_error\", firstLine(err.shortMessage));\n }\n return new DimesContractError(\"base_error\", firstLine(err.message));\n }\n\n if (err instanceof Error) {\n return new DimesContractError(\"error\", firstLine(err.message));\n }\n return new DimesContractError(\"unknown\", \"Transaction failed.\");\n}\n"],"mappings":";;;;;;AAAA;AAAA,EACE,KAAO;AAAA,IACL;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,SAAW,CAAC;AAAA,MACZ,iBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,SAAW,CAAC;AAAA,MACZ,iBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,WAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,SAAW;AAAA,UACX,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,WAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU;AAAA,QACR;AAAA,UACE,MAAQ;AAAA,UACR,MAAQ;AAAA,UACR,cAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,QAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF;;;ACpXO,IAAM,WAAY,kBAA8B;AAEhD,IAAM,WAAW;AAAA,EACtB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MACnC,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MACjC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,UAAU,CAAC;AAAA,EACzC;AACF;;;AC1BA,SAAiC,OAAO,WAAW,kBAAkB;AAK9D,SAAS,MAAM,OAAoB;AACxC,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,UAAM,qBAAqB;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,8CAA8C,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,OAAwB;AAChD,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB,UAAM,IAAI,WAAW,mBAAmB,wBAAwB,KAAK,EAAE;AAAA,EACzE;AAEA,SAAO,WAAW,KAAK;AACzB;;;ACgBO,SAAS,sBAAsB,OAAoC;AACxE,SAAO;AAAA,IACL,SAAS,UAAU,MAAM,2BAA2B;AAAA,IACpD,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,MAAM,MAAM,eAAe;AAAA,MAC3B,MAAM,MAAM,kBAAkB;AAAA,MAC9B,OAAO,MAAM,iBAAiB;AAAA,MAC9B,OAAO,MAAM,mBAAmB;AAAA,MAChC,MAAM;AAAA,MACN,OAAO,MAAM,iBAAiB;AAAA,MAC9B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,MAAM,+BAA+B;AAAA,MAC5C,MAAM,MAAM,iBAAiB;AAAA,MAC7B,OAAO,MAAM,eAAe;AAAA,IAC9B;AAAA,EACF;AACF;AAEO,SAAS,eAAe,aAA4B,SAAwB,QAA+B;AAChH,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,SAAS,MAAM;AAAA,EACxB;AACF;AAEO,SAAS,oBAAoB,cAA6B,aAAgD;AAC/G,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,WAAW;AAAA,EACpB;AACF;;;AC7EA,SAAS,0BAA0B;AAoB5B,IAAM,8BAAuC;AAG7C,IAAM,2BAA2B;AAkBjC,IAAM,0BAA0B;AAAA,EACrC,OAAO;AAAA,IACL,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IAClC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,EAClC;AAAA,EACA,MAAM;AAAA,IACJ,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IAClC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACjC,EAAE,MAAM,QAAQ,MAAM,QAAQ;AAAA,EAChC;AACF;AAEA,IAAM,oBAAoB;AAAA,EACxB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ,CAAC,EAAE,MAAM,2BAA2B,MAAM,UAAU,CAAC;AAAA,IAC7D,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,IAAM,8BAA8B;AAAA,EAClC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,gBAAgB,MAAM,UAAU;AAAA,MACxC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,MACpC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,MACnC,EAAE,MAAM,uBAAuB,MAAM,UAAU;AAAA,MAC/C,EAAE,MAAM,eAAe,MAAM,SAAS;AAAA,MACtC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,MAC7C,EAAE,MAAM,qBAAqB,MAAM,SAAS;AAAA,MAC5C,EAAE,MAAM,qBAAqB,MAAM,SAAS;AAAA,MAC5C,EAAE,MAAM,qBAAqB,MAAM,SAAS;AAAA,MAC5C,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,MAC7C,EAAE,MAAM,aAAa,MAAM,QAAQ;AAAA,MACnC,EAAE,MAAM,mBAAmB,MAAM,UAAU;AAAA,IAC7C;AAAA,IACA,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,MAC9B,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,IACpC;AAAA,IACA,SAAS,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,CAAC;AAAA,EACtC;AACF;AAWO,SAAS,2BAA2B,OAAc,aAA0C;AACjG,QAAM,eAAe,UAAU,MAAM,2BAA2B;AAChE,QAAM,2BAA2B,OAAO,MAAM,wBAAwB;AAEtE,QAAM,qBAAqB,mBAAmB;AAAA,IAC5C,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,wBAAwB;AAAA,EACjC,CAAC;AAED,QAAM,eAAe,mBAAmB;AAAA,IACtC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,cAAc,wBAAwB;AAAA,EAC/C,CAAC;AAED,QAAM,qBAAqB,mBAAmB;AAAA,IAC5C,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM;AAAA,MACJ,MAAM,MAAM,eAAe;AAAA,MAC3B,MAAM,MAAM,kBAAkB;AAAA,MAC9B,OAAO,MAAM,iBAAiB;AAAA,MAC9B,OAAO,MAAM,mBAAmB;AAAA,MAChC,MAAM;AAAA,MACN,OAAO,MAAM,iBAAiB;AAAA,MAC9B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,MAAM,+BAA+B;AAAA,MAC5C,MAAM,MAAM,iBAAiB;AAAA,MAC7B,OAAO,MAAM,eAAe;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,EAAE,QAAQ,cAAc,OAAO,IAAI,MAAM,mBAAmB;AAAA,IAC5D,EAAE,QAAQ,UAAU,WAAW,GAAG,OAAO,IAAI,MAAM,aAAa;AAAA,IAChE,EAAE,QAAQ,cAAc,OAAO,IAAI,MAAM,mBAAmB;AAAA,EAC9D;AACF;AAQO,SAAS,uBAAuB,cAAsB,aAA0C;AACrG,QAAM,YAAY,mBAAmB;AAAA,IACnC,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,MAAM,WAAW,CAAC;AAAA,EAC3B,CAAC;AAED,SAAO,CAAC,EAAE,QAAQ,UAAU,YAAY,GAAG,OAAO,IAAI,MAAM,UAAU,CAAC;AACzE;AAYO,SAAS,wBAAwB,QAA8C;AACpF,SAAO;AAAA,IACL,QAAQ,UAAU,OAAO,oBAAoB;AAAA,IAC7C,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,EAChB;AACF;AAeO,SAAS,+BAA+B,OAAwD;AACrG,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,mBAAmB,MAAM;AAAA,IAC3B;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,EACX;AACF;AA4BO,SAAS,0BAA0B,QAAyD;AACjG,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,UAAU,OAAO,YAAY;AAAA,IACnC,IAAI;AAAA,IACJ,OAAO,OAAO,MAAM,MAAM,SAAS;AAAA,IACnC,WAAW,OAAO;AAAA,IAClB,qBAAqB;AAAA,MACnB,eAAe,OAAO,MAAM;AAAA,MAC5B,UAAU,OAAO,MAAM,SAAS,SAAS;AAAA,MACzC,OAAO,OAAO,MAAM,MAAM,IAAI,CAAC,UAAU;AAAA,QACvC,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,MAAM,SAAS;AAAA,QAC3B,MAAM,KAAK;AAAA,MACb,EAAE;AAAA,IACJ;AAAA,EACF;AACF;AAeA,SAAS,cAAc,OAA4B;AACjD,QAAM,SAAS,KAAK,KAAK;AACzB,QAAM,SAAS,IAAI,YAAY,OAAO,MAAM;AAC5C,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA4B;AACpD,MAAI,SAAS;AACb,QAAM,OAAO,IAAI,WAAW,KAAK;AACjC,aAAW,QAAQ,MAAM;AACvB,cAAU,OAAO,aAAa,IAAI;AAAA,EACpC;AACA,SAAO,KAAK,MAAM,EAAE,WAAW,KAAK,GAAG,EAAE,WAAW,KAAK,GAAG;AAC9D;AASA,eAAsB,wBAAwB,QAAoE;AAChH,QAAM,cAAc;AACpB,QAAM,YAAY,OAAO,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,WAAW,EAAE,SAAS;AACpF,QAAM,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9B;AAAA,IACA,cAAc,OAAO,SAAS;AAAA,IAC9B,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AACA,QAAM,UAAU,IAAI,YAAY,EAAE,OAAO,GAAG,SAAS,cAAc,OAAO,IAAI,EAAE;AAChF,QAAM,UAAU,IAAI,WAAW,OAAO,EAAE;AACxC,QAAM,YAAY,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,OAAO;AAE/D,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,sBAAsB,OAAO;AAAA,IAC7B,wBAAwB;AAAA,IACxB,yBAAyB,OAAO;AAAA,IAChC,wBAAwB,iBAAiB,SAAS;AAAA,EACpD;AACF;;;AC/TA,SAAS,yBAAyB,cAAAA,mBAAkB;AAMpD,IAAM,sBAAsB;AAAA,EAC1B,gBAAgB;AAAA,IACd,EAAE,MAAM,gBAAgB,MAAM,UAAU;AAAA,IACxC,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,IAChC,EAAE,MAAM,YAAY,MAAM,UAAU;AAAA,IACpC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,IACnC,EAAE,MAAM,uBAAuB,MAAM,UAAU;AAAA,IAC/C,EAAE,MAAM,eAAe,MAAM,SAAS;AAAA,IACtC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,IAC7C,EAAE,MAAM,qBAAqB,MAAM,SAAS;AAAA,IAC5C,EAAE,MAAM,qBAAqB,MAAM,SAAS;AAAA,IAC5C,EAAE,MAAM,qBAAqB,MAAM,SAAS;AAAA,IAC5C,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,IAC7C,EAAE,MAAM,mBAAmB,MAAM,UAAU;AAAA,EAC7C;AACF;AAEA,eAAsB,4BAA4B,OAAc,aAAoD;AAClH,SAAO,wBAAwB;AAAA,IAC7B,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,OAAO,MAAM,UAAU;AAAA,MAChC,mBAAmB,UAAU,MAAM,2BAA2B;AAAA,IAChE;AAAA,IACA,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,MACP,cAAc,MAAM,MAAM,eAAe;AAAA,MACzC,MAAM;AAAA,MACN,UAAU,MAAM,MAAM,kBAAkB;AAAA,MACxC,SAAS,OAAO,MAAM,iBAAiB;AAAA,MACvC,qBAAqB,OAAO,MAAM,mBAAmB;AAAA,MACrD,aAAa,MAAM;AAAA,MACnB,mBAAmB,OAAO,MAAM,iBAAiB;AAAA,MACjD,mBAAmB,MAAM;AAAA,MACzB,mBAAmB,MAAM;AAAA,MACzB,mBAAmB,MAAM;AAAA,MACzB,mBAAmB,OAAO,MAAM,+BAA+B;AAAA,MAC/D,iBAAiB,OAAO,MAAM,eAAe;AAAA,IAC/C;AAAA,IACA,WAAW,MAAM,MAAM,iBAAiB;AAAA,EAC1C,CAAC;AACH;AAEO,SAAS,sBAAsB,WAA0D;AAC9F,SAAO,YAAYC,YAAW,SAAS,IAAI;AAC7C;AAEA,IAAM,oBAAoB,oBAAI,QAAmC;AAEjE,eAAsB,qBACpB,QACA,OACA,aACe;AACf,MAAI,OAAO,kBAAkB,IAAI,MAAM;AACvC,MAAI,CAAC,MAAM;AACT,WAAO,MAAM,OAAO,gBAAgB;AACpC,sBAAkB,IAAI,QAAQ,IAAI;AAAA,EACpC;AAEA,QAAM,kBAAkB,MAAM,4BAA4B,OAAO,WAAW;AAC5E,QAAM,iBAAiBA,YAAW,KAAK,oBAAoB;AAE3D,MAAI,oBAAoB,gBAAgB;AACtC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,oBAAoB,eAAe,sCAAsC,cAAc;AAAA,IACzF;AAAA,EACF;AACF;;;AC7EA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEpB,IAAM,UAAU,CAAC,MAAwB,OAAO,MAAM,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC,UAAU,OAAO,CAAC;AAEnH,IAAM,qBAAqB;AAE3B,IAAM,SAAS,CAAC,MAAuB;AACrC,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO,IAAI,OAAO,CAAC,IAAI,aAAa,QAAQ,kBAAkB,CAAC;AAAA,EACjE;AACA,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO,IAAI,IAAI,aAAa,QAAQ,kBAAkB,CAAC;AAAA,EACzD;AACA,SAAO,OAAO,CAAC;AACjB;AAKA,IAAM,sBAAiD;AAAA,EACrD,kBAAkB,MAAM;AAAA,EACxB,kBAAkB,MAAM;AAAA,EACxB,iBAAiB,MAAM;AAAA,EAEvB,qBAAqB,MAAM;AAAA,EAC3B,qBAAqB,CAAC,MACpB,KAAK,EAAE,UAAU,IACb,oCAAoC,QAAQ,EAAE,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,OACvG;AAAA,EACN,uBAAuB,CAAC,MACtB,KAAK,EAAE,UAAU,IACb,8BAA8B,QAAQ,EAAE,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,OACvE;AAAA,EACN,sBAAsB,CAAC,MACrB,KAAK,EAAE,UAAU,IACb,gCAAgC,QAAQ,EAAE,CAAC,CAAC,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC,CAAC,OACzE;AAAA,EACN,sBAAsB,MAAM;AAAA,EAE5B,iBAAiB,CAAC,MAAO,KAAK,EAAE,UAAU,IAAI,qBAAqB,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;AAAA,EACtF,wBAAwB,CAAC,MACvB,KAAK,EAAE,UAAU,IACb,cAAc,QAAQ,EAAE,CAAC,CAAC,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC,CAAC,MACpE;AAAA,EACN,mBAAmB,CAAC,MAClB,KAAK,EAAE,UAAU,IAAI,8BAA8B,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO;AAAA,EACzE,iBAAiB,CAAC,MAAO,KAAK,EAAE,UAAU,IAAI,qBAAqB,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO;AAAA,EACvF,YAAY,MAAM;AAAA,EAClB,aAAa,MAAM;AAAA,EAEnB,uBAAuB,MAAM;AAAA,EAC7B,kBAAkB,MAAM;AAAA,EACxB,0BAA0B,MAAM;AAAA,EAChC,sBAAsB,MAAM;AAAA,EAC5B,kBAAkB,MAAM;AAAA,EAExB,oBAAoB,MAAM;AAAA,EAC1B,mBAAmB,MAAM;AAAA,EACzB,mBAAmB,MAAM;AAAA,EACzB,cAAc,MAAM;AAAA,EAEpB,iBAAiB,MAAM;AAAA,EACvB,iBAAiB,MAAM;AAAA,EACvB,sBAAsB,MAAM;AAAA,EAC5B,qBAAqB,MAAM;AAAA,EAC3B,uBAAuB,MAAM;AAAA,EAE7B,uBAAuB,MAAM;AAAA,EAC7B,oBAAoB,MAAM;AAAA,EAE1B,0BAA0B,MAAM;AAAA,EAChC,yBAAyB,MAAM;AAAA,EAC/B,8BAA8B,MAAM;AAAA,EAEpC,0BAA0B,MAAM;AAAA,EAChC,4BAA4B,MAAM;AACpC;AAGA,IAAM,qBAA6C;AAAA,EACjD,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB;AAEA,IAAM,sBAAsB;AAE5B,SAAS,aAAa,MAAsB;AAC1C,QAAM,SAAS,KAAK,QAAQ,sBAAsB,OAAO;AACzD,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEA,SAAS,UAAU,GAAmB;AACpC,QAAM,IAAI,EAAE,QAAQ,IAAI;AACxB,UAAQ,MAAM,KAAK,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,KAAK;AAC7C;AAGO,SAAS,oBAAoB,KAAkC;AACpE,MAAI,CAAC,KAAK;AACR,WAAO,IAAI,mBAAmB,WAAW,qBAAqB;AAAA,EAChE;AAEA,MAAI,eAAe,WAAW;AAC5B,UAAM,WAAW,IAAI,KAAK,CAAC,MAAM,aAAa,wBAAwB;AACtE,QAAI,UAAU;AACZ,aAAO,IAAI,mBAAmB,gBAAgB,iCAAiC;AAAA,IACjF;AAEA,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,MAAM,aAAa;AAAA,IACtB;AACA,QAAI,UAAU;AACZ,YAAM,YAAY,SAAS,MAAM;AACjC,YAAM,OAAO,SAAS,MAAM;AAC5B,UAAI,WAAW;AACb,cAAM,MAAM,oBAAoB,SAAS;AACzC,cAAM,UAAU,MAAM,IAAI,IAAI,IAAI,aAAa,SAAS;AACxD,eAAO,IAAI,mBAAmB,WAAW,OAAO;AAAA,MAClD;AACA,YAAM,MAAM,SAAS;AACrB,YAAM,WAAW,OAAO,IAAI,UAAU,sBAAsB,IAAI,MAAM,GAAG,mBAAmB,IAAI;AAChG,YAAM,kBAAkB,WAAW,mBAAmB,QAAQ,IAAI;AAClE,aAAO,IAAI;AAAA,QACT,YAAY;AAAA;AAAA,QAEZ,mBAAmB,SAAS,gBAAgB;AAAA,MAC9C;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,KAAK,CAAC,MAAM,aAAa,8BAA8B;AACxE,QAAI,MAAM,cAAc;AACtB,aAAO,IAAI,mBAAmB,mBAAmB,UAAU,KAAK,YAAY,CAAC;AAAA,IAC/E;AAEA,QAAI,IAAI,cAAc;AACpB,aAAO,IAAI,mBAAmB,cAAc,UAAU,IAAI,YAAY,CAAC;AAAA,IACzE;AACA,WAAO,IAAI,mBAAmB,cAAc,UAAU,IAAI,OAAO,CAAC;AAAA,EACpE;AAEA,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,mBAAmB,SAAS,UAAU,IAAI,OAAO,CAAC;AAAA,EAC/D;AACA,SAAO,IAAI,mBAAmB,WAAW,qBAAqB;AAChE;","names":["getAddress","getAddress"]}
@@ -1,10 +1,13 @@
1
- import { M as Market, C as CreateOfferParams, O as Offer, P as Position, c as ContractInfo, e as CustomerLimit } from './aliases-DzVxkXtK.js';
1
+ import { M as Market, C as CreateOfferParams, O as Offer, P as Position, A as PositionTransactions, c as ContractInfo, e as CustomerLimit } from './aliases-BGqwpyE-.cjs';
2
2
 
3
3
  declare const marketMovedCodes: Set<string>;
4
4
  type QuoteHint = {
5
5
  kind: "use-max-collateral";
6
6
  maxCollateralUsd: number;
7
7
  minCollateralUsd: number;
8
+ } | {
9
+ kind: "raise-collateral";
10
+ minCollateralUsd: number;
8
11
  } | {
9
12
  kind: "clamp-leverage";
10
13
  maxLeverageBps?: number;
@@ -17,6 +20,10 @@ type QuoteHint = {
17
20
  maxSlippageBps: number;
18
21
  } | {
19
22
  kind: "market-full";
23
+ } | {
24
+ kind: "insufficient-liquidity";
25
+ maxCollateralUsd: number;
26
+ minCollateralUsd: number;
20
27
  } | null;
21
28
  type Params = Record<string, unknown> | null | undefined;
22
29
  declare function quoteErrorHint(code: string | null, params: Params, context: {
@@ -28,7 +35,7 @@ type HintAdjustment = {
28
35
  fromValue: number;
29
36
  toValue: number;
30
37
  toLabel: string;
31
- reason: "max-collateral";
38
+ reason: "max-collateral" | "min-collateral";
32
39
  } | {
33
40
  field: "leverage";
34
41
  fromValue: number;
@@ -120,6 +127,7 @@ declare class DimesClient {
120
127
  promoteDraftQuote(draftId: string): Promise<Offer>;
121
128
  createQuote(params: CreateOfferParams): Promise<Offer>;
122
129
  getPositions(params?: GetPositionsParams): Promise<Position[]>;
130
+ getPositionTransactions(positionId: string): Promise<PositionTransactions>;
123
131
  cancelPosition(positionId: string): Promise<void>;
124
132
  getContractInfo(): Promise<ContractInfo>;
125
133
  getLimits(): Promise<CustomerLimit>;
@@ -1,10 +1,13 @@
1
- import { M as Market, C as CreateOfferParams, O as Offer, P as Position, c as ContractInfo, e as CustomerLimit } from './aliases-DzVxkXtK.cjs';
1
+ import { M as Market, C as CreateOfferParams, O as Offer, P as Position, A as PositionTransactions, c as ContractInfo, e as CustomerLimit } from './aliases-BGqwpyE-.js';
2
2
 
3
3
  declare const marketMovedCodes: Set<string>;
4
4
  type QuoteHint = {
5
5
  kind: "use-max-collateral";
6
6
  maxCollateralUsd: number;
7
7
  minCollateralUsd: number;
8
+ } | {
9
+ kind: "raise-collateral";
10
+ minCollateralUsd: number;
8
11
  } | {
9
12
  kind: "clamp-leverage";
10
13
  maxLeverageBps?: number;
@@ -17,6 +20,10 @@ type QuoteHint = {
17
20
  maxSlippageBps: number;
18
21
  } | {
19
22
  kind: "market-full";
23
+ } | {
24
+ kind: "insufficient-liquidity";
25
+ maxCollateralUsd: number;
26
+ minCollateralUsd: number;
20
27
  } | null;
21
28
  type Params = Record<string, unknown> | null | undefined;
22
29
  declare function quoteErrorHint(code: string | null, params: Params, context: {
@@ -28,7 +35,7 @@ type HintAdjustment = {
28
35
  fromValue: number;
29
36
  toValue: number;
30
37
  toLabel: string;
31
- reason: "max-collateral";
38
+ reason: "max-collateral" | "min-collateral";
32
39
  } | {
33
40
  field: "leverage";
34
41
  fromValue: number;
@@ -120,6 +127,7 @@ declare class DimesClient {
120
127
  promoteDraftQuote(draftId: string): Promise<Offer>;
121
128
  createQuote(params: CreateOfferParams): Promise<Offer>;
122
129
  getPositions(params?: GetPositionsParams): Promise<Position[]>;
130
+ getPositionTransactions(positionId: string): Promise<PositionTransactions>;
123
131
  cancelPosition(positionId: string): Promise<void>;
124
132
  getContractInfo(): Promise<ContractInfo>;
125
133
  getLimits(): Promise<CustomerLimit>;
@@ -1,4 +1,4 @@
1
- import { Q as QuoteHint } from './dimes-client-Bs6eTIvn.cjs';
1
+ import { Q as QuoteHint } from './dimes-client-C2hT6mZ8.cjs';
2
2
 
3
3
  declare class DimesError extends Error {
4
4
  readonly code: string;
@@ -1,4 +1,4 @@
1
- import { Q as QuoteHint } from './dimes-client-D88pW-Lm.js';
1
+ import { Q as QuoteHint } from './dimes-client-DFAKtIeI.js';
2
2
 
3
3
  declare class DimesError extends Error {
4
4
  readonly code: string;
package/dist/index.cjs CHANGED
@@ -4,17 +4,17 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkJWAPH4GDcjs = require('./chunk-JWAPH4GD.cjs');
7
+ var _chunkCOSLZ5TMcjs = require('./chunk-COSLZ5TM.cjs');
8
8
 
9
9
 
10
10
 
11
11
 
12
12
 
13
13
 
14
- var _chunkUUE4HG2Hcjs = require('./chunk-UUE4HG2H.cjs');
14
+ var _chunkDYPABUKCcjs = require('./chunk-DYPABUKC.cjs');
15
15
 
16
16
 
17
- var _chunkZK56XS4Xcjs = require('./chunk-ZK56XS4X.cjs');
17
+ var _chunkUHQZSMUDcjs = require('./chunk-UHQZSMUD.cjs');
18
18
 
19
19
  // src/client/dimes-client.ts
20
20
  var _humps = require('humps');
@@ -59,7 +59,7 @@ async function throwFromResponse(response) {
59
59
  const message = _nullishCoalesce(_optionalChain([parsed, 'optionalAccess', _5 => _5.error, 'optionalAccess', _6 => _6.message]), () => ( `API error ${response.status}`));
60
60
  const rawParams = _optionalChain([parsed, 'optionalAccess', _7 => _7.error, 'optionalAccess', _8 => _8.params]);
61
61
  const params = rawParams ? _humps.camelizeKeys.call(void 0, rawParams) : null;
62
- throw new (0, _chunkUUE4HG2Hcjs.DimesApiError)({ status: response.status, code, type, message, params });
62
+ throw new (0, _chunkDYPABUKCcjs.DimesApiError)({ status: response.status, code, type, message, params });
63
63
  }
64
64
  var HttpClient = class {
65
65
 
@@ -170,6 +170,11 @@ var DimesClient = class {
170
170
  const query = params ? buildQueryFromEntries(Object.entries(params)) : "";
171
171
  return this.http.requestList(`/v1/prediction-markets/positions${query}`);
172
172
  }
173
+ async getPositionTransactions(positionId) {
174
+ return this.http.request(
175
+ `/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/transactions`
176
+ );
177
+ }
173
178
  async cancelPosition(positionId) {
174
179
  await this.http.request(`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/cancel`, {
175
180
  method: "POST"
@@ -228,7 +233,7 @@ var ApiKeyAuth = (_class = class {
228
233
  });
229
234
  if (!response.ok) {
230
235
  const text = await response.text();
231
- throw new (0, _chunkUUE4HG2Hcjs.DimesError)("auth_token_failed", `Failed to obtain auth token (${response.status}): ${text}`);
236
+ throw new (0, _chunkDYPABUKCcjs.DimesError)("auth_token_failed", `Failed to obtain auth token (${response.status}): ${text}`);
232
237
  }
233
238
  const data = await response.json();
234
239
  this.jwt = data.token;
@@ -268,7 +273,7 @@ var JwtAuth = (_class2 = class {
268
273
  const response = await this.fetchFn(this.tokenUrl);
269
274
  if (!response.ok) {
270
275
  const text = await response.text();
271
- throw new (0, _chunkUUE4HG2Hcjs.DimesError)(
276
+ throw new (0, _chunkDYPABUKCcjs.DimesError)(
272
277
  "auth_token_failed",
273
278
  `Failed to fetch token from ${this.tokenUrl} (${response.status}): ${text}`
274
279
  );
@@ -464,5 +469,5 @@ function getOriginationFeeBreakdown(position) {
464
469
 
465
470
 
466
471
 
467
- exports.ApiKeyAuth = ApiKeyAuth; exports.DimesApiError = _chunkUUE4HG2Hcjs.DimesApiError; exports.DimesClient = DimesClient; exports.DimesContractError = _chunkUUE4HG2Hcjs.DimesContractError; exports.DimesError = _chunkUUE4HG2Hcjs.DimesError; exports.JwtAuth = JwtAuth; exports.buildQuoteParams = _chunkJWAPH4GDcjs.buildQuoteParams; exports.defaultSide = defaultSide; exports.executeQuote = _chunkJWAPH4GDcjs.executeQuote; exports.formatErrorMessage = _chunkUUE4HG2Hcjs.formatErrorMessage; exports.getOriginationFeeBreakdown = getOriginationFeeBreakdown; exports.getSidedEligibility = getSidedEligibility; exports.hintAdjustment = _chunkJWAPH4GDcjs.hintAdjustment; exports.isClosedPosition = isClosedPosition; exports.isFullyClosed = isFullyClosed; exports.isFullyOpen = isFullyOpen; exports.isOpenPosition = isOpenPosition; exports.leverageMaxBps = leverageMaxBps; exports.marketMovedCodes = _chunkJWAPH4GDcjs.marketMovedCodes; exports.maxLeverageBpsAtNotional = maxLeverageBpsAtNotional; exports.maxViableLeverageBpsForCollateral = maxViableLeverageBpsForCollateral; exports.positionEventTypes = _chunkZK56XS4Xcjs.positionEventTypes; exports.quoteErrorHint = _chunkJWAPH4GDcjs.quoteErrorHint; exports.rejectionReasonShort = rejectionReasonShort; exports.rejectionReasonText = rejectionReasonText; exports.resolveFriendlyMessage = _chunkUUE4HG2Hcjs.resolveFriendlyMessage;
472
+ exports.ApiKeyAuth = ApiKeyAuth; exports.DimesApiError = _chunkDYPABUKCcjs.DimesApiError; exports.DimesClient = DimesClient; exports.DimesContractError = _chunkDYPABUKCcjs.DimesContractError; exports.DimesError = _chunkDYPABUKCcjs.DimesError; exports.JwtAuth = JwtAuth; exports.buildQuoteParams = _chunkCOSLZ5TMcjs.buildQuoteParams; exports.defaultSide = defaultSide; exports.executeQuote = _chunkCOSLZ5TMcjs.executeQuote; exports.formatErrorMessage = _chunkDYPABUKCcjs.formatErrorMessage; exports.getOriginationFeeBreakdown = getOriginationFeeBreakdown; exports.getSidedEligibility = getSidedEligibility; exports.hintAdjustment = _chunkCOSLZ5TMcjs.hintAdjustment; exports.isClosedPosition = isClosedPosition; exports.isFullyClosed = isFullyClosed; exports.isFullyOpen = isFullyOpen; exports.isOpenPosition = isOpenPosition; exports.leverageMaxBps = leverageMaxBps; exports.marketMovedCodes = _chunkCOSLZ5TMcjs.marketMovedCodes; exports.maxLeverageBpsAtNotional = maxLeverageBpsAtNotional; exports.maxViableLeverageBpsForCollateral = maxViableLeverageBpsForCollateral; exports.positionEventTypes = _chunkUHQZSMUDcjs.positionEventTypes; exports.quoteErrorHint = _chunkCOSLZ5TMcjs.quoteErrorHint; exports.rejectionReasonShort = rejectionReasonShort; exports.rejectionReasonText = rejectionReasonText; exports.resolveFriendlyMessage = _chunkDYPABUKCcjs.resolveFriendlyMessage;
468
473
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/index.cjs","../src/client/dimes-client.ts","../src/client/http.ts","../src/client/auth.ts","../src/types/aliases.ts","../src/utils/eligibility.ts","../src/utils/leverage.ts","../src/utils/fees.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;AClBA,8BAA+B;ADoB/B;AACA;AErBA;AAeA,IAAM,kBAAA,EAAoB,GAAA;AAC1B,IAAM,uBAAA,EAAyB,GAAA;AAC/B,IAAM,oBAAA,EAAsB,CAAA;AAC5B,IAAM,2BAAA,EAA6B,GAAA;AACnC,IAAM,uBAAA,EAAyB,GAAA;AAC/B,IAAM,eAAA,EAAiB,CAAA;AACvB,IAAM,cAAA,EAAgB,GAAA;AAEtB,SAAS,KAAA,CAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAA,GAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEA,SAAS,iBAAA,CAAkB,MAAA,EAAuB,OAAA,EAAyB;AACzE,EAAA,MAAM,WAAA,EAAa,uBAAA,EAAyB,eAAA,GAAkB,OAAA;AAC9D,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAC7B,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,KAAA,CAAM,OAAO,EAAA,GAAK,QAAA,GAAW,CAAA,EAAG;AAC1C,IAAA,OAAO,QAAA,EAAU,aAAA;AAAA,EACnB;AAEA,EAAA,MAAM,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,UAAA;AACT;AAGA,MAAA,SAAe,iBAAA,CAAkB,QAAA,EAAoC;AACnE,EAAA,MAAM,QAAA,EAAU,MAAM,QAAA,CAAS,IAAA,CAAK,CAAA;AACpC,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,EAAS,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,OAAO,EAAA,EAAqB,IAAA;AAAA,EAC7D,EAAA,UAAQ;AACN,IAAA,OAAA,EAAS,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,KAAA,mCAAO,MAAA,2BAAQ,KAAA,6BAAO,MAAA,UAAQ,iBAAA;AACpC,EAAA,MAAM,KAAA,mCAAO,MAAA,6BAAQ,KAAA,6BAAO,MAAA,UAAQ,MAAA;AACpC,EAAA,MAAM,QAAA,mCAAU,MAAA,6BAAQ,KAAA,6BAAO,SAAA,UAAW,CAAA,UAAA,EAAa,QAAA,CAAS,MAAM,CAAA,GAAA;AACrC,EAAA;AACiD,EAAA;AAEnB,EAAA;AACjE;AAUwB;AACL,EAAA;AAEA,EAAA;AAEA,EAAA;AAEA,EAAA;AAEA,EAAA;AAEuB,EAAA;AACf,IAAA;AACH,IAAA;AAC4C,IAAA;AACxB,IAAA;AACU,IAAA;AACpD,EAAA;AAEyE,EAAA;AACxB,IAAA;AACP,IAAA;AACtB,MAAA;AACb,MAAA;AACU,MAAA;AACf,IAAA;AAE4D,IAAA;AACvD,MAAA;AACH,MAAA;AACD,IAAA;AAE+D,IAAA;AACtC,MAAA;AACwB,MAAA;AACQ,MAAA;AACnD,QAAA;AACoC,QAAA;AACxC,MAAA;AACH,IAAA;AAEoE,IAAA;AACX,MAAA;AACnB,MAAA;AAClC,QAAA;AACF,MAAA;AACmB,MAAA;AAC0B,MAAA;AACW,MAAA;AACnD,QAAA;AACiC,QAAA;AACrC,MAAA;AACH,IAAA;AAEkB,IAAA;AACgB,MAAA;AAClC,IAAA;AAEyC,IAAA;AAC3C,EAAA;AAE+E,EAAA;AACf,IAAA;AAChD,IAAA;AAChB,EAAA;AACF;AFrByE;AACA;AC3FJ;AACK,EAAA;AAC7C,EAAA;AAClB,IAAA;AACT,EAAA;AAEmC,EAAA;AACE,EAAA;AAC5B,IAAA;AAC6C,MAAA;AACtC,MAAA;AACd,IAAA;AACF,EAAA;AAE4B,EAAA;AAC9B;AAEyB;AACN,EAAA;AAEwB,EAAA;AACZ,IAAA;AACG,MAAA;AACd,MAAA;AACC,MAAA;AACK,MAAA;AACK,MAAA;AAC1B,IAAA;AACH,EAAA;AAE+E,EAAA;AACV,IAAA;AACiB,IAAA;AACtF,EAAA;AAEwD,EAAA;AACa,IAAA;AACrE,EAAA;AAEyE,EAAA;AACA,IAAA;AAC7D,MAAA;AACmC,MAAA;AAC5C,IAAA;AACH,EAAA;AAEgE,EAAA;AACY,IAAA;AAChE,MAAA;AACT,IAAA;AACH,EAAA;AAEoE,EAAA;AACD,IAAA;AACvD,MAAA;AACmC,MAAA;AAC5C,IAAA;AACH,EAAA;AAE4E,EAAA;AACP,IAAA;AACY,IAAA;AACjF,EAAA;AAE+D,EAAA;AACQ,IAAA;AAC3D,MAAA;AACT,IAAA;AACH,EAAA;AAEsD,EAAA;AACyB,IAAA;AAC/E,EAAA;AAEiD,EAAA;AACwB,IAAA;AACzE,EAAA;AACF;ADgFyE;AACA;AGtKzB;AACjB,iBAAA;AAET,kBAAA;AAE2B,kBAAA;AAE9B,EAAA;AAEA,EAAA;AAEA,EAAA;AAEA,EAAA;AAEuB,EAAA;AAChB,IAAA;AACO,IAAA;AACK,IAAA;AAC8B,IAAA;AAClE,EAAA;AAE2D,EAAA;AAC1B,IAAA;AACiB,IAAA;AAC3B,MAAA;AACrB,IAAA;AAC6C,IAAA;AAC/C,EAAA;AAEsC,EAAA;AACX,IAAA;AACZ,MAAA;AACX,MAAA;AACF,IAAA;AAEsC,IAAA;AAClC,IAAA;AACS,MAAA;AACX,IAAA;AACsB,MAAA;AACxB,IAAA;AACF,EAAA;AAE0C,EAAA;AACW,IAAA;AACzC,MAAA;AACC,MAAA;AACS,QAAA;AACoB,QAAA;AACtC,MAAA;AAC2D,MAAA;AAC5D,IAAA;AAEiB,IAAA;AACiB,MAAA;AACS,MAAA;AAC5C,IAAA;AAEkC,IAAA;AAClB,IAAA;AACmC,IAAA;AACrD,EAAA;AACF;AAO6C;AAC1B,EAAA;AAEA,EAAA;AAEY,kBAAA;AAET,kBAAA;AAE2B,kBAAA;AAEV,EAAA;AACX,IAAA;AACwC,IAAA;AAClE,EAAA;AAE2D,EAAA;AAC1B,IAAA;AACiB,IAAA;AAC3B,MAAA;AACrB,IAAA;AAC6C,IAAA;AAC/C,EAAA;AAEsC,EAAA;AACX,IAAA;AACZ,MAAA;AACX,MAAA;AACF,IAAA;AAEsC,IAAA;AAClC,IAAA;AACS,MAAA;AACX,IAAA;AACsB,MAAA;AACxB,IAAA;AACF,EAAA;AAE0C,EAAA;AACS,IAAA;AAE/B,IAAA;AACiB,MAAA;AACvB,MAAA;AACR,QAAA;AAC+D,QAAA;AACjE,MAAA;AACF,IAAA;AAEkC,IAAA;AAClB,IAAA;AACmC,IAAA;AACrD,EAAA;AACF;AH0IyE;AACA;AIzNV;AACzC,EAAA;AACtB;AAEmE;AAC9C,EAAA;AACrB;AAEgF;AACzB,EAAA;AAEjB,EAAA;AACtC;AJwNyE;AACA;AKvRH;AAC/C,EAAA;AACd,EAAA;AACA,IAAA;AACa,MAAA;AAC6B,MAAA;AAC/C,IAAA;AACI,IAAA;AACa,MAAA;AAC6B,MAAA;AAC9C,IAAA;AACF,EAAA;AACF;AAEwE;AACrB,EAAA;AACxC,IAAA;AACT,EAAA;AAC0B,EAAA;AACjB,IAAA;AACT,EAAA;AACyB,EAAA;AAChB,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAEoE;AACpB,EAAA;AAChD;AAEsE;AACpB,EAAA;AAClD;AAE6E;AAChE,EAAA;AACF,IAAA;AACT,EAAA;AAIG,EAAA;AACuD,EAAA;AAC5D;AAE8E;AACjE,EAAA;AACF,IAAA;AACT,EAAA;AAG4B,EAAA;AAIrB,EAAA;AACT;AL4QyE;AACA;AMjVzD;AACA;AACD;AACC;AACK;AAEiC;AAIiB;AACvC,EAAA;AAC+C,EAAA;AACtE,EAAA;AAC2B,IAAA;AACA,IAAA;AACC,IAAA;AACC,IAAA;AACpC,EAAA;AACF;AAE8E;AAC1D,EAAA;AACW,IAAA;AAC7B,EAAA;AAC6C,EAAA;AACY,EAAA;AAC3D;AAEoF;AAC3D,EAAA;AACgB,EAAA;AAClB,EAAA;AACZ,IAAA;AACT,EAAA;AAC6B,EAAA;AACb,IAAA;AAChB,EAAA;AAC4B,EAAA;AACb,IAAA;AACf,EAAA;AACyC,EAAA;AACnB,IAAA;AACI,IAAA;AACR,IAAA;AACd,MAAA;AACF,IAAA;AAC0B,IAAA;AACuB,MAAA;AACd,MAAA;AACnC,IAAA;AACF,EAAA;AACa,EAAA;AACf;AAQkG;AACzC,EAAA;AACA,EAAA;AAC9C,IAAA;AACT,EAAA;AAC2C,EAAA;AACO,EAAA;AACV,EAAA;AACuB,EAAA;AACjE;AAS6G;AACpD,EAAA;AACI,EAAA;AAClD,IAAA;AACT,EAAA;AAEgD,EAAA;AACjB,EAAA;AACsC,EAAA;AAEjC,EAAA;AACT,IAAA;AACkB,IAAA;AACqB,IAAA;AACvD,MAAA;AACT,IAAA;AACF,EAAA;AACO,EAAA;AACT;AN4TyE;AACA;AOtZpB;AACnC,EAAA;AAClB;AAEwF;AACvD,EAAA;AACR,EAAA;AAC6B,EAAA;AAGG,EAAA;AAEF,EAAA;AAEC,EAAA;AACvB,EAAA;AACD,EAAA;AAEvB,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;APkZyE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/alexemery/bl/dimes-sdk/dist/index.cjs","sourcesContent":[null,"import { decamelizeKeys } from \"humps\";\nimport type { ContractInfo, CreateOfferParams, Market, Offer, Position, Paginated, CustomerLimit } from \"../types\";\nimport type { AuthProvider } from \"./auth\";\nimport { HttpClient } from \"./http\";\n\nexport interface DimesClientOptions {\n baseUrl?: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport interface GetMarketsParams {\n cursor?: string;\n limit?: number;\n category?: string;\n status?: string;\n provider?: \"polymarket\" | \"kalshi\";\n}\n\nexport interface GetPositionsParams {\n cursor?: string;\n limit?: number;\n status?: \"open\" | \"closed\";\n}\n\nfunction buildQueryFromEntries(entries: [string, unknown][]): string {\n const filtered = entries.filter(([, v]) => v !== undefined && v !== null);\n if (filtered.length === 0) {\n return \"\";\n }\n\n const search = new URLSearchParams();\n for (const [key, value] of filtered) {\n search.set(\n key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n String(value),\n );\n }\n\n return `?${search.toString()}`;\n}\n\nexport class DimesClient {\n private readonly http: HttpClient;\n\n constructor(options: DimesClientOptions) {\n this.http = new HttpClient({\n baseUrl: options.baseUrl ?? \"https://api.dimes.fi\",\n auth: options.auth,\n fetch: options.fetch,\n maxRetries: options.maxRetries,\n maxRetryDelayMs: options.maxRetryDelayMs,\n });\n }\n\n public async getMarkets(params?: GetMarketsParams): Promise<Paginated<Market>> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.request<Paginated<Market>>(`/v1/prediction-markets/markets${query}`);\n }\n\n public async getMarket(ticker: string): Promise<Market> {\n return this.http.request<Market>(`/v1/prediction-markets/markets/${encodeURIComponent(ticker)}`);\n }\n\n public async createDraftQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/draft-quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async promoteDraftQuote(draftId: string): Promise<Offer> {\n return this.http.request<Offer>(`/v1/prediction-markets/promoted-quotes/${encodeURIComponent(draftId)}`, {\n method: \"POST\",\n });\n }\n\n public async createQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.requestList<Position>(`/v1/prediction-markets/positions${query}`);\n }\n\n public async cancelPosition(positionId: string): Promise<void> {\n await this.http.request<unknown>(`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/cancel`, {\n method: \"POST\",\n });\n }\n\n public async getContractInfo(): Promise<ContractInfo> {\n return this.http.request<ContractInfo>(\"/v1/prediction-markets/contract-info\");\n }\n\n public async getLimits(): Promise<CustomerLimit> {\n return this.http.request<CustomerLimit>(\"/v1/prediction-markets/limits\");\n }\n}\n","import { camelizeKeys, type Camelized } from \"humps\";\nimport { DimesApiError } from \"../errors/dimes-error\";\nimport type { AuthProvider } from \"./auth\";\n\nexport type { Camelized };\n\ninterface ApiErrorBody {\n error?: {\n type?: string;\n code?: string;\n message: string;\n params?: Record<string, unknown>;\n };\n}\n\nconst HTTP_UNAUTHORIZED = 401;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_MAX_RETRY_DELAY_MS = 60_000;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst BACKOFF_FACTOR = 2;\nconst MS_PER_SECOND = 1000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(header: string | null, attempt: number): number {\n const fallbackMs = DEFAULT_RETRY_DELAY_MS * BACKOFF_FACTOR ** attempt;\n if (!header) {\n return fallbackMs;\n }\n\n const seconds = Number(header);\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return seconds * MS_PER_SECOND;\n }\n\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return fallbackMs;\n}\n\n// eslint-disable-next-line complexity\nasync function throwFromResponse(response: Response): Promise<never> {\n const rawBody = await response.text();\n let parsed: ApiErrorBody | null;\n try {\n parsed = rawBody ? (JSON.parse(rawBody) as ApiErrorBody) : null;\n } catch {\n parsed = null;\n }\n\n const code = parsed?.error?.code ?? \"unknown_error\";\n const type = parsed?.error?.type ?? null;\n const message = parsed?.error?.message ?? `API error ${response.status}`;\n const rawParams = parsed?.error?.params;\n const params = rawParams ? (camelizeKeys(rawParams) as Record<string, unknown>) : null;\n\n throw new DimesApiError({ status: response.status, code, type, message, params });\n}\n\nexport interface HttpClientOptions {\n baseUrl: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n\n private readonly auth: AuthProvider;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly maxRetries: number;\n\n private readonly maxRetryDelayMs: number;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl;\n this.auth = options.auth;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.maxRetryDelayMs = options.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;\n }\n\n public async request<T>(path: string, options?: RequestInit): Promise<T> {\n const authHeaders = await this.auth.getHeaders();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeaders,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n let response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n });\n\n if (response.status === HTTP_UNAUTHORIZED && this.auth.refresh) {\n await this.auth.refresh();\n const retryHeaders = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...retryHeaders },\n });\n }\n\n for (let attempt = 0; response.status === HTTP_TOO_MANY_REQUESTS && attempt < this.maxRetries; attempt++) {\n const delayMs = parseRetryAfterMs(response.headers.get(\"retry-after\"), attempt);\n if (delayMs > this.maxRetryDelayMs) {\n break;\n }\n await sleep(delayMs);\n const freshAuth = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...freshAuth },\n });\n }\n\n if (!response.ok) {\n await throwFromResponse(response);\n }\n\n return camelizeKeys(await response.json()) as T;\n }\n\n public async requestList<T>(path: string, options?: RequestInit): Promise<T[]> {\n const result = await this.request<{ data: T[] }>(path, options);\n return result.data;\n }\n}\n","import { DimesError } from \"../errors/dimes-error\";\n\nexport interface AuthProvider {\n getHeaders(): Promise<Record<string, string>>;\n refresh?(): Promise<void>;\n}\n\ninterface TokenResponse {\n token: string;\n expires_at: string;\n}\n\nexport interface ApiKeyAuthOptions {\n apiKey: string;\n walletAddress: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class ApiKeyAuth implements AuthProvider {\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n private readonly apiKey: string;\n\n private readonly walletAddress: string;\n\n private readonly baseUrl: string;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(options: ApiKeyAuthOptions) {\n this.apiKey = options.apiKey;\n this.walletAddress = options.walletAddress;\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(`${this.baseUrl}/v1/prediction-markets/tokens`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ wallet_address: this.walletAddress }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\"auth_token_failed\", `Failed to obtain auth token (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n\nexport interface JwtAuthOptions {\n tokenUrl: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class JwtAuth implements AuthProvider {\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly tokenUrl: string;\n\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n constructor(options: JwtAuthOptions) {\n this.tokenUrl = options.tokenUrl;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(this.tokenUrl);\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\n \"auth_token_failed\",\n `Failed to fetch token from ${this.tokenUrl} (${response.status}): ${text}`,\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n","import type { CamelizeKeys } from \"./camelize\";\nimport type { components } from \"./generated\";\n\ntype Raw = components[\"schemas\"];\n\nexport type Market = CamelizeKeys<Raw[\"CustomerMarket\"]>;\n\nexport type MarketLeverage = CamelizeKeys<Raw[\"CustomerLeverage\"]>;\n\nexport type MarketMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerSidedMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedEligibility = CamelizeKeys<Raw[\"CustomerSidedEligibility\"]>;\n\nexport type MarketFees = CamelizeKeys<Raw[\"CustomerFees\"]>;\n\nexport type MarketPrices = CamelizeKeys<Raw[\"CustomerMarketPrices\"]>;\n\nexport type OriginationTier = CamelizeKeys<Raw[\"CustomerOriginationTier\"]>;\n\nexport type Offer = CamelizeKeys<Raw[\"CustomerOffer\"]>;\n\nexport type OpenPosition = CamelizeKeys<Raw[\"CustomerOpenPosition\"]>;\n\nexport type ClosedPosition = CamelizeKeys<Raw[\"CustomerClosedPosition\"]>;\n\nexport type Position = OpenPosition | ClosedPosition;\n\nexport type PositionEntry = CamelizeKeys<Raw[\"CustomerPositionEntry\"]>;\n\nexport type PositionCurrent = CamelizeKeys<Raw[\"CustomerPositionCurrent\"]>;\n\nexport type PositionRisk = CamelizeKeys<Raw[\"CustomerPositionRisk\"]>;\n\nexport type PositionOpenFees = CamelizeKeys<Raw[\"CustomerPositionOpenFees\"]>;\n\nexport type PositionClosedFees = CamelizeKeys<Raw[\"CustomerPositionClosedFees\"]>;\n\nexport type PositionResult = CamelizeKeys<Raw[\"CustomerPositionResult\"]>;\n\nexport type PositionTiming = CamelizeKeys<Raw[\"CustomerPositionTiming\"]>;\n\nexport type PositionFailure = CamelizeKeys<Raw[\"CustomerPositionFailure\"]>;\n\nexport type PositionUnwind = CamelizeKeys<Raw[\"CustomerPositionUnwind\"]>;\n\nexport type PositionUnwindList = CamelizeKeys<Raw[\"CustomerPositionUnwindList\"]>;\n\nexport type ContractInfo = CamelizeKeys<Raw[\"CustomerContractInfo\"]>;\n\nexport type CustomerLimit = CamelizeKeys<Raw[\"CustomerLimit\"]>;\n\nexport type CreateTokenResult = CamelizeKeys<Raw[\"CreateTokenResult\"]>;\n\nexport interface CreateOfferParams {\n marketTicker: string;\n effectiveSide: \"yes\" | \"no\";\n leverageBps: number;\n notionalAmountUsdPips: string;\n slippageBps: number;\n pmProvider?: \"polymarket\" | \"kalshi\";\n}\n\nexport function isOpenPosition(p: Position): p is OpenPosition {\n return \"current\" in p;\n}\n\nexport function isClosedPosition(p: Position): p is ClosedPosition {\n return \"result\" in p;\n}\n\nexport function leverageMaxBps(lev: MarketLeverage, side: \"yes\" | \"no\"): number {\n const perSide = side === \"yes\" ? lev.maxYesBps : lev.maxNoBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return perSide ?? lev.maxBps ?? lev.minBps;\n}\n","import type { Market } from \"../types/aliases\";\n\nexport type Side = \"yes\" | \"no\";\n\nexport interface SideEligibility {\n open: boolean;\n reasonCode: string | null;\n}\n\nexport interface SidedEligibility {\n yes: SideEligibility;\n no: SideEligibility;\n}\n\nexport function getSidedEligibility(market: Market): SidedEligibility {\n const sided = market.sidedEligibility;\n return {\n yes: {\n open: sided.yes.acceptingNewPositions,\n reasonCode: sided.yes.rejectionReasonCode ?? null,\n },\n no: {\n open: sided.no.acceptingNewPositions,\n reasonCode: sided.no.rejectionReasonCode ?? null,\n },\n };\n}\n\nexport function defaultSide(eligibility: SidedEligibility): Side | null {\n if (eligibility.yes.open && eligibility.no.open) {\n return \"yes\";\n }\n if (eligibility.yes.open) {\n return \"yes\";\n }\n if (eligibility.no.open) {\n return \"no\";\n }\n return null;\n}\n\nexport function isFullyOpen(eligibility: SidedEligibility): boolean {\n return eligibility.yes.open && eligibility.no.open;\n}\n\nexport function isFullyClosed(eligibility: SidedEligibility): boolean {\n return !eligibility.yes.open && !eligibility.no.open;\n}\n\nexport function rejectionReasonText(code: string | null | undefined): string {\n if (!code) {\n return \"Not eligible for new positions\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped.charAt(0).toUpperCase() + stripped.slice(1);\n}\n\nexport function rejectionReasonShort(code: string | null | undefined): string {\n if (!code) {\n return \"unavailable\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replace(/_exceeded$/i, \"\")\n .replace(/_too_(low|high)$/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped;\n}\n","import { type Market, type MarketMaxLeveragePerNotional, leverageMaxBps } from \"../types/aliases\";\nimport type { Side } from \"./eligibility\";\n\nconst USD_100 = 100;\nconst USD_500 = 500;\nconst USD_1K = 1_000;\nconst USD_10K = 10_000;\nconst BPS_PER_UNIT = 10_000;\n\nconst ANCHORS_USD = [USD_100, USD_500, USD_1K, USD_10K] as const;\n\ntype Anchor = readonly [usd: number, bps: number];\n\nfunction anchorsForSide(market: Market, side: Side): readonly Anchor[] {\n const sided = market.leverage.maxMarketLeveragePerNotional;\n const per: MarketMaxLeveragePerNotional = side === \"yes\" ? sided.yes : sided.no;\n return [\n [ANCHORS_USD[0], per.at100UsdBps],\n [ANCHORS_USD[1], per.at500UsdBps],\n [ANCHORS_USD[2], per.at1000UsdBps],\n [ANCHORS_USD[3], per.at10000UsdBps],\n ];\n}\n\nfunction snapDownToStep(bps: number, stepBps: number, minBps: number): number {\n if (stepBps <= 0) {\n return Math.max(minBps, bps);\n }\n const k = Math.floor((bps - minBps) / stepBps);\n return Math.max(minBps, minBps + Math.max(0, k) * stepBps);\n}\n\nfunction interpolateRawBps(anchors: readonly Anchor[], notionalUsd: number): number {\n const first = anchors[0];\n const last = anchors[anchors.length - 1];\n if (!first || !last) {\n return 0;\n }\n if (notionalUsd <= first[0]) {\n return first[1];\n }\n if (notionalUsd >= last[0]) {\n return last[1];\n }\n for (let i = 1; i < anchors.length; i++) {\n const hi = anchors[i];\n const lo = anchors[i - 1];\n if (!hi || !lo) {\n continue;\n }\n if (notionalUsd <= hi[0]) {\n const t = (notionalUsd - lo[0]) / (hi[0] - lo[0]);\n return lo[1] + (hi[1] - lo[1]) * t;\n }\n }\n return last[1];\n}\n\n/**\n * Maximum leverage in basis points the API will allow at a given notional, per side.\n * Piecewise-linear interpolation across the four anchor points ($100/$500/$1k/$10k).\n * Below $100 uses the $100 cap; above $10k uses the $10k cap. Result is clamped to\n * the absolute side max and rounded down to `stepBps`.\n */\nexport function maxLeverageBpsAtNotional(market: Market, side: Side, notionalUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(notionalUsd) || notionalUsd <= 0) {\n return sideAbsMax;\n }\n const anchors = anchorsForSide(market, side);\n const raw = interpolateRawBps(anchors, notionalUsd);\n const clamped = Math.min(sideAbsMax, raw);\n return snapDownToStep(clamped, market.leverage.stepBps, market.leverage.minBps);\n}\n\n/**\n * Largest leverage (bps) the user can pick for a given collateral such that the\n * resulting notional still satisfies the per-notional cap.\n *\n * Walks down from the absolute side max in `stepBps` increments and returns the\n * first leverage `lev` where `lev <= maxLeverageBpsAtNotional(collateral * lev / 1)`.\n */\nexport function maxViableLeverageBpsForCollateral(market: Market, side: Side, collateralUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(collateralUsd) || collateralUsd <= 0) {\n return sideAbsMax;\n }\n\n const step = Math.max(market.leverage.stepBps, 1);\n const minBps = market.leverage.minBps;\n const maxSteps = Math.max(0, Math.floor((sideAbsMax - minBps) / step));\n\n for (let i = maxSteps; i >= 0; i--) {\n const lev = minBps + i * step;\n const notionalUsd = collateralUsd * (lev / BPS_PER_UNIT);\n if (lev <= maxLeverageBpsAtNotional(market, side, notionalUsd)) {\n return lev;\n }\n }\n return minBps;\n}\n","import type { Position, PositionEntry } from \"../types/aliases\";\n\nexport interface OriginationFeeBreakdown {\n totalBps: number;\n totalUsd: number;\n protocolBps: number;\n protocolUsd: number;\n partnerBps: number;\n partnerUsd: number;\n}\n\nfunction getEntry(position: Position): PositionEntry {\n return position.entry;\n}\n\nexport function getOriginationFeeBreakdown(position: Position): OriginationFeeBreakdown {\n const entry = getEntry(position);\n const totalBps = entry.originationFeeBps;\n const totalUsd = Number(entry.originationFeeUsd) || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const protocolBps = entry.protocolOriginationFeeBps ?? totalBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const partnerBps = entry.partnerOriginationFeeBps ?? 0;\n\n const share = totalBps > 0 ? protocolBps / totalBps : 1;\n const protocolUsd = totalUsd * share;\n const partnerUsd = totalUsd - protocolUsd;\n\n return {\n totalBps,\n totalUsd,\n protocolBps,\n protocolUsd,\n partnerBps,\n partnerUsd,\n };\n}\n"]}
1
+ {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/index.cjs","../src/client/dimes-client.ts","../src/client/http.ts","../src/client/auth.ts","../src/types/aliases.ts","../src/utils/eligibility.ts","../src/utils/leverage.ts","../src/utils/fees.ts"],"names":[],"mappings":"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nC,IAAA;AACF,EAAA;AACa,EAAA;AACf;AAQkG;AACzC,EAAA;AACA,EAAA;AAC9C,IAAA;AACT,EAAA;AAC2C,EAAA;AACO,EAAA;AACV,EAAA;AACuB,EAAA;AACjE;AAS6G;AACpD,EAAA;AACI,EAAA;AAClD,IAAA;AACT,EAAA;AAEgD,EAAA;AACjB,EAAA;AACsC,EAAA;AAEjC,EAAA;AACT,IAAA;AACkB,IAAA;AACqB,IAAA;AACvD,MAAA;AACT,IAAA;AACF,EAAA;AACO,EAAA;AACT;ANiUyE;AACA;AO3ZpB;AACnC,EAAA;AAClB;AAEwF;AACvD,EAAA;AACR,EAAA;AAC6B,EAAA;AAGG,EAAA;AAEF,EAAA;AAEC,EAAA;AACvB,EAAA;AACD,EAAA;AAEvB,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;APuZyE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/alexemery/bl/dimes-sdk/dist/index.cjs","sourcesContent":[null,"import { decamelizeKeys } from \"humps\";\nimport type {\n ContractInfo,\n CreateOfferParams,\n CustomerLimit,\n Market,\n Offer,\n Paginated,\n Position,\n PositionTransactions,\n} from \"../types\";\nimport type { AuthProvider } from \"./auth\";\nimport { HttpClient } from \"./http\";\n\nexport interface DimesClientOptions {\n baseUrl?: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport interface GetMarketsParams {\n cursor?: string;\n limit?: number;\n category?: string;\n status?: string;\n provider?: \"polymarket\" | \"kalshi\";\n}\n\nexport interface GetPositionsParams {\n cursor?: string;\n limit?: number;\n status?: \"open\" | \"closed\";\n}\n\nfunction buildQueryFromEntries(entries: [string, unknown][]): string {\n const filtered = entries.filter(([, v]) => v !== undefined && v !== null);\n if (filtered.length === 0) {\n return \"\";\n }\n\n const search = new URLSearchParams();\n for (const [key, value] of filtered) {\n search.set(\n key.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`),\n String(value),\n );\n }\n\n return `?${search.toString()}`;\n}\n\nexport class DimesClient {\n private readonly http: HttpClient;\n\n constructor(options: DimesClientOptions) {\n this.http = new HttpClient({\n baseUrl: options.baseUrl ?? \"https://api.dimes.fi\",\n auth: options.auth,\n fetch: options.fetch,\n maxRetries: options.maxRetries,\n maxRetryDelayMs: options.maxRetryDelayMs,\n });\n }\n\n public async getMarkets(params?: GetMarketsParams): Promise<Paginated<Market>> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.request<Paginated<Market>>(`/v1/prediction-markets/markets${query}`);\n }\n\n public async getMarket(ticker: string): Promise<Market> {\n return this.http.request<Market>(`/v1/prediction-markets/markets/${encodeURIComponent(ticker)}`);\n }\n\n public async createDraftQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/draft-quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async promoteDraftQuote(draftId: string): Promise<Offer> {\n return this.http.request<Offer>(`/v1/prediction-markets/promoted-quotes/${encodeURIComponent(draftId)}`, {\n method: \"POST\",\n });\n }\n\n public async createQuote(params: CreateOfferParams): Promise<Offer> {\n return this.http.request<Offer>(\"/v1/prediction-markets/quotes\", {\n method: \"POST\",\n body: JSON.stringify(decamelizeKeys(params)),\n });\n }\n\n public async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n const query = params ? buildQueryFromEntries(Object.entries(params)) : \"\";\n return this.http.requestList<Position>(`/v1/prediction-markets/positions${query}`);\n }\n\n public async getPositionTransactions(positionId: string): Promise<PositionTransactions> {\n return this.http.request<PositionTransactions>(\n `/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/transactions`,\n );\n }\n\n public async cancelPosition(positionId: string): Promise<void> {\n await this.http.request<unknown>(`/v1/prediction-markets/positions/${encodeURIComponent(positionId)}/cancel`, {\n method: \"POST\",\n });\n }\n\n public async getContractInfo(): Promise<ContractInfo> {\n return this.http.request<ContractInfo>(\"/v1/prediction-markets/contract-info\");\n }\n\n public async getLimits(): Promise<CustomerLimit> {\n return this.http.request<CustomerLimit>(\"/v1/prediction-markets/limits\");\n }\n}\n","import { camelizeKeys, type Camelized } from \"humps\";\nimport { DimesApiError } from \"../errors/dimes-error\";\nimport type { AuthProvider } from \"./auth\";\n\nexport type { Camelized };\n\ninterface ApiErrorBody {\n error?: {\n type?: string;\n code?: string;\n message: string;\n params?: Record<string, unknown>;\n };\n}\n\nconst HTTP_UNAUTHORIZED = 401;\nconst HTTP_TOO_MANY_REQUESTS = 429;\nconst DEFAULT_MAX_RETRIES = 3;\nconst DEFAULT_MAX_RETRY_DELAY_MS = 60_000;\nconst DEFAULT_RETRY_DELAY_MS = 1000;\nconst BACKOFF_FACTOR = 2;\nconst MS_PER_SECOND = 1000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction parseRetryAfterMs(header: string | null, attempt: number): number {\n const fallbackMs = DEFAULT_RETRY_DELAY_MS * BACKOFF_FACTOR ** attempt;\n if (!header) {\n return fallbackMs;\n }\n\n const seconds = Number(header);\n if (!Number.isNaN(seconds) && seconds >= 0) {\n return seconds * MS_PER_SECOND;\n }\n\n const dateMs = Date.parse(header);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, dateMs - Date.now());\n }\n\n return fallbackMs;\n}\n\n// eslint-disable-next-line complexity\nasync function throwFromResponse(response: Response): Promise<never> {\n const rawBody = await response.text();\n let parsed: ApiErrorBody | null;\n try {\n parsed = rawBody ? (JSON.parse(rawBody) as ApiErrorBody) : null;\n } catch {\n parsed = null;\n }\n\n const code = parsed?.error?.code ?? \"unknown_error\";\n const type = parsed?.error?.type ?? null;\n const message = parsed?.error?.message ?? `API error ${response.status}`;\n const rawParams = parsed?.error?.params;\n const params = rawParams ? (camelizeKeys(rawParams) as Record<string, unknown>) : null;\n\n throw new DimesApiError({ status: response.status, code, type, message, params });\n}\n\nexport interface HttpClientOptions {\n baseUrl: string;\n auth: AuthProvider;\n fetch?: typeof globalThis.fetch;\n maxRetries?: number;\n maxRetryDelayMs?: number;\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n\n private readonly auth: AuthProvider;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly maxRetries: number;\n\n private readonly maxRetryDelayMs: number;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl;\n this.auth = options.auth;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.maxRetryDelayMs = options.maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;\n }\n\n public async request<T>(path: string, options?: RequestInit): Promise<T> {\n const authHeaders = await this.auth.getHeaders();\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeaders,\n ...(options?.headers as Record<string, string> | undefined),\n };\n\n let response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers,\n });\n\n if (response.status === HTTP_UNAUTHORIZED && this.auth.refresh) {\n await this.auth.refresh();\n const retryHeaders = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...retryHeaders },\n });\n }\n\n for (let attempt = 0; response.status === HTTP_TOO_MANY_REQUESTS && attempt < this.maxRetries; attempt++) {\n const delayMs = parseRetryAfterMs(response.headers.get(\"retry-after\"), attempt);\n if (delayMs > this.maxRetryDelayMs) {\n break;\n }\n await sleep(delayMs);\n const freshAuth = await this.auth.getHeaders();\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...options,\n headers: { ...headers, ...freshAuth },\n });\n }\n\n if (!response.ok) {\n await throwFromResponse(response);\n }\n\n return camelizeKeys(await response.json()) as T;\n }\n\n public async requestList<T>(path: string, options?: RequestInit): Promise<T[]> {\n const result = await this.request<{ data: T[] }>(path, options);\n return result.data;\n }\n}\n","import { DimesError } from \"../errors/dimes-error\";\n\nexport interface AuthProvider {\n getHeaders(): Promise<Record<string, string>>;\n refresh?(): Promise<void>;\n}\n\ninterface TokenResponse {\n token: string;\n expires_at: string;\n}\n\nexport interface ApiKeyAuthOptions {\n apiKey: string;\n walletAddress: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class ApiKeyAuth implements AuthProvider {\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n private readonly apiKey: string;\n\n private readonly walletAddress: string;\n\n private readonly baseUrl: string;\n\n private readonly fetchFn: typeof globalThis.fetch;\n\n constructor(options: ApiKeyAuthOptions) {\n this.apiKey = options.apiKey;\n this.walletAddress = options.walletAddress;\n this.baseUrl = options.baseUrl ?? \"https://api.dimes.fi\";\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(`${this.baseUrl}/v1/prediction-markets/tokens`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ wallet_address: this.walletAddress }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\"auth_token_failed\", `Failed to obtain auth token (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n\nexport interface JwtAuthOptions {\n tokenUrl: string;\n fetch?: typeof globalThis.fetch;\n}\n\nexport class JwtAuth implements AuthProvider {\n private readonly fetchFn: typeof globalThis.fetch;\n\n private readonly tokenUrl: string;\n\n private jwt: string | null = null;\n\n private expiresAt = 0;\n\n private refreshPromise: Promise<void> | null = null;\n\n constructor(options: JwtAuthOptions) {\n this.tokenUrl = options.tokenUrl;\n this.fetchFn = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n public async getHeaders(): Promise<Record<string, string>> {\n const TOKEN_EXPIRY_BUFFER_MS = 30_000;\n if (!this.jwt || Date.now() >= this.expiresAt - TOKEN_EXPIRY_BUFFER_MS) {\n await this.refresh();\n }\n return { Authorization: `Bearer ${this.jwt}` };\n }\n\n public async refresh(): Promise<void> {\n if (this.refreshPromise) {\n await this.refreshPromise;\n return;\n }\n\n this.refreshPromise = this.fetchToken();\n try {\n await this.refreshPromise;\n } finally {\n this.refreshPromise = null;\n }\n }\n\n private async fetchToken(): Promise<void> {\n const response = await this.fetchFn(this.tokenUrl);\n\n if (!response.ok) {\n const text = await response.text();\n throw new DimesError(\n \"auth_token_failed\",\n `Failed to fetch token from ${this.tokenUrl} (${response.status}): ${text}`,\n );\n }\n\n const data = (await response.json()) as TokenResponse;\n this.jwt = data.token;\n this.expiresAt = new Date(data.expires_at).getTime();\n }\n}\n","import type { CamelizeKeys } from \"./camelize\";\nimport type { components } from \"./generated\";\n\ntype Raw = components[\"schemas\"];\n\nexport type Market = CamelizeKeys<Raw[\"CustomerMarket\"]>;\n\nexport type MarketLeverage = CamelizeKeys<Raw[\"CustomerLeverage\"]>;\n\nexport type MarketMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedMaxLeveragePerNotional = CamelizeKeys<Raw[\"CustomerSidedMaxMarketLeveragePerNotional\"]>;\n\nexport type MarketSidedEligibility = CamelizeKeys<Raw[\"CustomerSidedEligibility\"]>;\n\nexport type MarketFees = CamelizeKeys<Raw[\"CustomerFees\"]>;\n\nexport type MarketPrices = CamelizeKeys<Raw[\"CustomerMarketPrices\"]>;\n\nexport interface MarketPolymarket {\n conditionId: string | null;\n noTokenId: string;\n slug: string;\n yesTokenId: string;\n}\n\nexport type OriginationTier = CamelizeKeys<Raw[\"CustomerOriginationTier\"]>;\n\nexport type Offer = CamelizeKeys<Raw[\"CustomerOffer\"]>;\n\nexport type OpenPosition = CamelizeKeys<Raw[\"CustomerOpenPosition\"]>;\n\nexport type ClosedPosition = CamelizeKeys<Raw[\"CustomerClosedPosition\"]>;\n\nexport type Position = OpenPosition | ClosedPosition;\n\nexport type PositionEntry = CamelizeKeys<Raw[\"CustomerPositionEntry\"]>;\n\nexport type PositionCurrent = CamelizeKeys<Raw[\"CustomerPositionCurrent\"]>;\n\nexport type PositionRisk = CamelizeKeys<Raw[\"CustomerPositionRisk\"]>;\n\nexport type PositionOpenFees = CamelizeKeys<Raw[\"CustomerPositionOpenFees\"]>;\n\nexport type PositionClosedFees = CamelizeKeys<Raw[\"CustomerPositionClosedFees\"]>;\n\nexport type PositionResult = CamelizeKeys<Raw[\"CustomerPositionResult\"]>;\n\nexport type PositionTiming = CamelizeKeys<Raw[\"CustomerPositionTiming\"]>;\n\nexport type PositionFailure = CamelizeKeys<Raw[\"CustomerPositionFailure\"]>;\n\nexport type PositionUnwind = CamelizeKeys<Raw[\"CustomerPositionUnwind\"]>;\n\nexport type PositionUnwindList = CamelizeKeys<Raw[\"CustomerPositionUnwindList\"]>;\n\nexport type PositionTransactionEntry = CamelizeKeys<Raw[\"PositionTransactionEntry\"]>;\n\nexport type PositionTransactionGroup = CamelizeKeys<Raw[\"PositionTransactionGroup\"]>;\n\nexport type PositionTransactions = CamelizeKeys<Raw[\"PositionTransactions\"]>;\n\nexport type ContractInfo = CamelizeKeys<Raw[\"CustomerContractInfo\"]>;\n\nexport type CustomerLimit = CamelizeKeys<Raw[\"CustomerLimit\"]>;\n\nexport type CreateTokenResult = CamelizeKeys<Raw[\"CreateTokenResult\"]>;\n\nexport interface CreateOfferParams {\n marketTicker: string;\n effectiveSide: \"yes\" | \"no\";\n leverageBps: number;\n notionalAmountUsdPips: string;\n slippageBps: number;\n pmProvider?: \"polymarket\" | \"kalshi\";\n}\n\nexport function isOpenPosition(p: Position): p is OpenPosition {\n return \"current\" in p;\n}\n\nexport function isClosedPosition(p: Position): p is ClosedPosition {\n return \"result\" in p;\n}\n\nexport function leverageMaxBps(lev: MarketLeverage, side: \"yes\" | \"no\"): number {\n const perSide = side === \"yes\" ? lev.maxYesBps : lev.maxNoBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return perSide ?? lev.maxBps ?? lev.minBps;\n}\n","import type { Market } from \"../types/aliases\";\n\nexport type Side = \"yes\" | \"no\";\n\nexport interface SideEligibility {\n open: boolean;\n reasonCode: string | null;\n}\n\nexport interface SidedEligibility {\n yes: SideEligibility;\n no: SideEligibility;\n}\n\nexport function getSidedEligibility(market: Market): SidedEligibility {\n const sided = market.sidedEligibility;\n return {\n yes: {\n open: sided.yes.acceptingNewPositions,\n reasonCode: sided.yes.rejectionReasonCode ?? null,\n },\n no: {\n open: sided.no.acceptingNewPositions,\n reasonCode: sided.no.rejectionReasonCode ?? null,\n },\n };\n}\n\nexport function defaultSide(eligibility: SidedEligibility): Side | null {\n if (eligibility.yes.open && eligibility.no.open) {\n return \"yes\";\n }\n if (eligibility.yes.open) {\n return \"yes\";\n }\n if (eligibility.no.open) {\n return \"no\";\n }\n return null;\n}\n\nexport function isFullyOpen(eligibility: SidedEligibility): boolean {\n return eligibility.yes.open && eligibility.no.open;\n}\n\nexport function isFullyClosed(eligibility: SidedEligibility): boolean {\n return !eligibility.yes.open && !eligibility.no.open;\n}\n\nexport function rejectionReasonText(code: string | null | undefined): string {\n if (!code) {\n return \"Not eligible for new positions\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped.charAt(0).toUpperCase() + stripped.slice(1);\n}\n\nexport function rejectionReasonShort(code: string | null | undefined): string {\n if (!code) {\n return \"unavailable\";\n }\n const stripped = code\n .replace(/^quote_/i, \"\")\n .replace(/_exceeded$/i, \"\")\n .replace(/_too_(low|high)$/i, \"\")\n .replaceAll(\"_\", \" \")\n .toLowerCase();\n return stripped;\n}\n","import { type Market, type MarketMaxLeveragePerNotional, leverageMaxBps } from \"../types/aliases\";\nimport type { Side } from \"./eligibility\";\n\nconst USD_100 = 100;\nconst USD_500 = 500;\nconst USD_1K = 1_000;\nconst USD_10K = 10_000;\nconst BPS_PER_UNIT = 10_000;\n\nconst ANCHORS_USD = [USD_100, USD_500, USD_1K, USD_10K] as const;\n\ntype Anchor = readonly [usd: number, bps: number];\n\nfunction anchorsForSide(market: Market, side: Side): readonly Anchor[] {\n const sided = market.leverage.maxMarketLeveragePerNotional;\n const per: MarketMaxLeveragePerNotional = side === \"yes\" ? sided.yes : sided.no;\n return [\n [ANCHORS_USD[0], per.at100UsdBps],\n [ANCHORS_USD[1], per.at500UsdBps],\n [ANCHORS_USD[2], per.at1000UsdBps],\n [ANCHORS_USD[3], per.at10000UsdBps],\n ];\n}\n\nfunction snapDownToStep(bps: number, stepBps: number, minBps: number): number {\n if (stepBps <= 0) {\n return Math.max(minBps, bps);\n }\n const k = Math.floor((bps - minBps) / stepBps);\n return Math.max(minBps, minBps + Math.max(0, k) * stepBps);\n}\n\nfunction interpolateRawBps(anchors: readonly Anchor[], notionalUsd: number): number {\n const first = anchors[0];\n const last = anchors[anchors.length - 1];\n if (!first || !last) {\n return 0;\n }\n if (notionalUsd <= first[0]) {\n return first[1];\n }\n if (notionalUsd >= last[0]) {\n return last[1];\n }\n for (let i = 1; i < anchors.length; i++) {\n const hi = anchors[i];\n const lo = anchors[i - 1];\n if (!hi || !lo) {\n continue;\n }\n if (notionalUsd <= hi[0]) {\n const t = (notionalUsd - lo[0]) / (hi[0] - lo[0]);\n return lo[1] + (hi[1] - lo[1]) * t;\n }\n }\n return last[1];\n}\n\n/**\n * Maximum leverage in basis points the API will allow at a given notional, per side.\n * Piecewise-linear interpolation across the four anchor points ($100/$500/$1k/$10k).\n * Below $100 uses the $100 cap; above $10k uses the $10k cap. Result is clamped to\n * the absolute side max and rounded down to `stepBps`.\n */\nexport function maxLeverageBpsAtNotional(market: Market, side: Side, notionalUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(notionalUsd) || notionalUsd <= 0) {\n return sideAbsMax;\n }\n const anchors = anchorsForSide(market, side);\n const raw = interpolateRawBps(anchors, notionalUsd);\n const clamped = Math.min(sideAbsMax, raw);\n return snapDownToStep(clamped, market.leverage.stepBps, market.leverage.minBps);\n}\n\n/**\n * Largest leverage (bps) the user can pick for a given collateral such that the\n * resulting notional still satisfies the per-notional cap.\n *\n * Walks down from the absolute side max in `stepBps` increments and returns the\n * first leverage `lev` where `lev <= maxLeverageBpsAtNotional(collateral * lev / 1)`.\n */\nexport function maxViableLeverageBpsForCollateral(market: Market, side: Side, collateralUsd: number): number {\n const sideAbsMax = leverageMaxBps(market.leverage, side);\n if (!Number.isFinite(collateralUsd) || collateralUsd <= 0) {\n return sideAbsMax;\n }\n\n const step = Math.max(market.leverage.stepBps, 1);\n const minBps = market.leverage.minBps;\n const maxSteps = Math.max(0, Math.floor((sideAbsMax - minBps) / step));\n\n for (let i = maxSteps; i >= 0; i--) {\n const lev = minBps + i * step;\n const notionalUsd = collateralUsd * (lev / BPS_PER_UNIT);\n if (lev <= maxLeverageBpsAtNotional(market, side, notionalUsd)) {\n return lev;\n }\n }\n return minBps;\n}\n","import type { Position, PositionEntry } from \"../types/aliases\";\n\nexport interface OriginationFeeBreakdown {\n totalBps: number;\n totalUsd: number;\n protocolBps: number;\n protocolUsd: number;\n partnerBps: number;\n partnerUsd: number;\n}\n\nfunction getEntry(position: Position): PositionEntry {\n return position.entry;\n}\n\nexport function getOriginationFeeBreakdown(position: Position): OriginationFeeBreakdown {\n const entry = getEntry(position);\n const totalBps = entry.originationFeeBps;\n const totalUsd = Number(entry.originationFeeUsd) || 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const protocolBps = entry.protocolOriginationFeeBps ?? totalBps;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const partnerBps = entry.partnerOriginationFeeBps ?? 0;\n\n const share = totalBps > 0 ? protocolBps / totalBps : 1;\n const protocolUsd = totalUsd * share;\n const partnerUsd = totalUsd - protocolUsd;\n\n return {\n totalBps,\n totalUsd,\n protocolBps,\n protocolUsd,\n partnerBps,\n partnerUsd,\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,10 +1,10 @@
1
- export { A as ApiKeyAuth, a as ApiKeyAuthOptions, b as AuthProvider, C as CorrectedField, D as DimesClient, c as DimesClientOptions, G as GetMarketsParams, d as GetPositionsParams, H as HintAdjustment, J as JwtAuth, e as JwtAuthOptions, P as Paginated, Q as QuoteHint, h as hintAdjustment, m as marketMovedCodes, q as quoteErrorHint } from './dimes-client-Bs6eTIvn.cjs';
2
- export { D as DimesApiError, a as DimesContractError, b as DimesError } from './dimes-error-DxIoHQzj.cjs';
3
- import { C as CreateOfferParams, O as Offer, M as Market, P as Position } from './aliases-DzVxkXtK.cjs';
4
- export { a as CamelizeKeys, b as ClosedPosition, c as ContractInfo, d as CreateTokenResult, e as CustomerLimit, f as MarketFees, g as MarketLeverage, h as MarketMaxLeveragePerNotional, i as MarketPrices, j as MarketSidedEligibility, k as MarketSidedMaxLeveragePerNotional, l as OpenPosition, m as OriginationTier, n as PositionClosedFees, o as PositionCurrent, p as PositionEntry, q as PositionFailure, r as PositionOpenFees, s as PositionResult, t as PositionRisk, u as PositionTiming, v as PositionUnwind, w as PositionUnwindList, x as isClosedPosition, y as isOpenPosition, z as leverageMaxBps } from './aliases-DzVxkXtK.cjs';
5
- import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from './quote-CZqCqt8R.cjs';
6
- export { M as MarketMovedEvent, S as Side } from './quote-CZqCqt8R.cjs';
7
- export { P as PositionEvent, a as PositionEventType, p as positionEventTypes } from './types--ysRe5Os.cjs';
1
+ export { A as ApiKeyAuth, a as ApiKeyAuthOptions, b as AuthProvider, C as CorrectedField, D as DimesClient, c as DimesClientOptions, G as GetMarketsParams, d as GetPositionsParams, H as HintAdjustment, J as JwtAuth, e as JwtAuthOptions, P as Paginated, Q as QuoteHint, h as hintAdjustment, m as marketMovedCodes, q as quoteErrorHint } from './dimes-client-C2hT6mZ8.cjs';
2
+ export { D as DimesApiError, a as DimesContractError, b as DimesError } from './dimes-error-BW0wd1ib.cjs';
3
+ import { C as CreateOfferParams, O as Offer, M as Market, P as Position } from './aliases-BGqwpyE-.cjs';
4
+ export { a as CamelizeKeys, b as ClosedPosition, c as ContractInfo, d as CreateTokenResult, e as CustomerLimit, f as MarketFees, g as MarketLeverage, h as MarketMaxLeveragePerNotional, i as MarketPrices, j as MarketSidedEligibility, k as MarketSidedMaxLeveragePerNotional, l as OpenPosition, m as OriginationTier, n as PositionClosedFees, o as PositionCurrent, p as PositionEntry, q as PositionFailure, r as PositionOpenFees, s as PositionResult, t as PositionRisk, u as PositionTiming, v as PositionUnwind, w as PositionUnwindList, x as isClosedPosition, y as isOpenPosition, z as leverageMaxBps } from './aliases-BGqwpyE-.cjs';
5
+ import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from './quote-BcVJ0U0l.cjs';
6
+ export { M as MarketMovedEvent, S as Side } from './quote-BcVJ0U0l.cjs';
7
+ export { P as PositionEvent, a as PositionEventType, p as positionEventTypes } from './types-BwPF-kCK.cjs';
8
8
 
9
9
  type Params = Record<string, unknown> | null;
10
10
 
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { A as ApiKeyAuth, a as ApiKeyAuthOptions, b as AuthProvider, C as CorrectedField, D as DimesClient, c as DimesClientOptions, G as GetMarketsParams, d as GetPositionsParams, H as HintAdjustment, J as JwtAuth, e as JwtAuthOptions, P as Paginated, Q as QuoteHint, h as hintAdjustment, m as marketMovedCodes, q as quoteErrorHint } from './dimes-client-D88pW-Lm.js';
2
- export { D as DimesApiError, a as DimesContractError, b as DimesError } from './dimes-error-BHVY6vDv.js';
3
- import { C as CreateOfferParams, O as Offer, M as Market, P as Position } from './aliases-DzVxkXtK.js';
4
- export { a as CamelizeKeys, b as ClosedPosition, c as ContractInfo, d as CreateTokenResult, e as CustomerLimit, f as MarketFees, g as MarketLeverage, h as MarketMaxLeveragePerNotional, i as MarketPrices, j as MarketSidedEligibility, k as MarketSidedMaxLeveragePerNotional, l as OpenPosition, m as OriginationTier, n as PositionClosedFees, o as PositionCurrent, p as PositionEntry, q as PositionFailure, r as PositionOpenFees, s as PositionResult, t as PositionRisk, u as PositionTiming, v as PositionUnwind, w as PositionUnwindList, x as isClosedPosition, y as isOpenPosition, z as leverageMaxBps } from './aliases-DzVxkXtK.js';
5
- import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from './quote-Cy7ie8yT.js';
6
- export { M as MarketMovedEvent, S as Side } from './quote-Cy7ie8yT.js';
7
- export { P as PositionEvent, a as PositionEventType, p as positionEventTypes } from './types-BcUKsoEs.js';
1
+ export { A as ApiKeyAuth, a as ApiKeyAuthOptions, b as AuthProvider, C as CorrectedField, D as DimesClient, c as DimesClientOptions, G as GetMarketsParams, d as GetPositionsParams, H as HintAdjustment, J as JwtAuth, e as JwtAuthOptions, P as Paginated, Q as QuoteHint, h as hintAdjustment, m as marketMovedCodes, q as quoteErrorHint } from './dimes-client-DFAKtIeI.js';
2
+ export { D as DimesApiError, a as DimesContractError, b as DimesError } from './dimes-error-IBJ5eff6.js';
3
+ import { C as CreateOfferParams, O as Offer, M as Market, P as Position } from './aliases-BGqwpyE-.js';
4
+ export { a as CamelizeKeys, b as ClosedPosition, c as ContractInfo, d as CreateTokenResult, e as CustomerLimit, f as MarketFees, g as MarketLeverage, h as MarketMaxLeveragePerNotional, i as MarketPrices, j as MarketSidedEligibility, k as MarketSidedMaxLeveragePerNotional, l as OpenPosition, m as OriginationTier, n as PositionClosedFees, o as PositionCurrent, p as PositionEntry, q as PositionFailure, r as PositionOpenFees, s as PositionResult, t as PositionRisk, u as PositionTiming, v as PositionUnwind, w as PositionUnwindList, x as isClosedPosition, y as isOpenPosition, z as leverageMaxBps } from './aliases-BGqwpyE-.js';
5
+ import { Q as QuoteParams, a as QuoteOptions, b as QuoteResult } from './quote-BVMZb0T8.js';
6
+ export { M as MarketMovedEvent, S as Side } from './quote-BVMZb0T8.js';
7
+ export { P as PositionEvent, a as PositionEventType, p as positionEventTypes } from './types-C7nWOxO-.js';
8
8
 
9
9
  type Params = Record<string, unknown> | null;
10
10