@sodax/wallet-sdk-react 2.0.0-rc.2 → 2.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -5
- package/dist/{chunk-BKJB527E.mjs → chunk-3QETHO6P.mjs} +1 -3
- package/dist/{chunk-PJLEJVAU.mjs → chunk-42LTUHMZ.mjs} +1 -3
- package/dist/{chunk-NY7U7OJW.mjs → chunk-7V7O3Q7Y.mjs} +0 -2
- package/dist/{chunk-BXJLBR4G.mjs → chunk-C6M34IVL.mjs} +2 -4
- package/dist/{chunk-XZ7CHO2S.mjs → chunk-FSOGMSJH.mjs} +2 -4
- package/dist/{chunk-X2MHIWXO.mjs → chunk-IFXZQW4C.mjs} +0 -2
- package/dist/{chunk-7ULB6DW4.mjs → chunk-JQ4H4GJ5.mjs} +3 -5
- package/dist/{chunk-N5A2TMF6.mjs → chunk-LKSSME2J.mjs} +2 -4
- package/dist/{chunk-PLCA4ZDJ.mjs → chunk-LUKR7YKV.mjs} +54 -30
- package/dist/{chunk-MXZVF5HR.mjs → chunk-NAKCAL2M.mjs} +0 -2
- package/dist/chunk-QMXBY3UI.mjs +1 -0
- package/dist/{chunk-MAQ47Q52.mjs → chunk-TACW7Z4D.mjs} +0 -2
- package/dist/{chunk-2BOUGCJ7.mjs → chunk-WPZOLGVB.mjs} +4 -6
- package/dist/{chunk-66BAUK56.mjs → chunk-X7BHR7WS.mjs} +2 -4
- package/dist/{chunk-E5IAZ7E6.mjs → chunk-Z5GXDHGL.mjs} +9 -5
- package/dist/{config-OlnzyEUE.d.ts → config-GVKK8IfY.d.ts} +6 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.mjs +20 -31
- package/dist/xchains/bitcoin/index.mjs +14 -16
- package/dist/xchains/evm/index.d.ts +1 -1
- package/dist/xchains/evm/index.mjs +3 -5
- package/dist/xchains/icon/index.mjs +5 -7
- package/dist/xchains/injective/index.mjs +3 -5
- package/dist/xchains/near/index.mjs +4 -6
- package/dist/xchains/solana/index.mjs +5 -7
- package/dist/xchains/stacks/index.mjs +3 -5
- package/dist/xchains/stellar/index.mjs +4 -6
- package/dist/xchains/sui/index.mjs +5 -7
- package/docs/ADDING_A_NEW_CHAIN.md +1 -1
- package/docs/SUB_PATH_EXPORTS.md +14 -42
- package/package.json +32 -23
- package/ai-exported/AGENTS.md +0 -122
- package/ai-exported/integration/README.md +0 -102
- package/ai-exported/integration/ai-rules.md +0 -136
- package/ai-exported/integration/architecture.md +0 -181
- package/ai-exported/integration/examples/01-minimal-evm.tsx +0 -75
- package/ai-exported/integration/examples/02-multi-chain-modal.tsx +0 -169
- package/ai-exported/integration/examples/03-nextjs-app-router.tsx +0 -99
- package/ai-exported/integration/examples/04-walletconnect-setup.tsx +0 -89
- package/ai-exported/integration/examples/README.md +0 -29
- package/ai-exported/integration/recipes/batch-operations.md +0 -223
- package/ai-exported/integration/recipes/bridge-to-sdk.md +0 -164
- package/ai-exported/integration/recipes/chain-detection.md +0 -254
- package/ai-exported/integration/recipes/connect-button.md +0 -156
- package/ai-exported/integration/recipes/multi-chain-modal.md +0 -199
- package/ai-exported/integration/recipes/setup.md +0 -158
- package/ai-exported/integration/recipes/sign-message.md +0 -137
- package/ai-exported/integration/recipes/sub-path-imports.md +0 -95
- package/ai-exported/integration/recipes/switch-chain.md +0 -141
- package/ai-exported/integration/recipes/walletconnect-setup.md +0 -139
- package/ai-exported/integration/reference/api-surface.md +0 -175
- package/ai-exported/integration/reference/chain-support.md +0 -78
- package/ai-exported/integration/reference/connectors.md +0 -74
- package/ai-exported/integration/reference/hooks.md +0 -204
- package/ai-exported/integration/reference/wallet-brands.md +0 -106
- package/ai-exported/migration/README.md +0 -49
- package/ai-exported/migration/ai-rules.md +0 -144
- package/ai-exported/migration/breaking-changes.md +0 -305
- package/ai-exported/migration/checklist.md +0 -159
- package/ai-exported/migration/recipes/connect-button.md +0 -166
- package/ai-exported/migration/recipes/multi-chain-modal.md +0 -244
- package/ai-exported/migration/recipes/ssr-setup.md +0 -162
- package/ai-exported/migration/recipes/walletconnect-migration.md +0 -168
- package/ai-exported/migration/reference/components.md +0 -73
- package/ai-exported/migration/reference/config.md +0 -307
- package/ai-exported/migration/reference/hooks.md +0 -278
- package/ai-exported/migration/reference/imports.md +0 -157
- package/dist/chunk-2BOUGCJ7.mjs.map +0 -1
- package/dist/chunk-66BAUK56.mjs.map +0 -1
- package/dist/chunk-7ULB6DW4.mjs.map +0 -1
- package/dist/chunk-BKJB527E.mjs.map +0 -1
- package/dist/chunk-BXJLBR4G.mjs.map +0 -1
- package/dist/chunk-E5IAZ7E6.mjs.map +0 -1
- package/dist/chunk-MAQ47Q52.mjs.map +0 -1
- package/dist/chunk-MXZVF5HR.mjs.map +0 -1
- package/dist/chunk-N5A2TMF6.mjs.map +0 -1
- package/dist/chunk-NY7U7OJW.mjs.map +0 -1
- package/dist/chunk-PJLEJVAU.mjs.map +0 -1
- package/dist/chunk-PLCA4ZDJ.mjs.map +0 -1
- package/dist/chunk-TZMKDXFA.mjs +0 -3
- package/dist/chunk-TZMKDXFA.mjs.map +0 -1
- package/dist/chunk-X2MHIWXO.mjs.map +0 -1
- package/dist/chunk-XZ7CHO2S.mjs.map +0 -1
- package/dist/index.cjs +0 -3337
- package/dist/index.cjs.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/xchains/bitcoin/index.cjs +0 -1927
- package/dist/xchains/bitcoin/index.cjs.map +0 -1
- package/dist/xchains/bitcoin/index.mjs.map +0 -1
- package/dist/xchains/evm/index.cjs +0 -316
- package/dist/xchains/evm/index.cjs.map +0 -1
- package/dist/xchains/evm/index.mjs.map +0 -1
- package/dist/xchains/icon/index.cjs +0 -311
- package/dist/xchains/icon/index.cjs.map +0 -1
- package/dist/xchains/icon/index.mjs.map +0 -1
- package/dist/xchains/injective/index.cjs +0 -223
- package/dist/xchains/injective/index.cjs.map +0 -1
- package/dist/xchains/injective/index.mjs.map +0 -1
- package/dist/xchains/near/index.cjs +0 -190
- package/dist/xchains/near/index.cjs.map +0 -1
- package/dist/xchains/near/index.mjs.map +0 -1
- package/dist/xchains/solana/index.cjs +0 -186
- package/dist/xchains/solana/index.cjs.map +0 -1
- package/dist/xchains/solana/index.mjs.map +0 -1
- package/dist/xchains/stacks/index.cjs +0 -240
- package/dist/xchains/stacks/index.cjs.map +0 -1
- package/dist/xchains/stacks/index.mjs.map +0 -1
- package/dist/xchains/stellar/index.cjs +0 -322
- package/dist/xchains/stellar/index.cjs.map +0 -1
- package/dist/xchains/stellar/index.mjs.map +0 -1
- package/dist/xchains/sui/index.cjs +0 -248
- package/dist/xchains/sui/index.cjs.map +0 -1
- package/dist/xchains/sui/index.mjs.map +0 -1
- package/skills/SKILLS.md +0 -84
- package/skills/bridge-to-sdk.md +0 -148
- package/skills/connect-button.md +0 -116
- package/skills/evm-only-walletconnect.md +0 -111
- package/skills/multi-chain-modal.md +0 -178
- package/skills/setup.md +0 -107
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# Reference: Import Path Map
|
|
2
|
-
|
|
3
|
-
Mechanical import-path replacements for v1 → v2. The package name (`@sodax/wallet-sdk-react`) is unchanged. See [`../breaking-changes.md`](../breaking-changes.md) §5 for the WHY behind concrete-class sub-path imports.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Store hook removed from the public API
|
|
8
|
-
|
|
9
|
-
v1 exported the Zustand store hook (`useXWagmiStore`) from the package barrel. **v2 does not export the store hook at all** — direct store access is no longer supported. The localStorage key (`xwagmi-store`) is unchanged, so user connections survive the upgrade.
|
|
10
|
-
|
|
11
|
-
For each `useXWagmiStore(state => state.X)` selector, replace with the equivalent public hook below. **Do not rename to `useXWalletStore`** — the v2 barrel does not export it.
|
|
12
|
-
|
|
13
|
-
### Field-to-hook map
|
|
14
|
-
|
|
15
|
-
| v1 selector | v2 replacement |
|
|
16
|
-
|---|---|
|
|
17
|
-
| `state.xServices` (whole map) | `useXServices()` |
|
|
18
|
-
| `state.xServices[chainType]` (per chain) | `useXService({ xChainType })` |
|
|
19
|
-
| `state.xConnections` (whole map) | `useXConnections()` |
|
|
20
|
-
| `state.xConnections[chainType]` (per chain) | `useXConnection({ xChainType })` |
|
|
21
|
-
| `state.setXConnection` | not a public mutation — use `useXConnect()` (mutation hook) |
|
|
22
|
-
| `state.unsetXConnection` | not a public mutation — use `useXDisconnect()` |
|
|
23
|
-
|
|
24
|
-
```diff
|
|
25
|
-
- // v1 ❌
|
|
26
|
-
- import { useXWagmiStore } from '@sodax/wallet-sdk-react';
|
|
27
|
-
- const xServices = useXWagmiStore(state => state.xServices);
|
|
28
|
-
+ // v2 ✅ — public hook, no store access
|
|
29
|
-
+ import { useXServices } from '@sodax/wallet-sdk-react';
|
|
30
|
-
+ const xServices = useXServices();
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### Decision tree — `useXWagmiStore` selector handling
|
|
34
|
-
|
|
35
|
-
For each occurrence of `useXWagmiStore(state => state.X)`:
|
|
36
|
-
|
|
37
|
-
1. **Is `X` a public-hook-equivalent read** (`xServices`, `xConnections`, or per-chain access of either)?
|
|
38
|
-
→ Replace with the public hook from the table. Drop the `useXWagmiStore` import.
|
|
39
|
-
2. **Is `X` a mutation** (`setXConnection`, `unsetXConnection`) **or a v2-internal field** (`enabledChains`, `chainActions`, `walletProviders`, `xConnectorsByChain`)?
|
|
40
|
-
→ STOP. The user's code is poking at internal API or was hand-edited mid-migration. Ask the user before changing.
|
|
41
|
-
3. **Anything else** (typo, removed v1 field)?
|
|
42
|
-
→ STOP. Ask user.
|
|
43
|
-
|
|
44
|
-
### Worked example
|
|
45
|
-
|
|
46
|
-
```ts
|
|
47
|
-
// v1 ❌ — direct store read
|
|
48
|
-
const xServices = useXWagmiStore(state => state.xServices);
|
|
49
|
-
|
|
50
|
-
// v2 ✅ — public hook (no store access)
|
|
51
|
-
const xServices = useXServices();
|
|
52
|
-
|
|
53
|
-
// 🛑 STOP — mutation through store; v2 does not expose this on a hook
|
|
54
|
-
const setConn = useXWagmiStore(state => state.setXConnection);
|
|
55
|
-
// → Ask user. Likely they want useXConnect()'s mutation instead.
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Always prefer public hooks (`useXService`, `useXServices`, `useXConnection`, `useXConnections`, `useEnabledChains`, `useWalletProvider`) over store reads — see [`../../integration/reference/hooks.md`](../../integration/reference/hooks.md).
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## Concrete chain classes — moved behind sub-path imports
|
|
63
|
-
|
|
64
|
-
v1 re-exported every concrete `XService` / `XConnector` subclass from the package barrel. v2's barrel exports only types, hooks, abstractions, and `SodaxWalletProvider`.
|
|
65
|
-
|
|
66
|
-
| Concrete class | v1 import path | v2 import path |
|
|
67
|
-
|---|---|---|
|
|
68
|
-
| `EvmXService`, `EvmXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/evm` |
|
|
69
|
-
| `SolanaXService`, `SolanaXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/solana` |
|
|
70
|
-
| `SuiXService`, `SuiXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/sui` |
|
|
71
|
-
| `BitcoinXService`, `UnisatXConnector`, `XverseXConnector`, `OKXXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/bitcoin` |
|
|
72
|
-
| `StellarXService`, `StellarWalletsKitXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/stellar` |
|
|
73
|
-
| `InjectiveXService`, `InjectiveXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/injective` |
|
|
74
|
-
| `IconXService`, `IconHanaXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/icon` |
|
|
75
|
-
| `NearXService`, `NearXConnector` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/near` |
|
|
76
|
-
| `StacksXService`, `StacksXConnector`, `STACKS_PROVIDERS` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react/xchains/stacks` |
|
|
77
|
-
|
|
78
|
-
### Examples
|
|
79
|
-
|
|
80
|
-
```diff
|
|
81
|
-
- // v1 ❌ — all concrete classes from barrel
|
|
82
|
-
- import {
|
|
83
|
-
- EvmXService,
|
|
84
|
-
- XverseXConnector,
|
|
85
|
-
- IconHanaXConnector,
|
|
86
|
-
- } from '@sodax/wallet-sdk-react';
|
|
87
|
-
+ // v2 ✅ — sub-path per chain
|
|
88
|
-
+ import { EvmXService } from '@sodax/wallet-sdk-react/xchains/evm';
|
|
89
|
-
+ import { XverseXConnector } from '@sodax/wallet-sdk-react/xchains/bitcoin';
|
|
90
|
-
+ import { IconHanaXConnector } from '@sodax/wallet-sdk-react/xchains/icon';
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Type imports also use sub-path
|
|
94
|
-
|
|
95
|
-
Even when you only need a **type** (not the runtime class), the v2 barrel does not re-export concrete chain types. Use the sub-path import with `import type`:
|
|
96
|
-
|
|
97
|
-
```diff
|
|
98
|
-
- // v1 ❌
|
|
99
|
-
- import { type StellarXService, useXService } from '@sodax/wallet-sdk-react';
|
|
100
|
-
+ // v2 ✅ — sub-path import for both type and runtime
|
|
101
|
-
+ import type { StellarXService } from '@sodax/wallet-sdk-react/xchains/stellar';
|
|
102
|
-
+ import type { XverseXConnector, BtcWalletAddressType } from '@sodax/wallet-sdk-react/xchains/bitcoin';
|
|
103
|
-
+ import { useXService } from '@sodax/wallet-sdk-react';
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
`import type` from sub-paths is **erased at build time** — no runtime cost. Use it freely for type annotations, `as`, generics, etc.
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## Hooks — same package, same names (signatures changed)
|
|
111
|
-
|
|
112
|
-
| Hook | v1 path | v2 path | Signature changed? |
|
|
113
|
-
|---|---|---|---|
|
|
114
|
-
| `useXAccount` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes — see [`hooks.md`](./hooks.md) |
|
|
115
|
-
| `useXAccounts` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | no |
|
|
116
|
-
| `useXConnect` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | no |
|
|
117
|
-
| `useXConnection` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes |
|
|
118
|
-
| `useXConnectors` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes |
|
|
119
|
-
| `useXDisconnect` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes — returned function now takes `{ xChainType }` object (was positional) |
|
|
120
|
-
| `useXService` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes |
|
|
121
|
-
| `useWalletProvider` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes |
|
|
122
|
-
| `useXSignMessage` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | no |
|
|
123
|
-
| `useEvmSwitchChain` | `@sodax/wallet-sdk-react` | `@sodax/wallet-sdk-react` | yes — now takes `{ xChainId }`, returns `{ isWrongChain, handleSwitchChain }` |
|
|
124
|
-
|
|
125
|
-
For signature changes see [`hooks.md`](./hooks.md).
|
|
126
|
-
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
## Removed in v2
|
|
130
|
-
|
|
131
|
-
| Symbol | v1 path | Replacement |
|
|
132
|
-
|---|---|---|
|
|
133
|
-
| `useXBalances` | `@sodax/wallet-sdk-react` | Moved to `@sodax/dapp-kit` with a new signature (`{ params: { xService, xChainId, xTokens, address } }`). See [`../breaking-changes.md`](../breaking-changes.md) §10. |
|
|
134
|
-
| `useEthereumChainId` | `@sodax/wallet-sdk-react` | Internal in v2. Use `useAccount().chainId` from `wagmi` for the raw EVM chain ID, or `useEvmSwitchChain({ xChainId })` if you only needed it for "wrong network" UX. See [`hooks.md`](./hooks.md) § `useEthereumChainId`. |
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## Added in v2 (informational — no v1 to migrate from)
|
|
139
|
-
|
|
140
|
-
These are new exports — no v1 import to replace, but knowing they exist may let you simplify hand-rolled v1 code during migration:
|
|
141
|
-
|
|
142
|
-
| New hook / utility | Path | Purpose |
|
|
143
|
-
|---|---|---|
|
|
144
|
-
| `useWalletModal` | `@sodax/wallet-sdk-react` | Headless modal state machine |
|
|
145
|
-
| `useConnectionFlow` | `@sodax/wallet-sdk-react` | `connect + status + retry` without modal |
|
|
146
|
-
| `useBatchConnect` | `@sodax/wallet-sdk-react` | Sequential connect across multiple connectors |
|
|
147
|
-
| `useBatchDisconnect` | `@sodax/wallet-sdk-react` | Mirror of `useBatchConnect` |
|
|
148
|
-
| `useChainGroups` | `@sodax/wallet-sdk-react` | One row per enabled chain (EVM collapses) |
|
|
149
|
-
| `useConnectedChains` | `@sodax/wallet-sdk-react` | Aggregate connected view + hydration `status` |
|
|
150
|
-
| `useEnabledChains` | `@sodax/wallet-sdk-react` | List of chain types enabled in config |
|
|
151
|
-
| `useIsWalletInstalled` | `@sodax/wallet-sdk-react` | Cross-chain install check |
|
|
152
|
-
| `useXConnections` | `@sodax/wallet-sdk-react` | All connections (plural) |
|
|
153
|
-
| `useXConnectorsByChain` | `@sodax/wallet-sdk-react` | Multi-chain connector list (no per-chain warnings) |
|
|
154
|
-
| `useXServices` | `@sodax/wallet-sdk-react` | All services (plural) |
|
|
155
|
-
| `sortConnectors` | `@sodax/wallet-sdk-react` | Helper: preferred → installed → original |
|
|
156
|
-
| `getXChainType` | `@sodax/wallet-sdk-react` | Imperative: map a `SpokeChainKey` to its `ChainType` family. Common pattern: `useXService({ xChainType: getXChainType(srcChainKey) })` when you only have a chain key on hand. |
|
|
157
|
-
| `getXService` | `@sodax/wallet-sdk-react` | Imperative variant of `useXService` for non-React call sites (e.g. inside event handlers that don't re-render). Prefer `useXService` in component bodies. |
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/icon/IconXService.ts","../src/xchains/icon/iconex/index.tsx","../src/xchains/icon/IconHanaXConnector.ts"],"names":["SupportedChainId"],"mappings":"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","file":"chunk-2BOUGCJ7.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport type { IconService } from 'icon-sdk-js';\nimport * as IconSdkRaw from 'icon-sdk-js';\nimport type { XToken } from '@sodax/types';\nimport { isNativeToken } from '@/utils/index.js';\n\nconst IconSdk = ('default' in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw) as typeof IconSdkRaw;\nconst { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;\nexport interface CallData {\n target: string;\n method: string;\n params: string[];\n}\n\nexport enum SupportedChainId {\n MAINNET = 1,\n}\n\ninterface ChainInfo {\n readonly name: string;\n readonly node: string;\n readonly APIEndpoint: string;\n readonly debugAPIEndpoint: string;\n readonly chainId: number;\n readonly tracker: string;\n}\n\nexport const CHAIN_INFO: { readonly [chainId: number]: ChainInfo } = {\n [SupportedChainId.MAINNET]: {\n name: 'ICON Mainnet',\n node: 'https://ctz.solidwallet.io',\n APIEndpoint: 'https://ctz.solidwallet.io/api/v3',\n debugAPIEndpoint: 'https://api.icon.community/api/v3d',\n chainId: 1,\n tracker: 'https://tracker.icon.community',\n },\n};\n\nexport class IconXService extends XService {\n private static instance: IconXService;\n\n public iconService: IconService;\n\n private constructor(rpcUrl?: string) {\n super('ICON');\n const mainnetInfo = CHAIN_INFO[SupportedChainId.MAINNET];\n if (!mainnetInfo) throw new Error('ICON mainnet chain info not found');\n this.iconService = new IconServiceConstructor(\n new IconServiceConstructor.HttpProvider(rpcUrl ?? mainnetInfo.APIEndpoint),\n );\n }\n\n public static getInstance(rpcUrl?: string): IconXService {\n if (!IconXService.instance) {\n IconXService.instance = new IconXService(rpcUrl);\n }\n return IconXService.instance;\n }\n\n private async getAggregateData(requireSuccess: boolean, calls: CallData[]) {\n const rawTx = new IconBuilder.CallBuilder()\n // muticall address on mainnet\n .to('cxa4aa9185e23558cff990f494c1fd2845f6cbf741')\n .method('tryAggregate')\n .params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls })\n .build();\n\n try {\n const result = await this.iconService.call(rawTx).execute();\n const aggs = result['returnData'];\n\n const data = aggs.map((agg: Record<string, string>) => {\n if (agg['success'] === '0x0') {\n return null;\n }\n return agg['returnData'];\n });\n\n return data;\n } catch (err) {\n console.error(err);\n return Array(calls.length).fill(null);\n }\n }\n\n override async getBalances(address: string | undefined, xTokens: XToken[]) {\n if (!address) return {};\n\n const balances: Record<string, bigint> = {};\n\n const nativeXToken = xTokens.find(xToken => isNativeToken(xToken));\n const nonNativeXTokens = xTokens.filter(xToken => !isNativeToken(xToken));\n\n if (nativeXToken) {\n const balance = await this.iconService.getBalance(address).execute();\n balances[nativeXToken.address] = BigInt(balance.toFixed());\n }\n\n const cds: CallData[] = nonNativeXTokens.map(token => {\n return {\n target: token.address,\n method: 'balanceOf',\n params: [address],\n };\n });\n\n const data: (string | null)[] = await this.getAggregateData(\n false,\n cds.filter(cd => cd.target.startsWith('cx')),\n );\n\n return nonNativeXTokens.reduce((agg, token, idx) => {\n const balance = data[idx];\n if (balance) {\n balances[token.address] = BigInt(balance);\n }\n\n return agg;\n }, balances);\n }\n}\n","const ICONEX_RELAY_RESPONSE = 'ICONEX_RELAY_RESPONSE';\nconst ICONEX_RELAY_REQUEST = 'ICONEX_RELAY_REQUEST';\n\nexport enum ICONexRequestEventType {\n REQUEST_HAS_ACCOUNT = 'REQUEST_HAS_ACCOUNT',\n REQUEST_HAS_ADDRESS = 'REQUEST_HAS_ADDRESS',\n REQUEST_ADDRESS = 'REQUEST_ADDRESS',\n REQUEST_JSON = 'REQUEST_JSON',\n REQUEST_SIGNING = 'REQUEST_SIGNING',\n}\n\nexport enum ICONexResponseEventType {\n RESPONSE_HAS_ACCOUNT = 'RESPONSE_HAS_ACCOUNT',\n RESPONSE_HAS_ADDRESS = 'RESPONSE_HAS_ADDRESS',\n RESPONSE_ADDRESS = 'RESPONSE_ADDRESS',\n RESPONSE_JSON = 'RESPONSE_JSON',\n RESPONSE_SIGNING = 'RESPONSE_SIGNING',\n}\n\nexport interface ICONexRequestEvent {\n type: ICONexRequestEventType;\n // Request payload varies by event type (JSON-RPC params, signing data, etc).\n // `unknown` forces callers to validate before using — safer than `any`.\n payload?: unknown;\n}\n\nexport interface ICONexResponseEvent {\n type: ICONexResponseEventType;\n // Response payload is always a string: wallet address, tx hash, or signature.\n payload?: string;\n}\n\nexport type ICONexEvent = ICONexRequestEvent | ICONexResponseEvent;\n\nexport const request = (event: ICONexRequestEvent): Promise<ICONexResponseEvent> => {\n return new Promise((resolve, reject) => {\n // evt is a CustomEvent dispatched by the ICONex/Hana extension. Type the handler\n // param so evt.detail is properly typed instead of implicit `any`.\n const handler = (evt: Event) => {\n window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);\n resolve((evt as CustomEvent<ICONexResponseEvent>).detail);\n };\n\n window.addEventListener(ICONEX_RELAY_RESPONSE, handler);\n window.dispatchEvent(\n new CustomEvent(ICONEX_RELAY_REQUEST, {\n detail: event,\n }),\n );\n });\n};\n","import type { XAccount } from '@/types/index.js';\nimport { ICONexRequestEventType, ICONexResponseEventType, request } from './iconex/index.js';\n\nimport { XConnector } from '@/core/XConnector.js';\nimport { assert, hasBooleanProperty, isRecord } from '@/shared/guards.js';\nimport { WALLET_METADATA } from '@/constants.js';\n\nconst isHanaWallet = (value: unknown): value is { available?: boolean } => {\n return isRecord(value) && (value.available === undefined || hasBooleanProperty(value, 'available'));\n};\n\nexport class IconHanaXConnector extends XConnector {\n constructor() {\n super('ICON', 'Hana Wallet', 'hana');\n }\n\n public override get isInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n const hanaWallet = (window as unknown as Record<string, unknown>).hanaWallet;\n return isHanaWallet(hanaWallet) && hanaWallet.available === true;\n }\n\n public override get installUrl(): string {\n return WALLET_METADATA.hana.installUrl;\n }\n\n async connect(): Promise<XAccount | undefined> {\n const hanaWallet = (window as unknown as Record<string, unknown>).hanaWallet;\n assert(isHanaWallet(hanaWallet) || hanaWallet === undefined, '[IconHanaXConnector] invalid window.hanaWallet type');\n\n if (!hanaWallet || !hanaWallet.available) {\n window.open(WALLET_METADATA.hana.installUrl, '_blank', 'noopener,noreferrer');\n return;\n }\n\n const detail = await request({\n type: ICONexRequestEventType.REQUEST_ADDRESS,\n });\n\n if (detail?.type === ICONexResponseEventType.RESPONSE_ADDRESS) {\n return {\n address: detail?.payload,\n xChainType: this.xChainType,\n };\n }\n\n console.warn('[IconHanaXConnector] connect: unexpected response from Hana wallet', detail);\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n console.log('HanaIconXConnector disconnected');\n }\n\n public override get icon(): string {\n return WALLET_METADATA.hana.icon;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/stellar/CustomSorobanServer.ts","../src/xchains/stellar/utils.ts","../src/xchains/stellar/StellarXService.ts","../src/xchains/stellar/StellarWalletsKitXConnector.ts"],"names":["rpc"],"mappings":";;;;;;AASA,IAAM,mBAAA,GAAN,cAAkC,GAAA,CAAI,MAAA,CAAO;AAAA,EAC1B,aAAA;AAAA,EAEjB,WAAA,CAAY,WAAmB,aAAA,EAAuC;AACpE,IAAA,KAAA,CAAM,SAAA,EAAW;AAAA,MACf,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA,EAEA,MAAe,oBACb,EAAA,EAC8C;AAC9C,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,IAAA,CAAK;AAAA,OACV;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,EAAA,EAAI,CAAA;AAAA,QACJ,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,qBAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,WAAA,EAAa,GAAG,KAAA;AAAM;AACxB,OACD;AAAA,KACH;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,SAAS,IAAI,cAAc,CAAA;AAChE,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACxE;AAEA,IAAA,OAAO,QAAA,CAAS,MAAK,CAAE,IAAA,CAAK,UAAQ,GAAA,CAAI,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACzE;AAAA,EAEA,MAAe,gBAAgB,EAAA,EAAgF;AAC7G,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,IAAA,CAAK;AAAA,OACV;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,EAAA,EAAI,CAAA;AAAA,QACJ,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,iBAAA;AAAA,QACR,MAAA,EAAQ;AAAA,UACN,WAAA,EAAa,GAAG,KAAA;AAAM;AACxB,OACD;AAAA,KACH;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,SAAS,IAAI,cAAc,CAAA;AAChE,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,OAAO,SAAS,IAAA,EAAK,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,MAAM,CAAA;AAAA,EACjD;AAAA,EAEA,MAAe,eAAe,IAAA,EAAuD;AACnF,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,IAAA,CAAK;AAAA,OACV;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,EAAA,EAAI,CAAA;AAAA,QACJ,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,gBAAA;AAAA,QACR,MAAA,EAAQ,EAAE,IAAA;AAAK,OAChB;AAAA,KACH;AAEA,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,SAAS,IAAI,cAAc,CAAA;AAChE,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,SAAS,IAAA,EAAK,CAAE,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,MAAM,CAAA;AAAA,EACjD;AACF,CAAA;AAEA,IAAO,2BAAA,GAAQ,mBAAA;AC5ER,IAAM,iBAAiB,CAAC,OAAA,KAAoB,IAAI,OAAA,CAAQ,OAAO,EAAE,OAAA,EAAQ;AAEzE,IAAM,aAAa,CACxB,EAAA,EACA,MAAA,KACiD,MAAA,CAAO,oBAAoB,EAAE,CAAA;AAEzE,IAAM,eAAA,GAAkB,OAC7B,OAAA,EACA,OAAA,EACA,WACA,MAAA,KACG;AACH,EAAA,MAAM,MAAA,GAAS,CAAC,cAAA,CAAe,OAAO,CAAC,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,OAAO,CAAA;AACrC,EAAA,MAAM,EAAA,GAAK,SAAA,CACR,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,SAAA,EAAW,GAAG,MAAM,CAAC,CAAA,CAChD,UAAA,CAAW,eAAe,EAC1B,KAAA,EAAM;AAET,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,EAAA,EAAI,MAAM,CAAA;AAG1C,EAAA,IAAI,CAACA,GAAAA,CAAI,GAAA,CAAI,mBAAA,CAAoB,MAAM,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,KAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,OAAO,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,GAAI,EAAA;AAC/D,CAAA;;;ACpCA,IAAM,4BAAA,GAA+B,GAAA;AAUrC,SAAS,yBAAyB,UAAA,EAA4B;AAC5D,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA,EAAI,MAAA,CAAO,CAAA,EAAG,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACvD,EAAA,OAAO,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B;AAEO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,QAAA,CAAS;AAAA,EAC5C,OAAe,QAAA;AAAA,EAER,UAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EAEC,WAAA,CAAY,eAAwB,aAAA,EAAwB;AAClE,IAAA,KAAA,CAAM,SAAS,CAAA;AAEf,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,iBAAA,CAAkB;AAAA,MACtC,SAAS,aAAA,CAAc,MAAA;AAAA,MACvB,SAAS,eAAA;AAAgB,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS,IAAe,UAAA,CAAA,OAAA,CAAQ,MAAA,CAAO,iBAAiB,+BAAA,EAAiC,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACjH,IAAA,IAAA,CAAK,gBAAgB,IAAI,2BAAA,CAAoB,aAAA,IAAiB,+BAAA,EAAiC,EAAE,CAAA;AAAA,EACnG;AAAA,EAEA,OAAc,WAAA,CAAY,aAAA,EAAwB,aAAA,EAAyC;AACzF,IAAA,IAAI,CAAC,iBAAgB,QAAA,EAAU;AAC7B,MAAA,gBAAA,CAAgB,QAAA,GAAW,IAAI,gBAAA,CAAgB,aAAA,EAAe,aAAa,CAAA;AAAA,IAC7E,CAAA,MAAO;AACL,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,gBAAA,CAAgB,QAAA,CAAS,SAAS,IAAe,UAAA,CAAA,OAAA,CAAQ,OAAO,aAAA,EAAe,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,MACpG;AACA,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,gBAAA,CAAgB,SAAS,aAAA,GAAgB,IAAI,2BAAA,CAAoB,aAAA,EAAe,EAAE,CAAA;AAAA,MACpF;AAAA,IACF;AACA,IAAA,OAAO,gBAAA,CAAgB,QAAA;AAAA,EACzB;AAAA,EAEA,MAAe,UAAA,CAAW,OAAA,EAA6B,MAAA,EAAiC;AACtF,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,MAAA,CAAO,CAAC,CAAA;AAE7B,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,YAAY,OAAO,CAAA;AAE5D,IAAA,IAAI,MAAA,CAAO,WAAW,KAAA,EAAO;AAC3B,MAAA,MAAM,aAAa,cAAA,CAAe,QAAA,CAAS,KAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,eAAe,QAAQ,CAAA;AAC1F,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,iBAAA,GAAoB,wBAAA,CAAyB,UAAA,CAAW,OAAO,CAAA;AACrE,QAAA,MAAM,yBAAA,GAA6B,WAAgD,mBAAA,GAC/E,wBAAA,CAA0B,WAA+C,mBAAmB,CAAA,GAC5F,OAAO,CAAC,CAAA;AACZ,QAAA,MAAM,aAAA,GAAgB,cAAA;AACtB,QAAA,MAAM,aAAA,GAAgB,cAAc,cAAA,IAAkB,CAAA;AACtD,QAAA,MAAM,aAAA,GAAgB,cAAc,cAAA,IAAkB,CAAA;AACtD,QAAA,MAAM,YAAA,GAAe,cAAc,aAAA,IAAiB,CAAA;AAGpD,QAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,aAAA,GAAgB,gBAAgB,YAAY,CAAA;AACjF,QAAA,MAAM,oBACJ,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA,CAAO,4BAA4B,CAAA,GAAI,yBAAA;AAChE,QAAA,MAAM,mBACJ,iBAAA,GAAoB,iBAAA,GAAoB,iBAAA,GAAoB,iBAAA,GAAoB,OAAO,CAAC,CAAA;AAC1F,QAAA,OAAO,gBAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,IAAe,UAAA,CAAA,kBAAA,CAAmB,cAAA,EAAgB;AAAA,UAClE,GAAA,EAAgB,UAAA,CAAA,QAAA;AAAA,UAChB,mBAA8B,UAAA,CAAA,QAAA,CAAS;AAAA,SACxC,CAAA;AAED,QAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,OAAA,EAAS,OAAO,OAAA,EAAS,SAAA,EAAW,KAAK,aAAa,CAAA;AAC5F,QAAA,OAAO,OAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,MAAM,CAAA,uCAAA,EAA0C,MAAA,CAAO,MAAM,CAAA,SAAA,EAAY,CAAC,CAAA,CAAE,CAAA;AAAA,MACtF;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA,EACjB;AACF;;;ACtFO,IAAM,2BAAA,GAAN,cAA0C,UAAA,CAAW;AAAA,EAC1D,OAAA;AAAA,EAEA,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,SAAA,EAAW,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,EAAE,CAAA;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,OAAO,gBAAgB,WAAA,EAAY;AAAA,EACrC;AAAA,EAEA,MAAM,OAAA,GAAyC;AAC7C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA;AAE/B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa;AAM7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,0DAAA,CAA4D,CAAA;AAAA,IAClG;AAEA,IAAA,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAC7B,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,IAAI,UAAA,EAAW;AAEzC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAAC;AAAA,EAEnC,IAAoB,IAAA,GAAe;AACjC,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA,EAEA,IAAoB,WAAA,GAAuB;AACzC,IAAA,OAAO,KAAK,OAAA,CAAQ,WAAA;AAAA,EACtB;AAAA,EAEA,IAAoB,UAAA,GAAiC;AACnD,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA;AAAA,EACtB;AACF","file":"chunk-66BAUK56.mjs","sourcesContent":["import {\n type FeeBumpTransaction,\n type Memo,\n type MemoType,\n type Operation,\n rpc,\n type Transaction,\n} from '@stellar/stellar-sdk';\n\nclass CustomSorobanServer extends rpc.Server {\n private readonly customHeaders: Record<string, string>;\n\n constructor(serverUrl: string, customHeaders: Record<string, string>) {\n super(serverUrl, {\n allowHttp: true,\n });\n this.customHeaders = customHeaders;\n }\n\n override async simulateTransaction(\n tx: Transaction<Memo<MemoType>, Operation[]>,\n ): Promise<rpc.Api.SimulateTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'simulateTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error simulating TX! status: ${response.status}`);\n }\n // Parse raw JSON-RPC payload into the discriminated union expected by callers\n return response.json().then(json => rpc.parseRawSimulation(json.result));\n }\n\n override async sendTransaction(tx: Transaction | FeeBumpTransaction): Promise<rpc.Api.SendTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'sendTransaction',\n params: {\n transaction: tx.toXDR(),\n },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error submitting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n\n override async getTransaction(hash: string): Promise<rpc.Api.GetTransactionResponse> {\n const requestOptions = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.customHeaders,\n },\n body: JSON.stringify({\n id: 1,\n jsonrpc: '2.0',\n method: 'getTransaction',\n params: { hash },\n }),\n };\n\n const response = await fetch(`${this.serverURL}`, requestOptions);\n if (!response.ok) {\n throw new Error(`HTTP error getting TX! status: ${response.status}`);\n }\n return response.json().then(json => json.result);\n }\n}\n\nexport default CustomSorobanServer;\n","import {\n Address,\n Contract,\n type Memo,\n type MemoType,\n type Operation,\n rpc,\n TimeoutInfinite,\n type Transaction,\n type TransactionBuilder,\n scValToBigInt,\n} from '@stellar/stellar-sdk';\nimport type CustomSorobanServer from './CustomSorobanServer.js';\n\nexport const STELLAR_RLP_MSG_TYPE = { type: 'symbol' };\n\n// Can be used whenever you need an Address argument for a contract method\nexport const accountToScVal = (account: string) => new Address(account).toScVal();\n\nexport const simulateTx = (\n tx: Transaction<Memo<MemoType>, Operation[]>,\n server: CustomSorobanServer,\n): Promise<rpc.Api.SimulateTransactionResponse> => server.simulateTransaction(tx);\n\nexport const getTokenBalance = async (\n address: string,\n tokenId: string,\n txBuilder: TransactionBuilder,\n server: CustomSorobanServer,\n) => {\n const params = [accountToScVal(address)];\n const contract = new Contract(tokenId);\n const tx = txBuilder\n .addOperation(contract.call('balance', ...params))\n .setTimeout(TimeoutInfinite)\n .build();\n\n const result = await simulateTx(tx, server);\n\n // Also throws on restore responses — invalid for read-only balance simulation\n if (!rpc.Api.isSimulationSuccess(result)) {\n throw new Error(`Simulation failed: ${JSON.stringify(result)}`);\n }\n\n return result.result ? scValToBigInt(result.result.retval) : 0n;\n};\n","import { XService } from '@/core/XService.js';\nimport { StellarWalletsKit, WalletNetwork, allowAllModules } from '@creit.tech/stellar-wallets-kit';\nimport * as StellarSdk from '@stellar/stellar-sdk';\nimport CustomSorobanServer from './CustomSorobanServer.js';\nimport { getTokenBalance } from './utils.js';\nimport type { XToken } from '@sodax/types';\nimport { STELLAR_DEFAULT_HORIZON_RPC_URL, STELLAR_DEFAULT_SOROBAN_RPC_URL } from '@/constants.js';\n\n/** Base reserve in stroops (0.5 XLM). Each subentry (trustline, signer, data entry, offer) adds one base reserve. */\nconst STELLAR_BASE_RESERVE_STROOPS = 5_000_000;\n\n/** Horizon account fields used for minimum balance. Minimum = (2 + subentry_count + num_sponsoring - num_sponsored) * base_reserve + selling_liabilities. */\ninterface StellarAccountReserveFields {\n subentry_count?: number;\n num_sponsoring?: number;\n num_sponsored?: number;\n}\n\n/** Parse XLM balance string (e.g. \"198.8944970\") to stroops (1 XLM = 10^7 stroops). */\nfunction parseXlmBalanceToStroops(balanceStr: string): bigint {\n const parts = balanceStr.split('.');\n const whole = parts[0] ?? '0';\n const frac = (parts[1] ?? '').padEnd(7, '0').slice(0, 7);\n return BigInt(whole + frac);\n}\n\nexport class StellarXService extends XService {\n private static instance: StellarXService;\n\n public walletsKit: StellarWalletsKit;\n public server: StellarSdk.Horizon.Server;\n public sorobanServer: CustomSorobanServer;\n\n private constructor(horizonRpcUrl?: string, sorobanRpcUrl?: string) {\n super('STELLAR');\n\n this.walletsKit = new StellarWalletsKit({\n network: WalletNetwork.PUBLIC,\n modules: allowAllModules(),\n });\n\n this.server = new StellarSdk.Horizon.Server(horizonRpcUrl ?? STELLAR_DEFAULT_HORIZON_RPC_URL, { allowHttp: true });\n this.sorobanServer = new CustomSorobanServer(sorobanRpcUrl ?? STELLAR_DEFAULT_SOROBAN_RPC_URL, {});\n }\n\n public static getInstance(horizonRpcUrl?: string, sorobanRpcUrl?: string): StellarXService {\n if (!StellarXService.instance) {\n StellarXService.instance = new StellarXService(horizonRpcUrl, sorobanRpcUrl);\n } else {\n if (horizonRpcUrl) {\n StellarXService.instance.server = new StellarSdk.Horizon.Server(horizonRpcUrl, { allowHttp: true });\n }\n if (sorobanRpcUrl) {\n StellarXService.instance.sorobanServer = new CustomSorobanServer(sorobanRpcUrl, {});\n }\n }\n return StellarXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return BigInt(0);\n\n const stellarAccount = await this.server.loadAccount(address);\n\n if (xToken.symbol === 'XLM') {\n const xlmBalance = stellarAccount.balances.find(balance => balance.asset_type === 'native');\n if (xlmBalance) {\n const rawBalanceStroops = parseXlmBalanceToStroops(xlmBalance.balance);\n const sellingLiabilitiesStroops = (xlmBalance as { selling_liabilities?: string }).selling_liabilities\n ? parseXlmBalanceToStroops((xlmBalance as { selling_liabilities: string }).selling_liabilities)\n : BigInt(0);\n const reserveFields = stellarAccount as unknown as StellarAccountReserveFields;\n const subentryCount = reserveFields.subentry_count ?? 0;\n const numSponsoring = reserveFields.num_sponsoring ?? 0;\n const numSponsored = reserveFields.num_sponsored ?? 0;\n // Minimum balance = (2 + subentry_count + num_sponsoring - num_sponsored) * base_reserve + selling_liabilities.\n // When account has sponsored reserves (num_sponsored > 0), those reserves are paid by the sponsor, so we don't subtract them.\n const reserveCount = Math.max(0, 2 + subentryCount + numSponsoring - numSponsored);\n const minBalanceStroops =\n BigInt(reserveCount) * BigInt(STELLAR_BASE_RESERVE_STROOPS) + sellingLiabilitiesStroops;\n const availableStroops =\n rawBalanceStroops > minBalanceStroops ? rawBalanceStroops - minBalanceStroops : BigInt(0);\n return availableStroops;\n }\n } else {\n try {\n const txBuilder = new StellarSdk.TransactionBuilder(stellarAccount, {\n fee: StellarSdk.BASE_FEE,\n networkPassphrase: StellarSdk.Networks.PUBLIC,\n });\n\n const balance = await getTokenBalance(address, xToken.address, txBuilder, this.sorobanServer);\n return balance;\n } catch (e) {\n console.error(`Error while fetching token on Stellar: ${xToken.symbol}, Error: ${e}`);\n }\n }\n\n return BigInt(0);\n }\n}\n","import type { XAccount } from '@/types/index.js';\n\nimport { XConnector } from '@/core/index.js';\nimport { StellarXService } from './StellarXService.js';\n\nexport type StellarWalletType = {\n icon: string;\n id: string;\n isAvailable: boolean;\n name: string;\n type: string;\n url: string;\n};\n\nexport class StellarWalletsKitXConnector extends XConnector {\n _wallet: StellarWalletType;\n\n constructor(wallet: StellarWalletType) {\n super('STELLAR', wallet.name, wallet.id);\n this._wallet = wallet;\n }\n\n getXService(): StellarXService {\n return StellarXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n const kit = this.getXService().walletsKit;\n\n if (!this._wallet) {\n return;\n }\n\n if (!this._wallet.isAvailable) {\n // Throw instead of silently navigating to the install URL — callers\n // that bypass `useWalletModal.selectWallet`'s pre-check otherwise\n // see a tab open with no surfaced error. Consumers read\n // `connector.installUrl` to render the install CTA on the caught\n // error.\n throw new Error(`${this._wallet.name} is not installed. Install the wallet and reload the page.`);\n }\n\n kit.setWallet(this._wallet.id);\n const { address } = await kit.getAddress();\n\n return {\n address: address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {}\n\n public override get icon(): string {\n return this._wallet.icon;\n }\n\n public override get isInstalled(): boolean {\n return this._wallet.isAvailable;\n }\n\n public override get installUrl(): string | undefined {\n return this._wallet.url;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/sui/SuiXService.ts","../src/xchains/sui/SuiXConnector.ts"],"names":[],"mappings":"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","file":"chunk-7ULB6DW4.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport type { XToken, ISuiWalletProvider } from '@sodax/types';\nimport { SuiWalletProvider } from '@sodax/wallet-sdk-core';\nimport { isNativeToken } from '@/utils/index.js';\nimport { assertSuiProviderShape } from '@/shared/guards.js';\n\n// These fields are hydrated by SuiHydrator from @mysten/dapp-kit hooks.\n// We use structural interfaces instead of importing nominal types from @mysten/wallet-standard\n// because dapp-kit may resolve a different version than wallet-sdk-core, causing nominal mismatch.\n// The `getBalance` method is the only field we call directly — the rest are passed through.\ninterface SuiClientLike {\n getBalance(input: { owner: string; coinType: string }): Promise<{ totalBalance: string }>;\n}\n\nexport class SuiXService extends XService {\n private static instance: SuiXService;\n\n // Hydrated by SuiHydrator. Start undefined because wallet may not be connected yet.\n // suiClient is typed structurally for the methods we call directly.\n // suiWallet/suiAccount are opaque — stored and passed through to SuiWalletProvider.\n public suiClient: SuiClientLike | undefined;\n public suiWallet: unknown;\n public suiAccount: unknown;\n\n private constructor() {\n super('SUI');\n }\n\n public static getInstance(): SuiXService {\n if (!SuiXService.instance) {\n SuiXService.instance = new SuiXService();\n }\n return SuiXService.instance;\n }\n\n createWalletProvider(): ISuiWalletProvider | undefined {\n if (!this.suiClient || !this.suiWallet || !this.suiAccount) {\n console.warn(\n '[SuiXService] createWalletProvider: missing dependencies — wallet not connected yet',\n { hasClient: !!this.suiClient, hasWallet: !!this.suiWallet, hasAccount: !!this.suiAccount },\n );\n return undefined;\n }\n\n // Runtime validation before passing data to wallet-sdk-core. This avoids \"trust me bro\" casting.\n // Note: we validate the minimum shape we rely on; the exact nominal types may differ by package version.\n assertSuiProviderShape('SuiXService', this.suiClient, this.suiWallet, this.suiAccount);\n\n // Version mismatch cast: dapp-kit hooks return types from their bundled @mysten/wallet-standard,\n // which differs nominally from wallet-sdk-core's version. Structurally identical at runtime.\n type SuiWalletProviderConfig = ConstructorParameters<typeof SuiWalletProvider>[0];\n return new SuiWalletProvider({\n client: this.suiClient,\n wallet: this.suiWallet,\n account: this.suiAccount,\n } as unknown as SuiWalletProviderConfig);\n }\n\n // getBalance is not used because getBalances uses getAllBalances which returns all balances\n\n override async getBalances(address: string | undefined, xTokens: readonly XToken[]): Promise<Record<string, bigint>> {\n if (!address || !this.suiClient) return {};\n // Capture in local so the closure sees a narrowed (non-undefined) reference.\n const client = this.suiClient;\n try {\n const balancePromises = xTokens.map(async xToken => {\n let coinType = isNativeToken(xToken) ? '0x2::sui::SUI' : xToken.address;\n\n // TODO: hard coded for getting legacy bnUSD balance\n if (\n coinType ===\n '0x03917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR'\n ) {\n coinType =\n '0x3917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR';\n }\n\n const balance = await client.getBalance({\n owner: address,\n coinType: coinType,\n });\n\n return {\n address: xToken.address,\n balance: balance ? BigInt(balance.totalBalance) : undefined,\n };\n });\n\n const results = await Promise.all(balancePromises);\n\n const tokenMap: Record<string, bigint> = {};\n results.forEach(result => {\n if (result.balance !== undefined) {\n tokenMap[result.address] = result.balance;\n }\n });\n\n return tokenMap;\n } catch (error) {\n console.error('[wallet-sdk-react] SUI getBalances failed:', error);\n return {};\n }\n }\n}\n","import type { XAccount } from '@/types/index.js';\n\nimport { XConnector } from '@/core/index.js';\nimport { SuiXService } from './SuiXService.js';\nimport { assert, hasOptionalStringProperty, hasStringProperty, isRecord } from '@/shared/guards.js';\n\n// Structural interface for what we actually use from a Sui wallet.\n// We don't import the nominal type from @mysten/wallet-standard because\n// @mysten/dapp-kit may resolve a different version, causing nominal mismatch.\n// Structural typing avoids this: as long as the object has these fields, it works.\ninterface SuiWalletInfo {\n id?: string;\n name: string;\n icon?: string;\n}\n\nconst isSuiWalletInfo = (value: unknown): value is SuiWalletInfo => {\n return (\n isRecord(value) &&\n hasStringProperty(value, 'name') &&\n // Some wallets may not expose `id` — in that case we fall back to `name` for stability.\n // We still validate if it exists.\n hasOptionalStringProperty(value, 'id') &&\n hasOptionalStringProperty(value, 'icon')\n );\n};\n\nexport class SuiXConnector extends XConnector {\n public readonly wallet: SuiWalletInfo;\n\n constructor(wallet: unknown) {\n assert(isSuiWalletInfo(wallet), '[SuiXConnector] invalid wallet object');\n\n const id = wallet.id ?? wallet.name;\n // After the fallback, `id` is always defined.\n assert(typeof id === 'string' && id.length > 0, '[SuiXConnector] invalid wallet id');\n\n super('SUI', wallet.name, id);\n this.wallet = { id, name: wallet.name, icon: wallet.icon };\n }\n\n getXService(): SuiXService {\n return SuiXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {}\n\n public override get icon(): string | undefined {\n return this.wallet.icon;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/injective/InjectiveXService.ts","../src/xchains/injective/InjectiveXConnector.ts"],"names":["InjectiveChainId"],"mappings":"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","file":"chunk-BKJB527E.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport { Network, getNetworkEndpoints } from '@injectivelabs/networks';\nimport { ChainGrpcWasmApi, IndexerGrpcAccountPortfolioApi } from '@injectivelabs/sdk-ts';\nimport { ChainId as InjectiveChainId } from '@injectivelabs/ts-types';\nimport { MsgBroadcaster } from '@injectivelabs/wallet-core';\nimport type { InjectiveRpcConfig, XToken } from '@sodax/types';\nimport { mainnet } from 'wagmi/chains';\nimport { WalletStrategy } from '@injectivelabs/wallet-strategy';\n\nexport class InjectiveXService extends XService {\n private static instance: InjectiveXService;\n\n public walletStrategy: WalletStrategy;\n public indexerGrpcAccountPortfolioApi: IndexerGrpcAccountPortfolioApi;\n public chainGrpcWasmApi: ChainGrpcWasmApi;\n public msgBroadcaster: MsgBroadcaster;\n\n private constructor(rpcConfig?: InjectiveRpcConfig) {\n super('INJECTIVE');\n\n const defaults = getNetworkEndpoints(Network.Mainnet);\n // Only `indexer` + `grpc` are overridable — the rest of the endpoints object\n // (rest, rpc, explorer, …) keeps the @injectivelabs/networks mainnet defaults.\n // Extend `InjectiveRpcConfig` if more endpoints need to be consumer-configurable.\n const endpoints = {\n ...defaults,\n indexer: rpcConfig?.indexer || defaults.indexer,\n grpc: rpcConfig?.grpc || defaults.grpc,\n };\n\n this.walletStrategy = new WalletStrategy({\n chainId: InjectiveChainId.Mainnet,\n strategies: {},\n evmOptions: {\n evmChainId: mainnet.id,\n rpcUrl: mainnet.rpcUrls.default.http[0],\n },\n });\n\n this.indexerGrpcAccountPortfolioApi = new IndexerGrpcAccountPortfolioApi(endpoints.indexer);\n this.chainGrpcWasmApi = new ChainGrpcWasmApi(endpoints.grpc);\n this.msgBroadcaster = new MsgBroadcaster({\n walletStrategy: this.walletStrategy,\n network: Network.Mainnet,\n endpoints,\n });\n }\n\n /**\n * @param rpcConfig - Only applied on first call. Subsequent calls return the\n * existing instance unchanged — gRPC/Indexer clients are built in the\n * constructor and can't be rebuilt at runtime. Pass the desired endpoints\n * via `SodaxWalletProvider.config.rpcConfig` once at app init.\n */\n public static getInstance(rpcConfig?: InjectiveRpcConfig): InjectiveXService {\n if (!InjectiveXService.instance) {\n InjectiveXService.instance = new InjectiveXService(rpcConfig);\n }\n return InjectiveXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken) {\n if (!address) return 0n;\n\n const portfolio = await this.indexerGrpcAccountPortfolioApi.fetchAccountPortfolioBalances(address);\n\n const xTokenAddress = xToken.address;\n\n const balance = portfolio.bankBalancesList.find(_balance => _balance.denom === xTokenAddress);\n if (balance) {\n return BigInt(balance.amount);\n }\n\n return 0n;\n }\n}\n","import type { XAccount } from '@/types/index.js';\nimport { XConnector } from '@/core/index.js';\nimport { getInjectiveAddress } from '@injectivelabs/sdk-ts';\nimport { type Wallet, isEvmBrowserWallet, isCosmosBrowserWallet } from '@injectivelabs/wallet-base';\nimport { isCosmosWalletInstalled } from '@injectivelabs/wallet-cosmos';\nimport { InjectiveXService } from './InjectiveXService.js';\n\nconst WALLET_ICONS: Partial<Record<Wallet, string>> = {\n metamask: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/metamask.svg',\n keplr: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/keplr.svg',\n leap: 'https://assets.leapwallet.io/logos/leap-cosmos-logo.svg',\n rabby: 'https://raw.githubusercontent.com/RabbyHub/logo/master/symbol.svg',\n phantom: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/phantom.svg',\n 'okx-wallet': 'https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png',\n 'trust-wallet': 'https://trustwallet.com/assets/images/media/assets/twLogo.svg',\n};\n\nexport class InjectiveXConnector extends XConnector {\n private wallet: Wallet;\n\n constructor(name: string, wallet: Wallet) {\n super('INJECTIVE', name, wallet);\n this.wallet = wallet;\n }\n\n getXService(): InjectiveXService {\n return InjectiveXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n if (isCosmosBrowserWallet(this.wallet) && !isCosmosWalletInstalled(this.wallet)) {\n console.warn(`[InjectiveXConnector] connect: ${this.wallet} cosmos wallet not installed`);\n return undefined;\n }\n\n const walletStrategy = this.getXService().walletStrategy;\n await walletStrategy.setWallet(this.wallet);\n const addresses = await walletStrategy.getAddresses();\n\n if (!addresses?.length) {\n console.warn(`[InjectiveXConnector] connect: ${this.wallet} returned no addresses`);\n return undefined;\n }\n\n const firstAddress = addresses[0];\n if (!firstAddress) {\n console.warn(`[InjectiveXConnector] connect: ${this.wallet} returned empty addresses array`);\n return undefined;\n }\n const address = isEvmBrowserWallet(this.wallet) ? getInjectiveAddress(firstAddress) : firstAddress;\n\n return {\n address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n if (isEvmBrowserWallet(this.wallet)) {\n const walletStrategy = this.getXService().walletStrategy;\n await walletStrategy.setWallet(this.wallet);\n await walletStrategy.disconnect();\n }\n }\n\n public override get icon(): string | undefined {\n return WALLET_ICONS[this.wallet];\n }\n\n public override get isInstalled(): boolean {\n if (isCosmosBrowserWallet(this.wallet)) {\n return isCosmosWalletInstalled(this.wallet);\n }\n // EVM / other injective wallets: wallet-strategy handles install errors at connect time.\n // Default to true so users can attempt connect — Phase 3 classifier will surface walletNotInstalled if it fails.\n return true;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/near/NearXService.ts","../src/xchains/near/NearXConnector.ts"],"names":[],"mappings":";;;;;AAMO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,QAAA,CAAS;AAAA,EACzC,OAAe,QAAA;AAAA,EAER,cAAA;AAAA,EACA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQC,WAAA,CAAY,SAAiB,oBAAA,EAAsB;AACzD,IAAA,KAAA,CAAM,MAAM,CAAA;AAEZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,aAAA,CAAc;AAAA,MACtC,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,OAAA;AAAA,MACR,WAAA,EAAa,IAAA;AAAA,MACb,eAAA,EAAiB,CAAC,YAAY;AAAA,KAC/B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,YAAY,MAAA,EAA+B;AACvD,IAAA,IAAI,CAAC,cAAa,QAAA,EAAU;AAC1B,MAAA,aAAA,CAAa,QAAA,GAAW,IAAI,aAAA,CAAa,MAAM,CAAA;AAAA,IACjD,WAAW,MAAA,EAAQ;AACjB,MAAA,aAAA,CAAa,SAAS,MAAA,GAAS,MAAA;AAAA,IACjC;AACA,IAAA,OAAO,aAAA,CAAa,QAAA;AAAA,EACtB;AAAA,EAEA,MAAe,UAAA,CAAW,OAAA,EAA6B,MAAA,EAAiC;AAEtF,IAAA,MAAM,WAAW,IAAI,eAAA,CAAgB,EAAE,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAGzD,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAQ;AAC5B,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,WAAA,CAAY,EAAE,SAAA,EAAW,OAAA,IAAW,IAAI,CAAA;AACvE,MAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAC9B;AAKA,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,YAAA,CAAqB;AAAA,MAC9C,YAAY,MAAA,CAAO,OAAA;AAAA,MACnB,MAAA,EAAQ,eAAA;AAAA,MACR,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA;AAAQ,KAC7B,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EACxB;AACF;;;AC1DO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,OAAA;AAAA,EAEA,YAAY,MAAA,EAAwB;AAClC,IAAA,KAAA,CAAM,QAAQ,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,SAAS,EAAE,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,WAAA,GAA4B;AAC1B,IAAA,OAAO,aAAa,WAAA,EAAY;AAAA,EAClC;AAAA,EAEA,MAAM,OAAA,GAAyC;AAC7C,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,EAAY,CAAE,cAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,OAAA,CAAQ,EAAE,UAAU,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,EAAA,EAAI,CAAA;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,EAAY;AAE1C,IAAA,IAAI,SAAS,MAAA,KAAW,CAAA,IAAK,QAAA,CAAS,CAAC,MAAM,MAAA,EAAW;AACtD,MAAA,OAAA,CAAQ,KAAK,CAAA,0BAAA,EAA6B,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAC3F,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA;AAAA,MACrB,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,EAAY,CAAE,cAAA;AAC1C,IAAA,MAAM,cAAA,CAAe,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,IAAoB,IAAA,GAAe;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,CAAS,IAAA;AAAA,EAC/B;AACF","file":"chunk-BXJLBR4G.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport type { XToken } from '@sodax/types';\nimport { NearConnector } from '@hot-labs/near-connect';\nimport { JsonRpcProvider } from 'near-api-js';\nimport { NEAR_DEFAULT_RPC_URL } from '@/constants.js';\n\nexport class NearXService extends XService {\n private static instance: NearXService;\n\n public walletSelector: NearConnector;\n public rpcUrl: string;\n\n /**\n * @param rpcUrl - Used by `getBalance` via `JsonRpcProvider({ url: rpcUrl })`.\n * Does NOT affect `walletSelector` — `@hot-labs/near-connect` only accepts\n * the network preset name (`'mainnet'`/`'testnet'`) and fetches RPC internally.\n * Custom RPC is therefore read-only for balance queries.\n */\n private constructor(rpcUrl: string = NEAR_DEFAULT_RPC_URL) {\n super('NEAR');\n\n this.rpcUrl = rpcUrl;\n this.walletSelector = new NearConnector({\n network: 'mainnet',\n logger: console,\n autoConnect: true,\n excludedWallets: ['okx-wallet'],\n });\n }\n\n /**\n * @param rpcUrl - Re-applied on every call (matches StacksXService semantics).\n * `rpcUrl` only drives `getBalance` via a per-call `JsonRpcProvider`, so it's\n * safe to update at runtime — no persistent chain client to rebuild.\n */\n public static getInstance(rpcUrl?: string): NearXService {\n if (!NearXService.instance) {\n NearXService.instance = new NearXService(rpcUrl);\n } else if (rpcUrl) {\n NearXService.instance.rpcUrl = rpcUrl;\n }\n return NearXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n // reference: https://near.github.io/near-api-js/classes/_near-js_providers.json-rpc-provider.JsonRpcProvider.html\n const provider = new JsonRpcProvider({ url: this.rpcUrl });\n\n // get native balance\n if (xToken.symbol === 'NEAR') {\n const account = await provider.viewAccount({ accountId: address ?? '' });\n return BigInt(account.amount);\n }\n\n // Near Fungible Token Standard(https://github.com/near/NEPs/blob/master/neps/nep-0141.md)\n // get balance of the token\n\n const res = await provider.callFunction<number>({\n contractId: xToken.address,\n method: 'ft_balance_of',\n args: { account_id: address },\n });\n return BigInt(res ?? 0);\n }\n}\n","import type { XAccount } from '@/types/index.js';\n\nimport { XConnector } from '@/core/index.js';\nimport type { NearWalletBase } from '@hot-labs/near-connect';\nimport { NearXService } from './NearXService.js';\n\nexport class NearXConnector extends XConnector {\n _wallet: NearWalletBase;\n\n constructor(wallet: NearWalletBase) {\n super('NEAR', wallet.manifest.name, wallet.manifest.id);\n this._wallet = wallet;\n }\n\n getXService(): NearXService {\n return NearXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n const walletSelector = this.getXService().walletSelector;\n const wallet = await walletSelector.connect({ walletId: this._wallet.manifest.id });\n const accounts = await wallet.getAccounts();\n\n if (accounts.length === 0 || accounts[0] === undefined) {\n console.warn(`[NearXConnector] connect: ${this._wallet.manifest.name} returned no accounts`);\n return undefined;\n }\n\n return {\n address: accounts[0].accountId,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n const walletSelector = this.getXService().walletSelector;\n await walletSelector.disconnect(this._wallet);\n }\n\n public override get icon(): string {\n return this._wallet.manifest.icon;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/evm/EvmXService.ts","../src/xchains/evm/EvmXConnector.ts"],"names":["address"],"mappings":"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","file":"chunk-E5IAZ7E6.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport { ChainKeys, type XToken } from '@sodax/types';\nimport type { EvmTypeConfig } from '@/types/config.js';\nimport { getRpcUrl, getWagmiChainId, isNativeToken } from '@/utils/index.js';\n\nimport { type Address, type Chain, defineChain, erc20Abi } from 'viem';\nimport { getPublicClient } from 'wagmi/actions';\nimport { type Config, type CreateConnectorFn, createConfig, http, createStorage, cookieStorage } from 'wagmi';\nimport {\n mainnet,\n avalanche,\n base,\n optimism,\n polygon,\n arbitrum,\n bsc,\n sonic,\n lightlinkPhoenix,\n redbellyMainnet,\n kaia,\n} from 'wagmi/chains';\ntype WagmiOptions = {\n reconnectOnMount?: boolean;\n ssr?: boolean;\n};\n\n// HyperEVM chain is not supported by viem, so we need to define it manually\nexport const hyper = /*#__PURE__*/ defineChain({\n id: 999,\n name: 'HyperEVM',\n nativeCurrency: {\n decimals: 18,\n name: 'HYPE',\n symbol: 'HYPE',\n },\n rpcUrls: {\n default: { http: ['https://rpc.hyperliquid.xyz/evm'] },\n },\n blockExplorers: {\n default: {\n name: 'HyperEVMScan',\n url: 'https://hyperevmscan.io/',\n },\n },\n contracts: {\n multicall3: {\n address: '0xcA11bde05977b3631167028862bE2a173976CA11',\n blockCreated: 13051,\n },\n },\n});\n\nexport const createWagmiConfig = (\n evmChains: EvmTypeConfig['chains'],\n options?: WagmiOptions & { connectors?: CreateConnectorFn[] },\n): Config => {\n return createConfig({\n chains: [\n mainnet,\n avalanche,\n arbitrum,\n base,\n bsc,\n sonic,\n optimism,\n polygon,\n hyper,\n lightlinkPhoenix,\n kaia,\n redbellyMainnet,\n ],\n connectors: options?.connectors ?? [],\n ssr: options?.ssr,\n transports: {\n [mainnet.id]: http(getRpcUrl(evmChains?.[ChainKeys.ETHEREUM_MAINNET])),\n [avalanche.id]: http(getRpcUrl(evmChains?.[ChainKeys.AVALANCHE_MAINNET])),\n [arbitrum.id]: http(getRpcUrl(evmChains?.[ChainKeys.ARBITRUM_MAINNET])),\n [base.id]: http(getRpcUrl(evmChains?.[ChainKeys.BASE_MAINNET])),\n [bsc.id]: http(getRpcUrl(evmChains?.[ChainKeys.BSC_MAINNET])),\n [sonic.id]: http(getRpcUrl(evmChains?.[ChainKeys.SONIC_MAINNET])),\n [optimism.id]: http(getRpcUrl(evmChains?.[ChainKeys.OPTIMISM_MAINNET])),\n [polygon.id]: http(getRpcUrl(evmChains?.[ChainKeys.POLYGON_MAINNET])),\n [hyper.id]: http(getRpcUrl(evmChains?.[ChainKeys.HYPEREVM_MAINNET])),\n [lightlinkPhoenix.id]: http(getRpcUrl(evmChains?.[ChainKeys.LIGHTLINK_MAINNET])),\n [redbellyMainnet.id]: http(getRpcUrl(evmChains?.[ChainKeys.REDBELLY_MAINNET])),\n [kaia.id]: http(getRpcUrl(evmChains?.[ChainKeys.KAIA_MAINNET])),\n },\n storage: createStorage({\n storage: cookieStorage,\n key: 'sodax',\n }),\n });\n};\n\n/**\n * Service class for handling EVM chain interactions.\n * Implements singleton pattern and provides methods for wallet/chain operations.\n */\n\nexport class EvmXService extends XService {\n private static instance: EvmXService;\n public wagmiConfig: Config | undefined;\n\n private constructor() {\n super('EVM');\n }\n\n public static getInstance(): EvmXService {\n if (!EvmXService.instance) {\n EvmXService.instance = new EvmXService();\n }\n return EvmXService.instance;\n }\n\n // get erc20 token balance in a chain (evm chain only)\n async _getTokenBalance(address: string | undefined, chainId: number, tokenAddress: string): Promise<bigint> {\n const publicClient = getPublicClient(this.wagmiConfig as Config, { chainId: chainId });\n if (!publicClient) throw new Error('Public client not found');\n const balance = await publicClient.readContract({\n abi: erc20Abi,\n address: tokenAddress as `0x${string}`,\n functionName: 'balanceOf',\n args: [address as `0x${string}`],\n });\n return balance || 0n;\n }\n\n //get native balance of the chain (evm chain only)\n async _getChainBalance(address: string | undefined, chainId: number) {\n const balance = await getPublicClient(this.wagmiConfig as Config, { chainId: chainId })?.getBalance({\n address: address as Address,\n });\n return balance || 0n;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n if (!this.wagmiConfig) return 0n;\n\n const chainId = getWagmiChainId(xToken.chainKey);\n\n if (isNativeToken(xToken)) {\n return this._getChainBalance(address, chainId);\n }\n\n throw new Error(`Unsupported token: ${xToken.symbol}`);\n }\n\n override async getBalances(address: string | undefined, xTokens: XToken[]) {\n if (!address) return {};\n if (!this.wagmiConfig) return {};\n\n const nativeTokenBalancePromises = xTokens\n .filter(xToken => isNativeToken(xToken))\n .map(async xToken => {\n const balance = await this.getBalance(address, xToken);\n return { symbol: xToken.symbol, address: xToken.address, balance };\n });\n\n const nativeTokenBalances = await Promise.all(nativeTokenBalancePromises);\n const tokenMap: Record<string, bigint> = nativeTokenBalances.reduce<Record<string, bigint>>(\n (map, { address, balance }) => {\n if (balance) map[address] = balance;\n return map;\n },\n {},\n );\n\n const nonNativeXTokens = xTokens.filter(xToken => !isNativeToken(xToken));\n const firstToken = xTokens[0];\n if (!firstToken) return tokenMap;\n const chainKey = firstToken.chainKey;\n const viemChain: Chain = this.wagmiConfig.chains.find(chain => chain.id === getWagmiChainId(chainKey)) as Chain;\n const chainId = getWagmiChainId(chainKey);\n\n const publicClient = getPublicClient(this.wagmiConfig, { chainId: chainId });\n if (!publicClient) throw new Error('Public client not found');\n\n if (viemChain?.contracts?.multicall3) {\n //multicall supports\n const result = await publicClient.multicall({\n contracts: nonNativeXTokens.map(token => ({\n abi: erc20Abi,\n address: token.address as `0x${string}`,\n functionName: 'balanceOf',\n args: [address],\n })),\n });\n\n return nonNativeXTokens.reduce((acc, token, index) => {\n const resultValue = result?.[index]?.result;\n acc[token.address] = resultValue !== undefined && resultValue !== null ? BigInt(resultValue) : 0n;\n return acc;\n }, tokenMap);\n }\n\n const nonNativeTokenBalances: bigint[] = await Promise.all(\n nonNativeXTokens.map(token => this._getTokenBalance(address, chainId, token.address)),\n );\n\n return nonNativeXTokens.reduce((acc, token, idx) => {\n acc[token.address] = nonNativeTokenBalances[idx] ?? 0n;\n return acc;\n }, tokenMap);\n }\n}\n","import { XConnector } from '@/core/XConnector.js';\nimport type { XAccount } from '@/types/index.js';\nimport type { Connector } from 'wagmi';\n\nconst WALLETCONNECT_ICON = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'%3E%3Cpath fill='%233B99FC' d='M9.58 11.58c3.55-3.47 9.29-3.47 12.84 0l.43.42a.44.44 0 0 1 0 .63l-1.46 1.43a.23.23 0 0 1-.32 0l-.59-.57a6.72 6.72 0 0 0-9.36 0l-.63.61a.23.23 0 0 1-.32 0L8.71 12.7a.44.44 0 0 1 0-.63l.87-.5Zm15.87 2.95 1.3 1.28a.44.44 0 0 1 0 .63l-5.87 5.74a.46.46 0 0 1-.64 0l-4.17-4.08a.11.11 0 0 0-.16 0l-4.17 4.08a.46.46 0 0 1-.64 0l-5.87-5.74a.44.44 0 0 1 0-.63l1.3-1.28a.46.46 0 0 1 .64 0l4.17 4.08a.11.11 0 0 0 .16 0l4.17-4.08a.46.46 0 0 1 .64 0l4.17 4.08a.11.11 0 0 0 .16 0l4.17-4.08a.46.46 0 0 1 .64 0Z'/%3E%3C/svg%3E\";\n\nexport class EvmXConnector extends XConnector {\n connector: Connector;\n\n constructor(connector: Connector) {\n super('EVM', connector.name, connector.id);\n this.connector = connector;\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {\n return;\n }\n\n public override get id(): string {\n return this.connector.id;\n }\n public override get icon(): string | undefined {\n if (!this.connector.icon && this.connector.type === 'walletConnect') {\n return WALLETCONNECT_ICON;\n }\n return this.connector.icon;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/guards.ts"],"names":[],"mappings":";AAcO,SAAS,SAAS,KAAA,EAAwC;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAGO,SAAS,iBAAA,CACd,OACA,GAAA,EAC8C;AAC9C,EAAA,OAAO,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,QAAA;AAClD;AAGO,SAAS,yBAAA,CACd,OACA,GAAA,EACuD;AACvD,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,KAAM,KAAA,CAAM,GAAG,MAAM,MAAA,IAAa,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,QAAA,CAAA;AAC/E;AAGO,SAAS,kBAAA,CACd,OACA,GAAA,EAC+C;AAC/C,EAAA,OAAO,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,SAAA;AAClD;AAGO,SAAS,mBAAA,CACd,OACA,GAAA,EACuE;AACvE,EAAA,OAAO,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,GAAG,CAAA,KAAM,UAAA;AAClD;AAMO,SAAS,MAAA,CAAO,WAAoB,OAAA,EAAoC;AAC7E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AACF;AAMO,SAAS,sBAAA,CAAuB,MAAA,EAAgB,MAAA,EAAiB,MAAA,EAAiB,OAAA,EAAwB;AAC/G,EAAA,MAAM,QAAA,GACJ,QAAA,CAAS,MAAM,CAAA,IACf,oBAAoB,MAAA,EAAQ,yBAAyB,CAAA,IACrD,mBAAA,CAAoB,MAAA,EAAQ,4BAA4B,CAAA,IACxD,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AACxC,EAAA,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,EAAI,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAEvD,EAAA,MAAM,WAAW,QAAA,CAAS,MAAM,CAAA,IAAK,iBAAA,CAAkB,QAAQ,MAAM,CAAA;AACrE,EAAA,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,EAAI,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAEvD,EAAA,MAAM,YAAY,QAAA,CAAS,OAAO,CAAA,IAAK,iBAAA,CAAkB,SAAS,SAAS,CAAA;AAC3E,EAAA,MAAA,CAAO,SAAA,EAAW,CAAA,CAAA,EAAI,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAC3D","file":"chunk-MAQ47Q52.mjs","sourcesContent":["// packages/wallet-sdk-react/src/shared/guards.ts\n\n/**\n * Tiny runtime type guards used to safely narrow `unknown` values.\n *\n * Why this exists:\n * - In wallets land, many values come from outside TypeScript (window injections, 3rd-party SDKs, serialized state).\n * - Writing `as SomeType` skips checks and can crash later in confusing places.\n * - Guards + `assert(...)` let us fail fast with a clear error message at the boundary.\n */\n\nexport type UnknownRecord = Record<string, unknown>;\n\n/** True if value is a non-null object (Record-like). */\nexport function isRecord(value: unknown): value is UnknownRecord {\n return typeof value === 'object' && value !== null;\n}\n\n/** True if the object has a string property at `key`. */\nexport function hasStringProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Record<Key, string> {\n return isRecord(value) && typeof value[key] === 'string';\n}\n\n/** True if the object has an optional string property at `key`. */\nexport function hasOptionalStringProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Partial<Record<Key, string>> {\n return isRecord(value) && (value[key] === undefined || typeof value[key] === 'string');\n}\n\n/** True if the object has a boolean property at `key`. */\nexport function hasBooleanProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Record<Key, boolean> {\n return isRecord(value) && typeof value[key] === 'boolean';\n}\n\n/** True if the object has a function property at `key`. */\nexport function hasFunctionProperty<Key extends string>(\n value: unknown,\n key: Key,\n): value is UnknownRecord & Record<Key, (...args: unknown[]) => unknown> {\n return isRecord(value) && typeof value[key] === 'function';\n}\n\n/**\n * Throws if condition is false.\n * Use this after guards to stop execution early with an actionable error message.\n */\nexport function assert(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(message);\n }\n}\n\n/**\n * Validates the runtime shape of Sui provider dependencies before passing them to wallet-sdk-core.\n * Used by both SuiHydrator (render path) and SuiXService.createWalletProvider (imperative path).\n */\nexport function assertSuiProviderShape(caller: string, client: unknown, wallet: unknown, account: unknown): void {\n const clientOk =\n isRecord(client) &&\n hasFunctionProperty(client, 'executeTransactionBlock') &&\n hasFunctionProperty(client, 'devInspectTransactionBlock') &&\n hasFunctionProperty(client, 'getCoins');\n assert(clientOk, `[${caller}] invalid Sui client shape`);\n\n const walletOk = isRecord(wallet) && hasStringProperty(wallet, 'name');\n assert(walletOk, `[${caller}] invalid Sui wallet shape`);\n\n const accountOk = isRecord(account) && hasStringProperty(account, 'address');\n assert(accountOk, `[${caller}] invalid Sui account shape`);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";AAUO,IAAM,mBAAA,GAAsB;AAC5B,IAAM,wBAAA,GAA2B;AAGjC,IAAM,8BAAA,GAAiC;AACvC,IAAM,eAAA,GAAkB;AAGxB,IAAM,2BAAA,GAA8B;AACpC,IAAM,sBAAA,GAAyB;AAE/B,IAAM,kCAAA,GAAqC;AAG3C,IAAM,uBAAA,GAA0B;AAGhC,IAAM,+BAAA,GAAkC;AACxC,IAAM,+BAAA,GAAkC;AAGxC,IAAM,oBAAA,GAAuB;AAM7B,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,yFAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,UAAA,EAAY,qGAAA;AAAA,IACZ,IAAA,EACE;AAAA,GACJ;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,sFAAA;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,uFAAA;AAAA,IACZ,IAAA,EAAM;AAAA;AAEV","file":"chunk-MXZVF5HR.mjs","sourcesContent":["/**\n * Default values used across providers and hydrators.\n * Centralized so consumers and tests have a single source of truth.\n */\n\n// ─── Stacks ─────────────────────────────────────────────────────────────────\nexport const STACKS_DEFAULT_RPC_URL = 'https://api.mainnet.hiro.so';\nexport const STACKS_DEFAULT_NETWORK = 'mainnet' as const;\n\n// ─── Sui ────────────────────────────────────────────────────────────────────\nexport const SUI_DEFAULT_NETWORK = 'mainnet' as const;\nexport const SUI_DEFAULT_AUTO_CONNECT = true;\n\n// ─── EVM ────────────────────────────────────────────────────────────────────\nexport const EVM_DEFAULT_RECONNECT_ON_MOUNT = false;\nexport const EVM_DEFAULT_SSR = true;\n\n// ─── Solana ─────────────────────────────────────────────────────────────────\nexport const SOLANA_DEFAULT_AUTO_CONNECT = true;\nexport const SOLANA_DEFAULT_RPC_URL = 'https://api.mainnet-beta.solana.com';\n/** Timeout for MetaMask Solana wallet connect — MetaMask's Solana adapter is slow to fire `connect`. */\nexport const SOLANA_METAMASK_CONNECT_TIMEOUT_MS = 30_000;\n\n// ─── Bitcoin ────────────────────────────────────────────────────────────────\nexport const BITCOIN_DEFAULT_RPC_URL = 'https://mempool.space/api';\n\n// ─── Stellar ────────────────────────────────────────────────────────────────\nexport const STELLAR_DEFAULT_HORIZON_RPC_URL = 'https://horizon.stellar.org';\nexport const STELLAR_DEFAULT_SOROBAN_RPC_URL = 'https://rpc.ankr.com/stellar_soroban';\n\n// ─── NEAR ───────────────────────────────────────────────────────────────────\nexport const NEAR_DEFAULT_RPC_URL = 'https://1rpc.io/near';\n\n// ─── Wallet metadata (install URLs + icons for extension-based wallets) ────\n// Keys are wallet-level, not per-connector: one OKX extension serves both\n// Bitcoin and EVM connectors, so metadata is shared.\n\nexport const WALLET_METADATA = {\n unisat: {\n installUrl: 'https://chromewebstore.google.com/detail/unisat-wallet/ppbibelpcjmhbdihakflkdcoccbgbkpo',\n icon: 'https://avatars.githubusercontent.com/u/125119198?s=200&v=4',\n },\n xverse: {\n installUrl: 'https://chromewebstore.google.com/detail/xverse-bitcoin-crypto-wal/idnnbdplmphpflfnlkomgpfbpcgelopg',\n icon:\n 'https://cdn.brandfetch.io/iddzGN5Rcv/w/400/h/400/theme/dark/icon.jpeg?c=1bxid64Mup7aczewSAYMX&t=1771902357797',\n },\n okx: {\n installUrl: 'https://chromewebstore.google.com/detail/okx-wallet/mcohilncbfahbmgdjkbpemcciiolgcge',\n icon: 'https://static.okx.com/cdn/assets/imgs/247/58E63FEA47A2B7D7.png',\n },\n hana: {\n installUrl: 'https://chromewebstore.google.com/detail/hana-wallet/jfdlamikmbghhapbgfoogdffldioobgl',\n icon: 'https://raw.githubusercontent.com/balancednetwork/icons/master/wallets/hana.svg',\n },\n} as const satisfies Record<string, { installUrl: string; icon: string }>;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/solana/SolanaXConnector.ts"],"names":[],"mappings":";;;;AAOO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA,EAC/C,MAAA;AAAA,EACA,YAAY,MAAA,EAAgB;AAC1B,IAAA,KAAA,CAAM,UAAU,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,WAAA,GAA8B;AAC5B,IAAA,OAAO,eAAe,WAAA,EAAY;AAAA,EACpC;AAAA,EAEA,MAAM,OAAA,GAAyC;AAC7C,IAAA;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAAC;AAAA,EAEnC,IAAoB,IAAA,GAAe;AACjC,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AAAA,EAC9B;AAAA,EAEA,IAAoB,WAAA,GAAuB;AAUzC,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,EAAQ,UAAA;AAC3B,IAAA,OAAO,KAAA,KAAU,eAAe,KAAA,KAAU,UAAA;AAAA,EAC5C;AAAA,EAEA,IAAoB,UAAA,GAAiC;AACnD,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ,GAAA;AAAA,EAC9B;AACF","file":"chunk-N5A2TMF6.mjs","sourcesContent":["import type { XAccount } from '@/types/index.js';\n// Wallet is the type from useWallet().wallets — each entry has .adapter (name, icon, url) and .readyState.\nimport type { Wallet } from '@solana/wallet-adapter-react';\n\nimport { XConnector } from '@/core/index.js';\nimport { SolanaXService } from './SolanaXService.js';\n\nexport class SolanaXConnector extends XConnector {\n wallet: Wallet;\n constructor(wallet: Wallet) {\n super('SOLANA', wallet?.adapter.name, wallet?.adapter.name);\n this.wallet = wallet;\n }\n\n getXService(): SolanaXService {\n return SolanaXService.getInstance();\n }\n\n async connect(): Promise<XAccount | undefined> {\n return;\n }\n\n async disconnect(): Promise<void> {}\n\n public override get icon(): string {\n return this.wallet?.adapter.icon;\n }\n\n public override get isInstalled(): boolean {\n // WalletReadyState string values from @solana/wallet-adapter-base.\n // Imported as string literals to avoid adding -base as an explicit dep.\n // - 'Installed' — browser extension is injected (Phantom, Solflare, …).\n // - 'Loadable' — adapter can bootstrap the wallet on demand (e.g. mobile\n // deep-link adapters). The wallet isn't physically\n // present, but `connect()` will load it on first use,\n // so treat it as installed — otherwise the modal would\n // show a spurious \"Install\" CTA for a wallet the user\n // can actually connect to.\n const state = this.wallet?.readyState as string | undefined;\n return state === 'Installed' || state === 'Loadable';\n }\n\n public override get installUrl(): string | undefined {\n return this.wallet?.adapter.url;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/walletRpcConfig.ts","../src/utils/sortConnectors.ts","../src/utils/index.ts"],"names":[],"mappings":";;;AAUO,SAAS,iBACd,KAAA,EACoC;AACpC,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAChD,EAAA,OAAQ,KAAA,CAAgD,QAAA;AAC1D;AAQO,SAAS,UAA8B,KAAA,EAAsD;AAClG,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,MAAA;AAChD,EAAA,OAAQ,KAAA,CAA8B,MAAA;AACxC;AAWO,SAAS,kBAAA,CACd,eACA,SAAA,EAC+B;AAC/B,EAAA,MAAM,GAAA,GAAM,wBAAwB,aAAa,CAAA;AACjD,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,EAAW,OAAO,MAAA;AAC/B,EAAA,OAAO,SAAA,CAAU,GAAG,CAAA,EAAG,QAAA;AACzB;;;AC7BO,SAAS,cAAA,CACd,UAAA,EACA,OAAA,GAAiC,EAAC,EAC7B;AACL,EAAA,MAAM,EAAE,SAAA,GAAY,EAAC,EAAE,GAAI,OAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,KAAM,CAAC,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAEhE,EAAA,OAAO,CAAC,GAAG,UAAU,CAAA,CAClB,GAAA,CAAI,CAAC,SAAA,EAAW,aAAA,MAAmB,EAAE,SAAA,EAAW,eAAc,CAAE,CAAA,CAChE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,UAAU,EAAE,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,UAAU,EAAE,CAAA;AAC/C,IAAA,IAAI,UAAU,KAAA,EAAO;AACnB,MAAA,IAAI,KAAA,KAAU,QAAW,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,KAAU,QAAW,OAAO,EAAA;AAChC,MAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,IACjB;AACA,IAAA,IAAI,CAAA,CAAE,SAAA,CAAU,WAAA,KAAgB,CAAA,CAAE,UAAU,WAAA,EAAa;AACvD,MAAA,OAAO,CAAA,CAAE,SAAA,CAAU,WAAA,GAAc,EAAA,GAAK,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,CAAA,CAAE,gBAAgB,CAAA,CAAE,aAAA;AAAA,EAC7B,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,EAAE,SAAA,OAAgB,SAAS,CAAA;AACrC;AC5BO,IAAM,aAAA,GAAgB,CAAC,MAAA,KAA4B;AACxD,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,4CAAA;AAAA,IACA,4CAAA;AAAA,IACA,KAAA;AAAA,IACA,8EAAA;AAAA,IACA,4CAAA;AAAA,IACA,kCAAA;AAAA;AAAA,IACA,0DAAA;AAAA;AAAA,IACA,2CAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,OAAO,eAAA,CAAgB,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAChD;AAEO,IAAM,eAAA,GAAkB,CAAC,QAAA,KAAoC;AAClE,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAA;AACxC,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kEAAA,EAAqE,OAAO,OAAO,CAAA,CAAE,CAAA;AAAA,EACvG;AACA,EAAA,OAAO,OAAA;AACT","file":"chunk-NY7U7OJW.mjs","sourcesContent":["import { getEvmChainKeyByChainId, type ChainKey, type EvmChainKey } from '@sodax/types';\nimport type { EvmWalletDefaults } from '@sodax/wallet-sdk-core';\nimport type { ChainEntry, EvmChainEntry, WalletDefaultsByKey } from '@/types/config.js';\n\nexport type { ChainEntry, WalletDefaultsByKey };\n\n/**\n * Extract `defaults` from a chain entry. Returns undefined when the entry is\n * missing, or for Stacks's preset-name string variant (no `defaults` slot).\n */\nexport function getEntryDefaults<K extends ChainKey>(\n entry: ChainEntry<K> | undefined,\n): WalletDefaultsByKey<K> | undefined {\n if (!entry || typeof entry === 'string') return undefined;\n return (entry as { defaults?: WalletDefaultsByKey<K> }).defaults;\n}\n\n/**\n * Extract `rpcUrl` from a chain entry. Use for chains whose underlying factory\n * expects a bare URL string (EVM/Solana/Sui/Icon/Near). Returns undefined for\n * missing entries and for non-rpcUrl forms (Stacks preset name, object entries\n * lacking the field) — downstream falls back to a public default.\n */\nexport function getRpcUrl<K extends ChainKey>(entry: ChainEntry<K> | undefined): string | undefined {\n if (!entry || typeof entry === 'string') return undefined;\n return (entry as { rpcUrl?: string }).rpcUrl;\n}\n\n/**\n * Resolve EVM wallet provider defaults for the chain currently active on a\n * wagmi-supplied client. Used by `EvmHydrator` so the provider re-instantiates\n * with the right defaults when wagmi swaps clients on chain switch.\n *\n * `getEvmChainKeyByChainId` lives in `@sodax/types` (alongside `baseChainInfo`,\n * the data source); this helper composes it with the `SodaxWalletConfig.EVM.chains`\n * lookup, which is React-layer concern.\n */\nexport function resolveEvmDefaults(\n activeChainId: number | undefined,\n evmChains: Partial<Record<EvmChainKey, EvmChainEntry>> | undefined,\n): EvmWalletDefaults | undefined {\n const key = getEvmChainKeyByChainId(activeChainId);\n if (!key || !evmChains) return undefined;\n return evmChains[key]?.defaults;\n}\n","import type { IXConnector } from '@/types/interfaces.js';\n\nexport type SortConnectorsOptions = {\n /** Connector IDs to prioritize. Earlier entries win. */\n preferred?: readonly string[];\n};\n\n/**\n * Stable sort of connectors for display. Ranking (highest first):\n * 1. Appears in `preferred[]` — earlier entries rank higher\n * 2. `connector.isInstalled === true`\n * 3. Original order (stable)\n *\n * Pure function — does not subscribe or read window.\n */\nexport function sortConnectors<T extends IXConnector>(\n connectors: readonly T[],\n options: SortConnectorsOptions = {},\n): T[] {\n const { preferred = [] } = options;\n const preferredIndex = new Map(preferred.map((id, i) => [id, i]));\n\n return [...connectors]\n .map((connector, originalIndex) => ({ connector, originalIndex }))\n .sort((a, b) => {\n const aPref = preferredIndex.get(a.connector.id);\n const bPref = preferredIndex.get(b.connector.id);\n if (aPref !== bPref) {\n if (aPref === undefined) return 1;\n if (bPref === undefined) return -1;\n return aPref - bPref;\n }\n if (a.connector.isInstalled !== b.connector.isInstalled) {\n return a.connector.isInstalled ? -1 : 1;\n }\n return a.originalIndex - b.originalIndex;\n })\n .map(({ connector }) => connector);\n}\n","import { baseChainInfo, type SpokeChainKey, type XToken } from '@sodax/types';\n\nexport { sortConnectors, type SortConnectorsOptions } from './sortConnectors.js';\nexport {\n getEntryDefaults,\n getRpcUrl,\n resolveEvmDefaults,\n type WalletDefaultsByKey,\n} from './walletRpcConfig.js';\n\nexport const isNativeToken = (xToken: XToken): boolean => {\n const nativeAddresses = [\n 'cx0000000000000000000000000000000000000000',\n '0x0000000000000000000000000000000000000000',\n 'inj',\n '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI',\n 'hx0000000000000000000000000000000000000000',\n '11111111111111111111111111111111', // solana\n 'CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA', // stellar\n 'ST000000000000000000002AMW42H.nativetoken', // stacks\n '0:0', // bitcoin\n ];\n\n return nativeAddresses.includes(xToken.address);\n};\n\nexport const getWagmiChainId = (xChainId: SpokeChainKey): number => {\n const chainId = baseChainInfo[xChainId].chainId;\n if (typeof chainId !== 'number') {\n throw new Error(`[wallet-sdk-react] getWagmiChainId: expected numeric chainId, got ${typeof chainId}`);\n }\n return chainId;\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/xchains/stacks/StacksXService.ts","../src/xchains/stacks/StacksXConnector.ts","../src/xchains/stacks/constants.ts","../src/xchains/stacks/useStacksXConnectors.ts"],"names":[],"mappings":"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","file":"chunk-PJLEJVAU.mjs","sourcesContent":["import { XService } from '@/core/XService.js';\nimport type { XToken } from '@sodax/types';\nimport { fetchCallReadOnlyFunction, Cl, type UIntCV, type ResponseOkCV } from '@stacks/transactions';\nimport { networkFrom, type StacksNetwork, type StacksNetworkName } from '@stacks/network';\n\nexport class StacksXService extends XService {\n private static instance: StacksXService;\n\n public network: StacksNetwork;\n\n private constructor(network?: StacksNetworkName | StacksNetwork) {\n super('STACKS');\n this.network = networkFrom(network || 'mainnet');\n }\n\n public static getInstance(network?: StacksNetworkName | StacksNetwork): StacksXService {\n if (!StacksXService.instance) {\n StacksXService.instance = new StacksXService(network);\n } else if (network) {\n StacksXService.instance.network = networkFrom(network);\n }\n return StacksXService.instance;\n }\n\n override async getBalance(address: string | undefined, xToken: XToken): Promise<bigint> {\n if (!address) return 0n;\n\n // native STX balance\n if (xToken.symbol === 'STX') {\n const url = `${this.network.client.baseUrl}/extended/v1/address/${address}/balances`;\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Error fetching data: ${response.statusText}`);\n }\n const data = await response.json();\n return BigInt(data.stx.balance);\n } catch (error) {\n console.error('Error fetching STX balance:', error);\n return 0n;\n }\n }\n\n // SIP-010 fungible token balance via read-only contract call\n const parts = xToken.address.split('.');\n const contractAddress = parts[0] ?? '';\n const contractName = parts[1] ?? '';\n try {\n const result = (await fetchCallReadOnlyFunction({\n contractAddress,\n contractName,\n functionName: 'get-balance',\n functionArgs: [Cl.principal(address)],\n network: this.network,\n senderAddress: address,\n })) as ResponseOkCV<UIntCV>;\n return result.value.value as bigint;\n } catch (error) {\n console.error('Error fetching token balance:', error);\n return 0n;\n }\n }\n}\n","import type { XAccount } from '@/types/index.js';\nimport { XConnector } from '@/core/index.js';\nimport type { StacksProvider } from '@stacks/connect';\nimport { request, disconnect } from '@stacks/connect';\n\nexport interface StacksProviderConfig {\n /** The provider ID matching the window path, e.g. 'LeatherProvider' or 'XverseProviders.BitcoinProvider' */\n id: string;\n name: string;\n icon: string;\n installUrl?: string;\n}\n\n/** Resolves a provider from `window` by dot-separated ID, matching @stacks/connect-ui's getProviderFromId */\nfunction getProviderFromId(id: string): StacksProvider | undefined {\n return id.split('.').reduce<unknown>((acc, part) => (acc as Record<string, unknown>)?.[part], window) as\n | StacksProvider\n | undefined;\n}\n\nexport class StacksXConnector extends XConnector {\n private readonly config: StacksProviderConfig;\n\n constructor(config: StacksProviderConfig) {\n super('STACKS', config.name, config.id);\n this.config = config;\n }\n\n async connect(): Promise<XAccount | undefined> {\n const provider = this.getProvider();\n\n if (!provider) {\n // Throw instead of silently navigating to the install URL — callers\n // that bypass `useWalletModal.selectWallet`'s pre-check otherwise\n // see a tab open with no surfaced error. Consumers read\n // `connector.installUrl` to render the install CTA on the caught\n // error.\n throw new Error(`${this.config.name} is not installed. Install the extension and reload the page.`);\n }\n\n const response = await request({ provider }, 'stx_getAddresses');\n // Stacks SDK types don't include `purpose` on AddressEntry, but wallets return it at runtime\n const stxAddress = response.addresses.find(a => (a as unknown as { purpose?: string }).purpose === 'stacks');\n\n if (!stxAddress) {\n console.warn(\n `[StacksXConnector] ${this.config.name}: no address with purpose=\"stacks\" returned from stx_getAddresses`,\n response.addresses,\n );\n return undefined;\n }\n\n return {\n address: stxAddress.address,\n xChainType: this.xChainType,\n };\n }\n\n async disconnect(): Promise<void> {\n disconnect();\n }\n\n public override get icon(): string {\n return this.config.icon;\n }\n\n public override get isInstalled(): boolean {\n if (typeof window === 'undefined') return false;\n return getProviderFromId(this.config.id) !== undefined;\n }\n\n public override get installUrl(): string | undefined {\n return this.config.installUrl;\n }\n\n public getProvider(): StacksProvider | undefined {\n return getProviderFromId(this.config.id);\n }\n}\n","import type { StacksProviderConfig } from './StacksXConnector.js';\n\n// Icons sourced from @stacks/connect DEFAULT_PROVIDERS\n// https://github.com/stx-labs/connect/blob/main/packages/connect/src/providers.ts\nconst LEATHER_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMjYuODM4NyIgZmlsbD0iIzEyMTAwRiIvPgo8cGF0aCBkPSJNNzQuOTE3MSA1Mi43MTE0QzgyLjQ3NjYgNTEuNTQwOCA5My40MDg3IDQzLjU4MDQgOTMuNDA4NyAzNy4zNzYxQzkzLjQwODcgMzUuNTAzMSA5MS44OTY4IDM0LjIxNTQgODkuNjg3MSAzNC4yMTU0Qzg1LjUwMDQgMzQuMjE1NCA3OC40MDYxIDQwLjUzNjggNzQuOTE3MSA1Mi43MTE0Wk0zOS45MTEgODMuNDk5MUMzMC4wMjU2IDgzLjQ5OTEgMjkuMjExNSA5My4zMzI0IDM5LjA5NjkgOTMuMzMyNEM0My41MTYzIDkzLjMzMjQgNDguODY2MSA5MS41NzY0IDUxLjY1NzMgODguNDE1N0M0Ny41ODY4IDg0LjkwMzggNDQuMjE0MSA4My40OTkxIDM5LjkxMSA4My40OTkxWk0xMDIuODI5IDc5LjI4NDhDMTAzLjQxIDk1Ljc5MDcgOTUuMDM2OSAxMDUuMDM5IDgwLjg0ODQgMTA1LjAzOUM3Mi40NzQ4IDEwNS4wMzkgNjguMjg4MSAxMDEuODc4IDU5LjMzMyA5Ni4wMjQ5QzU0LjY4MSAxMDEuMTc2IDQ1Ljg0MjMgMTA1LjAzOSAzOC41MTU0IDEwNS4wMzlDMTMuMjc4NSAxMDUuMDM5IDE0LjMyNTIgNzIuODQ2MyA0MC4wMjczIDcyLjg0NjNDNDUuMzc3MSA3Mi44NDYzIDQ5LjkxMjggNzQuMjUxMSA1NS43Mjc3IDc3Ljg4TDU5LjU2NTYgNjQuNDE3N0M0My43NDg5IDYwLjA4NjQgMzUuODQwNSA0Ny45MTE4IDQzLjYzMjYgMzAuNDY5M0g1Ni4xOTI5QzQ5LjIxNSA0Mi4wNTg2IDUzLjk4MzIgNTEuNjU3OCA2Mi44MjIgNTIuNzExNEM2Ny41OTAzIDM1LjczNzIgNzcuODI0NiAyMi41MDkgOTEuNDMxNiAyMi41MDlDOTkuMTA3NCAyMi41MDkgMTA1LjE1NSAyNy41NDI4IDEwNS4xNTUgMzYuNjczN0MxMDUuMTU1IDUxLjMwNjYgODYuMDgxOSA2My4yNDcxIDcxLjY2MDcgNjQuNDE3N0w2NS43Mjk1IDg1LjM3MjFDNzIuNDc0OCA5My4yMTUzIDkxLjE5OSAxMDAuODI0IDkxLjE5OSA3OS4yODQ4SDEwMi44MjlaIiBmaWxsPSIjRjVGMUVEIi8+Cjwvc3ZnPgo=';\n\nconst XVERSE_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MDAiIGhlaWdodD0iNjAwIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGZpbGw9IiMxNzE3MTciIGQ9Ik0wIDBoNjAwdjYwMEgweiIvPjxwYXRoIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgZD0iTTQ0MCA0MzUuNHYtNTFjMC0yLS44LTMuOS0yLjItNS4zTDIyMCAxNjIuMmE3LjYgNy42IDAgMCAwLTUuNC0yLjJoLTUxLjFjLTIuNSAwLTQuNiAyLTQuNiA0LjZ2NDcuM2MwIDIgLjggNCAyLjIgNS40bDc4LjIgNzcuOGE0LjYgNC42IDAgMCAxIDAgNi41bC03OSA3OC43Yy0xIC45LTEuNCAyLTEuNCAzLjJ2NTJjMCAyLjQgMiA0LjUgNC42IDQuNUgyNDljMi42IDAgNC42LTIgNC42LTQuNlY0MDVjMC0xLjIuNS0yLjQgMS40LTMuM2w0Mi40LTQyLjJhNC42IDQuNiAwIDAgMSA2LjQgMGw3OC43IDc4LjRhNy42IDcuNiAwIDAgMCA1LjQgMi4yaDQ3LjVjMi41IDAgNC42LTIgNC42LTQuNloiLz48cGF0aCBmaWxsPSIjRUU3QTMwIiBmaWxsLXJ1bGU9Im5vbnplcm8iIGQ9Ik0zMjUuNiAyMjcuMmg0Mi44YzIuNiAwIDQuNiAyLjEgNC42IDQuNnY0Mi42YzAgNCA1IDYuMSA4IDMuMmw1OC43LTU4LjVjLjgtLjggMS4zLTIgMS4zLTMuMnYtNTEuMmMwLTIuNi0yLTQuNi00LjYtNC42TDM4NCAxNjBjLTEuMiAwLTIuNC41LTMuMyAxLjNsLTU4LjQgNTguMWE0LjYgNC42IDAgMCAwIDMuMiA3LjhaIi8+PC9nPjwvc3ZnPg==';\n\nconst ASIGNA_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMDEwMCIgZD0iTTAgMGgzMnYzMkgweiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIGQ9Ik0xNS4xMSA1LjU1YTMgMyAwIDAgMC0xLjgyIDEuM2wtLjA1LjA4LS40My43Mi0uMDcuMTEtLjUuODUtLjA1LjA5LTEuMjkgMi4xOC0uMDQuMDctLjQ3LjgtLjA2LjEtLjQ2Ljc4LS4wNy4xMS0xLjYzIDIuNzYtLjA3LjExLS4zOC42Ni0uMDUuMDgtLjczIDEuMjQtLjM1LjYtLjQuNjctLjA1LjA5TDUuMSAyMC43bC0uMTEuMTgtLjE0LjIzLS4wNy4xMy0uMzMuNTUtLjA0LjA3di4wMWExLjI2IDEuMjYgMCAwIDAtLjE0LjQ3IDEuMzEgMS4zMSAwIDAgMCAxLjI0IDEuNGgxLjVsLjA1LS4wNi4wNC0uMDYuODctMS4yMS4wNS0uMDguNzctMS4wNy4wNS0uMDcuNC0uNTcuMDUtLjA2LjI0LS4zNGExLjUyIDEuNTIgMCAwIDEgMS4zOS0uNjIgMS41IDEuNSAwIDAgMSAuNjQuMiAxLjQ3IDEuNDcgMCAwIDEgLjczIDEuMjcgMS40NCAxLjQ0IDAgMCAxLS4yNy44NGwtLjYzLjg4LS4wNS4wNy0uMzIuNDUtLjA2LjA4LS4wOC4xMi0uMTIuMTYtLjA1LjA4aDIuMTNhMi4zMiAyLjMyIDAgMCAwIDEuNzctLjk2bDEuMTgtMS42My43Ny0xLjA4IDEuMy0xLjhhMS4yNCAxLjI0IDAgMCAxIC41NS0uNDNsLjA4LS4wM2ExLjMgMS4zIDAgMCAxIC4zLS4wNiAxLjI4IDEuMjggMCAwIDEgMS4xNS41NGwuMTEuMmExLjEzIDEuMTMgMCAwIDEgLjEuNDEgMS4xOSAxLjE5IDAgMCAxLS4yMy43N2wtLjAzLjA1LS41Ny44LS43Ljk4LS4yNy4zN2ExLjIyIDEuMjIgMCAwIDAtLjIuNSAxLjA1IDEuMDUgMCAwIDAtLjAyLjIzdi4wNmExLjE3IDEuMTcgMCAwIDAgLjE0LjQzbC4wMi4wNS4wNy4xYTEuNDQgMS40NCAwIDAgMCAuMS4xMWwuMDUuMDYuMDEuMDFhMS44IDEuOCAwIDAgMCAuMTQuMWMwIC4wMi4wMi4wMy4wNC4wM2ExIDEgMCAwIDAgLjA4LjA1bC4wNy4wNGExLjI1IDEuMjUgMCAwIDAgLjUuMWg2LjljLjEgMCAuMi0uMDEuMjktLjAzbC4wNi0uMDJhMS4yNyAxLjI3IDAgMCAwIC4yNy0uMS41Ny41NyAwIDAgMCAuMDctLjAzIDEuMjEgMS4yMSAwIDAgMCAuMjYtLjE5bC4wOC0uMDdhLjkyLjkyIDAgMCAwIC4xNS0uMTkgMS41NSAxLjU1IDAgMCAwIC4wOS0uMTdsLjAyLS4wNWExLjIyIDEuMjIgMCAwIDAgLjA4LS4yNnYtLjA0bC4wMi0uMDh2LS4wOGExLjMyIDEuMzIgMCAwIDAtLjItLjc0bC0xLjYtMi42NC0uMDYtLjEtLjItLjMyLS4zMy0uNTR2LS4wMWwtLjA1LS4wOC0xLjMtMi4xNS0uMDctLjEtLjA0LS4wNi0uOC0xLjMyLS4wNC0uMDctLjItLjM0LS4xLS4xNC0uMS0uMTYtLjUzLS45LS4xMy0uMi0uMDktLjE0LTIuMTctMy41Ny0uMDQtLjA3LS43Mi0xLjE5LS4wNS0uMDctLjQtLjY1YTIuNjUgMi42NSAwIDAgMC0uMy0uNCAyLjk2IDIuOTYgMCAwIDAtLjk3LS43NCAzLjA0IDMuMDQgMCAwIDAtMS4zLS4zYy0uMjUgMC0uNS4wNC0uNzQuMVoiLz48cGF0aCBmaWxsPSJ1cmwoI2IpIiBkPSJNMTkgMTYuM2E1LjQ1IDUuNDUgMCAwIDAtLjgzIDEuNTZsLS4wNC4xNWExLjM2IDEuMzYgMCAwIDEgLjI4LS4xNiAxLjI0IDEuMjQgMCAwIDEgLjM4LS4wOGguMWExLjI4IDEuMjggMCAwIDEgMS4wNS41NGMuMDQuMDYuMDguMTMuMS4yYTEuMjQgMS4yNCAwIDAgMSAuMDkuMjcgMS4xOSAxLjE5IDAgMCAxLS4yLjkxbC0uMDQuMDUtLjU3Ljc5LS43Ljk5LS4yNy4zN2ExLjIzIDEuMjMgMCAwIDAtLjIuNDIgMS4wNiAxLjA2IDAgMCAwLS4wMi4zMXYuMDZhMS4xNyAxLjE3IDAgMCAwIC4xNi40Ny45My45MyAwIDAgMCAuMDcuMSAxLjUgMS41IDAgMCAwIC4xLjEybC4wNS4wNmguMDFhMS45NCAxLjk0IDAgMCAwIC4wOS4wOCAxIDEgMCAwIDAgLjE3LjFsLjA3LjA0YTEuMjUgMS4yNSAwIDAgMCAuNS4xaDYuOWMuMSAwIC4yIDAgLjI4LS4wMmwuMDctLjAyYTEuMzIgMS4zMiAwIDAgMCAuMzQtLjEzbC4xNi0uMS4wMy0uMDNhMS4yOSAxLjI5IDAgMCAwIC4yLS4yIDIuNDMgMi40MyAwIDAgMCAuMTItLjE3Yy4wMy0uMDMuMDUtLjA4LjA3LS4xMmwuMDItLjA1YTEuMjEgMS4yMSAwIDAgMCAuMDktLjN2LS4wOGwuMDEtLjA5YTEuMzIgMS4zMiAwIDAgMC0uMi0uNzNsLTEuNi0yLjY0LS4wNi0uMS0uMi0uMzItLjMzLS41NHYtLjAybC0uMDUtLjA3LTEuMy0yLjE1LS4xMi0uMDctLjA3LS4wNGE0Ljk0IDQuOTQgMCAwIDAtMi40Ni0uNjdjLTEuMDMgMC0xLjc2LjU3LTIuMjYgMS4yWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMi4yOSAyMS4wOGMwIC4yOS0uMDkuNTgtLjI3Ljg0bC0xLjMxIDEuODRIN2wyLjUyLTMuNTNhMS41NCAxLjU0IDAgMCAxIDIuMS0uMzZjLjQzLjI4LjY2Ljc0LjY2IDEuMloiLz48cGF0aCBmaWxsPSIjMDAwIiBkPSJNMTEuMTYgMjEuMjVhLjU2LjU2IDAgMCAxLS41Ny41NS41Ni41NiAwIDAgMS0uNTctLjU2LjU2LjU2IDAgMCAxIC41Ny0uNTUuNTYuNTYgMCAwIDEgLjU3LjU2WiIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjE1LjIzIiB4Mj0iMTkuMyIgeTE9IjI1Ljc4IiB5Mj0iNi4xMSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM2NTIyRjQiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzlCNkJGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0E1ODVGRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMjIuNTkiIHgyPSIyNC44IiB5MT0iMjQuNzEiIHkyPSIxNS41MyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM0MjFGOEIiLz48c3RvcCBvZmZzZXQ9Ii41NSIgc3RvcC1jb2xvcj0iIzcyMzBGRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzk3NzNGRiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg==';\n\nconst FORDEFI_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIiIGhlaWdodD0iNDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHBhdGggZmlsbD0iIzEwMTExNCIgZD0iTTAgMGg0MnY0MkgweiIvPgogIDxwYXRoIGQ9Ik0xOS40NyAyNi44OUg1djMuNTdhNC41NyA0LjU3IDAgMCAwIDQuNTggNC41N2g1LjgzbDQuMDYtOC4xNFoiIGZpbGw9IiM3OTk0RkYiLz4KICA8cGF0aCBkPSJNNSAxNy40aDI3LjU4bC0zLjIgNi43OEg1VjE3LjRaIiBmaWxsPSIjNDg2REZGIi8+CiAgPHBhdGggZD0iTTE0LjY3IDdINXY3LjY4aDMzVjdoLTkuNjd2NS43NGgtMlY3aC05LjY3djUuNzRoLTEuOTlWN1oiIGZpbGw9IiM1Q0QxRkEiLz4KPC9zdmc+Cg==';\n\nexport const STACKS_PROVIDERS: StacksProviderConfig[] = [\n {\n id: 'LeatherProvider',\n name: 'Leather',\n icon: LEATHER_ICON,\n installUrl: 'https://chrome.google.com/webstore/detail/hiro-wallet/ldinpeekobnhjjdofggfgjlcehhmanlj',\n },\n {\n id: 'XverseProviders.BitcoinProvider',\n name: 'Xverse Wallet',\n icon: XVERSE_ICON,\n installUrl: 'https://chrome.google.com/webstore/detail/xverse-wallet/idnnbdplmphpflfnlkomgpfbpcgelopg',\n },\n {\n id: 'AsignaProvider',\n name: 'Asigna Multisig',\n icon: ASIGNA_ICON,\n installUrl: 'https://stx.asigna.io/',\n },\n {\n id: 'FordefiProviders.UtxoProvider',\n name: 'Fordefi',\n icon: FORDEFI_ICON,\n installUrl: 'https://chromewebstore.google.com/detail/fordefi/hcmehenccjdmfbojapcbcofkgdpbnlle',\n },\n];\n","import { useMemo } from 'react';\nimport { StacksXConnector } from './StacksXConnector.js';\nimport { STACKS_PROVIDERS } from './constants.js';\n\nexport function useStacksXConnectors(): StacksXConnector[] {\n return useMemo(() => STACKS_PROVIDERS.map(config => new StacksXConnector(config)), []);\n}\n"]}
|