@sodax/wallet-sdk-react 1.5.7-beta → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -145
- package/ai-exported/AGENTS.md +122 -0
- package/ai-exported/integration/README.md +102 -0
- package/ai-exported/integration/ai-rules.md +136 -0
- package/ai-exported/integration/architecture.md +181 -0
- package/ai-exported/integration/examples/01-minimal-evm.tsx +75 -0
- package/ai-exported/integration/examples/02-multi-chain-modal.tsx +169 -0
- package/ai-exported/integration/examples/03-nextjs-app-router.tsx +99 -0
- package/ai-exported/integration/examples/04-walletconnect-setup.tsx +89 -0
- package/ai-exported/integration/examples/README.md +29 -0
- package/ai-exported/integration/recipes/batch-operations.md +223 -0
- package/ai-exported/integration/recipes/bridge-to-sdk.md +164 -0
- package/ai-exported/integration/recipes/chain-detection.md +254 -0
- package/ai-exported/integration/recipes/connect-button.md +156 -0
- package/ai-exported/integration/recipes/multi-chain-modal.md +199 -0
- package/ai-exported/integration/recipes/setup.md +158 -0
- package/ai-exported/integration/recipes/sign-message.md +137 -0
- package/ai-exported/integration/recipes/sub-path-imports.md +95 -0
- package/ai-exported/integration/recipes/switch-chain.md +141 -0
- package/ai-exported/integration/recipes/walletconnect-setup.md +139 -0
- package/ai-exported/integration/reference/api-surface.md +175 -0
- package/ai-exported/integration/reference/chain-support.md +78 -0
- package/ai-exported/integration/reference/connectors.md +74 -0
- package/ai-exported/integration/reference/hooks.md +204 -0
- package/ai-exported/integration/reference/wallet-brands.md +106 -0
- package/ai-exported/migration/README.md +49 -0
- package/ai-exported/migration/ai-rules.md +144 -0
- package/ai-exported/migration/breaking-changes.md +305 -0
- package/ai-exported/migration/checklist.md +159 -0
- package/ai-exported/migration/recipes/connect-button.md +166 -0
- package/ai-exported/migration/recipes/multi-chain-modal.md +244 -0
- package/ai-exported/migration/recipes/ssr-setup.md +162 -0
- package/ai-exported/migration/recipes/walletconnect-migration.md +168 -0
- package/ai-exported/migration/reference/components.md +73 -0
- package/ai-exported/migration/reference/config.md +307 -0
- package/ai-exported/migration/reference/hooks.md +278 -0
- package/ai-exported/migration/reference/imports.md +157 -0
- package/dist/XConnector-B9YQTVJ4.d.ts +146 -0
- package/dist/chunk-2BOUGCJ7.mjs +150 -0
- package/dist/chunk-2BOUGCJ7.mjs.map +1 -0
- package/dist/chunk-66BAUK56.mjs +202 -0
- package/dist/chunk-66BAUK56.mjs.map +1 -0
- package/dist/chunk-7ULB6DW4.mjs +102 -0
- package/dist/chunk-7ULB6DW4.mjs.map +1 -0
- package/dist/chunk-BKJB527E.mjs +125 -0
- package/dist/chunk-BKJB527E.mjs.map +1 -0
- package/dist/chunk-BXJLBR4G.mjs +88 -0
- package/dist/chunk-BXJLBR4G.mjs.map +1 -0
- package/dist/chunk-E5IAZ7E6.mjs +186 -0
- package/dist/chunk-E5IAZ7E6.mjs.map +1 -0
- package/dist/chunk-MAQ47Q52.mjs +33 -0
- package/dist/chunk-MAQ47Q52.mjs.map +1 -0
- package/dist/chunk-MXZVF5HR.mjs +34 -0
- package/dist/chunk-MXZVF5HR.mjs.map +1 -0
- package/dist/chunk-N5A2TMF6.mjs +33 -0
- package/dist/chunk-N5A2TMF6.mjs.map +1 -0
- package/dist/chunk-NY7U7OJW.mjs +64 -0
- package/dist/chunk-NY7U7OJW.mjs.map +1 -0
- package/dist/chunk-PJLEJVAU.mjs +140 -0
- package/dist/chunk-PJLEJVAU.mjs.map +1 -0
- package/dist/chunk-PLCA4ZDJ.mjs +1585 -0
- package/dist/chunk-PLCA4ZDJ.mjs.map +1 -0
- package/dist/chunk-TZMKDXFA.mjs +3 -0
- package/dist/chunk-TZMKDXFA.mjs.map +1 -0
- package/dist/chunk-X2MHIWXO.mjs +100 -0
- package/dist/chunk-X2MHIWXO.mjs.map +1 -0
- package/dist/chunk-XZ7CHO2S.mjs +41 -0
- package/dist/chunk-XZ7CHO2S.mjs.map +1 -0
- package/dist/config-OlnzyEUE.d.ts +146 -0
- package/dist/index.cjs +2784 -1594
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +768 -1498
- package/dist/index.mjs +463 -2004
- package/dist/index.mjs.map +1 -1
- package/dist/xchains/bitcoin/index.cjs +1927 -0
- package/dist/xchains/bitcoin/index.cjs.map +1 -0
- package/dist/xchains/bitcoin/index.d.ts +125 -0
- package/dist/xchains/bitcoin/index.mjs +16 -0
- package/dist/xchains/bitcoin/index.mjs.map +1 -0
- package/dist/xchains/evm/index.cjs +316 -0
- package/dist/xchains/evm/index.cjs.map +1 -0
- package/dist/xchains/evm/index.d.ts +39 -0
- package/dist/xchains/evm/index.mjs +5 -0
- package/dist/xchains/evm/index.mjs.map +1 -0
- package/dist/xchains/icon/index.cjs +311 -0
- package/dist/xchains/icon/index.cjs.map +1 -0
- package/dist/xchains/icon/index.d.ts +37 -0
- package/dist/xchains/icon/index.mjs +7 -0
- package/dist/xchains/icon/index.mjs.map +1 -0
- package/dist/xchains/injective/index.cjs +223 -0
- package/dist/xchains/injective/index.cjs.map +1 -0
- package/dist/xchains/injective/index.d.ts +35 -0
- package/dist/xchains/injective/index.mjs +5 -0
- package/dist/xchains/injective/index.mjs.map +1 -0
- package/dist/xchains/near/index.cjs +190 -0
- package/dist/xchains/near/index.cjs.map +1 -0
- package/dist/xchains/near/index.d.ts +34 -0
- package/dist/xchains/near/index.mjs +6 -0
- package/dist/xchains/near/index.mjs.map +1 -0
- package/dist/xchains/solana/index.cjs +186 -0
- package/dist/xchains/solana/index.cjs.map +1 -0
- package/dist/xchains/solana/index.d.ts +26 -0
- package/dist/xchains/solana/index.mjs +7 -0
- package/dist/xchains/solana/index.mjs.map +1 -0
- package/dist/xchains/stacks/index.cjs +240 -0
- package/dist/xchains/stacks/index.cjs.map +1 -0
- package/dist/xchains/stacks/index.d.ts +36 -0
- package/dist/xchains/stacks/index.mjs +5 -0
- package/dist/xchains/stacks/index.mjs.map +1 -0
- package/dist/xchains/stellar/index.cjs +322 -0
- package/dist/xchains/stellar/index.cjs.map +1 -0
- package/dist/xchains/stellar/index.d.ts +44 -0
- package/dist/xchains/stellar/index.mjs +6 -0
- package/dist/xchains/stellar/index.mjs.map +1 -0
- package/dist/xchains/sui/index.cjs +248 -0
- package/dist/xchains/sui/index.cjs.map +1 -0
- package/dist/xchains/sui/index.d.ts +37 -0
- package/dist/xchains/sui/index.mjs +7 -0
- package/dist/xchains/sui/index.mjs.map +1 -0
- package/docs/ADDING_A_NEW_CHAIN.md +440 -0
- package/docs/ARCHITECTURE.md +291 -0
- package/docs/BATCH_OPERATIONS.md +267 -0
- package/docs/CHAIN_DETECTION.md +216 -0
- package/docs/CONFIGURE_PROVIDER.md +360 -0
- package/docs/CONNECTORS.md +247 -0
- package/docs/CONNECT_FLOW.md +276 -0
- package/docs/EVM_SWITCH_CHAIN.md +161 -0
- package/docs/SIGN_MESSAGE.md +213 -0
- package/docs/SUB_PATH_EXPORTS.md +246 -0
- package/docs/WALLETCONNECT.md +154 -0
- package/docs/WALLET_MODAL.md +331 -0
- package/docs/WALLET_PROVIDER_BRIDGE.md +226 -0
- package/package.json +34 -9
- package/skills/SKILLS.md +84 -0
- package/skills/bridge-to-sdk.md +148 -0
- package/skills/connect-button.md +116 -0
- package/skills/evm-only-walletconnect.md +111 -0
- package/skills/multi-chain-modal.md +178 -0
- package/skills/setup.md +107 -0
- package/dist/index.d.cts +0 -1579
- package/src/Hydrate.ts +0 -65
- package/src/SodaxWalletProvider.tsx +0 -97
- package/src/actions/getXChainType.ts +0 -8
- package/src/actions/getXService.ts +0 -33
- package/src/actions/index.ts +0 -2
- package/src/assets/wallets/hana.svg +0 -6
- package/src/assets/wallets/havah.svg +0 -76
- package/src/assets/wallets/keplr.svg +0 -30
- package/src/assets/wallets/metamask.svg +0 -60
- package/src/assets/wallets/phantom.svg +0 -4
- package/src/assets/wallets/sui.svg +0 -20
- package/src/core/XConnector.ts +0 -54
- package/src/core/XService.ts +0 -85
- package/src/core/index.ts +0 -2
- package/src/hooks/index.ts +0 -11
- package/src/hooks/useEthereumChainId.ts +0 -44
- package/src/hooks/useEvmSwitchChain.ts +0 -91
- package/src/hooks/useWalletProvider.ts +0 -206
- package/src/hooks/useXAccount.ts +0 -51
- package/src/hooks/useXAccounts.ts +0 -56
- package/src/hooks/useXBalances.ts +0 -65
- package/src/hooks/useXConnect.ts +0 -118
- package/src/hooks/useXConnection.ts +0 -72
- package/src/hooks/useXConnectors.ts +0 -72
- package/src/hooks/useXDisconnect.ts +0 -73
- package/src/hooks/useXService.ts +0 -8
- package/src/hooks/useXSignMessage.ts +0 -82
- package/src/index.ts +0 -19
- package/src/types/index.ts +0 -22
- package/src/useXWagmiStore.ts +0 -116
- package/src/utils/index.ts +0 -21
- package/src/xchains/bitcoin/BitcoinXConnector.ts +0 -34
- package/src/xchains/bitcoin/BitcoinXService.ts +0 -40
- package/src/xchains/bitcoin/OKXXConnector.ts +0 -117
- package/src/xchains/bitcoin/UnisatXConnector.ts +0 -117
- package/src/xchains/bitcoin/XverseXConnector.ts +0 -232
- package/src/xchains/bitcoin/index.ts +0 -7
- package/src/xchains/bitcoin/useBitcoinXConnectors.ts +0 -14
- package/src/xchains/evm/EvmXConnector.ts +0 -27
- package/src/xchains/evm/EvmXService.ts +0 -211
- package/src/xchains/evm/index.ts +0 -3
- package/src/xchains/icon/IconHanaXConnector.ts +0 -39
- package/src/xchains/icon/IconXService.ts +0 -117
- package/src/xchains/icon/actions.ts +0 -28
- package/src/xchains/icon/iconex/index.tsx +0 -46
- package/src/xchains/icon/index.ts +0 -2
- package/src/xchains/injective/InjectiveXConnector.ts +0 -60
- package/src/xchains/injective/InjectiveXService.ts +0 -62
- package/src/xchains/injective/actions.ts +0 -32
- package/src/xchains/injective/index.ts +0 -2
- package/src/xchains/near/NearXConnector.ts +0 -42
- package/src/xchains/near/NearXService.ts +0 -46
- package/src/xchains/near/useNearXConnectors.ts +0 -23
- package/src/xchains/solana/SolanaXConnector.ts +0 -26
- package/src/xchains/solana/SolanaXService.ts +0 -46
- package/src/xchains/solana/index.ts +0 -2
- package/src/xchains/stacks/StacksXConnector.ts +0 -63
- package/src/xchains/stacks/StacksXService.ts +0 -59
- package/src/xchains/stacks/constants.ts +0 -42
- package/src/xchains/stacks/index.ts +0 -4
- package/src/xchains/stacks/useStacksXConnectors.ts +0 -7
- package/src/xchains/stellar/CustomSorobanServer.ts +0 -93
- package/src/xchains/stellar/StellarWalletsKitXConnector.ts +0 -53
- package/src/xchains/stellar/StellarXService.ts +0 -93
- package/src/xchains/stellar/actions.ts +0 -24
- package/src/xchains/stellar/index.tsx +0 -2
- package/src/xchains/stellar/useStellarXConnectors.ts +0 -21
- package/src/xchains/stellar/utils.ts +0 -49
- package/src/xchains/sui/SuiXConnector.ts +0 -28
- package/src/xchains/sui/SuiXService.ts +0 -66
- package/src/xchains/sui/index.ts +0 -2
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { assert, isRecord, hasBooleanProperty } from './chunk-MAQ47Q52.mjs';
|
|
2
|
+
import { WALLET_METADATA } from './chunk-MXZVF5HR.mjs';
|
|
3
|
+
import { isNativeToken } from './chunk-NY7U7OJW.mjs';
|
|
4
|
+
import { XService, XConnector } from './chunk-X2MHIWXO.mjs';
|
|
5
|
+
import * as IconSdkRaw from 'icon-sdk-js';
|
|
6
|
+
|
|
7
|
+
var IconSdk = "default" in IconSdkRaw.default ? IconSdkRaw.default : IconSdkRaw;
|
|
8
|
+
var { IconService: IconServiceConstructor, Builder: IconBuilder, Converter: IconConverter } = IconSdk;
|
|
9
|
+
var SupportedChainId = /* @__PURE__ */ ((SupportedChainId2) => {
|
|
10
|
+
SupportedChainId2[SupportedChainId2["MAINNET"] = 1] = "MAINNET";
|
|
11
|
+
return SupportedChainId2;
|
|
12
|
+
})(SupportedChainId || {});
|
|
13
|
+
var CHAIN_INFO = {
|
|
14
|
+
[1 /* MAINNET */]: {
|
|
15
|
+
name: "ICON Mainnet",
|
|
16
|
+
node: "https://ctz.solidwallet.io",
|
|
17
|
+
APIEndpoint: "https://ctz.solidwallet.io/api/v3",
|
|
18
|
+
debugAPIEndpoint: "https://api.icon.community/api/v3d",
|
|
19
|
+
chainId: 1,
|
|
20
|
+
tracker: "https://tracker.icon.community"
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
var IconXService = class _IconXService extends XService {
|
|
24
|
+
static instance;
|
|
25
|
+
iconService;
|
|
26
|
+
constructor(rpcUrl) {
|
|
27
|
+
super("ICON");
|
|
28
|
+
const mainnetInfo = CHAIN_INFO[1 /* MAINNET */];
|
|
29
|
+
if (!mainnetInfo) throw new Error("ICON mainnet chain info not found");
|
|
30
|
+
this.iconService = new IconServiceConstructor(
|
|
31
|
+
new IconServiceConstructor.HttpProvider(rpcUrl ?? mainnetInfo.APIEndpoint)
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
static getInstance(rpcUrl) {
|
|
35
|
+
if (!_IconXService.instance) {
|
|
36
|
+
_IconXService.instance = new _IconXService(rpcUrl);
|
|
37
|
+
}
|
|
38
|
+
return _IconXService.instance;
|
|
39
|
+
}
|
|
40
|
+
async getAggregateData(requireSuccess, calls) {
|
|
41
|
+
const rawTx = new IconBuilder.CallBuilder().to("cxa4aa9185e23558cff990f494c1fd2845f6cbf741").method("tryAggregate").params({ requireSuccess: IconConverter.toHex(requireSuccess ? 1 : 0), calls }).build();
|
|
42
|
+
try {
|
|
43
|
+
const result = await this.iconService.call(rawTx).execute();
|
|
44
|
+
const aggs = result["returnData"];
|
|
45
|
+
const data = aggs.map((agg) => {
|
|
46
|
+
if (agg["success"] === "0x0") {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return agg["returnData"];
|
|
50
|
+
});
|
|
51
|
+
return data;
|
|
52
|
+
} catch (err) {
|
|
53
|
+
console.error(err);
|
|
54
|
+
return Array(calls.length).fill(null);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async getBalances(address, xTokens) {
|
|
58
|
+
if (!address) return {};
|
|
59
|
+
const balances = {};
|
|
60
|
+
const nativeXToken = xTokens.find((xToken) => isNativeToken(xToken));
|
|
61
|
+
const nonNativeXTokens = xTokens.filter((xToken) => !isNativeToken(xToken));
|
|
62
|
+
if (nativeXToken) {
|
|
63
|
+
const balance = await this.iconService.getBalance(address).execute();
|
|
64
|
+
balances[nativeXToken.address] = BigInt(balance.toFixed());
|
|
65
|
+
}
|
|
66
|
+
const cds = nonNativeXTokens.map((token) => {
|
|
67
|
+
return {
|
|
68
|
+
target: token.address,
|
|
69
|
+
method: "balanceOf",
|
|
70
|
+
params: [address]
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
const data = await this.getAggregateData(
|
|
74
|
+
false,
|
|
75
|
+
cds.filter((cd) => cd.target.startsWith("cx"))
|
|
76
|
+
);
|
|
77
|
+
return nonNativeXTokens.reduce((agg, token, idx) => {
|
|
78
|
+
const balance = data[idx];
|
|
79
|
+
if (balance) {
|
|
80
|
+
balances[token.address] = BigInt(balance);
|
|
81
|
+
}
|
|
82
|
+
return agg;
|
|
83
|
+
}, balances);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// src/xchains/icon/iconex/index.tsx
|
|
88
|
+
var ICONEX_RELAY_RESPONSE = "ICONEX_RELAY_RESPONSE";
|
|
89
|
+
var ICONEX_RELAY_REQUEST = "ICONEX_RELAY_REQUEST";
|
|
90
|
+
var request = (event) => {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const handler = (evt) => {
|
|
93
|
+
window.removeEventListener(ICONEX_RELAY_RESPONSE, handler);
|
|
94
|
+
resolve(evt.detail);
|
|
95
|
+
};
|
|
96
|
+
window.addEventListener(ICONEX_RELAY_RESPONSE, handler);
|
|
97
|
+
window.dispatchEvent(
|
|
98
|
+
new CustomEvent(ICONEX_RELAY_REQUEST, {
|
|
99
|
+
detail: event
|
|
100
|
+
})
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// src/xchains/icon/IconHanaXConnector.ts
|
|
106
|
+
var isHanaWallet = (value) => {
|
|
107
|
+
return isRecord(value) && (value.available === void 0 || hasBooleanProperty(value, "available"));
|
|
108
|
+
};
|
|
109
|
+
var IconHanaXConnector = class extends XConnector {
|
|
110
|
+
constructor() {
|
|
111
|
+
super("ICON", "Hana Wallet", "hana");
|
|
112
|
+
}
|
|
113
|
+
get isInstalled() {
|
|
114
|
+
if (typeof window === "undefined") return false;
|
|
115
|
+
const hanaWallet = window.hanaWallet;
|
|
116
|
+
return isHanaWallet(hanaWallet) && hanaWallet.available === true;
|
|
117
|
+
}
|
|
118
|
+
get installUrl() {
|
|
119
|
+
return WALLET_METADATA.hana.installUrl;
|
|
120
|
+
}
|
|
121
|
+
async connect() {
|
|
122
|
+
const hanaWallet = window.hanaWallet;
|
|
123
|
+
assert(isHanaWallet(hanaWallet) || hanaWallet === void 0, "[IconHanaXConnector] invalid window.hanaWallet type");
|
|
124
|
+
if (!hanaWallet || !hanaWallet.available) {
|
|
125
|
+
window.open(WALLET_METADATA.hana.installUrl, "_blank", "noopener,noreferrer");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const detail = await request({
|
|
129
|
+
type: "REQUEST_ADDRESS" /* REQUEST_ADDRESS */
|
|
130
|
+
});
|
|
131
|
+
if (detail?.type === "RESPONSE_ADDRESS" /* RESPONSE_ADDRESS */) {
|
|
132
|
+
return {
|
|
133
|
+
address: detail?.payload,
|
|
134
|
+
xChainType: this.xChainType
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
console.warn("[IconHanaXConnector] connect: unexpected response from Hana wallet", detail);
|
|
138
|
+
return void 0;
|
|
139
|
+
}
|
|
140
|
+
async disconnect() {
|
|
141
|
+
console.log("HanaIconXConnector disconnected");
|
|
142
|
+
}
|
|
143
|
+
get icon() {
|
|
144
|
+
return WALLET_METADATA.hana.icon;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
export { CHAIN_INFO, IconHanaXConnector, IconXService, SupportedChainId, request };
|
|
149
|
+
//# sourceMappingURL=chunk-2BOUGCJ7.mjs.map
|
|
150
|
+
//# sourceMappingURL=chunk-2BOUGCJ7.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { STELLAR_DEFAULT_HORIZON_RPC_URL, STELLAR_DEFAULT_SOROBAN_RPC_URL } from './chunk-MXZVF5HR.mjs';
|
|
2
|
+
import { XService, XConnector } from './chunk-X2MHIWXO.mjs';
|
|
3
|
+
import { StellarWalletsKit, allowAllModules, WalletNetwork } from '@creit.tech/stellar-wallets-kit';
|
|
4
|
+
import * as StellarSdk from '@stellar/stellar-sdk';
|
|
5
|
+
import { rpc, Address, Contract, TimeoutInfinite, scValToBigInt } from '@stellar/stellar-sdk';
|
|
6
|
+
|
|
7
|
+
var CustomSorobanServer = class extends rpc.Server {
|
|
8
|
+
customHeaders;
|
|
9
|
+
constructor(serverUrl, customHeaders) {
|
|
10
|
+
super(serverUrl, {
|
|
11
|
+
allowHttp: true
|
|
12
|
+
});
|
|
13
|
+
this.customHeaders = customHeaders;
|
|
14
|
+
}
|
|
15
|
+
async simulateTransaction(tx) {
|
|
16
|
+
const requestOptions = {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: {
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
...this.customHeaders
|
|
21
|
+
},
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
id: 1,
|
|
24
|
+
jsonrpc: "2.0",
|
|
25
|
+
method: "simulateTransaction",
|
|
26
|
+
params: {
|
|
27
|
+
transaction: tx.toXDR()
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
};
|
|
31
|
+
const response = await fetch(`${this.serverURL}`, requestOptions);
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
throw new Error(`HTTP error simulating TX! status: ${response.status}`);
|
|
34
|
+
}
|
|
35
|
+
return response.json().then((json) => rpc.parseRawSimulation(json.result));
|
|
36
|
+
}
|
|
37
|
+
async sendTransaction(tx) {
|
|
38
|
+
const requestOptions = {
|
|
39
|
+
method: "POST",
|
|
40
|
+
headers: {
|
|
41
|
+
"Content-Type": "application/json",
|
|
42
|
+
...this.customHeaders
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
id: 1,
|
|
46
|
+
jsonrpc: "2.0",
|
|
47
|
+
method: "sendTransaction",
|
|
48
|
+
params: {
|
|
49
|
+
transaction: tx.toXDR()
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
const response = await fetch(`${this.serverURL}`, requestOptions);
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
throw new Error(`HTTP error submitting TX! status: ${response.status}`);
|
|
56
|
+
}
|
|
57
|
+
return response.json().then((json) => json.result);
|
|
58
|
+
}
|
|
59
|
+
async getTransaction(hash) {
|
|
60
|
+
const requestOptions = {
|
|
61
|
+
method: "POST",
|
|
62
|
+
headers: {
|
|
63
|
+
"Content-Type": "application/json",
|
|
64
|
+
...this.customHeaders
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify({
|
|
67
|
+
id: 1,
|
|
68
|
+
jsonrpc: "2.0",
|
|
69
|
+
method: "getTransaction",
|
|
70
|
+
params: { hash }
|
|
71
|
+
})
|
|
72
|
+
};
|
|
73
|
+
const response = await fetch(`${this.serverURL}`, requestOptions);
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
throw new Error(`HTTP error getting TX! status: ${response.status}`);
|
|
76
|
+
}
|
|
77
|
+
return response.json().then((json) => json.result);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var CustomSorobanServer_default = CustomSorobanServer;
|
|
81
|
+
var accountToScVal = (account) => new Address(account).toScVal();
|
|
82
|
+
var simulateTx = (tx, server) => server.simulateTransaction(tx);
|
|
83
|
+
var getTokenBalance = async (address, tokenId, txBuilder, server) => {
|
|
84
|
+
const params = [accountToScVal(address)];
|
|
85
|
+
const contract = new Contract(tokenId);
|
|
86
|
+
const tx = txBuilder.addOperation(contract.call("balance", ...params)).setTimeout(TimeoutInfinite).build();
|
|
87
|
+
const result = await simulateTx(tx, server);
|
|
88
|
+
if (!rpc.Api.isSimulationSuccess(result)) {
|
|
89
|
+
throw new Error(`Simulation failed: ${JSON.stringify(result)}`);
|
|
90
|
+
}
|
|
91
|
+
return result.result ? scValToBigInt(result.result.retval) : 0n;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// src/xchains/stellar/StellarXService.ts
|
|
95
|
+
var STELLAR_BASE_RESERVE_STROOPS = 5e6;
|
|
96
|
+
function parseXlmBalanceToStroops(balanceStr) {
|
|
97
|
+
const parts = balanceStr.split(".");
|
|
98
|
+
const whole = parts[0] ?? "0";
|
|
99
|
+
const frac = (parts[1] ?? "").padEnd(7, "0").slice(0, 7);
|
|
100
|
+
return BigInt(whole + frac);
|
|
101
|
+
}
|
|
102
|
+
var StellarXService = class _StellarXService extends XService {
|
|
103
|
+
static instance;
|
|
104
|
+
walletsKit;
|
|
105
|
+
server;
|
|
106
|
+
sorobanServer;
|
|
107
|
+
constructor(horizonRpcUrl, sorobanRpcUrl) {
|
|
108
|
+
super("STELLAR");
|
|
109
|
+
this.walletsKit = new StellarWalletsKit({
|
|
110
|
+
network: WalletNetwork.PUBLIC,
|
|
111
|
+
modules: allowAllModules()
|
|
112
|
+
});
|
|
113
|
+
this.server = new StellarSdk.Horizon.Server(horizonRpcUrl ?? STELLAR_DEFAULT_HORIZON_RPC_URL, { allowHttp: true });
|
|
114
|
+
this.sorobanServer = new CustomSorobanServer_default(sorobanRpcUrl ?? STELLAR_DEFAULT_SOROBAN_RPC_URL, {});
|
|
115
|
+
}
|
|
116
|
+
static getInstance(horizonRpcUrl, sorobanRpcUrl) {
|
|
117
|
+
if (!_StellarXService.instance) {
|
|
118
|
+
_StellarXService.instance = new _StellarXService(horizonRpcUrl, sorobanRpcUrl);
|
|
119
|
+
} else {
|
|
120
|
+
if (horizonRpcUrl) {
|
|
121
|
+
_StellarXService.instance.server = new StellarSdk.Horizon.Server(horizonRpcUrl, { allowHttp: true });
|
|
122
|
+
}
|
|
123
|
+
if (sorobanRpcUrl) {
|
|
124
|
+
_StellarXService.instance.sorobanServer = new CustomSorobanServer_default(sorobanRpcUrl, {});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return _StellarXService.instance;
|
|
128
|
+
}
|
|
129
|
+
async getBalance(address, xToken) {
|
|
130
|
+
if (!address) return BigInt(0);
|
|
131
|
+
const stellarAccount = await this.server.loadAccount(address);
|
|
132
|
+
if (xToken.symbol === "XLM") {
|
|
133
|
+
const xlmBalance = stellarAccount.balances.find((balance) => balance.asset_type === "native");
|
|
134
|
+
if (xlmBalance) {
|
|
135
|
+
const rawBalanceStroops = parseXlmBalanceToStroops(xlmBalance.balance);
|
|
136
|
+
const sellingLiabilitiesStroops = xlmBalance.selling_liabilities ? parseXlmBalanceToStroops(xlmBalance.selling_liabilities) : BigInt(0);
|
|
137
|
+
const reserveFields = stellarAccount;
|
|
138
|
+
const subentryCount = reserveFields.subentry_count ?? 0;
|
|
139
|
+
const numSponsoring = reserveFields.num_sponsoring ?? 0;
|
|
140
|
+
const numSponsored = reserveFields.num_sponsored ?? 0;
|
|
141
|
+
const reserveCount = Math.max(0, 2 + subentryCount + numSponsoring - numSponsored);
|
|
142
|
+
const minBalanceStroops = BigInt(reserveCount) * BigInt(STELLAR_BASE_RESERVE_STROOPS) + sellingLiabilitiesStroops;
|
|
143
|
+
const availableStroops = rawBalanceStroops > minBalanceStroops ? rawBalanceStroops - minBalanceStroops : BigInt(0);
|
|
144
|
+
return availableStroops;
|
|
145
|
+
}
|
|
146
|
+
} else {
|
|
147
|
+
try {
|
|
148
|
+
const txBuilder = new StellarSdk.TransactionBuilder(stellarAccount, {
|
|
149
|
+
fee: StellarSdk.BASE_FEE,
|
|
150
|
+
networkPassphrase: StellarSdk.Networks.PUBLIC
|
|
151
|
+
});
|
|
152
|
+
const balance = await getTokenBalance(address, xToken.address, txBuilder, this.sorobanServer);
|
|
153
|
+
return balance;
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.error(`Error while fetching token on Stellar: ${xToken.symbol}, Error: ${e}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return BigInt(0);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/xchains/stellar/StellarWalletsKitXConnector.ts
|
|
163
|
+
var StellarWalletsKitXConnector = class extends XConnector {
|
|
164
|
+
_wallet;
|
|
165
|
+
constructor(wallet) {
|
|
166
|
+
super("STELLAR", wallet.name, wallet.id);
|
|
167
|
+
this._wallet = wallet;
|
|
168
|
+
}
|
|
169
|
+
getXService() {
|
|
170
|
+
return StellarXService.getInstance();
|
|
171
|
+
}
|
|
172
|
+
async connect() {
|
|
173
|
+
const kit = this.getXService().walletsKit;
|
|
174
|
+
if (!this._wallet) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!this._wallet.isAvailable) {
|
|
178
|
+
throw new Error(`${this._wallet.name} is not installed. Install the wallet and reload the page.`);
|
|
179
|
+
}
|
|
180
|
+
kit.setWallet(this._wallet.id);
|
|
181
|
+
const { address } = await kit.getAddress();
|
|
182
|
+
return {
|
|
183
|
+
address,
|
|
184
|
+
xChainType: this.xChainType
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
async disconnect() {
|
|
188
|
+
}
|
|
189
|
+
get icon() {
|
|
190
|
+
return this._wallet.icon;
|
|
191
|
+
}
|
|
192
|
+
get isInstalled() {
|
|
193
|
+
return this._wallet.isAvailable;
|
|
194
|
+
}
|
|
195
|
+
get installUrl() {
|
|
196
|
+
return this._wallet.url;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
export { StellarWalletsKitXConnector, StellarXService };
|
|
201
|
+
//# sourceMappingURL=chunk-66BAUK56.mjs.map
|
|
202
|
+
//# sourceMappingURL=chunk-66BAUK56.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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":"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","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"]}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { assertSuiProviderShape, assert, isRecord, hasStringProperty, hasOptionalStringProperty } from './chunk-MAQ47Q52.mjs';
|
|
2
|
+
import { isNativeToken } from './chunk-NY7U7OJW.mjs';
|
|
3
|
+
import { XService, XConnector } from './chunk-X2MHIWXO.mjs';
|
|
4
|
+
import { SuiWalletProvider } from '@sodax/wallet-sdk-core';
|
|
5
|
+
|
|
6
|
+
var SuiXService = class _SuiXService extends XService {
|
|
7
|
+
static instance;
|
|
8
|
+
// Hydrated by SuiHydrator. Start undefined because wallet may not be connected yet.
|
|
9
|
+
// suiClient is typed structurally for the methods we call directly.
|
|
10
|
+
// suiWallet/suiAccount are opaque — stored and passed through to SuiWalletProvider.
|
|
11
|
+
suiClient;
|
|
12
|
+
suiWallet;
|
|
13
|
+
suiAccount;
|
|
14
|
+
constructor() {
|
|
15
|
+
super("SUI");
|
|
16
|
+
}
|
|
17
|
+
static getInstance() {
|
|
18
|
+
if (!_SuiXService.instance) {
|
|
19
|
+
_SuiXService.instance = new _SuiXService();
|
|
20
|
+
}
|
|
21
|
+
return _SuiXService.instance;
|
|
22
|
+
}
|
|
23
|
+
createWalletProvider() {
|
|
24
|
+
if (!this.suiClient || !this.suiWallet || !this.suiAccount) {
|
|
25
|
+
console.warn(
|
|
26
|
+
"[SuiXService] createWalletProvider: missing dependencies \u2014 wallet not connected yet",
|
|
27
|
+
{ hasClient: !!this.suiClient, hasWallet: !!this.suiWallet, hasAccount: !!this.suiAccount }
|
|
28
|
+
);
|
|
29
|
+
return void 0;
|
|
30
|
+
}
|
|
31
|
+
assertSuiProviderShape("SuiXService", this.suiClient, this.suiWallet, this.suiAccount);
|
|
32
|
+
return new SuiWalletProvider({
|
|
33
|
+
client: this.suiClient,
|
|
34
|
+
wallet: this.suiWallet,
|
|
35
|
+
account: this.suiAccount
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// getBalance is not used because getBalances uses getAllBalances which returns all balances
|
|
39
|
+
async getBalances(address, xTokens) {
|
|
40
|
+
if (!address || !this.suiClient) return {};
|
|
41
|
+
const client = this.suiClient;
|
|
42
|
+
try {
|
|
43
|
+
const balancePromises = xTokens.map(async (xToken) => {
|
|
44
|
+
let coinType = isNativeToken(xToken) ? "0x2::sui::SUI" : xToken.address;
|
|
45
|
+
if (coinType === "0x03917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR") {
|
|
46
|
+
coinType = "0x3917a812fe4a6d6bc779c5ab53f8a80ba741f8af04121193fc44e0f662e2ceb::balanced_dollar::BALANCED_DOLLAR";
|
|
47
|
+
}
|
|
48
|
+
const balance = await client.getBalance({
|
|
49
|
+
owner: address,
|
|
50
|
+
coinType
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
address: xToken.address,
|
|
54
|
+
balance: balance ? BigInt(balance.totalBalance) : void 0
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
const results = await Promise.all(balancePromises);
|
|
58
|
+
const tokenMap = {};
|
|
59
|
+
results.forEach((result) => {
|
|
60
|
+
if (result.balance !== void 0) {
|
|
61
|
+
tokenMap[result.address] = result.balance;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return tokenMap;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.error("[wallet-sdk-react] SUI getBalances failed:", error);
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// src/xchains/sui/SuiXConnector.ts
|
|
73
|
+
var isSuiWalletInfo = (value) => {
|
|
74
|
+
return isRecord(value) && hasStringProperty(value, "name") && // Some wallets may not expose `id` — in that case we fall back to `name` for stability.
|
|
75
|
+
// We still validate if it exists.
|
|
76
|
+
hasOptionalStringProperty(value, "id") && hasOptionalStringProperty(value, "icon");
|
|
77
|
+
};
|
|
78
|
+
var SuiXConnector = class extends XConnector {
|
|
79
|
+
wallet;
|
|
80
|
+
constructor(wallet) {
|
|
81
|
+
assert(isSuiWalletInfo(wallet), "[SuiXConnector] invalid wallet object");
|
|
82
|
+
const id = wallet.id ?? wallet.name;
|
|
83
|
+
assert(typeof id === "string" && id.length > 0, "[SuiXConnector] invalid wallet id");
|
|
84
|
+
super("SUI", wallet.name, id);
|
|
85
|
+
this.wallet = { id, name: wallet.name, icon: wallet.icon };
|
|
86
|
+
}
|
|
87
|
+
getXService() {
|
|
88
|
+
return SuiXService.getInstance();
|
|
89
|
+
}
|
|
90
|
+
async connect() {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
async disconnect() {
|
|
94
|
+
}
|
|
95
|
+
get icon() {
|
|
96
|
+
return this.wallet.icon;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
export { SuiXConnector, SuiXService };
|
|
101
|
+
//# sourceMappingURL=chunk-7ULB6DW4.mjs.map
|
|
102
|
+
//# sourceMappingURL=chunk-7ULB6DW4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|