@invisible-labs/sdk 0.8.0-devnet → 0.9.0-devnet

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 (46) hide show
  1. package/README.md +7 -0
  2. package/dist/.invisible-sdk-build-target.json +1 -1
  3. package/dist/{chunk-HJFMDMPY.js → chunk-6AKBRYKO.js} +3 -3
  4. package/dist/{chunk-HJFMDMPY.js.map → chunk-6AKBRYKO.js.map} +1 -1
  5. package/dist/{chunk-DCTYBUY3.js → chunk-AIKC2XQS.js} +3 -3
  6. package/dist/{chunk-DCTYBUY3.js.map → chunk-AIKC2XQS.js.map} +1 -1
  7. package/dist/{chunk-Y7AK6RBV.js → chunk-EOPZVOVP.js} +11 -6
  8. package/dist/chunk-EOPZVOVP.js.map +1 -0
  9. package/dist/{chunk-EBWTAXNT.js → chunk-EPWTRF5U.js} +3 -3
  10. package/dist/{chunk-EBWTAXNT.js.map → chunk-EPWTRF5U.js.map} +1 -1
  11. package/dist/{chunk-IG6JJFR2.js → chunk-HWRMSK7E.js} +8 -6
  12. package/dist/chunk-HWRMSK7E.js.map +1 -0
  13. package/dist/{chunk-MZKJU3UA.js → chunk-ISIWWGSR.js} +16 -6
  14. package/dist/chunk-ISIWWGSR.js.map +1 -0
  15. package/dist/{chunk-K67FTCQU.js → chunk-JNNVPZEU.js} +3 -3
  16. package/dist/chunk-JNNVPZEU.js.map +1 -0
  17. package/dist/{chunk-MPNVF727.js → chunk-QF5TSUQE.js} +178 -41
  18. package/dist/chunk-QF5TSUQE.js.map +1 -0
  19. package/dist/{chunk-QRN46R3F.js → chunk-RWKG7N7I.js} +10 -3
  20. package/dist/chunk-RWKG7N7I.js.map +1 -0
  21. package/dist/coordinator-DHL3AP7V.js +4 -0
  22. package/dist/{coordinator-E2TS6NR2.js.map → coordinator-DHL3AP7V.js.map} +1 -1
  23. package/dist/dkgWorker.js +1 -1
  24. package/dist/events.js +3 -3
  25. package/dist/frostRuntime-JESDHN6O.js +4 -0
  26. package/dist/{frostRuntime-6FTPKUCP.js.map → frostRuntime-JESDHN6O.js.map} +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +8 -8
  29. package/dist/lp.d.ts +10 -1
  30. package/dist/lp.js +178 -65
  31. package/dist/lp.js.map +1 -1
  32. package/dist/stats.js +1 -1
  33. package/dist/storage.js +2 -2
  34. package/dist/{types.generated-YhFu9ZBR.d.ts → types.generated-DrM2M4DZ.d.ts} +6 -2
  35. package/dist/user.d.ts +18 -9
  36. package/dist/user.js +86 -30
  37. package/dist/user.js.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/chunk-IG6JJFR2.js.map +0 -1
  40. package/dist/chunk-K67FTCQU.js.map +0 -1
  41. package/dist/chunk-MPNVF727.js.map +0 -1
  42. package/dist/chunk-MZKJU3UA.js.map +0 -1
  43. package/dist/chunk-QRN46R3F.js.map +0 -1
  44. package/dist/chunk-Y7AK6RBV.js.map +0 -1
  45. package/dist/coordinator-E2TS6NR2.js +0 -4
  46. package/dist/frostRuntime-6FTPKUCP.js +0 -4
@@ -1,4 +1,6 @@
1
1
  // src/core/errors.ts
2
+ var COORDINATOR_CAPACITY_FULL_ERROR_CODE = "ERR_ADMISSION_CAPACITY_FULL";
3
+ var COORDINATOR_CAPACITY_FULL_USER_MESSAGE = "The transfer service is temporarily at capacity. This transfer was not started. Please try again later.";
2
4
  var InvisibleError = class extends Error {
3
5
  constructor(message, options) {
4
6
  super(message);
@@ -32,6 +34,8 @@ var CommandError = class extends InvisibleError {
32
34
  super(message, options);
33
35
  this.code = code;
34
36
  if (options?.coordinatorCode !== void 0) this.coordinatorCode = options.coordinatorCode;
37
+ if (options?.coordinatorMessage !== void 0)
38
+ this.coordinatorMessage = options.coordinatorMessage;
35
39
  if (options?.failedReqId !== void 0) this.failedReqId = options.failedReqId;
36
40
  }
37
41
  };
@@ -91,6 +95,9 @@ function normalizeError(error, fallback = DEFAULT_ERROR_MESSAGE) {
91
95
  return DEFAULT_ERROR_MESSAGE;
92
96
  }
93
97
  function extractMessage(error) {
98
+ if (error instanceof CommandError && error.coordinatorCode === COORDINATOR_CAPACITY_FULL_ERROR_CODE) {
99
+ return error.message;
100
+ }
94
101
  if (error instanceof CommandError && error.coordinatorCode !== void 0) {
95
102
  return formatCode(error.coordinatorCode, error.message);
96
103
  }
@@ -124,6 +131,6 @@ function isReadable(value) {
124
131
  return !/^\[object (?:Object|Event|ErrorEvent|PromiseRejectionEvent)\]$/.test(trimmed);
125
132
  }
126
133
 
127
- export { AttestationError, CommandError, InvalidDepositAmountError, InvisibleError, LpLifecycleError, NotImplementedError, PolicyValidationError, RoutingError, StorageError, TransportError, WalletError, isInvisibleError, normalizeError };
128
- //# sourceMappingURL=chunk-QRN46R3F.js.map
129
- //# sourceMappingURL=chunk-QRN46R3F.js.map
134
+ export { AttestationError, COORDINATOR_CAPACITY_FULL_ERROR_CODE, COORDINATOR_CAPACITY_FULL_USER_MESSAGE, CommandError, InvalidDepositAmountError, InvisibleError, LpLifecycleError, NotImplementedError, PolicyValidationError, RoutingError, StorageError, TransportError, WalletError, isInvisibleError, normalizeError };
135
+ //# sourceMappingURL=chunk-RWKG7N7I.js.map
136
+ //# sourceMappingURL=chunk-RWKG7N7I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts"],"names":[],"mappings":"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","file":"chunk-RWKG7N7I.js","sourcesContent":["/**\n * The closed error taxonomy from docs/sdk-specification.md section 8.3.\n *\n * Every error the SDK throws extends {@link InvisibleError} and carries a\n * `code` drawn from a closed, per-class string-literal union. Consumers can\n * branch on `error instanceof CommandError` and then exhaustively `switch` on\n * `error.code` with compile-time completeness.\n *\n * Error classes are the one deliberate exception to the SDK's \"no classes\"\n * rule: JavaScript errors must extend `Error` to carry a stack and support\n * `instanceof`. This mirrors @solana/kit, whose only class is `SolanaError`.\n * The conformance lint allowlists this file for that reason.\n */\n\n// ---------------------------------------------------------------------------\n// Code unions (closed sets, section 8.3)\n// ---------------------------------------------------------------------------\n\n/** Attestation verification failures. Stop; do not retry without a new pin. */\nexport type AttestationErrorCode =\n | \"CERT_CHAIN_INVALID\"\n | \"TCB_REJECTED\"\n | \"FRESHNESS_NONCE_MISMATCH\"\n | \"NOISE_BINDING_MISMATCH\"\n | \"DEBUG_BIT_SET\"\n | \"MRTD_MISMATCH\"\n | \"RUNTIME_MEASUREMENTS_MISMATCH\"\n | \"RUNTIME_PROFILE_MISMATCH\"\n | \"AZURE_MAA_ISSUER_MISMATCH\"\n | \"AZURE_MAA_JWKS_INVALID\"\n | \"AZURE_MAA_POLICY_HASH_MISMATCH\"\n | \"AZURE_MAA_NOT_COMPLIANT\"\n | \"AZURE_MAA_DCAP_MISMATCH\"\n | \"AZURE_HCL_KEYS_MISMATCH\"\n | \"AZURE_AK_PUB_INVALID\"\n | \"AZURE_TPM_AK_QUOTE_INVALID\"\n | \"AZURE_TPM_QUALIFYING_DATA_MISMATCH\"\n | \"NOT_ATTESTED\";\n\n/** Transport-level failures. Reconnect through the pool and re-attest. */\nexport type TransportErrorCode =\n | \"WS_HANDSHAKE_FAILED\"\n | \"NOISE_HANDSHAKE_FAILED\"\n | \"NOISE_FRAME_TOO_LARGE\"\n | \"CONNECTION_LOST\";\n\n/** Leader/role routing failures. Failover and re-attest. */\nexport type RoutingErrorCode =\n | \"WRONG_ROLE\"\n | \"STALE_LEADER_EPOCH\"\n | \"POOL_DEGRADED\"\n | \"VERSION_NOT_SUPPORTED\";\n\n/** Coordinator-side command rejections. Product decides whether to retry. */\nexport type CommandErrorCode =\n | \"REJECTED_GUARD\"\n | \"REJECTED_STATE\"\n | \"REJECTED_EXPIRED\"\n | \"REJECTED_STALE_JOB\"\n | \"REJECTED_RESOURCE_CAP\"\n | \"RETRYABLE_BUSY\";\n\nexport const COORDINATOR_CAPACITY_FULL_ERROR_CODE = \"ERR_ADMISSION_CAPACITY_FULL\" as const;\nexport const COORDINATOR_CAPACITY_FULL_USER_MESSAGE =\n \"The transfer service is temporarily at capacity. This transfer was not started. Please try again later.\";\n\n/** Coordinator wire error code preserved on command rejections. */\nexport type CoordinatorWireErrorCode =\n | \"ERR_INVALID_PAYLOAD\"\n | \"ERR_UNEXPECTED_TYPE\"\n | \"ERR_UNKNOWN_SWAP\"\n | \"ERR_POLICY_VIOLATION\"\n | \"ERR_INVALID_RECOVERY_CODE\"\n | \"ERR_SWAP_NOT_REFUNDABLE\"\n | \"ERR_DKG_FAILURE\"\n | \"ERR_INTERNAL\"\n | \"ERR_PRESEAL_ADMISSION_BUSY\"\n | \"ERR_INITIALIZATION_BUSY\"\n | typeof COORDINATOR_CAPACITY_FULL_ERROR_CODE\n | \"ERR_INVALID_DEPOSIT\"\n | \"ERR_SETTLEMENT_FAILED\";\n\n/** Local input-validation failures. Never sent on the wire; fix the input. */\nexport type PolicyValidationErrorCode =\n | \"INVALID_PAYOUT_PLAN\"\n | \"INVALID_WITHDRAWAL_PLAN\"\n | \"INVALID_POSITION_AUTH\"\n | \"INVALID_REDEMPTION_PLAN\"\n | \"INVALID_DESTINATION_ADDRESS\"\n | \"INVALID_AMOUNT\";\n\n/** Storage-adapter failures. */\nexport type StorageErrorCode =\n | \"STORAGE_NOT_AVAILABLE\"\n | \"STORAGE_INVALID_ADAPTER\"\n | \"STORAGE_QUOTA_EXCEEDED\"\n | \"STORAGE_KEY_MISSING\"\n | \"STORAGE_DECRYPT_FAILED\";\n\n/** Wallet-adapter failures. Bubble to the integrator UX. */\nexport type WalletErrorCode =\n | \"WALLET_NOT_CONNECTED\"\n | \"WALLET_USER_REJECTED\"\n | \"WALLET_INVALID_SIGNATURE\";\n\n/** LP lifecycle local state that callers can branch on. */\nexport type LpLifecycleErrorCode = \"LP_POSITION_AUTH_MISSING\" | \"LP_REDEMPTION_RECONCILING\";\n\n/** Skeleton-only: a surface that exists but has no implementation yet. */\nexport type NotImplementedErrorCode = \"NOT_IMPLEMENTED\";\n\n/** Every code the SDK can surface, across all classes. */\nexport type InvisibleErrorCode =\n | AttestationErrorCode\n | TransportErrorCode\n | RoutingErrorCode\n | CommandErrorCode\n | PolicyValidationErrorCode\n | StorageErrorCode\n | WalletErrorCode\n | LpLifecycleErrorCode\n | NotImplementedErrorCode;\n\n// ---------------------------------------------------------------------------\n// Error classes\n// ---------------------------------------------------------------------------\n\n/** Options accepted by every {@link InvisibleError}. */\nexport interface InvisibleErrorOptions {\n /** The underlying error, preserved for debugging. */\n readonly cause?: unknown;\n}\n\n/** Context attached to a client-persistence storage failure. */\nexport type StorageErrorPhase =\n | \"session-init\"\n | \"write\"\n | \"allocation\"\n | \"recovery-code\"\n | \"ready\"\n | \"sync\"\n | \"refund\"\n | \"read\"\n | \"remove\"\n | \"purge\";\n\n/** Options accepted by {@link StorageError}. */\nexport interface StorageErrorOptions extends InvisibleErrorOptions {\n /** The affected normal-user swap, when known. */\n readonly swapId?: string;\n /** The client-persistence lifecycle phase that failed. */\n readonly phase?: StorageErrorPhase;\n /** True when the coordinator accepted the command before local failure. */\n readonly remoteAccepted?: boolean;\n}\n\n/** Options accepted by {@link CommandError}. */\nexport interface CommandErrorOptions extends InvisibleErrorOptions {\n /** Exact coordinator `Error` envelope code, when the rejection came from the wire. */\n readonly coordinatorCode?: CoordinatorWireErrorCode;\n /** Exact coordinator `Error` envelope message, when `message` is user-facing copy. */\n readonly coordinatorMessage?: string;\n /** Request id rejected by the coordinator, when present in the `Error` envelope. */\n readonly failedReqId?: number;\n}\n\n/**\n * Base class for every error the SDK throws. Carries a closed `code` and sets\n * `name` to the concrete subclass name so logs and `instanceof` agree.\n */\nexport abstract class InvisibleError extends Error {\n /** The closed error code for this error's class. */\n abstract readonly code: InvisibleErrorCode;\n\n constructor(message: string, options?: InvisibleErrorOptions) {\n super(message);\n // Set `cause` directly rather than through the Error constructor option so\n // the package stays on the ES2020 lib (the option is ES2022).\n if (options?.cause !== undefined) {\n (this as { cause?: unknown }).cause = options.cause;\n }\n this.name = new.target.name;\n // Restore the prototype chain across the transpiled `Error` boundary so\n // `instanceof` works for subclasses.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Attestation verification failure. */\nexport class AttestationError extends InvisibleError {\n readonly code: AttestationErrorCode;\n constructor(code: AttestationErrorCode, message: string, options?: InvisibleErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Transport-level failure. */\nexport class TransportError extends InvisibleError {\n readonly code: TransportErrorCode;\n constructor(code: TransportErrorCode, message: string, options?: InvisibleErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Leader/role routing failure. */\nexport class RoutingError extends InvisibleError {\n readonly code: RoutingErrorCode;\n constructor(code: RoutingErrorCode, message: string, options?: InvisibleErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Coordinator-side command rejection. */\nexport class CommandError extends InvisibleError {\n readonly code: CommandErrorCode;\n readonly coordinatorCode?: CoordinatorWireErrorCode;\n readonly coordinatorMessage?: string;\n readonly failedReqId?: number;\n\n constructor(code: CommandErrorCode, message: string, options?: CommandErrorOptions) {\n super(message, options);\n this.code = code;\n if (options?.coordinatorCode !== undefined) this.coordinatorCode = options.coordinatorCode;\n if (options?.coordinatorMessage !== undefined)\n this.coordinatorMessage = options.coordinatorMessage;\n if (options?.failedReqId !== undefined) this.failedReqId = options.failedReqId;\n }\n}\n\n/** User deposit did not match the coordinator policy amount. */\nexport class InvalidDepositAmountError extends CommandError {\n readonly receivedLamports: bigint;\n readonly expectedLamports: bigint;\n\n constructor(receivedLamports: bigint, expectedLamports: bigint) {\n super(\n \"REJECTED_GUARD\",\n `on-chain deposit balance ${receivedLamports.toString()} does not match expected ${expectedLamports.toString()} lamports`,\n );\n this.name = \"InvalidDepositAmountError\";\n this.receivedLamports = receivedLamports;\n this.expectedLamports = expectedLamports;\n }\n}\n\n/** Local input-validation failure; never reaches the wire. */\nexport class PolicyValidationError extends InvisibleError {\n readonly code: PolicyValidationErrorCode;\n constructor(code: PolicyValidationErrorCode, message: string, options?: InvisibleErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** Storage-adapter failure. */\nexport class StorageError extends InvisibleError {\n readonly code: StorageErrorCode;\n readonly swapId?: string;\n readonly phase?: StorageErrorPhase;\n readonly remoteAccepted?: boolean;\n\n constructor(code: StorageErrorCode, message: string, options?: StorageErrorOptions) {\n super(message, options);\n this.code = code;\n if (options?.swapId !== undefined) this.swapId = options.swapId;\n if (options?.phase !== undefined) this.phase = options.phase;\n if (options?.remoteAccepted !== undefined) this.remoteAccepted = options.remoteAccepted;\n }\n}\n\n/** Wallet-adapter failure. */\nexport class WalletError extends InvisibleError {\n readonly code: WalletErrorCode;\n constructor(code: WalletErrorCode, message: string, options?: InvisibleErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/** LP lifecycle state that is local to the SDK client. */\nexport class LpLifecycleError extends InvisibleError {\n readonly code: LpLifecycleErrorCode;\n constructor(code: LpLifecycleErrorCode, message: string, options?: InvisibleErrorOptions) {\n super(message, options);\n this.code = code;\n }\n}\n\n/**\n * A surface that exists in the typed contract but has no runtime behavior yet.\n * The skeleton throws this from every command that is not the connection layer.\n * The message carries the fully-qualified command name (e.g. `user.contractRequest`).\n */\nexport class NotImplementedError extends InvisibleError {\n readonly code = \"NOT_IMPLEMENTED\" as const;\n /** The command that is not yet implemented, e.g. `lp.redeem`. */\n readonly command: string;\n constructor(command: string, options?: InvisibleErrorOptions) {\n super(`${command} is not implemented in this SDK build`, options);\n this.command = command;\n }\n}\n\n/** Type guard: is `value` any SDK error. */\nexport function isInvisibleError(value: unknown): value is InvisibleError {\n return value instanceof InvisibleError;\n}\n\n// ---------------------------------------------------------------------------\n// Normalization (analog of web/src/lib/user-facing-error.ts)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_ERROR_MESSAGE = \"Something went wrong. Please try again.\";\n\ninterface MessageLike {\n readonly message?: unknown;\n readonly reason?: unknown;\n readonly error?: unknown;\n readonly code?: unknown;\n}\n\n/**\n * Reduce any thrown value to a readable, single-line message. Guarantees the\n * SDK never surfaces `[object Object]` / `[object ErrorEvent]` (spec section\n * 8.3). For an {@link InvisibleError} the code is prefixed as `[CODE] message`.\n */\nexport function normalizeError(error: unknown, fallback: string = DEFAULT_ERROR_MESSAGE): string {\n const direct = extractMessage(error);\n if (isReadable(direct)) return direct;\n if (isReadable(fallback)) return fallback.trim();\n return DEFAULT_ERROR_MESSAGE;\n}\n\nfunction extractMessage(error: unknown): string | null {\n if (\n error instanceof CommandError &&\n error.coordinatorCode === COORDINATOR_CAPACITY_FULL_ERROR_CODE\n ) {\n return error.message;\n }\n if (error instanceof CommandError && error.coordinatorCode !== undefined) {\n return formatCode(error.coordinatorCode, error.message);\n }\n if (error instanceof InvisibleError) return formatCode(error.code, error.message);\n if (error instanceof Error) return error.message;\n if (typeof error === \"string\") return error;\n if (error === null || error === undefined) return null;\n\n if (isMessageLike(error)) {\n if (typeof error.message === \"string\" && isReadable(error.message)) {\n return formatCode(error.code, error.message);\n }\n const nested = extractMessage(error.error);\n if (isReadable(nested)) return formatCode(error.code, nested);\n const reason = extractMessage(error.reason);\n if (isReadable(reason)) return formatCode(error.code, reason);\n }\n\n return null;\n}\n\nfunction isMessageLike(value: unknown): value is MessageLike {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction formatCode(code: unknown, message: string): string {\n if (typeof code !== \"string\" || code.trim().length === 0) return message.trim();\n const trimmed = code.trim();\n return message.includes(`[${trimmed}]`) ? message.trim() : `[${trimmed}] ${message.trim()}`;\n}\n\nfunction isReadable(value: string | null): value is string {\n if (value === null) return false;\n const trimmed = value.trim();\n if (trimmed.length === 0) return false;\n return !/^\\[object (?:Object|Event|ErrorEvent|PromiseRejectionEvent)\\]$/.test(trimmed);\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { COORDINATOR_BINARY_FIELD_NAMES, COORDINATOR_ENVELOPE_SCHEMA, COORDINATOR_SCHEMA_PAYLOAD_CATEGORIES, CoordinatorError, CoordinatorMessageType, DEFAULT_PAYOUT_WINDOW_ID, DIRECTION_BY_TYPE, ENVELOPE_VERSION, EnvelopeKind, ErrorCode, INITIAL_STATE, MAX_ENCODED_JSON_BYTES_KEYWORD, MAX_FRAME_SIZE, MessageDirection, PAYOUT_WINDOW_OPTIONS, TERMINAL_STATES, TRANSITIONS, VALID_SWAP_STATES, asDelegateAckPayload, asDelegateSharePayload, asDelegateShareResponsePayload, asDepositConfirmedPayload, asDkgCompletePayload, asDkgInitPayload, asDkgInitResponsePayload, asDkgRound1Payload, asDkgRound1ResponsePayload, asDkgRound2Payload, asDkgRound2ResponsePayload, asErrorPayload, asLpCommandResponsePayload, asPayoutExecutedPayload, asSwapRequestPayload, asSwapRequestResponsePayload, asSyncRequiredPayload, asSyncUserRequestPayload, asSyncUserResponsePayload, asWithdrawAcceptedPayload, asWithdrawExecutedPayload, asWithdrawRequestPayload, createCoordinatorSchemaValidator, decode, encode, encodeLpCommandForSigning, encodeValidated, isAllowedInState, isAllowedKindForType, isPayoutWindowId, isValidEnvelopeKind, isValidErrorCode, isValidMessageType, isValidSwapState, lpSignedCommandEnvelope, nextState, payloadCategory, payoutWindowLabelForId, payoutWindowOptionById, safeEncode, scheduledPayoutWindowOptions, scheduledPayoutWindowSeconds } from './chunk-QF5TSUQE.js';
2
+ import './chunk-VR6T6OJS.js';
3
+ //# sourceMappingURL=coordinator-DHL3AP7V.js.map
4
+ //# sourceMappingURL=coordinator-DHL3AP7V.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"coordinator-E2TS6NR2.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"coordinator-DHL3AP7V.js"}
package/dist/dkgWorker.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ensureFrostWasm, loadFrost } from './chunk-K67FTCQU.js';
1
+ import { ensureFrostWasm, loadFrost } from './chunk-JNNVPZEU.js';
2
2
  import './chunk-VR6T6OJS.js';
3
3
 
4
4
  // src/lp/dkgWorker.ts
package/dist/events.js CHANGED
@@ -1,6 +1,6 @@
1
- import { onEnvelope, EnvelopeKind, CoordinatorMessageType } from './chunk-MZKJU3UA.js';
2
- import './chunk-HJFMDMPY.js';
3
- import { NotImplementedError } from './chunk-QRN46R3F.js';
1
+ import { onEnvelope, EnvelopeKind, CoordinatorMessageType } from './chunk-ISIWWGSR.js';
2
+ import './chunk-6AKBRYKO.js';
3
+ import { NotImplementedError } from './chunk-RWKG7N7I.js';
4
4
  import './chunk-VR6T6OJS.js';
5
5
 
6
6
  // src/events/index.ts
@@ -0,0 +1,4 @@
1
+ export { ensureFrostWasm, loadFrost } from './chunk-JNNVPZEU.js';
2
+ import './chunk-VR6T6OJS.js';
3
+ //# sourceMappingURL=frostRuntime-JESDHN6O.js.map
4
+ //# sourceMappingURL=frostRuntime-JESDHN6O.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"frostRuntime-6FTPKUCP.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"frostRuntime-JESDHN6O.js"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { S as Session } from './session-DFuy54C-.js';
2
2
  export { i as isAttested } from './session-DFuy54C-.js';
3
- export { A as AttestationError, a as AttestationErrorCode, C as CommandError, b as CommandErrorCode, c as CommandErrorOptions, d as CoordinatorWireErrorCode, I as InvalidDepositAmountError, e as InvisibleError, f as InvisibleErrorCode, g as InvisibleErrorOptions, L as LpLifecycleError, h as LpLifecycleErrorCode, i as LpPositionView, N as NotImplementedError, j as NotImplementedErrorCode, k as PayoutDestination, P as PayoutPolicy, l as PolicyValidationError, m as PolicyValidationErrorCode, R as RoutingError, n as RoutingErrorCode, o as RuntimeMeasurements, S as StorageEnvelope, p as StorageError, q as StorageErrorCode, r as StorageErrorOptions, s as StorageErrorPhase, T as TransportError, t as TransportErrorCode, W as WalletError, u as WalletErrorCode, v as isInvisibleError, w as normalizeError } from './types.generated-YhFu9ZBR.js';
3
+ export { A as AttestationError, a as AttestationErrorCode, C as CommandError, b as CommandErrorCode, c as CommandErrorOptions, d as CoordinatorWireErrorCode, I as InvalidDepositAmountError, e as InvisibleError, f as InvisibleErrorCode, g as InvisibleErrorOptions, L as LpLifecycleError, h as LpLifecycleErrorCode, i as LpPositionView, N as NotImplementedError, j as NotImplementedErrorCode, k as PayoutDestination, P as PayoutPolicy, l as PolicyValidationError, m as PolicyValidationErrorCode, R as RoutingError, n as RoutingErrorCode, o as RuntimeMeasurements, S as StorageEnvelope, p as StorageError, q as StorageErrorCode, r as StorageErrorOptions, s as StorageErrorPhase, T as TransportError, t as TransportErrorCode, W as WalletError, u as WalletErrorCode, v as isInvisibleError, w as normalizeError } from './types.generated-DrM2M4DZ.js';
4
4
  import { T as Transport, N as NoiseWebSocketTransportOptions, U as Unsubscribe } from './types-ZhV7TIQY.js';
5
5
  export { C as ConnectionState, W as WebSocketFactory, a as WebSocketLike } from './types-ZhV7TIQY.js';
6
6
 
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import { createStateController, createSessionInternal, isLoopbackUrl, reattestSerialized, INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from './chunk-Y7AK6RBV.js';
2
- export { closeSession, createExponentialBackoff, noiseWebSocketTransport } from './chunk-Y7AK6RBV.js';
3
- export { assertAttested, hex, lamports, publicKey, requestId } from './chunk-EBWTAXNT.js';
4
- import { getSessionState, failSessionClosed } from './chunk-HJFMDMPY.js';
5
- import './chunk-DCTYBUY3.js';
6
- import { TransportError, NotImplementedError } from './chunk-QRN46R3F.js';
7
- export { AttestationError, CommandError, InvalidDepositAmountError, InvisibleError, LpLifecycleError, NotImplementedError, PolicyValidationError, RoutingError, StorageError, TransportError, WalletError, isInvisibleError, normalizeError } from './chunk-QRN46R3F.js';
1
+ import { createStateController, createSessionInternal, isLoopbackUrl, reattestSerialized, INTEL_SGX_ROOT_CA_FINGERPRINT_SHA256 } from './chunk-EOPZVOVP.js';
2
+ export { closeSession, createExponentialBackoff, noiseWebSocketTransport } from './chunk-EOPZVOVP.js';
3
+ export { assertAttested, hex, lamports, publicKey, requestId } from './chunk-EPWTRF5U.js';
4
+ import { getSessionState, failSessionClosed } from './chunk-6AKBRYKO.js';
5
+ import './chunk-AIKC2XQS.js';
6
+ import { TransportError, NotImplementedError } from './chunk-RWKG7N7I.js';
7
+ export { AttestationError, CommandError, InvalidDepositAmountError, InvisibleError, LpLifecycleError, NotImplementedError, PolicyValidationError, RoutingError, StorageError, TransportError, WalletError, isInvisibleError, normalizeError } from './chunk-RWKG7N7I.js';
8
8
  import './chunk-VR6T6OJS.js';
9
9
 
10
10
  // src/core/version.ts
@@ -105,7 +105,7 @@ function createAzureProductionEndpoint({
105
105
  }
106
106
 
107
107
  // src/presets/productionBinaryHash.ts
108
- var APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH = "2eb6efac5b38562b0759043155556034ea105db40094f0e424762f05ae441da8".toLowerCase() ;
108
+ var APPROVED_PRODUCTION_COORDINATOR_BINARY_HASH = "176a3f8eb8941bb6b9dd85a044eff1df686df87ff757133a4df467ba46d7c7cf".toLowerCase() ;
109
109
 
110
110
  // src/presets/productionMrtd.ts
111
111
  var APPROVED_PRODUCTION_COORDINATOR_MRTD = "6f3e84c54ac6377614d4c139473db575a83b5db41bd845eecb4eedaf2788ea881309a410c4ceae9641406411f3f639b8".toLowerCase() ;
package/dist/lp.d.ts CHANGED
@@ -53,7 +53,15 @@ type LpRedemptionPermission = {
53
53
  grantRevision: number;
54
54
  observedAtMs: number;
55
55
  };
56
+ type LpEconomicReturnSummary = {
57
+ providerRewardLamports: string;
58
+ sourceExpenseCompensationLamports: string;
59
+ chargedReimbursementLossLamports: string;
60
+ /** Provider reward minus charged losses; nominal source expense compensation is excluded. */
61
+ netEconomicReturnLamports: string;
62
+ };
56
63
  type LpActorSyncView = {
64
+ economicReturn?: LpEconomicReturnSummary;
57
65
  lpPositionId: string;
58
66
  status: "idle" | "settling" | "reimbursement_due";
59
67
  sourceLiquidityUse: SourceLiquidityUse;
@@ -322,6 +330,7 @@ interface LpWithdrawalRecord {
322
330
  readonly landedBaselineLamports: number;
323
331
  readonly landedFeeBaselineLamports?: number;
324
332
  readonly redeemedLamports: number;
333
+ readonly networkFeeLossLamports?: number;
325
334
  readonly txSignatures: string[];
326
335
  readonly txSignatureBaseline: string[];
327
336
  readonly coordinatorStateVersion?: number;
@@ -450,4 +459,4 @@ declare function withdrawFees(session: Session, positionId: string, args: {
450
459
  }): Promise<never>;
451
460
  declare function listPositions(session: Session): Promise<LpPositionView[]>;
452
461
 
453
- export { type CompleteDkgBatchOptions, type CreateLpDkgBatchInput, type CreatePositionArgs, type CreatePositionResult, type FinalizeLpDkgBatchInput, type FundingConfirmationInput, type InitialFundingPlan, LP_COMMAND_REQUEST_TIMEOUT_MS, LP_DKG_ABORT_CLEANUP_TIMEOUT_MS, LP_DKG_ABORT_REQUEST_TIMEOUT_MS, LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE, LP_DKG_WORKER_REQUEST_TIMEOUT_MS, LP_FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE, LP_MISSING_POSITION_CODE_MESSAGE, LP_REDEMPTION_RECONCILING_MESSAGE, type LpActorSyncView, type LpCoordinatorClient, type LpCoordinatorClientOptions, type LpCreationAuthorization, type LpCreationSigner, type LpDkgClient, type LpDkgProgress, type LpInventoryShard, type LpLifecycleClient, type LpLifecycleDkgProgress, type LpLifecycleRuntime, type LpPositionCode, type LpPositionCodeAuth, type LpPositionCreationIntent, type LpPositionRequestOptions, type LpPositionView, type LpRedemptionHistoryView, type LpRedemptionPermission, type LpTopUpRequest, type LpWithdrawalExecutionView, type LpWithdrawalMode, type LpWithdrawalPlanPreview, type LpWithdrawalPlanPreviewArgs, type LpWithdrawalRecord, type OpenLpPositionInput, type RecoverPositionArgs, type RefillArgs, type RefillLpPositionInput, type SourceLiquidityUse, type WaitForTopUpOptions, type WaitForWithdrawalConfirmationOptions, type WithdrawPositionArgs, type WithdrawPositionResult, type WithdrawalConfirmation, type WithdrawalExecution, bytesToHex, completeDkgBatch, confirmPositionCodeSaved, createLpCoordinatorClient, createLpDkgBatch, createLpLifecycleClient, createPosition, defaultLpLifecycleClient, deriveLpPositionCodeAuth, generateLpPositionCode, isLpPositionAuthMissingError, isLpRedemptionReconcilingError, listPositions, normalizeLpPositionCode, prepareInitialFunding, prepareTopUp, previewLpWithdrawalPlan, reconcileFunding, recoverPosition, refill, refreshPosition, signLpCommandBytes, waitForTopUp, waitForWithdrawalConfirmation, withdrawFees, withdrawPosition };
462
+ export { type CompleteDkgBatchOptions, type CreateLpDkgBatchInput, type CreatePositionArgs, type CreatePositionResult, type FinalizeLpDkgBatchInput, type FundingConfirmationInput, type InitialFundingPlan, LP_COMMAND_REQUEST_TIMEOUT_MS, LP_DKG_ABORT_CLEANUP_TIMEOUT_MS, LP_DKG_ABORT_REQUEST_TIMEOUT_MS, LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE, LP_DKG_WORKER_REQUEST_TIMEOUT_MS, LP_FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE, LP_MISSING_POSITION_CODE_MESSAGE, LP_REDEMPTION_RECONCILING_MESSAGE, type LpActorSyncView, type LpCoordinatorClient, type LpCoordinatorClientOptions, type LpCreationAuthorization, type LpCreationSigner, type LpDkgClient, type LpDkgProgress, type LpEconomicReturnSummary, type LpInventoryShard, type LpLifecycleClient, type LpLifecycleDkgProgress, type LpLifecycleRuntime, type LpPositionCode, type LpPositionCodeAuth, type LpPositionCreationIntent, type LpPositionRequestOptions, type LpPositionView, type LpRedemptionHistoryView, type LpRedemptionPermission, type LpTopUpRequest, type LpWithdrawalExecutionView, type LpWithdrawalMode, type LpWithdrawalPlanPreview, type LpWithdrawalPlanPreviewArgs, type LpWithdrawalRecord, type OpenLpPositionInput, type RecoverPositionArgs, type RefillArgs, type RefillLpPositionInput, type SourceLiquidityUse, type WaitForTopUpOptions, type WaitForWithdrawalConfirmationOptions, type WithdrawPositionArgs, type WithdrawPositionResult, type WithdrawalConfirmation, type WithdrawalExecution, bytesToHex, completeDkgBatch, confirmPositionCodeSaved, createLpCoordinatorClient, createLpDkgBatch, createLpLifecycleClient, createPosition, defaultLpLifecycleClient, deriveLpPositionCodeAuth, generateLpPositionCode, isLpPositionAuthMissingError, isLpRedemptionReconcilingError, listPositions, normalizeLpPositionCode, prepareInitialFunding, prepareTopUp, previewLpWithdrawalPlan, reconcileFunding, recoverPosition, refill, refreshPosition, signLpCommandBytes, waitForTopUp, waitForWithdrawalConfirmation, withdrawFees, withdrawPosition };
package/dist/lp.js CHANGED
@@ -1,8 +1,8 @@
1
- import { isValidLpPositionId, LP_DEFAULT_REFILL_BATCH_SIZE, LP_DEFAULT_TARGET_SHARDS, LP_MAX_TARGET_SHARDS, LP_MAX_REFILL_BATCH_SIZE } from './chunk-IG6JJFR2.js';
2
- import { publicKey, assertAttested, lamports } from './chunk-EBWTAXNT.js';
3
- import { requestEnvelope, CoordinatorMessageType } from './chunk-MZKJU3UA.js';
4
- import { getSessionState } from './chunk-HJFMDMPY.js';
5
- import { CommandError, WalletError, TransportError, PolicyValidationError, RoutingError, LpLifecycleError } from './chunk-QRN46R3F.js';
1
+ import { isValidLpPositionId, LP_MAX_TOTAL_SHARDS, LP_MAX_INITIAL_SHARDS, LP_MAX_REFILL_BATCH_SIZE, LP_SHARD_PAGE_SIZE, LP_DEFAULT_REFILL_BATCH_SIZE, LP_DEFAULT_TARGET_SHARDS } from './chunk-HWRMSK7E.js';
2
+ import { publicKey, assertAttested, lamports } from './chunk-EPWTRF5U.js';
3
+ import { requestEnvelope, CoordinatorMessageType } from './chunk-ISIWWGSR.js';
4
+ import { getSessionState } from './chunk-6AKBRYKO.js';
5
+ import { CommandError, WalletError, TransportError, PolicyValidationError, RoutingError, LpLifecycleError } from './chunk-RWKG7N7I.js';
6
6
  import './chunk-VR6T6OJS.js';
7
7
 
8
8
  // src/lp/positionCode.ts
@@ -231,6 +231,11 @@ var COMMAND_TTL_MS = 3e4;
231
231
  var LP_POSITION_OPEN_COMMAND_TTL_MS = 55e3;
232
232
  var LP_POSITION_OPEN_REQUEST_TIMEOUT_MS = 2e4;
233
233
  var LP_COMMAND_REQUEST_TIMEOUT_MS = COMMAND_TTL_MS;
234
+ var LP_POSITION_HYDRATION_TIMEOUT_MS = LP_COMMAND_REQUEST_TIMEOUT_MS;
235
+ var LP_POSITION_SNAPSHOT_MAX_ATTEMPTS = 3;
236
+ var LP_SHARD_SNAPSHOT_CHANGED_MESSAGE = "LP shard snapshot changed";
237
+ var LP_SHARD_PAGE_INVALID_MESSAGE = "coordinator LP shard page is invalid";
238
+ var LP_SHARD_SNAPSHOT_HASH_PATTERN = /^[0-9a-f]{64}$/;
234
239
  var LP_CREATION_CHALLENGE_REQUEST_TIMEOUT_MS = 3e4;
235
240
  var LP_CREATION_WALLET_SIGNATURE_TIMEOUT_MS = 45e3;
236
241
  var LP_CREATION_PROOF_REQUEST_TIMEOUT_MS = 15e3;
@@ -527,7 +532,7 @@ async function openPosition(session, input, auth, reconnectSession) {
527
532
  commandOptions
528
533
  );
529
534
  }
530
- return expectPosition(response);
535
+ return hydratePositionResponse(session, auth.lpPositionId, auth, response);
531
536
  }
532
537
  async function reconnectSessionWithinDeadline(reconnectSession, deadlineMs) {
533
538
  const remainingMs = deadlineMs - Date.now();
@@ -561,37 +566,130 @@ function isAmbiguousCoordinatorRequestFailure(error) {
561
566
  return error instanceof TransportError || error instanceof CommandError && error.code === "REJECTED_STALE_JOB";
562
567
  }
563
568
  async function getPosition(session, lpPositionId, auth, options = {}) {
564
- let cursor;
565
- let position;
566
- const seenCursors = /* @__PURE__ */ new Set();
567
- for (; ; ) {
568
- const pageOptions = lpPositionPageRequestOptions(options);
569
- const response = await requestForPosition(
570
- session,
571
- lpPositionId,
572
- auth,
573
- "position_get",
574
- {
575
- case: "positionGet",
576
- value: cursor === void 0 ? {} : { redemption_history_cursor: cursor }
577
- },
578
- pageOptions
579
- );
580
- const page = expectPosition(response);
581
- const mergedPosition = position === void 0 ? page : mergePositionHistoryPages(position, page);
582
- position = mergedPosition;
583
- const actorSync = page.actorSync;
584
- if (actorSync?.redemptionHistoryHasMore !== true) return mergedPosition;
585
- const nextCursor = actorSync.redemptionHistoryNextCursor;
586
- if (nextCursor === void 0 || seenCursors.has(nextCursor)) {
587
- throw new CommandError(
588
- "REJECTED_STATE",
589
- "coordinator LP actor sync returned an invalid redemption history cursor"
569
+ return hydratePositionResponse(session, lpPositionId, auth, void 0, options);
570
+ }
571
+ async function hydratePositionResponse(session, lpPositionId, auth, initialResponse, options = {}) {
572
+ const boundedOptions = {
573
+ ...options,
574
+ deadlineMs: options.deadlineMs ?? Date.now() + LP_POSITION_HYDRATION_TIMEOUT_MS
575
+ };
576
+ for (let attempt = 0; attempt < LP_POSITION_SNAPSHOT_MAX_ATTEMPTS; attempt += 1) {
577
+ try {
578
+ const response = initialResponse ?? await requestForPosition(
579
+ session,
580
+ lpPositionId,
581
+ auth,
582
+ "position_get",
583
+ { case: "positionGet", value: {} },
584
+ boundedOptions
590
585
  );
586
+ if (response.case !== "position")
587
+ throw new CommandError("REJECTED_STATE", LP_SHARD_PAGE_INVALID_MESSAGE);
588
+ const first = response.value;
589
+ let full = first;
590
+ if (first.shards_snapshot_hash !== void 0 || first.shards_total_count !== void 0 || first.shards_next_index !== void 0) {
591
+ assertShardPage(first, first, lpPositionId, auth, 0);
592
+ const shards = [...first.shards];
593
+ let nextIndex = first.shards_next_index;
594
+ while (nextIndex !== void 0) {
595
+ const nextResponse = await requestForPosition(
596
+ session,
597
+ lpPositionId,
598
+ auth,
599
+ "position_get",
600
+ {
601
+ case: "positionGet",
602
+ value: {
603
+ shard_start_index: nextIndex,
604
+ shards_snapshot_hash: first.shards_snapshot_hash
605
+ }
606
+ },
607
+ boundedOptions
608
+ );
609
+ if (nextResponse.case !== "position")
610
+ throw new CommandError("REJECTED_STATE", LP_SHARD_PAGE_INVALID_MESSAGE);
611
+ assertShardPage(first, nextResponse.value, lpPositionId, auth, nextIndex);
612
+ shards.push(...nextResponse.value.shards);
613
+ nextIndex = nextResponse.value.shards_next_index;
614
+ }
615
+ if (shards.length !== first.shards_total_count)
616
+ throw new CommandError("REJECTED_STATE", LP_SHARD_PAGE_INVALID_MESSAGE);
617
+ full = { ...first, shards };
618
+ } else if (first.target_shard_count > LP_MAX_TOTAL_SHARDS || first.lp_position_id !== lpPositionId || first.shards.length > LP_MAX_INITIAL_SHARDS || first.status !== "dkg_pending" && first.target_shard_count > LP_MAX_INITIAL_SHARDS && first.shards.length !== first.target_shard_count || first.status === "dkg_pending" && first.target_shard_count > LP_MAX_INITIAL_SHARDS && first.target_shard_count - first.shards.length > LP_MAX_REFILL_BATCH_SIZE) {
619
+ throw new CommandError("REJECTED_STATE", LP_SHARD_PAGE_INVALID_MESSAGE);
620
+ }
621
+ let position = mapPosition(full);
622
+ let historyPage = first;
623
+ const seenCursors = /* @__PURE__ */ new Set();
624
+ while (historyPage.actor_sync?.redemption_history_has_more === true) {
625
+ const cursor = historyPage.actor_sync.redemption_history_next_cursor;
626
+ if (cursor === void 0 || seenCursors.has(cursor)) {
627
+ throw new CommandError(
628
+ "REJECTED_STATE",
629
+ "coordinator LP actor sync returned an invalid redemption history cursor"
630
+ );
631
+ }
632
+ seenCursors.add(cursor);
633
+ const nextResponse = await requestForPosition(
634
+ session,
635
+ lpPositionId,
636
+ auth,
637
+ "position_get",
638
+ {
639
+ case: "positionGet",
640
+ value: {
641
+ redemption_history_cursor: cursor,
642
+ ...first.shards_snapshot_hash === void 0 ? {} : { shard_start_index: 0, shards_snapshot_hash: first.shards_snapshot_hash }
643
+ }
644
+ },
645
+ boundedOptions
646
+ );
647
+ if (nextResponse.case !== "position")
648
+ throw new CommandError("REJECTED_STATE", LP_SHARD_PAGE_INVALID_MESSAGE);
649
+ historyPage = nextResponse.value;
650
+ if (first.shards_snapshot_hash !== void 0)
651
+ assertShardPage(first, historyPage, lpPositionId, auth, 0);
652
+ const historyView = mapPosition(historyPage);
653
+ const merged = mergePositionHistoryPages(position, historyView);
654
+ position = first.shards_snapshot_hash === void 0 ? merged : {
655
+ ...position,
656
+ actorSync: position.actorSync === void 0 ? void 0 : {
657
+ ...position.actorSync,
658
+ redemptionHistory: merged.actorSync?.redemptionHistory,
659
+ redemptionHistoryHasMore: historyView.actorSync?.redemptionHistoryHasMore ?? false,
660
+ redemptionHistoryNextCursor: historyView.actorSync?.redemptionHistoryNextCursor
661
+ }
662
+ };
663
+ }
664
+ lpPositionPageRequestOptions(boundedOptions);
665
+ return position;
666
+ } catch (error) {
667
+ if (!(error instanceof CommandError) || !error.message.includes(LP_SHARD_SNAPSHOT_CHANGED_MESSAGE) || attempt + 1 >= LP_POSITION_SNAPSHOT_MAX_ATTEMPTS)
668
+ throw error;
669
+ initialResponse = void 0;
670
+ lpPositionPageRequestOptions(boundedOptions);
591
671
  }
592
- seenCursors.add(nextCursor);
593
- cursor = nextCursor;
594
672
  }
673
+ throw new CommandError("REJECTED_STATE", LP_SHARD_SNAPSHOT_CHANGED_MESSAGE);
674
+ }
675
+ function assertShardPage(first, page, lpPositionId, auth, startIndex) {
676
+ const total = first.shards_total_count;
677
+ const invalid = () => {
678
+ throw new CommandError("REJECTED_STATE", LP_SHARD_PAGE_INVALID_MESSAGE);
679
+ };
680
+ if (total === void 0 || !Number.isInteger(total) || total < 1 || total > LP_MAX_TOTAL_SHARDS || total > first.target_shard_count || first.status !== "dkg_pending" && total !== first.target_shard_count || first.shards_snapshot_hash === void 0 || !LP_SHARD_SNAPSHOT_HASH_PATTERN.test(first.shards_snapshot_hash) || page.lp_position_id !== lpPositionId || page.shards_snapshot_hash !== first.shards_snapshot_hash || page.shards_total_count !== total || page.target_shard_count !== first.target_shard_count || page.status !== "dkg_pending" && total !== page.target_shard_count || page.created_at_ms !== first.created_at_ms || page.committed_lamports !== first.committed_lamports || page.earned_lamports !== first.earned_lamports || page.refill_threshold !== first.refill_threshold || bytesToHex(page.auth_public_key) !== bytesToHex(auth.authPublicKey) || bytesToHex(page.refill_public_key) !== bytesToHex(first.refill_public_key) || bytesToHex(page.redemption_commitment) !== bytesToHex(first.redemption_commitment) || page.shards.length !== Math.min(LP_SHARD_PAGE_SIZE, total - startIndex) || page.shards.length === 0)
681
+ invalid();
682
+ for (const [offset, shard] of page.shards.entries()) {
683
+ const index = startIndex + offset;
684
+ if (shard.index !== index || shard.lp_position_id !== lpPositionId || shard.shard_id !== `${lpPositionId}:shard:${index}`)
685
+ invalid();
686
+ }
687
+ const end = startIndex + page.shards.length;
688
+ if (total === void 0) invalid();
689
+ if (end < total ? page.shards_next_index !== end : page.shards_next_index !== void 0)
690
+ invalid();
691
+ if (page.status !== first.status)
692
+ throw new CommandError("REJECTED_STATE", LP_SHARD_SNAPSHOT_CHANGED_MESSAGE);
595
693
  }
596
694
  function lpPositionPageRequestOptions(options) {
597
695
  if (options.deadlineMs === void 0) return options;
@@ -614,7 +712,7 @@ async function finalizeDkgBatch(session, input, auth) {
614
712
  finalized_at_ms: input.finalizedAtMs
615
713
  }
616
714
  });
617
- return expectPosition(response);
715
+ return hydratePositionResponse(session, auth.lpPositionId, auth, response);
618
716
  }
619
717
  async function refillPosition(session, input, auth) {
620
718
  const response = await requestForPosition(session, input.lpPositionId, auth, "refill", {
@@ -626,14 +724,14 @@ async function refillPosition(session, input, auth) {
626
724
  authorized_at_ms: input.authorizedAtMs
627
725
  }
628
726
  });
629
- return expectPosition(response);
727
+ return hydratePositionResponse(session, auth.lpPositionId, auth, response);
630
728
  }
631
729
  async function reconcileFunding(session, lpPositionId, auth) {
632
730
  const response = await requestForPosition(session, lpPositionId, auth, "reconcile_funding", {
633
731
  case: "reconcileFunding",
634
732
  value: {}
635
733
  });
636
- return expectPosition(response);
734
+ return hydratePositionResponse(session, auth.lpPositionId, auth, response);
637
735
  }
638
736
  async function planFunding(session, input, auth) {
639
737
  const response = await requestForPosition(session, input.lpPositionId, auth, "funding_plan", {
@@ -738,7 +836,7 @@ function request(session, auth, action, payload) {
738
836
  return requestForPosition(session, auth.lpPositionId, auth, action, payload);
739
837
  }
740
838
  async function requestForPosition(session, lpPositionId, auth, action, payload, options = {}) {
741
- const timeoutMs = options.timeoutMs ?? LP_COMMAND_REQUEST_TIMEOUT_MS;
839
+ const timeoutMs = lpPositionPageRequestOptions(options).timeoutMs ?? LP_COMMAND_REQUEST_TIMEOUT_MS;
742
840
  assertAuthMatchesPosition(lpPositionId, auth);
743
841
  const protocol = await loadProtocol();
744
842
  const state = getSessionState(session);
@@ -773,10 +871,6 @@ function assertAuthMatchesPosition(lpPositionId, auth) {
773
871
  "LP Position Code does not match the target LP position"
774
872
  );
775
873
  }
776
- function expectPosition(response) {
777
- if (response.case !== "position") throw new Error("Unexpected LP position response");
778
- return mapPosition(response.value);
779
- }
780
874
  function mapPosition(position) {
781
875
  return {
782
876
  id: position.lp_position_id,
@@ -823,6 +917,7 @@ function mapLpActorSync(actorSync) {
823
917
  }
824
918
  const redeemableProjectionAvailable = redeemableBucketCount === redeemableBucketValues.length;
825
919
  return {
920
+ ...actorSync.economic_return === void 0 ? {} : { economicReturn: mapLpEconomicReturn(actorSync.economic_return) },
826
921
  lpPositionId: actorSync.lp_position_id,
827
922
  status: actorSync.status,
828
923
  sourceLiquidityUse: actorSync.source_liquidity_use,
@@ -853,6 +948,33 @@ function mapLpActorSync(actorSync) {
853
948
  updatedAtMs: actorSync.updated_at_ms
854
949
  };
855
950
  }
951
+ var LP_ECONOMIC_UNSIGNED_TOTAL_MAX = (1n << 128n) - 1n;
952
+ var LP_ECONOMIC_SIGNED_TOTAL_MIN = -(1n << 127n);
953
+ var LP_ECONOMIC_SIGNED_TOTAL_MAX = (1n << 127n) - 1n;
954
+ var LP_ECONOMIC_UNSIGNED_DECIMAL = /^(0|[1-9][0-9]*)$/;
955
+ var LP_ECONOMIC_SIGNED_DECIMAL = /^(0|-?[1-9][0-9]*)$/;
956
+ function mapLpEconomicReturn(summary) {
957
+ const unsigned = [
958
+ summary.provider_reward_lamports,
959
+ summary.source_expense_compensation_lamports,
960
+ summary.charged_reimbursement_loss_lamports
961
+ ];
962
+ const valid = unsigned.every(
963
+ (value) => typeof value === "string" && LP_ECONOMIC_UNSIGNED_DECIMAL.test(value) && BigInt(value) <= LP_ECONOMIC_UNSIGNED_TOTAL_MAX
964
+ ) && typeof summary.net_economic_return_lamports === "string" && LP_ECONOMIC_SIGNED_DECIMAL.test(summary.net_economic_return_lamports);
965
+ if (!valid)
966
+ throw new CommandError("REJECTED_STATE", "coordinator LP economic return totals are invalid");
967
+ const net = BigInt(summary.net_economic_return_lamports);
968
+ if (net < LP_ECONOMIC_SIGNED_TOTAL_MIN || net > LP_ECONOMIC_SIGNED_TOTAL_MAX || net !== BigInt(summary.provider_reward_lamports) - BigInt(summary.charged_reimbursement_loss_lamports)) {
969
+ throw new CommandError("REJECTED_STATE", "coordinator LP economic return invariant is invalid");
970
+ }
971
+ return {
972
+ providerRewardLamports: summary.provider_reward_lamports,
973
+ sourceExpenseCompensationLamports: summary.source_expense_compensation_lamports,
974
+ chargedReimbursementLossLamports: summary.charged_reimbursement_loss_lamports,
975
+ netEconomicReturnLamports: summary.net_economic_return_lamports
976
+ };
977
+ }
856
978
  function mergePositionHistoryPages(first, next) {
857
979
  if (first.actorSync === void 0) return next;
858
980
  if (next.actorSync === void 0) return first;
@@ -955,7 +1077,7 @@ function randomBytes(length) {
955
1077
  return bytes;
956
1078
  }
957
1079
  function loadProtocol() {
958
- protocolPromise ??= import('./coordinator-E2TS6NR2.js');
1080
+ protocolPromise ??= import('./coordinator-DHL3AP7V.js');
959
1081
  return protocolPromise;
960
1082
  }
961
1083
 
@@ -1327,7 +1449,7 @@ function createLpLifecycleClient(session, runtime = {}) {
1327
1449
  const current = rememberPosition(await client.getPosition(positionId, auth));
1328
1450
  options.onPosition?.(current);
1329
1451
  const startIndex = current.shards.length;
1330
- const remaining = current.targetShardCount - startIndex;
1452
+ const remaining = Math.min(current.targetShardCount - startIndex, LP_MAX_INITIAL_SHARDS);
1331
1453
  if (remaining <= 0) return current;
1332
1454
  emitDkgProgress(options, current, startIndex, remaining, 0);
1333
1455
  let expectedAddresses = null;
@@ -1357,7 +1479,9 @@ function createLpLifecycleClient(session, runtime = {}) {
1357
1479
  );
1358
1480
  options.onPosition?.(position);
1359
1481
  emitDkgProgress(options, position, startIndex, remaining, remaining);
1360
- return rememberPosition(position);
1482
+ rememberPosition(position);
1483
+ if (position.shards.length < position.targetShardCount) continue;
1484
+ return position;
1361
1485
  } catch (error) {
1362
1486
  const reconciled = await tryRefreshCompletedDkgWindow({
1363
1487
  client,
@@ -1387,7 +1511,7 @@ function createLpLifecycleClient(session, runtime = {}) {
1387
1511
  async createPosition(args) {
1388
1512
  assertNoUnsupportedFeePolicy(args.feePolicy);
1389
1513
  const shardCount = args.shardCount ?? LP_DEFAULT_TARGET_SHARDS;
1390
- assertShardCount(shardCount, LP_MAX_TARGET_SHARDS, "shardCount");
1514
+ assertShardCount(shardCount, LP_MAX_INITIAL_SHARDS, "shardCount");
1391
1515
  assertAttested(currentSession);
1392
1516
  const committedLamports = args.committedLamports ?? DEFAULT_SHARD_FUNDING_LAMPORTS;
1393
1517
  const refillThreshold = args.refillThreshold ?? Math.ceil(shardCount * DEFAULT_REFILL_THRESHOLD_RATIO);
@@ -1448,11 +1572,7 @@ function createLpLifecycleClient(session, runtime = {}) {
1448
1572
  const auth = requireAuth(positionId);
1449
1573
  const current = await refreshPosition2(positionId);
1450
1574
  args.onPosition?.(current);
1451
- const refillShardCount = resolveLpRefillShardCount(
1452
- current,
1453
- requestedShardCount,
1454
- args.shardCount === void 0
1455
- );
1575
+ const refillShardCount = resolveLpRefillShardCount(current, requestedShardCount);
1456
1576
  const authorizedPosition = rememberPosition(
1457
1577
  await client.refillPosition(
1458
1578
  {
@@ -1785,21 +1905,12 @@ function assertShardCount(value, max, field) {
1785
1905
  );
1786
1906
  }
1787
1907
  }
1788
- function resolveLpRefillShardCount(position, requestedShardCount, capDefaultBatch) {
1789
- const remainingShardCapacity = LP_MAX_TARGET_SHARDS - position.shards.length;
1790
- if (remainingShardCapacity <= 0) {
1791
- throw new PolicyValidationError(
1792
- "INVALID_AMOUNT",
1793
- `LP refill target_shard_count is already at ${LP_MAX_TARGET_SHARDS}`
1794
- );
1795
- }
1796
- const refillShardCount = capDefaultBatch ? Math.min(requestedShardCount, remainingShardCapacity) : requestedShardCount;
1797
- if (position.shards.length + refillShardCount > LP_MAX_TARGET_SHARDS) {
1798
- throw new PolicyValidationError(
1799
- "INVALID_AMOUNT",
1800
- `LP refill target_shard_count must be <= ${LP_MAX_TARGET_SHARDS}`
1801
- );
1908
+ function resolveLpRefillShardCount(position, requestedShardCount) {
1909
+ const nextTarget = position.shards.length + requestedShardCount;
1910
+ if (!Number.isSafeInteger(nextTarget) || nextTarget > LP_MAX_TOTAL_SHARDS) {
1911
+ throw new PolicyValidationError("INVALID_AMOUNT", "LP refill target_shard_count overflows u32");
1802
1912
  }
1913
+ const refillShardCount = requestedShardCount;
1803
1914
  return refillShardCount;
1804
1915
  }
1805
1916
  function isLpPositionReadyForInitialFunding(position) {
@@ -2017,6 +2128,7 @@ function reconcileLpRedemptionFromHistory(record, history) {
2017
2128
  ...record,
2018
2129
  coordinatorStateVersion: history.stateVersion,
2019
2130
  redeemedLamports: history.landedLamports,
2131
+ networkFeeLossLamports: history.networkFeeLossLamports,
2020
2132
  txSignatures,
2021
2133
  destinationCount: history.destinationCount,
2022
2134
  txSignatureCount: history.txSignatureCount,
@@ -2063,6 +2175,7 @@ function lpWithdrawalRecordFromHistory(position, history) {
2063
2175
  landedBaselineLamports: 0,
2064
2176
  landedFeeBaselineLamports: 0,
2065
2177
  redeemedLamports: history.landedLamports,
2178
+ networkFeeLossLamports: history.networkFeeLossLamports,
2066
2179
  txSignatures: [...history.txSignatures],
2067
2180
  txSignatureBaseline: [],
2068
2181
  coordinatorStateVersion: history.stateVersion,