@sundaeswap/wallet-lite 0.1.1 → 0.1.4

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/classes/ReadOnlyProvider.Blockfrost.class.js +155 -22
  2. package/dist/cjs/classes/ReadOnlyProvider.Blockfrost.class.js.map +1 -1
  3. package/dist/cjs/classes/WalletObserver.class.js +105 -17
  4. package/dist/cjs/classes/WalletObserver.class.js.map +1 -1
  5. package/dist/cjs/react-components/RenderWallet.js +2 -1
  6. package/dist/cjs/react-components/RenderWallet.js.map +1 -1
  7. package/dist/cjs/react-components/RenderWalletHandles.js +2 -1
  8. package/dist/cjs/react-components/RenderWalletHandles.js.map +1 -1
  9. package/dist/cjs/react-components/RenderWalletPeerConnect.js +2 -1
  10. package/dist/cjs/react-components/RenderWalletPeerConnect.js.map +1 -1
  11. package/dist/cjs/react-components/RenderWalletState.js +2 -1
  12. package/dist/cjs/react-components/RenderWalletState.js.map +1 -1
  13. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js +60 -3
  14. package/dist/cjs/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  15. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js +3 -1
  16. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js.map +1 -1
  17. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js +24 -4
  18. package/dist/cjs/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js.map +1 -1
  19. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +38 -36
  20. package/dist/cjs/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  21. package/dist/cjs/react-components/contexts/observer/context.js +40 -1
  22. package/dist/cjs/react-components/contexts/observer/context.js.map +1 -1
  23. package/dist/cjs/react-components/contexts/observer/types.js.map +1 -1
  24. package/dist/cjs/react-components/hooks/useWalletData.js +6 -5
  25. package/dist/cjs/react-components/hooks/useWalletData.js.map +1 -1
  26. package/dist/cjs/react-components/hooks/useWalletHandles.js +11 -7
  27. package/dist/cjs/react-components/hooks/useWalletHandles.js.map +1 -1
  28. package/dist/cjs/react-components/hooks/useWalletLoadingState.js +6 -7
  29. package/dist/cjs/react-components/hooks/useWalletLoadingState.js.map +1 -1
  30. package/dist/cjs/react-components/hooks/useWalletPeerConnect.js +18 -12
  31. package/dist/cjs/react-components/hooks/useWalletPeerConnect.js.map +1 -1
  32. package/dist/esm/classes/ReadOnlyProvider.Blockfrost.class.js +50 -8
  33. package/dist/esm/classes/ReadOnlyProvider.Blockfrost.class.js.map +1 -1
  34. package/dist/esm/classes/WalletObserver.class.js +79 -1
  35. package/dist/esm/classes/WalletObserver.class.js.map +1 -1
  36. package/dist/esm/react-components/RenderWallet.js +3 -2
  37. package/dist/esm/react-components/RenderWallet.js.map +1 -1
  38. package/dist/esm/react-components/RenderWalletHandles.js +3 -2
  39. package/dist/esm/react-components/RenderWalletHandles.js.map +1 -1
  40. package/dist/esm/react-components/RenderWalletPeerConnect.js +3 -2
  41. package/dist/esm/react-components/RenderWalletPeerConnect.js.map +1 -1
  42. package/dist/esm/react-components/RenderWalletState.js +3 -2
  43. package/dist/esm/react-components/RenderWalletState.js.map +1 -1
  44. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js +55 -4
  45. package/dist/esm/react-components/WalletObserverProvider/WalletObserverProvider.js.map +1 -1
  46. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js +1 -1
  47. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useDerivedState.js.map +1 -1
  48. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js +2 -2
  49. package/dist/esm/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.js.map +1 -1
  50. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js +4 -4
  51. package/dist/esm/react-components/WalletObserverProvider/hooks/useWalletObserverState.js.map +1 -1
  52. package/dist/esm/react-components/contexts/observer/context.js +36 -0
  53. package/dist/esm/react-components/contexts/observer/context.js.map +1 -1
  54. package/dist/esm/react-components/contexts/observer/types.js.map +1 -1
  55. package/dist/esm/react-components/hooks/useWalletData.js +7 -5
  56. package/dist/esm/react-components/hooks/useWalletData.js.map +1 -1
  57. package/dist/esm/react-components/hooks/useWalletHandles.js +11 -5
  58. package/dist/esm/react-components/hooks/useWalletHandles.js.map +1 -1
  59. package/dist/esm/react-components/hooks/useWalletLoadingState.js +7 -9
  60. package/dist/esm/react-components/hooks/useWalletLoadingState.js.map +1 -1
  61. package/dist/esm/react-components/hooks/useWalletPeerConnect.js +14 -11
  62. package/dist/esm/react-components/hooks/useWalletPeerConnect.js.map +1 -1
  63. package/dist/types/classes/ReadOnlyProvider.Blockfrost.class.d.ts +2 -0
  64. package/dist/types/classes/ReadOnlyProvider.Blockfrost.class.d.ts.map +1 -1
  65. package/dist/types/classes/WalletObserver.class.d.ts +11 -0
  66. package/dist/types/classes/WalletObserver.class.d.ts.map +1 -1
  67. package/dist/types/react-components/RenderWallet.d.ts +0 -6
  68. package/dist/types/react-components/RenderWallet.d.ts.map +1 -1
  69. package/dist/types/react-components/RenderWalletHandles.d.ts +0 -5
  70. package/dist/types/react-components/RenderWalletHandles.d.ts.map +1 -1
  71. package/dist/types/react-components/RenderWalletPeerConnect.d.ts +0 -5
  72. package/dist/types/react-components/RenderWalletPeerConnect.d.ts.map +1 -1
  73. package/dist/types/react-components/RenderWalletState.d.ts +1 -7
  74. package/dist/types/react-components/RenderWalletState.d.ts.map +1 -1
  75. package/dist/types/react-components/WalletObserverProvider/WalletObserverProvider.d.ts.map +1 -1
  76. package/dist/types/react-components/WalletObserverProvider/hooks/effects/useDerivedState.d.ts.map +1 -1
  77. package/dist/types/react-components/WalletObserverProvider/hooks/useWalletObserverState.d.ts.map +1 -1
  78. package/dist/types/react-components/contexts/observer/context.d.ts +16 -1
  79. package/dist/types/react-components/contexts/observer/context.d.ts.map +1 -1
  80. package/dist/types/react-components/contexts/observer/types.d.ts +48 -1
  81. package/dist/types/react-components/contexts/observer/types.d.ts.map +1 -1
  82. package/dist/types/react-components/hooks/useWalletHandles.d.ts.map +1 -1
  83. package/dist/types/react-components/hooks/useWalletLoadingState.d.ts +1 -2
  84. package/dist/types/react-components/hooks/useWalletLoadingState.d.ts.map +1 -1
  85. package/dist/types/react-components/hooks/useWalletPeerConnect.d.ts.map +1 -1
  86. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  87. package/package.json +3 -3
  88. package/src/classes/ReadOnlyProvider.Blockfrost.class.ts +76 -11
  89. package/src/classes/WalletObserver.class.ts +97 -1
  90. package/src/react-components/RenderWallet.tsx +4 -2
  91. package/src/react-components/RenderWalletHandles.tsx +6 -2
  92. package/src/react-components/RenderWalletPeerConnect.tsx +6 -2
  93. package/src/react-components/RenderWalletState.tsx +8 -4
  94. package/src/react-components/WalletObserverProvider/WalletObserverProvider.tsx +92 -4
  95. package/src/react-components/WalletObserverProvider/hooks/effects/useDerivedState.ts +5 -2
  96. package/src/react-components/WalletObserverProvider/hooks/effects/useSyncWalletWithInterval.ts +2 -2
  97. package/src/react-components/WalletObserverProvider/hooks/useWalletObserverState.ts +67 -37
  98. package/src/react-components/contexts/observer/context.ts +71 -1
  99. package/src/react-components/contexts/observer/types.ts +57 -1
  100. package/src/react-components/hooks/useWalletData.ts +5 -5
  101. package/src/react-components/hooks/useWalletHandles.ts +13 -8
  102. package/src/react-components/hooks/useWalletLoadingState.ts +13 -11
  103. package/src/react-components/hooks/useWalletPeerConnect.tsx +20 -11
@@ -10,12 +10,21 @@ export class ReadOnlyBlockfrostProvider {
10
10
  _defineProperty(this, "api", void 0);
11
11
  this.blockfrostProjectId = blockfrostProjectId;
12
12
  }
13
+ __networkName(network) {
14
+ if (network === 1) return "mainnet";
15
+ if (this.blockfrostProjectId.startsWith("preprod")) return "preprod";
16
+ return "preview";
17
+ }
13
18
  async getBalance(address, network) {
14
- const result = await fetch(`https://cardano-${network ? "mainnet" : "preview"}.blockfrost.io/api/v0/addresses/${address}`, {
19
+ const response = await fetch(`https://cardano-${this.__networkName(network)}.blockfrost.io/api/v0/addresses/${address}`, {
15
20
  headers: {
16
21
  project_id: this.blockfrostProjectId
17
22
  }
18
- }).then(res => res.json());
23
+ });
24
+ const result = await response.json();
25
+ if (!response.ok || "error" in result) {
26
+ throw new Error(`Blockfrost getBalance failed: ${result.message || result.error || response.statusText}`);
27
+ }
19
28
 
20
29
  // Build our value.
21
30
  const value = this.__getValueFromAmount(result.amount);
@@ -23,16 +32,49 @@ export class ReadOnlyBlockfrostProvider {
23
32
  // Return the cbor.
24
33
  return value.toCbor();
25
34
  }
26
- async getUtxos(address, network) {
27
- const result = await fetch(`https://cardano-${network ? "mainnet" : "preview"}.blockfrost.io/api/v0/addresses/${address}/utxos`, {
35
+ async __fetchUtxoPage(address, network, page) {
36
+ const response = await fetch(`https://cardano-${this.__networkName(network)}.blockfrost.io/api/v0/addresses/${address}/utxos?count=100&page=${page}`, {
28
37
  headers: {
29
38
  project_id: this.blockfrostProjectId
30
39
  }
31
- }).then(res => res.json());
32
- if ("error" in result) {
33
- return [];
40
+ });
41
+ const result = await response.json();
42
+ if (!response.ok || "error" in result) {
43
+ if (page > 1) return null;
44
+ throw new Error(`Blockfrost getUtxos failed: ${result.message || result.error || response.statusText}`);
45
+ }
46
+ return result;
47
+ }
48
+ async getUtxos(address, network) {
49
+ const PAGE_SIZE = 100;
50
+ const BATCH_SIZE = 5;
51
+ const firstPage = await this.__fetchUtxoPage(address, network, 1);
52
+ if (!firstPage || firstPage.length === 0) return [];
53
+ const allResults = [...firstPage];
54
+ if (firstPage.length === PAGE_SIZE) {
55
+ let batchStart = 2;
56
+ while (true) {
57
+ const pageNums = Array.from({
58
+ length: BATCH_SIZE
59
+ }, (_, i) => batchStart + i);
60
+ const pages = await Promise.all(pageNums.map(p => this.__fetchUtxoPage(address, network, p)));
61
+ let done = false;
62
+ for (const page of pages) {
63
+ if (!page || page.length === 0) {
64
+ done = true;
65
+ break;
66
+ }
67
+ allResults.push(...page);
68
+ if (page.length < PAGE_SIZE) {
69
+ done = true;
70
+ break;
71
+ }
72
+ }
73
+ if (done) break;
74
+ batchStart += BATCH_SIZE;
75
+ }
34
76
  }
35
- const formatted = result.map(r => {
77
+ const formatted = allResults.map(r => {
36
78
  return Serialization.TransactionUnspentOutput.fromCore([Serialization.TransactionInput.fromCore({
37
79
  index: r.output_index,
38
80
  txId: Cardano.TransactionId(r.tx_hash)
@@ -1 +1 @@
1
- {"version":3,"file":"ReadOnlyProvider.Blockfrost.class.js","names":["Cardano","Serialization","Hash32ByteBase16","HexBlob","ReadOnlyBlockfrostProvider","constructor","blockfrostProjectId","_defineProperty","getBalance","address","network","result","fetch","headers","project_id","then","res","json","value","__getValueFromAmount","amount","toCbor","getUtxos","formatted","map","r","TransactionUnspentOutput","fromCore","TransactionInput","index","output_index","txId","TransactionId","tx_hash","toCore","TransactionOutput","PaymentAddress","datum","inline_datum","PlutusData","fromCbor","undefined","datumHash","data_hash","unit","quantity","lovelace","find","a","assets","filter","tokenMap","Map","forEach","asset","matchingEntry","get","AssetId","set","BigInt","Value","coins"],"sources":["../../../src/classes/ReadOnlyProvider.Blockfrost.class.ts"],"sourcesContent":["import type { BlockFrostAPI, Responses } from \"@blockfrost/blockfrost-js\";\nimport { Cardano, Serialization } from \"@cardano-sdk/core\";\nimport { Hash32ByteBase16 } from \"@cardano-sdk/crypto\";\n\nimport { HexBlob } from \"@cardano-sdk/util\";\nimport { ReadOnlyProvider } from \"./ReadOnlyProvider.Abstract.class.js\";\n\nexport class ReadOnlyBlockfrostProvider implements ReadOnlyProvider {\n blockfrostProjectId: string;\n api?: BlockFrostAPI;\n\n constructor(blockfrostProjectId: string) {\n this.blockfrostProjectId = blockfrostProjectId;\n }\n\n async getBalance(address: string, network: 0 | 1) {\n const result: Responses[\"address_content\"] = await fetch(\n `https://cardano-${network ? \"mainnet\" : \"preview\"}.blockfrost.io/api/v0/addresses/${address}`,\n {\n headers: {\n project_id: this.blockfrostProjectId,\n },\n },\n ).then((res) => res.json());\n\n // Build our value.\n const value = this.__getValueFromAmount(result.amount);\n\n // Return the cbor.\n return value.toCbor();\n }\n\n async getUtxos(address: string, network: 0 | 1) {\n const result: Responses[\"address_utxo_content\"] = await fetch(\n `https://cardano-${network ? \"mainnet\" : \"preview\"}.blockfrost.io/api/v0/addresses/${address}/utxos`,\n {\n headers: {\n project_id: this.blockfrostProjectId,\n },\n },\n ).then((res) => res.json());\n\n if (\"error\" in result) {\n return [];\n }\n\n const formatted = result.map((r) => {\n return Serialization.TransactionUnspentOutput.fromCore([\n Serialization.TransactionInput.fromCore({\n index: r.output_index,\n txId: Cardano.TransactionId(r.tx_hash),\n }).toCore(),\n Serialization.TransactionOutput.fromCore({\n address: Cardano.PaymentAddress(r.address),\n value: this.__getValueFromAmount(r.amount).toCore(),\n datum: r.inline_datum\n ? Serialization.PlutusData.fromCbor(\n HexBlob(r.inline_datum),\n ).toCore()\n : undefined,\n datumHash: r.data_hash ? Hash32ByteBase16(r.data_hash) : undefined,\n }).toCore(),\n ]).toCbor();\n });\n\n return formatted;\n }\n\n private __getValueFromAmount(amount?: { unit: string; quantity: string }[]) {\n if (!amount) {\n amount = [\n {\n unit: \"lovelace\",\n quantity: \"0\",\n },\n ];\n }\n\n const lovelace = amount.find((a) => a.unit === \"lovelace\");\n const assets = amount.filter((a) => a.unit !== \"lovelace\");\n\n // Build our token map.\n const tokenMap = new Map<Cardano.AssetId, bigint>();\n assets.forEach((asset) => {\n const matchingEntry = tokenMap.get(Cardano.AssetId(asset.unit)) || 0n;\n tokenMap.set(\n Cardano.AssetId(asset.unit),\n BigInt(asset.quantity) + matchingEntry,\n );\n });\n\n // Build our value.\n const value = Serialization.Value.fromCore({\n coins: BigInt(lovelace?.quantity || 0),\n assets: tokenMap,\n });\n\n return value;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ReadOnlyProvider.Blockfrost.class.js","names":["Cardano","Serialization","Hash32ByteBase16","HexBlob","ReadOnlyBlockfrostProvider","constructor","blockfrostProjectId","_defineProperty","__networkName","network","startsWith","getBalance","address","response","fetch","headers","project_id","result","json","ok","Error","message","error","statusText","value","__getValueFromAmount","amount","toCbor","__fetchUtxoPage","page","getUtxos","PAGE_SIZE","BATCH_SIZE","firstPage","length","allResults","batchStart","pageNums","Array","from","_","i","pages","Promise","all","map","p","done","push","formatted","r","TransactionUnspentOutput","fromCore","TransactionInput","index","output_index","txId","TransactionId","tx_hash","toCore","TransactionOutput","PaymentAddress","datum","inline_datum","PlutusData","fromCbor","undefined","datumHash","data_hash","unit","quantity","lovelace","find","a","assets","filter","tokenMap","Map","forEach","asset","matchingEntry","get","AssetId","set","BigInt","Value","coins"],"sources":["../../../src/classes/ReadOnlyProvider.Blockfrost.class.ts"],"sourcesContent":["import type { BlockFrostAPI, Responses } from \"@blockfrost/blockfrost-js\";\nimport { Cardano, Serialization } from \"@cardano-sdk/core\";\nimport { Hash32ByteBase16 } from \"@cardano-sdk/crypto\";\n\nimport { HexBlob } from \"@cardano-sdk/util\";\nimport { ReadOnlyProvider } from \"./ReadOnlyProvider.Abstract.class.js\";\n\nexport class ReadOnlyBlockfrostProvider implements ReadOnlyProvider {\n blockfrostProjectId: string;\n api?: BlockFrostAPI;\n\n constructor(blockfrostProjectId: string) {\n this.blockfrostProjectId = blockfrostProjectId;\n }\n\n private __networkName(network: 0 | 1): string {\n if (network === 1) return \"mainnet\";\n if (this.blockfrostProjectId.startsWith(\"preprod\")) return \"preprod\";\n return \"preview\";\n }\n\n async getBalance(address: string, network: 0 | 1) {\n const response = await fetch(\n `https://cardano-${this.__networkName(network)}.blockfrost.io/api/v0/addresses/${address}`,\n {\n headers: {\n project_id: this.blockfrostProjectId,\n },\n },\n );\n\n const result = await response.json();\n\n if (!response.ok || \"error\" in result) {\n throw new Error(\n `Blockfrost getBalance failed: ${result.message || result.error || response.statusText}`,\n );\n }\n\n // Build our value.\n const value = this.__getValueFromAmount(\n (result as Responses[\"address_content\"]).amount,\n );\n\n // Return the cbor.\n return value.toCbor();\n }\n\n private async __fetchUtxoPage(\n address: string,\n network: 0 | 1,\n page: number,\n ): Promise<Responses[\"address_utxo_content\"] | null> {\n const response = await fetch(\n `https://cardano-${this.__networkName(network)}.blockfrost.io/api/v0/addresses/${address}/utxos?count=100&page=${page}`,\n {\n headers: {\n project_id: this.blockfrostProjectId,\n },\n },\n );\n\n const result = await response.json();\n\n if (!response.ok || \"error\" in result) {\n if (page > 1) return null;\n throw new Error(\n `Blockfrost getUtxos failed: ${result.message || result.error || response.statusText}`,\n );\n }\n\n return result as Responses[\"address_utxo_content\"];\n }\n\n async getUtxos(address: string, network: 0 | 1) {\n const PAGE_SIZE = 100;\n const BATCH_SIZE = 5;\n\n const firstPage = await this.__fetchUtxoPage(address, network, 1);\n if (!firstPage || firstPage.length === 0) return [];\n\n const allResults: Responses[\"address_utxo_content\"] = [...firstPage];\n\n if (firstPage.length === PAGE_SIZE) {\n let batchStart = 2;\n while (true) {\n const pageNums = Array.from(\n { length: BATCH_SIZE },\n (_, i) => batchStart + i,\n );\n const pages = await Promise.all(\n pageNums.map((p) => this.__fetchUtxoPage(address, network, p)),\n );\n\n let done = false;\n for (const page of pages) {\n if (!page || page.length === 0) {\n done = true;\n break;\n }\n allResults.push(...page);\n if (page.length < PAGE_SIZE) {\n done = true;\n break;\n }\n }\n if (done) break;\n batchStart += BATCH_SIZE;\n }\n }\n\n const formatted = allResults.map((r) => {\n return Serialization.TransactionUnspentOutput.fromCore([\n Serialization.TransactionInput.fromCore({\n index: r.output_index,\n txId: Cardano.TransactionId(r.tx_hash),\n }).toCore(),\n Serialization.TransactionOutput.fromCore({\n address: Cardano.PaymentAddress(r.address),\n value: this.__getValueFromAmount(r.amount).toCore(),\n datum: r.inline_datum\n ? Serialization.PlutusData.fromCbor(\n HexBlob(r.inline_datum),\n ).toCore()\n : undefined,\n datumHash: r.data_hash ? Hash32ByteBase16(r.data_hash) : undefined,\n }).toCore(),\n ]).toCbor();\n });\n\n return formatted;\n }\n\n private __getValueFromAmount(amount?: { unit: string; quantity: string }[]) {\n if (!amount) {\n amount = [\n {\n unit: \"lovelace\",\n quantity: \"0\",\n },\n ];\n }\n\n const lovelace = amount.find((a) => a.unit === \"lovelace\");\n const assets = amount.filter((a) => a.unit !== \"lovelace\");\n\n // Build our token map.\n const tokenMap = new Map<Cardano.AssetId, bigint>();\n assets.forEach((asset) => {\n const matchingEntry = tokenMap.get(Cardano.AssetId(asset.unit)) || 0n;\n tokenMap.set(\n Cardano.AssetId(asset.unit),\n BigInt(asset.quantity) + matchingEntry,\n );\n });\n\n // Build our value.\n const value = Serialization.Value.fromCore({\n coins: BigInt(lovelace?.quantity || 0),\n assets: tokenMap,\n });\n\n return value;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -43,9 +43,18 @@ export class WalletObserver extends WalletObserverEvent {
43
43
  _defineProperty(this, "utils", void 0);
44
44
  _defineProperty(this, "peerConnectInstance", void 0);
45
45
  _defineProperty(this, "_performingSync", false);
46
+ _defineProperty(this, "_syncQueue", Promise.resolve());
46
47
  _defineProperty(this, "_options", void 0);
47
48
  // Caching
48
49
  _defineProperty(this, "_cachedMetadata", new Map());
50
+ _defineProperty(this, "_lastBalanceCbor", null);
51
+ _defineProperty(this, "_lastBalanceMap", null);
52
+ _defineProperty(this, "_lastUsedAddressesCbor", null);
53
+ _defineProperty(this, "_lastUsedAddresses", null);
54
+ _defineProperty(this, "_lastUnusedAddressesCbor", null);
55
+ _defineProperty(this, "_lastUnusedAddresses", null);
56
+ _defineProperty(this, "_lastChangeAddressCbor", null);
57
+ _defineProperty(this, "_lastChangeAddress", null);
49
58
  // AbortController for cancelling in-flight metadata fetches when metadataResolver changes
50
59
  _defineProperty(this, "_metadataAbortController", null);
51
60
  /**
@@ -60,7 +69,14 @@ export class WalletObserver extends WalletObserverEvent {
60
69
  *
61
70
  * @returns {Promise<IWalletObserverSync<AssetMetadata>>} - A promise that resolves to the wallet sync data.
62
71
  */
63
- _defineProperty(this, "sync", async () => {
72
+ _defineProperty(this, "sync", () => {
73
+ const pending = this._syncQueue.then(() => this._doSync());
74
+ // Chain onto queue but swallow rejections in the queue itself
75
+ // so a failed sync doesn't block subsequent syncs.
76
+ this._syncQueue = pending.catch(() => {});
77
+ return pending;
78
+ });
79
+ _defineProperty(this, "_doSync", async () => {
64
80
  if (!this.api) {
65
81
  throw new Error("Attempted to perform a sync operation without a connected wallet.");
66
82
  }
@@ -176,6 +192,8 @@ export class WalletObserver extends WalletObserverEvent {
176
192
  if (metadataResolverChanged) {
177
193
  this._metadataAbortController?.abort();
178
194
  this._cachedMetadata = new Map();
195
+ this._lastBalanceCbor = null;
196
+ this._lastBalanceMap = null;
179
197
 
180
198
  // Trigger a new sync if there's an active connection
181
199
  if (this.hasActiveConnection() && !this._performingSync) {
@@ -273,6 +291,8 @@ export class WalletObserver extends WalletObserverEvent {
273
291
  this._metadataAbortController?.abort();
274
292
  // Clear the cache
275
293
  this._cachedMetadata = new Map();
294
+ this._lastBalanceCbor = null;
295
+ this._lastBalanceMap = null;
276
296
 
277
297
  // Trigger a new sync if there's an active connection
278
298
  if (this.hasActiveConnection()) {
@@ -284,9 +304,20 @@ export class WalletObserver extends WalletObserverEvent {
284
304
  *
285
305
  * @returns {void}
286
306
  */
307
+ _defineProperty(this, "_clearSyncCaches", () => {
308
+ this._lastBalanceCbor = null;
309
+ this._lastBalanceMap = null;
310
+ this._lastUsedAddressesCbor = null;
311
+ this._lastUsedAddresses = null;
312
+ this._lastUnusedAddressesCbor = null;
313
+ this._lastUnusedAddresses = null;
314
+ this._lastChangeAddressCbor = null;
315
+ this._lastChangeAddress = null;
316
+ });
287
317
  _defineProperty(this, "disconnect", () => {
288
318
  this.activeWallet = undefined;
289
319
  this.api = undefined;
320
+ this._clearSyncCaches();
290
321
  window.localStorage.removeItem(WalletObserver.PERSISTENCE_CACHE_KEY);
291
322
  this.dispatch(EWalletObserverEvents.DISCONNECT);
292
323
  });
@@ -309,7 +340,18 @@ export class WalletObserver extends WalletObserverEvent {
309
340
  } catch (e) {
310
341
  return e;
311
342
  }
343
+
344
+ // Return cached if CBOR hasn't changed
345
+ if (cbor === this._lastChangeAddressCbor && this._lastChangeAddress) {
346
+ const end = performance.now();
347
+ if (this._options.debug) {
348
+ console.log(`getChangeAddress (cached): ${end - start}ms`);
349
+ }
350
+ return this._lastChangeAddress;
351
+ }
312
352
  const data = Cardano.Address.fromBytes(typedHex(cbor)).toBech32();
353
+ this._lastChangeAddressCbor = cbor;
354
+ this._lastChangeAddress = data;
313
355
  const end = performance.now();
314
356
  if (this._options.debug) {
315
357
  console.log(`getChangeAddress: ${end - start}ms`);
@@ -336,6 +378,18 @@ export class WalletObserver extends WalletObserverEvent {
336
378
  } catch (e) {
337
379
  return e;
338
380
  }
381
+
382
+ // Return cached map if CBOR hasn't changed
383
+ if (cbor === this._lastBalanceCbor && this._lastBalanceMap) {
384
+ this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_END, {
385
+ balanceMap: this._lastBalanceMap
386
+ });
387
+ const end = performance.now();
388
+ if (this._options.debug) {
389
+ console.log(`getBalanceMap (cached): ${end - start}ms`);
390
+ }
391
+ return this._lastBalanceMap;
392
+ }
339
393
  const data = Serialization.Value.fromCbor(typedHex(cbor));
340
394
  const multiassetKeys = data.multiasset()?.keys() ?? [];
341
395
  const metadata = await this.__metadataResolverWithCache([ADA_ASSET_ID, ...multiassetKeys]);
@@ -347,6 +401,8 @@ export class WalletObserver extends WalletObserverEvent {
347
401
  balanceMap.set(normalizeAssetIdWithDot(id), new AssetAmount(amount, metadata.get(normalizeAssetIdWithDot(id))));
348
402
  }
349
403
  }
404
+ this._lastBalanceCbor = cbor;
405
+ this._lastBalanceMap = balanceMap;
350
406
  this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_END, {
351
407
  balanceMap
352
408
  });
@@ -398,7 +454,18 @@ export class WalletObserver extends WalletObserverEvent {
398
454
  } catch (e) {
399
455
  return e;
400
456
  }
457
+
458
+ // Return cached if CBOR hasn't changed
459
+ if (this._lastUsedAddressesCbor && this._lastUsedAddresses && cbor.length === this._lastUsedAddressesCbor.length && cbor.every((v, i) => v === this._lastUsedAddressesCbor[i])) {
460
+ const end = performance.now();
461
+ if (this._options.debug) {
462
+ console.log(`getUsedAddresses (cached): ${end - start}ms`);
463
+ }
464
+ return this._lastUsedAddresses;
465
+ }
401
466
  const data = cbor.map(val => Cardano.Address.fromBytes(typedHex(val)).toBech32());
467
+ this._lastUsedAddressesCbor = cbor;
468
+ this._lastUsedAddresses = data;
402
469
  const end = performance.now();
403
470
  if (this._options.debug) {
404
471
  console.log(`getUsedAddresses: ${end - start}ms`);
@@ -424,7 +491,18 @@ export class WalletObserver extends WalletObserverEvent {
424
491
  } catch (e) {
425
492
  return e;
426
493
  }
494
+
495
+ // Return cached if CBOR hasn't changed
496
+ if (this._lastUnusedAddressesCbor && this._lastUnusedAddresses && cbor.length === this._lastUnusedAddressesCbor.length && cbor.every((v, i) => v === this._lastUnusedAddressesCbor[i])) {
497
+ const end = performance.now();
498
+ if (this._options.debug) {
499
+ console.log(`getUnusedAddresses (cached): ${end - start}ms`);
500
+ }
501
+ return this._lastUnusedAddresses;
502
+ }
427
503
  const data = cbor.map(val => Cardano.Address.fromBytes(typedHex(val)).toBech32());
504
+ this._lastUnusedAddressesCbor = cbor;
505
+ this._lastUnusedAddresses = data;
428
506
  const end = performance.now();
429
507
  if (this._options.debug) {
430
508
  console.log(`getUnusedAddresses: ${end - start}ms`);
@@ -1 +1 @@
1
- {"version":3,"file":"WalletObserver.class.js","names":["APIErrorCode","AssetAmount","merge","EWalletObserverEvents","ADA_ASSET_ID","isAdaAsset","normalizeAssetIdWithDot","getCardanoCore","getCardanoUtil","getPeerConnect","ReadOnlyApi","WalletBalanceMap","WalletObserverEvent","WalletObserverUtils","WalletObserver","constructor","options","_defineProperty","Map","api","Error","start","performance","now","_performingSync","dispatch","SYNCING_WALLET_START","newBalanceMap","getBalanceMap","syncApi","SYNCING_WALLET_END","newNetwork","newUsedAddresses","newUnusedAddresses","newOutputs","newCollateral","newFeeAddress","newChangeAddress","Promise","all","getNetwork","getUsedAddresses","getUnusedAddresses","getUtxos","getCollateral","getFeeAddress","getChangeAddress","result","balanceMap","usedAddresses","unusedAddresses","utxos","collateral","network","feeAddress","changeAddress","end","_options","debug","console","log","activeWallet","e","selectedWallet","attempts","shouldContinue","startsWith","readOnlyProvider","getNetworkId","cardano","window","parent","enable","includes","message","code","Refused","undefined","res","setTimeout","metadataResolverChanged","metadataResolver","_metadataAbortController","abort","_cachedMetadata","hasActiveConnection","sync","extension","CONNECT_WALLET_START","extensionObject","peerConnectInstance","shutdownServer","warn","connectTimeout","CONNECT_WALLET_END","data","persistence","cause","seed","mainAddress","localStorage","setItem","PERSISTENCE_CACHE_KEY","JSON","stringify","DAppPeerConnect","peerConnectArgs","name","dAppInfo","icon","getIdenticon","instance","removeItem","DISCONNECT","Cardano","typedHex","cbor","Address","fromBytes","toBech32","GET_BALANCE_MAP_START","Serialization","getBalance","Value","fromCbor","multiassetKeys","multiasset","keys","metadata","__metadataResolverWithCache","set","coin","get","multiassetEntries","entries","id","amount","GET_BALANCE_MAP_END","val","map","txOutput","TransactionUnspentOutput","input","bind","output","address","experimental","funcCall","assetIds","cachedKeys","Set","inputKeys","size","every","key","has","AbortController","currentController","newMetadata","normalizeAssetId","signal","aborted","fallbackMetadataResolver","forEach","assetId","decimals","url","location","hostname","onApiEject","disconnect","onApiInject","connectWallet","verifyConnection","walletInfo","callback","requestAutoconnect","useWalletDiscovery","announce","isSyncing","Boolean","getUtils","utils","new"],"sources":["../../../src/classes/WalletObserver.class.ts"],"sourcesContent":["import type { TransactionUnspentOutput } from \"@cardano-sdk/core/dist/cjs/Serialization/index.js\";\nimport {\n APIErrorCode,\n type ApiError,\n type Cip30WalletApi,\n type GetCollateral,\n} from \"@cardano-sdk/dapp-connector\";\nimport { AssetAmount, type IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport merge from \"lodash/merge.js\";\n\nimport { EWalletObserverEvents } from \"../@types/events.js\";\nimport type {\n IResolvedWalletObserverOptions,\n IWalletObserverSeed,\n IWalletObserverSync,\n TMetadataResolverFunc,\n TWalletObserverOptions,\n} from \"../@types/observer.js\";\nimport { ADA_ASSET_ID } from \"../constants.js\";\nimport { isAdaAsset, normalizeAssetIdWithDot } from \"../utils/assets.js\";\nimport {\n getCardanoCore,\n getCardanoUtil,\n getPeerConnect,\n} from \"../utils/getLibs.js\";\nimport { ReadOnlyApi } from \"./ReadOnlyApi.class.js\";\nimport { WalletBalanceMap } from \"./WalletBalanceMap.class.js\";\nimport { WalletObserverEvent } from \"./WalletObserverEvent.js\";\nimport { WalletObserverUtils } from \"./WalletObserverUtils.class.js\";\n\n/**\n * Class representing the Wallet Observer. This is the main interface\n * for interacting with a wallet extension that is available in the\n * browser window. It handles all the deserialization required when\n * querying raw data from a CIP-30 API, and converts it to readable and\n * usable interfaces.\n *\n * Notably, it extends the WalletObserverEvent class which\n * acts as an internal event handler to hook into actions, such as connecting,\n * syncing, and disconnecting.\n *\n * @template AssetMetadata - Type extending IAssetAmountMetadata.\n * @extends {WalletObserverEvent<AssetMetadata>}\n */\nexport class WalletObserver<\n AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,\n> extends WalletObserverEvent<AssetMetadata> {\n static PERSISTENCE_CACHE_KEY = \"walletObserver\";\n public network: number = 0;\n public api?: Cip30WalletApi;\n public activeWallet?: string;\n public utils?: WalletObserverUtils;\n public peerConnectInstance?: import(\"@fabianbormann/cardano-peer-connect\").DAppPeerConnect;\n\n private _performingSync: boolean = false;\n private _options: IResolvedWalletObserverOptions<AssetMetadata>;\n\n // Caching\n private _cachedMetadata: Map<string, AssetMetadata> = new Map();\n\n // AbortController for cancelling in-flight metadata fetches when metadataResolver changes\n private _metadataAbortController: AbortController | null = null;\n\n /**\n * Creates an instance of WalletObserver.\n *\n * @param {Partial<TWalletObserverOptions<AssetMetadata>>} [options] - Options for the wallet observer.\n */\n constructor(options?: Partial<TWalletObserverOptions<AssetMetadata>>) {\n super();\n\n // Set options.\n this._options = merge<IResolvedWalletObserverOptions, typeof options>(\n {\n metadataResolver: this.fallbackMetadataResolver,\n persistence: false,\n connectTimeout: 10000,\n debug: false,\n peerConnectArgs: {\n dAppInfo: {\n name: \"Placeholder dApp Connecter Name\",\n url: window.location.hostname,\n },\n onApiEject: (name, address) => {\n options?.peerConnectArgs?.onApiEject?.(name, address);\n this.disconnect();\n },\n onApiInject: (name, address) => {\n options?.peerConnectArgs?.onApiInject?.(name, address);\n this.connectWallet(name);\n },\n verifyConnection(walletInfo, callback) {\n return callback(true, walletInfo.requestAutoconnect ?? true);\n },\n useWalletDiscovery: true,\n announce: [\n \"wss://tracker.de-5.eternl.art\",\n \"wss://tracker.de-6.eternl.art\",\n \"wss://tracker.us-5.eternl.art\",\n ],\n },\n },\n options,\n );\n\n if (!this._options.persistence) {\n return;\n }\n }\n\n /**\n * Synchronizes the wallet. This method handles syncing the class\n * against the currently selected active wallet. If the wallet has\n * changed networks, or if the account within the wallet has changed,\n * this method will automatically attempt to reconcile this error before\n * eventually throwing.\n *\n * In the event that a promise will not resolve due to external issues,\n * after 7 seconds, a timeout function will fire that resets the API and tries again.\n *\n * @returns {Promise<IWalletObserverSync<AssetMetadata>>} - A promise that resolves to the wallet sync data.\n */\n sync = async (): Promise<IWalletObserverSync<AssetMetadata>> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to perform a sync operation without a connected wallet.\",\n );\n }\n\n const start = performance.now();\n\n try {\n this._performingSync = true;\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_START);\n\n // Check if account has changed.\n let newBalanceMap = await this.getBalanceMap();\n if (newBalanceMap instanceof Error) {\n await this.syncApi();\n newBalanceMap = await this.getBalanceMap();\n\n if (newBalanceMap instanceof Error) {\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);\n this._performingSync = false;\n throw newBalanceMap;\n }\n }\n\n const [\n newNetwork,\n newUsedAddresses,\n newUnusedAddresses,\n newOutputs,\n newCollateral,\n newFeeAddress,\n newChangeAddress,\n ] = await Promise.all([\n this.getNetwork(),\n this.getUsedAddresses(),\n this.getUnusedAddresses(),\n this.getUtxos(),\n this.getCollateral(),\n this.getFeeAddress(),\n this.getChangeAddress(),\n ]);\n\n const result: IWalletObserverSync<AssetMetadata> = {\n balanceMap: newBalanceMap,\n usedAddresses: newUsedAddresses,\n unusedAddresses: newUnusedAddresses,\n utxos: newOutputs,\n collateral: newCollateral,\n network: newNetwork,\n feeAddress: newFeeAddress,\n changeAddress: newChangeAddress,\n };\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`sync: ${end - start}ms`);\n }\n\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, {\n ...result,\n activeWallet: this.activeWallet!,\n });\n this._performingSync = false;\n return result;\n } catch (e) {\n this._performingSync = false;\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);\n throw e;\n }\n };\n\n /**\n * Helper method to check if the class is currently performing a sync\n * operation. This is useful to avoid duplicate calls, but does not\n * prevent it within the class.\n *\n * @returns {boolean}\n */\n isSyncing(): boolean {\n return this._performingSync;\n }\n\n /**\n * Helper method to check if the instance has an active connection.\n *\n * @returns {boolean}\n */\n hasActiveConnection(): boolean {\n return Boolean(this.activeWallet && this.api);\n }\n\n /**\n * Synchronizes the API with the wallet. This is useful if the account has changed,\n * but the underlying intent has not.\n *\n * @param {string} [activeWallet] - The wallet to sync with.\n * @returns {Promise<Cip30WalletApi | undefined>} - A promise that resolves to the API instance.\n */\n syncApi = async (\n activeWallet?: string,\n ): Promise<Cip30WalletApi | undefined> => {\n if (!activeWallet && !this.activeWallet) {\n throw new Error(\n \"A wallet is required to be passed as a parameter, or to be defined in the class.\",\n );\n }\n\n const selectedWallet = (activeWallet || this.activeWallet) as string;\n\n let attempts = 0;\n let shouldContinue = true;\n\n if (selectedWallet.startsWith(\"addr\")) {\n if (!this._options.readOnlyProvider) {\n throw new Error(\n \"You must provide a ReadOnlyProvider when connecting with a read-only address.\",\n );\n }\n\n this.api = new ReadOnlyApi(\n selectedWallet,\n selectedWallet.startsWith(\"addr_test\") ? 0 : 1,\n this._options.readOnlyProvider,\n );\n this.network = await this.api.getNetworkId();\n return this.api;\n }\n\n while (shouldContinue) {\n if (attempts === 10) {\n throw new Error(\n \"Could not reconnect to the selected wallet. Please check your extension.\",\n );\n }\n\n try {\n const cardano = window?.cardano || window?.parent?.cardano;\n const api = await cardano?.[selectedWallet]?.enable();\n\n if (!api) {\n throw Error;\n }\n\n this.api = api;\n this.network = await api.getNetworkId();\n shouldContinue = false;\n } catch (e) {\n if (\n [\n \"user canceled connection\",\n \"User declined to sign the data.\",\n ].includes((e as Error)?.message) ||\n (e as ApiError)?.code === APIErrorCode.Refused\n ) {\n shouldContinue = false;\n return undefined;\n }\n\n await new Promise((res) => setTimeout(res, 200));\n attempts++;\n }\n }\n\n return this.api;\n };\n\n /**\n * Gets the options for the wallet observer.\n *\n * @returns {TWalletObserverOptions} - The wallet observer options.\n */\n getOptions = (): TWalletObserverOptions => {\n return this._options;\n };\n\n /**\n * Updates the wallet observer options. Merges the new options with the existing ones.\n * If metadataResolver changes, cancels any in-flight metadata fetch, clears the cache,\n * and triggers a new sync if there is an active connection.\n *\n * @param {Partial<TWalletObserverOptions<AssetMetadata>>} options - The new options to merge.\n */\n updateOptions = (\n options: Partial<TWalletObserverOptions<AssetMetadata>>,\n ): void => {\n const metadataResolverChanged =\n options.metadataResolver &&\n options.metadataResolver !== this._options.metadataResolver;\n\n this._options = merge<\n IResolvedWalletObserverOptions<AssetMetadata>,\n typeof options\n >(this._options, options);\n\n // If metadataResolver changed, abort in-flight fetch, clear cache, and re-sync\n if (metadataResolverChanged) {\n this._metadataAbortController?.abort();\n this._cachedMetadata = new Map();\n\n // Trigger a new sync if there's an active connection\n if (this.hasActiveConnection() && !this._performingSync) {\n this.sync();\n }\n }\n };\n\n /**\n * Attempts to connect a wallet using the global window\n * reference. If no reference is found, it will retry for\n * 10 seconds before throw an error.\n *\n * @param {string} extension The name of the extension to enable.\n * @return {Promise<IWalletObserverSync<AssetMetadata> | Error>}\n */\n connectWallet = async (\n extension: string,\n ): Promise<IWalletObserverSync<AssetMetadata> | Error> => {\n const start = performance.now();\n this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);\n\n let attempts = 0;\n let extensionObject = window.cardano?.[extension];\n\n // Disconnect any CIP45 connections.\n if (!extension?.includes(\"p2p\")) {\n this.peerConnectInstance?.shutdownServer();\n }\n\n while (\n typeof extensionObject === \"undefined\" &&\n !extension.startsWith(\"addr\")\n ) {\n if (this._options.debug) {\n console.warn(`Could not find extension: ${extension}. Trying again...`);\n }\n\n if (attempts === 40) {\n break;\n }\n\n await new Promise((res) =>\n setTimeout(res, (this._options.connectTimeout as number) / 40),\n );\n extensionObject = window.cardano?.[extension];\n attempts++;\n }\n\n if (!extensionObject && !extension.startsWith(\"addr\")) {\n this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);\n throw new Error(\n `Could not find extension (${extension}) in the global context.`,\n );\n }\n\n this.activeWallet = extension;\n await this.syncApi(extension);\n const data = await this.sync();\n\n if (this._options.persistence) {\n if (data.usedAddresses instanceof Error) {\n data.usedAddresses.cause =\n \"Could not get a list of used addresses from the wallet when trying to save the connection.\";\n throw data.usedAddresses;\n }\n\n const seed: IWalletObserverSeed = {\n activeWallet: extension,\n mainAddress: data.usedAddresses[0],\n };\n\n window.localStorage.setItem(\n WalletObserver.PERSISTENCE_CACHE_KEY,\n JSON.stringify(seed),\n );\n }\n\n this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {\n ...data,\n activeWallet: extension,\n });\n const end = performance.now();\n if (this._options.debug) {\n console.log(`connectWallet: ${end - start}ms`);\n }\n\n return data;\n };\n\n getCip45Instance = async () => {\n const start = performance.now();\n if (!this.peerConnectInstance) {\n const DAppPeerConnect = await getPeerConnect();\n this.peerConnectInstance = new DAppPeerConnect(\n this._options.peerConnectArgs,\n );\n }\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getCip45Instance: ${end - start}ms`);\n }\n\n return {\n name: this._options.peerConnectArgs.dAppInfo.name,\n icon: this.peerConnectInstance.getIdenticon(),\n instance: this.peerConnectInstance,\n };\n };\n\n /**\n * Helper function to retrieve the currently cached metadata.\n *\n * @returns {Map<string, AssetMetadata>}\n */\n getCachedAssetMetadata = (): Map<string, AssetMetadata> =>\n this._cachedMetadata;\n\n /**\n * Clears the cached metadata and triggers a fresh sync to re-fetch metadata.\n * Useful when the client wants to manually refresh metadata without changing the resolver.\n *\n * @returns {Promise<void>}\n */\n resyncMetadata = async (): Promise<void> => {\n // Abort any in-flight fetch\n this._metadataAbortController?.abort();\n // Clear the cache\n this._cachedMetadata = new Map();\n\n // Trigger a new sync if there's an active connection\n if (this.hasActiveConnection()) {\n await this.sync();\n }\n };\n\n /**\n * Helper function to restore the class instance to its initial state.\n *\n * @returns {void}\n */\n disconnect = (): void => {\n this.activeWallet = undefined;\n this.api = undefined;\n window.localStorage.removeItem(WalletObserver.PERSISTENCE_CACHE_KEY);\n this.dispatch(EWalletObserverEvents.DISCONNECT);\n };\n\n /**\n * Gets a the change address.\n *\n * @returns {Promise<string | Error>} The change address, or an error.\n */\n getChangeAddress = async (): Promise<string | Error> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query change address without an API instance.\",\n );\n }\n\n const start = performance.now();\n\n const [{ Cardano }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string;\n try {\n cbor = await this.api.getChangeAddress();\n } catch (e) {\n return e as Error;\n }\n\n const data = Cardano.Address.fromBytes(typedHex(cbor)).toBech32();\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getChangeAddress: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Retrieves the balance of the wallet, including metadata for each asset.\n *\n * @returns {Promise<WalletBalanceMap<AssetMetadata>>} - A promise that resolves to a map of asset amounts keyed by asset IDs.\n */\n getBalanceMap = async (): Promise<\n WalletBalanceMap<AssetMetadata> | Error\n > => {\n if (!this.api) {\n throw new Error(\"Attempted to query balance without an API instance.\");\n }\n\n const start = performance.now();\n\n this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_START);\n const [{ Serialization }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string;\n try {\n cbor = await this.api.getBalance();\n } catch (e) {\n return e as Error;\n }\n const data = Serialization.Value.fromCbor(typedHex(cbor));\n const multiassetKeys = data.multiasset()?.keys() ?? [];\n\n const metadata = await this.__metadataResolverWithCache([\n ADA_ASSET_ID,\n ...multiassetKeys,\n ]);\n\n const balanceMap = new WalletBalanceMap<AssetMetadata>(this);\n balanceMap.set(\n ADA_ASSET_ID,\n new AssetAmount(data.coin(), metadata.get(ADA_ASSET_ID)),\n );\n\n const multiassetEntries = data.multiasset()?.entries() ?? [];\n if (multiassetEntries) {\n for (const [id, amount] of multiassetEntries) {\n balanceMap.set(\n normalizeAssetIdWithDot(id),\n new AssetAmount(amount, metadata.get(normalizeAssetIdWithDot(id))),\n );\n }\n }\n\n this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_END, {\n balanceMap,\n });\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getBalanceMap: ${end - start}ms`);\n }\n\n return balanceMap;\n };\n\n /**\n * Gets the current network connection.\n *\n * @returns {Promise<number | Error>} The network ID or an Error from the wallet.\n */\n getNetwork = async (): Promise<number | Error> => {\n if (!this.api) {\n throw new Error(\"Attempted to query network without an API instance.\");\n }\n\n const start = performance.now();\n\n let val: number;\n try {\n val = await this.api.getNetworkId();\n } catch (e) {\n return e as Error;\n }\n\n this.network = val;\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getNetwork: ${end - start}ms`);\n }\n return val;\n };\n\n /**\n * Gets a list of used addresses, encoded as Bech32.\n *\n * @returns {Promise<string[]>} The list of addresses.\n */\n getUsedAddresses = async (): Promise<string[] | Error> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query used addresses without an API instance.\",\n );\n }\n\n const start = performance.now();\n\n const [{ Cardano }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[];\n try {\n cbor = await this.api.getUsedAddresses();\n } catch (e) {\n return e as Error;\n }\n\n const data = cbor.map((val) =>\n Cardano.Address.fromBytes(typedHex(val)).toBech32(),\n );\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUsedAddresses: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Gets a list of unused addresses, encoded as Bech32.\n *\n * @returns {Promise<string[] | Error>} The list of addresses or an Error returned by the wallet.\n */\n getUnusedAddresses = async (): Promise<string[] | Error> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query unused addresses without an API instance.\",\n );\n }\n\n const start = performance.now();\n\n const [{ Cardano }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[];\n try {\n cbor = await this.api.getUnusedAddresses();\n } catch (e) {\n return e as Error;\n }\n\n const data = cbor.map((val) =>\n Cardano.Address.fromBytes(typedHex(val)).toBech32(),\n );\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUnusedAddresses: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Gets a list of wallet UTXOs.\n *\n * @returns {Promise<TransactionUnspentOutput[]>} The list of TransactionUnspentOutputs.\n */\n getUtxos = async (): Promise<\n TransactionUnspentOutput[] | Error | undefined\n > => {\n if (!this.api) {\n throw new Error(\"Attempted to query UTXOs without an API instance.\");\n }\n\n const start = performance.now();\n\n const [{ Serialization }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[] | null;\n try {\n cbor = await this.api.getUtxos();\n } catch (e) {\n return e as Error;\n }\n\n const data = cbor?.map((val) => {\n const txOutput = Serialization.TransactionUnspentOutput.fromCbor(\n typedHex(val),\n );\n\n // These methods must be bound to their initial creation instance.\n txOutput.input = txOutput.input.bind(txOutput);\n txOutput.output = txOutput.output.bind(txOutput);\n return txOutput;\n });\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUtxos: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Gets the fee address set by the wallet, if available.\n *\n * @returns {Promise<string | Error | undefined>} The fee address or an Error.\n */\n getFeeAddress = async (): Promise<string | Error | undefined> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query fee address without an API instance.\",\n );\n }\n\n const start = performance.now();\n try {\n const address =\n window.cardano?.[this.activeWallet!]?.experimental?.feeAddress;\n const end = performance.now();\n\n if (this._options.debug) {\n console.log(`getFeeAddress: ${end - start}ms`);\n }\n\n return address;\n } catch (e) {\n return e as Error;\n }\n };\n\n /**\n * Gets a list of wallet UTXOs suitable for collateral.\n *\n * @returns {Promise<TransactionUnspentOutput[] | Error | undefined>} The list of TransactionUnspentOutputs, if there are any, or an Error.\n */\n getCollateral = async (): Promise<\n TransactionUnspentOutput[] | Error | undefined\n > => {\n if (!this.api) {\n throw new Error(\"Attempted to query UTXOs without an API instance.\");\n }\n\n const start = performance.now();\n\n const [{ Serialization }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[] | null;\n try {\n const funcCall =\n this.api?.getCollateral ||\n (this.api?.experimental.getCollateral as GetCollateral);\n if (typeof funcCall !== \"function\") {\n cbor = [];\n } else {\n cbor = await funcCall();\n }\n } catch (e) {\n return e as Error;\n }\n\n const data = cbor?.map((val) => {\n const txOutput = Serialization.TransactionUnspentOutput.fromCbor(\n typedHex(val),\n );\n\n // These methods must be bound to their initial creation instance.\n txOutput.input = txOutput.input.bind(txOutput);\n txOutput.output = txOutput.output.bind(txOutput);\n return txOutput;\n });\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getCollateral: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Resolves metadata for the given asset IDs, using a cached version if available.\n * Aborts any in-flight fetch when called, ensuring only the latest request completes.\n *\n * @private\n * @param {string[]} assetIds - The IDs of the assets to resolve metadata for.\n * @returns {Promise<Map<string, AssetMetadata>>} - A promise that resolves to a map of asset metadata.\n */\n private __metadataResolverWithCache = async (\n assetIds: string[],\n ): Promise<Map<string, AssetMetadata>> => {\n const start = performance.now();\n\n if (this._cachedMetadata) {\n const cachedKeys = new Set(this._cachedMetadata.keys());\n const inputKeys = new Set(assetIds);\n\n if (\n cachedKeys.size === inputKeys.size &&\n [...cachedKeys].every((key) => inputKeys.has(key))\n ) {\n const end = performance.now();\n if (this._options.debug) {\n console.log(`metadataResolver (cached): ${end - start}ms`);\n }\n return this._cachedMetadata;\n }\n }\n\n // Abort any in-flight metadata fetch\n this._metadataAbortController?.abort();\n this._metadataAbortController = new AbortController();\n const currentController = this._metadataAbortController;\n\n let attempts = 0;\n let newMetadata: Map<string, AssetMetadata> | undefined;\n while (attempts <= 3 && !newMetadata) {\n try {\n newMetadata = await this._options.metadataResolver({\n assetIds: assetIds.map(normalizeAssetIdWithDot),\n normalizeAssetId: normalizeAssetIdWithDot,\n isAdaAsset,\n });\n } catch (e) {\n attempts++;\n }\n }\n\n // If this request was aborted while in-flight, return current cache (a new fetch is in progress)\n if (currentController.signal.aborted) {\n return this._cachedMetadata;\n }\n\n if (!newMetadata) {\n newMetadata = await this.fallbackMetadataResolver({\n assetIds: assetIds.map(normalizeAssetIdWithDot),\n normalizeAssetId: normalizeAssetIdWithDot,\n isAdaAsset,\n });\n }\n\n // Double-check abort status after fallback resolver\n if (currentController.signal.aborted) {\n return this._cachedMetadata;\n }\n\n this._cachedMetadata = newMetadata;\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`metadataResolver: ${end - start}ms`);\n }\n return newMetadata;\n };\n\n /**\n * A fallback metadata resolver function that generates default metadata for given asset IDs.\n *\n * @type {TMetadataResolverFunc<AssetMetadata>}\n */\n public fallbackMetadataResolver: TMetadataResolverFunc<AssetMetadata> =\n async ({ assetIds }) => {\n const map = new Map<string, AssetMetadata>();\n assetIds.forEach((id) =>\n map.set(normalizeAssetIdWithDot(id), {\n assetId: normalizeAssetIdWithDot(id),\n decimals: 6,\n } as AssetMetadata),\n );\n\n return map;\n };\n\n /**\n * Helper method to retrieve the cached utils instance.\n *\n * @returns {Promise<WalletObserverUtils>} Resolves to a WalletObserverUtils class.\n */\n public async getUtils(): Promise<WalletObserverUtils> {\n if (!this.utils) {\n this.utils = await WalletObserverUtils.new(this.network);\n }\n\n return this.utils;\n }\n}\n"],"mappings":";;;AACA,SACEA,YAAY,QAIP,6BAA6B;AACpC,SAASC,WAAW,QAAmC,mBAAmB;AAC1E,OAAOC,KAAK,MAAM,iBAAiB;AAEnC,SAASC,qBAAqB,QAAQ,qBAAqB;AAQ3D,SAASC,YAAY,QAAQ,iBAAiB;AAC9C,SAASC,UAAU,EAAEC,uBAAuB,QAAQ,oBAAoB;AACxE,SACEC,cAAc,EACdC,cAAc,EACdC,cAAc,QACT,qBAAqB;AAC5B,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,gCAAgC;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,cAAc,SAEjBF,mBAAmB,CAAgB;EAiB3C;AACF;AACA;AACA;AACA;EACEG,WAAWA,CAACC,QAAwD,EAAE;IACpE,KAAK,CAAC,CAAC;;IAEP;IAAAC,eAAA,kBAvBuB,CAAC;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA,0BAMS,KAAK;IAAAA,eAAA;IAGxC;IAAAA,eAAA,0BACsD,IAAIC,GAAG,CAAC,CAAC;IAE/D;IAAAD,eAAA,mCAC2D,IAAI;IAiD/D;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IAXEA,eAAA,eAYO,YAAyD;MAC9D,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CACb,mEACF,CAAC;MACH;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,IAAI;QACF,IAAI,CAACC,eAAe,GAAG,IAAI;QAC3B,IAAI,CAACC,QAAQ,CAACtB,qBAAqB,CAACuB,oBAAoB,CAAC;;QAEzD;QACA,IAAIC,aAAa,GAAG,MAAM,IAAI,CAACC,aAAa,CAAC,CAAC;QAC9C,IAAID,aAAa,YAAYP,KAAK,EAAE;UAClC,MAAM,IAAI,CAACS,OAAO,CAAC,CAAC;UACpBF,aAAa,GAAG,MAAM,IAAI,CAACC,aAAa,CAAC,CAAC;UAE1C,IAAID,aAAa,YAAYP,KAAK,EAAE;YAClC,IAAI,CAACK,QAAQ,CAACtB,qBAAqB,CAAC2B,kBAAkB,CAAC;YACvD,IAAI,CAACN,eAAe,GAAG,KAAK;YAC5B,MAAMG,aAAa;UACrB;QACF;QAEA,MAAM,CACJI,UAAU,EACVC,gBAAgB,EAChBC,kBAAkB,EAClBC,UAAU,EACVC,aAAa,EACbC,aAAa,EACbC,gBAAgB,CACjB,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC,CACpB,IAAI,CAACC,UAAU,CAAC,CAAC,EACjB,IAAI,CAACC,gBAAgB,CAAC,CAAC,EACvB,IAAI,CAACC,kBAAkB,CAAC,CAAC,EACzB,IAAI,CAACC,QAAQ,CAAC,CAAC,EACf,IAAI,CAACC,aAAa,CAAC,CAAC,EACpB,IAAI,CAACC,aAAa,CAAC,CAAC,EACpB,IAAI,CAACC,gBAAgB,CAAC,CAAC,CACxB,CAAC;QAEF,MAAMC,MAA0C,GAAG;UACjDC,UAAU,EAAErB,aAAa;UACzBsB,aAAa,EAAEjB,gBAAgB;UAC/BkB,eAAe,EAAEjB,kBAAkB;UACnCkB,KAAK,EAAEjB,UAAU;UACjBkB,UAAU,EAAEjB,aAAa;UACzBkB,OAAO,EAAEtB,UAAU;UACnBuB,UAAU,EAAElB,aAAa;UACzBmB,aAAa,EAAElB;QACjB,CAAC;QAED,MAAMmB,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;UACvBC,OAAO,CAACC,GAAG,CAAC,SAASJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;QACvC;QAEA,IAAI,CAACI,QAAQ,CAACtB,qBAAqB,CAAC2B,kBAAkB,EAAE;UACtD,GAAGiB,MAAM;UACTc,YAAY,EAAE,IAAI,CAACA;QACrB,CAAC,CAAC;QACF,IAAI,CAACrC,eAAe,GAAG,KAAK;QAC5B,OAAOuB,MAAM;MACf,CAAC,CAAC,OAAOe,CAAC,EAAE;QACV,IAAI,CAACtC,eAAe,GAAG,KAAK;QAC5B,IAAI,CAACC,QAAQ,CAACtB,qBAAqB,CAAC2B,kBAAkB,CAAC;QACvD,MAAMgC,CAAC;MACT;IACF,CAAC;IAsBD;AACF;AACA;AACA;AACA;AACA;AACA;IANE7C,eAAA,kBAOU,MACR4C,YAAqB,IACmB;MACxC,IAAI,CAACA,YAAY,IAAI,CAAC,IAAI,CAACA,YAAY,EAAE;QACvC,MAAM,IAAIzC,KAAK,CACb,kFACF,CAAC;MACH;MAEA,MAAM2C,cAAc,GAAIF,YAAY,IAAI,IAAI,CAACA,YAAuB;MAEpE,IAAIG,QAAQ,GAAG,CAAC;MAChB,IAAIC,cAAc,GAAG,IAAI;MAEzB,IAAIF,cAAc,CAACG,UAAU,CAAC,MAAM,CAAC,EAAE;QACrC,IAAI,CAAC,IAAI,CAACT,QAAQ,CAACU,gBAAgB,EAAE;UACnC,MAAM,IAAI/C,KAAK,CACb,+EACF,CAAC;QACH;QAEA,IAAI,CAACD,GAAG,GAAG,IAAIT,WAAW,CACxBqD,cAAc,EACdA,cAAc,CAACG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAC9C,IAAI,CAACT,QAAQ,CAACU,gBAChB,CAAC;QACD,IAAI,CAACd,OAAO,GAAG,MAAM,IAAI,CAAClC,GAAG,CAACiD,YAAY,CAAC,CAAC;QAC5C,OAAO,IAAI,CAACjD,GAAG;MACjB;MAEA,OAAO8C,cAAc,EAAE;QACrB,IAAID,QAAQ,KAAK,EAAE,EAAE;UACnB,MAAM,IAAI5C,KAAK,CACb,0EACF,CAAC;QACH;QAEA,IAAI;UACF,MAAMiD,OAAO,GAAGC,MAAM,EAAED,OAAO,IAAIC,MAAM,EAAEC,MAAM,EAAEF,OAAO;UAC1D,MAAMlD,GAAG,GAAG,MAAMkD,OAAO,GAAGN,cAAc,CAAC,EAAES,MAAM,CAAC,CAAC;UAErD,IAAI,CAACrD,GAAG,EAAE;YACR,MAAMC,KAAK;UACb;UAEA,IAAI,CAACD,GAAG,GAAGA,GAAG;UACd,IAAI,CAACkC,OAAO,GAAG,MAAMlC,GAAG,CAACiD,YAAY,CAAC,CAAC;UACvCH,cAAc,GAAG,KAAK;QACxB,CAAC,CAAC,OAAOH,CAAC,EAAE;UACV,IACE,CACE,0BAA0B,EAC1B,iCAAiC,CAClC,CAACW,QAAQ,CAAEX,CAAC,EAAYY,OAAO,CAAC,IAChCZ,CAAC,EAAea,IAAI,KAAK3E,YAAY,CAAC4E,OAAO,EAC9C;YACAX,cAAc,GAAG,KAAK;YACtB,OAAOY,SAAS;UAClB;UAEA,MAAM,IAAIvC,OAAO,CAAEwC,GAAG,IAAKC,UAAU,CAACD,GAAG,EAAE,GAAG,CAAC,CAAC;UAChDd,QAAQ,EAAE;QACZ;MACF;MAEA,OAAO,IAAI,CAAC7C,GAAG;IACjB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJEF,eAAA,qBAKa,MAA8B;MACzC,OAAO,IAAI,CAACwC,QAAQ;IACtB,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANExC,eAAA,wBAQED,OAAuD,IAC9C;MACT,MAAMgE,uBAAuB,GAC3BhE,OAAO,CAACiE,gBAAgB,IACxBjE,OAAO,CAACiE,gBAAgB,KAAK,IAAI,CAACxB,QAAQ,CAACwB,gBAAgB;MAE7D,IAAI,CAACxB,QAAQ,GAAGvD,KAAK,CAGnB,IAAI,CAACuD,QAAQ,EAAEzC,OAAO,CAAC;;MAEzB;MACA,IAAIgE,uBAAuB,EAAE;QAC3B,IAAI,CAACE,wBAAwB,EAAEC,KAAK,CAAC,CAAC;QACtC,IAAI,CAACC,eAAe,GAAG,IAAIlE,GAAG,CAAC,CAAC;;QAEhC;QACA,IAAI,IAAI,CAACmE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC7D,eAAe,EAAE;UACvD,IAAI,CAAC8D,IAAI,CAAC,CAAC;QACb;MACF;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;IAPErE,eAAA,wBAQgB,MACdsE,SAAiB,IACuC;MACxD,MAAMlE,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC/B,IAAI,CAACE,QAAQ,CAACtB,qBAAqB,CAACqF,oBAAoB,CAAC;MAEzD,IAAIxB,QAAQ,GAAG,CAAC;MAChB,IAAIyB,eAAe,GAAGnB,MAAM,CAACD,OAAO,GAAGkB,SAAS,CAAC;;MAEjD;MACA,IAAI,CAACA,SAAS,EAAEd,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC/B,IAAI,CAACiB,mBAAmB,EAAEC,cAAc,CAAC,CAAC;MAC5C;MAEA,OACE,OAAOF,eAAe,KAAK,WAAW,IACtC,CAACF,SAAS,CAACrB,UAAU,CAAC,MAAM,CAAC,EAC7B;QACA,IAAI,IAAI,CAACT,QAAQ,CAACC,KAAK,EAAE;UACvBC,OAAO,CAACiC,IAAI,CAAC,6BAA6BL,SAAS,mBAAmB,CAAC;QACzE;QAEA,IAAIvB,QAAQ,KAAK,EAAE,EAAE;UACnB;QACF;QAEA,MAAM,IAAI1B,OAAO,CAAEwC,GAAG,IACpBC,UAAU,CAACD,GAAG,EAAG,IAAI,CAACrB,QAAQ,CAACoC,cAAc,GAAc,EAAE,CAC/D,CAAC;QACDJ,eAAe,GAAGnB,MAAM,CAACD,OAAO,GAAGkB,SAAS,CAAC;QAC7CvB,QAAQ,EAAE;MACZ;MAEA,IAAI,CAACyB,eAAe,IAAI,CAACF,SAAS,CAACrB,UAAU,CAAC,MAAM,CAAC,EAAE;QACrD,IAAI,CAACzC,QAAQ,CAACtB,qBAAqB,CAAC2F,kBAAkB,CAAC;QACvD,MAAM,IAAI1E,KAAK,CACb,6BAA6BmE,SAAS,0BACxC,CAAC;MACH;MAEA,IAAI,CAAC1B,YAAY,GAAG0B,SAAS;MAC7B,MAAM,IAAI,CAAC1D,OAAO,CAAC0D,SAAS,CAAC;MAC7B,MAAMQ,IAAI,GAAG,MAAM,IAAI,CAACT,IAAI,CAAC,CAAC;MAE9B,IAAI,IAAI,CAAC7B,QAAQ,CAACuC,WAAW,EAAE;QAC7B,IAAID,IAAI,CAAC9C,aAAa,YAAY7B,KAAK,EAAE;UACvC2E,IAAI,CAAC9C,aAAa,CAACgD,KAAK,GACtB,4FAA4F;UAC9F,MAAMF,IAAI,CAAC9C,aAAa;QAC1B;QAEA,MAAMiD,IAAyB,GAAG;UAChCrC,YAAY,EAAE0B,SAAS;UACvBY,WAAW,EAAEJ,IAAI,CAAC9C,aAAa,CAAC,CAAC;QACnC,CAAC;QAEDqB,MAAM,CAAC8B,YAAY,CAACC,OAAO,CACzBvF,cAAc,CAACwF,qBAAqB,EACpCC,IAAI,CAACC,SAAS,CAACN,IAAI,CACrB,CAAC;MACH;MAEA,IAAI,CAACzE,QAAQ,CAACtB,qBAAqB,CAAC2F,kBAAkB,EAAE;QACtD,GAAGC,IAAI;QACPlC,YAAY,EAAE0B;MAChB,CAAC,CAAC;MACF,MAAM/B,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,kBAAkBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MAChD;MAEA,OAAO0E,IAAI;IACb,CAAC;IAAA9E,eAAA,2BAEkB,YAAY;MAC7B,MAAMI,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC/B,IAAI,CAAC,IAAI,CAACmE,mBAAmB,EAAE;QAC7B,MAAMe,eAAe,GAAG,MAAMhG,cAAc,CAAC,CAAC;QAC9C,IAAI,CAACiF,mBAAmB,GAAG,IAAIe,eAAe,CAC5C,IAAI,CAAChD,QAAQ,CAACiD,eAChB,CAAC;MACH;MAEA,MAAMlD,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,qBAAqBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MACnD;MAEA,OAAO;QACLsF,IAAI,EAAE,IAAI,CAAClD,QAAQ,CAACiD,eAAe,CAACE,QAAQ,CAACD,IAAI;QACjDE,IAAI,EAAE,IAAI,CAACnB,mBAAmB,CAACoB,YAAY,CAAC,CAAC;QAC7CC,QAAQ,EAAE,IAAI,CAACrB;MACjB,CAAC;IACH,CAAC;IAED;AACF;AACA;AACA;AACA;IAJEzE,eAAA,iCAKyB,MACvB,IAAI,CAACmE,eAAe;IAEtB;AACF;AACA;AACA;AACA;AACA;IALEnE,eAAA,yBAMiB,YAA2B;MAC1C;MACA,IAAI,CAACiE,wBAAwB,EAAEC,KAAK,CAAC,CAAC;MACtC;MACA,IAAI,CAACC,eAAe,GAAG,IAAIlE,GAAG,CAAC,CAAC;;MAEhC;MACA,IAAI,IAAI,CAACmE,mBAAmB,CAAC,CAAC,EAAE;QAC9B,MAAM,IAAI,CAACC,IAAI,CAAC,CAAC;MACnB;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJErE,eAAA,qBAKa,MAAY;MACvB,IAAI,CAAC4C,YAAY,GAAGgB,SAAS;MAC7B,IAAI,CAAC1D,GAAG,GAAG0D,SAAS;MACpBP,MAAM,CAAC8B,YAAY,CAACY,UAAU,CAAClG,cAAc,CAACwF,qBAAqB,CAAC;MACpE,IAAI,CAAC7E,QAAQ,CAACtB,qBAAqB,CAAC8G,UAAU,CAAC;IACjD,CAAC;IAED;AACF;AACA;AACA;AACA;IAJEhG,eAAA,2BAKmB,YAAqC;MACtD,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CACb,4DACF,CAAC;MACH;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,MAAM,CAAC;QAAE2F;MAAQ,CAAC,EAAEC,QAAQ,CAAC,GAAG,MAAM7E,OAAO,CAACC,GAAG,CAAC,CAChDhC,cAAc,CAAC,CAAC,EAChBC,cAAc,CAAC,CAAC,CACjB,CAAC;MAEF,IAAI4G,IAAY;MAChB,IAAI;QACFA,IAAI,GAAG,MAAM,IAAI,CAACjG,GAAG,CAAC2B,gBAAgB,CAAC,CAAC;MAC1C,CAAC,CAAC,OAAOgB,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MAEA,MAAMiC,IAAI,GAAGmB,OAAO,CAACG,OAAO,CAACC,SAAS,CAACH,QAAQ,CAACC,IAAI,CAAC,CAAC,CAACG,QAAQ,CAAC,CAAC;MAEjE,MAAM/D,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,qBAAqBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MACnD;MACA,OAAO0E,IAAI;IACb,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE9E,eAAA,wBAKgB,YAEX;MACH,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CAAC,qDAAqD,CAAC;MACxE;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,IAAI,CAACE,QAAQ,CAACtB,qBAAqB,CAACqH,qBAAqB,CAAC;MAC1D,MAAM,CAAC;QAAEC;MAAc,CAAC,EAAEN,QAAQ,CAAC,GAAG,MAAM7E,OAAO,CAACC,GAAG,CAAC,CACtDhC,cAAc,CAAC,CAAC,EAChBC,cAAc,CAAC,CAAC,CACjB,CAAC;MAEF,IAAI4G,IAAY;MAChB,IAAI;QACFA,IAAI,GAAG,MAAM,IAAI,CAACjG,GAAG,CAACuG,UAAU,CAAC,CAAC;MACpC,CAAC,CAAC,OAAO5D,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MACA,MAAMiC,IAAI,GAAG0B,aAAa,CAACE,KAAK,CAACC,QAAQ,CAACT,QAAQ,CAACC,IAAI,CAAC,CAAC;MACzD,MAAMS,cAAc,GAAG9B,IAAI,CAAC+B,UAAU,CAAC,CAAC,EAAEC,IAAI,CAAC,CAAC,IAAI,EAAE;MAEtD,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACC,2BAA2B,CAAC,CACtD7H,YAAY,EACZ,GAAGyH,cAAc,CAClB,CAAC;MAEF,MAAM7E,UAAU,GAAG,IAAIrC,gBAAgB,CAAgB,IAAI,CAAC;MAC5DqC,UAAU,CAACkF,GAAG,CACZ9H,YAAY,EACZ,IAAIH,WAAW,CAAC8F,IAAI,CAACoC,IAAI,CAAC,CAAC,EAAEH,QAAQ,CAACI,GAAG,CAAChI,YAAY,CAAC,CACzD,CAAC;MAED,MAAMiI,iBAAiB,GAAGtC,IAAI,CAAC+B,UAAU,CAAC,CAAC,EAAEQ,OAAO,CAAC,CAAC,IAAI,EAAE;MAC5D,IAAID,iBAAiB,EAAE;QACrB,KAAK,MAAM,CAACE,EAAE,EAAEC,MAAM,CAAC,IAAIH,iBAAiB,EAAE;UAC5CrF,UAAU,CAACkF,GAAG,CACZ5H,uBAAuB,CAACiI,EAAE,CAAC,EAC3B,IAAItI,WAAW,CAACuI,MAAM,EAAER,QAAQ,CAACI,GAAG,CAAC9H,uBAAuB,CAACiI,EAAE,CAAC,CAAC,CACnE,CAAC;QACH;MACF;MAEA,IAAI,CAAC9G,QAAQ,CAACtB,qBAAqB,CAACsI,mBAAmB,EAAE;QACvDzF;MACF,CAAC,CAAC;MAEF,MAAMQ,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,kBAAkBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MAChD;MAEA,OAAO2B,UAAU;IACnB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE/B,eAAA,qBAKa,YAAqC;MAChD,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CAAC,qDAAqD,CAAC;MACxE;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,IAAImH,GAAW;MACf,IAAI;QACFA,GAAG,GAAG,MAAM,IAAI,CAACvH,GAAG,CAACiD,YAAY,CAAC,CAAC;MACrC,CAAC,CAAC,OAAON,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MAEA,IAAI,CAACT,OAAO,GAAGqF,GAAG;MAClB,MAAMlF,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,eAAeJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MAC7C;MACA,OAAOqH,GAAG;IACZ,CAAC;IAED;AACF;AACA;AACA;AACA;IAJEzH,eAAA,2BAKmB,YAAuC;MACxD,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CACb,4DACF,CAAC;MACH;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,MAAM,CAAC;QAAE2F;MAAQ,CAAC,EAAEC,QAAQ,CAAC,GAAG,MAAM7E,OAAO,CAACC,GAAG,CAAC,CAChDhC,cAAc,CAAC,CAAC,EAChBC,cAAc,CAAC,CAAC,CACjB,CAAC;MAEF,IAAI4G,IAAc;MAClB,IAAI;QACFA,IAAI,GAAG,MAAM,IAAI,CAACjG,GAAG,CAACsB,gBAAgB,CAAC,CAAC;MAC1C,CAAC,CAAC,OAAOqB,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MAEA,MAAMiC,IAAI,GAAGqB,IAAI,CAACuB,GAAG,CAAED,GAAG,IACxBxB,OAAO,CAACG,OAAO,CAACC,SAAS,CAACH,QAAQ,CAACuB,GAAG,CAAC,CAAC,CAACnB,QAAQ,CAAC,CACpD,CAAC;MAED,MAAM/D,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,qBAAqBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MACnD;MACA,OAAO0E,IAAI;IACb,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE9E,eAAA,6BAKqB,YAAuC;MAC1D,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CACb,8DACF,CAAC;MACH;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,MAAM,CAAC;QAAE2F;MAAQ,CAAC,EAAEC,QAAQ,CAAC,GAAG,MAAM7E,OAAO,CAACC,GAAG,CAAC,CAChDhC,cAAc,CAAC,CAAC,EAChBC,cAAc,CAAC,CAAC,CACjB,CAAC;MAEF,IAAI4G,IAAc;MAClB,IAAI;QACFA,IAAI,GAAG,MAAM,IAAI,CAACjG,GAAG,CAACuB,kBAAkB,CAAC,CAAC;MAC5C,CAAC,CAAC,OAAOoB,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MAEA,MAAMiC,IAAI,GAAGqB,IAAI,CAACuB,GAAG,CAAED,GAAG,IACxBxB,OAAO,CAACG,OAAO,CAACC,SAAS,CAACH,QAAQ,CAACuB,GAAG,CAAC,CAAC,CAACnB,QAAQ,CAAC,CACpD,CAAC;MAED,MAAM/D,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,uBAAuBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MACrD;MACA,OAAO0E,IAAI;IACb,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE9E,eAAA,mBAKW,YAEN;MACH,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CAAC,mDAAmD,CAAC;MACtE;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,MAAM,CAAC;QAAEkG;MAAc,CAAC,EAAEN,QAAQ,CAAC,GAAG,MAAM7E,OAAO,CAACC,GAAG,CAAC,CACtDhC,cAAc,CAAC,CAAC,EAChBC,cAAc,CAAC,CAAC,CACjB,CAAC;MAEF,IAAI4G,IAAqB;MACzB,IAAI;QACFA,IAAI,GAAG,MAAM,IAAI,CAACjG,GAAG,CAACwB,QAAQ,CAAC,CAAC;MAClC,CAAC,CAAC,OAAOmB,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MAEA,MAAMiC,IAAI,GAAGqB,IAAI,EAAEuB,GAAG,CAAED,GAAG,IAAK;QAC9B,MAAME,QAAQ,GAAGnB,aAAa,CAACoB,wBAAwB,CAACjB,QAAQ,CAC9DT,QAAQ,CAACuB,GAAG,CACd,CAAC;;QAED;QACAE,QAAQ,CAACE,KAAK,GAAGF,QAAQ,CAACE,KAAK,CAACC,IAAI,CAACH,QAAQ,CAAC;QAC9CA,QAAQ,CAACI,MAAM,GAAGJ,QAAQ,CAACI,MAAM,CAACD,IAAI,CAACH,QAAQ,CAAC;QAChD,OAAOA,QAAQ;MACjB,CAAC,CAAC;MAEF,MAAMpF,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,aAAaJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MAC3C;MACA,OAAO0E,IAAI;IACb,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE9E,eAAA,wBAKgB,YAAiD;MAC/D,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CACb,yDACF,CAAC;MACH;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC/B,IAAI;QACF,MAAM0H,OAAO,GACX3E,MAAM,CAACD,OAAO,GAAG,IAAI,CAACR,YAAY,CAAE,EAAEqF,YAAY,EAAE5F,UAAU;QAChE,MAAME,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;QAE7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;UACvBC,OAAO,CAACC,GAAG,CAAC,kBAAkBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;QAChD;QAEA,OAAO4H,OAAO;MAChB,CAAC,CAAC,OAAOnF,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE7C,eAAA,wBAKgB,YAEX;MACH,IAAI,CAAC,IAAI,CAACE,GAAG,EAAE;QACb,MAAM,IAAIC,KAAK,CAAC,mDAAmD,CAAC;MACtE;MAEA,MAAMC,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,MAAM,CAAC;QAAEkG;MAAc,CAAC,EAAEN,QAAQ,CAAC,GAAG,MAAM7E,OAAO,CAACC,GAAG,CAAC,CACtDhC,cAAc,CAAC,CAAC,EAChBC,cAAc,CAAC,CAAC,CACjB,CAAC;MAEF,IAAI4G,IAAqB;MACzB,IAAI;QACF,MAAM+B,QAAQ,GACZ,IAAI,CAAChI,GAAG,EAAEyB,aAAa,IACtB,IAAI,CAACzB,GAAG,EAAE+H,YAAY,CAACtG,aAA+B;QACzD,IAAI,OAAOuG,QAAQ,KAAK,UAAU,EAAE;UAClC/B,IAAI,GAAG,EAAE;QACX,CAAC,MAAM;UACLA,IAAI,GAAG,MAAM+B,QAAQ,CAAC,CAAC;QACzB;MACF,CAAC,CAAC,OAAOrF,CAAC,EAAE;QACV,OAAOA,CAAC;MACV;MAEA,MAAMiC,IAAI,GAAGqB,IAAI,EAAEuB,GAAG,CAAED,GAAG,IAAK;QAC9B,MAAME,QAAQ,GAAGnB,aAAa,CAACoB,wBAAwB,CAACjB,QAAQ,CAC9DT,QAAQ,CAACuB,GAAG,CACd,CAAC;;QAED;QACAE,QAAQ,CAACE,KAAK,GAAGF,QAAQ,CAACE,KAAK,CAACC,IAAI,CAACH,QAAQ,CAAC;QAC9CA,QAAQ,CAACI,MAAM,GAAGJ,QAAQ,CAACI,MAAM,CAACD,IAAI,CAACH,QAAQ,CAAC;QAChD,OAAOA,QAAQ;MACjB,CAAC,CAAC;MAEF,MAAMpF,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,kBAAkBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MAChD;MACA,OAAO0E,IAAI;IACb,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;IAPE9E,eAAA,sCAQsC,MACpCmI,QAAkB,IACsB;MACxC,MAAM/H,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,IAAI,IAAI,CAAC6D,eAAe,EAAE;QACxB,MAAMiE,UAAU,GAAG,IAAIC,GAAG,CAAC,IAAI,CAAClE,eAAe,CAAC2C,IAAI,CAAC,CAAC,CAAC;QACvD,MAAMwB,SAAS,GAAG,IAAID,GAAG,CAACF,QAAQ,CAAC;QAEnC,IACEC,UAAU,CAACG,IAAI,KAAKD,SAAS,CAACC,IAAI,IAClC,CAAC,GAAGH,UAAU,CAAC,CAACI,KAAK,CAAEC,GAAG,IAAKH,SAAS,CAACI,GAAG,CAACD,GAAG,CAAC,CAAC,EAClD;UACA,MAAMlG,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;UAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;YACvBC,OAAO,CAACC,GAAG,CAAC,8BAA8BJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;UAC5D;UACA,OAAO,IAAI,CAAC+D,eAAe;QAC7B;MACF;;MAEA;MACA,IAAI,CAACF,wBAAwB,EAAEC,KAAK,CAAC,CAAC;MACtC,IAAI,CAACD,wBAAwB,GAAG,IAAI0E,eAAe,CAAC,CAAC;MACrD,MAAMC,iBAAiB,GAAG,IAAI,CAAC3E,wBAAwB;MAEvD,IAAIlB,QAAQ,GAAG,CAAC;MAChB,IAAI8F,WAAmD;MACvD,OAAO9F,QAAQ,IAAI,CAAC,IAAI,CAAC8F,WAAW,EAAE;QACpC,IAAI;UACFA,WAAW,GAAG,MAAM,IAAI,CAACrG,QAAQ,CAACwB,gBAAgB,CAAC;YACjDmE,QAAQ,EAAEA,QAAQ,CAACT,GAAG,CAACrI,uBAAuB,CAAC;YAC/CyJ,gBAAgB,EAAEzJ,uBAAuB;YACzCD;UACF,CAAC,CAAC;QACJ,CAAC,CAAC,OAAOyD,CAAC,EAAE;UACVE,QAAQ,EAAE;QACZ;MACF;;MAEA;MACA,IAAI6F,iBAAiB,CAACG,MAAM,CAACC,OAAO,EAAE;QACpC,OAAO,IAAI,CAAC7E,eAAe;MAC7B;MAEA,IAAI,CAAC0E,WAAW,EAAE;QAChBA,WAAW,GAAG,MAAM,IAAI,CAACI,wBAAwB,CAAC;UAChDd,QAAQ,EAAEA,QAAQ,CAACT,GAAG,CAACrI,uBAAuB,CAAC;UAC/CyJ,gBAAgB,EAAEzJ,uBAAuB;UACzCD;QACF,CAAC,CAAC;MACJ;;MAEA;MACA,IAAIwJ,iBAAiB,CAACG,MAAM,CAACC,OAAO,EAAE;QACpC,OAAO,IAAI,CAAC7E,eAAe;MAC7B;MAEA,IAAI,CAACA,eAAe,GAAG0E,WAAW;MAElC,MAAMtG,GAAG,GAAGlC,WAAW,CAACC,GAAG,CAAC,CAAC;MAC7B,IAAI,IAAI,CAACkC,QAAQ,CAACC,KAAK,EAAE;QACvBC,OAAO,CAACC,GAAG,CAAC,qBAAqBJ,GAAG,GAAGnC,KAAK,IAAI,CAAC;MACnD;MACA,OAAOyI,WAAW;IACpB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE7I,eAAA,mCAME,OAAO;MAAEmI;IAAS,CAAC,KAAK;MACtB,MAAMT,GAAG,GAAG,IAAIzH,GAAG,CAAwB,CAAC;MAC5CkI,QAAQ,CAACe,OAAO,CAAE5B,EAAE,IAClBI,GAAG,CAACT,GAAG,CAAC5H,uBAAuB,CAACiI,EAAE,CAAC,EAAE;QACnC6B,OAAO,EAAE9J,uBAAuB,CAACiI,EAAE,CAAC;QACpC8B,QAAQ,EAAE;MACZ,CAAkB,CACpB,CAAC;MAED,OAAO1B,GAAG;IACZ,CAAC;IA3yBD,IAAI,CAAClF,QAAQ,GAAGvD,KAAK,CACnB;MACE+E,gBAAgB,EAAE,IAAI,CAACiF,wBAAwB;MAC/ClE,WAAW,EAAE,KAAK;MAClBH,cAAc,EAAE,KAAK;MACrBnC,KAAK,EAAE,KAAK;MACZgD,eAAe,EAAE;QACfE,QAAQ,EAAE;UACRD,IAAI,EAAE,iCAAiC;UACvC2D,GAAG,EAAEhG,MAAM,CAACiG,QAAQ,CAACC;QACvB,CAAC;QACDC,UAAU,EAAEA,CAAC9D,IAAI,EAAEsC,OAAO,KAAK;UAC7BjI,QAAO,EAAE0F,eAAe,EAAE+D,UAAU,GAAG9D,IAAI,EAAEsC,OAAO,CAAC;UACrD,IAAI,CAACyB,UAAU,CAAC,CAAC;QACnB,CAAC;QACDC,WAAW,EAAEA,CAAChE,IAAI,EAAEsC,OAAO,KAAK;UAC9BjI,QAAO,EAAE0F,eAAe,EAAEiE,WAAW,GAAGhE,IAAI,EAAEsC,OAAO,CAAC;UACtD,IAAI,CAAC2B,aAAa,CAACjE,IAAI,CAAC;QAC1B,CAAC;QACDkE,gBAAgBA,CAACC,UAAU,EAAEC,QAAQ,EAAE;UACrC,OAAOA,QAAQ,CAAC,IAAI,EAAED,UAAU,CAACE,kBAAkB,IAAI,IAAI,CAAC;QAC9D,CAAC;QACDC,kBAAkB,EAAE,IAAI;QACxBC,QAAQ,EAAE,CACR,+BAA+B,EAC/B,+BAA+B,EAC/B,+BAA+B;MAEnC;IACF,CAAC,EACDlK,QACF,CAAC;IAED,IAAI,CAAC,IAAI,CAACyC,QAAQ,CAACuC,WAAW,EAAE;MAC9B;IACF;EACF;EAuFA;AACF;AACA;AACA;AACA;AACA;AACA;EACEmF,SAASA,CAAA,EAAY;IACnB,OAAO,IAAI,CAAC3J,eAAe;EAC7B;;EAEA;AACF;AACA;AACA;AACA;EACE6D,mBAAmBA,CAAA,EAAY;IAC7B,OAAO+F,OAAO,CAAC,IAAI,CAACvH,YAAY,IAAI,IAAI,CAAC1C,GAAG,CAAC;EAC/C;EAgqBA;AACF;AACA;AACA;AACA;EACE,MAAakK,QAAQA,CAAA,EAAiC;IACpD,IAAI,CAAC,IAAI,CAACC,KAAK,EAAE;MACf,IAAI,CAACA,KAAK,GAAG,MAAMzK,mBAAmB,CAAC0K,GAAG,CAAC,IAAI,CAAClI,OAAO,CAAC;IAC1D;IAEA,OAAO,IAAI,CAACiI,KAAK;EACnB;AACF;AAACrK,eAAA,CAr1BYH,cAAc,2BAGM,gBAAgB","ignoreList":[]}
1
+ {"version":3,"file":"WalletObserver.class.js","names":["APIErrorCode","AssetAmount","merge","EWalletObserverEvents","ADA_ASSET_ID","isAdaAsset","normalizeAssetIdWithDot","getCardanoCore","getCardanoUtil","getPeerConnect","ReadOnlyApi","WalletBalanceMap","WalletObserverEvent","WalletObserverUtils","WalletObserver","constructor","options","_defineProperty","Promise","resolve","Map","pending","_syncQueue","then","_doSync","catch","api","Error","start","performance","now","_performingSync","dispatch","SYNCING_WALLET_START","newBalanceMap","getBalanceMap","syncApi","SYNCING_WALLET_END","newNetwork","newUsedAddresses","newUnusedAddresses","newOutputs","newCollateral","newFeeAddress","newChangeAddress","all","getNetwork","getUsedAddresses","getUnusedAddresses","getUtxos","getCollateral","getFeeAddress","getChangeAddress","result","balanceMap","usedAddresses","unusedAddresses","utxos","collateral","network","feeAddress","changeAddress","end","_options","debug","console","log","activeWallet","e","selectedWallet","attempts","shouldContinue","startsWith","readOnlyProvider","getNetworkId","cardano","window","parent","enable","includes","message","code","Refused","undefined","res","setTimeout","metadataResolverChanged","metadataResolver","_metadataAbortController","abort","_cachedMetadata","_lastBalanceCbor","_lastBalanceMap","hasActiveConnection","sync","extension","CONNECT_WALLET_START","extensionObject","peerConnectInstance","shutdownServer","warn","connectTimeout","CONNECT_WALLET_END","data","persistence","cause","seed","mainAddress","localStorage","setItem","PERSISTENCE_CACHE_KEY","JSON","stringify","DAppPeerConnect","peerConnectArgs","name","dAppInfo","icon","getIdenticon","instance","_lastUsedAddressesCbor","_lastUsedAddresses","_lastUnusedAddressesCbor","_lastUnusedAddresses","_lastChangeAddressCbor","_lastChangeAddress","_clearSyncCaches","removeItem","DISCONNECT","Cardano","typedHex","cbor","Address","fromBytes","toBech32","GET_BALANCE_MAP_START","Serialization","getBalance","GET_BALANCE_MAP_END","Value","fromCbor","multiassetKeys","multiasset","keys","metadata","__metadataResolverWithCache","set","coin","get","multiassetEntries","entries","id","amount","val","length","every","v","i","map","txOutput","TransactionUnspentOutput","input","bind","output","address","experimental","funcCall","assetIds","cachedKeys","Set","inputKeys","size","key","has","AbortController","currentController","newMetadata","normalizeAssetId","signal","aborted","fallbackMetadataResolver","forEach","assetId","decimals","url","location","hostname","onApiEject","disconnect","onApiInject","connectWallet","verifyConnection","walletInfo","callback","requestAutoconnect","useWalletDiscovery","announce","isSyncing","Boolean","getUtils","utils","new"],"sources":["../../../src/classes/WalletObserver.class.ts"],"sourcesContent":["import type { TransactionUnspentOutput } from \"@cardano-sdk/core/dist/cjs/Serialization/index.js\";\nimport {\n APIErrorCode,\n type ApiError,\n type Cip30WalletApi,\n type GetCollateral,\n} from \"@cardano-sdk/dapp-connector\";\nimport { AssetAmount, type IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport merge from \"lodash/merge.js\";\n\nimport { EWalletObserverEvents } from \"../@types/events.js\";\nimport type {\n IResolvedWalletObserverOptions,\n IWalletObserverSeed,\n IWalletObserverSync,\n TMetadataResolverFunc,\n TWalletObserverOptions,\n} from \"../@types/observer.js\";\nimport { ADA_ASSET_ID } from \"../constants.js\";\nimport { isAdaAsset, normalizeAssetIdWithDot } from \"../utils/assets.js\";\nimport {\n getCardanoCore,\n getCardanoUtil,\n getPeerConnect,\n} from \"../utils/getLibs.js\";\nimport { ReadOnlyApi } from \"./ReadOnlyApi.class.js\";\nimport { WalletBalanceMap } from \"./WalletBalanceMap.class.js\";\nimport { WalletObserverEvent } from \"./WalletObserverEvent.js\";\nimport { WalletObserverUtils } from \"./WalletObserverUtils.class.js\";\n\n/**\n * Class representing the Wallet Observer. This is the main interface\n * for interacting with a wallet extension that is available in the\n * browser window. It handles all the deserialization required when\n * querying raw data from a CIP-30 API, and converts it to readable and\n * usable interfaces.\n *\n * Notably, it extends the WalletObserverEvent class which\n * acts as an internal event handler to hook into actions, such as connecting,\n * syncing, and disconnecting.\n *\n * @template AssetMetadata - Type extending IAssetAmountMetadata.\n * @extends {WalletObserverEvent<AssetMetadata>}\n */\nexport class WalletObserver<\n AssetMetadata extends IAssetAmountMetadata = IAssetAmountMetadata,\n> extends WalletObserverEvent<AssetMetadata> {\n static PERSISTENCE_CACHE_KEY = \"walletObserver\";\n public network: number = 0;\n public api?: Cip30WalletApi;\n public activeWallet?: string;\n public utils?: WalletObserverUtils;\n public peerConnectInstance?: import(\"@fabianbormann/cardano-peer-connect\").DAppPeerConnect;\n\n private _performingSync: boolean = false;\n private _syncQueue: Promise<IWalletObserverSync<AssetMetadata> | void> =\n Promise.resolve();\n private _options: IResolvedWalletObserverOptions<AssetMetadata>;\n\n // Caching\n private _cachedMetadata: Map<string, AssetMetadata> = new Map();\n private _lastBalanceCbor: string | null = null;\n private _lastBalanceMap: WalletBalanceMap<AssetMetadata> | null = null;\n private _lastUsedAddressesCbor: string[] | null = null;\n private _lastUsedAddresses: string[] | null = null;\n private _lastUnusedAddressesCbor: string[] | null = null;\n private _lastUnusedAddresses: string[] | null = null;\n private _lastChangeAddressCbor: string | null = null;\n private _lastChangeAddress: string | null = null;\n\n // AbortController for cancelling in-flight metadata fetches when metadataResolver changes\n private _metadataAbortController: AbortController | null = null;\n\n /**\n * Creates an instance of WalletObserver.\n *\n * @param {Partial<TWalletObserverOptions<AssetMetadata>>} [options] - Options for the wallet observer.\n */\n constructor(options?: Partial<TWalletObserverOptions<AssetMetadata>>) {\n super();\n\n // Set options.\n this._options = merge<IResolvedWalletObserverOptions, typeof options>(\n {\n metadataResolver: this.fallbackMetadataResolver,\n persistence: false,\n connectTimeout: 10000,\n debug: false,\n peerConnectArgs: {\n dAppInfo: {\n name: \"Placeholder dApp Connecter Name\",\n url: window.location.hostname,\n },\n onApiEject: (name, address) => {\n options?.peerConnectArgs?.onApiEject?.(name, address);\n this.disconnect();\n },\n onApiInject: (name, address) => {\n options?.peerConnectArgs?.onApiInject?.(name, address);\n this.connectWallet(name);\n },\n verifyConnection(walletInfo, callback) {\n return callback(true, walletInfo.requestAutoconnect ?? true);\n },\n useWalletDiscovery: true,\n announce: [\n \"wss://tracker.de-5.eternl.art\",\n \"wss://tracker.de-6.eternl.art\",\n \"wss://tracker.us-5.eternl.art\",\n ],\n },\n },\n options,\n );\n\n if (!this._options.persistence) {\n return;\n }\n }\n\n /**\n * Synchronizes the wallet. This method handles syncing the class\n * against the currently selected active wallet. If the wallet has\n * changed networks, or if the account within the wallet has changed,\n * this method will automatically attempt to reconcile this error before\n * eventually throwing.\n *\n * In the event that a promise will not resolve due to external issues,\n * after 7 seconds, a timeout function will fire that resets the API and tries again.\n *\n * @returns {Promise<IWalletObserverSync<AssetMetadata>>} - A promise that resolves to the wallet sync data.\n */\n sync = (): Promise<IWalletObserverSync<AssetMetadata>> => {\n const pending = this._syncQueue.then(() => this._doSync());\n // Chain onto queue but swallow rejections in the queue itself\n // so a failed sync doesn't block subsequent syncs.\n this._syncQueue = pending.catch(() => {});\n return pending;\n };\n\n private _doSync = async (): Promise<IWalletObserverSync<AssetMetadata>> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to perform a sync operation without a connected wallet.\",\n );\n }\n\n const start = performance.now();\n\n try {\n this._performingSync = true;\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_START);\n\n // Check if account has changed.\n let newBalanceMap = await this.getBalanceMap();\n if (newBalanceMap instanceof Error) {\n await this.syncApi();\n newBalanceMap = await this.getBalanceMap();\n\n if (newBalanceMap instanceof Error) {\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);\n this._performingSync = false;\n throw newBalanceMap;\n }\n }\n\n const [\n newNetwork,\n newUsedAddresses,\n newUnusedAddresses,\n newOutputs,\n newCollateral,\n newFeeAddress,\n newChangeAddress,\n ] = await Promise.all([\n this.getNetwork(),\n this.getUsedAddresses(),\n this.getUnusedAddresses(),\n this.getUtxos(),\n this.getCollateral(),\n this.getFeeAddress(),\n this.getChangeAddress(),\n ]);\n\n const result: IWalletObserverSync<AssetMetadata> = {\n balanceMap: newBalanceMap,\n usedAddresses: newUsedAddresses,\n unusedAddresses: newUnusedAddresses,\n utxos: newOutputs,\n collateral: newCollateral,\n network: newNetwork,\n feeAddress: newFeeAddress,\n changeAddress: newChangeAddress,\n };\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`sync: ${end - start}ms`);\n }\n\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END, {\n ...result,\n activeWallet: this.activeWallet!,\n });\n this._performingSync = false;\n return result;\n } catch (e) {\n this._performingSync = false;\n this.dispatch(EWalletObserverEvents.SYNCING_WALLET_END);\n throw e;\n }\n };\n\n /**\n * Helper method to check if the class is currently performing a sync\n * operation. This is useful to avoid duplicate calls, but does not\n * prevent it within the class.\n *\n * @returns {boolean}\n */\n isSyncing(): boolean {\n return this._performingSync;\n }\n\n /**\n * Helper method to check if the instance has an active connection.\n *\n * @returns {boolean}\n */\n hasActiveConnection(): boolean {\n return Boolean(this.activeWallet && this.api);\n }\n\n /**\n * Synchronizes the API with the wallet. This is useful if the account has changed,\n * but the underlying intent has not.\n *\n * @param {string} [activeWallet] - The wallet to sync with.\n * @returns {Promise<Cip30WalletApi | undefined>} - A promise that resolves to the API instance.\n */\n syncApi = async (\n activeWallet?: string,\n ): Promise<Cip30WalletApi | undefined> => {\n if (!activeWallet && !this.activeWallet) {\n throw new Error(\n \"A wallet is required to be passed as a parameter, or to be defined in the class.\",\n );\n }\n\n const selectedWallet = (activeWallet || this.activeWallet) as string;\n\n let attempts = 0;\n let shouldContinue = true;\n\n if (selectedWallet.startsWith(\"addr\")) {\n if (!this._options.readOnlyProvider) {\n throw new Error(\n \"You must provide a ReadOnlyProvider when connecting with a read-only address.\",\n );\n }\n\n this.api = new ReadOnlyApi(\n selectedWallet,\n selectedWallet.startsWith(\"addr_test\") ? 0 : 1,\n this._options.readOnlyProvider,\n );\n this.network = await this.api.getNetworkId();\n return this.api;\n }\n\n while (shouldContinue) {\n if (attempts === 10) {\n throw new Error(\n \"Could not reconnect to the selected wallet. Please check your extension.\",\n );\n }\n\n try {\n const cardano = window?.cardano || window?.parent?.cardano;\n const api = await cardano?.[selectedWallet]?.enable();\n\n if (!api) {\n throw Error;\n }\n\n this.api = api;\n this.network = await api.getNetworkId();\n shouldContinue = false;\n } catch (e) {\n if (\n [\n \"user canceled connection\",\n \"User declined to sign the data.\",\n ].includes((e as Error)?.message) ||\n (e as ApiError)?.code === APIErrorCode.Refused\n ) {\n shouldContinue = false;\n return undefined;\n }\n\n await new Promise((res) => setTimeout(res, 200));\n attempts++;\n }\n }\n\n return this.api;\n };\n\n /**\n * Gets the options for the wallet observer.\n *\n * @returns {TWalletObserverOptions} - The wallet observer options.\n */\n getOptions = (): TWalletObserverOptions => {\n return this._options;\n };\n\n /**\n * Updates the wallet observer options. Merges the new options with the existing ones.\n * If metadataResolver changes, cancels any in-flight metadata fetch, clears the cache,\n * and triggers a new sync if there is an active connection.\n *\n * @param {Partial<TWalletObserverOptions<AssetMetadata>>} options - The new options to merge.\n */\n updateOptions = (\n options: Partial<TWalletObserverOptions<AssetMetadata>>,\n ): void => {\n const metadataResolverChanged =\n options.metadataResolver &&\n options.metadataResolver !== this._options.metadataResolver;\n\n this._options = merge<\n IResolvedWalletObserverOptions<AssetMetadata>,\n typeof options\n >(this._options, options);\n\n // If metadataResolver changed, abort in-flight fetch, clear cache, and re-sync\n if (metadataResolverChanged) {\n this._metadataAbortController?.abort();\n this._cachedMetadata = new Map();\n this._lastBalanceCbor = null;\n this._lastBalanceMap = null;\n\n // Trigger a new sync if there's an active connection\n if (this.hasActiveConnection() && !this._performingSync) {\n this.sync();\n }\n }\n };\n\n /**\n * Attempts to connect a wallet using the global window\n * reference. If no reference is found, it will retry for\n * 10 seconds before throw an error.\n *\n * @param {string} extension The name of the extension to enable.\n * @return {Promise<IWalletObserverSync<AssetMetadata> | Error>}\n */\n connectWallet = async (\n extension: string,\n ): Promise<IWalletObserverSync<AssetMetadata> | Error> => {\n const start = performance.now();\n this.dispatch(EWalletObserverEvents.CONNECT_WALLET_START);\n\n let attempts = 0;\n let extensionObject = window.cardano?.[extension];\n\n // Disconnect any CIP45 connections.\n if (!extension?.includes(\"p2p\")) {\n this.peerConnectInstance?.shutdownServer();\n }\n\n while (\n typeof extensionObject === \"undefined\" &&\n !extension.startsWith(\"addr\")\n ) {\n if (this._options.debug) {\n console.warn(`Could not find extension: ${extension}. Trying again...`);\n }\n\n if (attempts === 40) {\n break;\n }\n\n await new Promise((res) =>\n setTimeout(res, (this._options.connectTimeout as number) / 40),\n );\n extensionObject = window.cardano?.[extension];\n attempts++;\n }\n\n if (!extensionObject && !extension.startsWith(\"addr\")) {\n this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END);\n throw new Error(\n `Could not find extension (${extension}) in the global context.`,\n );\n }\n\n this.activeWallet = extension;\n await this.syncApi(extension);\n const data = await this.sync();\n\n if (this._options.persistence) {\n if (data.usedAddresses instanceof Error) {\n data.usedAddresses.cause =\n \"Could not get a list of used addresses from the wallet when trying to save the connection.\";\n throw data.usedAddresses;\n }\n\n const seed: IWalletObserverSeed = {\n activeWallet: extension,\n mainAddress: data.usedAddresses[0],\n };\n\n window.localStorage.setItem(\n WalletObserver.PERSISTENCE_CACHE_KEY,\n JSON.stringify(seed),\n );\n }\n\n this.dispatch(EWalletObserverEvents.CONNECT_WALLET_END, {\n ...data,\n activeWallet: extension,\n });\n const end = performance.now();\n if (this._options.debug) {\n console.log(`connectWallet: ${end - start}ms`);\n }\n\n return data;\n };\n\n getCip45Instance = async () => {\n const start = performance.now();\n if (!this.peerConnectInstance) {\n const DAppPeerConnect = await getPeerConnect();\n this.peerConnectInstance = new DAppPeerConnect(\n this._options.peerConnectArgs,\n );\n }\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getCip45Instance: ${end - start}ms`);\n }\n\n return {\n name: this._options.peerConnectArgs.dAppInfo.name,\n icon: this.peerConnectInstance.getIdenticon(),\n instance: this.peerConnectInstance,\n };\n };\n\n /**\n * Helper function to retrieve the currently cached metadata.\n *\n * @returns {Map<string, AssetMetadata>}\n */\n getCachedAssetMetadata = (): Map<string, AssetMetadata> =>\n this._cachedMetadata;\n\n /**\n * Clears the cached metadata and triggers a fresh sync to re-fetch metadata.\n * Useful when the client wants to manually refresh metadata without changing the resolver.\n *\n * @returns {Promise<void>}\n */\n resyncMetadata = async (): Promise<void> => {\n // Abort any in-flight fetch\n this._metadataAbortController?.abort();\n // Clear the cache\n this._cachedMetadata = new Map();\n this._lastBalanceCbor = null;\n this._lastBalanceMap = null;\n\n // Trigger a new sync if there's an active connection\n if (this.hasActiveConnection()) {\n await this.sync();\n }\n };\n\n /**\n * Helper function to restore the class instance to its initial state.\n *\n * @returns {void}\n */\n private _clearSyncCaches = (): void => {\n this._lastBalanceCbor = null;\n this._lastBalanceMap = null;\n this._lastUsedAddressesCbor = null;\n this._lastUsedAddresses = null;\n this._lastUnusedAddressesCbor = null;\n this._lastUnusedAddresses = null;\n this._lastChangeAddressCbor = null;\n this._lastChangeAddress = null;\n };\n\n disconnect = (): void => {\n this.activeWallet = undefined;\n this.api = undefined;\n this._clearSyncCaches();\n window.localStorage.removeItem(WalletObserver.PERSISTENCE_CACHE_KEY);\n this.dispatch(EWalletObserverEvents.DISCONNECT);\n };\n\n /**\n * Gets a the change address.\n *\n * @returns {Promise<string | Error>} The change address, or an error.\n */\n getChangeAddress = async (): Promise<string | Error> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query change address without an API instance.\",\n );\n }\n\n const start = performance.now();\n\n const [{ Cardano }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string;\n try {\n cbor = await this.api.getChangeAddress();\n } catch (e) {\n return e as Error;\n }\n\n // Return cached if CBOR hasn't changed\n if (cbor === this._lastChangeAddressCbor && this._lastChangeAddress) {\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getChangeAddress (cached): ${end - start}ms`);\n }\n return this._lastChangeAddress;\n }\n\n const data = Cardano.Address.fromBytes(typedHex(cbor)).toBech32();\n\n this._lastChangeAddressCbor = cbor;\n this._lastChangeAddress = data;\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getChangeAddress: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Retrieves the balance of the wallet, including metadata for each asset.\n *\n * @returns {Promise<WalletBalanceMap<AssetMetadata>>} - A promise that resolves to a map of asset amounts keyed by asset IDs.\n */\n getBalanceMap = async (): Promise<\n WalletBalanceMap<AssetMetadata> | Error\n > => {\n if (!this.api) {\n throw new Error(\"Attempted to query balance without an API instance.\");\n }\n\n const start = performance.now();\n\n this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_START);\n const [{ Serialization }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string;\n try {\n cbor = await this.api.getBalance();\n } catch (e) {\n return e as Error;\n }\n\n // Return cached map if CBOR hasn't changed\n if (cbor === this._lastBalanceCbor && this._lastBalanceMap) {\n this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_END, {\n balanceMap: this._lastBalanceMap,\n });\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getBalanceMap (cached): ${end - start}ms`);\n }\n return this._lastBalanceMap;\n }\n\n const data = Serialization.Value.fromCbor(typedHex(cbor));\n const multiassetKeys = data.multiasset()?.keys() ?? [];\n\n const metadata = await this.__metadataResolverWithCache([\n ADA_ASSET_ID,\n ...multiassetKeys,\n ]);\n\n const balanceMap = new WalletBalanceMap<AssetMetadata>(this);\n balanceMap.set(\n ADA_ASSET_ID,\n new AssetAmount(data.coin(), metadata.get(ADA_ASSET_ID)),\n );\n\n const multiassetEntries = data.multiasset()?.entries() ?? [];\n if (multiassetEntries) {\n for (const [id, amount] of multiassetEntries) {\n balanceMap.set(\n normalizeAssetIdWithDot(id),\n new AssetAmount(amount, metadata.get(normalizeAssetIdWithDot(id))),\n );\n }\n }\n\n this._lastBalanceCbor = cbor;\n this._lastBalanceMap = balanceMap;\n\n this.dispatch(EWalletObserverEvents.GET_BALANCE_MAP_END, {\n balanceMap,\n });\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getBalanceMap: ${end - start}ms`);\n }\n\n return balanceMap;\n };\n\n /**\n * Gets the current network connection.\n *\n * @returns {Promise<number | Error>} The network ID or an Error from the wallet.\n */\n getNetwork = async (): Promise<number | Error> => {\n if (!this.api) {\n throw new Error(\"Attempted to query network without an API instance.\");\n }\n\n const start = performance.now();\n\n let val: number;\n try {\n val = await this.api.getNetworkId();\n } catch (e) {\n return e as Error;\n }\n\n this.network = val;\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getNetwork: ${end - start}ms`);\n }\n return val;\n };\n\n /**\n * Gets a list of used addresses, encoded as Bech32.\n *\n * @returns {Promise<string[]>} The list of addresses.\n */\n getUsedAddresses = async (): Promise<string[] | Error> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query used addresses without an API instance.\",\n );\n }\n\n const start = performance.now();\n\n const [{ Cardano }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[];\n try {\n cbor = await this.api.getUsedAddresses();\n } catch (e) {\n return e as Error;\n }\n\n // Return cached if CBOR hasn't changed\n if (\n this._lastUsedAddressesCbor &&\n this._lastUsedAddresses &&\n cbor.length === this._lastUsedAddressesCbor.length &&\n cbor.every((v, i) => v === this._lastUsedAddressesCbor![i])\n ) {\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUsedAddresses (cached): ${end - start}ms`);\n }\n return this._lastUsedAddresses;\n }\n\n const data = cbor.map((val) =>\n Cardano.Address.fromBytes(typedHex(val)).toBech32(),\n );\n\n this._lastUsedAddressesCbor = cbor;\n this._lastUsedAddresses = data;\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUsedAddresses: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Gets a list of unused addresses, encoded as Bech32.\n *\n * @returns {Promise<string[] | Error>} The list of addresses or an Error returned by the wallet.\n */\n getUnusedAddresses = async (): Promise<string[] | Error> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query unused addresses without an API instance.\",\n );\n }\n\n const start = performance.now();\n\n const [{ Cardano }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[];\n try {\n cbor = await this.api.getUnusedAddresses();\n } catch (e) {\n return e as Error;\n }\n\n // Return cached if CBOR hasn't changed\n if (\n this._lastUnusedAddressesCbor &&\n this._lastUnusedAddresses &&\n cbor.length === this._lastUnusedAddressesCbor.length &&\n cbor.every((v, i) => v === this._lastUnusedAddressesCbor![i])\n ) {\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUnusedAddresses (cached): ${end - start}ms`);\n }\n return this._lastUnusedAddresses;\n }\n\n const data = cbor.map((val) =>\n Cardano.Address.fromBytes(typedHex(val)).toBech32(),\n );\n\n this._lastUnusedAddressesCbor = cbor;\n this._lastUnusedAddresses = data;\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUnusedAddresses: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Gets a list of wallet UTXOs.\n *\n * @returns {Promise<TransactionUnspentOutput[]>} The list of TransactionUnspentOutputs.\n */\n getUtxos = async (): Promise<\n TransactionUnspentOutput[] | Error | undefined\n > => {\n if (!this.api) {\n throw new Error(\"Attempted to query UTXOs without an API instance.\");\n }\n\n const start = performance.now();\n\n const [{ Serialization }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[] | null;\n try {\n cbor = await this.api.getUtxos();\n } catch (e) {\n return e as Error;\n }\n\n const data = cbor?.map((val) => {\n const txOutput = Serialization.TransactionUnspentOutput.fromCbor(\n typedHex(val),\n );\n\n // These methods must be bound to their initial creation instance.\n txOutput.input = txOutput.input.bind(txOutput);\n txOutput.output = txOutput.output.bind(txOutput);\n return txOutput;\n });\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getUtxos: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Gets the fee address set by the wallet, if available.\n *\n * @returns {Promise<string | Error | undefined>} The fee address or an Error.\n */\n getFeeAddress = async (): Promise<string | Error | undefined> => {\n if (!this.api) {\n throw new Error(\n \"Attempted to query fee address without an API instance.\",\n );\n }\n\n const start = performance.now();\n try {\n const address =\n window.cardano?.[this.activeWallet!]?.experimental?.feeAddress;\n const end = performance.now();\n\n if (this._options.debug) {\n console.log(`getFeeAddress: ${end - start}ms`);\n }\n\n return address;\n } catch (e) {\n return e as Error;\n }\n };\n\n /**\n * Gets a list of wallet UTXOs suitable for collateral.\n *\n * @returns {Promise<TransactionUnspentOutput[] | Error | undefined>} The list of TransactionUnspentOutputs, if there are any, or an Error.\n */\n getCollateral = async (): Promise<\n TransactionUnspentOutput[] | Error | undefined\n > => {\n if (!this.api) {\n throw new Error(\"Attempted to query UTXOs without an API instance.\");\n }\n\n const start = performance.now();\n\n const [{ Serialization }, typedHex] = await Promise.all([\n getCardanoCore(),\n getCardanoUtil(),\n ]);\n\n let cbor: string[] | null;\n try {\n const funcCall =\n this.api?.getCollateral ||\n (this.api?.experimental.getCollateral as GetCollateral);\n if (typeof funcCall !== \"function\") {\n cbor = [];\n } else {\n cbor = await funcCall();\n }\n } catch (e) {\n return e as Error;\n }\n\n const data = cbor?.map((val) => {\n const txOutput = Serialization.TransactionUnspentOutput.fromCbor(\n typedHex(val),\n );\n\n // These methods must be bound to their initial creation instance.\n txOutput.input = txOutput.input.bind(txOutput);\n txOutput.output = txOutput.output.bind(txOutput);\n return txOutput;\n });\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`getCollateral: ${end - start}ms`);\n }\n return data;\n };\n\n /**\n * Resolves metadata for the given asset IDs, using a cached version if available.\n * Aborts any in-flight fetch when called, ensuring only the latest request completes.\n *\n * @private\n * @param {string[]} assetIds - The IDs of the assets to resolve metadata for.\n * @returns {Promise<Map<string, AssetMetadata>>} - A promise that resolves to a map of asset metadata.\n */\n private __metadataResolverWithCache = async (\n assetIds: string[],\n ): Promise<Map<string, AssetMetadata>> => {\n const start = performance.now();\n\n if (this._cachedMetadata) {\n const cachedKeys = new Set(this._cachedMetadata.keys());\n const inputKeys = new Set(assetIds);\n\n if (\n cachedKeys.size === inputKeys.size &&\n [...cachedKeys].every((key) => inputKeys.has(key))\n ) {\n const end = performance.now();\n if (this._options.debug) {\n console.log(`metadataResolver (cached): ${end - start}ms`);\n }\n return this._cachedMetadata;\n }\n }\n\n // Abort any in-flight metadata fetch\n this._metadataAbortController?.abort();\n this._metadataAbortController = new AbortController();\n const currentController = this._metadataAbortController;\n\n let attempts = 0;\n let newMetadata: Map<string, AssetMetadata> | undefined;\n while (attempts <= 3 && !newMetadata) {\n try {\n newMetadata = await this._options.metadataResolver({\n assetIds: assetIds.map(normalizeAssetIdWithDot),\n normalizeAssetId: normalizeAssetIdWithDot,\n isAdaAsset,\n });\n } catch (e) {\n attempts++;\n }\n }\n\n // If this request was aborted while in-flight, return current cache (a new fetch is in progress)\n if (currentController.signal.aborted) {\n return this._cachedMetadata;\n }\n\n if (!newMetadata) {\n newMetadata = await this.fallbackMetadataResolver({\n assetIds: assetIds.map(normalizeAssetIdWithDot),\n normalizeAssetId: normalizeAssetIdWithDot,\n isAdaAsset,\n });\n }\n\n // Double-check abort status after fallback resolver\n if (currentController.signal.aborted) {\n return this._cachedMetadata;\n }\n\n this._cachedMetadata = newMetadata;\n\n const end = performance.now();\n if (this._options.debug) {\n console.log(`metadataResolver: ${end - start}ms`);\n }\n return newMetadata;\n };\n\n /**\n * A fallback metadata resolver function that generates default metadata for given asset IDs.\n *\n * @type {TMetadataResolverFunc<AssetMetadata>}\n */\n public fallbackMetadataResolver: TMetadataResolverFunc<AssetMetadata> =\n async ({ assetIds }) => {\n const map = new Map<string, AssetMetadata>();\n assetIds.forEach((id) =>\n map.set(normalizeAssetIdWithDot(id), {\n assetId: normalizeAssetIdWithDot(id),\n decimals: 6,\n } as AssetMetadata),\n );\n\n return map;\n };\n\n /**\n * Helper method to retrieve the cached utils instance.\n *\n * @returns {Promise<WalletObserverUtils>} Resolves to a WalletObserverUtils class.\n */\n public async getUtils(): Promise<WalletObserverUtils> {\n if (!this.utils) {\n this.utils = await WalletObserverUtils.new(this.network);\n }\n\n return this.utils;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { Suspense } from "react";
1
+ import { memo, Suspense } from "react";
2
2
  import { ErrorBoundary } from "react-error-boundary";
3
3
  import { useWalletObserver } from "./hooks/useWalletObserver.js";
4
4
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -8,7 +8,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
8
8
  * compose on this and include state for Handles, PeerConnect (CIP-45),
9
9
  * and syncing state (RenderWalletState).
10
10
  */
11
- export const RenderWallet = ({
11
+ const RenderWalletInner = ({
12
12
  render,
13
13
  loader,
14
14
  fallback
@@ -27,4 +27,5 @@ export const RenderWallet = ({
27
27
  })
28
28
  });
29
29
  };
30
+ export const RenderWallet = /*#__PURE__*/memo(RenderWalletInner);
30
31
  //# sourceMappingURL=RenderWallet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderWallet.js","names":["Suspense","ErrorBoundary","useWalletObserver","jsx","_jsx","RenderWallet","render","loader","fallback","state","onError","error","observer","getOptions","debug","console","log","message","stack","children"],"sources":["../../../src/react-components/RenderWallet.tsx"],"sourcesContent":["import { IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport { ReactElement, ReactNode, Suspense } from \"react\";\n\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useWalletObserver } from \"./hooks/useWalletObserver.js\";\n\nexport type TRenderWalletFunctionState<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = ReturnType<typeof useWalletObserver<T>>;\n\nexport type TRenderWalletFunction<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = (state: TRenderWalletFunctionState<T>) => JSX.Element | ReactNode;\n\nexport interface IRenderWalletProps<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> {\n render: TRenderWalletFunction<T>;\n loader?: ReactNode;\n fallback?: ReactElement;\n}\n\n/**\n * This component is responsible for rendering just the wallet state\n * that is returned from syncWallet. It is the basics. Other components\n * compose on this and include state for Handles, PeerConnect (CIP-45),\n * and syncing state (RenderWalletState).\n */\nexport const RenderWallet = <\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n>({\n render,\n loader,\n fallback,\n}: IRenderWalletProps<T>) => {\n const state = useWalletObserver<T>();\n\n return (\n <ErrorBoundary\n fallback={fallback || null}\n onError={(error) => {\n if (state.observer.getOptions().debug) {\n console.log(error.message, error.stack);\n }\n }}\n >\n <Suspense fallback={loader}>{render(state)}</Suspense>\n </ErrorBoundary>\n );\n};\n"],"mappings":"AACA,SAAkCA,QAAQ,QAAQ,OAAO;AAEzD,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,iBAAiB,QAAQ,8BAA8B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAkBjE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,GAAGA,CAE1B;EACAC,MAAM;EACNC,MAAM;EACNC;AACqB,CAAC,KAAK;EAC3B,MAAMC,KAAK,GAAGP,iBAAiB,CAAI,CAAC;EAEpC,oBACEE,IAAA,CAACH,aAAa;IACZO,QAAQ,EAAEA,QAAQ,IAAI,IAAK;IAC3BE,OAAO,EAAGC,KAAK,IAAK;MAClB,IAAIF,KAAK,CAACG,QAAQ,CAACC,UAAU,CAAC,CAAC,CAACC,KAAK,EAAE;QACrCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACM,OAAO,EAAEN,KAAK,CAACO,KAAK,CAAC;MACzC;IACF,CAAE;IAAAC,QAAA,eAEFf,IAAA,CAACJ,QAAQ;MAACQ,QAAQ,EAAED,MAAO;MAAAY,QAAA,EAAEb,MAAM,CAACG,KAAK;IAAC,CAAW;EAAC,CACzC,CAAC;AAEpB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"RenderWallet.js","names":["memo","Suspense","ErrorBoundary","useWalletObserver","jsx","_jsx","RenderWalletInner","render","loader","fallback","state","onError","error","observer","getOptions","debug","console","log","message","stack","children","RenderWallet"],"sources":["../../../src/react-components/RenderWallet.tsx"],"sourcesContent":["import { IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport { memo, ReactElement, ReactNode, Suspense } from \"react\";\n\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useWalletObserver } from \"./hooks/useWalletObserver.js\";\n\nexport type TRenderWalletFunctionState<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = ReturnType<typeof useWalletObserver<T>>;\n\nexport type TRenderWalletFunction<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = (state: TRenderWalletFunctionState<T>) => JSX.Element | ReactNode;\n\nexport interface IRenderWalletProps<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> {\n render: TRenderWalletFunction<T>;\n loader?: ReactNode;\n fallback?: ReactElement;\n}\n\n/**\n * This component is responsible for rendering just the wallet state\n * that is returned from syncWallet. It is the basics. Other components\n * compose on this and include state for Handles, PeerConnect (CIP-45),\n * and syncing state (RenderWalletState).\n */\nconst RenderWalletInner = <\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n>({\n render,\n loader,\n fallback,\n}: IRenderWalletProps<T>) => {\n const state = useWalletObserver<T>();\n\n return (\n <ErrorBoundary\n fallback={fallback || null}\n onError={(error) => {\n if (state.observer.getOptions().debug) {\n console.log(error.message, error.stack);\n }\n }}\n >\n <Suspense fallback={loader}>{render(state)}</Suspense>\n </ErrorBoundary>\n );\n};\n\nexport const RenderWallet = memo(RenderWalletInner) as typeof RenderWalletInner;\n"],"mappings":"AACA,SAASA,IAAI,EAA2BC,QAAQ,QAAQ,OAAO;AAE/D,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,iBAAiB,QAAQ,8BAA8B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAkBjE;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAGA,CAExB;EACAC,MAAM;EACNC,MAAM;EACNC;AACqB,CAAC,KAAK;EAC3B,MAAMC,KAAK,GAAGP,iBAAiB,CAAI,CAAC;EAEpC,oBACEE,IAAA,CAACH,aAAa;IACZO,QAAQ,EAAEA,QAAQ,IAAI,IAAK;IAC3BE,OAAO,EAAGC,KAAK,IAAK;MAClB,IAAIF,KAAK,CAACG,QAAQ,CAACC,UAAU,CAAC,CAAC,CAACC,KAAK,EAAE;QACrCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACM,OAAO,EAAEN,KAAK,CAACO,KAAK,CAAC;MACzC;IACF,CAAE;IAAAC,QAAA,eAEFf,IAAA,CAACJ,QAAQ;MAACQ,QAAQ,EAAED,MAAO;MAAAY,QAAA,EAAEb,MAAM,CAACG,KAAK;IAAC,CAAW;EAAC,CACzC,CAAC;AAEpB,CAAC;AAED,OAAO,MAAMW,YAAY,gBAAGrB,IAAI,CAACM,iBAAiB,CAA6B","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { Suspense } from "react";
1
+ import { memo, Suspense } from "react";
2
2
  import { ErrorBoundary } from "react-error-boundary";
3
3
  import { useWalletHandles } from "./hooks/useWalletHandles.js";
4
4
  import { useWalletObserver } from "./hooks/useWalletObserver.js";
@@ -8,7 +8,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
8
8
  * fetching and updating wallet Handles with their extra
9
9
  * metadata.
10
10
  */
11
- export const RenderWalletHandles = ({
11
+ const RenderWalletHandlesInner = ({
12
12
  render,
13
13
  loader,
14
14
  fallback
@@ -31,4 +31,5 @@ export const RenderWalletHandles = ({
31
31
  })
32
32
  });
33
33
  };
34
+ export const RenderWalletHandles = /*#__PURE__*/memo(RenderWalletHandlesInner);
34
35
  //# sourceMappingURL=RenderWalletHandles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderWalletHandles.js","names":["Suspense","ErrorBoundary","useWalletHandles","useWalletObserver","jsx","_jsx","RenderWalletHandles","render","loader","fallback","state","handleData","onError","error","observer","getOptions","debug","console","log","message","stack","children"],"sources":["../../../src/react-components/RenderWalletHandles.tsx"],"sourcesContent":["import { IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport { ReactElement, ReactNode, Suspense } from \"react\";\n\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useWalletHandles } from \"./hooks/useWalletHandles.js\";\nimport { useWalletObserver } from \"./hooks/useWalletObserver.js\";\n\nexport type TRenderWalletHandlesFunctionState<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = ReturnType<typeof useWalletObserver<T>> &\n ReturnType<typeof useWalletHandles<T>>;\n\nexport type TRenderWalletHandlesFunction<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = (state: TRenderWalletHandlesFunctionState<T>) => JSX.Element | ReactNode;\n\nexport interface IRenderWalletHandlesProps<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> {\n render: TRenderWalletHandlesFunction<T>;\n loader?: ReactNode;\n fallback?: ReactElement;\n}\n\n/**\n * This component is the same as RenderWallet, but supports\n * fetching and updating wallet Handles with their extra\n * metadata.\n */\nexport const RenderWalletHandles = <\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n>({\n render,\n loader,\n fallback,\n}: IRenderWalletHandlesProps<T>) => {\n const state = useWalletObserver<T>();\n const handleData = useWalletHandles<T>();\n\n return (\n <ErrorBoundary\n fallback={fallback || null}\n onError={(error) => {\n if (state.observer.getOptions().debug) {\n console.log(error.message, error.stack);\n }\n }}\n >\n <Suspense fallback={loader}>\n {render({ ...state, ...handleData })}\n </Suspense>\n </ErrorBoundary>\n );\n};\n"],"mappings":"AACA,SAAkCA,QAAQ,QAAQ,OAAO;AAEzD,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,iBAAiB,QAAQ,8BAA8B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAmBjE;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAGA,CAEjC;EACAC,MAAM;EACNC,MAAM;EACNC;AAC4B,CAAC,KAAK;EAClC,MAAMC,KAAK,GAAGP,iBAAiB,CAAI,CAAC;EACpC,MAAMQ,UAAU,GAAGT,gBAAgB,CAAI,CAAC;EAExC,oBACEG,IAAA,CAACJ,aAAa;IACZQ,QAAQ,EAAEA,QAAQ,IAAI,IAAK;IAC3BG,OAAO,EAAGC,KAAK,IAAK;MAClB,IAAIH,KAAK,CAACI,QAAQ,CAACC,UAAU,CAAC,CAAC,CAACC,KAAK,EAAE;QACrCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACM,OAAO,EAAEN,KAAK,CAACO,KAAK,CAAC;MACzC;IACF,CAAE;IAAAC,QAAA,eAEFhB,IAAA,CAACL,QAAQ;MAACS,QAAQ,EAAED,MAAO;MAAAa,QAAA,EACxBd,MAAM,CAAC;QAAE,GAAGG,KAAK;QAAE,GAAGC;MAAW,CAAC;IAAC,CAC5B;EAAC,CACE,CAAC;AAEpB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"RenderWalletHandles.js","names":["memo","Suspense","ErrorBoundary","useWalletHandles","useWalletObserver","jsx","_jsx","RenderWalletHandlesInner","render","loader","fallback","state","handleData","onError","error","observer","getOptions","debug","console","log","message","stack","children","RenderWalletHandles"],"sources":["../../../src/react-components/RenderWalletHandles.tsx"],"sourcesContent":["import { IAssetAmountMetadata } from \"@sundaeswap/asset\";\nimport { memo, ReactElement, ReactNode, Suspense } from \"react\";\n\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useWalletHandles } from \"./hooks/useWalletHandles.js\";\nimport { useWalletObserver } from \"./hooks/useWalletObserver.js\";\n\nexport type TRenderWalletHandlesFunctionState<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = ReturnType<typeof useWalletObserver<T>> &\n ReturnType<typeof useWalletHandles<T>>;\n\nexport type TRenderWalletHandlesFunction<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> = (state: TRenderWalletHandlesFunctionState<T>) => JSX.Element | ReactNode;\n\nexport interface IRenderWalletHandlesProps<\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n> {\n render: TRenderWalletHandlesFunction<T>;\n loader?: ReactNode;\n fallback?: ReactElement;\n}\n\n/**\n * This component is the same as RenderWallet, but supports\n * fetching and updating wallet Handles with their extra\n * metadata.\n */\nconst RenderWalletHandlesInner = <\n T extends IAssetAmountMetadata = IAssetAmountMetadata,\n>({\n render,\n loader,\n fallback,\n}: IRenderWalletHandlesProps<T>) => {\n const state = useWalletObserver<T>();\n const handleData = useWalletHandles<T>();\n\n return (\n <ErrorBoundary\n fallback={fallback || null}\n onError={(error) => {\n if (state.observer.getOptions().debug) {\n console.log(error.message, error.stack);\n }\n }}\n >\n <Suspense fallback={loader}>\n {render({ ...state, ...handleData })}\n </Suspense>\n </ErrorBoundary>\n );\n};\n\nexport const RenderWalletHandles = memo(\n RenderWalletHandlesInner,\n) as typeof RenderWalletHandlesInner;\n"],"mappings":"AACA,SAASA,IAAI,EAA2BC,QAAQ,QAAQ,OAAO;AAE/D,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,iBAAiB,QAAQ,8BAA8B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAmBjE;AACA;AACA;AACA;AACA;AACA,MAAMC,wBAAwB,GAAGA,CAE/B;EACAC,MAAM;EACNC,MAAM;EACNC;AAC4B,CAAC,KAAK;EAClC,MAAMC,KAAK,GAAGP,iBAAiB,CAAI,CAAC;EACpC,MAAMQ,UAAU,GAAGT,gBAAgB,CAAI,CAAC;EAExC,oBACEG,IAAA,CAACJ,aAAa;IACZQ,QAAQ,EAAEA,QAAQ,IAAI,IAAK;IAC3BG,OAAO,EAAGC,KAAK,IAAK;MAClB,IAAIH,KAAK,CAACI,QAAQ,CAACC,UAAU,CAAC,CAAC,CAACC,KAAK,EAAE;QACrCC,OAAO,CAACC,GAAG,CAACL,KAAK,CAACM,OAAO,EAAEN,KAAK,CAACO,KAAK,CAAC;MACzC;IACF,CAAE;IAAAC,QAAA,eAEFhB,IAAA,CAACL,QAAQ;MAACS,QAAQ,EAAED,MAAO;MAAAa,QAAA,EACxBd,MAAM,CAAC;QAAE,GAAGG,KAAK;QAAE,GAAGC;MAAW,CAAC;IAAC,CAC5B;EAAC,CACE,CAAC;AAEpB,CAAC;AAED,OAAO,MAAMW,mBAAmB,gBAAGvB,IAAI,CACrCO,wBACF,CAAoC","ignoreList":[]}