@txnlab/use-wallet 2.8.0 → 3.0.0-beta.1

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 (203) hide show
  1. package/README.md +3 -1009
  2. package/dist/index.cjs +2060 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +511 -0
  5. package/dist/index.d.ts +429 -895
  6. package/dist/index.js +2012 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +50 -119
  9. package/dist/cjs/index.js +0 -3934
  10. package/dist/cjs/index.js.map +0 -1
  11. package/dist/cjs/jest.config.d.ts +0 -11
  12. package/dist/cjs/jest.setup.d.ts +0 -0
  13. package/dist/cjs/src/algod/index.d.ts +0 -10
  14. package/dist/cjs/src/clients/algosigner/client.d.ts +0 -37
  15. package/dist/cjs/src/clients/algosigner/constants.d.ts +0 -2
  16. package/dist/cjs/src/clients/algosigner/index.d.ts +0 -2
  17. package/dist/cjs/src/clients/algosigner/types.d.ts +0 -39
  18. package/dist/cjs/src/clients/base/base.d.ts +0 -46
  19. package/dist/cjs/src/clients/base/index.d.ts +0 -2
  20. package/dist/cjs/src/clients/custom/client.d.ts +0 -18
  21. package/dist/cjs/src/clients/custom/constants.d.ts +0 -1
  22. package/dist/cjs/src/clients/custom/index.d.ts +0 -2
  23. package/dist/cjs/src/clients/custom/types.d.ts +0 -25
  24. package/dist/cjs/src/clients/daffi/client.d.ts +0 -34
  25. package/dist/cjs/src/clients/daffi/constants.d.ts +0 -1
  26. package/dist/cjs/src/clients/daffi/index.d.ts +0 -2
  27. package/dist/cjs/src/clients/daffi/types.d.ts +0 -27
  28. package/dist/cjs/src/clients/defly/client.d.ts +0 -34
  29. package/dist/cjs/src/clients/defly/constants.d.ts +0 -1
  30. package/dist/cjs/src/clients/defly/index.d.ts +0 -2
  31. package/dist/cjs/src/clients/defly/types.d.ts +0 -32
  32. package/dist/cjs/src/clients/exodus/client.d.ts +0 -33
  33. package/dist/cjs/src/clients/exodus/constants.d.ts +0 -1
  34. package/dist/cjs/src/clients/exodus/index.d.ts +0 -2
  35. package/dist/cjs/src/clients/exodus/types.d.ts +0 -34
  36. package/dist/cjs/src/clients/index.d.ts +0 -19
  37. package/dist/cjs/src/clients/kibisis/client.d.ts +0 -73
  38. package/dist/cjs/src/clients/kibisis/constants.d.ts +0 -37
  39. package/dist/cjs/src/clients/kibisis/index.d.ts +0 -2
  40. package/dist/cjs/src/clients/kibisis/types.d.ts +0 -86
  41. package/dist/cjs/src/clients/kibisis/utils.d.ts +0 -9
  42. package/dist/cjs/src/clients/kibisis/utils.test.d.ts +0 -1
  43. package/dist/cjs/src/clients/kmd/client.d.ts +0 -30
  44. package/dist/cjs/src/clients/kmd/constants.d.ts +0 -1
  45. package/dist/cjs/src/clients/kmd/index.d.ts +0 -2
  46. package/dist/cjs/src/clients/kmd/types.d.ts +0 -32
  47. package/dist/cjs/src/clients/lute/client.d.ts +0 -34
  48. package/dist/cjs/src/clients/lute/constants.d.ts +0 -1
  49. package/dist/cjs/src/clients/lute/index.d.ts +0 -2
  50. package/dist/cjs/src/clients/lute/types.d.ts +0 -15
  51. package/dist/cjs/src/clients/magic/client.d.ts +0 -35
  52. package/dist/cjs/src/clients/magic/constants.d.ts +0 -1
  53. package/dist/cjs/src/clients/magic/index.d.ts +0 -2
  54. package/dist/cjs/src/clients/magic/types.d.ts +0 -27
  55. package/dist/cjs/src/clients/mnemonic/client.d.ts +0 -35
  56. package/dist/cjs/src/clients/mnemonic/constants.d.ts +0 -1
  57. package/dist/cjs/src/clients/mnemonic/index.d.ts +0 -2
  58. package/dist/cjs/src/clients/mnemonic/types.d.ts +0 -21
  59. package/dist/cjs/src/clients/myalgo/client.d.ts +0 -33
  60. package/dist/cjs/src/clients/myalgo/constants.d.ts +0 -1
  61. package/dist/cjs/src/clients/myalgo/index.d.ts +0 -2
  62. package/dist/cjs/src/clients/myalgo/types.d.ts +0 -19
  63. package/dist/cjs/src/clients/pera/client.d.ts +0 -34
  64. package/dist/cjs/src/clients/pera/constants.d.ts +0 -1
  65. package/dist/cjs/src/clients/pera/index.d.ts +0 -2
  66. package/dist/cjs/src/clients/pera/types.d.ts +0 -27
  67. package/dist/cjs/src/clients/walletconnect2/client.d.ts +0 -36
  68. package/dist/cjs/src/clients/walletconnect2/constants.d.ts +0 -5
  69. package/dist/cjs/src/clients/walletconnect2/index.d.ts +0 -2
  70. package/dist/cjs/src/clients/walletconnect2/types.d.ts +0 -28
  71. package/dist/cjs/src/clients/walletconnect2/utils.d.ts +0 -2
  72. package/dist/cjs/src/constants/constants.d.ts +0 -20
  73. package/dist/cjs/src/constants/index.d.ts +0 -1
  74. package/dist/cjs/src/context/WalletContext.d.ts +0 -8
  75. package/dist/cjs/src/hooks/index.d.ts +0 -2
  76. package/dist/cjs/src/hooks/useInitializeProviders.d.ts +0 -10
  77. package/dist/cjs/src/hooks/useInitializeProviders.test.d.ts +0 -4
  78. package/dist/cjs/src/hooks/useWallet.d.ts +0 -31
  79. package/dist/cjs/src/hooks/useWallet.test.d.ts +0 -4
  80. package/dist/cjs/src/index.d.ts +0 -6
  81. package/dist/cjs/src/media/audio.d.ts +0 -1
  82. package/dist/cjs/src/store/index.d.ts +0 -2
  83. package/dist/cjs/src/store/state/debugStore.d.ts +0 -6
  84. package/dist/cjs/src/store/state/walletStore.d.ts +0 -52
  85. package/dist/cjs/src/testUtils/mockAccounts.d.ts +0 -3
  86. package/dist/cjs/src/testUtils/mockClients.d.ts +0 -45
  87. package/dist/cjs/src/types/api.d.ts +0 -14
  88. package/dist/cjs/src/types/index.d.ts +0 -4
  89. package/dist/cjs/src/types/node.d.ts +0 -44
  90. package/dist/cjs/src/types/providers.d.ts +0 -148
  91. package/dist/cjs/src/types/utilities.d.ts +0 -1
  92. package/dist/cjs/src/types/wallet.d.ts +0 -54
  93. package/dist/cjs/src/utils/clearAccounts.d.ts +0 -2
  94. package/dist/cjs/src/utils/clearAccounts.test.d.ts +0 -1
  95. package/dist/cjs/src/utils/debugLog.d.ts +0 -3
  96. package/dist/cjs/src/utils/encodeNFDTransactionArray.spec.d.ts +0 -1
  97. package/dist/cjs/src/utils/encodeNFDTransactionsArray.d.ts +0 -2
  98. package/dist/cjs/src/utils/index.d.ts +0 -3
  99. package/dist/cjs/src/utils/initializeProviders.d.ts +0 -3
  100. package/dist/cjs/src/utils/initializeProviders.test.d.ts +0 -4
  101. package/dist/cjs/src/utils/providers.d.ts +0 -3
  102. package/dist/cjs/src/utils/providers.spec.d.ts +0 -1
  103. package/dist/cjs/src/utils/reconnectProviders.d.ts +0 -2
  104. package/dist/cjs/src/utils/reconnectProviders.test.d.ts +0 -1
  105. package/dist/cjs/src/utils/svgToBase64.d.ts +0 -1
  106. package/dist/cjs/src/utils/types.d.ts +0 -2
  107. package/dist/esm/index.js +0 -3911
  108. package/dist/esm/jest.config.d.ts +0 -11
  109. package/dist/esm/jest.setup.d.ts +0 -0
  110. package/dist/esm/src/algod/index.d.ts +0 -10
  111. package/dist/esm/src/clients/algosigner/client.d.ts +0 -37
  112. package/dist/esm/src/clients/algosigner/constants.d.ts +0 -2
  113. package/dist/esm/src/clients/algosigner/index.d.ts +0 -2
  114. package/dist/esm/src/clients/algosigner/types.d.ts +0 -39
  115. package/dist/esm/src/clients/base/base.d.ts +0 -46
  116. package/dist/esm/src/clients/base/index.d.ts +0 -2
  117. package/dist/esm/src/clients/custom/client.d.ts +0 -18
  118. package/dist/esm/src/clients/custom/constants.d.ts +0 -1
  119. package/dist/esm/src/clients/custom/index.d.ts +0 -2
  120. package/dist/esm/src/clients/custom/types.d.ts +0 -25
  121. package/dist/esm/src/clients/daffi/client.d.ts +0 -34
  122. package/dist/esm/src/clients/daffi/constants.d.ts +0 -1
  123. package/dist/esm/src/clients/daffi/index.d.ts +0 -2
  124. package/dist/esm/src/clients/daffi/types.d.ts +0 -27
  125. package/dist/esm/src/clients/defly/client.d.ts +0 -34
  126. package/dist/esm/src/clients/defly/constants.d.ts +0 -1
  127. package/dist/esm/src/clients/defly/index.d.ts +0 -2
  128. package/dist/esm/src/clients/defly/types.d.ts +0 -32
  129. package/dist/esm/src/clients/exodus/client.d.ts +0 -33
  130. package/dist/esm/src/clients/exodus/constants.d.ts +0 -1
  131. package/dist/esm/src/clients/exodus/index.d.ts +0 -2
  132. package/dist/esm/src/clients/exodus/types.d.ts +0 -34
  133. package/dist/esm/src/clients/index.d.ts +0 -19
  134. package/dist/esm/src/clients/kibisis/client.d.ts +0 -73
  135. package/dist/esm/src/clients/kibisis/constants.d.ts +0 -37
  136. package/dist/esm/src/clients/kibisis/index.d.ts +0 -2
  137. package/dist/esm/src/clients/kibisis/types.d.ts +0 -86
  138. package/dist/esm/src/clients/kibisis/utils.d.ts +0 -9
  139. package/dist/esm/src/clients/kibisis/utils.test.d.ts +0 -1
  140. package/dist/esm/src/clients/kmd/client.d.ts +0 -30
  141. package/dist/esm/src/clients/kmd/constants.d.ts +0 -1
  142. package/dist/esm/src/clients/kmd/index.d.ts +0 -2
  143. package/dist/esm/src/clients/kmd/types.d.ts +0 -32
  144. package/dist/esm/src/clients/lute/client.d.ts +0 -34
  145. package/dist/esm/src/clients/lute/constants.d.ts +0 -1
  146. package/dist/esm/src/clients/lute/index.d.ts +0 -2
  147. package/dist/esm/src/clients/lute/types.d.ts +0 -15
  148. package/dist/esm/src/clients/magic/client.d.ts +0 -35
  149. package/dist/esm/src/clients/magic/constants.d.ts +0 -1
  150. package/dist/esm/src/clients/magic/index.d.ts +0 -2
  151. package/dist/esm/src/clients/magic/types.d.ts +0 -27
  152. package/dist/esm/src/clients/mnemonic/client.d.ts +0 -35
  153. package/dist/esm/src/clients/mnemonic/constants.d.ts +0 -1
  154. package/dist/esm/src/clients/mnemonic/index.d.ts +0 -2
  155. package/dist/esm/src/clients/mnemonic/types.d.ts +0 -21
  156. package/dist/esm/src/clients/myalgo/client.d.ts +0 -33
  157. package/dist/esm/src/clients/myalgo/constants.d.ts +0 -1
  158. package/dist/esm/src/clients/myalgo/index.d.ts +0 -2
  159. package/dist/esm/src/clients/myalgo/types.d.ts +0 -19
  160. package/dist/esm/src/clients/pera/client.d.ts +0 -34
  161. package/dist/esm/src/clients/pera/constants.d.ts +0 -1
  162. package/dist/esm/src/clients/pera/index.d.ts +0 -2
  163. package/dist/esm/src/clients/pera/types.d.ts +0 -27
  164. package/dist/esm/src/clients/walletconnect2/client.d.ts +0 -36
  165. package/dist/esm/src/clients/walletconnect2/constants.d.ts +0 -5
  166. package/dist/esm/src/clients/walletconnect2/index.d.ts +0 -2
  167. package/dist/esm/src/clients/walletconnect2/types.d.ts +0 -28
  168. package/dist/esm/src/clients/walletconnect2/utils.d.ts +0 -2
  169. package/dist/esm/src/constants/constants.d.ts +0 -20
  170. package/dist/esm/src/constants/index.d.ts +0 -1
  171. package/dist/esm/src/context/WalletContext.d.ts +0 -8
  172. package/dist/esm/src/hooks/index.d.ts +0 -2
  173. package/dist/esm/src/hooks/useInitializeProviders.d.ts +0 -10
  174. package/dist/esm/src/hooks/useInitializeProviders.test.d.ts +0 -4
  175. package/dist/esm/src/hooks/useWallet.d.ts +0 -31
  176. package/dist/esm/src/hooks/useWallet.test.d.ts +0 -4
  177. package/dist/esm/src/index.d.ts +0 -6
  178. package/dist/esm/src/media/audio.d.ts +0 -1
  179. package/dist/esm/src/store/index.d.ts +0 -2
  180. package/dist/esm/src/store/state/debugStore.d.ts +0 -6
  181. package/dist/esm/src/store/state/walletStore.d.ts +0 -52
  182. package/dist/esm/src/testUtils/mockAccounts.d.ts +0 -3
  183. package/dist/esm/src/testUtils/mockClients.d.ts +0 -45
  184. package/dist/esm/src/types/api.d.ts +0 -14
  185. package/dist/esm/src/types/index.d.ts +0 -4
  186. package/dist/esm/src/types/node.d.ts +0 -44
  187. package/dist/esm/src/types/providers.d.ts +0 -148
  188. package/dist/esm/src/types/utilities.d.ts +0 -1
  189. package/dist/esm/src/types/wallet.d.ts +0 -54
  190. package/dist/esm/src/utils/clearAccounts.d.ts +0 -2
  191. package/dist/esm/src/utils/clearAccounts.test.d.ts +0 -1
  192. package/dist/esm/src/utils/debugLog.d.ts +0 -3
  193. package/dist/esm/src/utils/encodeNFDTransactionArray.spec.d.ts +0 -1
  194. package/dist/esm/src/utils/encodeNFDTransactionsArray.d.ts +0 -2
  195. package/dist/esm/src/utils/index.d.ts +0 -3
  196. package/dist/esm/src/utils/initializeProviders.d.ts +0 -3
  197. package/dist/esm/src/utils/initializeProviders.test.d.ts +0 -4
  198. package/dist/esm/src/utils/providers.d.ts +0 -3
  199. package/dist/esm/src/utils/providers.spec.d.ts +0 -1
  200. package/dist/esm/src/utils/reconnectProviders.d.ts +0 -2
  201. package/dist/esm/src/utils/reconnectProviders.test.d.ts +0 -1
  202. package/dist/esm/src/utils/svgToBase64.d.ts +0 -1
  203. package/dist/esm/src/utils/types.d.ts +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/manager.ts","../src/network.ts","../src/storage.ts","../src/wallets/base.ts","../src/wallets/defly.ts","../src/utils.ts","../src/wallets/types.ts","../src/wallets/exodus.ts","../src/wallets/kibisis.ts","../src/wallets/kmd.ts","../src/wallets/lute.ts","../src/wallets/mnemonic.ts","../src/wallets/pera.ts","../src/wallets/walletconnect.ts","../src/store.ts"],"sourcesContent":["export { WalletManager, WalletManagerConfig } from './manager'\nexport { NetworkId } from './network'\nexport { State, WalletState, defaultState } from './store'\nexport { StorageAdapter } from './storage'\nexport * from './wallets'\n","import { Store } from '@tanstack/store'\nimport algosdk from 'algosdk'\nimport {\n createDefaultNetworkConfig,\n isNetworkConfigMap,\n NetworkId,\n type AlgodConfig,\n type NetworkConfig,\n type NetworkConfigMap\n} from 'src/network'\nimport { StorageAdapter } from 'src/storage'\nimport {\n defaultState,\n isValidState,\n LOCAL_STORAGE_KEY,\n removeWallet,\n setActiveNetwork,\n setActiveWallet,\n type State\n} from 'src/store'\nimport { createWalletMap, deepMerge } from 'src/utils'\nimport type { BaseWallet } from 'src/wallets/base'\nimport type {\n SupportedWallet,\n WalletAccount,\n WalletConfigMap,\n WalletId,\n WalletIdConfig,\n WalletMetadata,\n WalletOptions\n} from 'src/wallets/types'\n\nexport interface WalletManagerConfig {\n wallets?: SupportedWallet[]\n network?: NetworkId\n algod?: NetworkConfig\n}\n\nexport class WalletManager {\n public _clients: Map<WalletId, BaseWallet> = new Map()\n\n public networkConfig: NetworkConfigMap\n public algodClient: algosdk.Algodv2\n\n public store: Store<State>\n public subscribe: (callback: (state: State) => void) => () => void\n\n constructor({ wallets = [], network = NetworkId.TESTNET, algod = {} }: WalletManagerConfig = {}) {\n const initialState = this.loadPersistedState() || {\n ...defaultState,\n activeNetwork: network\n }\n\n this.store = new Store<State>(initialState, {\n onUpdate: () => this.savePersistedState()\n })\n\n this.savePersistedState()\n\n this.subscribe = (callback: (state: State) => void): (() => void) => {\n const unsubscribe = this.store.subscribe(() => {\n callback(this.store.state)\n })\n\n return unsubscribe\n }\n\n this.networkConfig = this.initNetworkConfig(network, algod)\n this.algodClient = this.createAlgodClient(this.networkConfig[network])\n\n this.initializeWallets(wallets)\n }\n\n // ---------- Store ------------------------------------------------- //\n\n private loadPersistedState(): State | null {\n try {\n const serializedState = StorageAdapter.getItem(LOCAL_STORAGE_KEY)\n if (serializedState === null) {\n return null\n }\n const parsedState = JSON.parse(serializedState)\n if (!isValidState(parsedState)) {\n console.warn('[Store] Parsed state:', parsedState)\n throw new Error('Persisted state is invalid')\n }\n return parsedState as State\n } catch (error: any) {\n console.error(`[Store] Could not load state from local storage: ${error.message}`)\n return null\n }\n }\n\n private savePersistedState(): void {\n try {\n const state = this.store.state\n const serializedState = JSON.stringify(state)\n StorageAdapter.setItem(LOCAL_STORAGE_KEY, serializedState)\n } catch (error) {\n console.error('[Store] Could not save state to local storage:', error)\n }\n }\n\n // ---------- Wallets ----------------------------------------------- //\n\n private initializeWallets<T extends keyof WalletConfigMap>(\n walletsConfig: Array<T | WalletIdConfig<T>>\n ) {\n console.info('[Manager] Initializing wallets...')\n\n for (const walletConfig of walletsConfig) {\n let walletId: T\n let walletOptions: WalletOptions<T> | undefined\n let walletMetadata: Partial<WalletMetadata> | undefined\n\n // Parse wallet config\n if (typeof walletConfig === 'string') {\n walletId = walletConfig\n } else {\n const { id, options, metadata } = walletConfig\n walletId = id\n walletOptions = options\n walletMetadata = metadata\n }\n\n // Get wallet class\n const walletMap = createWalletMap()\n const WalletClass = walletMap[walletId]\n if (!WalletClass) {\n console.error(`[Manager] Wallet not found: ${walletId}`)\n continue\n }\n\n // Initialize wallet\n const walletInstance = new WalletClass({\n id: walletId,\n metadata: walletMetadata,\n options: walletOptions as any,\n getAlgodClient: this.getAlgodClient,\n store: this.store,\n subscribe: this.subscribe\n })\n\n this._clients.set(walletId, walletInstance)\n console.info(`[Manager] ✅ Initialized ${walletId}`)\n }\n\n const state = this.store.state\n\n // Check if connected wallets are still valid\n const connectedWallets = Object.keys(state.wallets) as WalletId[]\n for (const walletId of connectedWallets) {\n if (!this._clients.has(walletId)) {\n console.warn(`[Manager] Connected wallet not found: ${walletId}`)\n removeWallet(this.store, { walletId })\n }\n }\n\n // Check if active wallet is still valid\n if (state.activeWallet && !this._clients.has(state.activeWallet)) {\n console.warn(`[Manager] Active wallet not found: ${state.activeWallet}`)\n setActiveWallet(this.store, { walletId: null })\n }\n }\n\n public get wallets(): BaseWallet[] {\n return [...this._clients.values()]\n }\n\n public getWallet(walletId: WalletId): BaseWallet | undefined {\n return this._clients.get(walletId)\n }\n\n public async resumeSessions(): Promise<void> {\n const promises = this.wallets.map((wallet) => wallet?.resumeSession())\n await Promise.all(promises)\n }\n\n // ---------- Network ----------------------------------------------- //\n\n private initNetworkConfig(network: NetworkId, config: NetworkConfig): NetworkConfigMap {\n console.info('[Manager] Initializing network...')\n\n let networkConfig = createDefaultNetworkConfig()\n\n if (isNetworkConfigMap(config)) {\n // Config for multiple networks\n networkConfig = deepMerge(networkConfig, config)\n } else {\n // Config for single (active) network\n networkConfig[network] = deepMerge(networkConfig[network], config)\n }\n\n console.info('[Manager] Algodv2 config:', networkConfig)\n\n return networkConfig\n }\n\n private createAlgodClient(config: AlgodConfig): algosdk.Algodv2 {\n console.info(`[Manager] Creating Algodv2 client for ${this.activeNetwork}...`)\n const { token = '', baseServer, port = '', headers = {} } = config\n return new algosdk.Algodv2(token, baseServer, port, headers)\n }\n\n public getAlgodClient = (): algosdk.Algodv2 => {\n return this.algodClient\n }\n\n public setActiveNetwork(networkId: NetworkId): void {\n setActiveNetwork(this.store, { networkId })\n this.algodClient = this.createAlgodClient(this.networkConfig[networkId])\n }\n\n public get activeNetwork(): NetworkId {\n return this.store.state.activeNetwork\n }\n\n // ---------- Active Wallet ----------------------------------------- //\n\n public get activeWallet(): BaseWallet | null {\n const state = this.store.state\n const activeWallet = this.wallets.find((wallet) => wallet.id === state.activeWallet)\n if (!activeWallet) {\n return null\n }\n\n return activeWallet\n }\n\n public get activeWalletAccounts(): WalletAccount[] | null {\n if (!this.activeWallet) {\n return null\n }\n return this.activeWallet.accounts\n }\n\n public get activeWalletAddresses(): string[] | null {\n if (!this.activeWallet) {\n return null\n }\n return this.activeWallet.accounts.map((account) => account.address)\n }\n\n public get activeAccount(): WalletAccount | null {\n if (!this.activeWallet) {\n return null\n }\n return this.activeWallet.activeAccount\n }\n\n public get activeAddress(): string | null {\n if (!this.activeAccount) {\n return null\n }\n return this.activeAccount.address\n }\n\n // ---------- Sign Transactions ------------------------------------- //\n\n public get signTransactions() {\n if (!this.activeWallet) {\n throw new Error('[Manager] No active wallet found!')\n }\n return this.activeWallet.signTransactions\n }\n\n /**\n * A function which can sign transactions from an atomic transaction group. The logic will be\n * specific to each wallet, but the function will always return a promise that resolves to an\n * array of encoded signed transactions matching the length of the indexesToSign array.\n *\n * @see https://github.com/algorand/js-algorand-sdk/blob/v2.6.0/src/signer.ts#L7-L18\n *\n * @param txnGroup - The atomic group containing transactions to be signed\n * @param indexesToSign - An array of indexes in the atomic transaction group that should be signed\n * @returns A promise which resolves an array of encoded signed transactions. The length of the\n * array will be the same as the length of indexesToSign, and each index i in the array\n * corresponds to the signed transaction from txnGroup[indexesToSign[i]]\n */\n public get transactionSigner(): algosdk.TransactionSigner {\n if (!this.activeWallet) {\n throw new Error('[Manager] No active wallet found!')\n }\n return this.activeWallet.transactionSigner\n }\n}\n","import algosdk from 'algosdk'\n\nexport enum NetworkId {\n MAINNET = 'mainnet',\n TESTNET = 'testnet',\n BETANET = 'betanet',\n LOCALNET = 'localnet'\n}\n\nexport function isValidNetworkId(networkId: any): networkId is NetworkId {\n return Object.values(NetworkId).includes(networkId)\n}\n\nexport interface AlgodConfig {\n token: string | algosdk.AlgodTokenHeader | algosdk.CustomTokenHeader | algosdk.BaseHTTPClient\n baseServer: string\n port?: string | number\n headers?: Record<string, string>\n}\n\nexport function isAlgodConfig(config: any): config is AlgodConfig {\n if (typeof config !== 'object') return false\n\n for (const key of Object.keys(config)) {\n if (!['token', 'baseServer', 'port', 'headers'].includes(key)) return false\n }\n\n return (\n typeof config.token === 'string' &&\n typeof config.baseServer === 'string' &&\n ['string', 'number', 'undefined'].includes(typeof config.port) &&\n ['object', 'undefined'].includes(typeof config.headers)\n )\n}\n\nexport type NetworkConfigMap = Record<NetworkId, AlgodConfig>\n\nexport function isNetworkConfigMap(config: NetworkConfig): config is NetworkConfigMap {\n const networkKeys = Object.values(NetworkId) as string[]\n return Object.keys(config).some((key) => networkKeys.includes(key))\n}\n\nexport type NetworkConfig = Partial<AlgodConfig> | Partial<Record<NetworkId, Partial<AlgodConfig>>>\n\nexport const nodeServerMap = {\n [NetworkId.MAINNET]: 'https://mainnet-api.algonode.cloud',\n [NetworkId.TESTNET]: 'https://testnet-api.algonode.cloud',\n [NetworkId.BETANET]: 'https://betanet-api.algonode.cloud',\n [NetworkId.LOCALNET]: 'http://localhost'\n}\n\nexport function createDefaultNetworkConfig(): NetworkConfigMap {\n return Object.values(NetworkId).reduce((acc, value) => {\n acc[value as NetworkId] = {\n token: '',\n baseServer: nodeServerMap[value as NetworkId],\n port: '',\n headers: {}\n }\n return acc\n }, {} as NetworkConfigMap)\n}\n\nexport const caipChainId: Partial<Record<NetworkId, string>> = {\n [NetworkId.MAINNET]: 'algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73k',\n [NetworkId.TESTNET]: 'algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDe',\n [NetworkId.BETANET]: 'algorand:mFgazF-2uRS1tMiL9dsj01hJGySEmPN2'\n}\n","export class StorageAdapter {\n static getItem(key: string): string | null {\n if (typeof window === 'undefined') {\n return null\n }\n return localStorage.getItem(key)\n }\n\n static setItem(key: string, value: string): void {\n if (typeof window === 'undefined') {\n return\n }\n localStorage.setItem(key, value)\n }\n}\n","import { setActiveWallet, setActiveAccount, removeWallet, type State } from 'src/store'\nimport type { Store } from '@tanstack/store'\nimport type algosdk from 'algosdk'\nimport type { NetworkId } from 'src/network'\nimport type { WalletAccount, WalletConstructor, WalletId, WalletMetadata } from './types'\n\ninterface WalletConstructorType {\n new (...args: any[]): BaseWallet\n defaultMetadata: WalletMetadata\n}\n\nexport abstract class BaseWallet {\n readonly id: WalletId\n readonly metadata: WalletMetadata\n\n protected store: Store<State>\n protected getAlgodClient: () => algosdk.Algodv2\n\n public subscribe: (callback: (state: State) => void) => () => void\n\n protected constructor({\n id,\n metadata,\n store,\n subscribe,\n getAlgodClient\n }: WalletConstructor<WalletId>) {\n this.id = id\n this.store = store\n this.subscribe = subscribe\n this.getAlgodClient = getAlgodClient\n\n const ctor = this.constructor as WalletConstructorType\n this.metadata = { ...ctor.defaultMetadata, ...metadata }\n }\n\n static defaultMetadata: WalletMetadata = { name: 'Base Wallet', icon: '' }\n\n // ---------- Public Methods ---------------------------------------- //\n\n public abstract connect(): Promise<WalletAccount[]>\n public abstract disconnect(): Promise<void>\n public abstract resumeSession(): Promise<void>\n\n public setActive(): void {\n console.info(`[Wallet] Set active wallet: ${this.id}`)\n setActiveWallet(this.store, { walletId: this.id })\n }\n\n public setActiveAccount(account: string): void {\n console.info(`[Wallet] Set active account: ${account}`)\n setActiveAccount(this.store, {\n walletId: this.id,\n address: account\n })\n }\n\n public abstract signTransactions(\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup?: boolean\n ): Promise<Uint8Array[]>\n\n public abstract transactionSigner(\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]>\n\n // ---------- Derived Properties ------------------------------------ //\n\n public get name(): string {\n return this.id.toUpperCase()\n }\n\n public get accounts(): WalletAccount[] {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n return walletState ? walletState.accounts : []\n }\n\n public get addresses(): string[] {\n return this.accounts.map((account) => account.address)\n }\n\n public get activeAccount(): WalletAccount | null {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n return walletState ? walletState.activeAccount : null\n }\n\n public get activeAddress(): string | null {\n return this.activeAccount?.address ?? null\n }\n\n public get activeNetwork(): NetworkId {\n const state = this.store.state\n return state.activeNetwork\n }\n\n public get isConnected(): boolean {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n return walletState ? walletState.accounts.length > 0 : false\n }\n\n public get isActive(): boolean {\n const state = this.store.state\n return state.activeWallet === this.id\n }\n\n // ---------- Protected Methods ------------------------------------- //\n\n protected onDisconnect(): void {\n removeWallet(this.store, { walletId: this.id })\n }\n}\n","import algosdk from 'algosdk'\nimport { addWallet, setAccounts, type State } from 'src/store'\nimport {\n compareAccounts,\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { DeflyWalletConnect } from '@blockshake/defly-connect'\nimport type { Store } from '@tanstack/store'\nimport type { SignerTransaction, WalletAccount, WalletConstructor, WalletId } from './types'\n\nexport interface DeflyWalletConnectOptions {\n bridge?: string\n shouldShowSignTxnToast?: boolean\n chainId?: 416001 | 416002 | 416003 | 4160\n}\n\nconst icon =\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg=='\n\nexport class DeflyWallet extends BaseWallet {\n private client: DeflyWalletConnect | null = null\n private options: DeflyWalletConnectOptions\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options = {},\n metadata = {}\n }: WalletConstructor<WalletId.DEFLY>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n this.options = options\n this.store = store\n }\n\n static defaultMetadata = { name: 'Defly', icon }\n\n private async initializeClient(): Promise<DeflyWalletConnect> {\n console.info('[DeflyWallet] Initializing client...')\n const module = await import('@blockshake/defly-connect')\n const DeflyWalletConnect = module.default\n ? module.default.DeflyWalletConnect\n : module.DeflyWalletConnect\n\n const client = new DeflyWalletConnect(this.options)\n client.connector?.on('disconnect', this.onDisconnect)\n this.client = client\n return client\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[DeflyWallet] Connecting...')\n try {\n const client = this.client || (await this.initializeClient())\n const accounts = await client.connect()\n\n if (accounts.length === 0) {\n throw new Error('No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `Defly Wallet ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]!\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount\n }\n })\n\n return walletAccounts\n } catch (error: any) {\n if (error?.data?.type !== 'CONNECT_MODAL_CLOSED') {\n console.error(`[DeflyWallet] Error connecting: ${error.message}`)\n } else {\n console.info('[DeflyWallet] Connection cancelled.')\n }\n return []\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[DeflyWallet] Disconnecting...')\n try {\n await this.client?.disconnect()\n this.onDisconnect()\n } catch (error: any) {\n console.error(error)\n }\n }\n\n public async resumeSession(): Promise<void> {\n try {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n // No session to resume\n if (!walletState) {\n return\n }\n\n console.info('[DeflyWallet] Resuming session...')\n\n const client = this.client || (await this.initializeClient())\n const accounts = await client.reconnectSession()\n\n if (accounts.length === 0) {\n throw new Error('[DeflyWallet] No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `Defly Wallet ${idx + 1}`,\n address\n }))\n\n const match = compareAccounts(walletAccounts, walletState.accounts)\n\n if (!match) {\n console.warn(`[DeflyWallet] Session accounts mismatch, updating accounts`)\n setAccounts(this.store, {\n walletId: this.id,\n accounts: walletAccounts\n })\n }\n } catch (error: any) {\n console.error(`[DeflyWallet] Error resuming session: ${error.message}`)\n this.onDisconnect()\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[DeflyWallet] Client not initialized!')\n }\n const txnsToSign: SignerTransaction[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Marshal transactions into `SignerTransaction[]`\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n if (shouldSign) {\n txnsToSign.push({ txn })\n signedIndexes.push(idx)\n } else {\n txnsToSign.push({ txn, signers: [] })\n }\n })\n\n // Sign transactions\n const signedTxns = await this.client.signTransaction([txnsToSign])\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[DeflyWallet] Client not initialized!')\n }\n\n const txnsToSign = txnGroup.reduce<SignerTransaction[]>((acc, txn, idx) => {\n if (indexesToSign.includes(idx)) {\n acc.push({ txn })\n } else {\n acc.push({ txn, signers: [] })\n }\n return acc\n }, [])\n\n const signTxnsResult = await this.client.signTransaction([txnsToSign])\n return signTxnsResult\n }\n}\n","import algosdk from 'algosdk'\nimport { WalletId, type JsonRpcRequest, type WalletAccount, type WalletMap } from './wallets/types'\nimport { DeflyWallet } from './wallets/defly'\nimport { ExodusWallet } from './wallets/exodus'\nimport { KibisisWallet } from './wallets/kibisis'\nimport { KmdWallet } from './wallets/kmd'\nimport { LuteWallet } from './wallets/lute'\nimport { MnemonicWallet } from './wallets/mnemonic'\nimport { PeraWallet } from './wallets/pera'\nimport { WalletConnect } from './wallets/walletconnect'\n\nexport function createWalletMap(): WalletMap {\n return {\n [WalletId.DEFLY]: DeflyWallet,\n [WalletId.EXODUS]: ExodusWallet,\n [WalletId.KIBISIS]: KibisisWallet,\n [WalletId.KMD]: KmdWallet,\n [WalletId.LUTE]: LuteWallet,\n [WalletId.MNEMONIC]: MnemonicWallet,\n [WalletId.PERA]: PeraWallet,\n [WalletId.WALLETCONNECT]: WalletConnect\n }\n}\n\nexport function compareAccounts(accounts: WalletAccount[], compareTo: WalletAccount[]): boolean {\n const addresses = new Set(accounts.map((account) => account.address))\n const compareAddresses = new Set(compareTo.map((account) => account.address))\n\n if (addresses.size !== compareAddresses.size) {\n return false\n }\n\n // Check if every address in addresses is also in compareAddresses\n for (const address of addresses) {\n if (!compareAddresses.has(address)) {\n return false\n }\n }\n\n return true\n}\n\nexport function isTransaction(\n item: algosdk.Transaction | algosdk.Transaction[] | Uint8Array | Uint8Array[]\n): item is algosdk.Transaction | algosdk.Transaction[] {\n if (Array.isArray(item)) {\n return item.every(\n (elem) =>\n typeof elem === 'object' &&\n elem !== null &&\n 'genesisID' in elem &&\n typeof elem.genesisID === 'string'\n )\n } else {\n return (\n typeof item === 'object' &&\n item !== null &&\n 'genesisID' in item &&\n typeof item.genesisID === 'string'\n )\n }\n}\n\nexport function isSignedTxnObject(\n item: algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction\n): item is algosdk.EncodedSignedTransaction {\n return (item as algosdk.EncodedSignedTransaction).txn !== undefined\n}\n\nexport function normalizeTxnGroup(\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][]\n): Uint8Array[] {\n if (!txnGroup[0]) {\n throw new Error('Empty transaction group!')\n }\n\n const isTransactionType = isTransaction(txnGroup[0])\n\n // Handle `algosdk.Transaction[] | algosdk.Transaction[]` types\n if (isTransactionType) {\n const transactionGroup: algosdk.Transaction[] = Array.isArray(txnGroup[0])\n ? (txnGroup as algosdk.Transaction[][]).flatMap((txn) => txn)\n : (txnGroup as algosdk.Transaction[])\n\n return transactionGroup.map((txn) => {\n return algosdk.encodeUnsignedTransaction(txn)\n })\n }\n\n // Handle `Uint8Array[] | Uint8Array[][]` types\n else {\n const transactionGroup: Uint8Array[] = Array.isArray(txnGroup[0])\n ? (txnGroup as Uint8Array[][]).flatMap((txn) => txn)\n : (txnGroup as Uint8Array[])\n\n return transactionGroup\n }\n}\n\nexport function shouldSignTxnObject(\n txnObject: any,\n addresses: string[],\n indexesToSign: number[] | undefined,\n idx: number\n): boolean {\n const isIndexMatch = !indexesToSign || indexesToSign.includes(idx)\n const isSigned = isSignedTxnObject(txnObject)\n const canSign = !isSigned && addresses.includes(algosdk.encodeAddress(txnObject.snd))\n const shouldSign = isIndexMatch && canSign\n\n return shouldSign\n}\n\nexport function mergeSignedTxnsWithGroup(\n signedTxns: Uint8Array[],\n txnGroup: Uint8Array[],\n signedIndexes: number[],\n returnGroup: boolean\n): Uint8Array[] {\n return txnGroup.reduce<Uint8Array[]>((acc, txn, i) => {\n if (signedIndexes.includes(i)) {\n const signedByUser = signedTxns.shift()\n signedByUser && acc.push(signedByUser)\n } else if (returnGroup) {\n acc.push(txnGroup[i]!)\n }\n return acc\n }, [])\n}\n\nfunction getPayloadId(): number {\n const date = Date.now() * Math.pow(10, 3)\n const extra = Math.floor(Math.random() * Math.pow(10, 3))\n return date + extra\n}\n\nexport function formatJsonRpcRequest<T = any>(method: string, params: T): JsonRpcRequest<T> {\n return {\n id: getPayloadId(),\n jsonrpc: '2.0',\n method,\n params\n }\n}\n\nexport function deepMerge(target: any, source: any): any {\n const isObject = (obj: any) => obj && typeof obj === 'object'\n\n if (!isObject(target) || !isObject(source)) {\n throw new Error('Target and source must be objects')\n }\n\n Object.keys(source).forEach((key) => {\n const targetValue = target[key]\n const sourceValue = source[key]\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n target[key] = targetValue.concat(sourceValue)\n } else if (isObject(targetValue) && isObject(sourceValue)) {\n target[key] = deepMerge(Object.assign({}, targetValue), sourceValue)\n } else {\n target[key] = sourceValue\n }\n })\n\n return target\n}\n\n/**\n * Generates a UUID version 4 string. This function attempts to use the `crypto.randomUUID()` function from the Web\n * Crypto API if it is available, otherwise it uses a polyfill method.\n *\n * NOTE: `crypto.randomUUID()` is not available in non-secure contexts; only localhost and HTTPS.\n * @returns {string} a valid UUID version 4 string.\n * @see {@link https://stackoverflow.com/a/2117523}\n */\nexport function generateUuid(): string {\n if (window.crypto.randomUUID) {\n return window.crypto.randomUUID()\n }\n\n return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (value) => {\n const valueAsNumber: number = parseInt(value)\n\n return (\n valueAsNumber ^\n (window.crypto.getRandomValues(new Uint8Array(1))[0]! & (15 >> (valueAsNumber / 4)))\n ).toString(16)\n })\n}\n","import { DeflyWallet, type DeflyWalletConnectOptions } from './defly'\nimport { ExodusWallet, type ExodusOptions } from './exodus'\nimport { KibisisWallet } from './kibisis'\nimport { KmdWallet, type KmdOptions } from './kmd'\nimport { LuteConnectOptions, LuteWallet } from './lute'\nimport { MnemonicWallet, type MnemonicOptions } from './mnemonic'\nimport { PeraWallet, type PeraWalletConnectOptions } from './pera'\nimport { WalletConnect, type WalletConnectOptions } from './walletconnect'\nimport type { Store } from '@tanstack/store'\nimport type algosdk from 'algosdk'\nimport type { State } from 'src/store'\n\nexport enum WalletId {\n DEFLY = 'defly',\n EXODUS = 'exodus',\n KIBISIS = 'kibisis',\n KMD = 'kmd',\n LUTE = 'lute',\n MNEMONIC = 'mnemonic',\n PERA = 'pera',\n WALLETCONNECT = 'walletconnect'\n}\n\nexport type WalletMap = {\n [WalletId.DEFLY]: typeof DeflyWallet\n [WalletId.EXODUS]: typeof ExodusWallet\n [WalletId.KIBISIS]: typeof KibisisWallet\n [WalletId.KMD]: typeof KmdWallet\n [WalletId.LUTE]: typeof LuteWallet\n [WalletId.MNEMONIC]: typeof MnemonicWallet\n [WalletId.PERA]: typeof PeraWallet\n [WalletId.WALLETCONNECT]: typeof WalletConnect\n}\n\nexport type WalletOptionsMap = {\n [WalletId.DEFLY]: DeflyWalletConnectOptions\n [WalletId.EXODUS]: ExodusOptions\n [WalletId.KIBISIS]: Record<string, never>\n [WalletId.KMD]: KmdOptions\n [WalletId.LUTE]: LuteConnectOptions\n [WalletId.MNEMONIC]: MnemonicOptions\n [WalletId.PERA]: PeraWalletConnectOptions\n [WalletId.WALLETCONNECT]: WalletConnectOptions\n}\n\nexport type SupportedWallet = WalletIdConfig<WalletId> | WalletId\n\nexport type WalletConfigMap = {\n [K in keyof WalletOptionsMap]: {\n options?: WalletOptionsMap[K]\n metadata?: Partial<WalletMetadata>\n }\n}\n\nexport type WalletOptions<T extends keyof WalletOptionsMap> = WalletOptionsMap[T]\n\nexport type WalletConfig<T extends keyof WalletConfigMap> = WalletConfigMap[T]\n\nexport type WalletIdConfig<T extends keyof WalletConfigMap> = {\n [K in T]: {\n id: K\n } & WalletConfigMap[K]\n}[T]\n\ntype NonEmptyArray<T> = [T, ...T[]]\n\nexport type SupportedWallets = NonEmptyArray<SupportedWallet>\n\nexport type WalletMetadata = {\n name: string\n icon: string\n}\n\nexport interface BaseWalletConstructor {\n id: WalletId\n metadata: Partial<WalletMetadata> | undefined\n getAlgodClient: () => algosdk.Algodv2\n store: Store<State>\n subscribe: (callback: (state: State) => void) => () => void\n}\n\nexport type WalletConstructor<T extends keyof WalletOptionsMap> = BaseWalletConstructor & {\n options?: WalletOptions<T>\n defaultMetadata?: WalletMetadata\n}\n\nexport type WalletAccount = {\n name: string\n address: string\n}\n\n// Transaction types\n\n/** @see https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md#interface-multisigmetadata */\nexport interface MultisigMetadata {\n /**\n * Multisig version.\n */\n version: number\n\n /**\n * Multisig threshold value. Authorization requires a subset of signatures,\n * equal to or greater than the threshold value.\n */\n threshold: number\n\n /**\n * List of Algorand addresses of possible signers for this\n * multisig. Order is important.\n */\n addrs: string[]\n}\n\n/** @see https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0001.md#interface-wallettransaction */\nexport interface WalletTransaction {\n /**\n * Base64 encoding of the canonical msgpack encoding of a Transaction.\n */\n txn: string\n\n /**\n * Optional authorized address used to sign the transaction when the account\n * is rekeyed. Also called the signor/sgnr.\n */\n authAddr?: string\n\n /**\n * Multisig metadata used to sign the transaction\n */\n msig?: MultisigMetadata\n\n /**\n * Optional list of addresses that must sign the transactions\n */\n signers?: string[]\n\n /**\n * Optional base64 encoding of the canonical msgpack encoding of a\n * SignedTxn corresponding to txn, when signers=[]\n */\n stxn?: string\n\n /**\n * Optional message explaining the reason of the transaction\n */\n message?: string\n\n /**\n * Optional message explaining the reason of this group of transaction\n * Field only allowed in the first transaction of a group\n */\n groupMessage?: string\n}\n\n/** @see https://github.com/perawallet/connect/blob/1.3.3/src/util/model/peraWalletModels.ts */\nexport interface SignerTransaction {\n txn: algosdk.Transaction\n\n /**\n * Optional authorized address used to sign the transaction when\n * the account is rekeyed. Also called the signor/sgnr.\n */\n authAddr?: string\n\n /**\n * Optional list of addresses that must sign the transactions.\n * Wallet skips to sign this txn if signers is empty array.\n * If undefined, wallet tries to sign it.\n */\n signers?: string[]\n\n /**\n * Optional message explaining the reason of the transaction\n */\n message?: string\n}\n\nexport interface JsonRpcRequest<T = any> {\n id: number\n jsonrpc: string\n method: string\n params: T\n}\n","import algosdk from 'algosdk'\nimport { addWallet, type State } from 'src/store'\nimport {\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { Store } from '@tanstack/store'\nimport type { WalletAccount, WalletConstructor, WalletId, WalletTransaction } from './types'\n\n/** @see https://docs.exodus.com/api-reference/algorand-provider-arc-api/ */\n\ninterface EnableNetworkOpts {\n genesisID?: string\n genesisHash?: string\n}\n\ninterface EnableAccountsOpts {\n accounts?: string[]\n}\n\nexport type ExodusOptions = EnableNetworkOpts & EnableAccountsOpts\n\ninterface EnableNetworkResult {\n genesisID: string\n genesisHash: string\n}\n\ninterface EnableAccountsResult {\n accounts: string[]\n}\n\nexport type EnableResult = EnableNetworkResult & EnableAccountsResult\n\nexport type SignTxnsResult = (string | null)[]\n\nexport interface Exodus {\n isConnected: boolean\n address: string | null\n enable: (options?: ExodusOptions) => Promise<EnableResult>\n signTxns: (transactions: WalletTransaction[]) => Promise<SignTxnsResult>\n}\n\nexport type WindowExtended = { algorand: Exodus } & Window & typeof globalThis\n\nconst icon =\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg=='\n\nexport class ExodusWallet extends BaseWallet {\n private client: Exodus | null = null\n private options: ExodusOptions\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options = {},\n metadata = {}\n }: WalletConstructor<WalletId.EXODUS>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n this.options = options\n this.store = store\n }\n\n static defaultMetadata = { name: 'Exodus', icon }\n\n private async initializeClient(): Promise<Exodus> {\n console.info('[ExodusWallet] Initializing client...')\n if (typeof window === 'undefined' || (window as WindowExtended).algorand === undefined) {\n throw new Error('Exodus is not available.')\n }\n const client = (window as WindowExtended).algorand\n this.client = client\n return client\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[ExodusWallet] Connecting...')\n try {\n const client = this.client || (await this.initializeClient())\n const { accounts } = await client.enable(this.options)\n\n if (accounts.length === 0) {\n throw new Error('No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `Exodus Wallet ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]!\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount\n }\n })\n\n return walletAccounts\n } catch (error: any) {\n if (error.name === 'UserRejectedRequestError') {\n console.info('[ExodusWallet] Connection cancelled.')\n } else {\n console.error(`[ExodusWallet] Error connecting: ${error.message}`)\n }\n return []\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[ExodusWallet] Disconnecting...')\n this.onDisconnect()\n }\n\n public async resumeSession(): Promise<void> {\n try {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n if (!walletState) {\n // No persisted state, abort\n return\n }\n\n console.info('[ExodusWallet] Resuming session...')\n const client = await this.initializeClient()\n\n if (!client.isConnected) {\n throw new Error('Exodus is not connected.')\n }\n } catch (error: any) {\n console.error(`[ExodusWallet] Error resuming session: ${error.message}`)\n this.onDisconnect()\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[ExodusWallet] Client not initialized!')\n }\n const txnsToSign: WalletTransaction[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Marshal transactions into `WalletTransaction[]`\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (shouldSign) {\n txnsToSign.push({ txn: txnBase64 })\n signedIndexes.push(idx)\n } else {\n txnsToSign.push({ txn: txnBase64, signers: [] })\n }\n })\n\n // Sign transactions\n const signTxnsResult = await this.client.signTxns(txnsToSign)\n\n // Filter out null results\n const signedTxnsBase64 = signTxnsResult.filter(Boolean) as string[]\n\n // Convert base64 signed transactions to msgpack\n const signedTxns = signedTxnsBase64.map((txn) => new Uint8Array(Buffer.from(txn, 'base64')))\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[ExodusWallet] Client not initialized!')\n }\n\n const txnsToSign = txnGroup.reduce<WalletTransaction[]>((acc, txn, idx) => {\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (indexesToSign.includes(idx)) {\n acc.push({ txn: txnBase64 })\n } else {\n acc.push({ txn: txnBase64, signers: [] })\n }\n return acc\n }, [])\n\n const signTxnsResult = await this.client.signTxns(txnsToSign)\n const signedTxnsBase64 = signTxnsResult.filter(Boolean) as string[]\n\n const signedTxns = signedTxnsBase64.map((txn) => new Uint8Array(Buffer.from(txn, 'base64')))\n return signedTxns\n }\n}\n","import algosdk from 'algosdk'\nimport { addWallet, type State } from 'src/store'\nimport {\n generateUuid,\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport { WalletId, type WalletAccount, type WalletConstructor } from './types'\nimport type { Store } from '@tanstack/store'\n\nexport interface Arc0001SignTxns {\n authAddr?: string\n multisig?: string\n signers?: string[]\n stxn?: string\n txn: string\n}\n\nexport interface Arc0027Account {\n address: string\n name?: string\n}\n\nexport interface NetworkConfiguration {\n genesisHash: string\n genesisId: string\n methods: ProviderMethod[]\n}\n\nexport type ProviderMethod =\n | 'enable'\n | 'getProviders'\n | 'postTxns'\n | 'signAndPostTxns'\n | 'signBytes'\n | 'signTxns'\n\nexport interface SendRequestWithTimeoutOptions<Params> {\n method: ProviderMethod\n params: Params\n reference: string\n timeout?: number\n}\n\n/**\n * message schema\n */\nexport interface RequestMessage<Params> {\n id: string\n params: Params\n reference: string\n}\n\nexport interface ResponseMessage<Result = undefined, ErrorData = undefined> {\n error?: ResponseError<ErrorData>\n id: string\n reference: string\n requestId: string\n result?: Result\n}\n\nexport interface ResponseError<Data = undefined> {\n code: number\n data: Data\n message: string\n providerId: string\n}\n\n/**\n * message payloads\n */\nexport interface EnableParams {\n genesisHash: string\n providerId: string\n}\n\nexport interface EnableResult {\n accounts: Arc0027Account[]\n genesisHash: string\n genesisId: string\n providerId: string\n sessionId?: string\n}\n\nexport interface GetProvidersParams {\n providerId: string\n}\n\nexport interface GetProvidersResult {\n host: string\n icon: string\n name: string\n networks: NetworkConfiguration[]\n providerId: string\n}\n\nexport interface SignTxnsParams {\n providerId: string\n txns: Arc0001SignTxns[]\n}\n\nexport interface SignTxnsResult {\n providerId: string\n stxns: (string | null)[]\n}\n\n/**\n * arc-0027\n */\nexport const ARC_0027_PREFIX = 'arc0027'\nexport const ARC_0027_CHANNEL_NAME = `${ARC_0027_PREFIX}:channel`\nexport const ARC_0027_ENABLE_REQUEST = `${ARC_0027_PREFIX}:enable:request`\nexport const ARC_0027_GET_PROVIDERS_REQUEST = `${ARC_0027_PREFIX}:get_providers:request`\nexport const ARC_0027_PROVIDER_ID = 'f6d1c86b-4493-42fb-b88d-a62407b4cdf6'\nexport const ARC_0027_SIGN_TXNS_REQUEST = `${ARC_0027_PREFIX}:sign_txns:request`\n\n/**\n * errors\n */\nexport const UNKNOWN_ERROR = 4000\nexport const METHOD_CANCELED_ERROR = 4001\nexport const METHOD_TIMED_OUT_ERROR = 4002\nexport const METHOD_NOT_SUPPORTED_ERROR = 4003\nexport const NETWORK_NOT_SUPPORTED_ERROR = 4004\nexport const UNAUTHORIZED_SIGNER_ERROR = 4100\nexport const INVALID_INPUT_ERROR = 4200\nexport const INVALID_GROUP_ID_ERROR = 4201\n\n/**\n * genesis hashes\n */\nexport const ALGORAND_BETANET_GENESIS_HASH = 'mFgazF+2uRS1tMiL9dsj01hJGySEmPN28B/TjjvpVW0='\nexport const ALGORAND_MAINNET_GENESIS_HASH = 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8='\nexport const ALGORAND_TESTNET_GENESIS_HASH = 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI='\nexport const VOI_TESTNET_GENESIS_HASH = 'IXnoWtviVVJW5LGivNFc0Dq14V3kqaXuK2u5OQrdVZo='\n\n/**\n * timeouts\n */\nexport const DEFAULT_REQUEST_TIMEOUT = 180000 // 3 minutes in milliseconds\nexport const LOWER_REQUEST_TIMEOUT = 750 // 0.75 seconds in milliseconds\nexport const UPPER_REQUEST_TIMEOUT = 300000 // 5 minutes in milliseconds\n\nconst icon =\n 'data:image/svg+xml;base64,' +\n 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgdmlld0JveD0iMCAwIDEzNjUuMzMzMyAxMzY1LjMzMzMiCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGgKICAgIGQ9Im0gNjY3Ljk5OTk4LDEwNDguNjY2MiBjIDAsLTY0LjE2Njk4IC0wLjYyMDQ0LC0xMjguODE2OTggLTEuMzc4NzcsLTE0My42NjY3IC0yLjgxMTA3LC01NS4wNDczNyAtMTIuMDY3NDksLTkzLjA1MjU5IC0zMy4yNDA1OSwtMTM2LjQ3OTkyIC0yMS41MDczNCwtNDQuMTEyODkgLTUxLjA3MDU3LC04Mi42MzAyMiAtODQuNzM2ODYsLTExMC40MDE5OCAtMjMuNjQ4MjEsLTE5LjUwNzcxIC0yOS4zOTQ4NCwtMjMuNTc5NjMgLTUzLjU5NzA3LC0zNy45Nzc1NSAtMTAuMzU1NTMsLTYuMTYwNDkgLTQ1Ljk3MTAyLC0yMi44MDY3MyAtNDguNzk2MjIsLTIyLjgwNjczIC0wLjk0NDQzLDAgLTIuMjg3MTUsLTAuNTUyODkgLTIuOTgzODEsLTEuMjI4NjUgLTEuNDkxOTUsLTEuNDQ3MTYgLTM0LjAwNzg3LC0xMS4wNzg0NyAtNDQuNiwtMTMuMjEwNjQgLTE5LjUwOTI4LC0zLjkyNzE4IC00Ni4xMDEzMSwtNi44NjQxMiAtNjUuOTI5MTUsLTcuMjgxNTIgbCAtMTMuMjYyNDksLTAuMjc5MTkgLTEuNzk0NCwxMi42NjY2NyBjIC0yLjQ3MjMzLDE3LjQ1MjI1IC0yLjk5NDMyLDQ4LjMxNTQzIC0zLjAwNDg3LDE3Ny42NjY2NiBsIC0wLjAwOSwxMTEuNjY2NjYgaCAtMjggLTI4IGwgMC4wMjg5LC0xMzAuMzMzMzMgYyAwLjAyNjQsLTExOC45MzM1NyAwLjI1Mjg0LC0xMzIuNDkwODIgMi41ODg1NiwtMTU0Ljk5OTk5IDIuNjU1MjMsLTI1LjU4ODI2IDYuMzY3NjgsLTQ4LjY4Njg2IDkuODU3NTksLTYxLjMzMzM0IDcuMDU0NTIsLTI1LjU2MzU4IDEwLjYyNTc5LC0zNy4yNjIyMSAxMi44MjE0MywtNDIgMC42Nzk3LC0xLjQ2NjY2IDIuMTI2MzMsLTUuMzY2NjYgMy4yMTQ3MywtOC42NjY2NiA2LjY5Njc2LC0yMC4zMDQ0NyAyNi40NDAxNSwtNTguNzgxMzYgNDMuNDg4NzMsLTg0Ljc1MzAzIDI4LjA3NzM3LC00Mi43NzI4MSA2MC4zNDY2OSwtNzYuODgwNzQgMTA0LjY2NjY3LC0xMTAuNjMwMjYgNC42ODc3NywtMy41Njk3MiAyOS40ODMwNSwtMjAuMDcxOTkgMzkuNjU5OTgsLTI2LjM5NTMyIDEzLjU2MjQxLC04LjQyNjg5IDUxLjgwNDgsLTI2LjY4OTI1IDY1LjAwNjY4LC0zMS4wNDM0NSAzLjMsLTEuMDg4NCA3LjIsLTIuNTMxMiA4LjY2NjY3LC0zLjIwNjIzIDcuNjYxMzMsLTMuNTI2MDkgNDEuMjA5ODgsLTEzLjE5MDY5IDU2LC0xNi4xMzIzNyA3OS45NTg3OCwtMTUuOTAzMzkgMTU3Ljk3ODkyLC0xMC43Njc3MSAyMzMuOTk5OTksMTUuNDAzMDYgNDEuOTE4NjEsMTQuNDMwNzYgNzUuOTk2NDksMzIuMTc3NzkgMTE0Ljc1MTY2LDU5Ljc2MDE5IDE2Ljg4MDQ3LDEyLjAxMzk5IDQ3LjIyMTc2LDM4Ljk4MjMxIDU5LjkxMTE2LDUzLjI1MTAzIDUuNDE5Myw2LjA5MzgzIDExLjUxMDgsMTIuNzc1MDMgMTMuNTM2NSwxNC44NDcxIDMuNTYzNiwzLjY0NTA5IDI0LjIyOTQsMzAuNTQ2NDkgMjkuODI3OCwzOC44Mjc4NyAyNC4xNjc3LDM1Ljc0OTczIDQ1LjkxMjYsODEuODc4OTQgNTcuMjI5MSwxMjEuNDA0NzQgMS4yNTk4LDQuNCAyLjgxMjQsOS41IDMuNDUwNCwxMS4zMzMzMyAxLjYxNDgsNC42NDA3OCA2LjUzMDksMjguMjM1NiA4LjA1NjMsMzguNjY2NjcgMC42OTcxLDQuNzY2NjcgMS41ODAzLDkuNTE2OTUgMS45NjI2LDEwLjU1NjE2IDAuMzgyNCwxLjAzOTIzIDEuNTcxNiwxMy4wMzkyMyAyLjY0MjcsMjYuNjY2NjcgMS41MTk3LDE5LjMzNDgzIDEuOTQ5NSw1Mi42NzI4MyAxLjk1NjMsMTUxLjc3NzE3IGwgMC4wMSwxMjYuOTk5OTkgaCAtMjcuOTA3NSAtMjcuOTA3NiBsIC0wLjYzOTIsLTEzOS42NjY2NiBjIC0wLjUwMTYsLTEwOS41Nzg2MyAtMS4wMzM5LC0xNDIuMTA4MTcgLTIuNDcxMSwtMTUxIGwgLTEuODMxOCwtMTEuMzMzMzMgLTEyLjYyMTQsMC4yMzMwNCBjIC00MS4xOTI1LDAuNzYwNTcgLTgwLjc3OTcyLDguNTI0MjEgLTExOC45NjgzMywyMy4zMzE0NyBsIC0xNC4zNDY4Nyw1LjU2Mjg2IDEuMDEzNTQsOC43Njk2NCBjIDAuNTU3NDQsNC44MjMzMSAxLjAxMzUzLDk4Ljc2OTY1IDEuMDEzNTMsMjA4Ljc2OTY1IFYgMTAyMiBsIC0yNy42NjY2NywwLjM2MDQgLTI3LjY2NjY2LDAuMzYwMyBWIDgyOS4yMTc3MSBjIDAsLTE2NC45MjU5MSAtMC4yNzQ1MiwtMTkzLjM5NzY5IC0xLjg1ODg4LC0xOTIuNzg5NzEgLTguMjY2MjcsMy4xNzIwNiAtNDMuNTg1MTcsMzQuMTczMzIgLTU5LjI2MDMyLDUyLjAxNTg5IC0zNy4wMDU5Niw0Mi4xMjI4MyAtNjMuMjI1MSw5MC40MjEzIC03Ni4xOTQ0NSwxNDAuMzU4NDEgLTExLjMzNTMxLDQzLjY0NTM2IC0xMi4wODU5Miw1Ny45ODA0NCAtMTEuMDc1NDMsMjExLjUxNzMgbCAwLjgyMjc4LDEyNS4wMTM3IGggLTI4LjIxNjg2IC0yOC4yMTY4NCB6IG0gNDAuMTQ2OTYsLTMwNy4xMTM4IGMgMTYuMjcwNDgsLTM0LjI1NTk4IDM1LjE1MzYyLC02Mi4xNDM5IDYxLjk1NjQxLC05MS41MDE1OCAxMy40MDA5NiwtMTQuNjc4MzMgMzUuMTE3NTUsLTM1LjE5MzkgNDUuMjI5OTYsLTQyLjcyODUzIDIuOTMzMzQsLTIuMTg1NTggNS42MzMzNCwtNC4zMzE0IDYsLTQuNzY4NDYgMS4yMzM5NSwtMS40NzA4NyAyNC44ODc1OCwtMTguMjUzMzEgMjguNzk2MzYsLTIwLjQzMTI2IDIuMTI4NjcsLTEuMTg2MDggNC43NzAzMSwtMi43MzE3OCA1Ljg3MDMxLC0zLjQzNDg5IDEyLjk1MTY5LC04LjI3ODY4IDM0LjU3NzI4LC0xOS41MDUyMyA1Ni42NjY2NiwtMjkuNDE3NTIgMTAuODEzOTksLTQuODUyNjMgMzYuNDY4MjMsLTEzLjQ5NzE2IDUxLjMzMzM0LC0xNy4yOTc0NSAyNy40NzU5LC03LjAyNDI3IDQ4LjI1OTMyLC0xMC4yNDc0NiA3My44ODM0MiwtMTEuNDU4MiAxMC42OTc0LC0wLjUwNTQ2IDE5LjQ0OTksLTEuMzI4OTEgMTkuNDQ5OSwtMS44Mjk5IDAsLTYuNDQ4NzYgLTE4LjI2MTEsLTQ4LjI1NTY2IC0zMC43MTgsLTcwLjMyNTYzIC04LjAxMjIsLTE0LjE5NTQ0IC0yMi40MzU4LC0zNi41MTA0OCAtMjUuMjI0NiwtMzkuMDI1NjYgLTAuNDA2NiwtMC4zNjY2NiAtMi40OTYxMiwtMy4wNjY2NiAtNC42NDM0MywtNiAtMTkuNzAwOTEsLTI2LjkxMjM4IC01NS4wMzY2OSwtNjAuMzg0NDkgLTg2Ljc0NzI5LC04Mi4xNzIwNiAtNTkuNzQyMzksLTQxLjA0NzU1IC0xMzAuNzM1NzYsLTYzLjgxMDUxIC0yMDYuMjMzOTIsLTY2LjEyNTgzIC00Ny42MDY0OCwtMS40NTk5NiAtMTAwLjIwMDE5LDguMDk0NzUgLTE0OS43NjYwNywyNy4yMDgwNCAtMjUuOTQ2OTksMTAuMDA1NTEgLTY5LjMxNzMxLDM0LjU2MDI2IC05MCw1MC45NTQ4MiAtNDkuNTM0MTEsMzkuMjY0MjIgLTgyLjY1Njg4LDc5LjkwNjkzIC0xMTAuNDA0OCwxMzUuNDcwMjYgLTcuMzMwNDcsMTQuNjc4NzQgLTIwLjI2MTg2LDQ1Ljk1MjM3IC0yMC4yNjE4Niw0OS4wMDE4IDAsMS41NTMwNiAzLjcyMDk2LDIuMTE2NjEgMTguOTUzNzcsMi44NzA1OCAxNy41MzYzOCwwLjg2OCA0NS40MjI4NSw0LjA0Mzc0IDQ3LjY2MjM3LDUuNDI3ODMgMC41MjkzMywwLjMyNzE1IDQuMjA3MjQsMS4xNDE1MiA4LjE3MzEzLDEuODA5NzIgMTQuOTMwODQsMi41MTU2NSA1NS45NDQ3MSwxNC44NjkwOCA2NS40Nzc4NCwxOS43MjIgMS45ODAyNiwxLjAwODA3IDQuMTM1NDYsMS44MzI4NCA0Ljc4OTM1LDEuODMyODQgMC42NTM4OSwwIDIuNzc5NDUsLTQuMDUgNC43MjM0NSwtOSAzLjQzMjkxLC04Ljc0MTE3IDE1Ljc1MDI3LC0zMC41ODg5MyAyMS40MTg4NCwtMzcuOTkxNCAxNi4xODI5MSwtMjEuMTMyOTEgMjQuNTgwMDksLTMwLjI1OTM4IDM5LjQ2NzkxLC00Mi44OTU3MiAxNS4yMDUxNywtMTIuOTA1NjkgMjEuMTgwMjksLTE3LjAxOTI4IDM5LjU3MTg0LC0yNy4yNDMzNCAzOC4wNTIxNSwtMjEuMTUzNjMgODYuNzgzNjEsLTMxLjc5NzQ0IDEyOS4yMjUxMSwtMjguMjI1MDcgMzMuMjQ3NTksMi43OTg0OSA1NS4wODQ4Nyw4LjYxODU1IDgyLjUzNjM3LDIxLjk5NzUzIDM2LjA4NzA0LDE3LjU4NzY2IDYzLjQ4NTY0LDQwLjYyMzEgODguNzc4NzEsNzQuNjQwOTYgOC43OTcwOCwxMS44MzE2MSA4Ljc3NDY2LDEyLjA3NyAtMS40NDUzNywxNS44MjIyOCAtMy4zLDEuMjA5MzMgLTEzLjQ2Mzg3LDYuMzQyODUgLTIyLjU4NjM4LDExLjQwNzgzIC05LjEyMjUsNS4wNjQ5NyAtMTcuMzQ0MTcsOC45MTgyNCAtMTguMjcwMzcsOC41NjI4MiAtMC45MjYyLC0wLjM1NTQxIC0zLjQ4MzY3LC0zLjQ1MDczIC01LjY4MzI1LC02Ljg3ODQ5IC01LjcyMjE1LC04LjkxNzIgLTI5LjcxMjY3LC0zMS45NDA4NSAtNDEuNDYsLTM5Ljc4OTA4IC0zNS4xNTk2NywtMjMuNDg5NjYgLTc0LjE0MzY3LC0zMy4zODg4OCAtMTE2Ljk5NzM2LC0yOS43MDkxNCAtNTkuMDAwNDcsNS4wNjYyMiAtMTE0Ljc3MzQ4LDQ0LjUxMzk1IC0xNDEuNzIwOTQsMTAwLjIzNzg5IC0yLjkwNDk0LDYuMDA3MDIgLTUuMjgxNywxMS45OTE0MSAtNS4yODE3LDEzLjI5ODY0IDAsMS40MjQ2NiAyLjEwNTM0LDMuNDUwODIgNS4yNTU2Nyw1LjA1OCAxNC45NTUwMSw3LjYyOTQ4IDQ2LjQ3OTc1LDMzLjAzNjg0IDY5LjQ4NTQ5LDU2LjAwMTg1IDI3LjcxMDExLDI3LjY2MTAyIDQ1Ljc4OTkzLDUwLjkwNTk4IDY1LjI2NjE1LDgzLjkxMTY1IDguNjE2OTYsMTQuNjAyODcgMTIuNDU5NzQsMjIuNDUxMTMgMjIuMTIxMDYsNDUuMTc4NjggbCAyLjQzMTIsNS43MTkyMiAyLjU1NDMyLC01LjcxOTIyIGMgMS40MDQ4OCwtMy4xNDU1OCA2LjA2OTc2LC0xMy4xMjA2NCAxMC4zNjY0LC0yMi4xNjY4MSB6IG0gLTI0NS40ODAyOCw5Ni42Njk4MSBjIDAsLTEwMS40NDQ0NSAwLjM1MDAxLC0xODQuNzk0NDUgMC43Nzc4LC0xODUuMjIyMjQgMS45NjYwNCwtMS45NjYwNSAyMS4zMTA0MSw5LjU3ODU5IDQxLjIyMjE5LDI0LjYwMTI1IGwgMTQuNjY2NjcsMTEuMDY1NDMgMC4zMzg1MSwxNjcgMC4zMzg0OSwxNjYuOTk5OTUgaCAtMjguNjcxODMgLTI4LjY3MTgzIHoiCiAgICBmaWxsPSIjZmZmZmZmIiAvPgogIDxwYXRoCiAgICBkPSJNIDAsNjgyLjY2NjY1IFYgMCBIIDY4Mi42NjY2NSAxMzY1LjMzMzMgViA2ODIuNjY2NjUgMTM2NS4zMzMzIEggNjgyLjY2NjY1IDAgWiBNIDcyNC4zMTE4NiwxMDI1IGMgMC4zNTI2OCwtMTI3LjE2NjgyIDAuNjI1NTYsLTE0Mi44MjY2NyAyLjY2NjE0LC0xNTMuMDAwMDIgMS4yNTAyOSwtNi4yMzMzMyAzLjI0NjY1LC0xNy4wMzMzMyA0LjQzNjM0LC0yNCAyLjE2OTM0LC0xMi43MDMxMyA1LjkyODM5LC0yNy4yNzg3MiA5LjI4NDQ0LC0zNiAwLjk4NzcsLTIuNTY2NjcgMi41Mjc0NCwtNy4wNjY2NyAzLjQyMTY3LC0xMCAwLjg5NDIzLC0yLjkzMzMzIDMuNjMyOTUsLTkuNjg1ODcgNi4wODYwNCwtMTUuMDA1NjQgMi40NTMwOSwtNS4zMTk3NiA0LjQ2MDE2LC0xMC4wNzIzNSA0LjQ2MDE2LC0xMC41NjEyOSAwLC0wLjc5MDE1IDYuMDI2NDQsLTEzLjI1NjM1IDkuMzk0MzgsLTE5LjQzMzA3IDAuNjk5NzUsLTEuMjgzMzMgMS44NDY1OCwtMy4zODMzMyAyLjU0ODUsLTQuNjY2NjcgMy4xOTMwNCwtNS44Mzc5MyAxNC4wMDg2NCwtMjMuNzM0ODkgMTQuNzA1MjUsLTI0LjMzMzMzIDAuNDI2ODMsLTAuMzY2NjYgMy43NDE1OSwtNC44NjY2NiA3LjM2NjE1LC0xMCAzLjYyNDU0LC01LjEzMzMzIDcuNTg0ODgsLTEwLjUzMzMzIDguODAwNzIsLTEyIDE5LjI5NjI0LC0yMy4yNzcwMSAzNi4xMTI4OSwtNDAuNTI5ODQgNDguNzcyNTMsLTUwLjAzNzU4IDQuMjYwMTksLTMuMTk5NTIgOC4zNDU4LC02LjQ2MzQ0IDkuMDc5MTMsLTcuMjUzMTYgMC43MzMzNCwtMC43ODk3MSA0LjQ4MzM0LC0zLjcyMzQ2IDguMzMzMzQsLTYuNTE5NDQgbCA3LC01LjA4MzYgdiAxOTIuNzgwMjIgMTkyLjc4MDE4IGggMjkuMzY5NzQgMjkuMzY5NzYgbCAtMC41MDA1NywtMjA1LjY2NjYyIGMgLTAuMjc1MzIsLTExMy4xMTY2NiAtMC43NDE3MSwtMjA3LjA0ODc4IC0xLjAzNjQzLC0yMDguNzM4MDMgLTAuNDU0OTcsLTIuNjA3ODIgMC40NzAzMywtMy40ODc2MiA2LjEzMDgzLC01LjgyOTM1IDMuNjY2NjYsLTEuNTE2ODggOC41NTczNCwtMy41ODQ3NiAxMC44NjgxNywtNC41OTUyOSAyLjMxMDgzLC0xLjAxMDUyIDUuMTg0NzMsLTEuODM3MzIgNi4zODY0NSwtMS44MzczMiAxLjIwMTcyLDAgNC40MTEwNCwtMS4wOTQ5MSA3LjEzMTgzLC0yLjQzMzEyIDEzLjk1ODk2LC02Ljg2NTY4IDYxLjc1MzQ3LC0xNS42NTIxMSA5MS43NDg2NywtMTYuODY2ODQgbCAyMC4xMzUyLC0wLjgxNTQyIDAuODY3OCw4LjM5MTAyIGMgMC40Nzc0LDQuNjE1MDYgMS40NDY5LDEyLjU5MTAyIDIuMTU0NiwxNy43MjQzNiAwLjc1MTcsNS40NTI4MiAxLjMxMzMsNjQuNDkxODYgMS4zNTA3LDE0MS45OTk5OSAwLjAzNSw3Mi45NjY2NyAwLjU0OCwxMzMuNDI5MTYgMS4xMzk1LDEzNC4zNjExMSAwLjgyNjEsMS4zMDE1IDcuNTQ2NCwxLjYxMDcgMjguOTc5NiwxLjMzMzMzIGwgMjcuOTA0MSwtMC4zNjExMSAtMC4wOTcsLTEzNi42NjY2NiBjIC0wLjA5NCwtMTMyLjc3MDI1IC0wLjE4MTYsLTEzNy4zNTA5MiAtMy4wNTcyLC0xNjAuNjY2NjYgLTMuMTk4MiwtMjUuOTMxNjQgLTUuMzM2NSwtMzcuMzUwNjYgLTEwLjQ4NjQsLTU2IC0xLjgyMjUsLTYuNiAtMy40Mzk5LC0xMi42IC0zLjU5NCwtMTMuMzMzMzQgLTEuNTgsLTcuNTE1NzcgLTMuMDk5NiwtMTIuMjk4MyAtNi45Mzc0LC0yMS44MzQyNCAtMi40NzE5LC02LjE0MjE2IC00LjQ5NDQsLTExLjk5MDQ0IC00LjQ5NDQsLTEyLjk5NjE3IDAsLTMuMTI2NDEgLTIzLjUxMTEsLTUyLjEwOTQ0IC0yOC42NDgzLC01OS42ODU2OSAtMS41NDc4LC0yLjI4MjgxIC0zLjIwNzcsLTUuMTc3OTEgLTMuNjg4NSwtNi40MzM1NiAtMS43ODIxLC00LjY1MzggLTI2LjM0MTksLTQwLjUxNTIgLTMyLjMyOTksLTQ3LjIwNzA1IC0wLjczMzMsLTAuODE5NTQgLTQuMzMzMywtNS4yNDMxMiAtOCwtOS44MzAyIC04LjYxMTEsLTEwLjc3Mjc0IC00MS41MTU1OSwtNDQuMDgwNjQgLTUyLjU1NzYsLTUzLjIwMjAzIC00LjcwNjY4LC0zLjg4ODAyIC05LjM4ODc1LC03LjkwMDI4IC0xMC40MDQ2LC04LjkxNjEzIC0xLjg4MTk2LC0xLjg4MTk1IC01Ljk1NzMsLTQuNzQzIC0yOC4zNzExMiwtMTkuOTE3NzIgLTYuOTY2NjcsLTQuNzE2NiAtMTMuMzI4NTYsLTkuMTMyMzUgLTE0LjEzNzU1LC05LjgxMjc3IC0wLjgwODk5LC0wLjY4MDQyIC01LjMwODk5LC0zLjIxMzQzIC0xMCwtNS42Mjg5MiAtNC42OTEwMSwtMi40MTU1IC04LjgyOTEyLC00Ljc2NDU0IC05LjE5NTc5LC01LjIyMDA4IC0yLjI5NTY4LC0yLjg1MjIyIC01MC41MTMyMywtMjQuNTUwMTYgLTYzLjk5OTk5LC0yOC44MDAwNyAtMjQuNTAxMTQsLTcuNzIwNzMgLTM2LjQxNDI0LC0xMS4xODA0NyAtNDMuMzMzMzQsLTEyLjU4NDY1IC00LjQsLTAuODkyOTUgLTExLjksLTIuNjgwNiAtMTYuNjY2NjYsLTMuOTcyNTYgLTM5LjkyMDQ1LC0xMC44MjAwNyAtMTM4LjY2NjM5LC0xMC41MTUyIC0xNzkuMzMzMzMsMC41NTM2OSAtMy42NjY2NywwLjk5OCAtMTEuNDY2NjcsMi44NTc3MSAtMTcuMzMzMzMsNC4xMzI2NyAtNS44NjY2NywxLjI3NDk2IC0xNi40MzYyNCw0LjM1MTUyIC0yMy40ODc5NCw2LjgzNjggLTcuMDUxNywyLjQ4NTI4IC0xMy41NjEwMiw0LjUxODY5IC0xNC40NjUxNyw0LjUxODY5IC0wLjkwNDEzLDAgLTMuNTM0NTYsMC44NTY2NCAtNS44NDUzOSwxLjkwMzY0IC0xMC41NTQyMSw0Ljc4MTk1IC0xNi43ODI1Miw3LjQyOTY5IC0xNy40NzY4Niw3LjQyOTY5IC0yLjIyNzY4LDAgLTUzLjM0ODIsMjYuMTM1NiAtNTYuODIxOTUsMjkuMDUwNDggLTEuMDQ2NDgsMC44NzgxMiAtOC4yMDI2OSw1Ljc5Nzk2IC0xNS45MDI2OSwxMC45MzI5OCAtMjkuMzA3NjcsMTkuNTQ0ODEgLTQxLjg1MDI3LDI5Ljc5OTIyIC02Ni4wMjkyOCw1My45ODMzMyAtMTguNjM4MDEsMTguNjQxOTQgLTI4LjQ0MTg0LDI5Ljk0Mjg0IC00MS41NTE5OSw0Ny44OTcwNiAtMy44MDMwMiw1LjIwODIyIC04LjY3MTAyLDExLjg2OTQ4IC0xMC44MTc3OCwxNC44MDI4MiAtMi4xNDY3NiwyLjkzMzMzIC01LjYxNDkzLDguMzMzMzMgLTcuNzA3MDUsMTIgLTIuMDkyMTIsMy42NjY2NiAtNC42MTEzMSw3LjQ5NjczIC01LjU5ODIyLDguNTExMjQgLTAuOTg2ODksMS4wMTQ1MiAtMy4xNzM1OCw0LjYxNDUyIC00Ljg1OTMsOCAtMS42ODU3MiwzLjM4NTQ5IC02LjQ3NDEsMTIuNzU1NDIgLTEwLjY0MDgzLDIwLjgyMjA5IC00LjE2NjczLDguMDY2NjcgLTkuOTkwODMsMjAuMzY2NjcgLTEyLjk0MjQxLDI3LjMzMzMzIC0yLjk1MTYsNi45NjY2NyAtNi4yMjYwMywxNC41NTczNSAtNy4yNzY1MSwxNi44NjgxNyAtMS4wNTA0OCwyLjMxMDgzIC0xLjkyNjczLDUuMDEwODMgLTEuOTQ3MjMsNiAtMC4wMjA1LDAuOTg5MTggLTEuODQ5MDUsNi44OTg1IC00LjA2MzQ4LDEzLjEzMTgzIC0zLjY5MzIyLDEwLjM5NjAzIC01LjI5MTE3LDE2LjMwMDQ4IC0xMS4xODYyNCw0MS4zMzMzMyAtOC4zNDY4MSwzNS40NDM5OCAtOS4yNDY3OCw1Ni42MDI1IC04LjgxODg4LDIwNy4zMzMzMyAwLjE5OTg2LDcwLjQgMC42NDA4NCwxMjguNDUgMC45Nzk5OCwxMjkgMC43OTY2NCwxLjI5MTk5IDUyLjY0MjM4LDEuMjcyNjEgNTQuNjM2OTcsLTAuMDIwNCAxLjEwMTQ4LC0wLjcxNDA3IDEuNzIyMTEsLTM4LjM4NTk2IDIuMjg5NTksLTEzOC45Nzk1OCAwLjY5MDIsLTEyMi4zNDM2NiAxLjYzMDg1LC0xNjEuMjA5MjkgMy45NTgwMSwtMTYzLjUzNjQ3IDEuMjcwMzMsLTEuMjcwMzIgNDguMTg1MTYsMi4wMTgxNCA1OC45MDc5OCw0LjEyOTExIDUuODY2NjcsMS4xNTQ5NSAxNS40NjY2NywzLjAzNzk3IDIxLjMzMzM0LDQuMTg0NDkgMTkuNzA4MjUsMy44NTE1OSA0NS45NjkzMiwxMi41NTE2MiA2MS41OTE4OCwyMC40MDQ3OSA0LjU0MjIsMi4yODMyOCA5LjA3MjIsNC4xNTE0MSAxMC4wNjY2Niw0LjE1MTQxIDAuOTk0NDcsMCAyLjM3ODEyLDAuNTIwMzQgMy4wNzQ3OSwxLjE1NjMgMC42OTY2NywwLjYzNTk2IDYuMzg1MTMsMy44NDY2OSAxMi42NDEwNCw3LjEzNDk1IDYuMjU1ODksMy4yODgyNyAxNi42ODA5Miw5LjUxNzk0IDIzLjE2NjcsMTMuODQzNzEgNi40ODU4LDQuMzI1NzcgMTQuMTgyNiw5LjQzNTIzIDE3LjEwNCwxMS4zNTQzNiAyLjkyMTQyLDEuOTE5MTIgNS42OTYzOSw0LjAyMTU3IDYuMTY2NjMsNC42NzIxMSAwLjQ3MDIzLDAuNjUwNTQgNS4wNTQ5Niw0LjU0MDgxIDEwLjE4ODI5LDguNjQ1MDIgMTcuMTc0NSwxMy43MzE0MyA0MS45NjEzLDM5Ljc4NTUxIDUzLjYwNTkyLDU2LjM0NjYzIDEuNjE2NiwyLjI5OTE1IDMuNDQ4ODMsNC43ODAyNSA0LjA3MTYzLDUuNTEzNTkgNi4yMjMwNyw3LjMyNzUgMjAuMTQ3NjEsMzAuNzc2ODggMjkuNjkwNjYsNDkuOTk5OTkgOC44MDI1NiwxNy43MzE1NCAyMC4xNTU1OSw0Ny4xODIzIDIxLjg0NDUyLDU2LjY2NjY3IDAuNTIyMzYsMi45MzMzMyAxLjc2OTcsOC4zMzMzMyAyLjc3MTg2LDEyIDguNDY0NTcsMzAuOTY5OTcgOS45ODMxMiw2My4xMDkyMiAxMC4wMDEwOSwyMTEuNjY2NjQgbCAwLjAxNDMsMTE4LjMzMzMgaCAyOC42MjYxNiAyOC42MjYxNiB6IE0gNjkwLjk3NzU0LDc1Ni42MzQxNyBjIC0xMS4yNDM3LC0yOS4wNTY3MyAtMzYuOTc0MDgsLTY5Ljk3NDgxIC02Mi44NjA1MywtOTkuOTY0ODQgLTguNTY4MzYsLTkuOTI2NjUgLTQzLjYyMDkzLC00NC42MDUxIC00NS4xMTcwMiwtNDQuNjM1NDkgLTAuOTE2NjcsLTAuMDE4NyAtMS42NjY2NywtMC42MDUwMyAtMS42NjY2NywtMS4zMDMxMyAwLC0wLjY5ODExIC0yLjg1LC0zLjIxNjAzIC02LjMzMzMzLC01LjU5NTM5IC0zLjQ4MzM0LC0yLjM3OTM3IC02LjkzMzM0LC01LjAxNTE2IC03LjY2NjY3LC01Ljg1NzMxIC0wLjczMzMzLC0wLjg0MjE2IC0zLjQzMzMzLC0yLjk0NTMyIC02LC00LjY3MzcgLTIuNTY2NjcsLTEuNzI4MzggLTQuOTY2NjcsLTMuNTI2OTkgLTUuMzMzMzMsLTMuOTk2OTIgLTAuOTkyOTEsLTEuMjcyNTIgLTE0LjUyMjI2LC0xMC42MDc0IC0xNS4zNzM2NiwtMTAuNjA3NCAtMS43MDQxNCwwIC04LjYyNjM0LC01Ljk2NzQ3IC04LjYyNjM0LC03LjQzNjU4IDAsLTEuNzQ4MzIgMTAuNDY0MjYsLTIzLjQ4MTg1IDExLjgyNjgxLC0yNC41NjM0MiAwLjQ2MTkyLC0wLjM2NjY3IDIuMjk1MTEsLTMuMzY2NjcgNC4wNzM3NSwtNi42NjY2NyAxLjc3ODY0LC0zLjMgMy42MDc1NCwtNi4zIDQuMDY0MjQsLTYuNjY2NjcgMC40NTY2OSwtMC4zNjY2NiAyLjI0OTQyLC0yLjc2NjY2IDMuOTgzODUsLTUuMzMzMzMgNC41OTcwMywtNi44MDI4MSAyNS4wNzM1NSwtMjcuNDQzMTYgMzIuMDUxMzUsLTMyLjMwNzc1IDMuMywtMi4zMDA2MSA2LjMsLTQuNTY3MjYgNi42NjY2NiwtNS4wMzcwMiAwLjM2NjY3LC0wLjQ2OTc2IDMuMzY2NjcsLTIuMzA5MzYgNi42NjY2NywtNC4wODggMy4zLC0xLjc3ODY0IDYuMywtMy41Nzg2NCA2LjY2NjY3LC00IDIuNjg4NDQsLTMuMDg5NDQgMjcuODQ3ODMsLTE0LjA4NjMyIDM5LjMzMzMzLC0xNy4xOTIxMyAzMy42MzAyNCwtOS4wOTQwNCA1NS4xMzk4LC05LjM4MjUxIDkwLC0xLjIwNjk5IDE2LjgxNjgzLDMuOTQzOTUgMzYuNzI0OTUsMTIuMjUyOTMgNTIuMDUzMzcsMjEuNzI1MzQgMTQuMjYxMzgsOC44MTMwNCA0MC42MDY1OCwzNC4xMDg0NCA0OC4zNjcyLDQ2LjQzOTg4IDEuMjY5MTYsMi4wMTY2NyAzLjQyMDcyLDMuNjY2NjcgNC43ODEyNCwzLjY2NjY3IDEuMzYwNSwwIDcuNDk2NjgsLTIuNzk1MzEgMTMuNjM1OTIsLTYuMjExNzkgNi4xMzkyNSwtMy40MTY0OCAxNi44NjIyNiwtOC44ODE4MSAyMy44Mjg5MywtMTIuMTQ1MTggNi45NjY2NywtMy4yNjMzOCAxMi44NjQ2MSwtNi4xMTYwMiAxMy4xMDY1MywtNi4zMzkyIDEuNDQ2MiwtMS4zMzQxNiAtMTcuOTI1MzgsLTI2LjE5NDcgLTMwLjY2NjMsLTM5LjM1NTYxIC0xOC44ODk5NiwtMTkuNTEyNjcgLTM2LjM5MDE1LC0zMi45MzE2NCAtNTYuNzc0MTUsLTQzLjUzMzg2IC02LjQxNjM1LC0zLjMzNzI5IC0xMi4zMzE0NSwtNi41OTkwMSAtMTMuMTQ0NjgsLTcuMjQ4MjYgLTAuODEzMjMsLTAuNjQ5MjQgLTQuMTEzMjMsLTIuMDIyNzYgLTcuMzMzMzMsLTMuMDUyMjYgLTMuMjIwMTEsLTEuMDI5NSAtOS4xNTQ3NCwtMy4xNjQ4IC0xMy4xODgwNywtNC43NDUxMiAtOS44NzQ5OSwtMy44NjkxMyAtMTguODA1MTUsLTYuMjA4MTggLTMwLC03Ljg1Nzc4IC01LjEzMzMzLC0wLjc1NjQyIC0xMy4yMzMzMywtMi4wOTA2OCAtMTgsLTIuOTY1MDIgLTEyLjU4OTYxLC0yLjMwOTMgLTQzLjc5NDI4LC0yLjA2MDE3IC01Ny4zMzMzMywwLjQ1Nzc1IC02LjIzMzMzLDEuMTU5MjQgLTE0LjMzMzMzLDIuNTEwNzYgLTE4LDMuMDAzMzcgLTkuMDQ2MiwxLjIxNTM4IC0xNy41ODYwNSwzLjU4OTMyIC0zMi45Nzg1Myw5LjE2NzUxIC0xMy4xNTY2MSw0Ljc2NzkyIC0zOC42NDE5MSwxNi44NTMyNyAtNDIuMzM2MjUsMjAuMDc2MjMgLTEuMTEwMiwwLjk2ODU0IC00LjExODU1LDIuODExMzIgLTYuNjg1MjIsNC4wOTUwNSAtNC41NTE5MiwyLjI3NjY4IC01LjQ0OTk4LDIuOTM4MDkgLTExLjY2NjY2LDguNTkyMjggLTEuNjUsMS41MDA3MSAtMy4zNjAyNywyLjcyODU2IC0zLjgwMDU5LDIuNzI4NTYgLTEuODEyLDAgLTIxLjU1ODg1LDE4LjcwODc1IC0yOS43Mzk1OSwyOC4xNzYxMyAtMTYuMjAyNDIsMTguNzUwNzMgLTE3LjU2OTU4LDIwLjQ2NTE1IC0yMS4xMjQ4NCwyNi40OTA1MyAtMS45NDcxNiwzLjMgLTMuOTU3NzgsNi4zIC00LjQ2ODA2LDYuNjY2NjcgLTEuNTI4ODIsMS4wOTg1NSAtMTUuODY2OTIsMjkuNjY3ODggLTE1Ljg2NjkyLDMxLjYxNTU2IDAsMi43ODQ2OSAtMy42OTUxMiwzLjU1MDI3IC03LjAxMDI5LDEuNDUyNDEgLTYuNDkyNjMsLTQuMTA4NTQgLTQ1LjI1Mjc1LC0xNi4xMDc2IC02MS42NTYzOCwtMTkuMDg3MDkgLTYuNiwtMS4xOTg3OSAtMTcuNywtMy4zMDEwNSAtMjQuNjY2NjYsLTQuNjcxNjkgLTYuOTY2NjcsLTEuMzcwNjQgLTIxLjUxNjY3LC0yLjkxMjc4IC0zMi4zMzMzNCwtMy40MjY5OCAtMTAuODE2NjYsLTAuNTE0MTggLTE5LjY2NjY2LC0xLjQ2NjEyIC0xOS42NjY2NiwtMi4xMTU0IDAsLTAuNjQ5MjYgMS40Mjc2NywtNC42MTI0MiAzLjE3MjYsLTguODA2OTggMS43NDQ5MywtNC4xOTQ1OCAzLjYyNzEsLTkuMTI2NSA0LjE4MjYxLC0xMC45NTk4MyAwLjU1NTQ5LC0xLjgzMzMzIDMuMzI3ODMsLTguMjk0ODcgNi4xNjA3MywtMTQuMzU4OTYgMi44MzI5LC02LjA2NDA5IDUuMTUwNzIsLTExLjg3ODY4IDUuMTUwNzIsLTEyLjkyMTMgMCwtMS4wNDI2MyAwLjY1OTY3LC0yLjMwMzM5IDEuNDY1OTIsLTIuODAxNjggMC44MDYyNiwtMC40OTgzIDMuMDk1MDQsLTQuMjgzNyA1LjA4NjIsLTguNDEyMDIgMTcuMjM2MSwtMzUuNzM2MTMgNTcuNDAxMTgsLTg2LjE2NTIgODguNzgxMjIsLTExMS40Njg4MSA0LjQsLTMuNTQ3OTkgOS4yLC03LjU0OTI4IDEwLjY2NjY2LC04Ljg5MTc2IDUuNTY4MzIsLTUuMDk2ODUgMjkuNjUzOTksLTIxLjg2ODg0IDM4Ljk2NzgzLC0yNy4xMzUxMyAyLjAzNDM2LC0xLjE1MDI5IDUuNDk4ODQsLTMuMjEyMzEgNy42OTg4NCwtNC41ODIyNSAxMC40ODk1LC02LjUzMTkgNDYuODg5ODksLTIzLjU2MTM1IDU2Ljc3ODI2LC0yNi41NjI5OSAyLjUwNTI4LC0wLjc2MDQ5IDkuMzU1MDcsLTMuMTE1OTEgMTUuMjIxNzQsLTUuMjM0MjcgNS44NjY2NiwtMi4xMTgzNiAxNS40NjY2NiwtNC45MjAzNiAyMS4zMzMzMywtNi4yMjY2NiA1Ljg2NjY3LC0xLjMwNjMyIDE0Ljg2NjY3LC0zLjQ2ODEyIDIwLC00LjgwNDAyIDUuMTMzMzMsLTEuMzM1ODkgMTYuMjMzMzMsLTMuMjE3NDIgMjQuNjY2NjYsLTQuMTgxMTggMTkuOTc3NDgsLTIuMjgzMDMgODMuOTA4OTUsLTIuMzA3NzYgMTAzLjMzMzM0LC0wLjA0IDI5LjQ0Nzc1LDMuNDM4MDEgNzIuODYxNjksMTUuNzQ1MDggMTAyLjY2NjY2LDI5LjEwNDE0IDE1LjgzMzQzLDcuMDk2OCAzOC4xMjcyOCwxOC42OTk5OSAzOS4zMzMzMywyMC40NzE2NyAwLjM2NjY3LDAuNTM4NjMgMi4xNjY2NywxLjc1MjI5IDQsMi42OTcwMyA0Ljk1MTg0LDIuNTUxNzMgMjEuNzk2ODMsMTMuNjM3NDIgMjMuMzMzMzMsMTUuMzU1NjYgMC43MzMzNCwwLjgyMDA3IDUuMDI4MzQsMy45ODg4OCA5LjU0NDQ2LDcuMDQxNzkgNC41MTYxLDMuMDUyOTIgOC40MTYxLDYuMDE1NzUgOC42NjY2Niw2LjU4NDA3IDAuMjUwNTUsMC41NjgzMyAzLjQ1MTc0LDMuNDMzMzEgNy4xMTM3NSw2LjM2NjY1IDEwLjUwMTE3LDguNDExNjQgMzEuMzM5MTksMjkuNDkyOTIgNDIuODMzMjgsNDMuMzMzMzMgMTEuOTcyNDQsMTQuNDE2NDEgMjUuMjYyMjEsMzEuOTMxMTYgMjcuNTk3MDEsMzYuMzcwMzUgMC44NjgsMS42NTAyOCAzLjAyMzMsNS4wMTgzNCA0Ljc4OTYsNy40ODQ1NiAxLjc2NjQsMi40NjYyMiA0Ljk5MzEsNy44NTc3OCA3LjE3MDYsMTEuOTgxMjQgMTAuNzMxOCwyMC4zMjI0OSAxOC41NzM2LDM2LjEzOTYzIDIwLjkwMzksNDIuMTYzODUgMS40MTg0LDMuNjY2NjYgNC40MDkzLDExLjA3ODg0IDYuNjQ2NSwxNi40NzE0OCAyLjIzNzEsNS4zOTI2NSA0LjA2NzYsMTAuNTU1OCA0LjA2NzYsMTEuNDczNjYgMCwxLjIxNzgzIC01LjMxNTEsMS45MjU5IC0xOS42NjY3LDIuNjE5OTQgLTEwLjgxNjcsMC41MjMxIC0yNC4xNjY3LDEuODQ2MjIgLTI5LjY2NjcsMi45NDAyOCAtNS41LDEuMDk0MDQgLTEyLjk5OTk2LDIuNDg4NCAtMTYuNjY2NjIsMy4wOTg1NiAtMy42NjY2NywwLjYxMDE2IC0xMC4yNjY2NywxLjgxMDk3IC0xNC42NjY2NywyLjY2ODQ1IC0xMi44MTMwNCwyLjQ5NzA1IC01NC4wNiwxNS42NTU3OSAtNTguNjY2NjcsMTguNzE2MDMgLTAuNzMzMzMsMC40ODcxNiAtNC4zMzMzMywxLjk4NzA5IC04LDMuMzMzMTggLTYuMDE3NjksMi4yMDkxOSAtMjMuNjI2NzMsMTAuOTYxMjcgLTQzLjMzMzMzLDIxLjUzNzYgLTUwLjMyMTQsMjcuMDA3MDIgLTExMi4xODU5NCw4Ny4zMjgyNCAtMTQxLjMzMzMzLDEzNy44MDc1MSAtMy4xODgxNyw1LjUyMTQ4IC00Ljg3MjYxLDguNDkzMjEgLTYuNjEyOTIsMTEuNjY2NjYgLTAuNzAzNzcsMS4yODMzNCAtMi42NTk1Niw0LjczMzM0IC00LjM0NjIxLDcuNjY2NjcgLTIuODAxNjUsNC44NzI1MyAtMTMuMzgzMjEsMjcuMzY0OTIgLTE2LjYwNzMxLDM1LjMwMDg1IC0xLjI0MDQ5LDMuMDUzNDQgLTEuNjQ5NDYsMi41MDM3NiAtNS40NTYsLTcuMzMzMzMgeiBtIC0xNzAuOTk3OTcsOTkuNjk5MTQgYyAtMC4wMTA3LC05MS40ODMzMyAtMC40NjEyMiwtMTY3LjAwNDkgLTEsLTE2Ny44MjU3IC0xLjI3NzQ4LC0xLjk0NjIgLTIwLjMzMzcyLC0xNy4wNDQ2OSAtMjMuOTY2MzIsLTE4Ljk4ODggLTEuNTQyOTMsLTAuODI1NzUgLTMuNjAyMTIsLTIuMjc5NDMgLTQuNTc1OTYsLTMuMjMwMzkgLTMuNDkwNDEsLTMuNDA4MzYgLTIxLjgzNjgzLC0xMy4yMTIyNiAtMjUuMTAzOTcsLTEzLjQxNDk2IGwgLTMuMzMzMzMsLTAuMjA2ODEgLTAuMzM4MDEsMTg1IC0wLjMzODAyLDE4NC45OTk5NSBoIDI5LjMzODAxIDI5LjMzODAyIHoiCiAgICBmaWxsPSIjOGMwMTlhIiAvPgo8L3N2Zz4K'\n\nfunction isResponseError(error: any): error is ResponseError {\n return typeof error === 'object' && 'code' in error && 'message' in error\n}\n\nexport class KibisisWallet extends BaseWallet {\n public methods: ProviderMethod[] = []\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n metadata = {}\n }: WalletConstructor<WalletId.KIBISIS>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n this.store = store\n }\n\n static defaultMetadata = {\n name: 'Kibisis',\n icon\n }\n\n static async sendRequestWithTimeout<Params, Result>({\n method,\n params,\n timeout,\n reference\n }: SendRequestWithTimeoutOptions<Params>): Promise<Result | undefined> {\n return new Promise<Result | undefined>((resolve, reject) => {\n const channel = new BroadcastChannel(ARC_0027_CHANNEL_NAME)\n const requestId = generateUuid()\n // eslint-disable-next-line prefer-const\n let timer: number\n\n // listen to responses\n channel.onmessage = (message: MessageEvent<ResponseMessage<Result>>) => {\n // if the response's request id does not match the intended request, just ignore\n if (!message.data || message.data.requestId !== requestId) {\n return\n }\n\n // clear the timer, we can handle it from here\n window.clearTimeout(timer)\n\n // if there is an error, reject\n if (message.data.error) {\n reject(message.data.error)\n\n // close the channel, we are done here\n return channel.close()\n }\n\n // return the result\n resolve(message.data.result)\n\n // close the channel, we are done here\n return channel.close()\n }\n\n timer = window.setTimeout(() => {\n // close the channel connection\n channel.close()\n\n reject({\n code: METHOD_TIMED_OUT_ERROR,\n data: {\n method\n },\n message: `No response from provider \"${WalletId.KIBISIS.toUpperCase()}\"`,\n providerId: ARC_0027_PROVIDER_ID\n } as ResponseError<{ method: ProviderMethod }>)\n }, timeout || DEFAULT_REQUEST_TIMEOUT)\n\n // broadcast the request\n channel.postMessage({\n id: requestId,\n params,\n reference\n } as RequestMessage<Params>)\n })\n }\n\n /**\n * Calls the enable method on the provider that returns the authorized accounts.\n * @returns {Arc0027Account[]} the authorized accounts.\n * @throws {METHOD_CANCELED_ERROR} if the method was cancelled by the user.\n * @throws {METHOD_NOT_SUPPORTED_ERROR} if the method is not supported for the configured network.\n * @throws {METHOD_TIMED_OUT_ERROR} if the method timed out by lack of response.\n * @throws {NETWORK_NOT_SUPPORTED_ERROR} if the network is not supported for the configured network.\n * @throws {UNKNOWN_ERROR} if the response result was empty.\n */\n private async enable(): Promise<Arc0027Account[]> {\n const method = 'enable'\n\n // check the method is supported\n this.validateMethod(method)\n\n const genesisHash = await this.getGenesisHash()\n\n const result = await KibisisWallet.sendRequestWithTimeout<EnableParams, EnableResult>({\n method,\n params: {\n genesisHash,\n providerId: ARC_0027_PROVIDER_ID\n },\n reference: ARC_0027_ENABLE_REQUEST\n })\n\n // check for a result\n if (!result) {\n throw {\n code: UNKNOWN_ERROR,\n message: `Received response, but \"${method}\" request details were empty for provider \"${this.name}\"`,\n providerId: ARC_0027_PROVIDER_ID\n } as ResponseError\n }\n\n return result.accounts\n }\n\n /**\n * Gets the genesis hash of the algod client's configured network.\n * @returns {string} the genesis hash\n */\n private async getGenesisHash(): Promise<string> {\n const algodClient = this.getAlgodClient()\n const version = await algodClient.versionsCheck().do()\n const genesisHash = version.genesis_hash_b64\n\n return genesisHash\n }\n\n /**\n * Gets the provider information and updates the supported methods. This should be called\n * before interacting with the provider to ensure methods are supported.\n * @throws {METHOD_TIMED_OUT_ERROR} if the method timed out by lack of response.\n * @throws {NETWORK_NOT_SUPPORTED_ERROR} if the network is not supported for the configured network.\n * @throws {UNKNOWN_ERROR} if the response result was empty.\n */\n private async getSupportedMethods(): Promise<void> {\n const genesisHash = await this.getGenesisHash()\n\n const result = await KibisisWallet.sendRequestWithTimeout<\n GetProvidersParams,\n GetProvidersResult\n >({\n method: 'getProviders',\n params: {\n providerId: ARC_0027_PROVIDER_ID\n },\n reference: ARC_0027_GET_PROVIDERS_REQUEST,\n timeout: LOWER_REQUEST_TIMEOUT\n })\n\n // check for a result\n if (!result) {\n throw {\n code: UNKNOWN_ERROR,\n message: `Received response, but provider details were empty for provider \"${this.name}\"`,\n providerId: ARC_0027_PROVIDER_ID\n } as ResponseError\n }\n\n const networkConfiguration = result.networks.find((value) => value.genesisHash === genesisHash)\n\n // check if the network is supported\n if (!networkConfiguration) {\n throw {\n code: NETWORK_NOT_SUPPORTED_ERROR,\n data: {\n genesisHash\n },\n message: `Network \"${this.activeNetwork}\" not supported on provider \"${this.name}\"`,\n providerId: ARC_0027_PROVIDER_ID\n } as ResponseError<{ genesisHash: string }>\n }\n\n this.methods = networkConfiguration.methods\n }\n\n /**\n * Calls the signTxns methods to sign the supplied transactions.\n * @param {Arc0001SignTxns[]} txns - the unsigned or signed transactions as defined in ARC-0001.\n * @returns {(string | null)[]} the authorized accounts.\n * @throws {INVALID_INPUT_ERROR} if computed group ID for the txns does not match the assigned group ID.\n * @throws {INVALID_GROUP_ID_ERROR} if the unsigned txns is malformed or not conforming to ARC-0001.\n * @throws {METHOD_CANCELED_ERROR} if the method was cancelled by the user.\n * @throws {METHOD_NOT_SUPPORTED_ERROR} if the method is not supported for the configured network.\n * @throws {METHOD_TIMED_OUT_ERROR} if the method timed out by lack of response.\n * @throws {NETWORK_NOT_SUPPORTED_ERROR} if the network is not supported for the configured network.\n * @throws {UNAUTHORIZED_SIGNER_ERROR} if a signer in the request is not authorized by the provider.\n * @throws {UNKNOWN_ERROR} if the response result was empty.\n */\n private async signTxns(txns: Arc0001SignTxns[]): Promise<(string | null)[]> {\n const method = 'signTxns'\n\n // check the method is supported\n this.validateMethod(method)\n\n const result = await KibisisWallet.sendRequestWithTimeout<SignTxnsParams, SignTxnsResult>({\n method,\n params: {\n providerId: ARC_0027_PROVIDER_ID,\n txns\n },\n reference: ARC_0027_SIGN_TXNS_REQUEST\n })\n\n // check for a result\n if (!result) {\n throw {\n code: UNKNOWN_ERROR,\n message: `Received response, but \"${method}\" request details were empty for provider \"${this.name}\"`,\n providerId: ARC_0027_PROVIDER_ID\n } as ResponseError\n }\n\n return result.stxns\n }\n\n /**\n * Validates whether a method is supported with the provider.\n * @param {ProviderMethod} method - the method to validate.\n * @throws {METHOD_NOT_SUPPORTED_ERROR} if the method is not supported for the configured network.\n */\n private validateMethod(method: ProviderMethod): void {\n if (!this.methods.includes(method)) {\n throw {\n code: METHOD_NOT_SUPPORTED_ERROR,\n data: {\n method\n },\n message: `\"${method}\" operation not supported on \"${this.activeNetwork}\" for provider \"${this.name}\"`,\n providerId: ARC_0027_PROVIDER_ID\n } as ResponseError<{ method: string }>\n }\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[KibisisWallet] Connecting...')\n try {\n await this.getSupportedMethods()\n\n const accounts: Arc0027Account[] = await this.enable()\n\n const walletAccounts = accounts.map(({ address, name }, idx) => ({\n name: name || `Kibisis Wallet ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]!\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount\n }\n })\n\n return walletAccounts\n } catch (error: any) {\n console.error(`[KibisisWallet] Error connecting: ${error.message}`)\n return []\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[KibisisWallet] Disconnecting...')\n this.onDisconnect()\n }\n\n public resumeSession(): Promise<void> {\n return Promise.resolve()\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n try {\n await this.getSupportedMethods()\n\n const txnsToSign: Arc0001SignTxns[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Marshal transactions into `Arc0001SignTxns[]`\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (shouldSign) {\n txnsToSign.push({ txn: txnBase64 })\n signedIndexes.push(idx)\n } else {\n txnsToSign.push({ txn: txnBase64, signers: [] })\n }\n })\n\n // Sign transactions\n const signTxnsResult = await this.signTxns(txnsToSign)\n\n // Filter out null results\n const signedTxnsBase64 = signTxnsResult.filter(Boolean) as string[]\n\n // Convert base64 signed transactions to msgpack\n const signedTxns = signedTxnsBase64.map((txn) => new Uint8Array(Buffer.from(txn, 'base64')))\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n } catch (error: any) {\n console.error(\n `[KibisisWallet] Error signing transactions: ` +\n (isResponseError(error) ? `${error.message} (code: ${error.code})` : error.message)\n )\n throw error\n }\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n try {\n const txnsToSign = txnGroup.reduce<Arc0001SignTxns[]>((acc, txn, idx) => {\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (indexesToSign.includes(idx)) {\n acc.push({ txn: txnBase64 })\n } else {\n acc.push({ txn: txnBase64, signers: [] })\n }\n return acc\n }, [])\n\n const signTxnsResult = await this.signTxns(txnsToSign)\n const signedTxnsBase64 = signTxnsResult.filter(Boolean) as string[]\n\n const signedTxns = signedTxnsBase64.map((txn) => new Uint8Array(Buffer.from(txn, 'base64')))\n return signedTxns\n } catch (error: any) {\n console.error(\n `[KibisisWallet] Error signing transactions: ` +\n (isResponseError(error) ? `${error.message} (code: ${error.code})` : error.message)\n )\n throw error\n }\n }\n}\n","import algosdk from 'algosdk'\nimport { addWallet, type State } from 'src/store'\nimport {\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { Store } from '@tanstack/store'\nimport type { WalletAccount, WalletConstructor, WalletId } from './types'\n\ninterface KmdConstructor {\n token: string | algosdk.KMDTokenHeader | algosdk.CustomTokenHeader\n baseServer?: string\n port?: string | number\n headers?: Record<string, string>\n}\n\nexport type KmdOptions = Partial<Pick<KmdConstructor, 'token'>> &\n Omit<KmdConstructor, 'token'> & {\n wallet?: string\n }\n\ninterface KmdWalletRecord {\n id: string\n name: string\n driver_name?: string\n driver_version?: number\n mnemonic_ux?: boolean\n supported_txs?: Array<any>\n}\n\ninterface ListWalletsResponse {\n wallets: KmdWalletRecord[]\n message?: string\n error?: boolean\n}\n\ninterface InitWalletHandleResponse {\n wallet_handle_token: string\n message?: string\n error?: boolean\n}\n\ninterface ListKeysResponse {\n addresses: string[]\n message?: string\n error?: boolean\n}\n\nconst icon =\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+'\n\nexport class KmdWallet extends BaseWallet {\n private client: algosdk.Kmd | null = null\n private options: KmdConstructor\n private walletName: string\n private walletId: string = ''\n private password: string = ''\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options,\n metadata = {}\n }: WalletConstructor<WalletId.KMD>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n\n const {\n token = 'a'.repeat(64),\n baseServer = 'http://127.0.0.1',\n port = 4002,\n wallet = 'unencrypted-default-wallet'\n } = options || {}\n\n this.options = { token, baseServer, port }\n this.walletName = wallet\n\n this.store = store\n }\n\n static defaultMetadata = { name: 'KMD', icon }\n\n private async initializeClient(): Promise<algosdk.Kmd> {\n console.info('[KmdWallet] Initializing client...')\n const { token, baseServer, port } = this.options\n const client = new algosdk.Kmd(token, baseServer, port)\n this.client = client\n return client\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[KmdWallet] Connecting...')\n try {\n if (!this.client) {\n await this.initializeClient()\n }\n\n // Get a new token\n const walletId = this.walletId || (await this.fetchWalletId())\n const token = await this.fetchToken(walletId, this.getPassword())\n\n const accounts = await this.fetchAccounts(token)\n\n if (accounts.length === 0) {\n throw new Error('No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `KMD Wallet ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]!\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount\n }\n })\n\n await this.releaseToken(token)\n\n return walletAccounts\n } catch (error) {\n console.error('[KmdWallet] Error connecting:', error)\n return []\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[KmdWallet] Disconnecting...')\n this.onDisconnect()\n }\n\n public resumeSession = async (): Promise<void> => {\n try {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n // No session to resume\n if (!walletState) {\n return\n }\n\n console.info('[KmdWallet] Resuming session...')\n await this.initializeClient()\n } catch (error: any) {\n console.error(`[KmdWallet] Error resuming session: ${error.message}`)\n this.onDisconnect()\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[KmdWallet] Client not initialized!')\n }\n // Get a new token\n const walletId = this.walletId || (await this.fetchWalletId())\n const password = this.getPassword()\n const token = await this.fetchToken(walletId, password)\n\n const signTxnPromises: Promise<Uint8Array>[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Determine which transactions to sign\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n if (shouldSign) {\n signTxnPromises.push(this.client!.signTransaction(token, password, txn))\n signedIndexes.push(idx)\n }\n })\n\n // Sign transactions\n const signedTxns = await Promise.all(signTxnPromises)\n\n // Release token\n await this.releaseToken(token)\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[KmdWallet] Client not initialized!')\n }\n const walletId = this.walletId || (await this.fetchWalletId())\n const password = this.getPassword()\n const token = await this.fetchToken(walletId, password)\n\n const signTxnPromises: Promise<Uint8Array>[] = []\n\n txnGroup.forEach((txn, idx) => {\n if (indexesToSign.includes(idx)) {\n signTxnPromises.push(this.client!.signTransaction(token, password, txn))\n }\n })\n\n const signedTxns = await Promise.all(signTxnPromises)\n\n return signedTxns\n }\n\n private async fetchWalletId(): Promise<string> {\n console.info('[KmdWallet] Fetching wallet data...')\n if (!this.client) {\n throw new Error('Client not initialized!')\n }\n const { wallets }: ListWalletsResponse = await this.client.listWallets()\n const wallet = wallets.find((wallet: KmdWalletRecord) => wallet.name === this.walletName)\n if (!wallet) {\n throw new Error(`Wallet ${this.walletName} not found!`)\n }\n\n this.walletId = wallet.id\n return wallet.id\n }\n\n private async fetchToken(walletId: string, password: string): Promise<string> {\n console.info('[KmdWallet] Fetching token...')\n if (!this.client) {\n throw new Error('Client not initialized!')\n }\n const { wallet_handle_token }: InitWalletHandleResponse = await this.client.initWalletHandle(\n walletId,\n password\n )\n return wallet_handle_token\n }\n\n private async fetchAccounts(token: string): Promise<string[]> {\n console.info('[KmdWallet] Fetching accounts...')\n if (!this.client) {\n throw new Error('Client not initialized!')\n }\n const { addresses }: ListKeysResponse = await this.client.listKeys(token)\n return addresses\n }\n\n private async releaseToken(token: string): Promise<void> {\n console.info('[KmdWallet] Releasing token...')\n if (!this.client) {\n throw new Error('Client not initialized!')\n }\n await this.client.releaseWalletHandle(token)\n }\n\n private getPassword(): string {\n if (this.password) {\n return this.password\n }\n const password = prompt('KMD password') || ''\n this.password = password\n return password\n }\n}\n","import algosdk from 'algosdk'\nimport { addWallet, type State } from 'src/store'\nimport {\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { Store } from '@tanstack/store'\nimport type LuteConnect from 'lute-connect'\nimport type { SignTxnsError, WalletTransaction } from 'lute-connect'\nimport type { WalletAccount, WalletConstructor, WalletId } from './types'\n\nexport interface LuteConnectOptions {\n siteName?: string\n}\n\nfunction isSignTxnsError(error: any): error is SignTxnsError {\n return error instanceof Error && 'code' in error\n}\n\nconst svgIcon = `\n<svg fill=\"#ab47bc\" version=\"1.1\" viewBox=\"0 0 1e3 1e3\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"m708.49 604.22c-1.4434 0.0745-3.1495-0.29645-4.4397-0.9439-1.3774-0.69087-2.7586-1.9213-3.6501-3.1772-0.99228-1.3985-1.7378-3.3014-2.0311-4.9904-0.33364-1.92-0.21829-4.2204 0.23071-6.1167 0.51227-2.1618 1.6138-4.5296 2.8762-6.3571 1.4314-2.0747 3.535-4.1505 5.5871-5.6136 2.3137-1.648 5.3114-3.0703 8.033-3.8824 3.0387-0.90794 6.7097-1.3576 9.8803-1.2757 3.5102 0.0868 7.5298 0.85335 10.85 1.9967 3.6487 1.2571 7.6157 3.3634 10.733 5.6374 3.403 2.4814 6.8762 5.9359 9.4195 9.2928 2.7585 3.6421 5.2967 8.305 6.9078 12.58 1.7391 4.6113 2.9488 10.207 3.3251 15.12 0.40311 5.2743-0.0248 11.403-1.0977 16.582-1.151 5.5358-3.3952 11.705-6.0243 16.71-2.7996 5.3284-6.8947 10.99-11.044 15.352-4.4027 4.6272-10.217 9.2227-15.71 12.479-5.8105 3.4453-13.046 6.4589-19.57 8.2046-6.8814 1.8421-15.085 2.8458-22.208 2.7666-7.494-0.0744-16.088-1.3814-23.285-3.4703-7.5522-2.1935-15.879-5.9201-22.569-10.051-7.0069-4.3275-14.368-10.414-19.969-16.452-5.8527-6.3096-11.576-14.487-15.54-22.128-4.136-7.9708-7.6261-17.78-9.5-26.562-1.9518-9.1463-2.7495-19.962-2.2093-29.297 0.56311-9.7088 2.7361-20.773 5.8448-29.986 3.2286-9.5687 8.4395-20.053 14.078-28.43 5.8474-8.6867 13.927-17.748 21.856-24.586 8.2138-7.0821 18.756-13.932 28.546-18.601 10.126-4.8319 22.512-8.7987 33.552-10.797 11.408-2.0639 24.834-2.6556 36.384-1.6506 11.923 1.0382 25.458 4.087 36.69 8.2179 11.584 4.2613 24.229 10.957 34.288 18.104 10.368 7.3672 21.132 17.439 29.204 27.264 8.313 10.115 16.291 23.023 21.664 34.963 5.5266 12.281 9.9714 27.244 12.091 40.543 2.179 13.671 2.5659 29.71 1.0927 43.474-1.512 14.136-5.4366 30.142-10.591 43.391-5.2914 13.6-13.473 28.404-22.133 40.149-8.8847 12.047-20.949 24.513-32.671 33.822-12.016 9.5423-27.291 18.649-41.38 24.724-14.435 6.2239-31.976 11.147-47.535 13.388-15.931 2.295-34.584 2.476-50.561 0.53458-16.351-1.9848-34.826-6.7838-50.094-12.964-15.616-6.3215-32.58-15.987-46.008-26.16-13.728-10.401-27.896-24.46-38.439-38.077-10.773-13.917-21.009-31.555-27.785-47.799-6.9211-16.587-12.322-36.707-14.683-54.525-2.2001-14.805-6.9646-31.487-12.954-45.204-5.8408-13.373-14.573-27.859-23.704-39.242-8.8966-11.09-20.796-22.49-32.282-30.868-11.184-8.1571-25.267-15.843-38.195-20.789-12.577-4.8147-27.759-8.4462-41.158-9.801-13.026-1.3166-28.194-0.86079-41.11 1.2795-12.546 2.0786-26.65 6.3651-38.212 11.659-11.222 5.1382-23.343 12.741-32.826 20.643-9.1934 7.6619-18.6 17.858-25.462 27.665-6.6459 9.5-12.846 21.424-16.763 32.336-3.79 10.559-6.5473 23.271-7.4269 34.454-0.84963 10.813-0.18976 23.368 1.8369 34.023 1.9566 10.287 5.765 21.814 10.364 31.222 4.435 9.0723 10.909 18.827 17.582 26.407 6.4257 7.2985 14.92 14.713 23.047 20.055 7.8149 5.1356 17.581 9.8513 26.475 12.736 8.5427 2.7679 18.784 4.6496 27.754 5.0524 8.5981 0.38699 18.542-0.48002 26.934-2.3941 8.029-1.8316 16.98-5.1633 24.231-9.0682 6.9236-3.7292 14.314-9.0762 19.989-14.521 5.4078-5.1872 10.83-11.981 14.647-18.43 3.6302-6.13 6.8629-13.737 8.7091-20.617 1.7496-6.5234 2.7573-14.296 2.6794-21.051-0.0745-6.3861-1.1461-13.719-2.9528-19.845-1.7021-5.7735-4.5573-12.152-7.7714-17.239-3.0202-4.7805-7.2421-9.8078-11.46-13.572-3.9472-3.5221-9.0433-6.9541-13.812-9.2425-4.4423-2.1314-9.8936-3.8813-14.756-4.6802-4.5084-0.74172-9.8158-0.87692-14.35-0.30759-4.1782 0.52466-8.9071 1.8039-12.757 3.5114-3.5284 1.5634-7.3369 3.9445-10.25 6.4761-2.6502 2.3043-5.3192 5.4037-7.1534 8.3986-1.656 2.7044-3.102 6.1103-3.8349 9.195-0.65861 2.7626-0.9253 6.0706-0.65366 8.8966 0.24063 2.509 0.98608 5.3679 2.0668 7.646 0.95259 2.0072 2.4523 4.1452 4.0686 5.6691 1.417 1.3365 3.3516 2.587 5.1805 3.2579 1.6097 0.59286 3.6302 0.89676 5.3377 0.73676 1.5331-0.1439 3.2895-0.72436 4.577-1.5715 1.2068-0.79382 2.381-2.0865 3.0373-3.3726 0.65491-1.2876 1.8301-2.5803 3.0372-3.3741 1.2861-0.84593 3.0426-1.4274 4.577-1.5714 1.7075-0.16001 3.7267 0.14759 5.3363 0.73676 1.829 0.67102 3.7649 1.9214 5.1819 3.2577 1.6164 1.524 3.1165 3.662 4.0686 5.6692 1.0803 2.2778 1.825 5.1369 2.0668 7.6459 0.2704 2.8272 2e-3 6.1352-0.65366 8.8966-0.73426 3.0861-2.1803 6.4904-3.8364 9.1949-1.8329 2.9952-4.503 6.0944-7.1533 8.3988-2.9131 2.5316-6.7216 4.9124-10.249 6.4759-3.8508 1.7075-8.5783 2.9871-12.758 3.5114-4.5322 0.56684-9.8407 0.43411-14.348-0.30635-4.8636-0.80003-10.313-2.55-14.758-4.6813-4.7698-2.2887-9.8646-5.7207-13.812-9.2425-4.219-3.7635-8.4396-8.7909-11.46-13.572-3.2155-5.0881-6.0705-11.466-7.7727-17.239-1.8064-6.1259-2.8788-13.459-2.9528-19.845-0.0745-6.7545 0.92904-14.527 2.6808-21.051 1.8461-6.88 5.0776-14.486 8.7077-20.617 3.8191-6.4483 9.2413-13.242 14.648-18.429 5.6744-5.4447 13.064-10.792 19.989-14.521 7.2498-3.905 16.201-7.2366 24.231-9.0683 8.3908-1.9134 18.335-2.7811 26.934-2.3941 8.9705 0.4031 19.21 2.2846 27.753 5.0536 8.8964 2.8828 18.661 7.5985 26.476 12.736 8.1267 5.3403 16.622 12.756 23.048 20.054 6.6727 7.5798 13.146 17.335 17.582 26.407 4.5981 9.4076 8.4066 20.934 10.364 31.222 2.0258 10.654 2.6873 23.21 1.8371 34.023-0.8794 11.185-3.6369 23.895-7.4268 34.454-3.9169 10.913-10.117 22.836-16.763 32.337-6.8604 9.8062-16.268 20.002-25.462 27.665-9.4814 7.9024-21.602 15.504-32.823 20.643-11.563 5.2943-25.668 9.5806-38.214 11.659-12.914 2.1406-28.084 2.5962-41.11 1.2795-13.398-1.355-28.58-4.9864-41.158-9.7998-12.927-4.9482-27.011-12.634-38.195-20.791-11.487-8.3775-23.385-19.778-32.282-30.868-9.132-11.382-17.862-25.869-23.703-39.242-5.9911-13.717-10.755-30.399-12.955-45.204-2.2562-15.177-2.5054-32.96-0.72188-48.198 1.8276-15.613 6.335-33.265 12.173-47.86 5.9781-14.944 15.148-31.188 24.817-44.054 9.8948-13.167 23.289-26.769 36.275-36.9 13.282-10.364 30.135-20.223 45.659-26.765 15.87-6.6887 35.129-11.93 52.195-14.252 17.438-2.3715 37.834-2.4152 55.286-0.16248 17.827 2.3003 37.951 7.6829 54.563 14.547 13.923 5.4961 30.751 9.7114 45.625 11.382 14.502 1.6283 31.412 1.31 45.837-0.9067 14.052-2.1603 29.875-6.7638 42.874-12.522 12.656-5.6071 26.355-13.962 37.102-22.683 10.457-8.4858 21.195-19.818 29.066-30.743 7.6526-10.623 14.843-23.987 19.447-36.243 4.4716-11.905 7.8124-26.262 9.009-38.923 1.1609-12.288 0.63878-26.585-1.4646-38.748-2.039-11.792-6.1657-25.037-11.229-35.882-4.9033-10.506-12.131-21.839-19.622-30.686-7.2498-8.5611-16.88-17.304-26.125-23.659-8.9375-6.1419-20.143-11.848-30.382-15.42-9.887-3.4493-21.774-5.9148-32.222-6.6358-10.075-0.69459-21.759 0.0373-31.658 2.0231-9.5342 1.9148-20.203 5.5636-28.892 9.9319-8.3552 4.1993-17.321 10.298-24.266 16.561-6.6689 6.0137-13.419 13.941-18.254 21.507-4.6325 7.2539-8.8543 16.298-11.392 24.523-2.4286 7.8692-4.0197 17.288-4.2628 25.52-0.23069 7.8598 0.70453 16.933 2.5817 24.57 1.7881 7.2776 4.9614 15.37 8.6351 21.902 3.4943 6.208 8.4648 12.81 13.501 17.85 4.7737 4.7778 11.002 9.537 16.89 12.846 5.5674 3.1284 12.455 5.8672 18.663 7.366 5.8513 1.4118 12.802 2.1288 18.816 1.8884 5.6494-0.22452 12.113-1.3667 17.483-3.1389 5.0234-1.6573 10.543-4.354 14.91-7.3396 4.0672-2.7824 8.3076-6.6292 11.432-10.44 2.8958-3.5324 5.6651-8.0619 7.4387-12.272 1.6361-3.881 2.892-8.6153 3.3396-12.804 0.41056-3.8376 0.25055-8.3262-0.48495-12.114-0.67104-3.448-2.0205-7.3093-3.6962-10.395-1.5146-2.7864-3.7411-5.7404-6.0454-7.918-2.0641-1.9506-4.7949-3.8376-7.3779-5.0156-2.2938-1.0468-5.1422-1.8304-7.6551-2.0323-2.2134-0.17984-4.8162 0.0496-6.9437 0.68838-1.8658 0.55939-3.9167 1.6097-5.4128 2.8578-1.3166 1.0989-2.5908 2.6952-3.3054 4.2547-0.64374 1.3998-1.0183 3.2116-0.92776 4.7488 0.0745 1.4422 0.6152 3.1059 1.4024 4.3169 0.78637 1.2118 1.3192 2.8749 1.4037 4.3182 0.0745 1.537-0.2865 3.3489-0.92778 4.7486-0.71442 1.5583-1.9901 3.1548-3.3068 4.2535-1.4946 1.2493-3.5454 2.2991-5.4115 2.8591-2.1273 0.63628-4.7302 0.867-6.9436 0.68839-2.5129-0.20343-5.3614-0.98607-7.6551-2.0337-2.5842-1.1783-5.3152-3.0635-7.3779-5.0141-2.3057-2.1775-4.5308-5.1329-6.0455-7.9181-1.6771-3.0861-3.0267-6.9486-3.6961-10.395-0.738-3.7888-0.89305-8.2773-0.48498-12.115 0.44653-4.1874 1.7035-8.9215 3.3384-12.803 1.7749-4.2101 4.5441-8.7407 7.4401-12.273 3.1244-3.8112 7.3646-7.6566 11.432-10.439 4.3656-2.9871 9.887-5.6837 14.91-7.341 5.3693-1.7708 11.833-2.913 17.483-3.1377 6.0152-0.24063 12.965 0.47505 18.816 1.8884 6.2079 1.499 13.096 4.2364 18.663 7.3661 5.8883 3.3092 12.115 8.0685 16.89 12.846 5.0353 5.0391 10.007 11.641 13.5 17.85 3.6751 6.5302 6.847 14.624 8.6364 21.899 1.8779 7.6367 2.8128 16.71 2.5803 24.571-0.24187 8.2324-1.8329 17.649-4.2613 25.519-2.5381 8.2243-6.7598 17.27-11.394 24.523-4.8334 7.568-11.584 15.496-18.253 21.509-6.9448 6.262-15.911 12.36-24.268 16.561-8.6878 4.3671-19.357 8.0172-28.891 9.932-9.9003 1.9886-21.586 2.7176-31.658 2.023-10.447-0.72188-22.335-3.1866-32.222-6.6358-10.241-3.5734-21.444-9.2781-30.383-15.421-9.2468-6.3531-18.874-15.096-26.127-23.659-7.4915-8.8477-14.718-20.179-19.622-30.685-5.0616-10.844-9.1883-24.09-11.227-35.883-2.1024-12.162-2.6253-26.46-1.4644-38.747 1.1969-12.66 4.536-27.018 9.0088-38.923 4.6048-12.256 11.794-25.62 19.447-36.243 7.8717-10.926 18.608-22.257 29.065-30.743 10.749-8.7223 24.446-17.076 37.102-22.683 12.999-5.7589 28.822-10.364 42.875-12.524 14.423-2.2172 31.333-2.5354 45.837-0.90668 14.874 1.6705 31.703 5.8857 45.625 11.383 14.271 5.6346 29.795 14.31 42.102 23.475 12.607 9.3891 25.642 22.119 35.361 34.473 9.9529 12.649 19.436 28.713 25.744 43.52 6.4562 15.152 11.538 33.552 13.82 49.864 2.3333 16.685 2.4456 36.209 0.34853 52.925-2.1434 17.088-7.234 36.388-13.757 52.327-6.6648 16.287-16.825 33.972-27.502 47.961-10.906 14.287-25.629 29.023-39.879 39.979-11.721 9.3085-23.787 21.774-32.671 33.822-8.6602 11.744-16.841 26.548-22.133 40.147-5.1554 13.251-9.0788 29.256-10.591 43.392-1.4724 13.764-1.0865 29.804 1.0927 43.474 2.1209 13.298 6.5657 28.262 12.092 40.543 5.372 11.938 13.351 24.848 21.663 34.963 8.0738 9.825 18.837 19.896 29.204 27.263 10.061 7.1496 22.706 13.845 34.289 18.106 11.233 4.1308 24.767 7.18 36.689 8.218 11.551 1.0047 24.977 0.41179 36.385-1.6508 11.04-1.9981 23.426-5.9663 33.552-10.797 9.7879-4.6695 20.332-11.519 28.545-18.601 7.9312-6.8377 16.01-15.899 21.857-24.586 5.6387-8.3775 10.85-18.862 14.078-28.43 3.1087-9.2135 5.2822-20.278 5.8435-29.986 0.54081-9.3363-0.25674-20.151-2.2078-29.297-1.874-8.7816-5.3642-18.59-9.5001-26.562-3.9656-7.6393-9.6876-15.818-15.541-22.128-5.6005-6.0376-12.962-12.125-19.968-16.452-6.6925-4.1307-15.017-7.8587-22.569-10.051-7.1971-2.0892-15.792-3.3885-23.285-3.4705-7.1231-0.0745-15.326 0.92406-22.207 2.7664-6.5263 1.7458-13.76 4.7594-19.57 8.2047-5.4936 3.2565-11.309 7.8518-15.71 12.479-4.1492 4.3617-8.2455 10.022-11.045 15.352-2.6291 5.0048-4.8728 11.174-6.023 16.71-1.0766 5.1792-1.5013 11.308-1.0964 16.582 0.37706 4.9138 1.5859 10.509 3.3237 15.12 1.6125 4.2745 4.1507 8.9374 6.9092 12.58 2.5434 3.3568 6.015 6.8113 9.4195 9.2928 3.1178 2.274 7.0846 4.3803 10.733 5.6374 3.3199 1.1436 7.3396 1.9056 10.85 1.9967 3.1707 0.0745 6.8418-0.36962 9.8804-1.2756 2.7216-0.81242 5.7193-2.2345 8.0316-3.8824 2.0535-1.4646 4.1558-3.5391 5.5885-5.6138 1.2624-1.8276 2.3639-4.1967 2.8762-6.3571 0.44901-1.8964 0.56434-4.1967 0.2307-6.1167-0.2952-1.689-1.0394-3.5919-2.031-4.9903-0.89181-1.2561-2.2739-2.4867-3.6501-3.1774-1.2914-0.64869-2.9962-1.0196-4.4397-0.94389z\" stroke-width=\".13206\" />\n</svg>\n`\n\nexport class LuteWallet extends BaseWallet {\n private client: LuteConnect | null = null\n private options: LuteConnectOptions\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options,\n metadata = {}\n }: WalletConstructor<WalletId.LUTE>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n if (!options?.siteName) {\n throw new Error('[LuteWallet] Missing required option: siteName')\n }\n this.options = options\n this.store = store\n }\n\n static defaultMetadata = {\n name: 'Lute',\n icon: `data:image/svg+xml;base64,${btoa(svgIcon.trim())}`\n }\n\n private async initializeClient(): Promise<LuteConnect> {\n console.info('[LuteWallet] Initializing client...')\n const module = await import('lute-connect')\n const LuteConnect = module.default\n\n const client = new LuteConnect(this.options.siteName as string)\n this.client = client\n return client\n }\n\n private async getGenesisId(): Promise<string> {\n const algodClient = this.getAlgodClient()\n const genesis = await algodClient.genesis().do()\n const genesisId = `${genesis.network}-${genesis.id}`\n\n return genesisId\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[LuteWallet] Connecting...')\n try {\n const client = this.client || (await this.initializeClient())\n const genesisId = await this.getGenesisId()\n const accounts = await client.connect(genesisId)\n\n if (accounts.length === 0) {\n throw new Error('No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `Lute Wallet ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]!\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount\n }\n })\n\n return walletAccounts\n } catch (error: any) {\n console.error(`[LuteWallet] Error connecting: ${error.message}`)\n return []\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[LuteWallet] Disconnecting...')\n this.onDisconnect()\n }\n\n public async resumeSession(): Promise<void> {\n try {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n // No session to resume\n if (!walletState) {\n return\n }\n\n console.info('[LuteWallet] Resuming session...')\n await this.initializeClient()\n } catch (error: any) {\n console.error(`[LuteWallet] Error resuming session: ${error.message}`)\n this.onDisconnect()\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n try {\n if (!this.client) {\n throw new Error('[LuteWallet] Client not initialized!')\n }\n const txnsToSign: WalletTransaction[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Marshal transactions into `WalletTransaction[]`\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (shouldSign) {\n txnsToSign.push({ txn: txnBase64 })\n signedIndexes.push(idx)\n } else {\n txnsToSign.push({ txn: txnBase64, signers: [] })\n }\n })\n\n // Sign transactions\n const signTxnsResult = (await this.client.signTxns(txnsToSign)) as (Uint8Array | null)[]\n\n // Filter out null results\n const signedTxns = signTxnsResult.filter(Boolean) as Uint8Array[]\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n } catch (error: any) {\n console.error(\n `[LuteWallet] Error signing transactions: ` +\n (isSignTxnsError(error) ? `${error.message} (code: ${error.code})` : error.message)\n )\n throw error\n }\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n try {\n if (!this.client) {\n throw new Error('[LuteWallet] Client not initialized!')\n }\n\n const txnsToSign = txnGroup.reduce<WalletTransaction[]>((acc, txn, idx) => {\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (indexesToSign.includes(idx)) {\n acc.push({ txn: txnBase64 })\n } else {\n acc.push({ txn: txnBase64, signers: [] })\n }\n return acc\n }, [])\n\n const signTxnsResult = (await this.client.signTxns(txnsToSign)) as (Uint8Array | null)[]\n const signedTxns = signTxnsResult.filter(Boolean) as Uint8Array[]\n return signedTxns\n } catch (error: any) {\n console.error(\n `[LuteWallet] Error signing transactions: ` +\n (isSignTxnsError(error) ? `${error.message} (code: ${error.code})` : error.message)\n )\n throw error\n }\n }\n}\n","import algosdk from 'algosdk'\nimport { addWallet, type State } from 'src/store'\nimport { isSignedTxnObject, normalizeTxnGroup } from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { Store } from '@tanstack/store'\nimport type { WalletAccount, WalletConstructor, WalletId } from './types'\n\nexport type MnemonicOptions = {\n persistToStorage?: boolean\n}\n\nconst icon = `data:image/svg+xml,%3c%3fxml version='1.0' encoding='UTF-8'%3f%3e %3c!-- Generated by Pixelmator Pro 3.2.2 --%3e %3csvg width='409' height='210' viewBox='0 0 409 210' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3ctext id='MNEMONIC' xml:space='preserve' x='0' y='129' font-family='Helvetica' font-size='72' fill='black'%3eMNEMONIC%3c/text%3e%3c/svg%3e`\n\nexport class MnemonicWallet extends BaseWallet {\n private account: algosdk.Account | null = null\n private options: MnemonicOptions\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options,\n metadata = {}\n }: WalletConstructor<WalletId.MNEMONIC>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n\n const { persistToStorage = false } = options || {}\n this.options = { persistToStorage }\n\n this.store = store\n }\n\n static defaultMetadata = { name: 'Mnemonic', icon }\n\n // @todo: Show explicit security warning if persistToStorage is true\n // @todo: Save/load mnemonic from storage if persistToStorage is true\n // @todo: Throw error with link to docs if using mainnet\n private initializeAccount(): algosdk.Account {\n const mnemonic = prompt('Enter 25-word mnemonic passphrase:')\n if (!mnemonic) {\n this.account = null\n throw new Error('No mnemonic provided')\n }\n const account = algosdk.mnemonicToSecretKey(mnemonic)\n this.account = account\n return account\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[MnemonicWallet] Connecting...')\n try {\n const account = this.initializeAccount()\n\n const walletAccount = {\n name: 'Mnemonic Account',\n address: account.addr\n }\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: [walletAccount],\n activeAccount: walletAccount\n }\n })\n\n return [walletAccount]\n } catch (error) {\n console.error('[MnemonicWallet] Error connecting:', error)\n throw error\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[MnemonicWallet] Disconnecting...')\n try {\n this.account = null\n this.onDisconnect()\n } catch (error: any) {\n console.error(error)\n }\n }\n\n public async resumeSession(): Promise<void> {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n // Don't resume session, disconnect instead\n if (walletState) {\n try {\n this.account = null\n this.onDisconnect()\n } catch (error: any) {\n console.error(error)\n }\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n if (!this.account) {\n throw new Error('[MnemonicWallet] Client not initialized!')\n }\n const txnGroupSigned: Uint8Array[] = []\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Sign transactions and merge back into original group\n decodedObjects.forEach((txnObject, idx) => {\n const isIndexMatch = !indexesToSign || indexesToSign.includes(idx)\n const isSigned = isSignedTxnObject(txnObject)\n const canSign = !isSigned && algosdk.encodeAddress(txnObject.snd) === this.account!.addr\n const shouldSign = isIndexMatch && canSign\n\n if (shouldSign) {\n const txn = algosdk.Transaction.from_obj_for_encoding(txnObject)\n const signedTxn = txn.signTxn(this.account!.sk)\n txnGroupSigned.push(signedTxn)\n } else if (returnGroup) {\n txnGroupSigned.push(msgpackTxnGroup[idx]!)\n }\n })\n\n return Promise.resolve(txnGroupSigned)\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.account) {\n throw new Error('[MnemonicWallet] Account not initialized!')\n }\n\n const signedTxns: Uint8Array[] = []\n\n for (const index of indexesToSign) {\n const txnToSign = txnGroup[index]\n if (txnToSign) {\n signedTxns.push(txnToSign.signTxn(this.account.sk))\n }\n }\n\n return Promise.resolve(signedTxns)\n }\n}\n","import algosdk from 'algosdk'\nimport { addWallet, setAccounts, type State } from 'src/store'\nimport {\n compareAccounts,\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { PeraWalletConnect } from '@perawallet/connect'\nimport type { Store } from '@tanstack/store'\nimport type { SignerTransaction, WalletAccount, WalletConstructor, WalletId } from './types'\n\nconst icon =\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4='\n\nexport interface PeraWalletConnectOptions {\n bridge?: string\n shouldShowSignTxnToast?: boolean\n chainId?: 416001 | 416002 | 416003 | 4160\n compactMode?: boolean\n}\n\nexport class PeraWallet extends BaseWallet {\n private client: PeraWalletConnect | null = null\n private options: PeraWalletConnectOptions\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options = {},\n metadata = {}\n }: WalletConstructor<WalletId.PERA>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n this.options = options\n this.store = store\n }\n\n static defaultMetadata = { name: 'Pera', icon }\n\n private async initializeClient(): Promise<PeraWalletConnect> {\n console.info('[PeraWallet] Initializing client...')\n const module = await import('@perawallet/connect')\n const PeraWalletConnect = module.default\n ? module.default.PeraWalletConnect\n : module.PeraWalletConnect\n\n const client = new PeraWalletConnect(this.options)\n client.connector?.on('disconnect', this.onDisconnect)\n this.client = client\n return client\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[PeraWallet] Connecting...')\n try {\n const client = this.client || (await this.initializeClient())\n const accounts = await client.connect()\n\n if (accounts.length === 0) {\n throw new Error('No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `Pera Wallet ${idx + 1}`,\n address\n }))\n\n const activeAccount = walletAccounts[0]!\n\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount\n }\n })\n\n return walletAccounts\n } catch (error: any) {\n if (error?.data?.type !== 'CONNECT_MODAL_CLOSED') {\n console.error(`[PeraWallet] Error connecting: ${error.message}`)\n } else {\n console.info('[PeraWallet] Connection cancelled.')\n }\n return []\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[PeraWallet] Disconnecting...')\n try {\n await this.client?.disconnect()\n this.onDisconnect()\n } catch (error: any) {\n console.error(error)\n }\n }\n\n public async resumeSession(): Promise<void> {\n try {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n // No session to resume\n if (!walletState) {\n return\n }\n\n console.info('[PeraWallet] Resuming session...')\n\n const client = this.client || (await this.initializeClient())\n const accounts = await client.reconnectSession()\n\n if (accounts.length === 0) {\n throw new Error('[PeraWallet] No accounts found!')\n }\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `Pera Wallet ${idx + 1}`,\n address\n }))\n\n const match = compareAccounts(walletAccounts, walletState.accounts)\n\n if (!match) {\n console.warn(`[PeraWallet] Session accounts mismatch, updating accounts`)\n setAccounts(this.store, {\n walletId: this.id,\n accounts: walletAccounts\n })\n }\n } catch (error: any) {\n console.error(`[PeraWallet] Error resuming session: ${error.message}`)\n this.onDisconnect()\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[PeraWallet] Client not initialized!')\n }\n const txnsToSign: SignerTransaction[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Marshal transactions into `SignerTransaction[]`\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n if (shouldSign) {\n txnsToSign.push({ txn })\n signedIndexes.push(idx)\n } else {\n txnsToSign.push({ txn, signers: [] })\n }\n })\n\n // Sign transactions\n const signedTxns = await this.client.signTransaction([txnsToSign])\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[PeraWallet] Client not initialized!')\n }\n\n const txnsToSign = txnGroup.reduce<SignerTransaction[]>((acc, txn, idx) => {\n if (indexesToSign.includes(idx)) {\n acc.push({ txn })\n } else {\n acc.push({ txn, signers: [] })\n }\n return acc\n }, [])\n\n const signTxnsResult = await this.client.signTransaction([txnsToSign])\n return signTxnsResult\n }\n}\n","import { getAppMetadata, getSdkError } from '@walletconnect/utils'\nimport algosdk from 'algosdk'\nimport { NetworkId, caipChainId } from 'src/network'\nimport { addWallet, setAccounts, type State } from 'src/store'\nimport {\n compareAccounts,\n formatJsonRpcRequest,\n isSignedTxnObject,\n mergeSignedTxnsWithGroup,\n normalizeTxnGroup,\n shouldSignTxnObject\n} from 'src/utils'\nimport { BaseWallet } from './base'\nimport type { Store } from '@tanstack/store'\nimport type { WalletConnectModal, WalletConnectModalConfig } from '@walletconnect/modal'\nimport type SignClient from '@walletconnect/sign-client'\nimport type { SessionTypes, SignClientTypes } from '@walletconnect/types'\nimport type { WalletAccount, WalletConstructor, WalletId, WalletTransaction } from './types'\n\ninterface SignClientOptions {\n projectId: string\n relayUrl?: string\n metadata?: SignClientTypes.Metadata\n}\n\ntype WalletConnectModalOptions = Pick<\n WalletConnectModalConfig,\n | 'enableExplorer'\n | 'explorerRecommendedWalletIds'\n | 'privacyPolicyUrl'\n | 'termsOfServiceUrl'\n | 'themeMode'\n | 'themeVariables'\n>\n\nexport type WalletConnectOptions = SignClientOptions & WalletConnectModalOptions\n\nconst icon =\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg=='\n\nexport class WalletConnect extends BaseWallet {\n private client: SignClient | null = null\n private options: SignClientOptions\n private modal: WalletConnectModal | null = null\n private modalOptions: WalletConnectModalOptions\n private session: SessionTypes.Struct | null = null\n private chains: string[]\n\n protected store: Store<State>\n\n constructor({\n id,\n store,\n subscribe,\n getAlgodClient,\n options,\n metadata = {}\n }: WalletConstructor<WalletId.WALLETCONNECT>) {\n super({ id, metadata, getAlgodClient, store, subscribe })\n if (!options?.projectId) {\n throw new Error('[WalletConnect] Missing required option: projectId')\n }\n const {\n projectId,\n relayUrl = 'wss://relay.walletconnect.com',\n metadata: _metadata = getAppMetadata(),\n ...modalOptions\n } = options\n\n this.options = {\n projectId,\n relayUrl,\n ..._metadata\n }\n\n this.modalOptions = modalOptions\n this.chains = Object.values(caipChainId)\n this.store = store\n }\n\n static defaultMetadata = { name: 'WalletConnect', icon }\n\n private async initializeClient(): Promise<SignClient> {\n console.info('[WalletConnect] Initializing client...')\n const SignClient = (await import('@walletconnect/sign-client')).SignClient\n const client = await SignClient.init(this.options)\n\n client.on('session_event', (args) => {\n console.log('[WalletConnect] EVENT', 'session_event', args)\n })\n\n client.on('session_update', ({ topic, params }) => {\n console.log('[WalletConnect] EVENT', 'session_update', { topic, params })\n const { namespaces } = params\n const session = client.session.get(topic)\n const updatedSession = { ...session, namespaces }\n this.onSessionConnected(updatedSession)\n })\n\n client.on('session_delete', () => {\n console.log('[WalletConnect] EVENT', 'session_delete')\n this.session = null\n })\n\n this.client = client\n return client\n }\n\n private async initializeModal(): Promise<WalletConnectModal> {\n console.info('[WalletConnect] Initializing modal...')\n const WalletConnectModal = (await import('@walletconnect/modal')).WalletConnectModal\n const modal = new WalletConnectModal({\n projectId: this.options.projectId,\n chains: this.chains,\n ...this.modalOptions\n })\n\n modal.subscribeModal((state) =>\n console.info(`[WalletConnect] Modal ${state.open ? 'open' : 'closed'}`)\n )\n\n this.modal = modal\n return modal\n }\n\n private onSessionConnected(session: SessionTypes.Struct): WalletAccount[] {\n const caipAccounts = session.namespaces.algorand!.accounts\n\n if (!caipAccounts.length) {\n throw new Error('No accounts found!')\n }\n\n // @todo: Validate format of CAIP-10 accounts\n\n // Filter duplicate accounts (same address, different chain)\n const accounts = [...new Set(caipAccounts.map((account) => account.split(':').pop()!))]\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `WalletConnect ${idx + 1}`,\n address\n }))\n\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n if (!walletState) {\n addWallet(this.store, {\n walletId: this.id,\n wallet: {\n accounts: walletAccounts,\n activeAccount: walletAccounts[0]!\n }\n })\n } else {\n const match = compareAccounts(walletAccounts, walletState.accounts)\n\n if (!match) {\n console.warn(`[WalletConnect] Session accounts mismatch, updating accounts`)\n setAccounts(this.store, {\n walletId: this.id,\n accounts: walletAccounts\n })\n }\n }\n\n this.session = session\n return walletAccounts\n }\n\n public async connect(): Promise<WalletAccount[]> {\n console.info('[WalletConnect] Connecting...')\n try {\n const client = this.client || (await this.initializeClient())\n const modal = this.modal || (await this.initializeModal())\n\n const requiredNamespaces = {\n algorand: {\n chains: this.chains,\n methods: ['algo_signTxn'],\n events: []\n }\n }\n\n const { uri, approval } = await client.connect({ requiredNamespaces })\n\n if (!uri) {\n throw new Error('No URI found')\n }\n\n await modal.openModal({ uri })\n\n const session = await approval()\n const walletAccounts = this.onSessionConnected(session)\n\n return walletAccounts\n } catch (error: any) {\n console.error(`[WalletConnect] Error connecting: ${error.message}`)\n return []\n } finally {\n this.modal?.closeModal()\n }\n }\n\n public async disconnect(): Promise<void> {\n console.info('[WalletConnect] Disconnecting...')\n try {\n if (this.client && this.session) {\n await this.client.disconnect({\n topic: this.session.topic,\n reason: getSdkError('USER_DISCONNECTED')\n })\n }\n this.onDisconnect()\n } catch (error: any) {\n console.error(error)\n }\n }\n\n public async resumeSession(): Promise<void> {\n try {\n const state = this.store.state\n const walletState = state.wallets[this.id]\n\n // No session to resume\n if (!walletState) {\n return\n }\n\n console.info('[WalletConnect] Resuming session...')\n\n const client = this.client || (await this.initializeClient())\n\n if (client.session.length) {\n const lastKeyIndex = client.session.keys.length - 1\n const restoredSession = client.session.get(client.session.keys[lastKeyIndex]!)\n this.onSessionConnected(restoredSession)\n }\n } catch (error: any) {\n console.error(`[WalletConnect] Error resuming session: ${error.message}`)\n this.onDisconnect()\n }\n }\n\n public signTransactions = async (\n txnGroup: algosdk.Transaction[] | algosdk.Transaction[][] | Uint8Array[] | Uint8Array[][],\n indexesToSign?: number[],\n returnGroup = true\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[WalletConnect] Client not initialized!')\n }\n if (!this.session) {\n throw new Error('[WalletConnect] Session is not connected')\n }\n if (this.activeNetwork === NetworkId.LOCALNET) {\n throw new Error(`[WalletConnect] Invalid network: ${this.activeNetwork}`)\n }\n\n const txnsToSign: WalletTransaction[] = []\n const signedIndexes: number[] = []\n\n const msgpackTxnGroup: Uint8Array[] = normalizeTxnGroup(txnGroup)\n\n // Decode transactions to access properties\n const decodedObjects = msgpackTxnGroup.map((txn) => {\n return algosdk.decodeObj(txn)\n }) as Array<algosdk.EncodedTransaction | algosdk.EncodedSignedTransaction>\n\n // Marshal transactions into `WalletTransaction[]`\n decodedObjects.forEach((txnObject, idx) => {\n const isSigned = isSignedTxnObject(txnObject)\n const shouldSign = shouldSignTxnObject(txnObject, this.addresses, indexesToSign, idx)\n\n const txnBuffer: Uint8Array = msgpackTxnGroup[idx]!\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (shouldSign) {\n txnsToSign.push({ txn: txnBase64 })\n signedIndexes.push(idx)\n } else {\n txnsToSign.push({ txn: txnBase64, signers: [] })\n }\n })\n\n // Format JSON-RPC request\n const request = formatJsonRpcRequest('algo_signTxn', [txnsToSign])\n\n // Sign transactions\n const signTxnsResult = await this.client.request<Array<string | null>>({\n chainId: caipChainId[this.activeNetwork]!,\n topic: this.session.topic,\n request\n })\n\n // Filter out null results\n const signedTxnsBase64 = signTxnsResult.filter(Boolean) as string[]\n\n // Convert base64 signed transactions to msgpack\n const signedTxns = signedTxnsBase64.map((txn) => new Uint8Array(Buffer.from(txn, 'base64')))\n\n // Merge signed transactions back into original group\n const txnGroupSigned = mergeSignedTxnsWithGroup(\n signedTxns,\n msgpackTxnGroup,\n signedIndexes,\n returnGroup\n )\n\n return txnGroupSigned\n }\n\n public transactionSigner = async (\n txnGroup: algosdk.Transaction[],\n indexesToSign: number[]\n ): Promise<Uint8Array[]> => {\n if (!this.client) {\n throw new Error('[WalletConnect] Client not initialized!')\n }\n if (!this.session) {\n throw new Error('[WalletConnect] Session is not connected')\n }\n if (this.activeNetwork === NetworkId.LOCALNET) {\n throw new Error(`[WalletConnect] Invalid network: ${this.activeNetwork}`)\n }\n\n const txnsToSign = txnGroup.reduce<WalletTransaction[]>((acc, txn, idx) => {\n const txnBase64 = Buffer.from(txn.toByte()).toString('base64')\n\n if (indexesToSign.includes(idx)) {\n acc.push({ txn: txnBase64 })\n } else {\n acc.push({ txn: txnBase64, signers: [] })\n }\n return acc\n }, [])\n\n // Format JSON-RPC request\n const request = formatJsonRpcRequest('algo_signTxn', [txnsToSign])\n\n // Sign transactions\n const signTxnsResult = await this.client.request<Array<string | null>>({\n chainId: caipChainId[this.activeNetwork]!,\n topic: this.session.topic,\n request\n })\n\n // Filter out null results\n const signedTxnsBase64 = signTxnsResult.filter(Boolean) as string[]\n\n // Convert base64 signed transactions to msgpack\n const signedTxns = signedTxnsBase64.map((txn) => new Uint8Array(Buffer.from(txn, 'base64')))\n\n return signedTxns\n }\n}\n","import { NetworkId, isValidNetworkId } from 'src/network'\nimport { WalletId, type WalletAccount } from 'src/wallets'\nimport type { Store } from '@tanstack/store'\n\nexport type WalletState = {\n accounts: WalletAccount[]\n activeAccount: WalletAccount | null\n}\n\nexport type WalletStateMap = Partial<Record<WalletId, WalletState>>\n\nexport interface State {\n wallets: WalletStateMap\n activeWallet: WalletId | null\n activeNetwork: NetworkId\n}\n\nexport const defaultState: State = {\n wallets: {},\n activeWallet: null,\n activeNetwork: NetworkId.TESTNET\n}\n\nexport const LOCAL_STORAGE_KEY = '@txnlab/use-wallet:v3'\n\n// State mutations\n\nexport function addWallet(\n store: Store<State>,\n { walletId, wallet }: { walletId: WalletId; wallet: WalletState }\n) {\n store.setState((state) => {\n const newWallets = {\n ...state.wallets,\n [walletId]: wallet\n }\n\n return {\n ...state,\n wallets: newWallets,\n activeWallet: walletId\n }\n })\n}\n\nexport function removeWallet(store: Store<State>, { walletId }: { walletId: WalletId }) {\n store.setState((state) => {\n const newWallets = { ...state.wallets }\n delete newWallets[walletId]\n\n return {\n ...state,\n wallets: newWallets,\n activeWallet: state.activeWallet === walletId ? null : state.activeWallet\n }\n })\n}\n\nexport function setActiveWallet(store: Store<State>, { walletId }: { walletId: WalletId | null }) {\n store.setState((state) => {\n return {\n ...state,\n activeWallet: walletId\n }\n })\n}\n\nexport function setActiveAccount(\n store: Store<State>,\n { walletId, address }: { walletId: WalletId; address: string }\n) {\n store.setState((state) => {\n const wallet = state.wallets[walletId]\n if (!wallet) {\n return state\n }\n const activeAccount = wallet.accounts.find((a) => a.address === address)\n if (!activeAccount) {\n return state\n }\n\n const newWallets = {\n ...state.wallets,\n [walletId]: {\n ...wallet,\n activeAccount\n }\n }\n\n return {\n ...state,\n wallets: newWallets\n }\n })\n}\n\nexport function setAccounts(\n store: Store<State>,\n { walletId, accounts }: { walletId: WalletId; accounts: WalletAccount[] }\n) {\n store.setState((state) => {\n const wallet = state.wallets[walletId]\n if (!wallet) {\n return state\n }\n\n // Check if `accounts` includes `wallet.activeAccount`\n const isActiveAccountConnected = accounts.some(\n (account) => account.address === wallet.activeAccount?.address\n )\n\n const activeAccount = isActiveAccountConnected ? wallet.activeAccount! : accounts[0] || null\n\n const newWallet = {\n ...wallet,\n accounts,\n activeAccount\n }\n\n // Create a new map with the updated wallet\n const newWallets = {\n ...state.wallets,\n [walletId]: newWallet\n }\n\n return {\n ...state,\n wallets: newWallets\n }\n })\n}\n\nexport function setActiveNetwork(store: Store<State>, { networkId }: { networkId: NetworkId }) {\n store.setState((state) => {\n return {\n ...state,\n activeNetwork: networkId\n }\n })\n}\n\n// Type guards\n\nexport function isValidWalletId(walletId: any): walletId is WalletId {\n return Object.values(WalletId).includes(walletId)\n}\n\nexport function isValidWalletAccount(account: any): account is WalletAccount {\n return (\n typeof account === 'object' &&\n account !== null &&\n typeof account.name === 'string' &&\n typeof account.address === 'string'\n )\n}\n\nexport function isValidWalletState(wallet: any): wallet is WalletState {\n return (\n typeof wallet === 'object' &&\n wallet !== null &&\n Array.isArray(wallet.accounts) &&\n wallet.accounts.every(isValidWalletAccount) &&\n (wallet.activeAccount === null || isValidWalletAccount(wallet.activeAccount))\n )\n}\n\nexport function isValidState(state: any): state is State {\n if (!state || typeof state !== 'object') return false\n if (typeof state.wallets !== 'object') return false\n for (const [walletId, wallet] of Object.entries(state.wallets)) {\n if (!isValidWalletId(walletId) || !isValidWalletState(wallet)) return false\n }\n if (state.activeWallet !== null && !isValidWalletId(state.activeWallet)) return false\n if (!isValidNetworkId(state.activeNetwork)) return false\n\n return true\n}\n"],"mappings":"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","names":["import_store","import_algosdk","NetworkId","import_algosdk","import_algosdk","WalletId","algosdk","import_algosdk","icon","algosdk","import_algosdk","icon","algosdk","wallet","import_algosdk","module","algosdk","import_algosdk","icon","algosdk","import_algosdk","icon","module","algosdk","import_utils","import_algosdk","icon","algosdk","algosdk","icon","module","algosdk","algosdk"]}