@hub3js/core 0.59.0 → 0.59.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/builders/action.d.ts +22 -0
  2. package/dist/builders/action.d.ts.map +1 -0
  3. package/dist/builders/mod.d.ts +5 -0
  4. package/dist/builders/mod.d.ts.map +1 -0
  5. package/dist/builders/namespace.d.ts +47 -0
  6. package/dist/builders/namespace.d.ts.map +1 -0
  7. package/dist/builders/provider.d.ts +37 -0
  8. package/dist/builders/provider.d.ts.map +1 -0
  9. package/dist/builders/types.d.ts +23 -0
  10. package/dist/builders/types.d.ts.map +1 -0
  11. package/dist/hub/helpers.d.ts +6 -0
  12. package/dist/hub/helpers.d.ts.map +1 -0
  13. package/dist/hub/hub.d.ts +44 -0
  14. package/dist/hub/hub.d.ts.map +1 -0
  15. package/dist/hub/mod.d.ts +9 -0
  16. package/dist/hub/mod.d.ts.map +1 -0
  17. package/dist/hub/namespaces/errors.d.ts +5 -0
  18. package/dist/hub/namespaces/errors.d.ts.map +1 -0
  19. package/dist/hub/namespaces/mod.d.ts +3 -0
  20. package/dist/hub/namespaces/mod.d.ts.map +1 -0
  21. package/dist/hub/namespaces/namespace.d.ts +148 -0
  22. package/dist/hub/namespaces/namespace.d.ts.map +1 -0
  23. package/dist/hub/namespaces/types.d.ts +36 -0
  24. package/dist/hub/namespaces/types.d.ts.map +1 -0
  25. package/dist/hub/provider/mod.d.ts +3 -0
  26. package/dist/hub/provider/mod.d.ts.map +1 -0
  27. package/dist/hub/provider/provider.d.ts +102 -0
  28. package/dist/hub/provider/provider.d.ts.map +1 -0
  29. package/dist/hub/provider/types.d.ts +28 -0
  30. package/dist/hub/provider/types.d.ts.map +1 -0
  31. package/dist/hub/store/events.d.ts +54 -0
  32. package/dist/hub/store/events.d.ts.map +1 -0
  33. package/dist/hub/store/extend.d.ts +14 -0
  34. package/dist/hub/store/extend.d.ts.map +1 -0
  35. package/dist/hub/store/hub.d.ts +11 -0
  36. package/dist/hub/store/hub.d.ts.map +1 -0
  37. package/dist/hub/store/mod.d.ts +8 -0
  38. package/dist/hub/store/mod.d.ts.map +1 -0
  39. package/dist/hub/store/mod.js +1 -1
  40. package/dist/hub/store/mod.js.map +2 -2
  41. package/dist/hub/store/namespaces.d.ts +38 -0
  42. package/dist/hub/store/namespaces.d.ts.map +1 -0
  43. package/dist/hub/store/providers.d.ts +84 -0
  44. package/dist/hub/store/providers.d.ts.map +1 -0
  45. package/dist/hub/store/selectors.d.ts +18 -0
  46. package/dist/hub/store/selectors.d.ts.map +1 -0
  47. package/dist/hub/store/store.d.ts +14 -0
  48. package/dist/hub/store/store.d.ts.map +1 -0
  49. package/dist/hub/types.d.ts +5 -0
  50. package/dist/hub/types.d.ts.map +1 -0
  51. package/dist/mod.d.ts +5 -0
  52. package/dist/mod.d.ts.map +1 -0
  53. package/dist/mod.js +1 -1
  54. package/dist/mod.js.map +4 -4
  55. package/dist/test-utils/fixtures.d.ts +4 -0
  56. package/dist/test-utils/fixtures.d.ts.map +1 -0
  57. package/dist/test-utils/mod.d.ts +2 -0
  58. package/dist/test-utils/mod.d.ts.map +1 -0
  59. package/dist/test-utils/mod.js +2 -0
  60. package/dist/test-utils/mod.js.map +7 -0
  61. package/dist/utils/mod.d.ts +3 -0
  62. package/dist/utils/mod.d.ts.map +1 -0
  63. package/dist/utils/mod.js +1 -1
  64. package/dist/utils/mod.js.map +4 -4
  65. package/dist/utils/versions.d.ts +50 -0
  66. package/dist/utils/versions.d.ts.map +1 -0
  67. package/package.json +9 -60
  68. package/src/builders/action.test.ts +225 -0
  69. package/src/builders/action.ts +1 -1
  70. package/src/builders/namespace.ts +1 -1
  71. package/src/builders/provider.ts +59 -19
  72. package/src/builders/types.ts +6 -4
  73. package/src/hub/hub.test.ts +108 -0
  74. package/src/hub/hub.ts +26 -9
  75. package/src/hub/mod.ts +2 -1
  76. package/src/hub/namespaces/namespace.ts +2 -2
  77. package/src/hub/namespaces/types.ts +1 -1
  78. package/src/hub/provider/mod.ts +1 -2
  79. package/src/hub/provider/provider.test.ts +64 -19
  80. package/src/hub/provider/provider.ts +43 -92
  81. package/src/hub/provider/types.ts +14 -31
  82. package/src/hub/store/mod.ts +1 -0
  83. package/src/hub/store/providers.ts +32 -18
  84. package/src/mod.ts +2 -21
  85. package/src/test-utils/mod.ts +1 -0
  86. package/src/utils/mod.ts +2 -8
  87. package/src/utils/versions.test.ts +0 -1
  88. package/src/utils/versions.ts +71 -44
  89. package/dist/legacy/mod.js +0 -2
  90. package/dist/legacy/mod.js.map +0 -7
  91. package/dist/namespaces/common/mod.js +0 -2
  92. package/dist/namespaces/common/mod.js.map +0 -7
  93. package/dist/namespaces/cosmos/mod.js +0 -2
  94. package/dist/namespaces/cosmos/mod.js.map +0 -7
  95. package/dist/namespaces/evm/mod.js +0 -2
  96. package/dist/namespaces/evm/mod.js.map +0 -7
  97. package/dist/namespaces/solana/mod.js +0 -2
  98. package/dist/namespaces/solana/mod.js.map +0 -7
  99. package/dist/namespaces/starknet/mod.js +0 -2
  100. package/dist/namespaces/starknet/mod.js.map +0 -7
  101. package/dist/namespaces/sui/mod.js +0 -2
  102. package/dist/namespaces/sui/mod.js.map +0 -7
  103. package/dist/namespaces/tron/mod.js +0 -2
  104. package/dist/namespaces/tron/mod.js.map +0 -7
  105. package/dist/namespaces/utxo/mod.js +0 -2
  106. package/dist/namespaces/utxo/mod.js.map +0 -7
  107. package/dist/namespaces/xrpl/mod.js +0 -2
  108. package/dist/namespaces/xrpl/mod.js.map +0 -7
  109. package/legacy/package.json +0 -8
  110. package/namespaces/common/package.json +0 -8
  111. package/namespaces/cosmos/package.json +0 -8
  112. package/namespaces/evm/package.json +0 -8
  113. package/namespaces/solana/package.json +0 -8
  114. package/namespaces/starknet/package.json +0 -8
  115. package/namespaces/sui/package.json +0 -8
  116. package/namespaces/tron/package.json +0 -8
  117. package/namespaces/utxo/package.json +0 -8
  118. package/namespaces/xrpl/package.json +0 -8
  119. package/src/legacy/helpers.ts +0 -75
  120. package/src/legacy/mod.ts +0 -44
  121. package/src/legacy/persistor.ts +0 -19
  122. package/src/legacy/types.ts +0 -303
  123. package/src/legacy/utils.ts +0 -20
  124. package/src/legacy/wallet.ts +0 -552
  125. package/src/namespaces/common/actions.ts +0 -12
  126. package/src/namespaces/common/after.ts +0 -8
  127. package/src/namespaces/common/and.ts +0 -42
  128. package/src/namespaces/common/before.ts +0 -9
  129. package/src/namespaces/common/builders.ts +0 -14
  130. package/src/namespaces/common/helpers.ts +0 -10
  131. package/src/namespaces/common/hooks/changeAccountSubscriber.test.ts +0 -173
  132. package/src/namespaces/common/hooks/changeAccountSubscriber.ts +0 -236
  133. package/src/namespaces/common/mod.ts +0 -23
  134. package/src/namespaces/common/or.ts +0 -17
  135. package/src/namespaces/common/types.ts +0 -27
  136. package/src/namespaces/common/utils.ts +0 -43
  137. package/src/namespaces/cosmos/actions.ts +0 -3
  138. package/src/namespaces/cosmos/after.ts +0 -3
  139. package/src/namespaces/cosmos/and.ts +0 -5
  140. package/src/namespaces/cosmos/before.ts +0 -3
  141. package/src/namespaces/cosmos/builders.ts +0 -15
  142. package/src/namespaces/cosmos/constants.ts +0 -1
  143. package/src/namespaces/cosmos/mod.ts +0 -15
  144. package/src/namespaces/cosmos/types.ts +0 -31
  145. package/src/namespaces/cosmos/utils.ts +0 -21
  146. package/src/namespaces/evm/actions.ts +0 -134
  147. package/src/namespaces/evm/after.ts +0 -3
  148. package/src/namespaces/evm/and.ts +0 -5
  149. package/src/namespaces/evm/before.ts +0 -3
  150. package/src/namespaces/evm/builders.ts +0 -52
  151. package/src/namespaces/evm/constants.ts +0 -2
  152. package/src/namespaces/evm/eip1193.ts +0 -1415
  153. package/src/namespaces/evm/hooks.ts +0 -43
  154. package/src/namespaces/evm/mod.ts +0 -10
  155. package/src/namespaces/evm/types.ts +0 -36
  156. package/src/namespaces/evm/utils.ts +0 -106
  157. package/src/namespaces/solana/actions.ts +0 -44
  158. package/src/namespaces/solana/after.ts +0 -3
  159. package/src/namespaces/solana/and.ts +0 -5
  160. package/src/namespaces/solana/before.ts +0 -3
  161. package/src/namespaces/solana/builders.ts +0 -40
  162. package/src/namespaces/solana/constants.ts +0 -2
  163. package/src/namespaces/solana/hooks.ts +0 -10
  164. package/src/namespaces/solana/mod.ts +0 -10
  165. package/src/namespaces/solana/types.ts +0 -25
  166. package/src/namespaces/solana/utils.ts +0 -36
  167. package/src/namespaces/starknet/actions.ts +0 -19
  168. package/src/namespaces/starknet/after.ts +0 -3
  169. package/src/namespaces/starknet/and.ts +0 -5
  170. package/src/namespaces/starknet/before.ts +0 -3
  171. package/src/namespaces/starknet/builders.ts +0 -18
  172. package/src/namespaces/starknet/constants.ts +0 -8
  173. package/src/namespaces/starknet/mod.ts +0 -9
  174. package/src/namespaces/starknet/types.ts +0 -18
  175. package/src/namespaces/starknet/utils.ts +0 -35
  176. package/src/namespaces/sui/actions.ts +0 -27
  177. package/src/namespaces/sui/builders.ts +0 -77
  178. package/src/namespaces/sui/constants.ts +0 -8
  179. package/src/namespaces/sui/hooks.ts +0 -10
  180. package/src/namespaces/sui/mod.ts +0 -8
  181. package/src/namespaces/sui/types.ts +0 -25
  182. package/src/namespaces/sui/utils.ts +0 -56
  183. package/src/namespaces/tron/actions.ts +0 -3
  184. package/src/namespaces/tron/after.ts +0 -3
  185. package/src/namespaces/tron/and.ts +0 -5
  186. package/src/namespaces/tron/before.ts +0 -3
  187. package/src/namespaces/tron/builders.ts +0 -15
  188. package/src/namespaces/tron/constants.ts +0 -8
  189. package/src/namespaces/tron/mod.ts +0 -8
  190. package/src/namespaces/tron/types.ts +0 -14
  191. package/src/namespaces/tron/utils.ts +0 -18
  192. package/src/namespaces/utxo/actions.ts +0 -3
  193. package/src/namespaces/utxo/after.ts +0 -3
  194. package/src/namespaces/utxo/and.ts +0 -5
  195. package/src/namespaces/utxo/before.ts +0 -3
  196. package/src/namespaces/utxo/builders.ts +0 -12
  197. package/src/namespaces/utxo/constants.ts +0 -2
  198. package/src/namespaces/utxo/mod.ts +0 -8
  199. package/src/namespaces/utxo/types.ts +0 -14
  200. package/src/namespaces/utxo/utils.ts +0 -18
  201. package/src/namespaces/xrpl/builders.ts +0 -14
  202. package/src/namespaces/xrpl/constants.ts +0 -7
  203. package/src/namespaces/xrpl/mod.ts +0 -5
  204. package/src/namespaces/xrpl/types.ts +0 -16
  205. package/src/namespaces/xrpl/utils.ts +0 -15
  206. package/src/types/accounts.ts +0 -12
  207. package/src/types/mod.ts +0 -1
  208. package/src/types/utils.ts +0 -7
  209. /package/src/{types/actions.ts → hub/types.ts} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/namespaces/utxo/actions.ts", "../../../src/namespaces/common/actions.ts", "../../../src/namespaces/utxo/after.ts", "../../../src/namespaces/common/after.ts", "../../../src/namespaces/utxo/and.ts", "../../../src/hub/store/store.ts", "../../../src/hub/store/namespaces.ts", "../../../src/hub/store/providers.ts", "../../../src/builders/action.ts", "../../../src/utils/mod.ts", "../../../src/namespaces/common/helpers.ts", "../../../src/namespaces/common/and.ts", "../../../src/namespaces/common/before.ts", "../../../src/namespaces/utxo/before.ts", "../../../src/namespaces/utxo/builders.ts", "../../../src/namespaces/utxo/utils.ts", "../../../src/namespaces/utxo/constants.ts"],
4
- "sourcesContent": ["import { recommended as commonRecommended } from '../common/actions.js';\n\nexport const recommended = [...commonRecommended];\n", "import type { Context } from '../../hub/namespaces/mod.js';\n\nexport function disconnect(context: Context): void {\n const [, setState] = context.state();\n setState('network', null);\n setState('accounts', null);\n setState('connected', false);\n setState('connecting', false);\n setState('connectArgs', null);\n}\n\nexport const recommended = [['disconnect', disconnect] as const];\n", "import { recommended as commonRecommended } from '../common/after.js';\n\nexport const recommended = [...commonRecommended];\n", "import type { Context } from '../../hub/namespaces/mod.js';\n\nexport function intoConnectionFinished(context: Context) {\n const [, setState] = context.state();\n setState('connecting', false);\n}\n\nexport const recommended = [['connect', intoConnectionFinished] as const];\n", "import { connectAndUpdateStateForSingleNetwork } from '../common/mod.js';\n\nexport const recommended = [\n ['connect', connectAndUpdateStateForSingleNetwork] as const,\n];\n", "import type { StoreApi } from 'zustand/vanilla';\n\nimport { createStore as createZustandStore } from 'zustand/vanilla';\n\nimport { extend, type Store } from './extend.js';\nimport { hubStore, type HubStore } from './hub.js';\nimport { namespacesStore, type NamespaceStore } from './namespaces.js';\nimport { providersStore, type ProviderStore } from './providers.js';\n\n/************ State ************/\n\nexport interface State {\n hub: HubStore;\n providers: ProviderStore;\n namespaces: NamespaceStore;\n}\n\nexport type RawStore = StoreApi<State>;\n\nexport const createStore = (): Store => {\n const store = createZustandStore<State>((...api) => {\n return {\n hub: hubStore(...api),\n providers: providersStore(...api),\n namespaces: namespacesStore(...api),\n };\n });\n\n return extend(store);\n};\n", "/************ Namespace ************/\n\nimport type { StateCreator } from 'zustand';\n\nimport { produce } from 'immer';\n\nimport {\n ConsumableEvents,\n type NamespaceConnectedEvent,\n type NamespaceDisconnectedEvent,\n type NamespaceSwitchedAccountEvent,\n type NamespaceSwitchedNetworkEvent,\n} from './events.js';\nimport { namespaceStateSelector, type State } from './mod.js';\n\n// Currently, namespace doesn't has any config.\nexport type NamespaceConfig = object;\n\nexport interface NamespaceData {\n accounts: null | string[];\n network: null | string;\n connected: boolean;\n connecting: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n connectArgs: Record<string, any> | null;\n}\n\ninterface NamespaceInfo {\n providerId: string;\n namespaceId: string;\n}\n\ninterface NamespaceItem {\n info: NamespaceInfo;\n data: NamespaceData;\n error: unknown;\n}\n\ntype NamespaceState = {\n events: InstanceType<typeof ConsumableEvents>;\n list: Record<string, NamespaceItem>;\n};\n\ninterface NamespaceActions {\n addNamespace: (id: string, config: NamespaceInfo) => void;\n updateStatus: <K extends keyof NamespaceData>(\n id: string,\n key: K,\n value: NamespaceData[K],\n ) => void;\n\n _produceEventsWhenUpdatingStatus: <K extends keyof NamespaceData>(\n namespace: NamespaceItem,\n id: string,\n key: K,\n value: NamespaceData[K],\n ) => void;\n}\ninterface NamespaceSelectors {\n getNamespaceData(storeId: string): NamespaceData;\n}\n\nexport type NamespaceStore = NamespaceState &\n NamespaceActions &\n NamespaceSelectors;\ntype NamespaceStateCreator = StateCreator<State, [], [], NamespaceStore>;\n\nconst namespacesStore: NamespaceStateCreator = (set, get) => ({\n events: new ConsumableEvents(),\n\n list: {},\n addNamespace: (id, info) => {\n const data: NamespaceData = {\n accounts: null,\n network: null,\n connected: false,\n connecting: false,\n connectArgs: null,\n };\n\n const item = {\n data,\n error: '',\n info,\n };\n\n set(\n produce((state: State) => {\n state.namespaces.list[id] = item;\n }),\n );\n },\n updateStatus: (id, key, value) => {\n const ns = get().namespaces.list[id];\n if (!ns) {\n throw new Error(`No namespace with '${id}' found.`);\n }\n\n get().namespaces._produceEventsWhenUpdatingStatus(ns, id, key, value);\n\n // Updating state\n set(\n produce((state: State) => {\n state.namespaces.list[id].data[key] = value;\n }),\n );\n },\n getNamespaceData(storeId) {\n return namespaceStateSelector(get(), storeId);\n },\n\n _produceEventsWhenUpdatingStatus: (namespace, id, key, value) => {\n if (key === 'accounts') {\n // check for both null and empty array\n const isAccountsEmpty =\n Object.is(value, null) || (Array.isArray(value) && value.length === 0);\n\n if (isAccountsEmpty) {\n const currentConnectedStatus = get().namespaces.list[id].data.connected;\n if (currentConnectedStatus) {\n const event: NamespaceDisconnectedEvent = {\n type: 'namespace_disconnected',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n };\n\n get().namespaces.events.push(event);\n }\n // Skip emitting disconnect event, if the `connected` is false\n } else {\n const currentAccounts = get().namespaces.list[id].data.accounts;\n\n if (!currentAccounts) {\n const event: NamespaceConnectedEvent = {\n type: 'namespace_connected',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n accounts: value as string[],\n };\n\n get().namespaces.events.push(event);\n } else {\n const areSameAccounts =\n // Clone the object from the Zustand store, as it's immutable, to avoid errors during sorting.\n [...currentAccounts].sort().toString() ===\n (value as string[]).sort().toString();\n\n if (!areSameAccounts) {\n const event: NamespaceSwitchedAccountEvent = {\n type: 'namespace_account_switched',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n previousAccounts: currentAccounts,\n accounts: value as string[],\n };\n\n get().namespaces.events.push(event);\n }\n }\n }\n } else if (key === 'network') {\n const currentNetwork = get().namespaces.list[id].data.network;\n\n const event: NamespaceSwitchedNetworkEvent = {\n type: 'namespace_network_switched',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n network: value as string,\n previousNetwork: currentNetwork,\n };\n\n get().namespaces.events.push(event);\n }\n },\n});\n\nexport { namespacesStore };\n", "import type { Namespace } from '../../namespaces/common/types.js';\nimport type { State as InternalProviderState } from '../provider/mod.js';\nimport type { BlockchainMeta, SignerFactory } from 'rango-types';\nimport type { StateCreator } from 'zustand';\n\nimport { produce } from 'immer';\n\nimport { ConsumableEvents, type ProviderDetectedEvent } from './events.js';\nimport { guessProviderStateSelector, type State } from './mod.js';\n\ntype Browsers = 'firefox' | 'chrome' | 'edge' | 'brave' | 'homepage';\ntype Property<N extends string, V> = { name: N; value: V };\n\ntype NamespacesProperty = Property<\n 'namespaces',\n {\n selection: 'single' | 'multiple';\n data: {\n label: string;\n id: string;\n value: Namespace;\n unsupported?: boolean;\n getSupportedChains: (chains: BlockchainMeta[]) => BlockchainMeta[];\n }[];\n }\n>;\ntype DerivationPathProperty = Property<\n 'derivationPath',\n {\n data: {\n id: string;\n label: string;\n namespace: Namespace;\n generateDerivationPath: (index: string) => string;\n }[];\n }\n>;\ntype DetailsProperty = Property<\n 'details',\n {\n mobileWallet?: boolean;\n showOnMobile?: boolean;\n isContractWallet?: boolean;\n }\n>;\ntype SignersProperty = Property<\n 'signers',\n {\n getSigners: () => Promise<SignerFactory>;\n }\n>;\n\nexport type ProviderMetadata = {\n name: string;\n icon: string;\n extensions: Partial<Record<Browsers, string>>;\n properties?: Array<\n | NamespacesProperty\n | DerivationPathProperty\n | DetailsProperty\n | SignersProperty\n >;\n};\n\nexport interface ProviderConfig {\n metadata: ProviderMetadata;\n}\n\nexport type ProviderInfo = ProviderConfig;\n\ninterface ProviderData {\n installed: boolean;\n}\n\ninterface ProviderItem {\n config: ProviderConfig;\n data: ProviderData;\n error: unknown;\n}\n\ntype ProviderState = {\n events: ConsumableEvents;\n list: Record<string, ProviderItem>;\n};\ninterface ProviderActions {\n addProvider: (id: string, config: ProviderConfig) => void;\n removeProvider: (id: string) => void;\n updateStatus: <K extends keyof ProviderData>(\n id: string,\n key: K,\n value: ProviderData[K],\n ) => void;\n\n _produceEventsWhenUpdatingStatus: <K extends keyof ProviderData>(\n provider: ProviderItem,\n id: string,\n key: K,\n value: ProviderData[K],\n ) => void;\n}\n\ninterface ProviderSelectors {\n /**\n * Provider has a limited state to itself, to be compatible with legacy, we try to produce same object as legacy\n * which includes namespace state as well.\n */\n guessNamespacesState: (id: string) => InternalProviderState;\n}\n\nexport type ProviderStore = ProviderState & ProviderActions & ProviderSelectors;\ntype ProvidersStateCreator = StateCreator<State, [], [], ProviderStore>;\n\nconst providersStore: ProvidersStateCreator = (set, get) => ({\n events: new ConsumableEvents(),\n\n list: {},\n addProvider: (id, config) => {\n const item = {\n data: {\n installed: false,\n },\n error: '',\n config,\n };\n\n set(\n produce((state: State) => {\n state.providers.list[id] = item;\n }),\n );\n },\n removeProvider: (id) => {\n set(\n produce((state: State) => {\n delete state.providers.list[id];\n }),\n );\n },\n updateStatus: (id, key, value) => {\n const provider = get().providers.list[id];\n if (!provider) {\n throw new Error(`No namespace namespace with '${id}' found.`);\n }\n\n get().providers._produceEventsWhenUpdatingStatus(provider, id, key, value);\n\n set(\n produce((state: State) => {\n state.providers.list[id].data[key] = value;\n }),\n );\n },\n guessNamespacesState: (providerId: string): InternalProviderState => {\n return guessProviderStateSelector(get(), providerId);\n },\n\n _produceEventsWhenUpdatingStatus: (_provider, id, key, _value) => {\n if (key === 'installed') {\n const event: ProviderDetectedEvent = {\n type: 'provider_detected',\n provider: id,\n };\n\n get().providers.events.push(event);\n }\n },\n});\n\nexport { providersStore };\n", "import type { Actions, Context, Operators } from '../hub/namespaces/types.js';\nimport type { AnyFunction, FunctionWithContext } from '../types/actions.js';\n\nexport interface ActionByBuilder<T, Context> {\n actionName: keyof T;\n and: Operators<T>;\n or: Operators<T>;\n after: Operators<T>;\n before: Operators<T>;\n action: FunctionWithContext<T[keyof T], Context>;\n}\n\n/*\n * TODO:\n * Currently, to use this builder you will write something like this:\n * new ActionBuilder<EvmActions, 'disconnect'>('disconnect').after(....)\n *\n * I couldn't figure it out to be able typescript infer the constructor value as key of actions.\n * Ideal usage:\n * new ActionBuilder<EvmActions>('disconnect').after(....)\n *\n */\nexport class ActionBuilder<T extends Actions<T>, K extends keyof T> {\n readonly name: K;\n #and: Operators<T> = new Map();\n #or: Operators<T> = new Map();\n #after: Operators<T> = new Map();\n #before: Operators<T> = new Map();\n #action: FunctionWithContext<T[keyof T], Context<T>> | undefined;\n\n constructor(name: K) {\n this.name = name;\n }\n\n public and(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#and.has(this.name)) {\n this.#and.set(this.name, []);\n }\n this.#and.get(this.name)?.push(action);\n return this;\n }\n\n public or(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#or.has(this.name)) {\n this.#or.set(this.name, []);\n }\n this.#or.get(this.name)?.push(action);\n return this;\n }\n\n public before(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#before.has(this.name)) {\n this.#before.set(this.name, []);\n }\n this.#before.get(this.name)?.push(action);\n return this;\n }\n\n public after(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#after.has(this.name)) {\n this.#after.set(this.name, []);\n }\n this.#after.get(this.name)?.push(action);\n return this;\n }\n\n public action(action: FunctionWithContext<T[keyof T], Context<T>>) {\n this.#action = action;\n return this;\n }\n\n public build(): ActionByBuilder<T, Context<T>> {\n if (!this.#action) {\n throw new Error('Your action builder should includes an action.');\n }\n\n return {\n actionName: this.name,\n action: this.#action,\n before: this.#before,\n after: this.#after,\n and: this.#and,\n or: this.#or,\n };\n }\n}\n", "/*\n * It is not a good idea to re-export all of CAIP because if they have a breaking change, we will break as well.\n * It would be better to create an abstraction over them and export our own interface to ensure it is under our control.\n */\nexport * as CAIP from 'caip';\n\nexport { generateStoreId } from '../hub/helpers.js';\nexport * from './versions.js';\n", "import { AccountId } from 'caip';\n\nexport function isValidCaipAddress(address: string): boolean {\n try {\n AccountId.parse(address);\n return true;\n } catch {\n return false;\n }\n}\n", "import type { Context } from '../../hub/namespaces/mod.js';\nimport type {\n Accounts,\n AccountsWithActiveChain,\n} from '../../types/accounts.js';\n\nimport { isValidCaipAddress } from './helpers.js';\n\nexport function connectAndUpdateStateForSingleNetwork(\n context: Context,\n accounts: Accounts,\n) {\n if (!accounts.every(isValidCaipAddress)) {\n throw new Error(\n `Your provider should format account addresses in CAIP-10 format. Your provided accounts: ${accounts}`,\n );\n }\n\n const [, setState] = context.state();\n setState('accounts', accounts);\n setState('connected', true);\n return accounts;\n}\n\nexport function connectAndUpdateStateForMultiNetworks(\n context: Context,\n accounts: AccountsWithActiveChain,\n) {\n if (!accounts.accounts.every(isValidCaipAddress)) {\n throw new Error(\n `Your provider should format account addresses in CAIP-10 format. Your provided accounts: ${accounts.accounts}`,\n );\n }\n\n const [, setState] = context.state();\n setState('accounts', accounts.accounts);\n setState('network', accounts.network);\n setState('connected', true);\n return accounts;\n}\n\nexport const recommended = [];\n", "import type { Context } from '../../hub/namespaces/mod.js';\n\nexport function intoConnecting(context: Context) {\n const [, setState] = context.state();\n setState('connecting', true);\n}\n\n// Please consider if you are going to add something here, make sure it works on all namespaces.\nexport const recommended = [['connect', intoConnecting] as const];\n", "import { recommended as commonRecommended } from '../common/before.js';\n\nexport const recommended = [...commonRecommended];\n", "import type { UtxoActions } from './types.js';\n\nimport { ActionBuilder } from '../../mod.js';\nimport { intoConnectionFinished } from '../common/after.js';\nimport { connectAndUpdateStateForSingleNetwork } from '../common/and.js';\nimport { intoConnecting } from '../common/before.js';\n\nexport const connect = () =>\n new ActionBuilder<UtxoActions, 'connect'>('connect')\n .and(connectAndUpdateStateForSingleNetwork)\n .before(intoConnecting)\n .after(intoConnectionFinished);\n", "import type { CaipAccount } from '../common/mod.js';\n\nimport { AccountId } from 'caip';\n\nimport { CAIP_BITCOIN_CHAIN_ID, CAIP_NAMESPACE } from './constants.js';\n\nexport function formatAccountsToCAIP(accounts: string[]) {\n return accounts.map(\n (account) =>\n AccountId.format({\n address: account.toString(),\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_BITCOIN_CHAIN_ID,\n },\n }) as CaipAccount,\n );\n}\n", "export const CAIP_NAMESPACE = 'bip122';\nexport const CAIP_BITCOIN_CHAIN_ID = '000000000019d6689c085ae165831e93';\n"],
5
- "mappings": "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",
6
- "names": ["actions_exports", "__export", "recommended", "disconnect", "context", "setState", "__name", "recommended", "recommended", "after_exports", "__export", "recommended", "intoConnectionFinished", "context", "setState", "__name", "recommended", "recommended", "and_exports", "__export", "recommended", "createZustandStore", "produce", "produce", "ActionBuilder", "__name", "#and", "#or", "#after", "#before", "#action", "name", "action", "CAIP", "AccountId", "isValidCaipAddress", "address", "AccountId", "__name", "connectAndUpdateStateForSingleNetwork", "context", "accounts", "isValidCaipAddress", "setState", "__name", "intoConnecting", "context", "setState", "__name", "recommended", "recommended", "connectAndUpdateStateForSingleNetwork", "before_exports", "__export", "recommended", "recommended", "builders_exports", "__export", "connect", "connect", "__name", "ActionBuilder", "connectAndUpdateStateForSingleNetwork", "intoConnecting", "intoConnectionFinished", "utils_exports", "__export", "formatAccountsToCAIP", "AccountId", "CAIP_NAMESPACE", "CAIP_BITCOIN_CHAIN_ID", "formatAccountsToCAIP", "accounts", "account", "AccountId", "CAIP_NAMESPACE", "CAIP_BITCOIN_CHAIN_ID", "__name"]
7
- }
@@ -1,2 +0,0 @@
1
- var h=Object.defineProperty;var e=(r,t)=>h(r,"name",{value:t,configurable:!0});var l=(r,t)=>{for(var n in t)h(r,n,{get:t[n],enumerable:!0})};var S={};l(S,{connect:()=>I});import{createStore as we}from"zustand/vanilla";import{produce as de}from"immer";import{produce as ve}from"immer";var o=class{static{e(this,"ActionBuilder")}name;#e=new Map;#t=new Map;#r=new Map;#o=new Map;#n;constructor(t){this.name=t}and(t){return this.#e.has(this.name)||this.#e.set(this.name,[]),this.#e.get(this.name)?.push(t),this}or(t){return this.#t.has(this.name)||this.#t.set(this.name,[]),this.#t.get(this.name)?.push(t),this}before(t){return this.#o.has(this.name)||this.#o.set(this.name,[]),this.#o.get(this.name)?.push(t),this}after(t){return this.#r.has(this.name)||this.#r.set(this.name,[]),this.#r.get(this.name)?.push(t),this}action(t){return this.#n=t,this}build(){if(!this.#n)throw new Error("Your action builder should includes an action.");return{actionName:this.name,action:this.#n,before:this.#o,after:this.#r,and:this.#e,or:this.#t}}};import*as ot from"caip";function p(r){let[,t]=r.state();t("connecting",!1)}e(p,"intoConnectionFinished");import{AccountId as T}from"caip";function g(r){try{return T.parse(r),!0}catch{return!1}}e(g,"isValidCaipAddress");function d(r,t){if(!t.every(g))throw new Error(`Your provider should format account addresses in CAIP-10 format. Your provided accounts: ${t}`);let[,n]=r.state();return n("accounts",t),n("connected",!0),t}e(d,"connectAndUpdateStateForSingleNetwork");function u(r){let[,t]=r.state();t("connecting",!0)}e(u,"intoConnecting");var I=e(()=>new o("connect").and(d).before(u).after(p),"connect");var x={};l(x,{formatAddressToCAIP:()=>R});import{AccountId as k}from"caip";var m="xrpl",f="mainnet";function R(r){return k.format({address:r,chainId:{namespace:m,reference:f}})}e(R,"formatAddressToCAIP");export{m as CAIP_NAMESPACE,f as CAIP_XRPL_CHAIN_ID,S as builders,x as utils};
2
- //# sourceMappingURL=mod.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/namespaces/xrpl/builders.ts", "../../../src/hub/store/store.ts", "../../../src/hub/store/namespaces.ts", "../../../src/hub/store/providers.ts", "../../../src/builders/action.ts", "../../../src/utils/mod.ts", "../../../src/namespaces/common/after.ts", "../../../src/namespaces/common/helpers.ts", "../../../src/namespaces/common/and.ts", "../../../src/namespaces/common/before.ts", "../../../src/namespaces/xrpl/utils.ts", "../../../src/namespaces/xrpl/constants.ts"],
4
- "sourcesContent": ["import type { XRPLActions } from './types.js';\n\nimport { ActionBuilder } from '../../mod.js';\nimport {\n connectAndUpdateStateForSingleNetwork,\n intoConnecting,\n intoConnectionFinished,\n} from '../common/mod.js';\n\nexport const connect = () =>\n new ActionBuilder<XRPLActions, 'connect'>('connect')\n .and(connectAndUpdateStateForSingleNetwork)\n .before(intoConnecting)\n .after(intoConnectionFinished);\n", "import type { StoreApi } from 'zustand/vanilla';\n\nimport { createStore as createZustandStore } from 'zustand/vanilla';\n\nimport { extend, type Store } from './extend.js';\nimport { hubStore, type HubStore } from './hub.js';\nimport { namespacesStore, type NamespaceStore } from './namespaces.js';\nimport { providersStore, type ProviderStore } from './providers.js';\n\n/************ State ************/\n\nexport interface State {\n hub: HubStore;\n providers: ProviderStore;\n namespaces: NamespaceStore;\n}\n\nexport type RawStore = StoreApi<State>;\n\nexport const createStore = (): Store => {\n const store = createZustandStore<State>((...api) => {\n return {\n hub: hubStore(...api),\n providers: providersStore(...api),\n namespaces: namespacesStore(...api),\n };\n });\n\n return extend(store);\n};\n", "/************ Namespace ************/\n\nimport type { StateCreator } from 'zustand';\n\nimport { produce } from 'immer';\n\nimport {\n ConsumableEvents,\n type NamespaceConnectedEvent,\n type NamespaceDisconnectedEvent,\n type NamespaceSwitchedAccountEvent,\n type NamespaceSwitchedNetworkEvent,\n} from './events.js';\nimport { namespaceStateSelector, type State } from './mod.js';\n\n// Currently, namespace doesn't has any config.\nexport type NamespaceConfig = object;\n\nexport interface NamespaceData {\n accounts: null | string[];\n network: null | string;\n connected: boolean;\n connecting: boolean;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n connectArgs: Record<string, any> | null;\n}\n\ninterface NamespaceInfo {\n providerId: string;\n namespaceId: string;\n}\n\ninterface NamespaceItem {\n info: NamespaceInfo;\n data: NamespaceData;\n error: unknown;\n}\n\ntype NamespaceState = {\n events: InstanceType<typeof ConsumableEvents>;\n list: Record<string, NamespaceItem>;\n};\n\ninterface NamespaceActions {\n addNamespace: (id: string, config: NamespaceInfo) => void;\n updateStatus: <K extends keyof NamespaceData>(\n id: string,\n key: K,\n value: NamespaceData[K],\n ) => void;\n\n _produceEventsWhenUpdatingStatus: <K extends keyof NamespaceData>(\n namespace: NamespaceItem,\n id: string,\n key: K,\n value: NamespaceData[K],\n ) => void;\n}\ninterface NamespaceSelectors {\n getNamespaceData(storeId: string): NamespaceData;\n}\n\nexport type NamespaceStore = NamespaceState &\n NamespaceActions &\n NamespaceSelectors;\ntype NamespaceStateCreator = StateCreator<State, [], [], NamespaceStore>;\n\nconst namespacesStore: NamespaceStateCreator = (set, get) => ({\n events: new ConsumableEvents(),\n\n list: {},\n addNamespace: (id, info) => {\n const data: NamespaceData = {\n accounts: null,\n network: null,\n connected: false,\n connecting: false,\n connectArgs: null,\n };\n\n const item = {\n data,\n error: '',\n info,\n };\n\n set(\n produce((state: State) => {\n state.namespaces.list[id] = item;\n }),\n );\n },\n updateStatus: (id, key, value) => {\n const ns = get().namespaces.list[id];\n if (!ns) {\n throw new Error(`No namespace with '${id}' found.`);\n }\n\n get().namespaces._produceEventsWhenUpdatingStatus(ns, id, key, value);\n\n // Updating state\n set(\n produce((state: State) => {\n state.namespaces.list[id].data[key] = value;\n }),\n );\n },\n getNamespaceData(storeId) {\n return namespaceStateSelector(get(), storeId);\n },\n\n _produceEventsWhenUpdatingStatus: (namespace, id, key, value) => {\n if (key === 'accounts') {\n // check for both null and empty array\n const isAccountsEmpty =\n Object.is(value, null) || (Array.isArray(value) && value.length === 0);\n\n if (isAccountsEmpty) {\n const currentConnectedStatus = get().namespaces.list[id].data.connected;\n if (currentConnectedStatus) {\n const event: NamespaceDisconnectedEvent = {\n type: 'namespace_disconnected',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n };\n\n get().namespaces.events.push(event);\n }\n // Skip emitting disconnect event, if the `connected` is false\n } else {\n const currentAccounts = get().namespaces.list[id].data.accounts;\n\n if (!currentAccounts) {\n const event: NamespaceConnectedEvent = {\n type: 'namespace_connected',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n accounts: value as string[],\n };\n\n get().namespaces.events.push(event);\n } else {\n const areSameAccounts =\n // Clone the object from the Zustand store, as it's immutable, to avoid errors during sorting.\n [...currentAccounts].sort().toString() ===\n (value as string[]).sort().toString();\n\n if (!areSameAccounts) {\n const event: NamespaceSwitchedAccountEvent = {\n type: 'namespace_account_switched',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n previousAccounts: currentAccounts,\n accounts: value as string[],\n };\n\n get().namespaces.events.push(event);\n }\n }\n }\n } else if (key === 'network') {\n const currentNetwork = get().namespaces.list[id].data.network;\n\n const event: NamespaceSwitchedNetworkEvent = {\n type: 'namespace_network_switched',\n provider: namespace.info.providerId,\n namespace: namespace.info.namespaceId,\n network: value as string,\n previousNetwork: currentNetwork,\n };\n\n get().namespaces.events.push(event);\n }\n },\n});\n\nexport { namespacesStore };\n", "import type { Namespace } from '../../namespaces/common/types.js';\nimport type { State as InternalProviderState } from '../provider/mod.js';\nimport type { BlockchainMeta, SignerFactory } from 'rango-types';\nimport type { StateCreator } from 'zustand';\n\nimport { produce } from 'immer';\n\nimport { ConsumableEvents, type ProviderDetectedEvent } from './events.js';\nimport { guessProviderStateSelector, type State } from './mod.js';\n\ntype Browsers = 'firefox' | 'chrome' | 'edge' | 'brave' | 'homepage';\ntype Property<N extends string, V> = { name: N; value: V };\n\ntype NamespacesProperty = Property<\n 'namespaces',\n {\n selection: 'single' | 'multiple';\n data: {\n label: string;\n id: string;\n value: Namespace;\n unsupported?: boolean;\n getSupportedChains: (chains: BlockchainMeta[]) => BlockchainMeta[];\n }[];\n }\n>;\ntype DerivationPathProperty = Property<\n 'derivationPath',\n {\n data: {\n id: string;\n label: string;\n namespace: Namespace;\n generateDerivationPath: (index: string) => string;\n }[];\n }\n>;\ntype DetailsProperty = Property<\n 'details',\n {\n mobileWallet?: boolean;\n showOnMobile?: boolean;\n isContractWallet?: boolean;\n }\n>;\ntype SignersProperty = Property<\n 'signers',\n {\n getSigners: () => Promise<SignerFactory>;\n }\n>;\n\nexport type ProviderMetadata = {\n name: string;\n icon: string;\n extensions: Partial<Record<Browsers, string>>;\n properties?: Array<\n | NamespacesProperty\n | DerivationPathProperty\n | DetailsProperty\n | SignersProperty\n >;\n};\n\nexport interface ProviderConfig {\n metadata: ProviderMetadata;\n}\n\nexport type ProviderInfo = ProviderConfig;\n\ninterface ProviderData {\n installed: boolean;\n}\n\ninterface ProviderItem {\n config: ProviderConfig;\n data: ProviderData;\n error: unknown;\n}\n\ntype ProviderState = {\n events: ConsumableEvents;\n list: Record<string, ProviderItem>;\n};\ninterface ProviderActions {\n addProvider: (id: string, config: ProviderConfig) => void;\n removeProvider: (id: string) => void;\n updateStatus: <K extends keyof ProviderData>(\n id: string,\n key: K,\n value: ProviderData[K],\n ) => void;\n\n _produceEventsWhenUpdatingStatus: <K extends keyof ProviderData>(\n provider: ProviderItem,\n id: string,\n key: K,\n value: ProviderData[K],\n ) => void;\n}\n\ninterface ProviderSelectors {\n /**\n * Provider has a limited state to itself, to be compatible with legacy, we try to produce same object as legacy\n * which includes namespace state as well.\n */\n guessNamespacesState: (id: string) => InternalProviderState;\n}\n\nexport type ProviderStore = ProviderState & ProviderActions & ProviderSelectors;\ntype ProvidersStateCreator = StateCreator<State, [], [], ProviderStore>;\n\nconst providersStore: ProvidersStateCreator = (set, get) => ({\n events: new ConsumableEvents(),\n\n list: {},\n addProvider: (id, config) => {\n const item = {\n data: {\n installed: false,\n },\n error: '',\n config,\n };\n\n set(\n produce((state: State) => {\n state.providers.list[id] = item;\n }),\n );\n },\n removeProvider: (id) => {\n set(\n produce((state: State) => {\n delete state.providers.list[id];\n }),\n );\n },\n updateStatus: (id, key, value) => {\n const provider = get().providers.list[id];\n if (!provider) {\n throw new Error(`No namespace namespace with '${id}' found.`);\n }\n\n get().providers._produceEventsWhenUpdatingStatus(provider, id, key, value);\n\n set(\n produce((state: State) => {\n state.providers.list[id].data[key] = value;\n }),\n );\n },\n guessNamespacesState: (providerId: string): InternalProviderState => {\n return guessProviderStateSelector(get(), providerId);\n },\n\n _produceEventsWhenUpdatingStatus: (_provider, id, key, _value) => {\n if (key === 'installed') {\n const event: ProviderDetectedEvent = {\n type: 'provider_detected',\n provider: id,\n };\n\n get().providers.events.push(event);\n }\n },\n});\n\nexport { providersStore };\n", "import type { Actions, Context, Operators } from '../hub/namespaces/types.js';\nimport type { AnyFunction, FunctionWithContext } from '../types/actions.js';\n\nexport interface ActionByBuilder<T, Context> {\n actionName: keyof T;\n and: Operators<T>;\n or: Operators<T>;\n after: Operators<T>;\n before: Operators<T>;\n action: FunctionWithContext<T[keyof T], Context>;\n}\n\n/*\n * TODO:\n * Currently, to use this builder you will write something like this:\n * new ActionBuilder<EvmActions, 'disconnect'>('disconnect').after(....)\n *\n * I couldn't figure it out to be able typescript infer the constructor value as key of actions.\n * Ideal usage:\n * new ActionBuilder<EvmActions>('disconnect').after(....)\n *\n */\nexport class ActionBuilder<T extends Actions<T>, K extends keyof T> {\n readonly name: K;\n #and: Operators<T> = new Map();\n #or: Operators<T> = new Map();\n #after: Operators<T> = new Map();\n #before: Operators<T> = new Map();\n #action: FunctionWithContext<T[keyof T], Context<T>> | undefined;\n\n constructor(name: K) {\n this.name = name;\n }\n\n public and(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#and.has(this.name)) {\n this.#and.set(this.name, []);\n }\n this.#and.get(this.name)?.push(action);\n return this;\n }\n\n public or(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#or.has(this.name)) {\n this.#or.set(this.name, []);\n }\n this.#or.get(this.name)?.push(action);\n return this;\n }\n\n public before(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#before.has(this.name)) {\n this.#before.set(this.name, []);\n }\n this.#before.get(this.name)?.push(action);\n return this;\n }\n\n public after(action: FunctionWithContext<AnyFunction, Context<T>>) {\n if (!this.#after.has(this.name)) {\n this.#after.set(this.name, []);\n }\n this.#after.get(this.name)?.push(action);\n return this;\n }\n\n public action(action: FunctionWithContext<T[keyof T], Context<T>>) {\n this.#action = action;\n return this;\n }\n\n public build(): ActionByBuilder<T, Context<T>> {\n if (!this.#action) {\n throw new Error('Your action builder should includes an action.');\n }\n\n return {\n actionName: this.name,\n action: this.#action,\n before: this.#before,\n after: this.#after,\n and: this.#and,\n or: this.#or,\n };\n }\n}\n", "/*\n * It is not a good idea to re-export all of CAIP because if they have a breaking change, we will break as well.\n * It would be better to create an abstraction over them and export our own interface to ensure it is under our control.\n */\nexport * as CAIP from 'caip';\n\nexport { generateStoreId } from '../hub/helpers.js';\nexport * from './versions.js';\n", "import type { Context } from '../../hub/namespaces/mod.js';\n\nexport function intoConnectionFinished(context: Context) {\n const [, setState] = context.state();\n setState('connecting', false);\n}\n\nexport const recommended = [['connect', intoConnectionFinished] as const];\n", "import { AccountId } from 'caip';\n\nexport function isValidCaipAddress(address: string): boolean {\n try {\n AccountId.parse(address);\n return true;\n } catch {\n return false;\n }\n}\n", "import type { Context } from '../../hub/namespaces/mod.js';\nimport type {\n Accounts,\n AccountsWithActiveChain,\n} from '../../types/accounts.js';\n\nimport { isValidCaipAddress } from './helpers.js';\n\nexport function connectAndUpdateStateForSingleNetwork(\n context: Context,\n accounts: Accounts,\n) {\n if (!accounts.every(isValidCaipAddress)) {\n throw new Error(\n `Your provider should format account addresses in CAIP-10 format. Your provided accounts: ${accounts}`,\n );\n }\n\n const [, setState] = context.state();\n setState('accounts', accounts);\n setState('connected', true);\n return accounts;\n}\n\nexport function connectAndUpdateStateForMultiNetworks(\n context: Context,\n accounts: AccountsWithActiveChain,\n) {\n if (!accounts.accounts.every(isValidCaipAddress)) {\n throw new Error(\n `Your provider should format account addresses in CAIP-10 format. Your provided accounts: ${accounts.accounts}`,\n );\n }\n\n const [, setState] = context.state();\n setState('accounts', accounts.accounts);\n setState('network', accounts.network);\n setState('connected', true);\n return accounts;\n}\n\nexport const recommended = [];\n", "import type { Context } from '../../hub/namespaces/mod.js';\n\nexport function intoConnecting(context: Context) {\n const [, setState] = context.state();\n setState('connecting', true);\n}\n\n// Please consider if you are going to add something here, make sure it works on all namespaces.\nexport const recommended = [['connect', intoConnecting] as const];\n", "import type { CaipAccount } from '../common/mod.js';\n\nimport { AccountId } from 'caip';\n\nimport { CAIP_NAMESPACE, CAIP_XRPL_CHAIN_ID } from './constants.js';\n\nexport function formatAddressToCAIP(address: string): CaipAccount {\n return AccountId.format({\n address,\n chainId: {\n namespace: CAIP_NAMESPACE,\n reference: CAIP_XRPL_CHAIN_ID,\n },\n }) as CaipAccount;\n}\n", "/*\n * @see https://namespaces.chainagnostic.org/xrpl/README\n */\n\n// if the value neeeds to be change make sure you will update mapCaipNamespaceToLegacyNetworkName as well\nexport const CAIP_NAMESPACE = 'xrpl';\nexport const CAIP_XRPL_CHAIN_ID = 'mainnet';\n"],
5
- "mappings": "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",
6
- "names": ["builders_exports", "__export", "connect", "createZustandStore", "produce", "produce", "ActionBuilder", "__name", "#and", "#or", "#after", "#before", "#action", "name", "action", "CAIP", "intoConnectionFinished", "context", "setState", "__name", "AccountId", "isValidCaipAddress", "address", "AccountId", "__name", "connectAndUpdateStateForSingleNetwork", "context", "accounts", "isValidCaipAddress", "setState", "__name", "intoConnecting", "context", "setState", "__name", "connect", "__name", "ActionBuilder", "connectAndUpdateStateForSingleNetwork", "intoConnecting", "intoConnectionFinished", "utils_exports", "__export", "formatAddressToCAIP", "AccountId", "CAIP_NAMESPACE", "CAIP_XRPL_CHAIN_ID", "formatAddressToCAIP", "address", "AccountId", "CAIP_NAMESPACE", "CAIP_XRPL_CHAIN_ID", "__name"]
7
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/legacy",
3
- "type": "module",
4
- "main": "../dist/legacy/mod.js",
5
- "module": "../dist/legacy/mod.js",
6
- "types": "../dist/legacy/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/common",
3
- "type": "module",
4
- "main": "../../dist/namespaces/common/mod.js",
5
- "module": "../../dist/namespaces/common/mod.js",
6
- "types": "../../dist/namespaces/common/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/cosmos",
3
- "type": "module",
4
- "main": "../../dist/namespaces/cosmos/mod.js",
5
- "module": "../../dist/namespaces/cosmos/mod.js",
6
- "types": "../../dist/namespaces/cosmos/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/evm",
3
- "type": "module",
4
- "main": "../../dist/namespaces/evm/mod.js",
5
- "module": "../../dist/namespaces/evm/mod.js",
6
- "types": "../../dist/namespaces/evm/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/solana",
3
- "type": "module",
4
- "main": "../../dist/namespaces/solana/mod.js",
5
- "module": "../../dist/namespaces/solana/mod.js",
6
- "types": "../../dist/namespaces/solana/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/starknet",
3
- "type": "module",
4
- "main": "../../dist/namespaces/starknet/mod.js",
5
- "module": "../../dist/namespaces/starknet/mod.js",
6
- "types": "../../dist/namespaces/starknet/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/sui",
3
- "type": "module",
4
- "main": "../../dist/namespaces/sui/mod.js",
5
- "module": "../../dist/namespaces/sui/mod.js",
6
- "types": "../../dist/namespaces/sui/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/tron",
3
- "type": "module",
4
- "main": "../../dist/namespaces/tron/mod.js",
5
- "module": "../../dist/namespaces/tron/mod.js",
6
- "types": "../../dist/namespaces/tron/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/utxo",
3
- "type": "module",
4
- "main": "../../dist/namespaces/utxo/mod.js",
5
- "module": "../../dist/namespaces/utxo/mod.js",
6
- "types": "../../dist/namespaces/utxo/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "name": "@hub3js/core/namespaces/xrpl",
3
- "type": "module",
4
- "main": "../../dist/namespaces/xrpl/mod.js",
5
- "module": "../../dist/namespaces/xrpl/mod.js",
6
- "types": "../../dist/namespaces/xrpl/mod.d.ts",
7
- "sideEffects": false
8
- }
@@ -1,75 +0,0 @@
1
- import type { Network } from './types.js';
2
- import type { Options } from './wallet.js';
3
- import type { BlockchainMeta } from 'rango-types';
4
-
5
- import { Networks } from './types.js';
6
-
7
- export function formatAddressWithNetwork(
8
- address: string,
9
- network?: Network | null,
10
- ) {
11
- return `${network || ''}:${address}`;
12
- }
13
-
14
- export function accountAddressesWithNetwork(
15
- addresses: string[] | null,
16
- network?: Network | null,
17
- ) {
18
- if (!addresses) {
19
- return [];
20
- }
21
-
22
- return addresses.map((address) => {
23
- return formatAddressWithNetwork(address, network);
24
- });
25
- }
26
-
27
- export function readAccountAddress(addressWithNetwork: string): {
28
- address: string;
29
- network: Network;
30
- } {
31
- const [network, address] = addressWithNetwork.split(':');
32
-
33
- return {
34
- network,
35
- address,
36
- };
37
- }
38
-
39
- export function needsCheckInstallation(options: Options) {
40
- const { checkInstallation = true } = options.config;
41
- return checkInstallation;
42
- }
43
-
44
- export const getBlockChainNameFromId = (
45
- chainId: string | number,
46
- blockchains: BlockchainMeta[],
47
- ): Network | null => {
48
- chainId =
49
- typeof chainId === 'string' && chainId.startsWith('0x')
50
- ? parseInt(chainId)
51
- : chainId;
52
-
53
- /*
54
- * Sometimes providers are passing `Network` as chainId.
55
- * If chainId is a `Network`, we return itself.
56
- */
57
- const allNetworks = Object.values(Networks);
58
- if (allNetworks.includes(String(chainId) as Networks)) {
59
- return chainId as Networks;
60
- }
61
-
62
- if (chainId === 'Binance-Chain-Tigris') {
63
- return Networks.BINANCE;
64
- }
65
- return (
66
- blockchains
67
- .filter((blockchainMeta) => !!blockchainMeta.chainId)
68
- .find((blockchainMeta) => {
69
- const blockchainChainId = blockchainMeta.chainId?.startsWith('0x')
70
- ? parseInt(blockchainMeta.chainId)
71
- : blockchainMeta.chainId;
72
- return blockchainChainId == chainId;
73
- })?.name || null
74
- );
75
- };
package/src/legacy/mod.ts DELETED
@@ -1,44 +0,0 @@
1
- /*
2
- * All the exported types/values from legacy should be prefixed with `Legacy`
3
- * since they will be removed soon and isn't part of the main interface for this package.
4
- */
5
- export type {
6
- EventHandler as LegacyEventHandler,
7
- State as LegacyState,
8
- Options as LegacyOptions,
9
- } from './wallet.js';
10
-
11
- export type {
12
- Connect as LegacyConnect,
13
- Disconnect as LegacyDisconnect,
14
- Subscribe as LegacySubscribe,
15
- CanEagerConnect as LegacyCanEagerConnect,
16
- SwitchNetwork as LegacySwitchNetwork,
17
- Suggest as LegacySuggest,
18
- CanSwitchNetwork as LegacyCanSwitchNetwork,
19
- NamespaceData as LegacyNamespaceData,
20
- ProviderInterface as LegacyProviderInterface,
21
- NetworkProviderMap as LegacyNetworkProviderMap,
22
- Network as LegacyNetwork,
23
- WalletType as LegacyWalletType,
24
- InstallObjects as LegacyInstallObjects,
25
- WalletInfo as LegacyWalletInfo,
26
- ConnectResult as LegacyConnectResult,
27
- NamespaceInputForConnect as LegacyNamespaceInputForConnect,
28
- NamespaceMeta as LegacyNamespaceMeta,
29
- } from './types.js';
30
-
31
- export { Events as LegacyEvents, Networks as LegacyNetworks } from './types.js';
32
-
33
- export { Persistor } from './persistor.js';
34
- export {
35
- readAccountAddress as legacyReadAccountAddress,
36
- getBlockChainNameFromId as legacyGetBlockChainNameFromId,
37
- formatAddressWithNetwork as legacyFormatAddressWithNetwork,
38
- } from './helpers.js';
39
- export { default as LegacyWallet } from './wallet.js';
40
-
41
- export {
42
- eagerConnectHandler as legacyEagerConnectHandler,
43
- isEvmNamespace as legacyIsEvmNamespace,
44
- } from './utils.js';
@@ -1,19 +0,0 @@
1
- export interface PersistStorage<T> {
2
- getItem: (name: string) => T | null;
3
- setItem: (name: string, value: T) => void;
4
- removeItem: (name: string) => void;
5
- }
6
-
7
- export class Persistor<T> implements PersistStorage<T> {
8
- getItem(name: string) {
9
- const item = localStorage.getItem(name);
10
- const parsedItem = item ? (JSON.parse(item) as T) : null;
11
- return parsedItem;
12
- }
13
- setItem(name: string, value: T) {
14
- localStorage.setItem(name, JSON.stringify(value));
15
- }
16
- removeItem(name: string) {
17
- localStorage.removeItem(name);
18
- }
19
- }
@@ -1,303 +0,0 @@
1
- import type { State as WalletState } from './wallet.js';
2
- import type { Namespace } from '../namespaces/common/mod.js';
3
- import type { BlockchainMeta, SignerFactory } from 'rango-types';
4
-
5
- export enum Networks {
6
- BTC = 'BTC',
7
- BSC = 'BSC',
8
- LTC = 'LTC',
9
- THORCHAIN = 'THOR',
10
- BCH = 'BCH',
11
- BINANCE = 'BNB',
12
- BLAST = 'BLAST',
13
- CELO = 'CELO',
14
- LINEA = 'LINEA',
15
- METIS = 'METIS',
16
- SONIC = 'SONIC',
17
- BERACHAIN = 'BERACHAIN',
18
- ZETA_CHAIN = 'ZETA_CHAIN',
19
- SCROLL = 'SCROLL',
20
- ZKSYNC = 'ZKSYNC',
21
- MONAD = 'MONAD',
22
- ETHEREUM = 'ETH',
23
- POLYGON = 'POLYGON',
24
- TERRA = 'TERRA',
25
- POLKADOT = '',
26
- TRON = 'TRON',
27
- DOGE = 'DOGE',
28
- HARMONY = 'HARMONY',
29
- AVAX_CCHAIN = 'AVAX_CCHAIN',
30
- FANTOM = 'FANTOM',
31
- MOONBEAM = 'MOONBEAM',
32
- ARBITRUM = 'ARBITRUM',
33
- BOBA = 'BOBA',
34
- OPTIMISM = 'OPTIMISM',
35
- FUSE = 'FUSE',
36
- CRONOS = 'CRONOS',
37
- SOLANA = 'SOLANA',
38
- MOONRIVER = 'MOONRIVER',
39
- GNOSIS = 'GNOSIS',
40
- COSMOS = 'COSMOS',
41
- OSMOSIS = 'OSMOSIS',
42
- AXELAR = 'AXELAR',
43
- MARS = 'MARS',
44
- STRIDE = 'STRIDE',
45
- MAYA = 'MAYA',
46
- AKASH = 'AKASH',
47
- IRIS = 'IRIS',
48
- PERSISTENCE = 'PERSISTENCE',
49
- SENTINEL = 'SENTINEL',
50
- REGEN = 'REGEN',
51
- CRYPTO_ORG = 'CRYPTO_ORG',
52
- SIF = 'SIF',
53
- CHIHUAHUA = 'CHIHUAHUA',
54
- JUNO = 'JUNO',
55
- KUJIRA = 'KUJIRA',
56
- STARNAME = 'STARNAME',
57
- COMDEX = 'COMDEX',
58
- STARGAZE = 'STARGAZE',
59
- DESMOS = 'DESMOS',
60
- BITCANNA = 'BITCANNA',
61
- SECRET = 'SECRET',
62
- INJECTIVE = 'INJECTIVE',
63
- LUMNETWORK = 'LUMNETWORK',
64
- BANDCHAIN = 'BANDCHAIN',
65
- EMONEY = 'EMONEY',
66
- BITSONG = 'BITSONG',
67
- KI = 'KI',
68
- MEDIBLOC = 'MEDIBLOC',
69
- KONSTELLATION = 'KONSTELLATION',
70
- UMEE = 'UMEE',
71
- STARKNET = 'STARKNET',
72
- TON = 'TON',
73
- BASE = 'BASE',
74
- SUI = 'SUI',
75
- XRPL = 'XRPL',
76
-
77
- // Using instead of null
78
- Unknown = 'Unkown',
79
- }
80
-
81
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
- type InstanceType = any;
83
-
84
- export type NamespaceData = {
85
- namespace: Namespace;
86
- derivationPath?: string;
87
- };
88
-
89
- export type WalletType = string;
90
- export type Network = string;
91
-
92
- export type InstallObjects = {
93
- CHROME?: string;
94
- FIREFOX?: string;
95
- EDGE?: string;
96
- BRAVE?: string;
97
- DEFAULT: string;
98
- };
99
-
100
- export type NamespaceMeta = {
101
- label: string;
102
- /**
103
- * By using a matched `blockchain.name` (in meta) and `id`, we show logo in Namespace modal
104
- * e.g. ETH
105
- */
106
- id: string;
107
- value: Namespace;
108
- unsupported?: boolean;
109
- getSupportedChains: (chains: BlockchainMeta[]) => BlockchainMeta[];
110
- };
111
-
112
- interface NeedsNamespace {
113
- selection: 'single' | 'multiple';
114
- data: NamespaceMeta[];
115
- }
116
-
117
- interface NeedsDerivationPath {
118
- data: {
119
- id: string;
120
- label: string;
121
- namespace: Namespace;
122
- generateDerivationPath: (index: string) => string;
123
- }[];
124
- }
125
-
126
- export type WalletInfo = {
127
- name: string;
128
- img: string;
129
- installLink: InstallObjects | string;
130
- /**
131
- * @deprecated we don't use this value anymore.
132
- */
133
- color: string;
134
- supportedChains: BlockchainMeta[];
135
- showOnMobile?: boolean;
136
- isContractWallet?: boolean;
137
- mobileWallet?: boolean;
138
-
139
- needsDerivationPath?: NeedsDerivationPath;
140
- needsNamespace?: NeedsNamespace;
141
- };
142
-
143
- export type State = {
144
- [key: string]: WalletState | undefined;
145
- };
146
-
147
- export type ConnectResult = {
148
- accounts: string[] | null;
149
- network: Network | null;
150
- provider: InstanceType;
151
- };
152
-
153
- export type Providers = { [type in WalletType]?: InstanceType };
154
- export type NetworkProviderMap = Map<Networks, unknown>;
155
-
156
- export enum Events {
157
- CONNECTED = 'connected',
158
- CONNECTING = 'connecting',
159
- REACHABLE = 'reachable',
160
- INSTALLED = 'installed',
161
- ACCOUNTS = 'accounts',
162
- NETWORK = 'network',
163
- // Hub only events
164
- NAMESPACE_DISCONNECTED = 'namespace_disconnected',
165
-
166
- PROVIDER_DISCONNECTED = 'provider_disconnected',
167
- }
168
-
169
- export type ProviderConnectResult = {
170
- accounts: string[];
171
- chainId: string;
172
- derivationPath?: string;
173
- };
174
-
175
- export type GetInstanceOptions = {
176
- network?: Network;
177
- currentProvider: InstanceType;
178
- meta: BlockchainMeta[];
179
- getState: () => WalletState;
180
- /**
181
- * We always get the instance once and reuse it whenever we needs. By using this option
182
- * We can force the library to get a new instance and replace it with the old one.
183
- *
184
- * Originally, we used this option for wallet connect 1 and its switching network challenge.
185
- */
186
- force?: boolean;
187
- updateChainId: (chainId: number | string) => void;
188
- };
189
-
190
- export type GetInstance =
191
- | (() => InstanceType)
192
- | ((options: GetInstanceOptions) => Promise<InstanceType>);
193
-
194
- export type TryGetInstance =
195
- | (() => InstanceType)
196
- | ((
197
- options: Pick<GetInstanceOptions, 'force' | 'network'>,
198
- ) => Promise<InstanceType>);
199
-
200
- export type Connect = (options: {
201
- instance: InstanceType;
202
- network?: Network;
203
- meta: BlockchainMeta[];
204
- namespaces?: NamespaceData[];
205
- }) => Promise<ProviderConnectResult | ProviderConnectResult[]>;
206
-
207
- export type Disconnect = (options: {
208
- instance: InstanceType;
209
- destroyInstance: () => void;
210
- }) => Promise<void>;
211
-
212
- type CleanupSubscribe = () => void;
213
-
214
- export type Subscribe = (options: {
215
- instance: InstanceType;
216
- state: WalletState;
217
- meta: BlockchainMeta[];
218
- updateChainId: (chainId: string) => void;
219
- updateAccounts: (accounts: string[], chainId?: string) => void;
220
- connect: (network?: Network) => void;
221
- disconnect: () => void;
222
- }) => CleanupSubscribe | void;
223
-
224
- export type SwitchNetwork = (options: {
225
- instance: InstanceType;
226
- network: Network;
227
- meta: BlockchainMeta[];
228
- newInstance?: TryGetInstance;
229
- getState?: () => WalletState;
230
- updateChainId: (chainId: string) => void;
231
- }) => Promise<void>;
232
-
233
- export type Suggest = (options: {
234
- instance: InstanceType;
235
- network: Network;
236
- meta: BlockchainMeta[];
237
- }) => Promise<void>;
238
-
239
- export type CanSwitchNetwork = (options: {
240
- network: Network;
241
- meta: BlockchainMeta[];
242
- provider: InstanceType;
243
- }) => boolean;
244
-
245
- export type CanEagerConnect = (options: {
246
- instance: InstanceType;
247
- meta: BlockchainMeta[];
248
- }) => Promise<boolean>;
249
-
250
- export type EagerConnectResult<I = unknown> = {
251
- accounts: string[] | null;
252
- network: string | null;
253
- provider: I | null;
254
- };
255
-
256
- export interface WalletActions {
257
- connect: Connect;
258
- getInstance: InstanceType;
259
- disconnect?: Disconnect;
260
- subscribe?: Subscribe;
261
- // unsubscribe, // coupled to subscribe.
262
-
263
- // Optional, but should be provided at the same time.
264
- suggest?: Suggest;
265
- switchNetwork?: SwitchNetwork;
266
- getSigners: (provider: InstanceType) => Promise<SignerFactory>;
267
- canSwitchNetworkTo?: CanSwitchNetwork;
268
- canEagerConnect?: CanEagerConnect;
269
- getWalletInfo(allBlockChains: BlockchainMeta[]): WalletInfo;
270
- }
271
-
272
- export interface WalletConfig {
273
- type: WalletType;
274
- defaultNetwork?: Network;
275
- checkInstallation?: boolean;
276
- isAsyncInstance?: boolean;
277
- isAsyncSwitchNetwork?: boolean;
278
- }
279
-
280
- export type WalletProviders = Map<
281
- WalletType,
282
- {
283
- actions: WalletActions;
284
- config: WalletConfig;
285
- }
286
- >;
287
-
288
- export type ProviderInterface = { config: WalletConfig } & WalletActions;
289
-
290
- // it comes from wallets.ts and `connect`
291
- type NetworkTypeFromLegacyConnect = Network | undefined;
292
-
293
- export type NamespaceInputForConnect<T extends Namespace = Namespace> = {
294
- /**
295
- * By default, you should specify namespace (e.g. evm).
296
- */
297
- namespace: T;
298
- /**
299
- * In some cases, we need to connect a specific network on a namespace. e.g. Polygon on EVM.
300
- */
301
- network: NetworkTypeFromLegacyConnect;
302
- derivationPath?: string;
303
- };