@invisible-labs/sdk 0.6.0-devnet.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 (54) hide show
  1. package/README.md +210 -0
  2. package/dist/chunk-7DSVN3MV.js +1145 -0
  3. package/dist/chunk-7DSVN3MV.js.map +1 -0
  4. package/dist/chunk-JNNVPZEU.js +599 -0
  5. package/dist/chunk-JNNVPZEU.js.map +1 -0
  6. package/dist/chunk-JRMKCE3S.js +50 -0
  7. package/dist/chunk-JRMKCE3S.js.map +1 -0
  8. package/dist/chunk-LBC7ALYO.js +3783 -0
  9. package/dist/chunk-LBC7ALYO.js.map +1 -0
  10. package/dist/chunk-NCY4FCYU.js +1911 -0
  11. package/dist/chunk-NCY4FCYU.js.map +1 -0
  12. package/dist/chunk-OHIM2YWU.js +126 -0
  13. package/dist/chunk-OHIM2YWU.js.map +1 -0
  14. package/dist/chunk-SZAYO2L5.js +123 -0
  15. package/dist/chunk-SZAYO2L5.js.map +1 -0
  16. package/dist/chunk-TQNNTV5F.js +17 -0
  17. package/dist/chunk-TQNNTV5F.js.map +1 -0
  18. package/dist/chunk-VR6T6OJS.js +24 -0
  19. package/dist/chunk-VR6T6OJS.js.map +1 -0
  20. package/dist/chunk-XUWBGET5.js +221 -0
  21. package/dist/chunk-XUWBGET5.js.map +1 -0
  22. package/dist/coordinator-7Y45MCCZ.js +4 -0
  23. package/dist/coordinator-7Y45MCCZ.js.map +1 -0
  24. package/dist/createSession-D3ym-Ira.d.ts +177 -0
  25. package/dist/dkgWorker.d.ts +2 -0
  26. package/dist/dkgWorker.js +61 -0
  27. package/dist/dkgWorker.js.map +1 -0
  28. package/dist/events.d.ts +54 -0
  29. package/dist/events.js +143 -0
  30. package/dist/events.js.map +1 -0
  31. package/dist/frostRuntime-JESDHN6O.js +4 -0
  32. package/dist/frostRuntime-JESDHN6O.js.map +1 -0
  33. package/dist/index.d.ts +499 -0
  34. package/dist/index.js +132 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/lp.d.ts +388 -0
  37. package/dist/lp.js +1711 -0
  38. package/dist/lp.js.map +1 -0
  39. package/dist/presets.d.ts +43 -0
  40. package/dist/presets.js +70 -0
  41. package/dist/presets.js.map +1 -0
  42. package/dist/session-DFuy54C-.d.ts +31 -0
  43. package/dist/stats.d.ts +47 -0
  44. package/dist/stats.js +21 -0
  45. package/dist/stats.js.map +1 -0
  46. package/dist/storage.d.ts +82 -0
  47. package/dist/storage.js +246 -0
  48. package/dist/storage.js.map +1 -0
  49. package/dist/types-ZhV7TIQY.d.ts +76 -0
  50. package/dist/types.generated-CHGSbmLp.d.ts +67 -0
  51. package/dist/user.d.ts +377 -0
  52. package/dist/user.js +1225 -0
  53. package/dist/user.js.map +1 -0
  54. package/package.json +82 -0
package/dist/lp.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lp/positionCode.ts","../src/lp/withdrawalValidation.ts","../src/lp/coordinatorClient.ts","../src/lp/dkgBatch.ts","../src/lp/lifecycle.ts","../src/lp/index.ts"],"names":["lpPositionId","secretHex","publicKey","encoder","request","addresses","LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS","sleep","refreshPosition","completeDkgBatch","isLpDkgActiveSessionError","execution","redemption","randomBytes","prepareTopUp","reconcileFunding"],"mappings":"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","file":"lp.js","sourcesContent":["import { isValidLpPositionId } from \"@invisible/shared\";\n\ndeclare const lpPositionCodeBrand: unique symbol;\n\nexport type LpPositionCode = string & { readonly [lpPositionCodeBrand]: \"LpPositionCode\" };\n\nexport type LpPositionCodeAuth = {\n readonly code: LpPositionCode;\n readonly lpPositionId: string;\n readonly authPublicKey: Uint8Array;\n readonly authPrivateKeyPkcs8: Uint8Array;\n readonly refillPublicKey: Uint8Array;\n readonly withdrawalCommitment: Uint8Array;\n};\n\nconst LEGACY_CODE_PREFIX = \"ilp1\";\nconst CODE_PREFIX = \"ilp2\";\nconst SECRET_HEX_LENGTH = 64;\nconst encoder = new TextEncoder();\n\nexport async function generateLpPositionCode(lpPositionId: string): Promise<LpPositionCodeAuth> {\n validateLpPositionId(lpPositionId);\n const secret = new Uint8Array(32);\n getCrypto().getRandomValues(secret);\n const keyPair = await getCrypto().subtle.generateKey({ name: \"Ed25519\" }, true, [\n \"sign\",\n \"verify\",\n ]);\n const [privatePkcs8, publicRaw] = await Promise.all([\n getCrypto().subtle.exportKey(\"pkcs8\", keyPair.privateKey),\n getCrypto().subtle.exportKey(\"raw\", keyPair.publicKey),\n ]);\n const code = encodeCode(\n lpPositionId,\n bytesToHex(secret),\n bytesToHex(new Uint8Array(privatePkcs8)),\n bytesToHex(new Uint8Array(publicRaw)),\n );\n secret.fill(0);\n return deriveLpPositionCodeAuth(code);\n}\n\nexport async function deriveLpPositionCodeAuth(input: string): Promise<LpPositionCodeAuth> {\n const code = normalizeLpPositionCode(input);\n const parsed = parseCode(code);\n const secret = hexToBytes(parsed.secretHex);\n try {\n const authPublicKey = parsed.authPublicKeyHex\n ? hexToBytes(parsed.authPublicKeyHex)\n : new Uint8Array();\n const authPrivateKeyPkcs8 = parsed.authPrivateKeyPkcs8Hex\n ? hexToBytes(parsed.authPrivateKeyPkcs8Hex)\n : new Uint8Array();\n if (authPublicKey.length > 0 || authPrivateKeyPkcs8.length > 0) {\n await assertAuthKeyPair(authPrivateKeyPkcs8, authPublicKey);\n }\n const refillPublicKey = await deriveBytes(\n \"invisible-lp-refill-public-key-v0\",\n parsed.lpPositionId,\n secret,\n );\n const withdrawalCommitment = await deriveBytes(\n \"invisible-lp-redemption-commitment-v0\",\n parsed.lpPositionId,\n secret,\n );\n return {\n code,\n lpPositionId: parsed.lpPositionId,\n authPublicKey,\n authPrivateKeyPkcs8,\n refillPublicKey,\n withdrawalCommitment,\n };\n } finally {\n secret.fill(0);\n }\n}\n\nexport function normalizeLpPositionCode(input: string): LpPositionCode {\n return input.trim() as LpPositionCode;\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport async function signLpCommandBytes(\n auth: LpPositionCodeAuth,\n bytes: Uint8Array,\n): Promise<Uint8Array> {\n if (auth.authPrivateKeyPkcs8.length === 0 || auth.authPublicKey.length === 0) {\n throw new Error(\"LP Position Code cannot sign owner commands; create a new ilp2 code\");\n }\n const privateKey = await getCrypto().subtle.importKey(\n \"pkcs8\",\n bufferSource(auth.authPrivateKeyPkcs8),\n { name: \"Ed25519\" },\n false,\n [\"sign\"],\n );\n return new Uint8Array(\n await getCrypto().subtle.sign({ name: \"Ed25519\" }, privateKey, bufferSource(bytes)),\n );\n}\n\nfunction encodeCode(\n lpPositionId: string,\n secretHex: string,\n authPrivateKeyPkcs8Hex: string,\n authPublicKeyHex: string,\n): LpPositionCode {\n return `${CODE_PREFIX}:${lpPositionId}:${secretHex}:${authPrivateKeyPkcs8Hex}:${authPublicKeyHex}` as LpPositionCode;\n}\n\nfunction parseCode(code: LpPositionCode): {\n readonly lpPositionId: string;\n readonly secretHex: string;\n readonly authPrivateKeyPkcs8Hex?: string;\n readonly authPublicKeyHex?: string;\n} {\n const parts = code.split(\":\");\n if (parts.length === 3 && parts[0] === LEGACY_CODE_PREFIX) {\n const [, lpPositionId, secretHex] = parts;\n validateLpPositionId(lpPositionId);\n if (!new RegExp(`^[0-9a-fA-F]{${SECRET_HEX_LENGTH}}$`).test(secretHex)) {\n throw new Error(\"LP Position Code secret must be 32 bytes hex\");\n }\n return { lpPositionId, secretHex: secretHex.toLowerCase() };\n }\n if (parts.length !== 5 || parts[0] !== CODE_PREFIX) {\n throw new Error(\"LP Position Code must use the ilp2 format\");\n }\n const [, lpPositionId, secretHex, authPrivateKeyPkcs8Hex, authPublicKeyHex] = parts;\n validateLpPositionId(lpPositionId);\n if (!new RegExp(`^[0-9a-fA-F]{${SECRET_HEX_LENGTH}}$`).test(secretHex)) {\n throw new Error(\"LP Position Code secret must be 32 bytes hex\");\n }\n if (!/^[0-9a-fA-F]+$/.test(authPrivateKeyPkcs8Hex) || authPrivateKeyPkcs8Hex.length < 64) {\n throw new Error(\"LP Position Code auth private key must be pkcs8 hex\");\n }\n if (!new RegExp(`^[0-9a-fA-F]{${SECRET_HEX_LENGTH}}$`).test(authPublicKeyHex)) {\n throw new Error(\"LP Position Code auth public key must be 32 bytes hex\");\n }\n return {\n lpPositionId,\n secretHex: secretHex.toLowerCase(),\n authPrivateKeyPkcs8Hex: authPrivateKeyPkcs8Hex.toLowerCase(),\n authPublicKeyHex: authPublicKeyHex.toLowerCase(),\n };\n}\n\nfunction validateLpPositionId(lpPositionId: string): void {\n if (!isValidLpPositionId(lpPositionId)) {\n throw new Error(\"LP Position Code has an invalid position id\");\n }\n}\n\nasync function deriveBytes(\n domain: string,\n lpPositionId: string,\n secret: Uint8Array,\n): Promise<Uint8Array> {\n const domainBytes = encoder.encode(`${domain}:${lpPositionId}:`);\n const material = new Uint8Array(domainBytes.length + secret.length);\n material.set(domainBytes);\n material.set(secret, domainBytes.length);\n const digest = await getCrypto().subtle.digest(\"SHA-256\", material);\n material.fill(0);\n return new Uint8Array(digest);\n}\n\nasync function assertAuthKeyPair(privatePkcs8: Uint8Array, publicRaw: Uint8Array): Promise<void> {\n if (publicRaw.length !== 32) {\n throw new Error(\"LP Position Code auth public key must be 32 bytes\");\n }\n const [privateKey, publicKey] = await Promise.all([\n getCrypto().subtle.importKey(\"pkcs8\", bufferSource(privatePkcs8), { name: \"Ed25519\" }, false, [\n \"sign\",\n ]),\n getCrypto().subtle.importKey(\"raw\", bufferSource(publicRaw), { name: \"Ed25519\" }, false, [\n \"verify\",\n ]),\n ]);\n const challenge = encoder.encode(\"invisible-lp-auth-self-test\");\n const signature = await getCrypto().subtle.sign({ name: \"Ed25519\" }, privateKey, challenge);\n const ok = await getCrypto().subtle.verify({ name: \"Ed25519\" }, publicKey, signature, challenge);\n if (!ok) {\n throw new Error(\"LP Position Code auth key pair is invalid\");\n }\n}\n\nfunction bufferSource(bytes: Uint8Array): ArrayBuffer {\n return new Uint8Array(bytes).buffer;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let index = 0; index < bytes.length; index += 1) {\n bytes[index] = Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16);\n }\n return bytes;\n}\n\nfunction getCrypto(): Crypto {\n if (globalThis.crypto === undefined || globalThis.crypto.subtle === undefined) {\n throw new Error(\"Web Crypto is required for LP Position Code handling\");\n }\n return globalThis.crypto;\n}\n","import { lamports, publicKey } from \"../core/brands.js\";\nimport { PolicyValidationError } from \"../core/errors.js\";\n\nexport interface LpWithdrawalPlanValidationInput {\n readonly depositPrincipalLamports: number;\n readonly earnedFeeLamports: number;\n readonly destinationAddresses: readonly string[];\n readonly allowManyToOne?: boolean;\n readonly sourceCount?: number;\n}\n\nconst SINGLE_DESTINATION_WITHDRAWAL_MESSAGE =\n \"single-destination withdrawal is privacy-degrading; pass allowManyToOne: true to acknowledge\";\nconst DESTINATION_SOURCE_COUNT_MESSAGE =\n \"LP withdrawal requires one destination per withdrawable source unless allowManyToOne is true\";\nconst SOURCE_COUNT_MESSAGE = \"LP withdrawal source count must be a positive integer\";\n\nexport function validateLpWithdrawalPlan(input: LpWithdrawalPlanValidationInput): void {\n const {\n depositPrincipalLamports,\n earnedFeeLamports,\n destinationAddresses,\n allowManyToOne,\n sourceCount,\n } = input;\n lamports(depositPrincipalLamports);\n lamports(earnedFeeLamports);\n if (depositPrincipalLamports === 0 && earnedFeeLamports === 0) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n \"LP withdrawal requires a non-zero principal or earned-fee claim\",\n );\n }\n validateDestinationAddresses(destinationAddresses);\n if (sourceCount !== undefined && (!Number.isInteger(sourceCount) || sourceCount < 1)) {\n throw new PolicyValidationError(\"INVALID_WITHDRAWAL_PLAN\", SOURCE_COUNT_MESSAGE);\n }\n if (\n sourceCount !== undefined &&\n allowManyToOne !== true &&\n destinationAddresses.length !== sourceCount\n ) {\n throw new PolicyValidationError(\"INVALID_WITHDRAWAL_PLAN\", DESTINATION_SOURCE_COUNT_MESSAGE);\n }\n if (destinationAddresses.length === 1 && sourceCount !== 1 && allowManyToOne !== true) {\n throw new PolicyValidationError(\n \"INVALID_WITHDRAWAL_PLAN\",\n SINGLE_DESTINATION_WITHDRAWAL_MESSAGE,\n );\n }\n}\n\nfunction validateDestinationAddresses(destinationAddresses: readonly string[]): void {\n if (destinationAddresses.length === 0) {\n throw new PolicyValidationError(\n \"INVALID_WITHDRAWAL_PLAN\",\n \"at least one destination address is required\",\n );\n }\n const seen = new Set<string>();\n for (const address of destinationAddresses) {\n publicKey(address);\n if (seen.has(address)) {\n throw new PolicyValidationError(\n \"INVALID_WITHDRAWAL_PLAN\",\n `duplicate withdrawal destination: ${address}`,\n );\n }\n seen.add(address);\n }\n}\n","import type { Session } from \"../core/session.js\";\nimport { CommandError, PolicyValidationError } from \"../core/errors.js\";\nimport { getSessionState } from \"../session/state.js\";\nimport {\n CoordinatorMessageType,\n requestEnvelope,\n type Envelope,\n} from \"../coordinator/protocolClient.js\";\nimport { bytesToHex, signLpCommandBytes, type LpPositionCodeAuth } from \"./positionCode.js\";\nimport { validateLpWithdrawalPlan } from \"./withdrawalValidation.js\";\nimport type {\n FinalizeLpDkgBatchInput,\n FundingConfirmationInput,\n LpActorSyncView,\n LpCoordinatorClient,\n LpInventoryShard,\n LpPositionView,\n LpRedemptionHistoryView,\n LpTopUpRequest,\n LpWithdrawalExecutionView,\n OpenLpPositionInput,\n RefillLpPositionInput,\n} from \"./types.js\";\n\ntype LpCommandAction =\n | \"dkg_init\"\n | \"dkg_round1\"\n | \"dkg_round2\"\n | \"position_open\"\n | \"position_get\"\n | \"dkg_finalize\"\n | \"refill\"\n | \"reconcile_funding\"\n | \"funding_plan\"\n | \"funding_confirmation\"\n | \"make_available\"\n | \"withdraw_request\"\n | \"prepare_top_up\"\n | \"top_up_status\";\n\ntype LpCommandBody = { readonly case: string; readonly value: Record<string, unknown> };\n\ntype ProtocolLpModule = {\n readonly encodeLpCommandForSigning: (command: unknown) => Uint8Array;\n readonly lpSignedCommandEnvelope: (\n command: unknown,\n signature: Uint8Array,\n ) => { readonly type: CoordinatorMessageType; readonly payload: Record<string, unknown> };\n readonly asLpCommandResponsePayload: (envelope: Envelope) => LpCommandResponsePayload;\n};\n\ntype LpCommandResponsePayload =\n | { readonly case: \"dkgInit\"; readonly value: { readonly session_id: string } }\n | {\n readonly case: \"dkgRound1\";\n readonly value: { readonly package: Uint8Array; readonly round2_for_lp: Uint8Array };\n }\n | {\n readonly case: \"dkgRound2\";\n readonly value: {\n readonly address: string;\n readonly joint_pubkey: Uint8Array;\n readonly shard_id: string;\n readonly index: number;\n };\n }\n | { readonly case: \"position\"; readonly value: LpPositionViewPayload }\n | { readonly case: \"shards\"; readonly value: LpShardViewPayload[] }\n | { readonly case: \"shard\"; readonly value: LpShardViewPayload }\n | { readonly case: \"topUpRequest\"; readonly value: LpTopUpRequestPayload }\n | {\n readonly case: \"withdrawalExecution\";\n readonly value: { readonly withdrawal_id: string; readonly tx_signatures: string[] };\n };\n\ntype LpPositionViewPayload = {\n readonly lp_position_id: string;\n readonly status: LpPositionView[\"status\"];\n readonly target_shard_count: number;\n readonly auth_public_key: Uint8Array;\n readonly refill_public_key: Uint8Array;\n readonly redemption_commitment: Uint8Array;\n readonly committed_lamports: number;\n readonly earned_lamports: number;\n readonly refill_threshold: number;\n readonly shards: LpShardViewPayload[];\n readonly created_at_ms: number;\n readonly actor_sync?: {\n readonly lp_position_id: string;\n readonly status: LpActorSyncView[\"status\"];\n readonly source_liquidity_use: LpActorSyncView[\"sourceLiquidityUse\"];\n readonly redeemable_principal_lamports?: number;\n readonly redeemable_fee_lamports?: number;\n readonly lifetime_earned_lamports?: number;\n readonly redeemable_principal_source_count?: number;\n readonly redeemable_fee_source_count?: number;\n readonly pending_reservation_count: number;\n readonly reserved_payout_lamports: number;\n readonly estimated_network_fee_lamports: number;\n readonly reimbursement_due_count: number;\n readonly reimbursement_due_source_count: number;\n readonly reimbursement_due_payout_lamports: number;\n readonly reimbursement_due_network_fee_lamports: number;\n readonly withdrawal_requested_lamports: number;\n readonly withdrawal_landed_lamports: number;\n readonly withdrawal_landed_fee_lamports: number;\n readonly withdrawal_canceled_lamports: number;\n readonly withdrawal_network_fee_loss_lamports: number;\n readonly withdrawal_tx_hashes: string[];\n readonly redemption_history?: LpRedemptionHistoryPayload[];\n readonly redemption_history_has_more?: boolean;\n readonly redemption_history_next_cursor?: string;\n readonly state_version: number;\n readonly updated_at_ms: number;\n };\n};\n\ntype LpRedemptionHistoryPayload = {\n readonly redemption_id: string;\n readonly state: LpRedemptionHistoryView[\"state\"];\n readonly accepted_lamports: number;\n readonly accepted_deposit_principal_lamports: number;\n readonly accepted_earned_fee_lamports: number;\n readonly landed_lamports: number;\n readonly landed_deposit_principal_lamports: number;\n readonly landed_earned_fee_lamports: number;\n readonly canceled_lamports: number;\n readonly canceled_deposit_principal_lamports: number;\n readonly canceled_earned_fee_lamports: number;\n readonly network_fee_lamports: number;\n readonly network_fee_loss_lamports: number;\n readonly failed_attempts: number;\n readonly destination_addresses: string[];\n readonly destination_count: number;\n readonly tx_signatures: string[];\n readonly tx_signature_count: number;\n readonly details_truncated: boolean;\n readonly state_version: number;\n readonly created_at_ms: number;\n readonly updated_at_ms: number;\n};\n\ntype LpShardViewPayload = {\n readonly lp_position_id: string;\n readonly shard_id: string;\n readonly index: number;\n readonly address: string;\n readonly amount_lamports: number;\n readonly required_lamports?: number;\n readonly status:\n | \"pregenerated\"\n | \"funding_queued\"\n | \"funded\"\n | \"cooling\"\n | \"available\"\n | \"reserved\"\n | \"retired\"\n | \"redeemed\";\n readonly funding_tx_signature?: string;\n readonly payout_tx_signature?: string;\n readonly cooling_until_ms?: number;\n};\n\ntype LpTopUpRequestPayload = {\n readonly top_up_id: string;\n readonly lp_position_id: string;\n readonly deposit_address: string;\n readonly expires_at_ms: number;\n readonly status: LpTopUpRequest[\"status\"];\n};\n\nconst COMMAND_TTL_MS = 30_000;\nexport const LP_COMMAND_REQUEST_TIMEOUT_MS = 120_000;\nconst encoder = new TextEncoder();\nlet protocolPromise: Promise<ProtocolLpModule> | null = null;\n\nexport function createLpCoordinatorClient(session: Session): LpCoordinatorClient {\n return {\n initDkg(input, auth) {\n return initDkg(session, input, auth);\n },\n dkgRound1(input, auth) {\n return dkgRound1(session, input, auth);\n },\n dkgRound2(input, auth) {\n return dkgRound2(session, input, auth);\n },\n openPosition(input, auth) {\n return openPosition(session, input, auth);\n },\n getPosition(lpPositionId, auth) {\n return getPosition(session, lpPositionId, auth);\n },\n finalizeDkgBatch(input, auth) {\n return finalizeDkgBatch(session, input, auth);\n },\n refillPosition(input, auth) {\n return refillPosition(session, input, auth);\n },\n reconcileFunding(lpPositionId, auth) {\n return reconcileFunding(session, lpPositionId, auth);\n },\n planFunding(input, auth) {\n return planFunding(session, input, auth);\n },\n confirmFunding(input, auth) {\n return confirmFunding(session, input, auth);\n },\n prepareTopUp(lpPositionId, auth) {\n return prepareTopUp(session, lpPositionId, auth);\n },\n getTopUpStatus(input, auth) {\n return getTopUpStatus(session, input, auth);\n },\n makeAvailable(input, auth) {\n return makeAvailable(session, input, auth);\n },\n executeWithdrawal(input, auth) {\n return executeWithdrawal(session, input, auth);\n },\n };\n}\n\nasync function initDkg(\n session: Session,\n input: { lpPositionId: string; index: number },\n auth: LpPositionCodeAuth,\n): Promise<{ sessionId: string }> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"dkg_init\", {\n case: \"dkgInit\",\n value: { index: input.index },\n });\n if (response.case !== \"dkgInit\") throw new Error(\"Unexpected LP DKG init response\");\n return { sessionId: response.value.session_id };\n}\n\nasync function dkgRound1(\n session: Session,\n input: { sessionId: string; package: number[] },\n auth: LpPositionCodeAuth,\n): Promise<{ package: Uint8Array; round2ForLp: Uint8Array }> {\n const response = await request(session, auth, \"dkg_round1\", {\n case: \"dkgRound1\",\n value: {\n session_id: input.sessionId,\n package: Uint8Array.from(input.package),\n },\n });\n if (response.case !== \"dkgRound1\") throw new Error(\"Unexpected LP DKG round1 response\");\n return {\n package: response.value.package,\n round2ForLp: response.value.round2_for_lp,\n };\n}\n\nasync function dkgRound2(\n session: Session,\n input: { sessionId: string; package: number[]; delegatedShare: number[] },\n auth: LpPositionCodeAuth,\n): Promise<{ address: string; jointPubkey: Uint8Array; shardId: string; index: number }> {\n const response = await request(session, auth, \"dkg_round2\", {\n case: \"dkgRound2\",\n value: {\n session_id: input.sessionId,\n package: Uint8Array.from(input.package),\n delegated_share: Uint8Array.from(input.delegatedShare),\n },\n });\n if (response.case !== \"dkgRound2\") throw new Error(\"Unexpected LP DKG round2 response\");\n return {\n address: response.value.address,\n jointPubkey: response.value.joint_pubkey,\n shardId: response.value.shard_id,\n index: response.value.index,\n };\n}\n\nasync function openPosition(\n session: Session,\n input: OpenLpPositionInput,\n auth: LpPositionCodeAuth,\n): Promise<LpPositionView> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"position_open\", {\n case: \"positionOpen\",\n value: {\n auth_public_key: Uint8Array.from(input.authPublicKey),\n refill_public_key: Uint8Array.from(input.refillPublicKey),\n redemption_commitment: Uint8Array.from(input.withdrawalCommitment),\n committed_lamports: input.committedLamports,\n shard_count: input.shardCount,\n shard_amount_lamports: input.shardAmountLamports,\n refill_threshold: input.refillThreshold,\n addresses: input.addresses,\n created_at_ms: input.createdAtMs,\n },\n });\n return expectPosition(response);\n}\n\nasync function getPosition(\n session: Session,\n lpPositionId: string,\n auth: LpPositionCodeAuth,\n): Promise<LpPositionView> {\n let cursor: string | undefined;\n let position: LpPositionView | undefined;\n const seenCursors = new Set<string>();\n for (;;) {\n const response = await requestForPosition(session, lpPositionId, auth, \"position_get\", {\n case: \"positionGet\",\n value: cursor === undefined ? {} : { redemption_history_cursor: cursor },\n });\n const page = expectPosition(response);\n const mergedPosition =\n position === undefined ? page : mergePositionHistoryPages(position, page);\n position = mergedPosition;\n const actorSync = page.actorSync;\n if (actorSync?.redemptionHistoryHasMore !== true) return mergedPosition;\n const nextCursor = actorSync.redemptionHistoryNextCursor;\n if (nextCursor === undefined || seenCursors.has(nextCursor)) {\n throw new CommandError(\n \"REJECTED_STATE\",\n \"coordinator LP actor sync returned an invalid redemption history cursor\",\n );\n }\n seenCursors.add(nextCursor);\n cursor = nextCursor;\n }\n}\n\nasync function finalizeDkgBatch(\n session: Session,\n input: FinalizeLpDkgBatchInput,\n auth: LpPositionCodeAuth,\n): Promise<LpPositionView> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"dkg_finalize\", {\n case: \"dkgFinalize\",\n value: {\n start_index: input.startIndex,\n addresses: input.addresses,\n finalized_at_ms: input.finalizedAtMs,\n },\n });\n return expectPosition(response);\n}\n\nasync function refillPosition(\n session: Session,\n input: RefillLpPositionInput,\n auth: LpPositionCodeAuth,\n): Promise<LpPositionView> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"refill\", {\n case: \"refill\",\n value: {\n shard_count: input.shardCount,\n shard_amount_lamports: input.shardAmountLamports,\n addresses: input.addresses,\n authorized_at_ms: input.authorizedAtMs,\n },\n });\n return expectPosition(response);\n}\n\nasync function reconcileFunding(\n session: Session,\n lpPositionId: string,\n auth: LpPositionCodeAuth,\n): Promise<LpPositionView> {\n const response = await requestForPosition(session, lpPositionId, auth, \"reconcile_funding\", {\n case: \"reconcileFunding\",\n value: {},\n });\n return expectPosition(response);\n}\n\nasync function planFunding(\n session: Session,\n input: { lpPositionId: string; shardCount: number; nowMs: number },\n auth: LpPositionCodeAuth,\n): Promise<LpInventoryShard[]> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"funding_plan\", {\n case: \"fundingPlan\",\n value: {\n shard_count: input.shardCount,\n planned_at_ms: input.nowMs,\n },\n });\n if (response.case !== \"shards\") throw new Error(\"Unexpected LP funding plan response\");\n return response.value.map(mapShard);\n}\n\nasync function confirmFunding(\n session: Session,\n input: FundingConfirmationInput,\n auth: LpPositionCodeAuth,\n): Promise<LpInventoryShard> {\n const response = await requestForPosition(\n session,\n input.lpPositionId,\n auth,\n \"funding_confirmation\",\n {\n case: \"fundingConfirmation\",\n value: {\n shard_id: input.shardId,\n amount_lamports: input.amountLamports,\n funding_tx_signature: input.fundingTxSignature,\n },\n },\n );\n if (response.case !== \"shard\") throw new Error(\"Unexpected LP funding confirmation response\");\n return mapShard(response.value);\n}\n\nasync function prepareTopUp(\n session: Session,\n lpPositionId: string,\n auth: LpPositionCodeAuth,\n): Promise<LpTopUpRequest> {\n const response = await requestForPosition(session, lpPositionId, auth, \"prepare_top_up\", {\n case: \"prepareTopUp\",\n value: {},\n });\n if (response.case !== \"topUpRequest\") throw new Error(\"Unexpected LP top-up response\");\n return mapTopUpRequest(response.value);\n}\n\nasync function getTopUpStatus(\n session: Session,\n input: { lpPositionId: string; topUpId: string },\n auth: LpPositionCodeAuth,\n): Promise<LpTopUpRequest> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"top_up_status\", {\n case: \"topUpStatus\",\n value: { top_up_id: input.topUpId },\n });\n if (response.case !== \"topUpRequest\") throw new Error(\"Unexpected LP top-up response\");\n return mapTopUpRequest(response.value);\n}\n\nasync function makeAvailable(\n session: Session,\n input: { lpPositionId: string; shardId: string },\n auth: LpPositionCodeAuth,\n): Promise<LpInventoryShard> {\n const response = await requestForPosition(session, input.lpPositionId, auth, \"make_available\", {\n case: \"makeAvailable\",\n value: {\n shard_id: input.shardId,\n },\n });\n if (response.case !== \"shard\") throw new Error(\"Unexpected LP availability response\");\n return mapShard(response.value);\n}\n\nasync function executeWithdrawal(\n session: Session,\n input: {\n lpPositionId: string;\n destinationAddresses: string[];\n depositPrincipalLamports: number;\n earnedFeeLamports: number;\n requestedAtMs: number;\n allowManyToOne?: boolean;\n },\n auth: LpPositionCodeAuth,\n): Promise<LpWithdrawalExecutionView> {\n validateLpWithdrawalPlan({\n destinationAddresses: input.destinationAddresses,\n depositPrincipalLamports: input.depositPrincipalLamports,\n earnedFeeLamports: input.earnedFeeLamports,\n allowManyToOne: input.allowManyToOne,\n });\n const response = await requestForPosition(session, input.lpPositionId, auth, \"withdraw_request\", {\n case: \"withdrawRequest\",\n value: {\n destination_addresses: input.destinationAddresses,\n deposit_principal_lamports: input.depositPrincipalLamports,\n earned_fee_lamports: input.earnedFeeLamports,\n requested_at_ms: input.requestedAtMs,\n },\n });\n if (response.case !== \"withdrawalExecution\") {\n throw new Error(\"Unexpected LP withdrawal execution response\");\n }\n return {\n withdrawalId: response.value.withdrawal_id,\n txSignatures: [...response.value.tx_signatures],\n };\n}\n\nfunction request(\n session: Session,\n auth: LpPositionCodeAuth,\n action: LpCommandAction,\n payload: LpCommandBody,\n): Promise<LpCommandResponsePayload> {\n return requestForPosition(session, auth.lpPositionId, auth, action, payload);\n}\n\nasync function requestForPosition(\n session: Session,\n lpPositionId: string,\n auth: LpPositionCodeAuth,\n action: LpCommandAction,\n payload: LpCommandBody,\n): Promise<LpCommandResponsePayload> {\n assertAuthMatchesPosition(lpPositionId, auth);\n const protocol = await loadProtocol();\n const state = getSessionState(session);\n const attestation = state.channel?.attestation;\n if (!attestation) throw new Error(\"LP coordinator attestation is not available\");\n\n const command = {\n lp_position_id: lpPositionId,\n action,\n nonce: randomBytes(32),\n expires_at_ms: Date.now() + COMMAND_TTL_MS,\n coordinator_attestation_hash: await coordinatorAttestationHash(\n attestation.binaryHash,\n attestation.pubkeyHex,\n ),\n payload,\n };\n const signature = await signLpCommandBytes(auth, protocol.encodeLpCommandForSigning(command));\n const { type, payload: envelopePayload } = protocol.lpSignedCommandEnvelope(command, signature);\n const envelope = await requestEnvelope(session, type, envelopePayload, {\n timeoutMs: LP_COMMAND_REQUEST_TIMEOUT_MS,\n });\n return protocol.asLpCommandResponsePayload(envelope);\n}\n\nfunction assertAuthMatchesPosition(lpPositionId: string, auth: LpPositionCodeAuth): void {\n if (lpPositionId === auth.lpPositionId) return;\n throw new PolicyValidationError(\n \"INVALID_POSITION_AUTH\",\n \"LP Position Code does not match the target LP position\",\n );\n}\n\nfunction expectPosition(response: LpCommandResponsePayload): LpPositionView {\n if (response.case !== \"position\") throw new Error(\"Unexpected LP position response\");\n return mapPosition(response.value);\n}\n\nfunction mapPosition(position: LpPositionViewPayload): LpPositionView {\n return {\n id: position.lp_position_id,\n status: position.status,\n targetShardCount: position.target_shard_count,\n authPublicKey: bytesToHex(position.auth_public_key),\n refillPublicKey: bytesToHex(position.refill_public_key),\n withdrawalCommitment: bytesToHex(position.redemption_commitment),\n committedLamports: position.committed_lamports,\n earnedLamports: position.earned_lamports,\n refillThreshold: position.refill_threshold,\n shards: position.shards.map(mapShard),\n createdAt: position.created_at_ms,\n ...(position.actor_sync === undefined\n ? {}\n : { actorSync: mapLpActorSync(position.actor_sync) }),\n };\n}\n\nfunction mapLpActorSync(\n actorSync: NonNullable<LpPositionViewPayload[\"actor_sync\"]>,\n): LpActorSyncView {\n const redeemableBucketValues = [\n actorSync.redeemable_principal_lamports,\n actorSync.redeemable_fee_lamports,\n actorSync.lifetime_earned_lamports,\n actorSync.redeemable_principal_source_count,\n actorSync.redeemable_fee_source_count,\n ];\n const redeemableBucketCount = redeemableBucketValues.filter(\n (value) => value !== undefined,\n ).length;\n if (redeemableBucketCount > 0 && redeemableBucketCount < redeemableBucketValues.length) {\n throw new CommandError(\n \"REJECTED_STATE\",\n \"coordinator LP actor sync redeemable buckets must be all-or-none\",\n );\n }\n const redeemableProjectionAvailable = redeemableBucketCount === redeemableBucketValues.length;\n return {\n lpPositionId: actorSync.lp_position_id,\n status: actorSync.status,\n sourceLiquidityUse: actorSync.source_liquidity_use,\n redeemableProjectionAvailable,\n redeemablePrincipalLamports: actorSync.redeemable_principal_lamports ?? 0,\n redeemableFeeLamports: actorSync.redeemable_fee_lamports ?? 0,\n lifetimeEarnedLamports: actorSync.lifetime_earned_lamports ?? 0,\n redeemablePrincipalSourceCount: actorSync.redeemable_principal_source_count ?? 0,\n redeemableFeeSourceCount: actorSync.redeemable_fee_source_count ?? 0,\n pendingReservationCount: actorSync.pending_reservation_count,\n reservedPayoutLamports: actorSync.reserved_payout_lamports,\n estimatedNetworkFeeLamports: actorSync.estimated_network_fee_lamports,\n reimbursementDueCount: actorSync.reimbursement_due_count,\n reimbursementDueSourceCount: actorSync.reimbursement_due_source_count,\n reimbursementDuePayoutLamports: actorSync.reimbursement_due_payout_lamports,\n reimbursementDueNetworkFeeLamports: actorSync.reimbursement_due_network_fee_lamports,\n withdrawalRequestedLamports: actorSync.withdrawal_requested_lamports,\n withdrawalLandedLamports: actorSync.withdrawal_landed_lamports,\n withdrawalLandedFeeLamports: actorSync.withdrawal_landed_fee_lamports,\n withdrawalCanceledLamports: actorSync.withdrawal_canceled_lamports,\n withdrawalNetworkFeeLossLamports: actorSync.withdrawal_network_fee_loss_lamports,\n withdrawalTxHashes: [...actorSync.withdrawal_tx_hashes],\n redemptionHistory: (actorSync.redemption_history ?? []).map(mapLpRedemptionHistory),\n redemptionHistoryHasMore: actorSync.redemption_history_has_more ?? false,\n ...(actorSync.redemption_history_next_cursor === undefined\n ? {}\n : { redemptionHistoryNextCursor: actorSync.redemption_history_next_cursor }),\n stateVersion: actorSync.state_version,\n updatedAtMs: actorSync.updated_at_ms,\n };\n}\n\nfunction mergePositionHistoryPages(first: LpPositionView, next: LpPositionView): LpPositionView {\n if (first.actorSync === undefined) return next;\n if (next.actorSync === undefined) return first;\n const historyByRedemptionId = new Map<string, LpRedemptionHistoryView>();\n for (const history of first.actorSync.redemptionHistory ?? []) {\n historyByRedemptionId.set(history.redemptionId, history);\n }\n for (const history of next.actorSync.redemptionHistory ?? []) {\n historyByRedemptionId.set(history.redemptionId, history);\n }\n return {\n ...first,\n actorSync: {\n ...first.actorSync,\n ...next.actorSync,\n redemptionHistory: [...historyByRedemptionId.values()],\n },\n };\n}\n\nfunction mapLpRedemptionHistory(history: LpRedemptionHistoryPayload): LpRedemptionHistoryView {\n return {\n redemptionId: history.redemption_id,\n state: history.state,\n acceptedLamports: history.accepted_lamports,\n acceptedDepositPrincipalLamports: history.accepted_deposit_principal_lamports,\n acceptedEarnedFeeLamports: history.accepted_earned_fee_lamports,\n landedLamports: history.landed_lamports,\n landedDepositPrincipalLamports: history.landed_deposit_principal_lamports,\n landedEarnedFeeLamports: history.landed_earned_fee_lamports,\n canceledLamports: history.canceled_lamports,\n canceledDepositPrincipalLamports: history.canceled_deposit_principal_lamports,\n canceledEarnedFeeLamports: history.canceled_earned_fee_lamports,\n networkFeeLamports: history.network_fee_lamports,\n networkFeeLossLamports: history.network_fee_loss_lamports,\n failedAttempts: history.failed_attempts,\n destinationAddresses: [...history.destination_addresses],\n destinationCount: history.destination_count,\n txSignatures: [...history.tx_signatures],\n txSignatureCount: history.tx_signature_count,\n detailsTruncated: history.details_truncated,\n stateVersion: history.state_version,\n createdAtMs: history.created_at_ms,\n updatedAtMs: history.updated_at_ms,\n };\n}\n\nfunction mapShard(shard: LpShardViewPayload): LpInventoryShard {\n return {\n kind: \"lp\",\n lpPositionId: shard.lp_position_id,\n shardId: shard.shard_id,\n index: shard.index,\n address: shard.address,\n amountLamports: shard.amount_lamports,\n ...(shard.required_lamports === undefined ? {} : { requiredLamports: shard.required_lamports }),\n status: mapStatus(shard.status),\n fundingTxSignature: shard.funding_tx_signature,\n payoutTxSignature: shard.payout_tx_signature,\n coolingUntilMs: shard.cooling_until_ms,\n };\n}\n\nfunction mapTopUpRequest(request: LpTopUpRequestPayload): LpTopUpRequest {\n return {\n topUpId: request.top_up_id,\n positionId: request.lp_position_id,\n depositAddress: request.deposit_address,\n expiresAtMs: request.expires_at_ms,\n status: request.status,\n };\n}\n\nfunction mapStatus(status: LpShardViewPayload[\"status\"]): LpInventoryShard[\"status\"] {\n switch (status) {\n case \"pregenerated\":\n return \"PREGENERATED\";\n case \"funding_queued\":\n return \"FUNDING_QUEUED\";\n case \"funded\":\n return \"FUNDED\";\n case \"cooling\":\n return \"COOLING\";\n case \"available\":\n return \"AVAILABLE\";\n case \"reserved\":\n return \"RESERVED\";\n case \"retired\":\n return \"RETIRED\";\n case \"redeemed\":\n return \"REDEEMED\";\n }\n}\n\nasync function coordinatorAttestationHash(\n binaryHash: string,\n pubkeyHex: string,\n): Promise<Uint8Array> {\n const material = encoder.encode(\n `invisible-lp-attestation-v1\\0${binaryHash.toLowerCase()}\\0${pubkeyHex.toLowerCase()}`,\n );\n return new Uint8Array(await crypto.subtle.digest(\"SHA-256\", material));\n}\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n return bytes;\n}\n\nfunction loadProtocol(): Promise<ProtocolLpModule> {\n protocolPromise ??= import(\"protocol/coordinator\") as Promise<ProtocolLpModule>;\n return protocolPromise;\n}\n","import type { LpPositionCodeAuth } from \"./positionCode.js\";\nimport type { LpCoordinatorClient } from \"./types.js\";\n\ntype LpDkgWorkerRequest =\n | {\n id: string;\n type: \"round1\";\n }\n | {\n id: string;\n type: \"round2\";\n teeRound1: number[];\n teeRound2ForLp: number[];\n };\n\ntype LpDkgWorkerResponse =\n | {\n id: string;\n type: \"round1\";\n package: number[];\n }\n | {\n id: string;\n type: \"round2\";\n package: number[];\n delegatedShare: number[];\n jointPubkey: number[];\n }\n | {\n id: string;\n type: \"error\";\n error: string;\n };\n\nexport type LpDkgProgress = {\n completed: number;\n total: number;\n address: string;\n};\n\nexport type CreateLpDkgBatchInput = {\n lpPositionId: string;\n startIndex: number;\n count: number;\n auth: LpPositionCodeAuth;\n client: LpCoordinatorClient;\n concurrency?: number;\n workerFactory?: () => Worker;\n useDeterministicTestAddresses?: boolean;\n onProgress?: (progress: LpDkgProgress) => void;\n};\n\nconst MAX_LP_DKG_CONCURRENCY = 8;\nconst DEFAULT_LP_DKG_CONCURRENCY = MAX_LP_DKG_CONCURRENCY;\nconst LP_DKG_COMPLETED_SHARD_POLL_INTERVAL_MS = 500;\nconst LP_DKG_COMPLETED_SHARD_POLL_TIMEOUT_MS = 5 * 60_000 + 15_000;\nconst LP_DKG_ACTIVE_SESSION_RETRY_INTERVAL_MS = 2_000;\nconst LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS = LP_DKG_COMPLETED_SHARD_POLL_TIMEOUT_MS;\n\nexport async function createLpDkgBatch(input: CreateLpDkgBatchInput): Promise<string[]> {\n if (input.useDeterministicTestAddresses === true) {\n const addresses = Array.from({ length: input.count }, (_, offset) =>\n testAddress(input.lpPositionId, input.startIndex + offset),\n );\n for (const [offset, address] of addresses.entries()) {\n input.onProgress?.({\n completed: offset + 1,\n total: input.count,\n address,\n });\n }\n return addresses;\n }\n\n const workerCount = resolveConcurrency(input.count, input.concurrency);\n const workers = Array.from({ length: workerCount }, () => createWorker(input.workerFactory));\n const addresses = new Array<string>(input.count);\n let completed = 0;\n let nextOffset = 0;\n try {\n await Promise.all(\n workers.map(async (worker) => {\n for (;;) {\n const offset = nextOffset;\n nextOffset += 1;\n if (offset >= input.count) return;\n\n const index = input.startIndex + offset;\n const address = await createLpDkgShard(input, worker, index);\n addresses[offset] = address;\n completed += 1;\n input.onProgress?.({\n completed,\n total: input.count,\n address,\n });\n }\n }),\n );\n return addresses;\n } finally {\n workers.forEach((worker) => worker.terminate());\n }\n}\n\nasync function createLpDkgShard(\n input: CreateLpDkgBatchInput,\n worker: Worker,\n index: number,\n): Promise<string> {\n const deadline = Date.now() + LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS;\n let sawActiveSession = false;\n\n for (;;) {\n if (sawActiveSession) {\n const completedAddress = await getCompletedShardAddress(input, index);\n if (completedAddress !== null) return completedAddress;\n }\n\n try {\n return await runLpDkgShard(input, worker, index);\n } catch (error) {\n if (isLpDkgCompletedOrVisibleError(error)) {\n return waitForCompletedShardAddress(input, index);\n }\n if (!isLpDkgActiveSessionError(error)) throw error;\n\n sawActiveSession = true;\n const completedAddress = await getCompletedShardAddress(input, index);\n if (completedAddress !== null) return completedAddress;\n if (Date.now() >= deadline) throw error;\n await sleep(LP_DKG_ACTIVE_SESSION_RETRY_INTERVAL_MS);\n }\n }\n}\n\nasync function runLpDkgShard(\n input: CreateLpDkgBatchInput,\n worker: Worker,\n index: number,\n): Promise<string> {\n const roundId = `lp_dkg_${Date.now()}_${index}_${Math.random().toString(16).slice(2)}`;\n const initResponse = await input.client.initDkg(\n { lpPositionId: input.lpPositionId, index },\n input.auth,\n );\n\n const round1 = await workerRequest(worker, {\n id: roundId,\n type: \"round1\",\n });\n if (round1.type !== \"round1\") throw new Error(\"LP DKG worker returned wrong round1 type\");\n\n const round1Response = await input.client.dkgRound1(\n {\n sessionId: initResponse.sessionId,\n package: round1.package,\n },\n input.auth,\n );\n const round2 = await workerRequest(worker, {\n id: roundId,\n type: \"round2\",\n teeRound1: Array.from(round1Response.package),\n teeRound2ForLp: Array.from(round1Response.round2ForLp),\n });\n if (round2.type !== \"round2\") throw new Error(\"LP DKG worker returned wrong round2 type\");\n\n const round2Response = await input.client.dkgRound2(\n {\n sessionId: initResponse.sessionId,\n package: round2.package,\n delegatedShare: round2.delegatedShare,\n },\n input.auth,\n );\n if (!bytesEqual(Uint8Array.from(round2.jointPubkey), round2Response.jointPubkey)) {\n throw new Error(`LP DKG joint pubkey mismatch at index ${index}`);\n }\n if (round2Response.index !== index) {\n throw new Error(`LP DKG index mismatch: expected ${index}, got ${round2Response.index}`);\n }\n\n return round2Response.address;\n}\n\nasync function waitForCompletedShardAddress(\n input: CreateLpDkgBatchInput,\n index: number,\n): Promise<string> {\n const deadline = Date.now() + LP_DKG_COMPLETED_SHARD_POLL_TIMEOUT_MS;\n for (;;) {\n const address = await getCompletedShardAddress(input, index);\n if (address !== null) return address;\n if (Date.now() >= deadline) {\n throw new Error(`LP DKG completed shard ${index} did not become visible`);\n }\n await sleep(LP_DKG_COMPLETED_SHARD_POLL_INTERVAL_MS);\n }\n}\n\nasync function getCompletedShardAddress(\n input: CreateLpDkgBatchInput,\n index: number,\n): Promise<string | null> {\n const position = await input.client.getPosition(input.lpPositionId, input.auth);\n return position.shards.find((candidate) => candidate.index === index)?.address ?? null;\n}\n\nfunction workerRequest(worker: Worker, request: LpDkgWorkerRequest): Promise<LpDkgWorkerResponse> {\n return new Promise((resolve, reject) => {\n const onMessage = (event: MessageEvent<LpDkgWorkerResponse>) => {\n const message = event.data;\n if (message.id !== request.id) return;\n cleanup();\n if (message.type === \"error\") {\n reject(new Error(message.error));\n } else {\n resolve(message);\n }\n };\n const onError = (event: ErrorEvent) => {\n cleanup();\n reject(new Error(event.message));\n };\n const cleanup = () => {\n worker.removeEventListener(\"message\", onMessage);\n worker.removeEventListener(\"error\", onError);\n };\n worker.addEventListener(\"message\", onMessage);\n worker.addEventListener(\"error\", onError);\n worker.postMessage(request);\n });\n}\n\nfunction createWorker(workerFactory: (() => Worker) | undefined): Worker {\n if (workerFactory !== undefined) return workerFactory();\n return new Worker(new URL(\"./dkgWorker.js\", import.meta.url), { type: \"module\" });\n}\n\nfunction bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.byteLength !== b.byteLength) return false;\n let diff = 0;\n for (let index = 0; index < a.byteLength; index += 1) {\n diff |= a[index]! ^ b[index]!;\n }\n return diff === 0;\n}\n\nfunction isLpDkgCompletedOrVisibleError(error: unknown): boolean {\n if (!(error instanceof Error) || !error.message.includes(\"LP DKG index\")) return false;\n return (\n error.message.includes(\"already completed for position\") ||\n error.message.includes(\"already exists for position\")\n );\n}\n\nfunction isLpDkgActiveSessionError(error: unknown): boolean {\n return (\n error instanceof Error &&\n error.message.includes(\"LP DKG session already active for position index\")\n );\n}\n\nfunction resolveConcurrency(count: number, requested: number | undefined): number {\n if (count <= 0) return 0;\n const concurrency = requested ?? DEFAULT_LP_DKG_CONCURRENCY;\n if (!Number.isFinite(concurrency)) return Math.min(count, DEFAULT_LP_DKG_CONCURRENCY);\n return Math.max(1, Math.min(count, MAX_LP_DKG_CONCURRENCY, Math.floor(concurrency)));\n}\n\nfunction sleep(delayMs: number): Promise<void> {\n return new Promise((resolve) => {\n globalThis.setTimeout(resolve, delayMs);\n });\n}\n\nfunction testAddress(lpPositionId: string, index: number): string {\n return `${lpPositionId}Shard${String(index).padStart(5, \"0\")}11111111111111111111`;\n}\n","import {\n LP_DEFAULT_REFILL_BATCH_SIZE,\n LP_DEFAULT_TARGET_SHARDS,\n LP_MAX_REFILL_BATCH_SIZE,\n LP_MAX_TARGET_SHARDS,\n} from \"@invisible/shared\";\nimport { LpLifecycleError, PolicyValidationError, RoutingError } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\nimport { publicKey } from \"../core/brands.js\";\nimport { assertAttested } from \"../session/guards.js\";\nimport { createLpCoordinatorClient } from \"./coordinatorClient.js\";\nimport { createLpDkgBatch } from \"./dkgBatch.js\";\nimport {\n bytesToHex,\n deriveLpPositionCodeAuth,\n generateLpPositionCode,\n type LpPositionCodeAuth,\n} from \"./positionCode.js\";\nimport { validateLpWithdrawalPlan } from \"./withdrawalValidation.js\";\nimport type {\n LpCoordinatorClient,\n LpInventoryShard,\n LpPositionView,\n LpRedemptionHistoryView,\n LpWithdrawalExecutionView,\n} from \"./types.js\";\n\nconst LP_ID_PREFIX = \"lp\";\nconst DEFAULT_SHARD_FUNDING_LAMPORTS = 101_000_000;\nconst DEFAULT_REFILL_THRESHOLD_RATIO = 0.2;\nconst LP_DKG_ACTIVE_SESSION_RETRY_DELAY_MS = 2_000;\nconst LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS = 5 * 60_000 + 15_000;\nconst LP_WITHDRAWAL_CONFIRMATION_POLL_INTERVAL_MS = 3_000;\nconst LP_WITHDRAWAL_CONFIRMATION_TIMEOUT_MS = 15 * 60_000;\nconst LP_TOP_UP_WAIT_POLL_INTERVAL_MS = 1_000;\nconst LP_REDEMPTION_HISTORY_OPEN_STATES: ReadonlySet<LpRedemptionHistoryView[\"state\"]> = new Set([\n \"requested\",\n \"match_requested\",\n \"reserved\",\n \"pending\",\n]);\nexport const LP_REDEMPTION_RECONCILING_MESSAGE =\n \"LP redemption is still settling on the coordinator; it will reconcile from sync\";\nexport const LP_MISSING_POSITION_CODE_MESSAGE =\n \"Save or recover the LP Position Code before using LP funds\";\nconst POSITION_CODE_MISMATCH_MESSAGE = \"LP Position Code does not match this TEE position\";\nconst FUNDING_PLAN_EMPTY_MESSAGE = \"TEE returned an empty LP funding plan\";\nconst WITHDRAWAL_MISSING_RECORD_MESSAGE = \"LP withdrawal record is missing\";\nconst WITHDRAWAL_RECORD_MISMATCH_MESSAGE =\n \"LP withdrawal record does not match this confirmation request\";\nconst WITHDRAWAL_NO_LAMPORTS_MESSAGE = \"LP redemption did not land any lamports on-chain\";\nconst WITHDRAWAL_HISTORY_MISMATCH_MESSAGE = \"LP redemption history does not match this request\";\nconst UNSUPPORTED_FEE_POLICY_MESSAGE =\n \"LP fee policy overrides are not advertised by the coordinator\";\nconst FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE =\n \"LP earned-fee source count is not available; pass allowManyToOne: true to acknowledge many-to-one withdrawal risk\";\n\nexport type LpLifecycleDkgProgress = {\n readonly phase: \"dkg\";\n readonly lpPositionId: string;\n readonly startIndex: number;\n readonly targetShardCount: number;\n readonly completed: number;\n readonly total: number;\n};\n\nexport interface CreatePositionArgs {\n readonly committedLamports?: number;\n readonly shardCount?: number;\n readonly refillThreshold?: number;\n readonly feePolicy?: unknown;\n /**\n * Called after SDK-owned code generation and before the coordinator open call.\n * Use this to show/save the code if coordinator intake fails.\n */\n readonly onPositionCode?: (code: LpGeneratedPositionCode) => void;\n}\n\nexport interface LpGeneratedPositionCode {\n readonly positionId: string;\n readonly lpPositionCode: string;\n}\n\nexport interface CreatePositionResult {\n readonly positionId: string;\n /** Shown once at onboarding; treat like a seed phrase. */\n readonly lpPositionCode: string;\n readonly position: LpPositionView;\n}\n\nexport interface CompleteDkgBatchOptions {\n readonly onProgress?: (progress: LpLifecycleDkgProgress) => void;\n readonly onPosition?: (position: LpPositionView) => void;\n readonly concurrency?: number;\n readonly workerFactory?: () => Worker;\n}\n\nexport interface InitialFundingPlan {\n readonly address: string;\n readonly requiredLamports: number;\n readonly qrPayload: string;\n readonly position: LpPositionView;\n}\n\nexport interface LpTopUpRequest {\n readonly topUpId: string;\n readonly positionId: string;\n readonly depositAddress: string;\n readonly expiresAtMs: number;\n readonly status: \"watching\" | \"funded\" | \"expired\";\n}\n\nexport interface WithdrawPositionArgs {\n /** Accepted LP deposit-principal bucket claim. Computed from the position when omitted. */\n readonly depositPrincipalLamports?: number;\n /** Accepted earned-fee bucket claim. Computed from the position when omitted. */\n readonly earnedFeeLamports?: number;\n readonly destinationAddresses: string[];\n /** Required to accept a privacy-degrading single-destination withdrawal. */\n readonly allowManyToOne?: boolean;\n}\n\nexport interface RefillArgs {\n readonly shardCount?: number;\n readonly onProgress?: (progress: LpLifecycleDkgProgress) => void;\n readonly onPosition?: (position: LpPositionView) => void;\n readonly workerFactory?: () => Worker;\n}\n\nexport interface WithdrawalExecution {\n readonly withdrawalId: string;\n readonly txSignatures: string[];\n}\n\nexport interface LpWithdrawalRecord {\n readonly redemptionId: string;\n readonly lpPositionId: string;\n readonly requestedAt: number;\n readonly status: \"pending\" | \"reconciling\" | \"confirmed\" | \"failed\";\n readonly destinationAddresses: string[];\n readonly destinationCount?: number;\n readonly txSignatureCount?: number;\n readonly detailsTruncated?: boolean;\n readonly acceptedLamports?: number;\n readonly requestedTargetLamports: number;\n readonly landedBaselineLamports: number;\n readonly landedFeeBaselineLamports?: number;\n readonly redeemedLamports: number;\n readonly txSignatures: string[];\n readonly txSignatureBaseline: string[];\n readonly coordinatorStateVersion?: number;\n readonly error?: string;\n}\n\nexport interface WithdrawPositionResult {\n readonly execution: WithdrawalExecution;\n readonly position: LpPositionView;\n readonly redemption: LpWithdrawalRecord;\n}\n\nexport interface WithdrawalConfirmation {\n readonly withdrawalId: string;\n readonly txSignatures: string[];\n readonly redeemedLamports: number;\n}\n\nexport interface LpLifecycleRuntime {\n readonly coordinatorClient?: LpCoordinatorClient;\n readonly workerFactory?: () => Worker;\n readonly useDeterministicTestAddresses?: boolean;\n readonly nowMs?: () => number;\n readonly idFactory?: () => string;\n readonly sleep?: (delayMs: number) => Promise<void>;\n readonly dkgConcurrency?: number;\n readonly withdrawalConfirmationPollIntervalMs?: number;\n readonly withdrawalConfirmationTimeoutMs?: number;\n}\n\nexport interface WaitForWithdrawalConfirmationOptions {\n readonly onPosition?: (position: LpPositionView) => void;\n readonly onRedemptionUpdate?: (record: LpWithdrawalRecord) => void;\n readonly redemptionRecord?: LpWithdrawalRecord;\n}\n\nexport interface WaitForTopUpOptions {\n readonly signal?: AbortSignal;\n readonly pollIntervalMs?: number;\n readonly positionId?: string;\n}\n\nclass LpRedemptionReconcilingError extends LpLifecycleError {\n constructor() {\n super(\"LP_REDEMPTION_RECONCILING\", LP_REDEMPTION_RECONCILING_MESSAGE);\n this.name = \"LpRedemptionReconcilingError\";\n }\n}\n\nclass LpPositionAuthMissingError extends LpLifecycleError {\n constructor() {\n super(\"LP_POSITION_AUTH_MISSING\", LP_MISSING_POSITION_CODE_MESSAGE);\n this.name = \"LpPositionAuthMissingError\";\n }\n}\n\nexport function isLpRedemptionReconcilingError(error: unknown): boolean {\n return (\n error instanceof LpRedemptionReconcilingError ||\n (error instanceof Error && error.message === LP_REDEMPTION_RECONCILING_MESSAGE)\n );\n}\n\nexport function isLpPositionAuthMissingError(error: unknown): boolean {\n return (\n error instanceof LpPositionAuthMissingError ||\n (error instanceof Error && error.message === LP_MISSING_POSITION_CODE_MESSAGE)\n );\n}\n\nexport interface LpLifecycleClient {\n createPosition(args?: CreatePositionArgs): Promise<CreatePositionResult>;\n recoverPosition(args: { readonly code: string }): Promise<LpPositionView>;\n confirmPositionCodeSaved(positionId: string): void;\n completeDkgBatch(positionId: string, options?: CompleteDkgBatchOptions): Promise<LpPositionView>;\n refreshPosition(positionId: string): Promise<LpPositionView>;\n refill(positionId: string, args?: RefillArgs): Promise<LpPositionView>;\n prepareInitialFunding(positionId: string): Promise<InitialFundingPlan | null>;\n prepareTopUp(positionId: string): Promise<LpTopUpRequest>;\n waitForTopUp(topUpId: string, options?: WaitForTopUpOptions): Promise<LpTopUpRequest>;\n reconcileFunding(positionId: string): Promise<LpPositionView>;\n withdrawPosition(positionId: string, args: WithdrawPositionArgs): Promise<WithdrawPositionResult>;\n waitForWithdrawalConfirmation(\n positionId: string,\n execution: WithdrawalExecution,\n options?: WaitForWithdrawalConfirmationOptions,\n ): Promise<WithdrawalConfirmation>;\n withdrawFees(positionId: string, args: { readonly destination: string }): Promise<never>;\n listPositions(): Promise<LpPositionView[]>;\n}\n\ntype LpLifecycleState = {\n readonly authByPosition: Map<string, LpPositionCodeAuth>;\n readonly positions: Map<string, LpPositionView>;\n readonly redemptions: Map<string, LpWithdrawalRecord>;\n readonly topUps: Map<string, LpTopUpRequest>;\n};\n\nconst lifecycleClients = new WeakMap<Session, LpLifecycleClient>();\n\nexport function createLpLifecycleClient(\n session: Session,\n runtime: LpLifecycleRuntime = {},\n): LpLifecycleClient {\n const state: LpLifecycleState = {\n authByPosition: new Map(),\n positions: new Map(),\n redemptions: new Map(),\n topUps: new Map(),\n };\n const client = runtime.coordinatorClient ?? createLpCoordinatorClient(session);\n const nowMs = runtime.nowMs ?? Date.now;\n const sleep = runtime.sleep ?? defaultSleep;\n\n const requireAuth = (positionId: string): LpPositionCodeAuth => {\n const auth = state.authByPosition.get(positionId);\n if (auth === undefined) throw new LpPositionAuthMissingError();\n return auth;\n };\n\n const rememberPosition = (position: LpPositionView): LpPositionView => {\n const snapshot = clonePosition(position);\n state.positions.set(snapshot.id, snapshot);\n hydrateLpRedemptionsFromPosition(state, snapshot);\n return position;\n };\n\n const rememberAuth = (auth: LpPositionCodeAuth): void => {\n state.authByPosition.set(auth.lpPositionId, auth);\n };\n\n const refreshPosition = async (positionId: string): Promise<LpPositionView> => {\n const auth = requireAuth(positionId);\n return rememberPosition(await client.getPosition(positionId, auth));\n };\n\n const completeDkgBatch = async (\n positionId: string,\n options: CompleteDkgBatchOptions = {},\n ): Promise<LpPositionView> => {\n assertAttested(session);\n const auth = requireAuth(positionId);\n let activeSessionRetryStartedAtMs: number | null = null;\n\n for (;;) {\n const current = rememberPosition(await client.getPosition(positionId, auth));\n options.onPosition?.(current);\n const startIndex = current.shards.length;\n const remaining = current.targetShardCount - startIndex;\n if (remaining <= 0) return current;\n\n emitDkgProgress(options, current, startIndex, remaining, 0);\n let expectedAddresses: string[] | null = null;\n try {\n const addresses = await createLpDkgBatch({\n lpPositionId: positionId,\n startIndex,\n count: remaining,\n auth,\n client,\n concurrency: options.concurrency ?? runtime.dkgConcurrency,\n workerFactory: options.workerFactory ?? runtime.workerFactory,\n useDeterministicTestAddresses: runtime.useDeterministicTestAddresses,\n onProgress: (progress) => {\n emitDkgProgress(options, current, startIndex, remaining, progress.completed);\n },\n });\n expectedAddresses = addresses;\n const position = await client.finalizeDkgBatch(\n {\n lpPositionId: positionId,\n startIndex,\n addresses,\n finalizedAtMs: nowMs(),\n },\n auth,\n );\n options.onPosition?.(position);\n emitDkgProgress(options, position, startIndex, remaining, remaining);\n return rememberPosition(position);\n } catch (error) {\n const reconciled = await tryRefreshCompletedDkgWindow({\n client,\n positionId,\n auth,\n startIndex,\n total: remaining,\n expectedAddresses,\n state,\n });\n if (reconciled !== null) return reconciled;\n if (isLpDkgIndexDriftError(error)) {\n activeSessionRetryStartedAtMs = null;\n continue;\n }\n if (!isLpDkgActiveSessionError(error)) throw error;\n\n const currentTime = nowMs();\n activeSessionRetryStartedAtMs ??= currentTime;\n if (currentTime - activeSessionRetryStartedAtMs >= LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS) {\n throw error;\n }\n await sleep(LP_DKG_ACTIVE_SESSION_RETRY_DELAY_MS);\n }\n }\n };\n\n return {\n async createPosition(args = {}) {\n assertNoUnsupportedFeePolicy(args.feePolicy);\n const shardCount = args.shardCount ?? LP_DEFAULT_TARGET_SHARDS;\n assertShardCount(shardCount, LP_MAX_TARGET_SHARDS, \"shardCount\");\n assertAttested(session);\n const positionId = runtime.idFactory?.() ?? generateId(LP_ID_PREFIX);\n const auth = await generateLpPositionCode(positionId);\n rememberAuth(auth);\n args.onPositionCode?.({ positionId, lpPositionCode: auth.code });\n const committedLamports = args.committedLamports ?? DEFAULT_SHARD_FUNDING_LAMPORTS;\n const position = rememberPosition(\n await client.openPosition(\n {\n lpPositionId: positionId,\n authPublicKey: Array.from(auth.authPublicKey),\n refillPublicKey: Array.from(auth.refillPublicKey),\n withdrawalCommitment: Array.from(auth.withdrawalCommitment),\n committedLamports,\n shardCount,\n shardAmountLamports: DEFAULT_SHARD_FUNDING_LAMPORTS,\n refillThreshold:\n args.refillThreshold ?? Math.ceil(shardCount * DEFAULT_REFILL_THRESHOLD_RATIO),\n addresses: [],\n createdAtMs: nowMs(),\n },\n auth,\n ),\n );\n return { positionId, lpPositionCode: auth.code, position };\n },\n\n async recoverPosition(args) {\n const auth = await deriveLpPositionCodeAuth(args.code);\n rememberAuth(auth);\n const position = rememberPosition(await client.getPosition(auth.lpPositionId, auth));\n assertPositionMatchesAuth(position, auth);\n return position;\n },\n\n confirmPositionCodeSaved(_positionId) {\n return;\n },\n\n completeDkgBatch,\n\n refreshPosition,\n\n async refill(positionId, args = {}) {\n const requestedShardCount = args.shardCount ?? LP_DEFAULT_REFILL_BATCH_SIZE;\n assertShardCount(requestedShardCount, LP_MAX_REFILL_BATCH_SIZE, \"shardCount\");\n assertAttested(session);\n const auth = requireAuth(positionId);\n const current = await refreshPosition(positionId);\n args.onPosition?.(current);\n const refillShardCount = resolveLpRefillShardCount(\n current,\n requestedShardCount,\n args.shardCount === undefined,\n );\n const authorizedPosition = rememberPosition(\n await client.refillPosition(\n {\n lpPositionId: positionId,\n shardCount: refillShardCount,\n shardAmountLamports: DEFAULT_SHARD_FUNDING_LAMPORTS,\n addresses: [],\n authorizedAtMs: nowMs(),\n },\n auth,\n ),\n );\n args.onPosition?.(authorizedPosition);\n if (authorizedPosition.shards.length >= authorizedPosition.targetShardCount) {\n return authorizedPosition;\n }\n return completeDkgBatch(positionId, {\n onProgress: args.onProgress,\n onPosition: args.onPosition,\n workerFactory: args.workerFactory,\n });\n },\n\n async prepareInitialFunding(positionId) {\n assertAttested(session);\n const auth = requireAuth(positionId);\n const currentPosition = rememberPosition(await client.getPosition(positionId, auth));\n if (!isLpPositionReadyForInitialFunding(currentPosition)) return null;\n\n const initialShard = currentPosition.shards.find((shard) => shard.index === 0);\n if (initialShard === undefined) return null;\n if (initialShard.status === \"FUNDING_QUEUED\") {\n return fundingPlanFromShard(currentPosition, initialShard);\n }\n if (initialShard.status !== \"PREGENERATED\") return null;\n\n const existingQueuedShard = currentPosition.shards.find(\n (shard) => shard.status === \"FUNDING_QUEUED\",\n );\n if (existingQueuedShard !== undefined) return null;\n\n const [plannedShard] = await client.planFunding(\n { lpPositionId: positionId, shardCount: 1, nowMs: nowMs() },\n auth,\n );\n if (plannedShard === undefined) throw new Error(FUNDING_PLAN_EMPTY_MESSAGE);\n if (plannedShard.index !== 0) {\n throw new PolicyValidationError(\n \"INVALID_POSITION_AUTH\",\n \"Coordinator funding plan did not select LP_DKG_0\",\n );\n }\n const position = rememberPosition(await client.getPosition(positionId, auth));\n return fundingPlanFromShard(position, plannedShard);\n },\n\n async prepareTopUp(positionId) {\n assertAttested(session);\n const auth = requireAuth(positionId);\n const request = await client.prepareTopUp(positionId, auth);\n state.topUps.set(request.topUpId, request);\n return request;\n },\n\n async waitForTopUp(topUpId, options = {}) {\n const cached = state.topUps.get(topUpId);\n if (\n cached !== undefined &&\n options.positionId !== undefined &&\n cached.positionId !== options.positionId\n ) {\n throw new PolicyValidationError(\n \"INVALID_POSITION_AUTH\",\n \"Top-up request does not belong to the requested LP position\",\n );\n }\n const initial =\n cached ??\n (options.positionId === undefined\n ? undefined\n : await client.getTopUpStatus(\n { lpPositionId: options.positionId, topUpId },\n requireAuth(options.positionId),\n ));\n if (initial === undefined) {\n throw new PolicyValidationError(\n \"INVALID_POSITION_AUTH\",\n \"Top-up request is not known to this LP session\",\n );\n }\n const pollIntervalMs = options.pollIntervalMs ?? LP_TOP_UP_WAIT_POLL_INTERVAL_MS;\n let current = initial;\n for (;;) {\n throwIfTopUpWaitAborted(options.signal);\n if (current.status !== \"watching\") return current;\n const auth = requireAuth(current.positionId);\n current = await client.getTopUpStatus({ lpPositionId: current.positionId, topUpId }, auth);\n state.topUps.set(topUpId, current);\n if (current.status !== \"watching\") return current;\n if (nowMs() >= current.expiresAtMs) {\n current = await client.getTopUpStatus(\n { lpPositionId: current.positionId, topUpId },\n auth,\n );\n state.topUps.set(topUpId, current);\n if (current.status !== \"watching\") return current;\n current = { ...current, status: \"expired\" };\n state.topUps.set(topUpId, current);\n return current;\n }\n await sleep(pollIntervalMs);\n }\n },\n\n async reconcileFunding(positionId) {\n assertAttested(session);\n const auth = requireAuth(positionId);\n return rememberPosition(await client.reconcileFunding(positionId, auth));\n },\n\n async withdrawPosition(positionId, args) {\n validateExplicitWithdrawalInput(args);\n validateWithdrawalDestinations(args);\n assertAttested(session);\n const auth = requireAuth(positionId);\n const before = rememberPosition(await client.reconcileFunding(positionId, auth));\n const existingRedemption = findOpenRedemptionHistory(before, args);\n if (existingRedemption !== undefined) {\n const execution = {\n withdrawalId: existingRedemption.redemptionId,\n txSignatures: [...existingRedemption.txSignatures],\n };\n const redemption = {\n ...buildLpRedemptionRecord({\n execution,\n position: before,\n destinationAddresses: existingRedemption.destinationAddresses,\n acceptedLamports: existingRedemption.acceptedLamports,\n requestedTargetLamports: existingRedemption.acceptedLamports,\n landedBaselineLamports: 0,\n landedFeeBaselineLamports: 0,\n txSignatureBaseline: [],\n nowMs: existingRedemption.createdAtMs,\n }),\n redeemedLamports: existingRedemption.landedLamports,\n coordinatorStateVersion: existingRedemption.stateVersion,\n };\n state.redemptions.set(execution.withdrawalId, redemption);\n return { execution, position: before, redemption };\n }\n const claim = resolveWithdrawalClaim(before, args);\n const sourceCount = lpWithdrawalSourceCountForClaim(before, {\n ...claim,\n allowManyToOne: args.allowManyToOne,\n });\n const validationInput = {\n lpPositionId: positionId,\n destinationAddresses: args.destinationAddresses,\n depositPrincipalLamports: claim.depositPrincipalLamports,\n earnedFeeLamports: claim.earnedFeeLamports,\n requestedAtMs: nowMs(),\n allowManyToOne: args.allowManyToOne ?? false,\n sourceCount,\n };\n validateLpWithdrawalPlan(validationInput);\n const execution = await client.executeWithdrawal(\n {\n lpPositionId: validationInput.lpPositionId,\n destinationAddresses: validationInput.destinationAddresses,\n depositPrincipalLamports: validationInput.depositPrincipalLamports,\n earnedFeeLamports: validationInput.earnedFeeLamports,\n requestedAtMs: validationInput.requestedAtMs,\n allowManyToOne: args.allowManyToOne === true || sourceCount === 1,\n },\n auth,\n );\n const pendingRedemption = buildLpRedemptionRecord({\n execution,\n position: before,\n destinationAddresses: args.destinationAddresses,\n acceptedLamports: claim.depositPrincipalLamports + claim.earnedFeeLamports,\n requestedTargetLamports:\n (before.actorSync?.withdrawalRequestedLamports ?? 0) +\n claim.depositPrincipalLamports +\n claim.earnedFeeLamports,\n landedBaselineLamports: before.actorSync?.withdrawalLandedLamports ?? 0,\n landedFeeBaselineLamports: before.actorSync?.withdrawalLandedFeeLamports ?? 0,\n txSignatureBaseline: before.actorSync?.withdrawalTxHashes ?? [],\n nowMs: nowMs(),\n });\n state.redemptions.set(execution.withdrawalId, pendingRedemption);\n const position = await client\n .getPosition(positionId, auth)\n .then((refreshed) => rememberPosition(refreshed))\n .catch(() => before);\n const redemption = { ...pendingRedemption, lpPositionId: position.id };\n state.redemptions.set(execution.withdrawalId, redemption);\n return { execution, position, redemption };\n },\n\n async waitForWithdrawalConfirmation(positionId, execution, options = {}) {\n const auth = requireAuth(positionId);\n let record = resolveWithdrawalRecord({\n state,\n positionId,\n execution,\n options,\n });\n state.redemptions.set(record.redemptionId, record);\n const deadlineMs =\n nowMs() +\n (runtime.withdrawalConfirmationTimeoutMs ?? LP_WITHDRAWAL_CONFIRMATION_TIMEOUT_MS);\n const pollIntervalMs =\n runtime.withdrawalConfirmationPollIntervalMs ?? LP_WITHDRAWAL_CONFIRMATION_POLL_INTERVAL_MS;\n\n for (;;) {\n const position = rememberPosition(await client.getPosition(positionId, auth));\n options.onPosition?.(position);\n const reconciled = reconcileLpRedemptionFromActorSync(record, position);\n record = reconciled;\n state.redemptions.set(record.redemptionId, reconciled);\n options.onRedemptionUpdate?.(reconciled);\n if (reconciled.status === \"confirmed\") {\n return {\n withdrawalId: execution.withdrawalId,\n txSignatures: reconciled.txSignatures,\n redeemedLamports: reconciled.redeemedLamports,\n };\n }\n if (reconciled.status === \"failed\") {\n throw new Error(reconciled.error ?? WITHDRAWAL_NO_LAMPORTS_MESSAGE);\n }\n if (nowMs() > deadlineMs) {\n state.redemptions.set(record.redemptionId, { ...reconciled, status: \"reconciling\" });\n options.onRedemptionUpdate?.({ ...reconciled, status: \"reconciling\" });\n throw new LpRedemptionReconcilingError();\n }\n await sleep(pollIntervalMs);\n }\n },\n\n async withdrawFees(_positionId, args) {\n publicKey(args.destination);\n assertAttested(session);\n throw new RoutingError(\n \"VERSION_NOT_SUPPORTED\",\n \"LP fee withdrawal is not advertised by the coordinator\",\n );\n },\n\n async listPositions() {\n return [...state.positions.values()].map(clonePosition);\n },\n };\n}\n\nexport function defaultLpLifecycleClient(session: Session): LpLifecycleClient {\n let client = lifecycleClients.get(session);\n if (client === undefined) {\n client = createLpLifecycleClient(session);\n lifecycleClients.set(session, client);\n }\n return client;\n}\n\nfunction emitDkgProgress(\n options: CompleteDkgBatchOptions,\n position: LpPositionView,\n startIndex: number,\n total: number,\n completed: number,\n): void {\n options.onProgress?.({\n phase: \"dkg\",\n lpPositionId: position.id,\n startIndex,\n targetShardCount: startIndex + total,\n completed: Math.min(completed, total),\n total,\n });\n}\n\nasync function tryRefreshCompletedDkgWindow({\n client,\n positionId,\n auth,\n startIndex,\n total,\n expectedAddresses,\n state,\n}: {\n readonly client: LpCoordinatorClient;\n readonly positionId: string;\n readonly auth: LpPositionCodeAuth;\n readonly startIndex: number;\n readonly total: number;\n readonly expectedAddresses: readonly string[] | null;\n readonly state: LpLifecycleState;\n}): Promise<LpPositionView | null> {\n const position = await client.getPosition(positionId, auth).catch(() => null);\n if (position === null) return null;\n if (!hasCompletedDkgWindow(position, startIndex, total, expectedAddresses)) return null;\n state.positions.set(position.id, clonePosition(position));\n return position;\n}\n\nfunction hasCompletedDkgWindow(\n position: LpPositionView,\n startIndex: number,\n total: number,\n expectedAddresses: readonly string[] | null,\n): boolean {\n for (let offset = 0; offset < total; offset += 1) {\n const shard = position.shards.find((candidate) => candidate.index === startIndex + offset);\n if (shard === undefined) {\n return false;\n }\n if (expectedAddresses !== null && shard.address !== expectedAddresses[offset]) {\n return false;\n }\n }\n return true;\n}\n\nfunction assertNoUnsupportedFeePolicy(feePolicy: unknown): void {\n if (feePolicy === undefined) return;\n throw new RoutingError(\"VERSION_NOT_SUPPORTED\", UNSUPPORTED_FEE_POLICY_MESSAGE);\n}\n\nfunction fundingPlanFromShard(\n position: LpPositionView,\n shard: LpInventoryShard,\n): InitialFundingPlan | null {\n if (shard.requiredLamports === undefined || shard.requiredLamports <= 0) return null;\n return {\n address: shard.address,\n requiredLamports: shard.requiredLamports,\n qrPayload: `solana:${shard.address}`,\n position,\n };\n}\n\nfunction assertPositionMatchesAuth(position: LpPositionView, auth: LpPositionCodeAuth): void {\n if (\n position.authPublicKey !== bytesToHex(auth.authPublicKey) ||\n position.refillPublicKey !== bytesToHex(auth.refillPublicKey) ||\n position.withdrawalCommitment !== bytesToHex(auth.withdrawalCommitment)\n ) {\n throw new Error(POSITION_CODE_MISMATCH_MESSAGE);\n }\n}\n\nfunction assertShardCount(value: number, max: number, field: string): void {\n if (!Number.isInteger(value) || value < 1 || value > max) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `${field} must be an integer in 1..${max}, received ${String(value)}`,\n );\n }\n}\n\nfunction resolveLpRefillShardCount(\n position: LpPositionView,\n requestedShardCount: number,\n capDefaultBatch: boolean,\n): number {\n const remainingShardCapacity = LP_MAX_TARGET_SHARDS - position.shards.length;\n if (remainingShardCapacity <= 0) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `LP refill target_shard_count is already at ${LP_MAX_TARGET_SHARDS}`,\n );\n }\n const refillShardCount = capDefaultBatch\n ? Math.min(requestedShardCount, remainingShardCapacity)\n : requestedShardCount;\n if (position.shards.length + refillShardCount > LP_MAX_TARGET_SHARDS) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n `LP refill target_shard_count must be <= ${LP_MAX_TARGET_SHARDS}`,\n );\n }\n return refillShardCount;\n}\n\nfunction isLpPositionReadyForInitialFunding(position: LpPositionView): boolean {\n return position.status === \"active\" && position.shards.length >= position.targetShardCount;\n}\n\nfunction resolveWithdrawalClaim(\n position: LpPositionView,\n args: WithdrawPositionArgs,\n): { readonly depositPrincipalLamports: number; readonly earnedFeeLamports: number } {\n if (args.depositPrincipalLamports !== undefined || args.earnedFeeLamports !== undefined) {\n return {\n depositPrincipalLamports: args.depositPrincipalLamports ?? 0,\n earnedFeeLamports: args.earnedFeeLamports ?? 0,\n };\n }\n const legacyDepositPrincipalLamports = position.shards\n .filter((shard) => shard.status === \"AVAILABLE\" && shard.amountLamports > 0)\n .reduce((sum, shard) => sum + shard.amountLamports, 0);\n const actorRedeemablePrincipalLamports = Math.max(\n 0,\n position.actorSync?.redeemablePrincipalLamports ?? 0,\n );\n const actorRedeemableFeeLamports = Math.max(0, position.actorSync?.redeemableFeeLamports ?? 0);\n const hasActorProjection = hasActorRedeemableProjection(position.actorSync);\n const depositPrincipalLamports = resolveRedeemablePrincipalLamports(\n position.actorSync,\n legacyDepositPrincipalLamports,\n actorRedeemablePrincipalLamports,\n actorRedeemableFeeLamports,\n );\n const earnedFeeLamports = hasActorProjection\n ? actorRedeemableFeeLamports\n : Math.max(0, position.earnedLamports);\n const totalLamports = depositPrincipalLamports + earnedFeeLamports;\n if (!Number.isSafeInteger(totalLamports) || totalLamports <= 0) {\n throw new PolicyValidationError(\n \"INVALID_AMOUNT\",\n \"LP withdrawal requires available principal or earned fees\",\n );\n }\n return { depositPrincipalLamports, earnedFeeLamports };\n}\n\nfunction findOpenRedemptionHistory(\n position: LpPositionView,\n args: WithdrawPositionArgs,\n): LpRedemptionHistoryView | undefined {\n const hasExplicitClaim =\n args.depositPrincipalLamports !== undefined || args.earnedFeeLamports !== undefined;\n const requestedPrincipalLamports = args.depositPrincipalLamports ?? 0;\n const requestedFeeLamports = args.earnedFeeLamports ?? 0;\n return position.actorSync?.redemptionHistory?.find(\n (history) =>\n LP_REDEMPTION_HISTORY_OPEN_STATES.has(history.state) &&\n history.detailsTruncated !== true &&\n sameStringList(history.destinationAddresses, args.destinationAddresses) &&\n (!hasExplicitClaim ||\n (history.acceptedDepositPrincipalLamports === requestedPrincipalLamports &&\n history.acceptedEarnedFeeLamports === requestedFeeLamports)),\n );\n}\n\nfunction hasActorSyncLpActivity(sync: LpPositionView[\"actorSync\"]): boolean {\n if (sync === undefined) return false;\n return (\n sync.status !== \"idle\" ||\n sync.pendingReservationCount > 0 ||\n sync.reservedPayoutLamports > 0 ||\n sync.reimbursementDueCount > 0 ||\n sync.reimbursementDueSourceCount > 0 ||\n sync.reimbursementDuePayoutLamports > 0 ||\n sync.reimbursementDueNetworkFeeLamports > 0 ||\n sync.withdrawalRequestedLamports > 0 ||\n sync.withdrawalLandedLamports > 0 ||\n sync.withdrawalLandedFeeLamports > 0 ||\n sync.withdrawalCanceledLamports > 0 ||\n sync.withdrawalNetworkFeeLossLamports > 0 ||\n sync.withdrawalTxHashes.length > 0\n );\n}\n\nfunction resolveRedeemablePrincipalLamports(\n sync: LpPositionView[\"actorSync\"],\n legacyAvailableLamports: number,\n actorRedeemablePrincipalLamports: number,\n actorRedeemableFeeLamports: number,\n): number {\n if (sync?.redeemableProjectionAvailable !== true) return legacyAvailableLamports;\n if (legacyAvailableLamports <= 0) return actorRedeemablePrincipalLamports;\n if (actorRedeemablePrincipalLamports >= legacyAvailableLamports || hasActorSyncLpActivity(sync)) {\n return actorRedeemablePrincipalLamports;\n }\n return Math.max(\n actorRedeemablePrincipalLamports,\n legacyAvailableLamports - actorRedeemableFeeLamports,\n );\n}\n\nfunction hasActorRedeemableProjection(sync: LpPositionView[\"actorSync\"]): boolean {\n return sync?.redeemableProjectionAvailable === true;\n}\n\nfunction validateExplicitWithdrawalInput(args: WithdrawPositionArgs): void {\n if (args.depositPrincipalLamports === undefined && args.earnedFeeLamports === undefined) return;\n validateLpWithdrawalPlan({\n destinationAddresses: args.destinationAddresses,\n depositPrincipalLamports: args.depositPrincipalLamports ?? 0,\n earnedFeeLamports: args.earnedFeeLamports ?? 0,\n allowManyToOne: args.allowManyToOne,\n sourceCount: args.destinationAddresses.length,\n });\n}\n\nfunction validateWithdrawalDestinations(args: WithdrawPositionArgs): void {\n validateLpWithdrawalPlan({\n destinationAddresses: args.destinationAddresses,\n depositPrincipalLamports: 1,\n earnedFeeLamports: 0,\n allowManyToOne: true,\n });\n}\n\nfunction resolveWithdrawalRecord({\n state,\n positionId,\n execution,\n options,\n}: {\n readonly state: LpLifecycleState;\n readonly positionId: string;\n readonly execution: WithdrawalExecution;\n readonly options: WaitForWithdrawalConfirmationOptions;\n}): LpWithdrawalRecord {\n const record = state.redemptions.get(execution.withdrawalId) ?? options.redemptionRecord;\n if (record === undefined) throw new Error(WITHDRAWAL_MISSING_RECORD_MESSAGE);\n if (record.lpPositionId !== positionId || record.redemptionId !== execution.withdrawalId) {\n throw new PolicyValidationError(\"INVALID_REDEMPTION_PLAN\", WITHDRAWAL_RECORD_MISMATCH_MESSAGE);\n }\n return {\n ...record,\n destinationAddresses: [...record.destinationAddresses],\n txSignatures: [...record.txSignatures],\n txSignatureBaseline: [...record.txSignatureBaseline],\n landedFeeBaselineLamports: record.landedFeeBaselineLamports ?? 0,\n };\n}\n\nfunction lpWithdrawalSourceCountForClaim(\n position: LpPositionView,\n claim: {\n readonly depositPrincipalLamports: number;\n readonly earnedFeeLamports: number;\n readonly allowManyToOne?: boolean;\n },\n): number {\n let remainingPrincipalLamports = claim.depositPrincipalLamports;\n let principalSourceCount = 0;\n const principalCandidates = [...position.shards]\n .filter((shard) => shard.status === \"AVAILABLE\" && shard.amountLamports > 0)\n .sort((left, right) => left.shardId.localeCompare(right.shardId));\n for (const shard of principalCandidates) {\n if (remainingPrincipalLamports <= 0) break;\n principalSourceCount += 1;\n remainingPrincipalLamports -= shard.amountLamports;\n }\n const actorRedeemablePrincipalLamports = position.actorSync?.redeemablePrincipalLamports ?? 0;\n const actorRedeemablePrincipalSourceCount =\n position.actorSync?.redeemablePrincipalSourceCount ?? 0;\n if (\n claim.depositPrincipalLamports > 0 &&\n position.actorSync?.redeemableProjectionAvailable === true &&\n actorRedeemablePrincipalLamports >= claim.depositPrincipalLamports &&\n actorRedeemablePrincipalSourceCount > 0\n ) {\n principalSourceCount = actorRedeemablePrincipalSourceCount;\n }\n const observedEarnedFeeSourceCount =\n position.actorSync?.redeemableProjectionAvailable === true\n ? (position.actorSync.redeemableFeeSourceCount ?? 0)\n : position.actorSync?.redeemableFeeSourceCount ||\n position.actorSync?.reimbursementDueSourceCount ||\n 0;\n if (\n claim.earnedFeeLamports > 0 &&\n observedEarnedFeeSourceCount < 1 &&\n claim.allowManyToOne !== true\n ) {\n throw new PolicyValidationError(\n \"INVALID_WITHDRAWAL_PLAN\",\n FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE,\n );\n }\n const earnedFeeSourceCount =\n claim.earnedFeeLamports > 0 ? Math.max(1, observedEarnedFeeSourceCount) : 0;\n return principalSourceCount + earnedFeeSourceCount;\n}\n\nfunction buildLpRedemptionRecord({\n execution,\n position,\n destinationAddresses,\n acceptedLamports,\n requestedTargetLamports,\n landedBaselineLamports,\n landedFeeBaselineLamports,\n txSignatureBaseline,\n nowMs,\n}: {\n readonly execution: LpWithdrawalExecutionView;\n readonly position: LpPositionView;\n readonly destinationAddresses: readonly string[];\n readonly acceptedLamports: number;\n readonly requestedTargetLamports: number;\n readonly landedBaselineLamports: number;\n readonly landedFeeBaselineLamports: number;\n readonly txSignatureBaseline: readonly string[];\n readonly nowMs: number;\n}): LpWithdrawalRecord {\n return {\n redemptionId: execution.withdrawalId,\n lpPositionId: position.id,\n requestedAt: nowMs,\n status: \"pending\",\n destinationAddresses: [...destinationAddresses],\n acceptedLamports,\n requestedTargetLamports,\n landedBaselineLamports,\n landedFeeBaselineLamports,\n redeemedLamports: 0,\n txSignatures: [...execution.txSignatures],\n txSignatureBaseline: [...txSignatureBaseline],\n };\n}\n\nfunction reconcileLpRedemptionFromActorSync(\n record: LpWithdrawalRecord,\n position: LpPositionView,\n): LpWithdrawalRecord {\n const sync = position.actorSync;\n if (sync === undefined) return record;\n const history = sync.redemptionHistory?.find(\n (candidate) => candidate.redemptionId === record.redemptionId,\n );\n if (history !== undefined) {\n return reconcileLpRedemptionFromHistory(record, history);\n }\n const resolvedLamports =\n sync.withdrawalLandedLamports +\n sync.withdrawalLandedFeeLamports +\n sync.withdrawalCanceledLamports +\n sync.withdrawalNetworkFeeLossLamports;\n const settled =\n sync.withdrawalRequestedLamports >= record.requestedTargetLamports &&\n sync.withdrawalRequestedLamports <= resolvedLamports;\n const redeemedLamports = Math.max(\n sync.withdrawalLandedLamports -\n record.landedBaselineLamports +\n sync.withdrawalLandedFeeLamports -\n (record.landedFeeBaselineLamports ?? 0),\n 0,\n );\n const baselineSignatures = new Set(record.txSignatureBaseline);\n const txSignatures = sync.withdrawalTxHashes.filter(\n (signature) => !baselineSignatures.has(signature),\n );\n if (!settled) return { ...record, redeemedLamports, txSignatures };\n if (redeemedLamports <= 0) {\n return {\n ...record,\n status: \"failed\",\n redeemedLamports,\n txSignatures,\n error: WITHDRAWAL_NO_LAMPORTS_MESSAGE,\n };\n }\n return { ...record, status: \"confirmed\", redeemedLamports, txSignatures };\n}\n\nfunction reconcileLpRedemptionFromHistory(\n record: LpWithdrawalRecord,\n history: LpRedemptionHistoryView,\n): LpWithdrawalRecord {\n const observedStateVersion = record.coordinatorStateVersion ?? 0;\n if (history.stateVersion < observedStateVersion) return record;\n if (\n (record.acceptedLamports !== undefined &&\n history.acceptedLamports !== record.acceptedLamports) ||\n (history.detailsTruncated !== true &&\n !sameStringList(history.destinationAddresses, record.destinationAddresses))\n ) {\n return {\n ...record,\n status: \"failed\",\n coordinatorStateVersion: Math.max(observedStateVersion, history.stateVersion),\n error: WITHDRAWAL_HISTORY_MISMATCH_MESSAGE,\n };\n }\n const txSignatures = uniqueStrings([...record.txSignatures, ...history.txSignatures]);\n const base = {\n ...record,\n coordinatorStateVersion: history.stateVersion,\n redeemedLamports: history.landedLamports,\n txSignatures,\n destinationCount: history.destinationCount,\n txSignatureCount: history.txSignatureCount,\n detailsTruncated: history.detailsTruncated,\n error: undefined,\n };\n if (history.state === \"confirmed\") {\n return history.landedLamports > 0\n ? { ...base, status: \"confirmed\" }\n : { ...base, status: \"failed\", error: WITHDRAWAL_NO_LAMPORTS_MESSAGE };\n }\n if (history.state === \"rejected\") {\n return {\n ...base,\n status: \"failed\",\n error: WITHDRAWAL_NO_LAMPORTS_MESSAGE,\n };\n }\n return {\n ...base,\n status: record.status === \"reconciling\" ? \"reconciling\" : \"pending\",\n };\n}\n\nfunction hydrateLpRedemptionsFromPosition(state: LpLifecycleState, position: LpPositionView): void {\n for (const history of position.actorSync?.redemptionHistory ?? []) {\n const existing = state.redemptions.get(history.redemptionId);\n if (existing === undefined) {\n state.redemptions.set(history.redemptionId, lpWithdrawalRecordFromHistory(position, history));\n continue;\n }\n state.redemptions.set(\n history.redemptionId,\n reconcileLpRedemptionFromHistory(existing, history),\n );\n }\n}\n\nfunction lpWithdrawalRecordFromHistory(\n position: LpPositionView,\n history: LpRedemptionHistoryView,\n): LpWithdrawalRecord {\n const record: LpWithdrawalRecord = {\n redemptionId: history.redemptionId,\n lpPositionId: position.id,\n requestedAt: history.createdAtMs,\n status: \"pending\",\n destinationAddresses: [...history.destinationAddresses],\n acceptedLamports: history.acceptedLamports,\n requestedTargetLamports: history.acceptedLamports,\n landedBaselineLamports: 0,\n landedFeeBaselineLamports: 0,\n redeemedLamports: history.landedLamports,\n txSignatures: [...history.txSignatures],\n txSignatureBaseline: [],\n coordinatorStateVersion: history.stateVersion,\n destinationCount: history.destinationCount,\n txSignatureCount: history.txSignatureCount,\n detailsTruncated: history.detailsTruncated,\n };\n return reconcileLpRedemptionFromHistory(record, history);\n}\n\nfunction sameStringList(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((value, index) => value === right[index]);\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return Array.from(new Set(values));\n}\n\nfunction isLpDkgActiveSessionError(error: unknown): boolean {\n return (\n error instanceof Error &&\n error.message.includes(\"LP DKG session already active for position index\")\n );\n}\n\nfunction isLpDkgIndexDriftError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return (\n (error.message.includes(\"LP DKG index\") &&\n error.message.includes(\"already exists for position\")) ||\n error.message.includes(\"LP DKG expected index\")\n );\n}\n\nfunction clonePosition(position: LpPositionView): LpPositionView {\n return {\n ...position,\n shards: position.shards.map((shard) => ({ ...shard })),\n actorSync:\n position.actorSync === undefined\n ? undefined\n : {\n ...position.actorSync,\n redemptionHistory: position.actorSync.redemptionHistory?.map((history) => ({\n ...history,\n destinationAddresses: [...history.destinationAddresses],\n txSignatures: [...history.txSignatures],\n })),\n },\n };\n}\n\nfunction generateId(prefix: string): string {\n return `${prefix}_${Array.from(randomBytes(8))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n return bytes;\n}\n\nfunction throwIfTopUpWaitAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return;\n throw new DOMException(\"LP top-up wait aborted\", \"AbortError\");\n}\n\nfunction defaultSleep(delayMs: number): Promise<void> {\n return new Promise((resolve) => {\n globalThis.setTimeout(resolve, delayMs);\n });\n}\n","/**\n * `@invisible-labs/sdk/lp` - liquidity-provider lifecycle (spec section 4.4).\n *\n * The high-level lifecycle functions own LP position auth, DKG completion,\n * initial funding selection, refill, withdrawal, and actor-sync confirmation.\n * Importing this module must not pull in `/user`, `/stats`, or `/events`.\n */\n\nimport type { Session } from \"../core/session.js\";\nimport { publicKey } from \"../core/brands.js\";\nimport { assertAttested } from \"../session/guards.js\";\nimport {\n defaultLpLifecycleClient,\n type CompleteDkgBatchOptions,\n type CreatePositionArgs,\n type CreatePositionResult,\n type InitialFundingPlan,\n type LpTopUpRequest,\n type RefillArgs,\n type WaitForTopUpOptions,\n type WaitForWithdrawalConfirmationOptions,\n type WithdrawalConfirmation,\n type WithdrawalExecution,\n type WithdrawPositionArgs,\n type WithdrawPositionResult,\n} from \"./lifecycle.js\";\n\nexport { createLpCoordinatorClient, LP_COMMAND_REQUEST_TIMEOUT_MS } from \"./coordinatorClient.js\";\nexport { createLpDkgBatch, type CreateLpDkgBatchInput, type LpDkgProgress } from \"./dkgBatch.js\";\nexport {\n createLpLifecycleClient,\n defaultLpLifecycleClient,\n isLpPositionAuthMissingError,\n isLpRedemptionReconcilingError,\n LP_MISSING_POSITION_CODE_MESSAGE,\n LP_REDEMPTION_RECONCILING_MESSAGE,\n type CompleteDkgBatchOptions,\n type CreatePositionArgs,\n type CreatePositionResult,\n type InitialFundingPlan,\n type LpLifecycleClient,\n type LpLifecycleDkgProgress,\n type LpLifecycleRuntime,\n type LpTopUpRequest,\n type LpWithdrawalRecord,\n type RefillArgs,\n type WaitForTopUpOptions,\n type WaitForWithdrawalConfirmationOptions,\n type WithdrawalConfirmation,\n type WithdrawalExecution,\n type WithdrawPositionArgs,\n type WithdrawPositionResult,\n} from \"./lifecycle.js\";\nexport {\n bytesToHex,\n deriveLpPositionCodeAuth,\n generateLpPositionCode,\n normalizeLpPositionCode,\n signLpCommandBytes,\n type LpPositionCode,\n type LpPositionCodeAuth,\n} from \"./positionCode.js\";\nexport type {\n FinalizeLpDkgBatchInput,\n FundingConfirmationInput,\n LpActorSyncView,\n LpCoordinatorClient,\n LpDkgClient,\n LpInventoryShard,\n LpRedemptionHistoryView,\n LpPositionView,\n LpWithdrawalExecutionView,\n OpenLpPositionInput,\n RefillLpPositionInput,\n SourceLiquidityUse,\n} from \"./types.js\";\n\nexport function createPosition(\n session: Session,\n args: CreatePositionArgs = {},\n): Promise<CreatePositionResult> {\n return defaultLpLifecycleClient(session).createPosition(args);\n}\n\nexport function recoverPosition(\n session: Session,\n args: { readonly code: string },\n): Promise<import(\"./types.js\").LpPositionView> {\n return defaultLpLifecycleClient(session).recoverPosition(args);\n}\n\nexport function confirmPositionCodeSaved(session: Session, positionId: string): void {\n defaultLpLifecycleClient(session).confirmPositionCodeSaved(positionId);\n}\n\nexport async function completeDkgBatch(\n session: Session,\n positionId: string,\n opts: CompleteDkgBatchOptions = {},\n): Promise<import(\"./types.js\").LpPositionView> {\n return await defaultLpLifecycleClient(session).completeDkgBatch(positionId, opts);\n}\n\nexport function refreshPosition(\n session: Session,\n positionId: string,\n): Promise<import(\"./types.js\").LpPositionView> {\n return defaultLpLifecycleClient(session).refreshPosition(positionId);\n}\n\nexport function refill(\n session: Session,\n positionId: string,\n args: RefillArgs = {},\n): Promise<import(\"./types.js\").LpPositionView> {\n return defaultLpLifecycleClient(session).refill(positionId, args);\n}\n\nexport function prepareInitialFunding(\n session: Session,\n positionId: string,\n): Promise<InitialFundingPlan | null> {\n return defaultLpLifecycleClient(session).prepareInitialFunding(positionId);\n}\n\nexport function prepareTopUp(session: Session, positionId: string): Promise<LpTopUpRequest> {\n return defaultLpLifecycleClient(session).prepareTopUp(positionId);\n}\n\nexport function waitForTopUp(\n session: Session,\n topUpId: string,\n options: WaitForTopUpOptions = {},\n): Promise<LpTopUpRequest> {\n return defaultLpLifecycleClient(session).waitForTopUp(topUpId, options);\n}\n\nexport function reconcileFunding(\n session: Session,\n positionId: string,\n): Promise<import(\"./types.js\").LpPositionView> {\n return defaultLpLifecycleClient(session).reconcileFunding(positionId);\n}\n\nexport function withdrawPosition(\n session: Session,\n positionId: string,\n args: WithdrawPositionArgs,\n): Promise<WithdrawPositionResult> {\n return defaultLpLifecycleClient(session).withdrawPosition(positionId, args);\n}\n\nexport function waitForWithdrawalConfirmation(\n session: Session,\n positionId: string,\n execution: WithdrawalExecution,\n options: WaitForWithdrawalConfirmationOptions = {},\n): Promise<WithdrawalConfirmation> {\n return defaultLpLifecycleClient(session).waitForWithdrawalConfirmation(\n positionId,\n execution,\n options,\n );\n}\n\n/**\n * LP fee withdrawal is coordinator-pending. The SDK validates the local input\n * and returns a typed `VERSION_NOT_SUPPORTED` routing error until advertised.\n */\nexport async function withdrawFees(\n session: Session,\n positionId: string,\n args: { readonly destination: string },\n): Promise<never> {\n publicKey(args.destination);\n assertAttested(session);\n return await defaultLpLifecycleClient(session).withdrawFees(positionId, args);\n}\n\nexport function listPositions(session: Session): Promise<import(\"./types.js\").LpPositionView[]> {\n return defaultLpLifecycleClient(session).listPositions();\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { C as CoordinatorEndpoint } from './types.generated-CHGSbmLp.js';
2
+
3
+ /**
4
+ * `@invisible-labs/sdk/presets` - optional Invisible coordinator endpoint presets.
5
+ *
6
+ * This is the ONLY module permitted to name an `invisible.exchange` host (spec
7
+ * section 6.2). Partners who self-host ignore it entirely and pass their own
8
+ * `CoordinatorEndpoint[]` to `createSession`. The core never imports this module.
9
+ *
10
+ * Production presets embed an approved Azure TDX boot measurement and trust
11
+ * roots. The caller must provide the separately approved coordinator binary
12
+ * hash before a production endpoint can be constructed. Dormant or
13
+ * development targets keep placeholders until approval.
14
+ */
15
+
16
+ /**
17
+ * Production GCP TDX coordinator endpoint.
18
+ *
19
+ * Currently dormant: GCP is neither the live production nor development TEE
20
+ * path. Kept only for a future explicit GCP relight, or a partner self-hosting
21
+ * on GCP.
22
+ */
23
+ declare function invisibleProdGcp(): CoordinatorEndpoint[];
24
+ /** Production Azure TDX coordinator endpoint. The live prod TEE today. */
25
+ declare function invisibleProdAzure(approvedBinaryHash: string): CoordinatorEndpoint[];
26
+ /**
27
+ * The currently-active Invisible production preset. Integrators that just want
28
+ * "Invisible prod" use this and stay on whichever cloud is live.
29
+ *
30
+ * Switching the prod target between Azure and GCP is this one line:
31
+ * `export const invisibleProd = invisibleProdAzure` -> `invisibleProdGcp`.
32
+ */
33
+ declare const invisibleProd: typeof invisibleProdAzure;
34
+ /** Public Invisible devnet, served by the hardened Azure prod coordinator. */
35
+ declare const invisibleDevnet: typeof invisibleProdAzure;
36
+ /** Dormant GCP development coordinator endpoint. Not the active dev target today. */
37
+ declare function invisibleDevGcp(): CoordinatorEndpoint[];
38
+ /** Azure development coordinator endpoint. The active dev TEE today. */
39
+ declare function invisibleDevAzure(): CoordinatorEndpoint[];
40
+ /** The currently-active Invisible development preset. */
41
+ declare const invisibleDev: typeof invisibleDevAzure;
42
+
43
+ export { invisibleDev, invisibleDevAzure, invisibleDevGcp, invisibleDevnet, invisibleProd, invisibleProdAzure, invisibleProdGcp };
@@ -0,0 +1,70 @@
1
+ import { INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from './chunk-NCY4FCYU.js';
2
+ import './chunk-OHIM2YWU.js';
3
+ import './chunk-VR6T6OJS.js';
4
+
5
+ // src/presets/index.ts
6
+ var PLACEHOLDER_PIN = {
7
+ mrtd: "",
8
+ intelRootFingerprint: ""
9
+ };
10
+ var BINARY_HASH_HEX = /^[0-9a-f]{64}$/i;
11
+ var AZURE_PROD_RELEASE_PIN = {
12
+ mrtd: "ff450b138c5ee6734a43dc35afb437abfa24ef743bc9e9484ef4af365fcd89a6c50913248ed7fcb92a7d42b1ba7da984",
13
+ intelRootFingerprint: INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256,
14
+ azureMaa: {
15
+ issuer: "https://sharedweu.weu.attest.azure.net",
16
+ jwksUrl: "https://sharedweu.weu.attest.azure.net/certs",
17
+ policyHash: "9NY0VnTQ-IiBriBplVUpFbczcDaEBUwsiFYAzHu_gco"
18
+ }
19
+ };
20
+ function invisibleProdGcp() {
21
+ return [
22
+ {
23
+ wsUrl: "wss://tee.invisible.exchange/ws-noise",
24
+ expectedHostname: "tee.invisible.exchange",
25
+ releasePin: { ...PLACEHOLDER_PIN },
26
+ requiredMode: "prod"
27
+ }
28
+ ];
29
+ }
30
+ function invisibleProdAzure(approvedBinaryHash) {
31
+ const binaryHash = typeof approvedBinaryHash === "string" ? approvedBinaryHash.toLowerCase() : "";
32
+ if (!BINARY_HASH_HEX.test(binaryHash)) {
33
+ throw new Error("invisibleProdAzure requires an approved 64-character binary SHA-256 hash");
34
+ }
35
+ return [
36
+ {
37
+ wsUrl: "wss://tee-azure.invisible.exchange/ws-noise",
38
+ expectedHostname: "tee-azure.invisible.exchange",
39
+ releasePin: { ...AZURE_PROD_RELEASE_PIN, binaryHash },
40
+ requiredMode: "prod"
41
+ }
42
+ ];
43
+ }
44
+ var invisibleProd = invisibleProdAzure;
45
+ var invisibleDevnet = invisibleProdAzure;
46
+ function invisibleDevGcp() {
47
+ return [
48
+ {
49
+ wsUrl: "wss://tee-dev.invisible.exchange/ws-noise",
50
+ expectedHostname: "tee-dev.invisible.exchange",
51
+ releasePin: { ...PLACEHOLDER_PIN },
52
+ requiredMode: "dev"
53
+ }
54
+ ];
55
+ }
56
+ function invisibleDevAzure() {
57
+ return [
58
+ {
59
+ wsUrl: "wss://tee-azure-dev.invisible.exchange/ws-noise",
60
+ expectedHostname: "tee-azure-dev.invisible.exchange",
61
+ releasePin: { ...PLACEHOLDER_PIN },
62
+ requiredMode: "dev"
63
+ }
64
+ ];
65
+ }
66
+ var invisibleDev = invisibleDevAzure;
67
+
68
+ export { invisibleDev, invisibleDevAzure, invisibleDevGcp, invisibleDevnet, invisibleProd, invisibleProdAzure, invisibleProdGcp };
69
+ //# sourceMappingURL=presets.js.map
70
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presets/index.ts"],"names":[],"mappings":";;;;;AAgBA,IAAM,eAAA,GAAkB;AAAA,EACtB,IAAA,EAAM,EAAA;AAAA,EACN,oBAAA,EAAsB;AACxB,CAAA;AAEA,IAAM,eAAA,GAAkB,iBAAA;AAExB,IAAM,sBAAA,GAAyB;AAAA,EAC7B,IAAA,EAAM,kGAAA;AAAA,EACN,oBAAA,EAAsB,oCAAA;AAAA,EACtB,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ,wCAAA;AAAA,IACR,OAAA,EAAS,8CAAA;AAAA,IACT,UAAA,EAAY;AAAA;AAEhB,CAAA;AASO,SAAS,gBAAA,GAA0C;AACxD,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,uCAAA;AAAA,MACP,gBAAA,EAAkB,wBAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,eAAA,EAAgB;AAAA,MACjC,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AAGO,SAAS,mBAAmB,kBAAA,EAAmD;AACpF,EAAA,MAAM,aAAa,OAAO,kBAAA,KAAuB,QAAA,GAAW,kBAAA,CAAmB,aAAY,GAAI,EAAA;AAC/F,EAAA,IAAI,CAAC,eAAA,CAAgB,IAAA,CAAK,UAAU,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,MAAM,0EAA0E,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,6CAAA;AAAA,MACP,gBAAA,EAAkB,8BAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,sBAAA,EAAwB,UAAA,EAAW;AAAA,MACpD,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AASO,IAAM,aAAA,GAAgB;AAGtB,IAAM,eAAA,GAAkB;AAGxB,SAAS,eAAA,GAAyC;AACvD,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,2CAAA;AAAA,MACP,gBAAA,EAAkB,4BAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,eAAA,EAAgB;AAAA,MACjC,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AAGO,SAAS,iBAAA,GAA2C;AACzD,EAAA,OAAO;AAAA,IACL;AAAA,MACE,KAAA,EAAO,iDAAA;AAAA,MACP,gBAAA,EAAkB,kCAAA;AAAA,MAClB,UAAA,EAAY,EAAE,GAAG,eAAA,EAAgB;AAAA,MACjC,YAAA,EAAc;AAAA;AAChB,GACF;AACF;AAGO,IAAM,YAAA,GAAe","file":"presets.js","sourcesContent":["/**\n * `@invisible-labs/sdk/presets` - optional Invisible coordinator endpoint presets.\n *\n * This is the ONLY module permitted to name an `invisible.exchange` host (spec\n * section 6.2). Partners who self-host ignore it entirely and pass their own\n * `CoordinatorEndpoint[]` to `createSession`. The core never imports this module.\n *\n * Production presets embed an approved Azure TDX boot measurement and trust\n * roots. The caller must provide the separately approved coordinator binary\n * hash before a production endpoint can be constructed. Dormant or\n * development targets keep placeholders until approval.\n */\n\nimport { INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from \"../attestation/verifier.js\";\nimport type { CoordinatorEndpoint } from \"../schemas/types.generated.js\";\n\nconst PLACEHOLDER_PIN = {\n mrtd: \"\",\n intelRootFingerprint: \"\",\n} as const;\n\nconst BINARY_HASH_HEX = /^[0-9a-f]{64}$/i;\n\nconst AZURE_PROD_RELEASE_PIN = {\n mrtd: \"ff450b138c5ee6734a43dc35afb437abfa24ef743bc9e9484ef4af365fcd89a6c50913248ed7fcb92a7d42b1ba7da984\",\n intelRootFingerprint: INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256,\n azureMaa: {\n issuer: \"https://sharedweu.weu.attest.azure.net\",\n jwksUrl: \"https://sharedweu.weu.attest.azure.net/certs\",\n policyHash: \"9NY0VnTQ-IiBriBplVUpFbczcDaEBUwsiFYAzHu_gco\",\n },\n} as const;\n\n/**\n * Production GCP TDX coordinator endpoint.\n *\n * Currently dormant: GCP is neither the live production nor development TEE\n * path. Kept only for a future explicit GCP relight, or a partner self-hosting\n * on GCP.\n */\nexport function invisibleProdGcp(): CoordinatorEndpoint[] {\n return [\n {\n wsUrl: \"wss://tee.invisible.exchange/ws-noise\",\n expectedHostname: \"tee.invisible.exchange\",\n releasePin: { ...PLACEHOLDER_PIN },\n requiredMode: \"prod\",\n },\n ];\n}\n\n/** Production Azure TDX coordinator endpoint. The live prod TEE today. */\nexport function invisibleProdAzure(approvedBinaryHash: string): CoordinatorEndpoint[] {\n const binaryHash = typeof approvedBinaryHash === \"string\" ? approvedBinaryHash.toLowerCase() : \"\";\n if (!BINARY_HASH_HEX.test(binaryHash)) {\n throw new Error(\"invisibleProdAzure requires an approved 64-character binary SHA-256 hash\");\n }\n return [\n {\n wsUrl: \"wss://tee-azure.invisible.exchange/ws-noise\",\n expectedHostname: \"tee-azure.invisible.exchange\",\n releasePin: { ...AZURE_PROD_RELEASE_PIN, binaryHash },\n requiredMode: \"prod\",\n },\n ];\n}\n\n/**\n * The currently-active Invisible production preset. Integrators that just want\n * \"Invisible prod\" use this and stay on whichever cloud is live.\n *\n * Switching the prod target between Azure and GCP is this one line:\n * `export const invisibleProd = invisibleProdAzure` -> `invisibleProdGcp`.\n */\nexport const invisibleProd = invisibleProdAzure;\n\n/** Public Invisible devnet, served by the hardened Azure prod coordinator. */\nexport const invisibleDevnet = invisibleProdAzure;\n\n/** Dormant GCP development coordinator endpoint. Not the active dev target today. */\nexport function invisibleDevGcp(): CoordinatorEndpoint[] {\n return [\n {\n wsUrl: \"wss://tee-dev.invisible.exchange/ws-noise\",\n expectedHostname: \"tee-dev.invisible.exchange\",\n releasePin: { ...PLACEHOLDER_PIN },\n requiredMode: \"dev\",\n },\n ];\n}\n\n/** Azure development coordinator endpoint. The active dev TEE today. */\nexport function invisibleDevAzure(): CoordinatorEndpoint[] {\n return [\n {\n wsUrl: \"wss://tee-azure-dev.invisible.exchange/ws-noise\",\n expectedHostname: \"tee-azure-dev.invisible.exchange\",\n releasePin: { ...PLACEHOLDER_PIN },\n requiredMode: \"dev\",\n },\n ];\n}\n\n/** The currently-active Invisible development preset. */\nexport const invisibleDev = invisibleDevAzure;\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The opaque session handle.
3
+ *
4
+ * A `Session` is the single stateful object the functional surface threads
5
+ * through every call: `fn(session, args)`. It owns the transport, the
6
+ * attestation state, and (later) the leader-epoch bookkeeping. Consumers treat
7
+ * it as opaque - they read `session.attested` and pass it back to SDK
8
+ * functions, but never reach inside. The internal state map and constructor
9
+ * live alongside `createSession` (added in a later ticket); this module only
10
+ * fixes the public shape so the rest of the surface can type against it.
11
+ */
12
+ declare const sessionBrand: unique symbol;
13
+ /**
14
+ * Opaque, attested session handle. Obtain one from `createSession`; pass it as
15
+ * the first argument to every actor command. The only field consumers read is
16
+ * {@link Session.attested}.
17
+ */
18
+ interface Session {
19
+ /**
20
+ * Whether the current Noise session has passed full TDX attestation. Sensitive
21
+ * commands refuse to run until this is `true`. Re-handshake or failover resets
22
+ * it to `false` until a fresh attestation completes.
23
+ */
24
+ readonly attested: boolean;
25
+ /** @internal Opacity brand; not constructable by consumers. */
26
+ readonly [sessionBrand]: true;
27
+ }
28
+ /** Convenience predicate mirroring {@link Session.attested}. */
29
+ declare function isAttested(session: Session): boolean;
30
+
31
+ export { type Session as S, isAttested as i };
@@ -0,0 +1,47 @@
1
+ import { S as Session } from './session-DFuy54C-.js';
2
+
3
+ /**
4
+ * `@invisible-labs/sdk/stats` - actor-safe read projections (spec section 4.5).
5
+ *
6
+ * Read-only display views. `derivedRefundableLamports` is a pure local
7
+ * computation (the coordinator never returns a refundable amount) and is
8
+ * implemented for real; the coordinator-backed projections are deferred.
9
+ */
10
+
11
+ /** The display-shaped LP position projection. */
12
+ type LpPositionStats = Record<string, unknown>;
13
+ /** The normal-user transfer display view. */
14
+ type TransferStats = Record<string, unknown>;
15
+ /**
16
+ * The inputs `derivedRefundableLamports` needs. Mirrors the fields the
17
+ * coordinator exposes on a transfer view (it deliberately does not return a
18
+ * refundable amount; the client computes it).
19
+ */
20
+ interface RefundableInput {
21
+ /** Lamports received into the contract so far. */
22
+ readonly receivedLamports: number;
23
+ /** Finalized network-fee losses recorded for the contract. */
24
+ readonly networkFeeLossLamports: number;
25
+ /** Whether the contract is still in a refundable state. */
26
+ readonly refundable: boolean;
27
+ }
28
+ /**
29
+ * The LP position display projection.
30
+ *
31
+ * @throws NotImplementedError - read execution is deferred.
32
+ */
33
+ declare function position(_session: Session, _positionId: string): Promise<LpPositionStats>;
34
+ /**
35
+ * The normal-user transfer display view.
36
+ *
37
+ * @throws NotImplementedError - read execution is deferred.
38
+ */
39
+ declare function transfer(_session: Session, _requestId: string, _syncSecret: Uint8Array): Promise<TransferStats>;
40
+ /**
41
+ * Pure-client refundable-amount computation (spec section 4.5): received minus
42
+ * finalized fee losses, floored at zero, and only while still refundable. The
43
+ * coordinator never returns this value; it is always derived here.
44
+ */
45
+ declare function derivedRefundableLamports(view: RefundableInput): number;
46
+
47
+ export { type LpPositionStats, type RefundableInput, type TransferStats, derivedRefundableLamports, position, transfer };
package/dist/stats.js ADDED
@@ -0,0 +1,21 @@
1
+ import { NotImplementedError } from './chunk-OHIM2YWU.js';
2
+ import './chunk-VR6T6OJS.js';
3
+
4
+ // src/stats/index.ts
5
+ function position(_session, _positionId) {
6
+ return Promise.reject(new NotImplementedError("stats.position"));
7
+ }
8
+ function transfer(_session, _requestId, _syncSecret) {
9
+ return Promise.reject(new NotImplementedError("stats.transfer"));
10
+ }
11
+ function derivedRefundableLamports(view) {
12
+ if (!view.refundable) return 0;
13
+ if (!Number.isFinite(view.receivedLamports) || !Number.isFinite(view.networkFeeLossLamports)) {
14
+ return 0;
15
+ }
16
+ return Math.max(0, view.receivedLamports - view.networkFeeLossLamports);
17
+ }
18
+
19
+ export { derivedRefundableLamports, position, transfer };
20
+ //# sourceMappingURL=stats.js.map
21
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stats/index.ts"],"names":[],"mappings":";;;;AAoCO,SAAS,QAAA,CAAS,UAAmB,WAAA,EAA+C;AACzF,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,mBAAA,CAAoB,gBAAgB,CAAC,CAAA;AACjE;AAOO,SAAS,QAAA,CACd,QAAA,EACA,UAAA,EACA,WAAA,EACwB;AACxB,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,mBAAA,CAAoB,gBAAgB,CAAC,CAAA;AACjE;AAOO,SAAS,0BAA0B,IAAA,EAA+B;AACvE,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,OAAO,CAAA;AAG7B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,gBAAgB,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,sBAAsB,CAAA,EAAG;AAC5F,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,gBAAA,GAAmB,KAAK,sBAAsB,CAAA;AACxE","file":"stats.js","sourcesContent":["/**\n * `@invisible-labs/sdk/stats` - actor-safe read projections (spec section 4.5).\n *\n * Read-only display views. `derivedRefundableLamports` is a pure local\n * computation (the coordinator never returns a refundable amount) and is\n * implemented for real; the coordinator-backed projections are deferred.\n */\n\nimport { NotImplementedError } from \"../core/errors.js\";\nimport type { Session } from \"../core/session.js\";\n\n/** The display-shaped LP position projection. */\nexport type LpPositionStats = Record<string, unknown>;\n\n/** The normal-user transfer display view. */\nexport type TransferStats = Record<string, unknown>;\n\n/**\n * The inputs `derivedRefundableLamports` needs. Mirrors the fields the\n * coordinator exposes on a transfer view (it deliberately does not return a\n * refundable amount; the client computes it).\n */\nexport interface RefundableInput {\n /** Lamports received into the contract so far. */\n readonly receivedLamports: number;\n /** Finalized network-fee losses recorded for the contract. */\n readonly networkFeeLossLamports: number;\n /** Whether the contract is still in a refundable state. */\n readonly refundable: boolean;\n}\n\n/**\n * The LP position display projection.\n *\n * @throws NotImplementedError - read execution is deferred.\n */\nexport function position(_session: Session, _positionId: string): Promise<LpPositionStats> {\n return Promise.reject(new NotImplementedError(\"stats.position\"));\n}\n\n/**\n * The normal-user transfer display view.\n *\n * @throws NotImplementedError - read execution is deferred.\n */\nexport function transfer(\n _session: Session,\n _requestId: string,\n _syncSecret: Uint8Array,\n): Promise<TransferStats> {\n return Promise.reject(new NotImplementedError(\"stats.transfer\"));\n}\n\n/**\n * Pure-client refundable-amount computation (spec section 4.5): received minus\n * finalized fee losses, floored at zero, and only while still refundable. The\n * coordinator never returns this value; it is always derived here.\n */\nexport function derivedRefundableLamports(view: RefundableInput): number {\n if (!view.refundable) return 0;\n // Guard against a malformed coordinator view leaking a non-finite value that\n // would otherwise surface as NaN in the UI.\n if (!Number.isFinite(view.receivedLamports) || !Number.isFinite(view.networkFeeLossLamports)) {\n return 0;\n }\n return Math.max(0, view.receivedLamports - view.networkFeeLossLamports);\n}\n"]}