@invisible-labs/sdk 0.6.0-devnet.1 → 0.6.0-devnet.3

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 (41) hide show
  1. package/README.md +141 -173
  2. package/dist/{chunk-TQNNTV5F.js → chunk-4X5OCCQW.js} +3 -3
  3. package/dist/{chunk-TQNNTV5F.js.map → chunk-4X5OCCQW.js.map} +1 -1
  4. package/dist/{chunk-7DSVN3MV.js → chunk-BWCGNTN5.js} +13 -5
  5. package/dist/chunk-BWCGNTN5.js.map +1 -0
  6. package/dist/{chunk-NCY4FCYU.js → chunk-DIA6U2CV.js} +19 -3
  7. package/dist/chunk-DIA6U2CV.js.map +1 -0
  8. package/dist/{chunk-OHIM2YWU.js → chunk-GHBQF3A7.js} +2 -2
  9. package/dist/chunk-GHBQF3A7.js.map +1 -0
  10. package/dist/{chunk-SZAYO2L5.js → chunk-NHEHCUS5.js} +3 -3
  11. package/dist/{chunk-SZAYO2L5.js.map → chunk-NHEHCUS5.js.map} +1 -1
  12. package/dist/{chunk-LBC7ALYO.js → chunk-NKRVQXRP.js} +58 -3
  13. package/dist/chunk-NKRVQXRP.js.map +1 -0
  14. package/dist/{chunk-XUWBGET5.js → chunk-QQSI3ZD7.js} +23 -7
  15. package/dist/chunk-QQSI3ZD7.js.map +1 -0
  16. package/dist/{chunk-JRMKCE3S.js → chunk-V5HXJRBW.js} +3 -3
  17. package/dist/{chunk-JRMKCE3S.js.map → chunk-V5HXJRBW.js.map} +1 -1
  18. package/dist/{coordinator-7Y45MCCZ.js → coordinator-VVJ33WF2.js} +3 -3
  19. package/dist/{coordinator-7Y45MCCZ.js.map → coordinator-VVJ33WF2.js.map} +1 -1
  20. package/dist/{createSession-D3ym-Ira.d.ts → errors-N2touVm4.d.ts} +2 -54
  21. package/dist/events.js +3 -3
  22. package/dist/index.d.ts +60 -4
  23. package/dist/index.js +7 -7
  24. package/dist/lp.d.ts +8 -1
  25. package/dist/lp.js +109 -22
  26. package/dist/lp.js.map +1 -1
  27. package/dist/presets.d.ts +3 -3
  28. package/dist/presets.js +13 -6
  29. package/dist/presets.js.map +1 -1
  30. package/dist/stats.js +1 -1
  31. package/dist/storage.js +1 -1
  32. package/dist/{types.generated-CHGSbmLp.d.ts → types.generated-BSEBz4jR.d.ts} +1 -0
  33. package/dist/user.d.ts +26 -143
  34. package/dist/user.js +42 -30
  35. package/dist/user.js.map +1 -1
  36. package/package.json +8 -5
  37. package/dist/chunk-7DSVN3MV.js.map +0 -1
  38. package/dist/chunk-LBC7ALYO.js.map +0 -1
  39. package/dist/chunk-NCY4FCYU.js.map +0 -1
  40. package/dist/chunk-OHIM2YWU.js.map +0 -1
  41. package/dist/chunk-XUWBGET5.js.map +0 -1
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-TQNNTV5F.js';
2
- import { publicKey, assertAttested, lamports } from './chunk-SZAYO2L5.js';
3
- import { requestEnvelope } from './chunk-XUWBGET5.js';
4
- import { getSessionState } from './chunk-JRMKCE3S.js';
5
- import { CommandError, PolicyValidationError, RoutingError, LpLifecycleError } from './chunk-OHIM2YWU.js';
1
+ import { isValidLpPositionId, LP_DEFAULT_REFILL_BATCH_SIZE, LP_DEFAULT_TARGET_SHARDS, LP_MAX_TARGET_SHARDS, LP_MAX_REFILL_BATCH_SIZE } from './chunk-4X5OCCQW.js';
2
+ import { publicKey, assertAttested, lamports } from './chunk-NHEHCUS5.js';
3
+ import { requestEnvelope } from './chunk-QQSI3ZD7.js';
4
+ import { getSessionState } from './chunk-V5HXJRBW.js';
5
+ import { CommandError, PolicyValidationError, RoutingError, LpLifecycleError } from './chunk-GHBQF3A7.js';
6
6
  import './chunk-VR6T6OJS.js';
7
7
 
8
8
  // src/lp/positionCode.ts
@@ -225,6 +225,7 @@ function validateDestinationAddresses(destinationAddresses) {
225
225
  // src/lp/coordinatorClient.ts
226
226
  var COMMAND_TTL_MS = 3e4;
227
227
  var LP_COMMAND_REQUEST_TIMEOUT_MS = 12e4;
228
+ var LP_DKG_ABORT_REQUEST_TIMEOUT_MS = 1e4;
228
229
  var encoder2 = new TextEncoder();
229
230
  var protocolPromise = null;
230
231
  function createLpCoordinatorClient(session) {
@@ -232,6 +233,9 @@ function createLpCoordinatorClient(session) {
232
233
  initDkg(input, auth) {
233
234
  return initDkg(session, input, auth);
234
235
  },
236
+ abortDkgSessions(lpPositionId, auth) {
237
+ return abortDkgSessions(session, lpPositionId, auth);
238
+ },
235
239
  dkgRound1(input, auth) {
236
240
  return dkgRound1(session, input, auth);
237
241
  },
@@ -281,6 +285,21 @@ async function initDkg(session, input, auth) {
281
285
  if (response.case !== "dkgInit") throw new Error("Unexpected LP DKG init response");
282
286
  return { sessionId: response.value.session_id };
283
287
  }
288
+ async function abortDkgSessions(session, lpPositionId, auth) {
289
+ const response = await requestForPosition(
290
+ session,
291
+ lpPositionId,
292
+ auth,
293
+ "dkg_abort",
294
+ {
295
+ case: "dkgAbort",
296
+ value: {}
297
+ },
298
+ LP_DKG_ABORT_REQUEST_TIMEOUT_MS
299
+ );
300
+ if (response.case !== "dkgAbort") throw new Error("Unexpected LP DKG abort response");
301
+ return { abortedSessionCount: response.value.aborted_session_count };
302
+ }
284
303
  async function dkgRound1(session, input, auth) {
285
304
  const response = await request(session, auth, "dkg_round1", {
286
305
  case: "dkgRound1",
@@ -466,7 +485,7 @@ async function executeWithdrawal(session, input, auth) {
466
485
  function request(session, auth, action, payload) {
467
486
  return requestForPosition(session, auth.lpPositionId, auth, action, payload);
468
487
  }
469
- async function requestForPosition(session, lpPositionId, auth, action, payload) {
488
+ async function requestForPosition(session, lpPositionId, auth, action, payload, timeoutMs = LP_COMMAND_REQUEST_TIMEOUT_MS) {
470
489
  assertAuthMatchesPosition(lpPositionId, auth);
471
490
  const protocol = await loadProtocol();
472
491
  const state = getSessionState(session);
@@ -476,7 +495,7 @@ async function requestForPosition(session, lpPositionId, auth, action, payload)
476
495
  lp_position_id: lpPositionId,
477
496
  action,
478
497
  nonce: randomBytes(32),
479
- expires_at_ms: Date.now() + COMMAND_TTL_MS,
498
+ expires_at_ms: Date.now() + Math.min(COMMAND_TTL_MS, timeoutMs),
480
499
  coordinator_attestation_hash: await coordinatorAttestationHash(
481
500
  attestation.binaryHash,
482
501
  attestation.pubkeyHex
@@ -486,7 +505,7 @@ async function requestForPosition(session, lpPositionId, auth, action, payload)
486
505
  const signature = await signLpCommandBytes(auth, protocol.encodeLpCommandForSigning(command));
487
506
  const { type, payload: envelopePayload } = protocol.lpSignedCommandEnvelope(command, signature);
488
507
  const envelope = await requestEnvelope(session, type, envelopePayload, {
489
- timeoutMs: LP_COMMAND_REQUEST_TIMEOUT_MS
508
+ timeoutMs
490
509
  });
491
510
  return protocol.asLpCommandResponsePayload(envelope);
492
511
  }
@@ -666,13 +685,17 @@ function randomBytes(length) {
666
685
  return bytes;
667
686
  }
668
687
  function loadProtocol() {
669
- protocolPromise ??= import('./coordinator-7Y45MCCZ.js');
688
+ protocolPromise ??= import('./coordinator-VVJ33WF2.js');
670
689
  return protocolPromise;
671
690
  }
672
691
 
673
692
  // src/lp/dkgBatch.ts
674
693
  var MAX_LP_DKG_CONCURRENCY = 8;
675
694
  var DEFAULT_LP_DKG_CONCURRENCY = MAX_LP_DKG_CONCURRENCY;
695
+ var LP_DKG_WORKER_REQUEST_TIMEOUT_MS = 3e4;
696
+ var LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE = "LP DKG worker request timed out";
697
+ var LP_DKG_ABORT_CLEANUP_TIMEOUT_MS = 1e4;
698
+ var LP_DKG_ABORT_CLEANUP_TIMEOUT_MESSAGE = "LP DKG session cleanup timed out";
676
699
  var LP_DKG_COMPLETED_SHARD_POLL_INTERVAL_MS = 500;
677
700
  var LP_DKG_COMPLETED_SHARD_POLL_TIMEOUT_MS = 5 * 6e4 + 15e3;
678
701
  var LP_DKG_ACTIVE_SESSION_RETRY_INTERVAL_MS = 2e3;
@@ -693,11 +716,20 @@ async function createLpDkgBatch(input) {
693
716
  return addresses2;
694
717
  }
695
718
  const workerCount = resolveConcurrency(input.count, input.concurrency);
696
- const workers = Array.from({ length: workerCount }, () => createWorker(input.workerFactory));
719
+ const workers = [];
720
+ let workersTerminated = false;
721
+ const terminateWorkers = () => {
722
+ if (workersTerminated) return;
723
+ workersTerminated = true;
724
+ workers.forEach((worker) => worker.terminate());
725
+ };
697
726
  const addresses = new Array(input.count);
698
727
  let completed = 0;
699
728
  let nextOffset = 0;
700
729
  try {
730
+ for (let index = 0; index < workerCount; index += 1) {
731
+ workers.push(createWorker(input.workerFactory));
732
+ }
701
733
  await Promise.all(
702
734
  workers.map(async (worker) => {
703
735
  for (; ; ) {
@@ -717,8 +749,34 @@ async function createLpDkgBatch(input) {
717
749
  })
718
750
  );
719
751
  return addresses;
752
+ } catch (error) {
753
+ terminateWorkers();
754
+ if (!isLpDkgSessionCoordinationError(error)) {
755
+ await abortDkgSessionsAfterFailure(input);
756
+ }
757
+ throw error;
720
758
  } finally {
721
- workers.forEach((worker) => worker.terminate());
759
+ terminateWorkers();
760
+ }
761
+ }
762
+ async function abortDkgSessionsAfterFailure(input) {
763
+ const abortDkgSessions2 = input.client.abortDkgSessions;
764
+ if (typeof abortDkgSessions2 !== "function") return;
765
+ let timeoutId;
766
+ try {
767
+ const cleanupTimeout = new Promise((_, reject) => {
768
+ timeoutId = globalThis.setTimeout(
769
+ () => reject(new Error(LP_DKG_ABORT_CLEANUP_TIMEOUT_MESSAGE)),
770
+ LP_DKG_ABORT_CLEANUP_TIMEOUT_MS
771
+ );
772
+ });
773
+ await Promise.race([
774
+ abortDkgSessions2.call(input.client, input.lpPositionId, input.auth),
775
+ cleanupTimeout
776
+ ]);
777
+ } catch {
778
+ } finally {
779
+ if (timeoutId !== void 0) globalThis.clearTimeout(timeoutId);
722
780
  }
723
781
  }
724
782
  async function createLpDkgShard(input, worker, index) {
@@ -802,6 +860,7 @@ async function getCompletedShardAddress(input, index) {
802
860
  }
803
861
  function workerRequest(worker, request2) {
804
862
  return new Promise((resolve, reject) => {
863
+ let timeoutId;
805
864
  const onMessage = (event) => {
806
865
  const message = event.data;
807
866
  if (message.id !== request2.id) return;
@@ -817,12 +876,22 @@ function workerRequest(worker, request2) {
817
876
  reject(new Error(event.message));
818
877
  };
819
878
  const cleanup = () => {
879
+ if (timeoutId !== void 0) globalThis.clearTimeout(timeoutId);
820
880
  worker.removeEventListener("message", onMessage);
821
881
  worker.removeEventListener("error", onError);
822
882
  };
823
883
  worker.addEventListener("message", onMessage);
824
884
  worker.addEventListener("error", onError);
825
- worker.postMessage(request2);
885
+ timeoutId = globalThis.setTimeout(() => {
886
+ cleanup();
887
+ reject(new Error(LP_DKG_WORKER_REQUEST_TIMEOUT_MESSAGE));
888
+ }, LP_DKG_WORKER_REQUEST_TIMEOUT_MS);
889
+ try {
890
+ worker.postMessage(request2);
891
+ } catch (error) {
892
+ cleanup();
893
+ reject(error instanceof Error ? error : new Error(String(error)));
894
+ }
826
895
  });
827
896
  }
828
897
  function createWorker(workerFactory) {
@@ -844,6 +913,13 @@ function isLpDkgCompletedOrVisibleError(error) {
844
913
  function isLpDkgActiveSessionError(error) {
845
914
  return error instanceof Error && error.message.includes("LP DKG session already active for position index");
846
915
  }
916
+ function isLpDkgIndexDriftError(error) {
917
+ if (!(error instanceof Error)) return false;
918
+ return error.message.includes("LP DKG index") && error.message.includes("already exists for position") || error.message.includes("LP DKG expected index");
919
+ }
920
+ function isLpDkgSessionCoordinationError(error) {
921
+ return isLpDkgActiveSessionError(error) || isLpDkgIndexDriftError(error);
922
+ }
847
923
  function resolveConcurrency(count, requested) {
848
924
  if (count <= 0) return 0;
849
925
  const concurrency = requested ?? DEFAULT_LP_DKG_CONCURRENCY;
@@ -867,6 +943,8 @@ var LP_DKG_ACTIVE_SESSION_RETRY_DELAY_MS = 2e3;
867
943
  var LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS2 = 5 * 6e4 + 15e3;
868
944
  var LP_WITHDRAWAL_CONFIRMATION_POLL_INTERVAL_MS = 3e3;
869
945
  var LP_WITHDRAWAL_CONFIRMATION_TIMEOUT_MS = 15 * 6e4;
946
+ var LP_WITHDRAWAL_READINESS_RETRY_DELAY_MS = 1e3;
947
+ var LP_WITHDRAWAL_READINESS_RETRY_ATTEMPTS = 30;
870
948
  var LP_TOP_UP_WAIT_POLL_INTERVAL_MS = 1e3;
871
949
  var LP_REDEMPTION_HISTORY_OPEN_STATES = /* @__PURE__ */ new Set([
872
950
  "requested",
@@ -882,6 +960,7 @@ var WITHDRAWAL_MISSING_RECORD_MESSAGE = "LP withdrawal record is missing";
882
960
  var WITHDRAWAL_RECORD_MISMATCH_MESSAGE = "LP withdrawal record does not match this confirmation request";
883
961
  var WITHDRAWAL_NO_LAMPORTS_MESSAGE = "LP redemption did not land any lamports on-chain";
884
962
  var WITHDRAWAL_HISTORY_MISMATCH_MESSAGE = "LP redemption history does not match this request";
963
+ var LP_WITHDRAWAL_UNRESOLVED_FUNDING_MESSAGE = "LP position has unresolved funding shards before redemption";
885
964
  var UNSUPPORTED_FEE_POLICY_MESSAGE = "LP fee policy overrides are not advertised by the coordinator";
886
965
  var FEE_SOURCE_COUNT_UNAVAILABLE_MESSAGE = "LP earned-fee source count is not available; pass allowManyToOne: true to acknowledge many-to-one withdrawal risk";
887
966
  var LpRedemptionReconcilingError = class extends LpLifecycleError {
@@ -931,6 +1010,20 @@ function createLpLifecycleClient(session, runtime = {}) {
931
1010
  const auth = requireAuth(positionId);
932
1011
  return rememberPosition(await client.getPosition(positionId, auth));
933
1012
  };
1013
+ const executeWithdrawalAfterFundingReadiness = async (positionId, input, auth) => {
1014
+ for (let attempt = 0; ; attempt += 1) {
1015
+ try {
1016
+ return await client.executeWithdrawal(input, auth);
1017
+ } catch (error) {
1018
+ const retryable = error instanceof CommandError && error.message.includes(LP_WITHDRAWAL_UNRESOLVED_FUNDING_MESSAGE);
1019
+ if (!retryable || attempt >= LP_WITHDRAWAL_READINESS_RETRY_ATTEMPTS - 1) {
1020
+ throw error;
1021
+ }
1022
+ await sleep2(LP_WITHDRAWAL_READINESS_RETRY_DELAY_MS);
1023
+ await client.reconcileFunding(positionId, auth).catch(() => void 0);
1024
+ }
1025
+ }
1026
+ };
934
1027
  const completeDkgBatch2 = async (positionId, options = {}) => {
935
1028
  assertAttested(session);
936
1029
  const auth = requireAuth(positionId);
@@ -985,7 +1078,7 @@ function createLpLifecycleClient(session, runtime = {}) {
985
1078
  activeSessionRetryStartedAtMs = null;
986
1079
  continue;
987
1080
  }
988
- if (!isLpDkgActiveSessionError2(error)) throw error;
1081
+ if (!isLpDkgActiveSessionError(error)) throw error;
989
1082
  const currentTime = nowMs();
990
1083
  activeSessionRetryStartedAtMs ??= currentTime;
991
1084
  if (currentTime - activeSessionRetryStartedAtMs >= LP_DKG_ACTIVE_SESSION_RETRY_TIMEOUT_MS2) {
@@ -1198,7 +1291,8 @@ function createLpLifecycleClient(session, runtime = {}) {
1198
1291
  sourceCount
1199
1292
  };
1200
1293
  validateLpWithdrawalPlan(validationInput);
1201
- const execution = await client.executeWithdrawal(
1294
+ const execution = await executeWithdrawalAfterFundingReadiness(
1295
+ positionId,
1202
1296
  {
1203
1297
  lpPositionId: validationInput.lpPositionId,
1204
1298
  destinationAddresses: validationInput.destinationAddresses,
@@ -1617,13 +1711,6 @@ function sameStringList(left, right) {
1617
1711
  function uniqueStrings(values) {
1618
1712
  return Array.from(new Set(values));
1619
1713
  }
1620
- function isLpDkgActiveSessionError2(error) {
1621
- return error instanceof Error && error.message.includes("LP DKG session already active for position index");
1622
- }
1623
- function isLpDkgIndexDriftError(error) {
1624
- if (!(error instanceof Error)) return false;
1625
- return error.message.includes("LP DKG index") && error.message.includes("already exists for position") || error.message.includes("LP DKG expected index");
1626
- }
1627
1714
  function clonePosition(position) {
1628
1715
  return {
1629
1716
  ...position,
@@ -1706,6 +1793,6 @@ function listPositions(session) {
1706
1793
  return defaultLpLifecycleClient(session).listPositions();
1707
1794
  }
1708
1795
 
1709
- export { LP_COMMAND_REQUEST_TIMEOUT_MS, LP_MISSING_POSITION_CODE_MESSAGE, LP_REDEMPTION_RECONCILING_MESSAGE, bytesToHex, completeDkgBatch, confirmPositionCodeSaved, createLpCoordinatorClient, createLpDkgBatch, createLpLifecycleClient, createPosition, defaultLpLifecycleClient, deriveLpPositionCodeAuth, generateLpPositionCode, isLpPositionAuthMissingError, isLpRedemptionReconcilingError, listPositions, normalizeLpPositionCode, prepareInitialFunding, prepareTopUp2 as prepareTopUp, reconcileFunding2 as reconcileFunding, recoverPosition, refill, refreshPosition, signLpCommandBytes, waitForTopUp, waitForWithdrawalConfirmation, withdrawFees, withdrawPosition };
1796
+ export { 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_MISSING_POSITION_CODE_MESSAGE, LP_REDEMPTION_RECONCILING_MESSAGE, bytesToHex, completeDkgBatch, confirmPositionCodeSaved, createLpCoordinatorClient, createLpDkgBatch, createLpLifecycleClient, createPosition, defaultLpLifecycleClient, deriveLpPositionCodeAuth, generateLpPositionCode, isLpPositionAuthMissingError, isLpRedemptionReconcilingError, listPositions, normalizeLpPositionCode, prepareInitialFunding, prepareTopUp2 as prepareTopUp, reconcileFunding2 as reconcileFunding, recoverPosition, refill, refreshPosition, signLpCommandBytes, waitForTopUp, waitForWithdrawalConfirmation, withdrawFees, withdrawPosition };
1710
1797
  //# sourceMappingURL=lp.js.map
1711
1798
  //# sourceMappingURL=lp.js.map