@getpara/core-sdk 3.0.0-alpha.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/cjs/ParaCore.js +436 -86
  2. package/dist/cjs/constants.js +1 -1
  3. package/dist/cjs/cryptography/utils.js +5 -2
  4. package/dist/cjs/errors.js +10 -0
  5. package/dist/cjs/external/userManagementClient.js +21 -4
  6. package/dist/cjs/index.js +67 -1
  7. package/dist/cjs/services/AuthService.js +66 -47
  8. package/dist/cjs/services/LoginFlowService.js +30 -27
  9. package/dist/cjs/services/PollingService.js +100 -75
  10. package/dist/cjs/services/PortalUrlService.js +112 -19
  11. package/dist/cjs/services/PregenWalletService.js +125 -76
  12. package/dist/cjs/services/SessionManagementService.js +15 -8
  13. package/dist/cjs/services/SignupFlowService.js +52 -47
  14. package/dist/cjs/services/VerificationFlowService.js +13 -10
  15. package/dist/cjs/services/WalletService.js +51 -36
  16. package/dist/cjs/shares/enclave.js +44 -24
  17. package/dist/cjs/state/CoreStateManager.js +17 -5
  18. package/dist/cjs/state/actors/setupPara.js +4 -1
  19. package/dist/cjs/state/machines/walletStateMachine.js +22 -0
  20. package/dist/cjs/telemetry/config.js +15 -0
  21. package/dist/cjs/telemetry/init.js +185 -0
  22. package/dist/cjs/telemetry/modalSession.js +54 -0
  23. package/dist/cjs/telemetry/session.js +39 -0
  24. package/dist/cjs/telemetry/tracer.js +126 -0
  25. package/dist/cjs/telemetry/uxAction.js +30 -0
  26. package/dist/cjs/telemetry/uxBaggagePropagator.js +58 -0
  27. package/dist/cjs/telemetry/uxState.js +46 -0
  28. package/dist/cjs/telemetry/uxStateSpanProcessor.js +51 -0
  29. package/dist/cjs/utils/configEncoding.js +98 -0
  30. package/dist/cjs/utils/deprecation.js +13 -13
  31. package/dist/cjs/utils/index.js +11 -0
  32. package/dist/cjs/utils/partnerConfig.js +103 -0
  33. package/dist/cjs/utils/partnerConfigGating.js +83 -0
  34. package/dist/cjs/utils/stateErrorHelpers.js +6 -1
  35. package/dist/cjs/utils/url.js +10 -2
  36. package/dist/esm/ParaCore.js +441 -88
  37. package/dist/esm/constants.js +1 -1
  38. package/dist/esm/cryptography/utils.js +5 -2
  39. package/dist/esm/errors.js +9 -0
  40. package/dist/esm/external/userManagementClient.js +21 -4
  41. package/dist/esm/index.js +58 -4
  42. package/dist/esm/services/AuthService.js +66 -47
  43. package/dist/esm/services/LoginFlowService.js +30 -27
  44. package/dist/esm/services/PollingService.js +100 -75
  45. package/dist/esm/services/PortalUrlService.js +112 -19
  46. package/dist/esm/services/PregenWalletService.js +125 -76
  47. package/dist/esm/services/SessionManagementService.js +15 -8
  48. package/dist/esm/services/SignupFlowService.js +52 -47
  49. package/dist/esm/services/VerificationFlowService.js +13 -10
  50. package/dist/esm/services/WalletService.js +51 -36
  51. package/dist/esm/shares/enclave.js +44 -24
  52. package/dist/esm/state/CoreStateManager.js +17 -5
  53. package/dist/esm/state/actors/setupPara.js +4 -1
  54. package/dist/esm/state/machines/walletStateMachine.js +22 -0
  55. package/dist/esm/telemetry/config.js +0 -0
  56. package/dist/esm/telemetry/init.js +118 -0
  57. package/dist/esm/telemetry/modalSession.js +29 -0
  58. package/dist/esm/telemetry/session.js +16 -0
  59. package/dist/esm/telemetry/tracer.js +84 -0
  60. package/dist/esm/telemetry/uxAction.js +8 -0
  61. package/dist/esm/telemetry/uxBaggagePropagator.js +35 -0
  62. package/dist/esm/telemetry/uxState.js +21 -0
  63. package/dist/esm/telemetry/uxStateSpanProcessor.js +28 -0
  64. package/dist/esm/utils/configEncoding.js +45 -0
  65. package/dist/esm/utils/deprecation.js +11 -12
  66. package/dist/esm/utils/index.js +6 -0
  67. package/dist/esm/utils/partnerConfig.js +67 -0
  68. package/dist/esm/utils/partnerConfigGating.js +61 -0
  69. package/dist/esm/utils/stateErrorHelpers.js +6 -1
  70. package/dist/esm/utils/url.js +10 -2
  71. package/dist/types/ParaCore.d.ts +101 -19
  72. package/dist/types/PlatformUtils.d.ts +1 -0
  73. package/dist/types/errors.d.ts +26 -0
  74. package/dist/types/external/userManagementClient.d.ts +2 -1
  75. package/dist/types/index.d.ts +15 -3
  76. package/dist/types/services/types/AuthServiceTypes.d.ts +10 -3
  77. package/dist/types/services/types/PortalUrlServiceTypes.d.ts +3 -3
  78. package/dist/types/services/types/WalletServiceTypes.d.ts +4 -0
  79. package/dist/types/state/actors/setupPara.d.ts +18 -0
  80. package/dist/types/state/machines/authStateMachine.d.ts +1 -1
  81. package/dist/types/state/machines/coreStateMachine.d.ts +30 -6
  82. package/dist/types/state/machines/walletStateMachine.d.ts +4 -0
  83. package/dist/types/state/types/core.d.ts +7 -1
  84. package/dist/types/telemetry/config.d.ts +4 -0
  85. package/dist/types/telemetry/init.d.ts +17 -0
  86. package/dist/types/telemetry/modalSession.d.ts +5 -0
  87. package/dist/types/telemetry/session.d.ts +2 -0
  88. package/dist/types/telemetry/tracer.d.ts +10 -0
  89. package/dist/types/telemetry/uxAction.d.ts +3 -0
  90. package/dist/types/telemetry/uxBaggagePropagator.d.ts +7 -0
  91. package/dist/types/telemetry/uxState.d.ts +8 -0
  92. package/dist/types/telemetry/uxStateSpanProcessor.d.ts +9 -0
  93. package/dist/types/types/config.d.ts +15 -3
  94. package/dist/types/types/coreApi.d.ts +7 -9
  95. package/dist/types/types/serviceInterfaces.d.ts +5 -3
  96. package/dist/types/types/util.d.ts +2 -15
  97. package/dist/types/utils/configEncoding.d.ts +51 -0
  98. package/dist/types/utils/deprecation.d.ts +3 -1
  99. package/dist/types/utils/index.d.ts +2 -0
  100. package/dist/types/utils/partnerConfig.d.ts +28 -0
  101. package/dist/types/utils/partnerConfigGating.d.ts +48 -0
  102. package/dist/types/utils/url.d.ts +3 -2
  103. package/package.json +14 -4
@@ -6,7 +6,7 @@ import {
6
6
  __spreadProps,
7
7
  __spreadValues
8
8
  } from "../chunk-7B52C2XE.js";
9
- var _stateManager, _authService, _walletService, _pollingService, _paraCoreInterface, _isCreateGuestWalletsPending, _fetchOverridePromise;
9
+ var _stateManager, _authService, _walletService, _pollingService, _paraCoreInterface, _isCreateGuestWalletsPending, _fetchOverridePromise, _claimPregenWalletEntities;
10
10
  import {
11
11
  isPregenAuth,
12
12
  toPregenIds,
@@ -23,6 +23,7 @@ import { dispatchEvent } from "../utils/index.js";
23
23
  import { ParaEvent } from "../types/events.js";
24
24
  import { distributeNewShare } from "../shares/shareDistribution.js";
25
25
  import { SHORT_POLLING_INTERVAL_MS } from "../constants.js";
26
+ import { wrapWithSpan } from "../telemetry/tracer.js";
26
27
  import { waitForCoreStateChange } from "../utils/stateListener.js";
27
28
  class PregenWalletService {
28
29
  constructor(paraCore) {
@@ -81,37 +82,50 @@ class PregenWalletService {
81
82
  }
82
83
  const { supportedWalletTypes } = yield __privateGet(this, _paraCoreInterface).assertPartner();
83
84
  const pregenWallets = yield this.getPregenWallets();
84
- let recoverySecret, walletIds = {};
85
+ let recoverySecret;
86
+ let walletIds = {};
85
87
  if (pregenWallets.length > 0) {
86
- try {
87
- const shares = yield __privateGet(this, _paraCoreInterface).ctx.enclaveClient.getPregenShares({
88
- userId: __privateGet(this, _authService).userId,
89
- walletIds: pregenWallets.map((w) => w.id),
90
- partnerId: pregenWallets[0].partnerId
91
- });
92
- for (const share of shares) {
93
- const wallet = pregenWallets.find((w) => w.id === share.walletId);
94
- if (wallet) {
95
- __privateGet(this, _walletService).wallets[wallet.id] = {
96
- id: wallet.id,
97
- address: wallet.address,
98
- scheme: wallet.scheme,
99
- type: wallet.type,
100
- partnerId: wallet.partnerId,
101
- isPregen: wallet.isPregen,
102
- pregenIdentifier: wallet.pregenIdentifier,
103
- pregenIdentifierType: wallet.pregenIdentifierType,
104
- signer: share.signer,
105
- createdAt: String(wallet.createdAt)
106
- };
88
+ let candidates = pregenWallets.filter((w) => {
89
+ var _a;
90
+ return !!((_a = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a.signer);
91
+ });
92
+ if (candidates.length === 0) {
93
+ try {
94
+ const shares = yield __privateGet(this, _paraCoreInterface).ctx.enclaveClient.getPregenShares({
95
+ userId: __privateGet(this, _authService).userId,
96
+ walletIds: pregenWallets.map((w) => w.id),
97
+ partnerId: pregenWallets[0].partnerId
98
+ });
99
+ for (const share of shares) {
100
+ const wallet = pregenWallets.find((w) => w.id === share.walletId);
101
+ if (wallet) {
102
+ __privateGet(this, _walletService).wallets[wallet.id] = {
103
+ id: wallet.id,
104
+ address: wallet.address,
105
+ scheme: wallet.scheme,
106
+ type: wallet.type,
107
+ partnerId: wallet.partnerId,
108
+ isPregen: wallet.isPregen,
109
+ pregenIdentifier: wallet.pregenIdentifier,
110
+ pregenIdentifierType: wallet.pregenIdentifierType,
111
+ signer: share.signer,
112
+ createdAt: String(wallet.createdAt)
113
+ };
114
+ }
107
115
  }
116
+ } catch (err) {
117
+ console.warn("[performClaimPregenWallets] Failed to fetch pregen shares:", err);
108
118
  }
109
- } catch (err) {
110
- console.warn("[performClaimPregenWallets] Failed to fetch pregen shares:", err);
119
+ candidates = pregenWallets.filter((w) => {
120
+ var _a;
121
+ return !!((_a = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a.signer);
122
+ });
111
123
  }
112
- recoverySecret = yield this.claimPregenWallets();
124
+ const { recoverySecret: claimRecoverySecret, claimedWalletIds } = yield __privateGet(this, _claimPregenWalletEntities).call(this, candidates);
125
+ recoverySecret = claimRecoverySecret;
126
+ const claimed = candidates.filter((w) => claimedWalletIds.includes(w.id));
113
127
  walletIds = supportedWalletTypes.reduce((acc, { type }) => {
114
- const wallet = pregenWallets.find((w) => !!WalletSchemeTypeMap[w.scheme][type]);
128
+ const wallet = claimed.find((w) => !!WalletSchemeTypeMap[w.scheme][type]);
115
129
  if (!wallet) {
116
130
  return acc;
117
131
  }
@@ -125,48 +139,76 @@ class PregenWalletService {
125
139
  return resp;
126
140
  });
127
141
  this.claimPregenWallets = (..._0) => __async(this, [..._0], function* ({ pregenId } = {}) {
128
- var _a;
129
142
  __privateGet(this, _paraCoreInterface).requireApiKey();
130
143
  const pregenWallets = pregenId ? yield this.getPregenWallets({ pregenId }) : yield this.getPregenWallets();
131
144
  if (pregenWallets.length === 0) {
132
145
  return void 0;
133
146
  }
134
- const missingWallets = pregenWallets.filter((wallet) => !__privateGet(this, _walletService).wallets[wallet.id]);
135
- if (missingWallets.length > 0) {
136
- throw new Error(
137
- `Cannot claim pregen wallets because wallet data is missing. Please call setUserShare first to load the wallet data for the following wallet IDs: ${missingWallets.map((w) => w.id).join(", ")}`
147
+ const { recoverySecret } = yield __privateGet(this, _claimPregenWalletEntities).call(this, pregenWallets);
148
+ return recoverySecret;
149
+ });
150
+ // Claims only the pregen entities for which the SDK has local signer
151
+ // material. Wallets without signer material are skipped (warned, not
152
+ // thrown) so a stale/duplicate backend row cannot block login.
153
+ // Returns the wallet IDs the backend confirmed claiming so callers can
154
+ // surface only confirmed wallets.
155
+ __privateAdd(this, _claimPregenWalletEntities, (pregenWallets) => __async(this, null, function* () {
156
+ var _a;
157
+ const claimable = pregenWallets.filter((w) => {
158
+ var _a2;
159
+ return !!((_a2 = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a2.signer);
160
+ });
161
+ const skipped = pregenWallets.filter((w) => {
162
+ var _a2;
163
+ return !((_a2 = __privateGet(this, _walletService).wallets[w.id]) == null ? void 0 : _a2.signer);
164
+ });
165
+ if (skipped.length > 0) {
166
+ console.warn(
167
+ "[claimPregenWallets] Skipping pregen wallets without local share material:",
168
+ skipped.map((w) => w.id)
138
169
  );
139
170
  }
171
+ if (claimable.length === 0) {
172
+ return { recoverySecret: void 0, claimedWalletIds: [] };
173
+ }
140
174
  let newRecoverySecret;
141
175
  const { walletIds } = yield __privateGet(this, _paraCoreInterface).ctx.client.claimPregenWallets({
142
176
  userId: __privateGet(this, _authService).userId,
143
- walletIds: pregenWallets.map((w) => w.id)
177
+ walletIds: claimable.map((w) => w.id)
144
178
  });
145
179
  for (const walletId of walletIds) {
146
180
  const wallet = __privateGet(this, _walletService).wallets[walletId];
147
181
  let refreshedShare;
148
182
  if (wallet.scheme === "ED25519") {
149
- const distributeRes = yield distributeNewShare({
150
- ctx: __privateGet(this, _paraCoreInterface).ctx,
151
- userId: __privateGet(this, _authService).userId,
152
- walletId: wallet.id,
153
- userShare: __privateGet(this, _walletService).wallets[wallet.id].signer,
154
- emailProps: __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
155
- partnerId: wallet.partnerId,
156
- isEnclaveUser: __privateGet(this, _authService).isEnclaveUser,
157
- walletScheme: wallet.scheme
158
- });
183
+ const distributeRes = yield wrapWithSpan(
184
+ "mpc.claim",
185
+ () => distributeNewShare({
186
+ ctx: __privateGet(this, _paraCoreInterface).ctx,
187
+ userId: __privateGet(this, _authService).userId,
188
+ walletId: wallet.id,
189
+ userShare: __privateGet(this, _walletService).wallets[wallet.id].signer,
190
+ emailProps: __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
191
+ partnerId: wallet.partnerId,
192
+ isEnclaveUser: __privateGet(this, _authService).isEnclaveUser,
193
+ walletScheme: wallet.scheme
194
+ }),
195
+ { "wallet.id": wallet.id, "wallet.scheme": "ED25519" }
196
+ );
159
197
  if (distributeRes.length > 0) {
160
198
  newRecoverySecret = distributeRes;
161
199
  }
162
200
  } else {
163
- refreshedShare = yield __privateGet(this, _walletService).refreshShare({
164
- walletId: wallet.id,
165
- share: __privateGet(this, _walletService).wallets[wallet.id].signer,
166
- oldPartnerId: wallet.partnerId,
167
- newPartnerId: wallet.partnerId,
168
- redistributeBackupEncryptedShares: true
169
- });
201
+ refreshedShare = yield wrapWithSpan(
202
+ "mpc.claim",
203
+ () => __privateGet(this, _walletService).refreshShare({
204
+ walletId: wallet.id,
205
+ share: __privateGet(this, _walletService).wallets[wallet.id].signer,
206
+ oldPartnerId: wallet.partnerId,
207
+ newPartnerId: wallet.partnerId,
208
+ redistributeBackupEncryptedShares: true
209
+ }),
210
+ { "wallet.id": wallet.id, "wallet.scheme": wallet.scheme }
211
+ );
170
212
  if (refreshedShare.recoverySecret) {
171
213
  newRecoverySecret = refreshedShare.recoverySecret;
172
214
  }
@@ -185,8 +227,8 @@ class PregenWalletService {
185
227
  });
186
228
  }
187
229
  yield __privateGet(this, _walletService).setWallets(__privateGet(this, _walletService).wallets);
188
- return newRecoverySecret;
189
- });
230
+ return { recoverySecret: newRecoverySecret, claimedWalletIds: walletIds };
231
+ }));
190
232
  this.getPregenWallets = (..._0) => __async(this, [..._0], function* ({ pregenId } = {}) {
191
233
  const pregenIds = pregenId ? toPregenIds(pregenId) : this.pregenIds;
192
234
  if (!pregenIds || Object.keys(pregenIds).length === 0) {
@@ -218,30 +260,36 @@ class PregenWalletService {
218
260
  _type != null ? _type : (_b = supportedWalletTypes.find(({ optional }) => !optional)) == null ? void 0 : _b.type
219
261
  );
220
262
  const [pregenIdentifierType, pregenIdentifier] = toPregenTypeAndId(pregenId);
221
- let keygenRes;
222
- switch (walletType) {
223
- case "STELLAR":
224
- case "SOLANA":
225
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.ed25519PreKeygen(
226
- __privateGet(this, _paraCoreInterface).ctx,
227
- pregenIdentifier,
228
- pregenIdentifierType,
229
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
230
- walletType
231
- );
232
- break;
233
- default:
234
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.preKeygen(
235
- __privateGet(this, _paraCoreInterface).ctx,
236
- void 0,
237
- pregenIdentifier,
238
- pregenIdentifierType,
239
- walletType,
240
- null,
241
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie()
242
- );
243
- break;
244
- }
263
+ const keygenRes = yield wrapWithSpan(
264
+ "mpc.keygen",
265
+ () => __async(this, null, function* () {
266
+ switch (walletType) {
267
+ case "STELLAR":
268
+ case "SOLANA":
269
+ return __privateGet(this, _paraCoreInterface).platformUtils.ed25519PreKeygen(
270
+ __privateGet(this, _paraCoreInterface).ctx,
271
+ pregenIdentifier,
272
+ pregenIdentifierType,
273
+ __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
274
+ walletType
275
+ );
276
+ default:
277
+ return __privateGet(this, _paraCoreInterface).platformUtils.preKeygen(
278
+ __privateGet(this, _paraCoreInterface).ctx,
279
+ void 0,
280
+ pregenIdentifier,
281
+ pregenIdentifierType,
282
+ walletType,
283
+ null,
284
+ __privateGet(this, _paraCoreInterface).retrieveSessionCookie()
285
+ );
286
+ }
287
+ }),
288
+ {
289
+ "wallet.type": walletType,
290
+ "wallet.scheme": walletType === "SOLANA" || walletType === "STELLAR" ? "ED25519" : "DKLS"
291
+ }
292
+ );
245
293
  const { signer, walletId } = keygenRes;
246
294
  __privateGet(this, _walletService).wallets[walletId] = {
247
295
  id: walletId,
@@ -390,6 +438,7 @@ _pollingService = new WeakMap();
390
438
  _paraCoreInterface = new WeakMap();
391
439
  _isCreateGuestWalletsPending = new WeakMap();
392
440
  _fetchOverridePromise = new WeakMap();
441
+ _claimPregenWalletEntities = new WeakMap();
393
442
  export {
394
443
  PregenWalletService
395
444
  };
@@ -6,6 +6,7 @@ import {
6
6
  } from "../chunk-7B52C2XE.js";
7
7
  var _authService, _portalUrlService, _walletService, _pregenWalletService, _externalWalletService, _paraCoreInterface, _isImportedSession, _regeneratePromise, _handleTouchSessionError, _doTouchSession;
8
8
  import { currentWalletIdsEq, supportedWalletTypesEq } from "../utils/wallet.js";
9
+ import { wrapWithSpan } from "../telemetry/tracer.js";
9
10
  class SessionManagementService {
10
11
  constructor(paraCore) {
11
12
  __privateAdd(this, _authService);
@@ -53,14 +54,20 @@ class SessionManagementService {
53
54
  if (regenerate && __privateGet(this, _regeneratePromise) !== void 0) {
54
55
  return __privateGet(this, _regeneratePromise);
55
56
  }
56
- const promise = __privateGet(this, _doTouchSession).call(this, regenerate);
57
- if (regenerate) {
58
- __privateSet(this, _regeneratePromise, promise);
59
- yield promise.finally(() => {
60
- __privateSet(this, _regeneratePromise, void 0);
61
- });
62
- }
63
- return promise;
57
+ return wrapWithSpan(
58
+ "session.touch",
59
+ () => __async(this, null, function* () {
60
+ const promise = __privateGet(this, _doTouchSession).call(this, regenerate);
61
+ if (regenerate) {
62
+ __privateSet(this, _regeneratePromise, promise);
63
+ yield promise.finally(() => {
64
+ __privateSet(this, _regeneratePromise, void 0);
65
+ });
66
+ }
67
+ return promise;
68
+ }),
69
+ { "session.regenerate": regenerate }
70
+ );
64
71
  });
65
72
  __privateAdd(this, _doTouchSession, (regenerate) => __async(this, null, function* () {
66
73
  var _a, _b;
@@ -10,6 +10,7 @@ import { ParaEvent } from "../types/index.js";
10
10
  import { dispatchEvent } from "../utils/index.js";
11
11
  import { extractErrorMessage } from "../utils/stateErrorHelpers.js";
12
12
  import { waitForAuthStateChange, waitForCoreStateChange } from "../utils/stateListener.js";
13
+ import { wrapWithSpan } from "../telemetry/tracer.js";
13
14
  class SignupFlowService extends BaseAuthFlowService {
14
15
  constructor() {
15
16
  super(...arguments);
@@ -74,58 +75,62 @@ class SignupFlowService extends BaseAuthFlowService {
74
75
  return signupState;
75
76
  });
76
77
  this.waitForSignup = (_0) => __async(this, [_0], function* ({ isCanceled = () => false, onCancel, onPoll }) {
77
- this.stateManager.send({
78
- type: "WAIT_FOR_SESSION",
79
- data: {
80
- onCancel,
81
- onPoll,
82
- isCanceled
83
- }
84
- });
85
- return yield waitForAuthStateChange({
86
- stateManager: this.stateManager,
87
- resolvePhases: [
88
- {
89
- phase: "authenticated",
90
- onPhase: () => {
91
- dispatchEvent(ParaEvent.ACCOUNT_CREATION_EVENT, true);
92
- return true;
93
- }
78
+ return wrapWithSpan("auth.signup_wait", () => __async(this, null, function* () {
79
+ this.stateManager.send({
80
+ type: "WAIT_FOR_SESSION",
81
+ data: {
82
+ onCancel,
83
+ onPoll,
84
+ isCanceled
94
85
  }
95
- ],
96
- onReject: (state) => {
97
- var _a;
98
- (_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_CREATION_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
99
- },
100
- waitForCoreAuthenticated: false
101
- });
86
+ });
87
+ return yield waitForAuthStateChange({
88
+ stateManager: this.stateManager,
89
+ resolvePhases: [
90
+ {
91
+ phase: "authenticated",
92
+ onPhase: () => {
93
+ dispatchEvent(ParaEvent.ACCOUNT_CREATION_EVENT, true);
94
+ return true;
95
+ }
96
+ }
97
+ ],
98
+ onReject: (state) => {
99
+ var _a;
100
+ (_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_CREATION_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
101
+ },
102
+ waitForCoreAuthenticated: false
103
+ });
104
+ }));
102
105
  });
103
106
  this.waitForWalletCreation = (..._0) => __async(this, [..._0], function* ({ isCanceled = () => false, onCancel, onPoll } = {}) {
104
- this.stateManager.send({
105
- type: "WAIT_FOR_WALLET_CREATION",
106
- data: {
107
- onCancel,
108
- onPoll,
109
- isCanceled
110
- }
111
- });
112
- return yield waitForCoreStateChange({
113
- stateManager: this.stateManager,
114
- resolvePhases: [
115
- {
116
- phase: "authenticated",
117
- onPhase: (state) => {
118
- const resp = state.newWalletsResult;
119
- dispatchEvent(ParaEvent.ACCOUNT_SETUP_EVENT, resp);
120
- return resp;
107
+ return wrapWithSpan("wallet.creation_wait", () => __async(this, null, function* () {
108
+ this.stateManager.send({
109
+ type: "WAIT_FOR_WALLET_CREATION",
110
+ data: {
111
+ onCancel,
112
+ onPoll,
113
+ isCanceled
114
+ }
115
+ });
116
+ return yield waitForCoreStateChange({
117
+ stateManager: this.stateManager,
118
+ resolvePhases: [
119
+ {
120
+ phase: "authenticated",
121
+ onPhase: (state) => {
122
+ const resp = state.newWalletsResult;
123
+ dispatchEvent(ParaEvent.ACCOUNT_SETUP_EVENT, resp);
124
+ return resp;
125
+ }
121
126
  }
127
+ ],
128
+ onReject: (state) => {
129
+ var _a;
130
+ (_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_SETUP_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
122
131
  }
123
- ],
124
- onReject: (state) => {
125
- var _a;
126
- (_a = dispatchEvent) == null ? void 0 : _a(ParaEvent.ACCOUNT_SETUP_EVENT, {}, extractErrorMessage(state.error, "failed to sign up user"));
127
- }
128
- });
132
+ });
133
+ }));
129
134
  });
130
135
  }
131
136
  }
@@ -7,6 +7,7 @@ import { AuthMethod } from "@getpara/user-management-client";
7
7
  import { BaseAuthFlowService } from "./BaseAuthFlowService.js";
8
8
  import { LOCAL_STORAGE_IS_ENCLAVE_USER } from "../constants.js";
9
9
  import { waitForAuthStateChange } from "../utils/stateListener.js";
10
+ import { wrapWithSpan } from "../telemetry/tracer.js";
10
11
  class VerificationFlowService extends BaseAuthFlowService {
11
12
  constructor() {
12
13
  super(...arguments);
@@ -38,16 +39,18 @@ class VerificationFlowService extends BaseAuthFlowService {
38
39
  return __spreadValues(__spreadValues({}, serverAuthState), loginUrl ? { loginUrl, loginFullUrl } : {});
39
40
  });
40
41
  this.performVerifyNewAccount = (params) => __async(this, null, function* () {
41
- this.services.authService.assertIsAuthSet(["email", "phone"]);
42
- const _a = params, { verificationCode } = _a, urlOptions = __objRest(_a, ["verificationCode"]);
43
- const serverAuthState = yield this.paraCoreInterface.ctx.client.verifyAccount(this.services.authService.userId, {
44
- verificationCode
45
- });
46
- if (serverAuthState.stage === "login" || serverAuthState.stage === "done") {
47
- throw new Error("Account already exists.");
48
- }
49
- yield this.services.sessionManagementService.touchSession(true);
50
- return { authState: serverAuthState, opts: urlOptions };
42
+ return wrapWithSpan("verification.verify_otp", () => __async(this, null, function* () {
43
+ this.services.authService.assertIsAuthSet(["email", "phone"]);
44
+ const _a = params, { verificationCode } = _a, urlOptions = __objRest(_a, ["verificationCode"]);
45
+ const serverAuthState = yield this.paraCoreInterface.ctx.client.verifyAccount(this.services.authService.userId, {
46
+ verificationCode
47
+ });
48
+ if (serverAuthState.stage === "login" || serverAuthState.stage === "done") {
49
+ throw new Error("Account already exists.");
50
+ }
51
+ yield this.services.sessionManagementService.touchSession(true);
52
+ return { authState: serverAuthState, opts: urlOptions };
53
+ }));
51
54
  });
52
55
  this.verifyNewAccount = (params) => __async(this, null, function* () {
53
56
  this.stateManager.send({ type: "VERIFY_NEW_ACCOUNT", data: params });
@@ -28,6 +28,7 @@ import { ParaEvent } from "../types/events.js";
28
28
  import { LOCAL_STORAGE_CURRENT_WALLET_IDS, LOCAL_STORAGE_WALLETS, SHORT_POLLING_INTERVAL_MS } from "../constants.js";
29
29
  import { distributeNewShare } from "../shares/shareDistribution.js";
30
30
  import { sendRecoveryForShare } from "../shares/recovery.js";
31
+ import { wrapWithSpan } from "../telemetry/tracer.js";
31
32
  class WalletService {
32
33
  constructor(paraCore) {
33
34
  __privateAdd(this, _authService);
@@ -108,15 +109,20 @@ class WalletService {
108
109
  }
109
110
  });
110
111
  });
112
+ // wallets.populate names the GET /users/:userId/wallets call that runs to
113
+ // refresh address state after creation/refresh; without it the GET shows up
114
+ // as a bare span at the trace top level.
111
115
  this.populateWalletAddresses = () => __async(this, null, function* () {
112
- const res = yield (__privateGet(this, _paraCoreInterface).isPortal() ? __privateGet(this, _paraCoreInterface).ctx.client.getAllWallets : __privateGet(this, _paraCoreInterface).ctx.client.getWallets)(__privateGet(this, _authService).userId, true);
113
- const wallets = res.data.wallets;
114
- wallets.forEach((entity) => {
115
- if (this.wallets[entity.id]) {
116
- this.wallets[entity.id] = __spreadValues(__spreadValues({}, entityToWallet(entity)), this.wallets[entity.id]);
117
- }
118
- });
119
- yield this.setWallets(this.wallets);
116
+ return wrapWithSpan("wallets.populate", () => __async(this, null, function* () {
117
+ const res = yield (__privateGet(this, _paraCoreInterface).isPortal() ? __privateGet(this, _paraCoreInterface).ctx.client.getAllWallets : __privateGet(this, _paraCoreInterface).ctx.client.getWallets)(__privateGet(this, _authService).userId, true);
118
+ const wallets = res.data.wallets;
119
+ wallets.forEach((entity) => {
120
+ if (this.wallets[entity.id]) {
121
+ this.wallets[entity.id] = __spreadValues(__spreadValues({}, entityToWallet(entity)), this.wallets[entity.id]);
122
+ }
123
+ });
124
+ yield this.setWallets(this.wallets);
125
+ }));
120
126
  });
121
127
  this.addToCurrentWalletIds = (walletIds, options) => __async(this, null, function* () {
122
128
  const updatedWalletIds = __spreadValues({}, this.currentWalletIds);
@@ -156,31 +162,35 @@ class WalletService {
156
162
  );
157
163
  let signer;
158
164
  let wallet;
159
- let keygenRes;
160
- switch (walletType) {
161
- case "STELLAR":
162
- case "SOLANA": {
163
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.ed25519Keygen(
164
- __privateGet(this, _paraCoreInterface).ctx,
165
- __privateGet(this, _authService).userId,
166
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
167
- __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
168
- walletType
169
- );
170
- break;
171
- }
172
- default: {
173
- keygenRes = yield __privateGet(this, _paraCoreInterface).platformUtils.keygen(
174
- __privateGet(this, _paraCoreInterface).ctx,
175
- __privateGet(this, _authService).userId,
176
- walletType,
177
- null,
178
- __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
179
- __privateGet(this, _paraCoreInterface).getBackupKitEmailProps()
180
- );
181
- break;
165
+ const keygenRes = yield wrapWithSpan(
166
+ "mpc.keygen",
167
+ () => __async(this, null, function* () {
168
+ switch (walletType) {
169
+ case "STELLAR":
170
+ case "SOLANA":
171
+ return __privateGet(this, _paraCoreInterface).platformUtils.ed25519Keygen(
172
+ __privateGet(this, _paraCoreInterface).ctx,
173
+ __privateGet(this, _authService).userId,
174
+ __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
175
+ __privateGet(this, _paraCoreInterface).getBackupKitEmailProps(),
176
+ walletType
177
+ );
178
+ default:
179
+ return __privateGet(this, _paraCoreInterface).platformUtils.keygen(
180
+ __privateGet(this, _paraCoreInterface).ctx,
181
+ __privateGet(this, _authService).userId,
182
+ walletType,
183
+ null,
184
+ __privateGet(this, _paraCoreInterface).retrieveSessionCookie(),
185
+ __privateGet(this, _paraCoreInterface).getBackupKitEmailProps()
186
+ );
187
+ }
188
+ }),
189
+ {
190
+ "wallet.type": walletType,
191
+ "wallet.scheme": walletType === "SOLANA" || walletType === "STELLAR" ? "ED25519" : "DKLS"
182
192
  }
183
- }
193
+ );
184
194
  const walletId = keygenRes.walletId;
185
195
  const walletScheme = walletType === "SOLANA" || walletType === "STELLAR" ? "ED25519" : "DKLS";
186
196
  signer = keygenRes.signer;
@@ -388,11 +398,16 @@ class WalletService {
388
398
  }
389
399
  return type;
390
400
  });
401
+ // wallets.fetch names the post-keygen wallet list reads (the polling-style
402
+ // GETs that follow each MPC keygen). The auto-instrumented HTTP child carries
403
+ // the URL and status so this stays cheap.
391
404
  this.fetchWallets = () => __async(this, null, function* () {
392
- const res = yield __privateGet(this, _paraCoreInterface).isPortal() || __privateGet(this, _paraCoreInterface).isParaConnect() ? __privateGet(this, _paraCoreInterface).ctx.client.getAllWallets(__privateGet(this, _authService).userId) : __privateGet(this, _paraCoreInterface).ctx.client.getWallets(__privateGet(this, _authService).userId, true);
393
- return res.data.wallets.filter(
394
- (wallet) => !!wallet.address && wallet.sharesPersisted && (__privateGet(this, _paraCoreInterface).isParaConnect() || !__privateGet(this, _paraCoreInterface).isParaConnect() && this.isWalletSupported(entityToWallet(wallet)))
395
- );
405
+ return wrapWithSpan("wallets.fetch", () => __async(this, null, function* () {
406
+ const res = yield __privateGet(this, _paraCoreInterface).isPortal() || __privateGet(this, _paraCoreInterface).isParaConnect() ? __privateGet(this, _paraCoreInterface).ctx.client.getAllWallets(__privateGet(this, _authService).userId) : __privateGet(this, _paraCoreInterface).ctx.client.getWallets(__privateGet(this, _authService).userId, true);
407
+ return res.data.wallets.filter(
408
+ (wallet) => !!wallet.address && wallet.sharesPersisted && (__privateGet(this, _paraCoreInterface).isParaConnect() || !__privateGet(this, _paraCoreInterface).isParaConnect() && this.isWalletSupported(entityToWallet(wallet)))
409
+ );
410
+ }));
396
411
  });
397
412
  this.getWalletBalance = (_0) => __async(this, [_0], function* ({ walletId, rpcUrl }) {
398
413
  return (yield __privateGet(this, _paraCoreInterface).ctx.client.getWalletBalance({ walletId, rpcUrl })).balance;