@dynamic-labs/aleo 4.83.1 → 4.84.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.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,40 @@
1
1
 
2
+ ## [4.84.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.83.2-alpha.0...v4.84.0) (2026-05-22)
3
+
4
+
5
+ ### Features
6
+
7
+ * **ethereum-gasless:** add @dynamic-labs/ethereum-gasless-{core,extension} and webview controller ([#11267](https://github.com/dynamic-labs/dynamic-auth/issues/11267)) ([edac5df](https://github.com/dynamic-labs/dynamic-auth/commit/edac5df8180483093f69caee508cbdebf2e4e663)), closes [#11274](https://github.com/dynamic-labs/dynamic-auth/issues/11274) [#11274](https://github.com/dynamic-labs/dynamic-auth/issues/11274) [#11274](https://github.com/dynamic-labs/dynamic-auth/issues/11274)
8
+ * **mobile-demo:** add EVM gasless screens for 7702 delegation and sponsored transactions ([#11274](https://github.com/dynamic-labs/dynamic-auth/issues/11274)) ([2961b8f](https://github.com/dynamic-labs/dynamic-auth/commit/2961b8f732ef3a172fcf0e814db3b74961015edf)), closes [#11267](https://github.com/dynamic-labs/dynamic-auth/issues/11267) [#11267](https://github.com/dynamic-labs/dynamic-auth/issues/11267) [#11267](https://github.com/dynamic-labs/dynamic-auth/issues/11267)
9
+ * **mobile-demo:** wire Maestro Cloud E2E for iOS smoke flow ([#11144](https://github.com/dynamic-labs/dynamic-auth/issues/11144)) ([d25b694](https://github.com/dynamic-labs/dynamic-auth/commit/d25b694017277fbe97fc13e21f82201350551862))
10
+ * **starknet:** rename Argent X to Ready X, remove Ready Mobile ([#11299](https://github.com/dynamic-labs/dynamic-auth/issues/11299)) ([addc5dd](https://github.com/dynamic-labs/dynamic-auth/commit/addc5dd9f18310c474dd7ad3ff15c9ab1b652136))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **playwright:** unflake allow/block on 4201/4202 (domain-access-control) DYNT-777 ([#11118](https://github.com/dynamic-labs/dynamic-auth/issues/11118)) ([86e0d72](https://github.com/dynamic-labs/dynamic-auth/commit/86e0d72b7d094f25ce9efd2173cd478b93eb8393)), closes [#11119](https://github.com/dynamic-labs/dynamic-auth/issues/11119)
16
+ * **playwright:** unflake demo-v2 phantom flows (tolerate get-started splash skip) ([#11185](https://github.com/dynamic-labs/dynamic-auth/issues/11185)) ([b648d39](https://github.com/dynamic-labs/dynamic-auth/commit/b648d39c11580b5fbedb5a6972c174a42aa13326))
17
+ * **sdk-react-core:** prevent duplicate deviceRegistration calls and stale list refetch after self-revoke ([#11298](https://github.com/dynamic-labs/dynamic-auth/issues/11298)) ([8ae5180](https://github.com/dynamic-labs/dynamic-auth/commit/8ae51803517bcde9503a20c290e82f3068dfda66))
18
+ * **wallet-book:** correct sprite IDs for bitgetwallet and coin98 wallet groups ([#11291](https://github.com/dynamic-labs/dynamic-auth/issues/11291)) ([d56763c](https://github.com/dynamic-labs/dynamic-auth/commit/d56763c741a93c279c8dd9e548ab7d5ab14cd30d))
19
+
20
+ ### [4.83.2-alpha.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.83.1...v4.83.2-alpha.0) (2026-05-18)
21
+
22
+
23
+ ### Features
24
+
25
+ * **ci:** add structured DD event reporting on RWX CI failure ([#11231](https://github.com/dynamic-labs/dynamic-auth/issues/11231)) ([2a6e19f](https://github.com/dynamic-labs/dynamic-auth/commit/2a6e19f5746bed28993b73c9dc43656ef9c8b75e)), closes [dynamic-labs/pw-configs#30](https://github.com/dynamic-labs/pw-configs/issues/30) [pw-configs#30](https://github.com/dynamic-labs/pw-configs/issues/30) [pw-configs#30](https://github.com/dynamic-labs/pw-configs/issues/30)
26
+ * **playwright:** support local e2e + document workflow + .env.example ([#11230](https://github.com/dynamic-labs/dynamic-auth/issues/11230)) ([492cc5c](https://github.com/dynamic-labs/dynamic-auth/commit/492cc5ce6b5f9241ac670ebf140d1c2dce66dd58))
27
+
28
+
29
+ ### Bug Fixes
30
+
31
+ * **aleo:** dedup concurrent shieldToken calls + hide manual CTA during auto-shield ([#11264](https://github.com/dynamic-labs/dynamic-auth/issues/11264)) ([f466373](https://github.com/dynamic-labs/dynamic-auth/commit/f4663732d50cc3e617c15d41c5131a6f84ee44d5)), closes [#3](https://github.com/dynamic-labs/dynamic-auth/issues/3) [#11263](https://github.com/dynamic-labs/dynamic-auth/issues/11263)
32
+ * **aleo:** render real brand logos on the shielded balance tab ([#11270](https://github.com/dynamic-labs/dynamic-auth/issues/11270)) ([0482fb7](https://github.com/dynamic-labs/dynamic-auth/commit/0482fb7134ee85677e4e48d1cb1e323073703f92))
33
+ * **aleo:** reuse pollOnShielded backoff for the manual shield refresh ([#11265](https://github.com/dynamic-labs/dynamic-auth/issues/11265)) ([4956798](https://github.com/dynamic-labs/dynamic-auth/commit/4956798bfd455caef2844dd1a1db1af3bb6d7daf)), closes [#11264](https://github.com/dynamic-labs/dynamic-auth/issues/11264) [#11263](https://github.com/dynamic-labs/dynamic-auth/issues/11263)
34
+ * **ci:** drop doubled-playwright prefix from in-task dd reporter paths ([#11261](https://github.com/dynamic-labs/dynamic-auth/issues/11261)) ([459693d](https://github.com/dynamic-labs/dynamic-auth/commit/459693d74b73d534ed96ef6afdc5de930e2da9de)), closes [#11255](https://github.com/dynamic-labs/dynamic-auth/issues/11255) [#11255](https://github.com/dynamic-labs/dynamic-auth/issues/11255) [post-#11255](https://github.com/dynamic-labs/post-/issues/11255) [#11251](https://github.com/dynamic-labs/dynamic-auth/issues/11251) [#11231](https://github.com/dynamic-labs/dynamic-auth/issues/11231) [#11251](https://github.com/dynamic-labs/dynamic-auth/issues/11251) [#11231](https://github.com/dynamic-labs/dynamic-auth/issues/11231) [#11255](https://github.com/dynamic-labs/dynamic-auth/issues/11255) [#11251](https://github.com/dynamic-labs/dynamic-auth/issues/11251)
35
+ * **ci:** pass captain log by path so dd reporter dodges ARG_MAX ([#11255](https://github.com/dynamic-labs/dynamic-auth/issues/11255)) ([43dfad0](https://github.com/dynamic-labs/dynamic-auth/commit/43dfad0fda0fdd487a246315d9c6e2be6d61edb1)), closes [#11251](https://github.com/dynamic-labs/dynamic-auth/issues/11251)
36
+ * **widget:** theme TransactionMode segmented control for dark mode ([#11269](https://github.com/dynamic-labs/dynamic-auth/issues/11269)) ([21d6da2](https://github.com/dynamic-labs/dynamic-auth/commit/21d6da2b3edc8b3107c396ac7631b1dcb477533f)), closes [#e5e7](https://github.com/dynamic-labs/dynamic-auth/issues/e5e7) [#cbd5e1](https://github.com/dynamic-labs/dynamic-auth/issues/cbd5e1) [#f9](https://github.com/dynamic-labs/dynamic-auth/issues/f9)
37
+
2
38
  ### [4.83.1](https://github.com/dynamic-labs/dynamic-auth/compare/v4.83.0...v4.83.1) (2026-05-14)
3
39
 
4
40
 
package/package.cjs CHANGED
@@ -3,6 +3,6 @@
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
- var version = "4.83.1";
6
+ var version = "4.84.0";
7
7
 
8
8
  exports.version = version;
package/package.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use client'
2
- var version = "4.83.1";
2
+ var version = "4.84.0";
3
3
 
4
4
  export { version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/aleo",
3
- "version": "4.83.1",
3
+ "version": "4.84.0",
4
4
  "description": "A React SDK for implementing wallet web3 authentication and authorization to your website.",
5
5
  "author": "Dynamic Labs, Inc.",
6
6
  "license": "MIT",
@@ -18,19 +18,19 @@
18
18
  },
19
19
  "homepage": "https://www.dynamic.xyz/",
20
20
  "dependencies": {
21
- "@dynamic-labs-sdk/client": "0.26.9",
22
- "@dynamic-labs/assert-package-version": "4.83.1",
23
- "@dynamic-labs/sdk-api-core": "0.0.964",
21
+ "@dynamic-labs-sdk/client": "1.1.0",
22
+ "@dynamic-labs/assert-package-version": "4.84.0",
23
+ "@dynamic-labs/sdk-api-core": "0.0.985",
24
24
  "@provablehq/aleo-wallet-adaptor-core": "0.3.0-alpha.3",
25
25
  "@provablehq/aleo-wallet-adaptor-shield": "0.3.0-alpha.3",
26
26
  "@provablehq/aleo-wallet-standard": "0.3.0-alpha.3",
27
27
  "@provablehq/aleo-types": "0.3.0-alpha.3",
28
- "@dynamic-labs/logger": "4.83.1",
29
- "@dynamic-labs/types": "4.83.1",
30
- "@dynamic-labs/utils": "4.83.1",
31
- "@dynamic-labs/waas": "4.83.1",
32
- "@dynamic-labs/wallet-book": "4.83.1",
33
- "@dynamic-labs/wallet-connector-core": "4.83.1"
28
+ "@dynamic-labs/logger": "4.84.0",
29
+ "@dynamic-labs/types": "4.84.0",
30
+ "@dynamic-labs/utils": "4.84.0",
31
+ "@dynamic-labs/waas": "4.84.0",
32
+ "@dynamic-labs/wallet-book": "4.84.0",
33
+ "@dynamic-labs/wallet-connector-core": "4.84.0"
34
34
  },
35
35
  "peerDependencies": {}
36
36
  }
@@ -233,6 +233,18 @@ class DynamicWaasAleoConnector extends waas.withDynamicWaas(WaasAleoWalletConnec
233
233
  // prevents the hook from re-shielding the just-unshielded amount before
234
234
  // step 2 spends it. Add on Exchange entry, remove in `finally`.
235
235
  this.tokensPendingExchange = new Set();
236
+ // In-flight shield broadcasts keyed by `${activeAccountAddress}:${programId}`.
237
+ // Multiple call sites (the widget's manual CTA, the auto-shield hook,
238
+ // external SDK consumers) can race for the same shield op — clicking
239
+ // Shield Manually while the auto-shield hook is mid-broadcast for the
240
+ // same token used to fire two `transfer_public_to_private` ceremonies,
241
+ // resulting in one successful and one rejected transaction on-chain.
242
+ // We dedupe at the connector layer so every caller (manual, auto, third
243
+ // party) shares the same promise and emits the same `txId` for a single
244
+ // underlying broadcast. The entry is cleared in `finally`, so a
245
+ // *subsequent* shield of the same token (e.g. a new unshielded balance
246
+ // arriving after the first broadcast finalizes) is allowed.
247
+ this.inFlightShieldByKey = new Map();
236
248
  this.walletUiUtils = props.walletUiUtils;
237
249
  }
238
250
  setVerifiedCredentials(verifiedCredentials) {
@@ -836,10 +848,39 @@ class DynamicWaasAleoConnector extends waas.withDynamicWaas(WaasAleoWalletConnec
836
848
  if (!token) {
837
849
  throw new utils.DynamicError(`shieldToken: ${args.tokenAddress} is not a registered shieldable Aleo token on the current network.`);
838
850
  }
851
+ // Dedup by `(activeAccountAddress, programId)`. We deliberately ignore
852
+ // `args.amount` in the key — if two call sites race, they're reading
853
+ // the same unshielded balance and both want the same outcome; sharing
854
+ // the in-flight promise prevents one successful + one rejected
855
+ // broadcast (the rejected one would fail in the validator anyway once
856
+ // the first consumed the public balance, but it still wastes a
857
+ // Provable prove and a network round-trip).
858
+ const fromAddress = this.activeAccountAddress;
859
+ const dedupKey = `${fromAddress}:${token.programId}`;
860
+ const inFlight = this.inFlightShieldByKey.get(dedupKey);
861
+ if (inFlight)
862
+ return inFlight;
863
+ const dispatch = this.dispatchShieldBroadcast(token, args.amount, fromAddress).finally(() => {
864
+ this.inFlightShieldByKey.delete(dedupKey);
865
+ });
866
+ this.inFlightShieldByKey.set(dedupKey, dispatch);
867
+ return dispatch;
868
+ });
869
+ }
870
+ /**
871
+ * Builds the shield inputs, proves + broadcasts, and unwraps the txId.
872
+ * Pulled out of `shieldToken` so the dedup wrapper around it stays small.
873
+ * Throws via `DynamicError` if the relay accepts the broadcast but does
874
+ * not return a txId — `shieldToken`'s dedup map cleanup handles the
875
+ * rejection via `.finally()` (the failed entry is evicted so retries are
876
+ * allowed).
877
+ */
878
+ dispatchShieldBroadcast(token, amount, fromAddress) {
879
+ return _tslib.__awaiter(this, void 0, void 0, function* () {
839
880
  const { functionName, inputs, inputTypes } = buildShieldInputs({
840
- to: this.activeAccountAddress,
881
+ to: fromAddress,
841
882
  token,
842
- value: args.amount,
883
+ value: amount,
843
884
  });
844
885
  const result = yield this.proveTransaction({
845
886
  broadcast: true,
@@ -23,12 +23,12 @@ declare const DynamicWaasAleoConnector_base: (abstract new (...args: any[]) => {
23
23
  isEmbeddedWallet: boolean;
24
24
  getSignedSessionId?: (() => Promise<string>) | undefined;
25
25
  getMfaToken?: ((props?: {
26
- mfaAction?: import("@dynamic-labs/sdk-api-core").MFAAction | undefined;
26
+ mfaAction?: import("@dynamic-labs-sdk/client").MFAAction | undefined;
27
27
  } | undefined) => Promise<string | undefined>) | undefined;
28
28
  getWalletPassword?: import("@dynamic-labs/wallet-connector-core").GetWalletPasswordFn | undefined;
29
29
  getAuthToken?: (() => string) | undefined;
30
30
  getElevatedAccessToken?: ((props: {
31
- scope: import("@dynamic-labs/sdk-api-core").TokenScope;
31
+ scope: import("@dynamic-labs-sdk/client").TokenScope;
32
32
  }) => Promise<string | undefined>) | undefined;
33
33
  environmentId?: string | undefined;
34
34
  baseApiUrl?: string | undefined;
@@ -43,10 +43,10 @@ declare const DynamicWaasAleoConnector_base: (abstract new (...args: any[]) => {
43
43
  setGetAuthTokenFunction(getAuthToken: () => string): void;
44
44
  setWaasAuthMode(authMode: "cookie" | "header"): void;
45
45
  setGetMfaTokenFunction(getMfaToken: (props?: {
46
- mfaAction?: import("@dynamic-labs/sdk-api-core").MFAAction | undefined;
46
+ mfaAction?: import("@dynamic-labs-sdk/client").MFAAction | undefined;
47
47
  } | undefined) => Promise<string | undefined>): void;
48
48
  setGetElevatedAccessTokenFunction(getElevatedAccessToken: (params: {
49
- scope: import("@dynamic-labs/sdk-api-core").TokenScope;
49
+ scope: import("@dynamic-labs-sdk/client").TokenScope;
50
50
  }) => Promise<string | undefined>): void;
51
51
  setGetWalletPasswordFunction(getWalletPassword: import("@dynamic-labs/wallet-connector-core").GetWalletPasswordFn): void;
52
52
  getPasswordIfNeeded({ accountAddress, }: {
@@ -176,6 +176,7 @@ export declare class DynamicWaasAleoConnector extends DynamicWaasAleoConnector_b
176
176
  verifiedCredentials: JwtVerifiedCredential[] | undefined;
177
177
  protected walletUiUtils: WalletUiUtils<InternalWalletConnector>;
178
178
  private readonly tokensPendingExchange;
179
+ private readonly inFlightShieldByKey;
179
180
  constructor(props: DynamicWaasAleoConnectorProps);
180
181
  setVerifiedCredentials(verifiedCredentials: JwtVerifiedCredential[]): void;
181
182
  getWalletClientByAddress({ accountAddress, }: {
@@ -404,6 +405,15 @@ export declare class DynamicWaasAleoConnector extends DynamicWaasAleoConnector_b
404
405
  isNative?: boolean;
405
406
  amount: bigint;
406
407
  }): Promise<string>;
408
+ /**
409
+ * Builds the shield inputs, proves + broadcasts, and unwraps the txId.
410
+ * Pulled out of `shieldToken` so the dedup wrapper around it stays small.
411
+ * Throws via `DynamicError` if the relay accepts the broadcast but does
412
+ * not return a txId — `shieldToken`'s dedup map cleanup handles the
413
+ * rejection via `.finally()` (the failed entry is evicted so retries are
414
+ * allowed).
415
+ */
416
+ private dispatchShieldBroadcast;
407
417
  /**
408
418
  * Two-step Exchange transfer.
409
419
  *
@@ -229,6 +229,18 @@ class DynamicWaasAleoConnector extends withDynamicWaas(WaasAleoWalletConnector)
229
229
  // prevents the hook from re-shielding the just-unshielded amount before
230
230
  // step 2 spends it. Add on Exchange entry, remove in `finally`.
231
231
  this.tokensPendingExchange = new Set();
232
+ // In-flight shield broadcasts keyed by `${activeAccountAddress}:${programId}`.
233
+ // Multiple call sites (the widget's manual CTA, the auto-shield hook,
234
+ // external SDK consumers) can race for the same shield op — clicking
235
+ // Shield Manually while the auto-shield hook is mid-broadcast for the
236
+ // same token used to fire two `transfer_public_to_private` ceremonies,
237
+ // resulting in one successful and one rejected transaction on-chain.
238
+ // We dedupe at the connector layer so every caller (manual, auto, third
239
+ // party) shares the same promise and emits the same `txId` for a single
240
+ // underlying broadcast. The entry is cleared in `finally`, so a
241
+ // *subsequent* shield of the same token (e.g. a new unshielded balance
242
+ // arriving after the first broadcast finalizes) is allowed.
243
+ this.inFlightShieldByKey = new Map();
232
244
  this.walletUiUtils = props.walletUiUtils;
233
245
  }
234
246
  setVerifiedCredentials(verifiedCredentials) {
@@ -832,10 +844,39 @@ class DynamicWaasAleoConnector extends withDynamicWaas(WaasAleoWalletConnector)
832
844
  if (!token) {
833
845
  throw new DynamicError(`shieldToken: ${args.tokenAddress} is not a registered shieldable Aleo token on the current network.`);
834
846
  }
847
+ // Dedup by `(activeAccountAddress, programId)`. We deliberately ignore
848
+ // `args.amount` in the key — if two call sites race, they're reading
849
+ // the same unshielded balance and both want the same outcome; sharing
850
+ // the in-flight promise prevents one successful + one rejected
851
+ // broadcast (the rejected one would fail in the validator anyway once
852
+ // the first consumed the public balance, but it still wastes a
853
+ // Provable prove and a network round-trip).
854
+ const fromAddress = this.activeAccountAddress;
855
+ const dedupKey = `${fromAddress}:${token.programId}`;
856
+ const inFlight = this.inFlightShieldByKey.get(dedupKey);
857
+ if (inFlight)
858
+ return inFlight;
859
+ const dispatch = this.dispatchShieldBroadcast(token, args.amount, fromAddress).finally(() => {
860
+ this.inFlightShieldByKey.delete(dedupKey);
861
+ });
862
+ this.inFlightShieldByKey.set(dedupKey, dispatch);
863
+ return dispatch;
864
+ });
865
+ }
866
+ /**
867
+ * Builds the shield inputs, proves + broadcasts, and unwraps the txId.
868
+ * Pulled out of `shieldToken` so the dedup wrapper around it stays small.
869
+ * Throws via `DynamicError` if the relay accepts the broadcast but does
870
+ * not return a txId — `shieldToken`'s dedup map cleanup handles the
871
+ * rejection via `.finally()` (the failed entry is evicted so retries are
872
+ * allowed).
873
+ */
874
+ dispatchShieldBroadcast(token, amount, fromAddress) {
875
+ return __awaiter(this, void 0, void 0, function* () {
835
876
  const { functionName, inputs, inputTypes } = buildShieldInputs({
836
- to: this.activeAccountAddress,
877
+ to: fromAddress,
837
878
  token,
838
- value: args.amount,
879
+ value: amount,
839
880
  });
840
881
  const result = yield this.proveTransaction({
841
882
  broadcast: true,
@@ -262,6 +262,7 @@ class AleoUiTransaction {
262
262
  .reduce((acc, r) => acc + aleoSendableTokens.extractRecordAtomicAmount(r, token), BigInt(0));
263
263
  const divisor = Number(pow10(token.decimals));
264
264
  const rawBalance = Number(sumAtomic);
265
+ const rawBalanceString = sumAtomic.toString();
265
266
  return {
266
267
  address: token.contractAddress,
267
268
  balance: rawBalance / divisor,
@@ -280,6 +281,7 @@ class AleoUiTransaction {
280
281
  logoURI: (_a = token.logoURI) !== null && _a !== void 0 ? _a : '',
281
282
  name: token.name,
282
283
  rawBalance,
284
+ rawBalanceString,
283
285
  symbol: token.symbol,
284
286
  };
285
287
  });
@@ -258,6 +258,7 @@ class AleoUiTransaction {
258
258
  .reduce((acc, r) => acc + extractRecordAtomicAmount(r, token), BigInt(0));
259
259
  const divisor = Number(pow10(token.decimals));
260
260
  const rawBalance = Number(sumAtomic);
261
+ const rawBalanceString = sumAtomic.toString();
261
262
  return {
262
263
  address: token.contractAddress,
263
264
  balance: rawBalance / divisor,
@@ -276,6 +277,7 @@ class AleoUiTransaction {
276
277
  logoURI: (_a = token.logoURI) !== null && _a !== void 0 ? _a : '',
277
278
  name: token.name,
278
279
  rawBalance,
280
+ rawBalanceString,
279
281
  symbol: token.symbol,
280
282
  };
281
283
  });