sui.ski 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +311 -0
- package/CLAUDE.md +292 -0
- package/CODEBASE_GUIDE.md +217 -0
- package/README.md +77 -0
- package/biome.json +28 -0
- package/package.json +73 -0
- package/scripts/deploy-messaging-mainnet.sh +184 -0
- package/scripts/extract-suins-object.ts +180 -0
- package/scripts/full-deploy.sh +26 -0
- package/scripts/obsidian.ts +243 -0
- package/scripts/set-suins-contenthash.ts +130 -0
- package/scripts/setup-ika-dwallet.ts +338 -0
- package/scripts/transfer-upgrade-cap-from-nft.ts +86 -0
- package/src/durable-objects/wallet-session.ts +333 -0
- package/src/handlers/app.ts +1430 -0
- package/src/handlers/authenticated-events.ts +267 -0
- package/src/handlers/dashboard.ts +1659 -0
- package/src/handlers/landing.ts +6751 -0
- package/src/handlers/mcp.ts +556 -0
- package/src/handlers/messaging-sdk.ts +220 -0
- package/src/handlers/profile.css.ts +9332 -0
- package/src/handlers/profile.ts +12640 -0
- package/src/handlers/register2.ts +2811 -0
- package/src/handlers/ski-sign.ts +1901 -0
- package/src/handlers/ski.ts +314 -0
- package/src/handlers/thunder.ts +940 -0
- package/src/handlers/vault.ts +284 -0
- package/src/handlers/wallet-api.ts +169 -0
- package/src/handlers/x402-register.ts +601 -0
- package/src/index.test.ts +55 -0
- package/src/index.ts +512 -0
- package/src/resolvers/content.ts +231 -0
- package/src/resolvers/rpc.ts +222 -0
- package/src/resolvers/suins.ts +266 -0
- package/src/sdk/messaging.ts +279 -0
- package/src/types.ts +230 -0
- package/src/utils/agent-keypair.ts +40 -0
- package/src/utils/authenticated-events.ts +280 -0
- package/src/utils/cache.ts +82 -0
- package/src/utils/media-pack.ts +27 -0
- package/src/utils/mmr.ts +181 -0
- package/src/utils/ns-price.ts +529 -0
- package/src/utils/og-image.ts +141 -0
- package/src/utils/onchain-activity.ts +211 -0
- package/src/utils/onchain-listing.ts +39 -0
- package/src/utils/premium.ts +29 -0
- package/src/utils/pricing.ts +291 -0
- package/src/utils/pyth-price-info.ts +63 -0
- package/src/utils/response.ts +204 -0
- package/src/utils/rpc.ts +25 -0
- package/src/utils/shared-wallet-js.ts +166 -0
- package/src/utils/social.ts +152 -0
- package/src/utils/status.ts +39 -0
- package/src/utils/subdomain.ts +116 -0
- package/src/utils/surflux-grpc.ts +241 -0
- package/src/utils/swap-transactions.ts +1222 -0
- package/src/utils/thunder-css.ts +1341 -0
- package/src/utils/thunder-js.ts +5046 -0
- package/src/utils/transactions.ts +65 -0
- package/src/utils/vault.ts +18 -0
- package/src/utils/wallet-kit-js.ts +2312 -0
- package/src/utils/wallet-session-js.ts +192 -0
- package/src/utils/wallet-tx-js.ts +2287 -0
- package/src/utils/wallet-ui-js.ts +3057 -0
- package/src/utils/x402-middleware.ts +428 -0
- package/src/utils/x402-sui.ts +171 -0
- package/src/utils/zksend-js.ts +166 -0
- package/tsconfig.json +22 -0
- package/workers/x402-multichain/src/index.ts +237 -0
- package/workers/x402-multichain/src/types.ts +80 -0
- package/workers/x402-multichain/tsconfig.json +20 -0
- package/workers/x402-multichain/wrangler.toml +11 -0
- package/wrangler.toml +84 -0
|
@@ -0,0 +1,2287 @@
|
|
|
1
|
+
export function generateWalletTxJs(): string {
|
|
2
|
+
return `
|
|
3
|
+
var __wkChain = 'sui:' + SuiWalletKit.__config.network;
|
|
4
|
+
|
|
5
|
+
function __wkBytesToBase64(bytes) {
|
|
6
|
+
if (typeof bytes === 'string') return bytes;
|
|
7
|
+
if (bytes instanceof ArrayBuffer) bytes = new Uint8Array(bytes);
|
|
8
|
+
if (Array.isArray(bytes)) bytes = Uint8Array.from(bytes);
|
|
9
|
+
if (!bytes || typeof bytes.subarray !== 'function') {
|
|
10
|
+
throw new Error('Expected byte array for base64 conversion');
|
|
11
|
+
}
|
|
12
|
+
var CHUNK = 8192;
|
|
13
|
+
var parts = [];
|
|
14
|
+
for (var i = 0; i < bytes.length; i += CHUNK) {
|
|
15
|
+
parts.push(String.fromCharCode.apply(null, bytes.subarray(i, Math.min(i + CHUNK, bytes.length))));
|
|
16
|
+
}
|
|
17
|
+
return btoa(parts.join(''));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function __wkLooksLikeBase64(value) {
|
|
21
|
+
return !!__wkNormalizeBase64(value);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function __wkNormalizeBase64(value) {
|
|
25
|
+
if (typeof value !== 'string') return '';
|
|
26
|
+
var cleaned = value.trim();
|
|
27
|
+
if (!cleaned) return '';
|
|
28
|
+
cleaned = cleaned.replace(/-/g, '+').replace(/_/g, '/');
|
|
29
|
+
var mod = cleaned.length % 4;
|
|
30
|
+
if (mod === 1) return '';
|
|
31
|
+
if (mod === 2) cleaned += '==';
|
|
32
|
+
else if (mod === 3) cleaned += '=';
|
|
33
|
+
if (!/^[A-Za-z0-9+/=]+$/.test(cleaned)) return '';
|
|
34
|
+
return cleaned;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function __wkTryHexToBytes(value) {
|
|
38
|
+
if (typeof value !== 'string') return null;
|
|
39
|
+
var cleaned = value.trim().toLowerCase();
|
|
40
|
+
if (!cleaned) return null;
|
|
41
|
+
if (cleaned.indexOf('0x') === 0) cleaned = cleaned.slice(2);
|
|
42
|
+
if (!cleaned || cleaned.length % 2 !== 0) return null;
|
|
43
|
+
if (!/^[0-9a-f]+$/.test(cleaned)) return null;
|
|
44
|
+
var out = new Uint8Array(cleaned.length / 2);
|
|
45
|
+
for (var i = 0; i < cleaned.length; i += 2) {
|
|
46
|
+
out[i / 2] = parseInt(cleaned.slice(i, i + 2), 16);
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function __wkTryNormalizeBytes(value) {
|
|
52
|
+
if (!value) return null;
|
|
53
|
+
if (value instanceof Uint8Array) return value;
|
|
54
|
+
if (value instanceof ArrayBuffer) return new Uint8Array(value);
|
|
55
|
+
if (Array.isArray(value)) return Uint8Array.from(value);
|
|
56
|
+
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView && ArrayBuffer.isView(value)) {
|
|
57
|
+
return new Uint8Array(value.buffer, value.byteOffset || 0, value.byteLength || 0);
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function __wkExtractBridgePayload(value, depth) {
|
|
63
|
+
if (!value || depth > 6) return null;
|
|
64
|
+
if (typeof value === 'string') return value.trim();
|
|
65
|
+
var asBytes = __wkTryNormalizeBytes(value);
|
|
66
|
+
if (asBytes) return asBytes;
|
|
67
|
+
if (typeof value !== 'object') return null;
|
|
68
|
+
|
|
69
|
+
var byteKeys = [
|
|
70
|
+
'txBytes',
|
|
71
|
+
'transactionBytes',
|
|
72
|
+
'bytes',
|
|
73
|
+
'rawBytes',
|
|
74
|
+
'rawTransaction',
|
|
75
|
+
'signedTransaction',
|
|
76
|
+
'serializedTransaction',
|
|
77
|
+
'transactionBlockBytes',
|
|
78
|
+
'bcsBytes',
|
|
79
|
+
'bcs',
|
|
80
|
+
];
|
|
81
|
+
for (var bi = 0; bi < byteKeys.length; bi++) {
|
|
82
|
+
var byteCandidate = __wkExtractBridgePayload(value[byteKeys[bi]], depth + 1);
|
|
83
|
+
if (byteCandidate) return byteCandidate;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
var txKeys = ['transaction', 'transactionBlock', 'tx', 'payload', 'data'];
|
|
87
|
+
for (var ti = 0; ti < txKeys.length; ti++) {
|
|
88
|
+
var txCandidate = __wkExtractBridgePayload(value[txKeys[ti]], depth + 1);
|
|
89
|
+
if (txCandidate) return txCandidate;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function __wkGetPhantomProvider() {
|
|
96
|
+
var provider = window.phantom && window.phantom.sui;
|
|
97
|
+
return provider && provider.isPhantom ? provider : null;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function __wkGetWallet() {
|
|
101
|
+
var conn = SuiWalletKit.$connection.value;
|
|
102
|
+
if (!conn || !conn.wallet) throw new Error('No wallet connected. Call SuiWalletKit.connect() first.');
|
|
103
|
+
return conn;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function __wkNormalizeAccountAddress(account) {
|
|
107
|
+
if (!account) return '';
|
|
108
|
+
function __wkNormalizeRawAddress(rawAddress) {
|
|
109
|
+
if (!rawAddress) return '';
|
|
110
|
+
var clean = String(rawAddress).trim().toLowerCase();
|
|
111
|
+
if (!clean) return '';
|
|
112
|
+
if (clean.indexOf('0x') === 0) {
|
|
113
|
+
clean = clean.slice(2);
|
|
114
|
+
}
|
|
115
|
+
if (!clean || clean.length > 64 || /[^0-9a-f]/.test(clean)) return '';
|
|
116
|
+
clean = clean.replace(/^0+/, '');
|
|
117
|
+
if (!clean) return '';
|
|
118
|
+
return '0x' + clean.padStart(64, '0');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
var normalizedFromAddress = '';
|
|
122
|
+
if (typeof account === 'string') {
|
|
123
|
+
normalizedFromAddress = __wkNormalizeRawAddress(account);
|
|
124
|
+
if (normalizedFromAddress) return normalizedFromAddress;
|
|
125
|
+
} else if (typeof account === 'object') {
|
|
126
|
+
if (typeof account.address === 'string') {
|
|
127
|
+
normalizedFromAddress = __wkNormalizeRawAddress(account.address);
|
|
128
|
+
}
|
|
129
|
+
if (!normalizedFromAddress && account.address && typeof account.address.toString === 'function') {
|
|
130
|
+
normalizedFromAddress = __wkNormalizeRawAddress(account.address.toString());
|
|
131
|
+
}
|
|
132
|
+
if (normalizedFromAddress) return normalizedFromAddress;
|
|
133
|
+
if (account.publicKey && typeof account.publicKey.toSuiAddress === 'function') {
|
|
134
|
+
try {
|
|
135
|
+
var fromKey = __wkNormalizeRawAddress(account.publicKey.toSuiAddress() || '');
|
|
136
|
+
if (fromKey) return fromKey;
|
|
137
|
+
} catch (_e) {}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return '';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function __wkResolveConnectionAddress(conn, preferredAccount) {
|
|
144
|
+
var preferred = __wkNormalizeAccountAddress(preferredAccount);
|
|
145
|
+
if (preferred) return preferred;
|
|
146
|
+
|
|
147
|
+
var fromConnAccount = __wkNormalizeAccountAddress(conn && conn.account);
|
|
148
|
+
if (fromConnAccount) return fromConnAccount;
|
|
149
|
+
var fromConnAddress = __wkNormalizeAccountAddress(conn && conn.address);
|
|
150
|
+
if (fromConnAddress) return fromConnAddress;
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function __wkResolveWalletAccount(conn, preferredAccount) {
|
|
155
|
+
var wallet = conn && conn.wallet;
|
|
156
|
+
var resolved = preferredAccount || conn.account || null;
|
|
157
|
+
var walletAccounts = [];
|
|
158
|
+
try {
|
|
159
|
+
walletAccounts = (wallet && Array.isArray(wallet.accounts)) ? wallet.accounts : [];
|
|
160
|
+
} catch (_e) {}
|
|
161
|
+
var targetAddress = __wkNormalizeAccountAddress(resolved);
|
|
162
|
+
if (!targetAddress) return null;
|
|
163
|
+
if (!walletAccounts.length) return resolved;
|
|
164
|
+
for (var i = 0; i < walletAccounts.length; i++) {
|
|
165
|
+
if (__wkNormalizeAccountAddress(walletAccounts[i]) === targetAddress) {
|
|
166
|
+
return walletAccounts[i];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function __wkEnsureAccountForSign(conn, account, chain) {
|
|
173
|
+
if (account && typeof account === 'object') {
|
|
174
|
+
var normalizedAddress = __wkNormalizeAccountAddress(account);
|
|
175
|
+
var nextAccount = account;
|
|
176
|
+
if (normalizedAddress && nextAccount.address !== normalizedAddress) {
|
|
177
|
+
try {
|
|
178
|
+
nextAccount = Object.assign({}, nextAccount, { address: normalizedAddress });
|
|
179
|
+
} catch (_e) {
|
|
180
|
+
nextAccount.address = normalizedAddress;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (!Array.isArray(nextAccount.chains) || nextAccount.chains.length === 0) {
|
|
184
|
+
var accountChains = [];
|
|
185
|
+
if (conn && conn.wallet && Array.isArray(conn.wallet.chains)) {
|
|
186
|
+
for (var i = 0; i < conn.wallet.chains.length; i++) {
|
|
187
|
+
var walletChain = conn.wallet.chains[i];
|
|
188
|
+
if (typeof walletChain === 'string' && walletChain.indexOf('sui:') === 0) {
|
|
189
|
+
accountChains.push(walletChain);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (!accountChains.length && chain) accountChains = [chain];
|
|
194
|
+
if (!accountChains.length) accountChains = [__wkChain];
|
|
195
|
+
try {
|
|
196
|
+
nextAccount = Object.assign({}, nextAccount, { chains: accountChains });
|
|
197
|
+
} catch (_e) {
|
|
198
|
+
nextAccount.chains = accountChains;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return nextAccount;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
var fallbackAddress = __wkNormalizeAccountAddress(account);
|
|
205
|
+
if (!fallbackAddress) fallbackAddress = __wkResolveConnectionAddress(conn);
|
|
206
|
+
if (!fallbackAddress) return null;
|
|
207
|
+
return {
|
|
208
|
+
address: fallbackAddress,
|
|
209
|
+
chains: [chain || __wkChain],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function __wkResolveSigningChain(account, preferredChain) {
|
|
214
|
+
if (preferredChain && typeof preferredChain === 'string') return preferredChain;
|
|
215
|
+
if (account && Array.isArray(account.chains)) {
|
|
216
|
+
for (var i = 0; i < account.chains.length; i++) {
|
|
217
|
+
if (typeof account.chains[i] === 'string' && account.chains[i].indexOf('sui:') === 0) {
|
|
218
|
+
return account.chains[i];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return __wkChain;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function __wkNetworkCandidates(chain) {
|
|
226
|
+
var normalized = typeof chain === 'string' ? chain : __wkChain;
|
|
227
|
+
if (normalized === 'sui:mainnet' || normalized === 'mainnet') return ['sui:mainnet', 'mainnet'];
|
|
228
|
+
if (normalized === 'sui:testnet' || normalized === 'testnet') return ['sui:testnet', 'testnet'];
|
|
229
|
+
if (normalized === 'sui:devnet' || normalized === 'devnet') return ['sui:devnet', 'devnet'];
|
|
230
|
+
return [normalized, __wkChain];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function __wkGetRpcUrl() {
|
|
234
|
+
var network = SuiWalletKit.__config && SuiWalletKit.__config.network
|
|
235
|
+
? String(SuiWalletKit.__config.network)
|
|
236
|
+
: 'mainnet';
|
|
237
|
+
if (network === 'testnet') return 'https://fullnode.testnet.sui.io:443';
|
|
238
|
+
if (network === 'devnet') return 'https://fullnode.devnet.sui.io:443';
|
|
239
|
+
return 'https://fullnode.mainnet.sui.io:443';
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async function __wkExecuteSignedTransaction(signed, txInput, txOptions) {
|
|
243
|
+
var signature = signed && (signed.signature || signed.signatures);
|
|
244
|
+
var txBytes = signed && (
|
|
245
|
+
signed.bytes ||
|
|
246
|
+
signed.transactionBytes ||
|
|
247
|
+
signed.transactionBlock ||
|
|
248
|
+
signed.signedTransaction ||
|
|
249
|
+
signed.transaction
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
if (!txBytes) txBytes = txInput;
|
|
253
|
+
if (!signature) throw new Error('Missing signature from wallet');
|
|
254
|
+
if (!txBytes) throw new Error('Missing signed transaction bytes from wallet');
|
|
255
|
+
|
|
256
|
+
var txB64 = __wkBytesToBase64(txBytes);
|
|
257
|
+
var signatures = Array.isArray(signature) ? signature : [signature];
|
|
258
|
+
var rpcRes = await fetch(__wkGetRpcUrl(), {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: { 'content-type': 'application/json' },
|
|
261
|
+
body: JSON.stringify({
|
|
262
|
+
jsonrpc: '2.0',
|
|
263
|
+
id: 1,
|
|
264
|
+
method: 'sui_executeTransactionBlock',
|
|
265
|
+
params: [txB64, signatures, txOptions || {}],
|
|
266
|
+
}),
|
|
267
|
+
});
|
|
268
|
+
var rpcJson = await rpcRes.json().catch(function() { return null; });
|
|
269
|
+
if (!rpcRes.ok || !rpcJson || rpcJson.error || !rpcJson.result) {
|
|
270
|
+
throw new Error(
|
|
271
|
+
(rpcJson && rpcJson.error && rpcJson.error.message)
|
|
272
|
+
|| 'Failed to execute signed transaction',
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
return rpcJson.result;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
var __skiRequestCounter = 0;
|
|
279
|
+
var __skiSignTimeout = 120000;
|
|
280
|
+
var __skiHandoffResult = null;
|
|
281
|
+
|
|
282
|
+
function __skiConsumeHandoffQuery() {
|
|
283
|
+
try {
|
|
284
|
+
var url = new URL(window.location.href);
|
|
285
|
+
if (url.searchParams.get('ski_handoff') !== '1') return;
|
|
286
|
+
var status = String(url.searchParams.get('ski_handoff_status') || '').toLowerCase();
|
|
287
|
+
var error = String(url.searchParams.get('ski_handoff_error') || '');
|
|
288
|
+
__skiHandoffResult = {
|
|
289
|
+
status: status || 'unknown',
|
|
290
|
+
error: error,
|
|
291
|
+
at: Date.now(),
|
|
292
|
+
};
|
|
293
|
+
try {
|
|
294
|
+
sessionStorage.setItem('sui_ski_handoff_result', JSON.stringify(__skiHandoffResult));
|
|
295
|
+
} catch (_eStore) {}
|
|
296
|
+
url.searchParams.delete('ski_handoff');
|
|
297
|
+
url.searchParams.delete('ski_handoff_status');
|
|
298
|
+
url.searchParams.delete('ski_handoff_error');
|
|
299
|
+
history.replaceState(null, '', url.toString());
|
|
300
|
+
} catch (_e) {}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function __skiReadRecentHandoffResult() {
|
|
304
|
+
if (__skiHandoffResult) return __skiHandoffResult;
|
|
305
|
+
try {
|
|
306
|
+
var raw = sessionStorage.getItem('sui_ski_handoff_result');
|
|
307
|
+
if (!raw) return null;
|
|
308
|
+
var parsed = JSON.parse(raw);
|
|
309
|
+
if (!parsed || typeof parsed !== 'object') return null;
|
|
310
|
+
if (!parsed.at || !Number.isFinite(Number(parsed.at))) return null;
|
|
311
|
+
__skiHandoffResult = {
|
|
312
|
+
status: String(parsed.status || 'unknown'),
|
|
313
|
+
error: String(parsed.error || ''),
|
|
314
|
+
at: Number(parsed.at),
|
|
315
|
+
};
|
|
316
|
+
return __skiHandoffResult;
|
|
317
|
+
} catch (_e) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function __skiClearHandoffResult() {
|
|
323
|
+
__skiHandoffResult = null;
|
|
324
|
+
try { sessionStorage.removeItem('sui_ski_handoff_result'); } catch (_e) {}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
function __skiBuildHandoffReturnUrl() {
|
|
328
|
+
var next = new URL(window.location.href);
|
|
329
|
+
next.searchParams.delete('ski_handoff');
|
|
330
|
+
next.searchParams.delete('ski_handoff_status');
|
|
331
|
+
next.searchParams.delete('ski_handoff_error');
|
|
332
|
+
return next.toString();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function __skiStartTopFrameHandoff(preferredWalletName, expectedSender) {
|
|
336
|
+
var target = new URL('https://sui.ski/sign');
|
|
337
|
+
target.searchParams.set('bridge', 'handoff');
|
|
338
|
+
target.searchParams.set('returnUrl', __skiBuildHandoffReturnUrl());
|
|
339
|
+
if (preferredWalletName && String(preferredWalletName).trim()) {
|
|
340
|
+
target.searchParams.set('walletName', String(preferredWalletName).trim());
|
|
341
|
+
}
|
|
342
|
+
var normalizedSender = __wkNormalizeAccountAddress(expectedSender || '');
|
|
343
|
+
if (normalizedSender) {
|
|
344
|
+
target.searchParams.set('sender', normalizedSender);
|
|
345
|
+
}
|
|
346
|
+
window.location.assign(target.toString());
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function __skiMaybeStartTopFrameHandoff(preferredWalletName, err, expectedSender) {
|
|
351
|
+
if (!__skiIsSubdomainHost()) return false;
|
|
352
|
+
if (window.top !== window.self) return false;
|
|
353
|
+
if (!(__skiRequiresTopFrameSigning(err) || __skiIsBridgeWalletAvailabilityError(err))) return false;
|
|
354
|
+
var recent = __skiReadRecentHandoffResult();
|
|
355
|
+
if (recent && recent.status !== 'ok' && (Date.now() - recent.at) < 15000) {
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
__skiClearHandoffResult();
|
|
359
|
+
return __skiStartTopFrameHandoff(preferredWalletName, expectedSender);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
__skiConsumeHandoffQuery();
|
|
363
|
+
|
|
364
|
+
function __skiResolveSessionWalletNameForSender(expectedSender) {
|
|
365
|
+
var normalizedSender = __wkNormalizeAccountAddress(expectedSender || '');
|
|
366
|
+
var conn = SuiWalletKit.$connection.value || {};
|
|
367
|
+
var connAddress = __wkNormalizeAccountAddress(conn && conn.address);
|
|
368
|
+
if (connAddress && (!normalizedSender || connAddress === normalizedSender)) {
|
|
369
|
+
if (conn.wallet && conn.wallet.name) return String(conn.wallet.name);
|
|
370
|
+
if (SuiWalletKit.__sessionWalletName) return String(SuiWalletKit.__sessionWalletName);
|
|
371
|
+
}
|
|
372
|
+
try {
|
|
373
|
+
var session = typeof getWalletSession === 'function' ? getWalletSession() : null;
|
|
374
|
+
if (session) {
|
|
375
|
+
var sessionAddress = __wkNormalizeAccountAddress(session.address || '');
|
|
376
|
+
if (sessionAddress && (!normalizedSender || sessionAddress === normalizedSender)) {
|
|
377
|
+
if (session.walletName) return String(session.walletName);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
} catch (_e) {}
|
|
381
|
+
return '';
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
function __skiResolvePreferredWalletName() {
|
|
385
|
+
var activeWalletName = __skiResolveSessionWalletNameForSender('');
|
|
386
|
+
if (activeWalletName) return activeWalletName;
|
|
387
|
+
try {
|
|
388
|
+
var remembered = String(localStorage.getItem('sui_ski_last_wallet') || '').trim();
|
|
389
|
+
if (remembered) return remembered;
|
|
390
|
+
} catch (_e2) {}
|
|
391
|
+
return '';
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function __skiResolvePreferredWalletNameForOperation(options) {
|
|
395
|
+
if (options && options.walletName) {
|
|
396
|
+
var explicitWalletName = String(options.walletName).trim();
|
|
397
|
+
if (explicitWalletName) return explicitWalletName;
|
|
398
|
+
}
|
|
399
|
+
if (options && options.preferredWalletName) {
|
|
400
|
+
var preferredWalletName = String(options.preferredWalletName).trim();
|
|
401
|
+
if (preferredWalletName) return preferredWalletName;
|
|
402
|
+
}
|
|
403
|
+
var expectedSender = __wkNormalizeAccountAddress(
|
|
404
|
+
options && options.expectedSender ? options.expectedSender : '',
|
|
405
|
+
);
|
|
406
|
+
if (expectedSender) {
|
|
407
|
+
var senderBoundWalletName = __skiResolveSessionWalletNameForSender(expectedSender);
|
|
408
|
+
if (senderBoundWalletName) return senderBoundWalletName;
|
|
409
|
+
return '';
|
|
410
|
+
}
|
|
411
|
+
return __skiResolvePreferredWalletName();
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function __skiBuildOperationOptions(options) {
|
|
415
|
+
var base = (options && typeof options === 'object') ? options : {};
|
|
416
|
+
return base;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
function __skiCollectWalletHints() {
|
|
420
|
+
var wallets = [];
|
|
421
|
+
try {
|
|
422
|
+
if (typeof SuiWalletKit.getSuiWallets === 'function') {
|
|
423
|
+
wallets = SuiWalletKit.getSuiWallets();
|
|
424
|
+
}
|
|
425
|
+
} catch (_e) {}
|
|
426
|
+
if ((!Array.isArray(wallets) || wallets.length === 0) && SuiWalletKit.$wallets) {
|
|
427
|
+
wallets = Array.isArray(SuiWalletKit.$wallets.value) ? SuiWalletKit.$wallets.value : [];
|
|
428
|
+
}
|
|
429
|
+
var out = [];
|
|
430
|
+
var byKey = {};
|
|
431
|
+
for (var i = 0; i < wallets.length; i++) {
|
|
432
|
+
var wallet = wallets[i];
|
|
433
|
+
if (!wallet || !wallet.name) continue;
|
|
434
|
+
var name = String(wallet.name);
|
|
435
|
+
var key = __skiWalletNameKey(name);
|
|
436
|
+
if (!key) key = 'wallet-' + i;
|
|
437
|
+
var icon = wallet.icon ? String(wallet.icon) : '';
|
|
438
|
+
var existing = byKey[key];
|
|
439
|
+
if (!existing) {
|
|
440
|
+
existing = {
|
|
441
|
+
name: name,
|
|
442
|
+
icon: icon,
|
|
443
|
+
__isPasskey: !!wallet.__isPasskey,
|
|
444
|
+
};
|
|
445
|
+
byKey[key] = existing;
|
|
446
|
+
out.push(existing);
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
if (!existing.icon && icon) existing.icon = icon;
|
|
450
|
+
if (existing.__isPasskey && !wallet.__isPasskey) existing.__isPasskey = false;
|
|
451
|
+
}
|
|
452
|
+
return out;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
var __skiHiddenStyle = 'position:fixed;left:-10000px;top:0;width:1px;height:1px;opacity:0;pointer-events:none;border:0;z-index:-1;background:transparent';
|
|
456
|
+
var __skiOverlayStyle = 'position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:999999;border:none;background:transparent';
|
|
457
|
+
|
|
458
|
+
function __skiPostAndWait(frame, txB64, execOptions, expectedSender, preferredWalletName) {
|
|
459
|
+
var requestId = 'ski-' + (++__skiRequestCounter) + '-' + Date.now();
|
|
460
|
+
var walletHints = __skiCollectWalletHints();
|
|
461
|
+
frame.style.cssText = __skiOverlayStyle;
|
|
462
|
+
return new Promise(function(resolve, reject) {
|
|
463
|
+
var done = false;
|
|
464
|
+
function finish() {
|
|
465
|
+
frame.style.cssText = __skiHiddenStyle;
|
|
466
|
+
}
|
|
467
|
+
var timer = setTimeout(function() {
|
|
468
|
+
if (done) return;
|
|
469
|
+
done = true;
|
|
470
|
+
finish();
|
|
471
|
+
reject(new Error('Signing timed out after ' + (__skiSignTimeout / 1000) + 's'));
|
|
472
|
+
}, __skiSignTimeout);
|
|
473
|
+
|
|
474
|
+
function handler(e) {
|
|
475
|
+
if (e.origin !== 'https://sui.ski') return;
|
|
476
|
+
if (!e.data || e.data.requestId !== requestId) return;
|
|
477
|
+
if (e.data.type === 'ski:signed' || e.data.type === 'ski:error') {
|
|
478
|
+
window.removeEventListener('message', handler);
|
|
479
|
+
clearTimeout(timer);
|
|
480
|
+
if (done) return;
|
|
481
|
+
done = true;
|
|
482
|
+
finish();
|
|
483
|
+
if (e.data.type === 'ski:error') {
|
|
484
|
+
reject(new Error(e.data.error || 'Signing failed'));
|
|
485
|
+
} else {
|
|
486
|
+
resolve(e.data);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
window.addEventListener('message', handler);
|
|
492
|
+
frame.contentWindow.postMessage({
|
|
493
|
+
type: 'ski:sign',
|
|
494
|
+
txBytes: txB64,
|
|
495
|
+
requestId: requestId,
|
|
496
|
+
options: execOptions || {},
|
|
497
|
+
sender: expectedSender || '',
|
|
498
|
+
walletName: preferredWalletName || '',
|
|
499
|
+
walletHints: walletHints,
|
|
500
|
+
}, 'https://sui.ski');
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
function __skiPostMessageAndWait(frame, messageB64, expectedSender, preferredWalletName) {
|
|
505
|
+
var requestId = 'ski-msg-' + (++__skiRequestCounter) + '-' + Date.now();
|
|
506
|
+
var walletHints = __skiCollectWalletHints();
|
|
507
|
+
frame.style.cssText = __skiOverlayStyle;
|
|
508
|
+
return new Promise(function(resolve, reject) {
|
|
509
|
+
var done = false;
|
|
510
|
+
function finish() {
|
|
511
|
+
frame.style.cssText = __skiHiddenStyle;
|
|
512
|
+
}
|
|
513
|
+
var timer = setTimeout(function() {
|
|
514
|
+
if (done) return;
|
|
515
|
+
done = true;
|
|
516
|
+
finish();
|
|
517
|
+
reject(new Error('Signing timed out after ' + (__skiSignTimeout / 1000) + 's'));
|
|
518
|
+
}, __skiSignTimeout);
|
|
519
|
+
|
|
520
|
+
function handler(e) {
|
|
521
|
+
if (e.origin !== 'https://sui.ski') return;
|
|
522
|
+
if (!e.data || e.data.requestId !== requestId) return;
|
|
523
|
+
if (e.data.type === 'ski:signed-message' || e.data.type === 'ski:error') {
|
|
524
|
+
window.removeEventListener('message', handler);
|
|
525
|
+
clearTimeout(timer);
|
|
526
|
+
if (done) return;
|
|
527
|
+
done = true;
|
|
528
|
+
finish();
|
|
529
|
+
if (e.data.type === 'ski:error') {
|
|
530
|
+
reject(new Error(e.data.error || 'Message signing failed'));
|
|
531
|
+
} else {
|
|
532
|
+
resolve(e.data);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
window.addEventListener('message', handler);
|
|
538
|
+
frame.contentWindow.postMessage({
|
|
539
|
+
type: 'ski:sign-message',
|
|
540
|
+
message: messageB64,
|
|
541
|
+
requestId: requestId,
|
|
542
|
+
sender: expectedSender || '',
|
|
543
|
+
walletName: preferredWalletName || '',
|
|
544
|
+
walletHints: walletHints,
|
|
545
|
+
}, 'https://sui.ski');
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
function __skiConnectBridgeAndWait(frame, preferredWalletName, expectedSender, forceInteractive) {
|
|
550
|
+
var requestId = 'ski-connect-' + (++__skiRequestCounter) + '-' + Date.now();
|
|
551
|
+
var walletHints = __skiCollectWalletHints();
|
|
552
|
+
frame.style.cssText = __skiOverlayStyle;
|
|
553
|
+
return new Promise(function(resolve, reject) {
|
|
554
|
+
var done = false;
|
|
555
|
+
function finish() {
|
|
556
|
+
frame.style.cssText = __skiHiddenStyle;
|
|
557
|
+
}
|
|
558
|
+
var timer = setTimeout(function() {
|
|
559
|
+
if (done) return;
|
|
560
|
+
done = true;
|
|
561
|
+
finish();
|
|
562
|
+
reject(new Error('Bridge connection timed out'));
|
|
563
|
+
}, 60000);
|
|
564
|
+
|
|
565
|
+
function handler(e) {
|
|
566
|
+
if (e.origin !== 'https://sui.ski') return;
|
|
567
|
+
if (!e.data || e.data.requestId !== requestId) return;
|
|
568
|
+
if (e.data.type === 'ski:connected') {
|
|
569
|
+
window.removeEventListener('message', handler);
|
|
570
|
+
clearTimeout(timer);
|
|
571
|
+
if (done) return;
|
|
572
|
+
done = true;
|
|
573
|
+
finish();
|
|
574
|
+
resolve(e.data);
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
if (e.data.type === 'ski:connect-error' || e.data.type === 'ski:error') {
|
|
578
|
+
window.removeEventListener('message', handler);
|
|
579
|
+
clearTimeout(timer);
|
|
580
|
+
if (done) return;
|
|
581
|
+
done = true;
|
|
582
|
+
finish();
|
|
583
|
+
reject(new Error(e.data.error || 'Bridge connection failed'));
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
window.addEventListener('message', handler);
|
|
588
|
+
frame.contentWindow.postMessage({
|
|
589
|
+
type: 'ski:connect',
|
|
590
|
+
requestId: requestId,
|
|
591
|
+
walletName: preferredWalletName || '',
|
|
592
|
+
sender: expectedSender || '',
|
|
593
|
+
walletHints: walletHints,
|
|
594
|
+
forceInteractive: !!forceInteractive,
|
|
595
|
+
}, 'https://sui.ski');
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
function __skiOpenBridgeModalAndWait(frame, preferredWalletName) {
|
|
600
|
+
var requestId = 'ski-modal-' + (++__skiRequestCounter) + '-' + Date.now();
|
|
601
|
+
frame.style.cssText = __skiOverlayStyle;
|
|
602
|
+
return new Promise(function(resolve, reject) {
|
|
603
|
+
var done = false;
|
|
604
|
+
function finish() {
|
|
605
|
+
frame.style.cssText = __skiHiddenStyle;
|
|
606
|
+
}
|
|
607
|
+
var timer = setTimeout(function() {
|
|
608
|
+
if (done) return;
|
|
609
|
+
done = true;
|
|
610
|
+
finish();
|
|
611
|
+
reject(new Error('Bridge wallet selection timed out'));
|
|
612
|
+
}, 180000);
|
|
613
|
+
|
|
614
|
+
function handler(e) {
|
|
615
|
+
if (e.origin !== 'https://sui.ski') return;
|
|
616
|
+
if (!e.data || e.data.requestId !== requestId) return;
|
|
617
|
+
if (e.data.type === 'ski:connected') {
|
|
618
|
+
window.removeEventListener('message', handler);
|
|
619
|
+
clearTimeout(timer);
|
|
620
|
+
if (done) return;
|
|
621
|
+
done = true;
|
|
622
|
+
finish();
|
|
623
|
+
resolve(e.data);
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
if (e.data.type === 'ski:modal-closed' || e.data.type === 'ski:error') {
|
|
627
|
+
window.removeEventListener('message', handler);
|
|
628
|
+
clearTimeout(timer);
|
|
629
|
+
if (done) return;
|
|
630
|
+
done = true;
|
|
631
|
+
finish();
|
|
632
|
+
reject(new Error(e.data.error || 'Wallet selection was cancelled'));
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
window.addEventListener('message', handler);
|
|
637
|
+
frame.contentWindow.postMessage({
|
|
638
|
+
type: 'ski:open-modal',
|
|
639
|
+
requestId: requestId,
|
|
640
|
+
walletName: preferredWalletName || '',
|
|
641
|
+
}, 'https://sui.ski');
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
function __skiHasBridgeSessionHints(preferredWalletName, expectedSender) {
|
|
646
|
+
var expected = __wkNormalizeAccountAddress(expectedSender || '');
|
|
647
|
+
if (expected) return true;
|
|
648
|
+
if (preferredWalletName && String(preferredWalletName).trim()) return true;
|
|
649
|
+
var conn = SuiWalletKit.$connection.value || {};
|
|
650
|
+
if (conn && (conn.address || conn.primaryName || conn.status === 'session')) return true;
|
|
651
|
+
try {
|
|
652
|
+
var session = typeof getWalletSession === 'function' ? getWalletSession() : null;
|
|
653
|
+
if (session && (session.address || session.walletName)) return true;
|
|
654
|
+
} catch (_e) {}
|
|
655
|
+
try {
|
|
656
|
+
if (localStorage.getItem('sui_ski_last_wallet')) return true;
|
|
657
|
+
} catch (_e2) {}
|
|
658
|
+
return false;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
async function __skiEnsureBridgeConnectionViaIframe(preferredWalletName, expectedSender) {
|
|
662
|
+
var frame = await __skiEnsureBridge();
|
|
663
|
+
try {
|
|
664
|
+
await __skiConnectBridgeAndWait(frame, preferredWalletName, expectedSender, false);
|
|
665
|
+
return true;
|
|
666
|
+
} catch (_connectErr) {
|
|
667
|
+
if (__skiHasBridgeSessionHints(preferredWalletName, expectedSender)) throw _connectErr;
|
|
668
|
+
try {
|
|
669
|
+
await __skiConnectBridgeAndWait(frame, preferredWalletName, expectedSender, true);
|
|
670
|
+
return true;
|
|
671
|
+
} catch (_interactiveErr) {
|
|
672
|
+
await __skiOpenBridgeModalAndWait(frame, preferredWalletName);
|
|
673
|
+
return true;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
function __skiResolveBridgeExpectedSender(options) {
|
|
679
|
+
var sessionConn = SuiWalletKit.$connection.value || {};
|
|
680
|
+
var sessionAccount = (options && options.account) || sessionConn.account;
|
|
681
|
+
var forcedExpectedSender = __wkNormalizeAccountAddress(
|
|
682
|
+
options && options.expectedSender ? options.expectedSender : '',
|
|
683
|
+
);
|
|
684
|
+
return forcedExpectedSender || __wkResolveConnectionAddress(sessionConn, sessionAccount);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
async function __skiSignViaBridge(txInput, execOptions, options, preferredWalletName) {
|
|
688
|
+
var frame = await __skiEnsureBridge();
|
|
689
|
+
var b64 = await __skiSerializeTx(txInput);
|
|
690
|
+
var expectedSender = __skiResolveBridgeExpectedSender(options);
|
|
691
|
+
return await __skiPostAndWait(
|
|
692
|
+
frame,
|
|
693
|
+
b64,
|
|
694
|
+
execOptions || {},
|
|
695
|
+
expectedSender,
|
|
696
|
+
preferredWalletName,
|
|
697
|
+
);
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
async function __skiSignMessageViaBridge(message, options, preferredWalletName) {
|
|
701
|
+
var frame = await __skiEnsureBridge();
|
|
702
|
+
var expectedSender = __skiResolveBridgeExpectedSender(options);
|
|
703
|
+
var bytes = __wkNormalizeMessageBytes(message);
|
|
704
|
+
if (!bytes.length) throw new Error('Missing message bytes for bridge signing');
|
|
705
|
+
var messageB64 = __wkBytesToBase64(bytes);
|
|
706
|
+
return await __skiPostMessageAndWait(frame, messageB64, expectedSender, preferredWalletName);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
var __skiBridgePopup = null;
|
|
710
|
+
|
|
711
|
+
function __skiOpenBridgePopup() {
|
|
712
|
+
if (__skiBridgePopup && !__skiBridgePopup.closed) {
|
|
713
|
+
try { __skiBridgePopup.focus(); } catch (_e) {}
|
|
714
|
+
} else {
|
|
715
|
+
__skiBridgePopup = window.open(
|
|
716
|
+
'https://sui.ski/sign?bridge=popup',
|
|
717
|
+
'sui_ski_sign_bridge_popup',
|
|
718
|
+
'popup=yes,width=460,height=760,resizable=yes,scrollbars=yes',
|
|
719
|
+
);
|
|
720
|
+
}
|
|
721
|
+
if (!__skiBridgePopup || __skiBridgePopup.closed) {
|
|
722
|
+
return Promise.reject(new Error('Popup blocked. Allow popups for this site and retry.'));
|
|
723
|
+
}
|
|
724
|
+
var popup = __skiBridgePopup;
|
|
725
|
+
return new Promise(function(resolve, reject) {
|
|
726
|
+
var done = false;
|
|
727
|
+
function cleanup() {
|
|
728
|
+
window.removeEventListener('message', handler);
|
|
729
|
+
}
|
|
730
|
+
var timeout = setTimeout(function() {
|
|
731
|
+
if (done) return;
|
|
732
|
+
done = true;
|
|
733
|
+
cleanup();
|
|
734
|
+
reject(new Error('Sign bridge popup timed out'));
|
|
735
|
+
}, 15000);
|
|
736
|
+
function handler(e) {
|
|
737
|
+
if (e.origin !== 'https://sui.ski') return;
|
|
738
|
+
if (e.source !== popup) return;
|
|
739
|
+
if (!e.data || e.data.type !== 'ski:ready') return;
|
|
740
|
+
clearTimeout(timeout);
|
|
741
|
+
if (done) return;
|
|
742
|
+
done = true;
|
|
743
|
+
cleanup();
|
|
744
|
+
resolve(popup);
|
|
745
|
+
}
|
|
746
|
+
window.addEventListener('message', handler);
|
|
747
|
+
var pingAttempts = 0;
|
|
748
|
+
var pingTimer = setInterval(function() {
|
|
749
|
+
if (done) {
|
|
750
|
+
clearInterval(pingTimer);
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
753
|
+
pingAttempts++;
|
|
754
|
+
if (pingAttempts > 20) {
|
|
755
|
+
clearInterval(pingTimer);
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
try {
|
|
759
|
+
popup.postMessage({ type: 'ski:ping' }, 'https://sui.ski');
|
|
760
|
+
} catch (_e) {}
|
|
761
|
+
}, 300);
|
|
762
|
+
try {
|
|
763
|
+
popup.postMessage({ type: 'ski:ping' }, 'https://sui.ski');
|
|
764
|
+
} catch (_e) {}
|
|
765
|
+
});
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
function __skiPostViaPopupAndWait(payload, successType) {
|
|
769
|
+
var requestId = payload && payload.requestId ? payload.requestId : ('popup-' + (++__skiRequestCounter) + '-' + Date.now());
|
|
770
|
+
var message = Object.assign({}, payload || {}, { requestId: requestId });
|
|
771
|
+
return __skiOpenBridgePopup().then(function(popup) {
|
|
772
|
+
return new Promise(function(resolve, reject) {
|
|
773
|
+
var done = false;
|
|
774
|
+
function cleanup() {
|
|
775
|
+
window.removeEventListener('message', handler);
|
|
776
|
+
}
|
|
777
|
+
var timer = setTimeout(function() {
|
|
778
|
+
if (done) return;
|
|
779
|
+
done = true;
|
|
780
|
+
cleanup();
|
|
781
|
+
reject(new Error('Popup bridge request timed out'));
|
|
782
|
+
}, __skiSignTimeout);
|
|
783
|
+
function handler(e) {
|
|
784
|
+
if (e.origin !== 'https://sui.ski') return;
|
|
785
|
+
if (e.source !== popup) return;
|
|
786
|
+
if (!e.data || e.data.requestId !== requestId) return;
|
|
787
|
+
if (e.data.type === successType) {
|
|
788
|
+
clearTimeout(timer);
|
|
789
|
+
if (done) return;
|
|
790
|
+
done = true;
|
|
791
|
+
cleanup();
|
|
792
|
+
resolve(e.data);
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
if (e.data.type === 'ski:error') {
|
|
796
|
+
clearTimeout(timer);
|
|
797
|
+
if (done) return;
|
|
798
|
+
done = true;
|
|
799
|
+
cleanup();
|
|
800
|
+
reject(new Error(e.data.error || 'Popup signing failed'));
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
window.addEventListener('message', handler);
|
|
804
|
+
popup.postMessage(message, 'https://sui.ski');
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
function __skiPostAndWaitViaPopup(txB64, execOptions, expectedSender, preferredWalletName) {
|
|
810
|
+
return __skiPostViaPopupAndWait({
|
|
811
|
+
type: 'ski:sign',
|
|
812
|
+
txBytes: txB64,
|
|
813
|
+
options: execOptions || {},
|
|
814
|
+
sender: expectedSender || '',
|
|
815
|
+
walletName: preferredWalletName || '',
|
|
816
|
+
walletHints: __skiCollectWalletHints(),
|
|
817
|
+
}, 'ski:signed');
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
function __skiPostMessageAndWaitViaPopup(messageB64, expectedSender, preferredWalletName) {
|
|
821
|
+
return __skiPostViaPopupAndWait({
|
|
822
|
+
type: 'ski:sign-message',
|
|
823
|
+
message: messageB64,
|
|
824
|
+
sender: expectedSender || '',
|
|
825
|
+
walletName: preferredWalletName || '',
|
|
826
|
+
walletHints: __skiCollectWalletHints(),
|
|
827
|
+
}, 'ski:signed-message');
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
function __wkNormalizeMessageBytes(message) {
|
|
831
|
+
if (!message) return new Uint8Array(0);
|
|
832
|
+
if (message instanceof Uint8Array) return message;
|
|
833
|
+
if (message instanceof ArrayBuffer) return new Uint8Array(message);
|
|
834
|
+
if (Array.isArray(message)) return Uint8Array.from(message);
|
|
835
|
+
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView && ArrayBuffer.isView(message)) {
|
|
836
|
+
return new Uint8Array(message.buffer, message.byteOffset || 0, message.byteLength || 0);
|
|
837
|
+
}
|
|
838
|
+
if (typeof message === 'string') {
|
|
839
|
+
try {
|
|
840
|
+
var decoded = atob(message);
|
|
841
|
+
var out = new Uint8Array(decoded.length);
|
|
842
|
+
for (var i = 0; i < decoded.length; i++) out[i] = decoded.charCodeAt(i);
|
|
843
|
+
return out;
|
|
844
|
+
} catch (_e) {
|
|
845
|
+
try {
|
|
846
|
+
return new TextEncoder().encode(message);
|
|
847
|
+
} catch (_e2) {
|
|
848
|
+
return new Uint8Array(0);
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return new Uint8Array(0);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
async function __skiSerializeTx(txInput) {
|
|
856
|
+
var extracted = __wkExtractBridgePayload(txInput, 0);
|
|
857
|
+
var candidateTx = (
|
|
858
|
+
extracted && typeof extracted === 'object' && !__wkTryNormalizeBytes(extracted)
|
|
859
|
+
) ? extracted : txInput;
|
|
860
|
+
if (typeof extracted === 'string') {
|
|
861
|
+
var extractedB64 = __wkNormalizeBase64(extracted);
|
|
862
|
+
if (extractedB64) return extractedB64;
|
|
863
|
+
var hexBytes = __wkTryHexToBytes(extracted);
|
|
864
|
+
if (hexBytes) return __wkBytesToBase64(hexBytes);
|
|
865
|
+
if (extracted[0] === '{' || extracted[0] === '[') return extracted;
|
|
866
|
+
}
|
|
867
|
+
var directBytes = __wkTryNormalizeBytes(extracted || txInput);
|
|
868
|
+
if (directBytes) return __wkBytesToBase64(directBytes);
|
|
869
|
+
if (candidateTx && typeof candidateTx.serialize === 'function') {
|
|
870
|
+
try {
|
|
871
|
+
var serialized = await candidateTx.serialize();
|
|
872
|
+
var serializedBytes = __wkTryNormalizeBytes(serialized);
|
|
873
|
+
if (serializedBytes) return __wkBytesToBase64(serializedBytes);
|
|
874
|
+
if (typeof serialized === 'string') {
|
|
875
|
+
if (__wkLooksLikeBase64(serialized)) return serialized.trim();
|
|
876
|
+
var serializedHex = __wkTryHexToBytes(serialized);
|
|
877
|
+
if (serializedHex) return __wkBytesToBase64(serializedHex);
|
|
878
|
+
return serialized;
|
|
879
|
+
}
|
|
880
|
+
} catch (_serializeErr) {}
|
|
881
|
+
}
|
|
882
|
+
if (candidateTx && typeof candidateTx.build === 'function') {
|
|
883
|
+
try {
|
|
884
|
+
var builtWithoutClient = await candidateTx.build();
|
|
885
|
+
var builtNoClientBytes = __wkTryNormalizeBytes(builtWithoutClient);
|
|
886
|
+
if (builtNoClientBytes) return __wkBytesToBase64(builtNoClientBytes);
|
|
887
|
+
if (typeof builtWithoutClient === 'string') {
|
|
888
|
+
var noClientB64 = __wkNormalizeBase64(builtWithoutClient);
|
|
889
|
+
if (noClientB64) return noClientB64;
|
|
890
|
+
}
|
|
891
|
+
} catch (_buildNoClientErr) {}
|
|
892
|
+
var RpcClient = window.SuiJsonRpcClient || window.SuiClient;
|
|
893
|
+
if (RpcClient && typeof RpcClient === 'function') {
|
|
894
|
+
try {
|
|
895
|
+
var rpcClient = new RpcClient({ url: __wkGetRpcUrl() });
|
|
896
|
+
var builtBytes = await candidateTx.build({ client: rpcClient });
|
|
897
|
+
var builtWithClientBytes = __wkTryNormalizeBytes(builtBytes);
|
|
898
|
+
if (builtWithClientBytes) return __wkBytesToBase64(builtWithClientBytes);
|
|
899
|
+
if (typeof builtBytes === 'string') {
|
|
900
|
+
var builtWithClientB64 = __wkNormalizeBase64(builtBytes);
|
|
901
|
+
if (builtWithClientB64) return builtWithClientB64;
|
|
902
|
+
}
|
|
903
|
+
} catch (_buildErr) {}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
if (candidateTx && typeof candidateTx.toJSON === 'function') {
|
|
907
|
+
try {
|
|
908
|
+
var candidateJson = JSON.stringify(await candidateTx.toJSON());
|
|
909
|
+
if (candidateJson && candidateJson !== '{}' && candidateJson !== '[]') return candidateJson;
|
|
910
|
+
} catch (_jsonErr) {}
|
|
911
|
+
}
|
|
912
|
+
if (txInput && typeof txInput === 'object') {
|
|
913
|
+
try {
|
|
914
|
+
var rawJson = JSON.stringify(txInput);
|
|
915
|
+
if (rawJson && rawJson !== '{}' && rawJson !== '[]') return rawJson;
|
|
916
|
+
} catch (_stringifyErr) {}
|
|
917
|
+
}
|
|
918
|
+
var detail = txInput && typeof txInput === 'object'
|
|
919
|
+
? ('keys=' + Object.keys(txInput).slice(0, 6).join(','))
|
|
920
|
+
: ('type=' + typeof txInput);
|
|
921
|
+
throw new Error('Cannot serialize transaction for sign bridge. ' + detail);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
async function __skiSerializeForWallet(txInput) {
|
|
925
|
+
if (typeof txInput === 'string') return txInput;
|
|
926
|
+
if (txInput instanceof Uint8Array) return txInput;
|
|
927
|
+
if (txInput && typeof txInput.serialize === 'function') {
|
|
928
|
+
return txInput;
|
|
929
|
+
}
|
|
930
|
+
return txInput;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
function __skiIsSubdomainHost() {
|
|
934
|
+
var host = window.location.hostname || '';
|
|
935
|
+
return host !== 'sui.ski' && host.endsWith('.sui.ski');
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
function __skiIsSlushWalletName(name) {
|
|
939
|
+
var key = __skiWalletNameKey(name);
|
|
940
|
+
return (
|
|
941
|
+
key === 'slush'
|
|
942
|
+
|| key === 'slushwallet'
|
|
943
|
+
|| key === 'sui'
|
|
944
|
+
|| key === 'suiwallet'
|
|
945
|
+
|| key === 'mystenwallet'
|
|
946
|
+
);
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
function __skiLooksLikeSlushProvider(provider) {
|
|
950
|
+
if (!provider || typeof provider !== 'object') return false;
|
|
951
|
+
if (provider.isSlush || provider.__isSlush) return true;
|
|
952
|
+
var providerName = '';
|
|
953
|
+
try {
|
|
954
|
+
if (typeof provider.name === 'string') {
|
|
955
|
+
providerName = provider.name;
|
|
956
|
+
} else if (provider.wallet && typeof provider.wallet.name === 'string') {
|
|
957
|
+
providerName = provider.wallet.name;
|
|
958
|
+
}
|
|
959
|
+
} catch (_e) {}
|
|
960
|
+
return __skiIsSlushWalletName(providerName);
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
function __skiCanDirectSlush() {
|
|
964
|
+
try {
|
|
965
|
+
if (window.slush && (window.slush.sui || window.slush.wallet || window.slush)) return true;
|
|
966
|
+
} catch (_e) {}
|
|
967
|
+
try {
|
|
968
|
+
var sui = window.sui;
|
|
969
|
+
if (!sui || sui.isPhantom) return false;
|
|
970
|
+
return __skiLooksLikeSlushProvider(sui)
|
|
971
|
+
|| typeof sui.connect === 'function'
|
|
972
|
+
|| typeof sui.requestAccounts === 'function'
|
|
973
|
+
|| typeof sui.requestAccount === 'function';
|
|
974
|
+
} catch (_e2) {}
|
|
975
|
+
return false;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
function __skiShouldBypassBridgeForSlush(options) {
|
|
979
|
+
var expectedSender = __wkNormalizeAccountAddress(
|
|
980
|
+
options && options.expectedSender ? options.expectedSender : '',
|
|
981
|
+
);
|
|
982
|
+
var preferredWalletName = '';
|
|
983
|
+
if (options && options.walletName) {
|
|
984
|
+
preferredWalletName = String(options.walletName);
|
|
985
|
+
}
|
|
986
|
+
if (!preferredWalletName && options && options.preferredWalletName) {
|
|
987
|
+
preferredWalletName = String(options.preferredWalletName);
|
|
988
|
+
}
|
|
989
|
+
if (!preferredWalletName) {
|
|
990
|
+
try {
|
|
991
|
+
var conn = SuiWalletKit.$connection.value || {};
|
|
992
|
+
preferredWalletName = conn && conn.wallet && conn.wallet.name ? String(conn.wallet.name) : '';
|
|
993
|
+
} catch (_eConn) {}
|
|
994
|
+
}
|
|
995
|
+
if (!preferredWalletName) {
|
|
996
|
+
preferredWalletName = __skiResolvePreferredWalletNameForOperation(options);
|
|
997
|
+
}
|
|
998
|
+
if (!preferredWalletName && !expectedSender) {
|
|
999
|
+
try {
|
|
1000
|
+
preferredWalletName = String(localStorage.getItem('sui_ski_last_wallet') || '');
|
|
1001
|
+
} catch (_eLs) {}
|
|
1002
|
+
}
|
|
1003
|
+
if (expectedSender) {
|
|
1004
|
+
var conn = SuiWalletKit.$connection.value || {};
|
|
1005
|
+
var activeAddress = __wkNormalizeAccountAddress(conn && conn.address);
|
|
1006
|
+
var expectedWalletName = __skiResolveSessionWalletNameForSender(expectedSender);
|
|
1007
|
+
var hasActiveSession = !!(
|
|
1008
|
+
activeAddress
|
|
1009
|
+
&& (conn.status === 'connected' || conn.status === 'session')
|
|
1010
|
+
);
|
|
1011
|
+
if (
|
|
1012
|
+
hasActiveSession
|
|
1013
|
+
&& activeAddress === expectedSender
|
|
1014
|
+
&& __skiCanDirectSlush()
|
|
1015
|
+
&& __skiIsSlushWalletName(expectedWalletName || preferredWalletName)
|
|
1016
|
+
) {
|
|
1017
|
+
return true;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
if (!__skiIsSlushWalletName(preferredWalletName)) return false;
|
|
1021
|
+
return __skiCanDirectSlush();
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
function __skiShouldUseBridge(options) {
|
|
1025
|
+
if (__skiShouldBypassBridgeForSlush(options)) return false;
|
|
1026
|
+
if (__skiIsSubdomainHost()) {
|
|
1027
|
+
if ((!SuiWalletKit.__skiSignFrame || !SuiWalletKit.__skiSignReady) && typeof SuiWalletKit.__initSignBridge === 'function') {
|
|
1028
|
+
try { SuiWalletKit.__initSignBridge(); } catch (_e) {}
|
|
1029
|
+
}
|
|
1030
|
+
return true;
|
|
1031
|
+
}
|
|
1032
|
+
if (options && options.forceSignBridge) {
|
|
1033
|
+
if ((!SuiWalletKit.__skiSignFrame || !SuiWalletKit.__skiSignReady) && typeof SuiWalletKit.__initSignBridge === 'function') {
|
|
1034
|
+
try { SuiWalletKit.__initSignBridge(); } catch (_e) {}
|
|
1035
|
+
}
|
|
1036
|
+
return !!(SuiWalletKit.__skiSignFrame && SuiWalletKit.__skiSignReady);
|
|
1037
|
+
}
|
|
1038
|
+
if (!SuiWalletKit.__skiSignFrame || !SuiWalletKit.__skiSignReady) return false;
|
|
1039
|
+
var conn = SuiWalletKit.$connection.value;
|
|
1040
|
+
return !!(conn && conn.status === 'session' && !conn.wallet);
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
async function __skiEnsureBridge() {
|
|
1044
|
+
var ready = SuiWalletKit.__skiSignReady;
|
|
1045
|
+
if (!ready) throw new Error('Sign bridge not initialized');
|
|
1046
|
+
var ok = await ready;
|
|
1047
|
+
if (!ok) throw new Error('Sign bridge failed to connect wallet. Try refreshing.');
|
|
1048
|
+
return SuiWalletKit.__skiSignFrame;
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
function __skiWalletNameKey(name) {
|
|
1052
|
+
var normalized = String(name || '').trim().toLowerCase();
|
|
1053
|
+
if (!normalized) return '';
|
|
1054
|
+
normalized = normalized.replace(/[^a-z0-9]+/g, ' ').trim();
|
|
1055
|
+
if (!normalized) return '';
|
|
1056
|
+
if (normalized.slice(-7) === ' wallet') {
|
|
1057
|
+
normalized = normalized.slice(0, -7).trim();
|
|
1058
|
+
}
|
|
1059
|
+
return normalized.replace(/\\s+/g, '');
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
function __skiWalletNamesMatch(left, right) {
|
|
1063
|
+
var leftRaw = String(left || '').trim().toLowerCase();
|
|
1064
|
+
var rightRaw = String(right || '').trim().toLowerCase();
|
|
1065
|
+
if (!leftRaw || !rightRaw) return false;
|
|
1066
|
+
if (leftRaw === rightRaw) return true;
|
|
1067
|
+
var leftKey = __skiWalletNameKey(leftRaw);
|
|
1068
|
+
var rightKey = __skiWalletNameKey(rightRaw);
|
|
1069
|
+
if (!leftKey || !rightKey) return false;
|
|
1070
|
+
if (leftKey === rightKey) return true;
|
|
1071
|
+
return leftKey.indexOf(rightKey) !== -1 || rightKey.indexOf(leftKey) !== -1;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
async function __skiEnsureConnectedWalletForSigning(preferredWalletName) {
|
|
1075
|
+
var conn = SuiWalletKit.$connection.value || {};
|
|
1076
|
+
if (conn.wallet) {
|
|
1077
|
+
if (!preferredWalletName || __skiWalletNamesMatch(conn.wallet.name, preferredWalletName)) {
|
|
1078
|
+
return conn;
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
var sessionWalletName = '';
|
|
1083
|
+
try {
|
|
1084
|
+
var session = typeof getWalletSession === 'function' ? getWalletSession() : null;
|
|
1085
|
+
sessionWalletName = session && session.walletName ? String(session.walletName) : '';
|
|
1086
|
+
} catch (_e) {}
|
|
1087
|
+
|
|
1088
|
+
if (window.__wkWaaPLoading) {
|
|
1089
|
+
try { await window.__wkWaaPLoading; } catch (_e) {}
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
var wallets = [];
|
|
1093
|
+
try {
|
|
1094
|
+
wallets = await SuiWalletKit.detectWallets();
|
|
1095
|
+
} catch (_e) {
|
|
1096
|
+
wallets = SuiWalletKit.$wallets.value || [];
|
|
1097
|
+
}
|
|
1098
|
+
if (!wallets || wallets.length === 0) return null;
|
|
1099
|
+
|
|
1100
|
+
var match = null;
|
|
1101
|
+
var keyWallets = wallets.filter(function(w) { return !w.__isPasskey; });
|
|
1102
|
+
|
|
1103
|
+
if (preferredWalletName) {
|
|
1104
|
+
for (var p = 0; p < keyWallets.length; p++) {
|
|
1105
|
+
if (keyWallets[p] && __skiWalletNamesMatch(keyWallets[p].name, preferredWalletName)) {
|
|
1106
|
+
match = keyWallets[p];
|
|
1107
|
+
break;
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
if (!match && sessionWalletName && !__skiWalletNamesMatch(sessionWalletName, 'Passkey Wallet')) {
|
|
1113
|
+
for (var i = 0; i < keyWallets.length; i++) {
|
|
1114
|
+
if (keyWallets[i] && __skiWalletNamesMatch(keyWallets[i].name, sessionWalletName)) {
|
|
1115
|
+
match = keyWallets[i];
|
|
1116
|
+
break;
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
if (!match && __skiWalletNamesMatch(sessionWalletName, 'Passkey Wallet') && typeof SuiWalletKit.connectPasskey === 'function') {
|
|
1122
|
+
try {
|
|
1123
|
+
await SuiWalletKit.connectPasskey();
|
|
1124
|
+
conn = SuiWalletKit.$connection.value || {};
|
|
1125
|
+
if (conn.wallet) return conn;
|
|
1126
|
+
} catch (_e) {}
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
if (!match && !sessionWalletName && keyWallets.length > 0) {
|
|
1130
|
+
match = keyWallets[0];
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
if (!match) return null;
|
|
1134
|
+
|
|
1135
|
+
try {
|
|
1136
|
+
await SuiWalletKit.connect(match);
|
|
1137
|
+
} catch (_e) {
|
|
1138
|
+
return null;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
conn = SuiWalletKit.$connection.value || {};
|
|
1142
|
+
return conn.wallet ? conn : null;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
var __wkRejectionPatterns = /reject|denied|cancel|decline|dismissed|disapproved|user refused/i;
|
|
1146
|
+
function __wkIsUserRejection(err) {
|
|
1147
|
+
if (!err) return false;
|
|
1148
|
+
var msg = (err.message || (typeof err === 'string' ? err : ''));
|
|
1149
|
+
return __wkRejectionPatterns.test(msg);
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
function __skiIsBridgeWalletAvailabilityError(err) {
|
|
1153
|
+
if (!err) return false;
|
|
1154
|
+
var msg = String(err && err.message ? err.message : err).toLowerCase();
|
|
1155
|
+
if (!msg) return false;
|
|
1156
|
+
return (
|
|
1157
|
+
msg.indexOf('selected wallet not available') !== -1
|
|
1158
|
+
|| msg.indexOf('selected wallet does not expose sui signing in this context') !== -1
|
|
1159
|
+
|| msg.indexOf('preferred wallet not available') !== -1
|
|
1160
|
+
|| msg.indexOf('no compatible signing method found') !== -1
|
|
1161
|
+
|| msg.indexOf('wallet does not support transaction signing') !== -1
|
|
1162
|
+
|| msg.indexOf('wallet not connected in sign bridge') !== -1
|
|
1163
|
+
|| msg.indexOf('wallet session unavailable in bridge') !== -1
|
|
1164
|
+
|| msg.indexOf('wallet requires reconnect in the bridge iframe') !== -1
|
|
1165
|
+
|| msg.indexOf('connected wallet account does not match') !== -1
|
|
1166
|
+
);
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
function __skiRequiresTopFrameSigning(err) {
|
|
1170
|
+
if (!err) return false;
|
|
1171
|
+
var msg = String(err && err.message ? err.message : err).toLowerCase();
|
|
1172
|
+
if (!msg) return false;
|
|
1173
|
+
return (
|
|
1174
|
+
msg.indexOf('wallet requires top-frame signing') !== -1
|
|
1175
|
+
|| msg.indexOf('open https://sui.ski/sign in this tab and retry') !== -1
|
|
1176
|
+
|| msg.indexOf('failed to open new window') !== -1
|
|
1177
|
+
|| (msg.indexOf('popup') !== -1 && msg.indexOf('blocked') !== -1)
|
|
1178
|
+
|| (msg.indexOf('new window') !== -1 && msg.indexOf('failed') !== -1)
|
|
1179
|
+
);
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
async function __skiWalletSignAndExecute(txInput, conn, options) {
|
|
1183
|
+
var txRaw = await __skiSerializeForWallet(txInput);
|
|
1184
|
+
var txBytes = txRaw;
|
|
1185
|
+
if (txRaw && typeof txRaw.serialize === 'function') {
|
|
1186
|
+
try {
|
|
1187
|
+
txBytes = await txRaw.serialize();
|
|
1188
|
+
} catch (_e) {
|
|
1189
|
+
if (txRaw && typeof txRaw.build === 'function') {
|
|
1190
|
+
try {
|
|
1191
|
+
var RpcClient = window.SuiJsonRpcClient || window.SuiClient;
|
|
1192
|
+
if (RpcClient) {
|
|
1193
|
+
var rpcClient = new RpcClient({ url: __wkGetRpcUrl() });
|
|
1194
|
+
txBytes = await txRaw.build({ client: rpcClient });
|
|
1195
|
+
}
|
|
1196
|
+
} catch (_e2) {}
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
var wallet = conn.wallet;
|
|
1201
|
+
var requestedChain = options && options.chain;
|
|
1202
|
+
var account = __wkEnsureAccountForSign(
|
|
1203
|
+
conn,
|
|
1204
|
+
__wkResolveWalletAccount(conn, options && options.account),
|
|
1205
|
+
requestedChain || __wkChain,
|
|
1206
|
+
);
|
|
1207
|
+
if (!account) {
|
|
1208
|
+
throw new Error('No wallet account available for signing. Reconnect wallet and retry.');
|
|
1209
|
+
}
|
|
1210
|
+
var chain = __wkResolveSigningChain(account, requestedChain);
|
|
1211
|
+
var txOptions = options && options.txOptions;
|
|
1212
|
+
var singleAttempt = !!(options && options.singleAttempt);
|
|
1213
|
+
var preferTransactionBlock = !!(options && options.preferTransactionBlock);
|
|
1214
|
+
var topFrameSigningError = null;
|
|
1215
|
+
var txB64 = txBytes;
|
|
1216
|
+
if (
|
|
1217
|
+
txBytes instanceof Uint8Array ||
|
|
1218
|
+
txBytes instanceof ArrayBuffer ||
|
|
1219
|
+
Array.isArray(txBytes)
|
|
1220
|
+
) {
|
|
1221
|
+
txB64 = __wkBytesToBase64(txBytes);
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
async function __wkTryCalls(calls) {
|
|
1225
|
+
if (singleAttempt) {
|
|
1226
|
+
if (!Array.isArray(calls) || calls.length === 0) throw new Error('No compatible signing method found.');
|
|
1227
|
+
return await calls[0]();
|
|
1228
|
+
}
|
|
1229
|
+
var lastErr = null;
|
|
1230
|
+
for (var i = 0; i < calls.length; i++) {
|
|
1231
|
+
try {
|
|
1232
|
+
return await calls[i]();
|
|
1233
|
+
} catch (err) {
|
|
1234
|
+
lastErr = err;
|
|
1235
|
+
if (!topFrameSigningError && __skiRequiresTopFrameSigning(err)) {
|
|
1236
|
+
topFrameSigningError = err;
|
|
1237
|
+
}
|
|
1238
|
+
if (__wkIsUserRejection(err)) throw err;
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
if (lastErr) throw lastErr;
|
|
1242
|
+
throw new Error('No compatible signing method found.');
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
var phantom = __wkGetPhantomProvider();
|
|
1246
|
+
var walletName = String((wallet && wallet.name) || '').toLowerCase();
|
|
1247
|
+
var isPhantomWallet = !!(
|
|
1248
|
+
(walletName && walletName.indexOf('phantom') !== -1)
|
|
1249
|
+
|| (wallet && wallet.isPhantom)
|
|
1250
|
+
|| (wallet && wallet._raw && wallet._raw.isPhantom)
|
|
1251
|
+
|| (
|
|
1252
|
+
phantom && (
|
|
1253
|
+
wallet === phantom
|
|
1254
|
+
|| (wallet && wallet._raw === phantom)
|
|
1255
|
+
)
|
|
1256
|
+
)
|
|
1257
|
+
);
|
|
1258
|
+
if (singleAttempt && phantom && isPhantomWallet) {
|
|
1259
|
+
var singleSenderAddress = __wkResolveConnectionAddress(conn, account);
|
|
1260
|
+
var singleNetworkCandidates = __wkNetworkCandidates(chain);
|
|
1261
|
+
if (preferTransactionBlock && typeof phantom.signAndExecuteTransactionBlock === 'function') {
|
|
1262
|
+
return await phantom.signAndExecuteTransactionBlock({
|
|
1263
|
+
transactionBlock: txB64,
|
|
1264
|
+
options: txOptions,
|
|
1265
|
+
});
|
|
1266
|
+
}
|
|
1267
|
+
if (typeof phantom.signAndExecuteTransaction === 'function') {
|
|
1268
|
+
return await phantom.signAndExecuteTransaction({
|
|
1269
|
+
transaction: txB64,
|
|
1270
|
+
address: singleSenderAddress,
|
|
1271
|
+
networkID: singleNetworkCandidates[0],
|
|
1272
|
+
options: txOptions,
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
|
|
1277
|
+
var signExecFeature = wallet.features && wallet.features['sui:signAndExecuteTransaction'];
|
|
1278
|
+
var signExecBlockFeature = wallet.features && wallet.features['sui:signAndExecuteTransactionBlock'];
|
|
1279
|
+
|
|
1280
|
+
async function __wkTrySignAndExecuteTransaction() {
|
|
1281
|
+
if (!signExecFeature || !signExecFeature.signAndExecuteTransaction) return null;
|
|
1282
|
+
try {
|
|
1283
|
+
return await __wkTryCalls([
|
|
1284
|
+
function() {
|
|
1285
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1286
|
+
transaction: txRaw,
|
|
1287
|
+
account: account,
|
|
1288
|
+
chain: chain,
|
|
1289
|
+
options: txOptions,
|
|
1290
|
+
});
|
|
1291
|
+
},
|
|
1292
|
+
function() {
|
|
1293
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1294
|
+
transaction: txBytes,
|
|
1295
|
+
account: account,
|
|
1296
|
+
chain: chain,
|
|
1297
|
+
options: txOptions,
|
|
1298
|
+
});
|
|
1299
|
+
},
|
|
1300
|
+
function() {
|
|
1301
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1302
|
+
transaction: txB64,
|
|
1303
|
+
account: account,
|
|
1304
|
+
chain: chain,
|
|
1305
|
+
options: txOptions,
|
|
1306
|
+
});
|
|
1307
|
+
},
|
|
1308
|
+
function() {
|
|
1309
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1310
|
+
transactionBlock: txBytes,
|
|
1311
|
+
account: account,
|
|
1312
|
+
chain: chain,
|
|
1313
|
+
options: txOptions,
|
|
1314
|
+
});
|
|
1315
|
+
},
|
|
1316
|
+
function() {
|
|
1317
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1318
|
+
transactionBlock: txB64,
|
|
1319
|
+
account: account,
|
|
1320
|
+
chain: chain,
|
|
1321
|
+
options: txOptions,
|
|
1322
|
+
});
|
|
1323
|
+
},
|
|
1324
|
+
function() {
|
|
1325
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1326
|
+
transaction: txRaw,
|
|
1327
|
+
account: account,
|
|
1328
|
+
chain: chain,
|
|
1329
|
+
});
|
|
1330
|
+
},
|
|
1331
|
+
function() {
|
|
1332
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1333
|
+
transaction: txBytes,
|
|
1334
|
+
account: account,
|
|
1335
|
+
chain: chain,
|
|
1336
|
+
});
|
|
1337
|
+
},
|
|
1338
|
+
function() {
|
|
1339
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1340
|
+
transaction: txB64,
|
|
1341
|
+
account: account,
|
|
1342
|
+
chain: chain,
|
|
1343
|
+
});
|
|
1344
|
+
},
|
|
1345
|
+
function() {
|
|
1346
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1347
|
+
transactionBlock: txBytes,
|
|
1348
|
+
account: account,
|
|
1349
|
+
chain: chain,
|
|
1350
|
+
});
|
|
1351
|
+
},
|
|
1352
|
+
function() {
|
|
1353
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1354
|
+
transactionBlock: txB64,
|
|
1355
|
+
account: account,
|
|
1356
|
+
chain: chain,
|
|
1357
|
+
});
|
|
1358
|
+
},
|
|
1359
|
+
function() {
|
|
1360
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1361
|
+
transaction: txRaw,
|
|
1362
|
+
chain: chain,
|
|
1363
|
+
options: txOptions,
|
|
1364
|
+
});
|
|
1365
|
+
},
|
|
1366
|
+
function() {
|
|
1367
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1368
|
+
transaction: txBytes,
|
|
1369
|
+
chain: chain,
|
|
1370
|
+
options: txOptions,
|
|
1371
|
+
});
|
|
1372
|
+
},
|
|
1373
|
+
function() {
|
|
1374
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1375
|
+
transaction: txB64,
|
|
1376
|
+
chain: chain,
|
|
1377
|
+
options: txOptions,
|
|
1378
|
+
});
|
|
1379
|
+
},
|
|
1380
|
+
function() {
|
|
1381
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1382
|
+
transactionBlock: txBytes,
|
|
1383
|
+
chain: chain,
|
|
1384
|
+
options: txOptions,
|
|
1385
|
+
});
|
|
1386
|
+
},
|
|
1387
|
+
function() {
|
|
1388
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1389
|
+
transactionBlock: txB64,
|
|
1390
|
+
chain: chain,
|
|
1391
|
+
options: txOptions,
|
|
1392
|
+
});
|
|
1393
|
+
},
|
|
1394
|
+
function() {
|
|
1395
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1396
|
+
transaction: txRaw,
|
|
1397
|
+
chain: chain,
|
|
1398
|
+
});
|
|
1399
|
+
},
|
|
1400
|
+
function() {
|
|
1401
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1402
|
+
transaction: txBytes,
|
|
1403
|
+
chain: chain,
|
|
1404
|
+
});
|
|
1405
|
+
},
|
|
1406
|
+
function() {
|
|
1407
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1408
|
+
transaction: txB64,
|
|
1409
|
+
chain: chain,
|
|
1410
|
+
});
|
|
1411
|
+
},
|
|
1412
|
+
function() {
|
|
1413
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1414
|
+
transactionBlock: txBytes,
|
|
1415
|
+
chain: chain,
|
|
1416
|
+
});
|
|
1417
|
+
},
|
|
1418
|
+
function() {
|
|
1419
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1420
|
+
transactionBlock: txB64,
|
|
1421
|
+
chain: chain,
|
|
1422
|
+
});
|
|
1423
|
+
},
|
|
1424
|
+
function() {
|
|
1425
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1426
|
+
transaction: txRaw,
|
|
1427
|
+
options: txOptions,
|
|
1428
|
+
});
|
|
1429
|
+
},
|
|
1430
|
+
function() {
|
|
1431
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1432
|
+
transaction: txBytes,
|
|
1433
|
+
options: txOptions,
|
|
1434
|
+
});
|
|
1435
|
+
},
|
|
1436
|
+
function() {
|
|
1437
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1438
|
+
transaction: txB64,
|
|
1439
|
+
options: txOptions,
|
|
1440
|
+
});
|
|
1441
|
+
},
|
|
1442
|
+
function() {
|
|
1443
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1444
|
+
transactionBlock: txBytes,
|
|
1445
|
+
options: txOptions,
|
|
1446
|
+
});
|
|
1447
|
+
},
|
|
1448
|
+
function() {
|
|
1449
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1450
|
+
transactionBlock: txB64,
|
|
1451
|
+
options: txOptions,
|
|
1452
|
+
});
|
|
1453
|
+
},
|
|
1454
|
+
function() {
|
|
1455
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1456
|
+
transaction: txRaw,
|
|
1457
|
+
});
|
|
1458
|
+
},
|
|
1459
|
+
function() {
|
|
1460
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1461
|
+
transaction: txBytes,
|
|
1462
|
+
});
|
|
1463
|
+
},
|
|
1464
|
+
function() {
|
|
1465
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1466
|
+
transaction: txB64,
|
|
1467
|
+
});
|
|
1468
|
+
},
|
|
1469
|
+
function() {
|
|
1470
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1471
|
+
transactionBlock: txBytes,
|
|
1472
|
+
});
|
|
1473
|
+
},
|
|
1474
|
+
function() {
|
|
1475
|
+
return signExecFeature.signAndExecuteTransaction({
|
|
1476
|
+
transactionBlock: txB64,
|
|
1477
|
+
});
|
|
1478
|
+
},
|
|
1479
|
+
]);
|
|
1480
|
+
} catch (err) {
|
|
1481
|
+
if (singleAttempt) throw err;
|
|
1482
|
+
console.warn('signAndExecuteTransaction failed:', err.message);
|
|
1483
|
+
}
|
|
1484
|
+
return null;
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
async function __wkTrySignAndExecuteTransactionBlock() {
|
|
1488
|
+
if (!signExecBlockFeature || !signExecBlockFeature.signAndExecuteTransactionBlock) return null;
|
|
1489
|
+
try {
|
|
1490
|
+
return await __wkTryCalls([
|
|
1491
|
+
function() {
|
|
1492
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1493
|
+
transactionBlock: txRaw,
|
|
1494
|
+
account: account,
|
|
1495
|
+
chain: chain,
|
|
1496
|
+
options: txOptions,
|
|
1497
|
+
});
|
|
1498
|
+
},
|
|
1499
|
+
function() {
|
|
1500
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1501
|
+
transactionBlock: txBytes,
|
|
1502
|
+
account: account,
|
|
1503
|
+
chain: chain,
|
|
1504
|
+
options: txOptions,
|
|
1505
|
+
});
|
|
1506
|
+
},
|
|
1507
|
+
function() {
|
|
1508
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1509
|
+
transactionBlock: txB64,
|
|
1510
|
+
account: account,
|
|
1511
|
+
chain: chain,
|
|
1512
|
+
options: txOptions,
|
|
1513
|
+
});
|
|
1514
|
+
},
|
|
1515
|
+
function() {
|
|
1516
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1517
|
+
transaction: txBytes,
|
|
1518
|
+
account: account,
|
|
1519
|
+
chain: chain,
|
|
1520
|
+
options: txOptions,
|
|
1521
|
+
});
|
|
1522
|
+
},
|
|
1523
|
+
function() {
|
|
1524
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1525
|
+
transaction: txB64,
|
|
1526
|
+
account: account,
|
|
1527
|
+
chain: chain,
|
|
1528
|
+
options: txOptions,
|
|
1529
|
+
});
|
|
1530
|
+
},
|
|
1531
|
+
function() {
|
|
1532
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1533
|
+
transactionBlock: txRaw,
|
|
1534
|
+
account: account,
|
|
1535
|
+
chain: chain,
|
|
1536
|
+
});
|
|
1537
|
+
},
|
|
1538
|
+
function() {
|
|
1539
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1540
|
+
transactionBlock: txBytes,
|
|
1541
|
+
account: account,
|
|
1542
|
+
chain: chain,
|
|
1543
|
+
});
|
|
1544
|
+
},
|
|
1545
|
+
function() {
|
|
1546
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1547
|
+
transactionBlock: txB64,
|
|
1548
|
+
account: account,
|
|
1549
|
+
chain: chain,
|
|
1550
|
+
});
|
|
1551
|
+
},
|
|
1552
|
+
function() {
|
|
1553
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1554
|
+
transactionBlock: txRaw,
|
|
1555
|
+
chain: chain,
|
|
1556
|
+
options: txOptions,
|
|
1557
|
+
});
|
|
1558
|
+
},
|
|
1559
|
+
function() {
|
|
1560
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1561
|
+
transactionBlock: txBytes,
|
|
1562
|
+
chain: chain,
|
|
1563
|
+
options: txOptions,
|
|
1564
|
+
});
|
|
1565
|
+
},
|
|
1566
|
+
function() {
|
|
1567
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1568
|
+
transactionBlock: txB64,
|
|
1569
|
+
chain: chain,
|
|
1570
|
+
options: txOptions,
|
|
1571
|
+
});
|
|
1572
|
+
},
|
|
1573
|
+
function() {
|
|
1574
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1575
|
+
transaction: txBytes,
|
|
1576
|
+
chain: chain,
|
|
1577
|
+
options: txOptions,
|
|
1578
|
+
});
|
|
1579
|
+
},
|
|
1580
|
+
function() {
|
|
1581
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1582
|
+
transaction: txB64,
|
|
1583
|
+
chain: chain,
|
|
1584
|
+
options: txOptions,
|
|
1585
|
+
});
|
|
1586
|
+
},
|
|
1587
|
+
function() {
|
|
1588
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1589
|
+
transactionBlock: txRaw,
|
|
1590
|
+
chain: chain,
|
|
1591
|
+
});
|
|
1592
|
+
},
|
|
1593
|
+
function() {
|
|
1594
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1595
|
+
transactionBlock: txBytes,
|
|
1596
|
+
chain: chain,
|
|
1597
|
+
});
|
|
1598
|
+
},
|
|
1599
|
+
function() {
|
|
1600
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1601
|
+
transactionBlock: txB64,
|
|
1602
|
+
chain: chain,
|
|
1603
|
+
});
|
|
1604
|
+
},
|
|
1605
|
+
function() {
|
|
1606
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1607
|
+
transaction: txBytes,
|
|
1608
|
+
chain: chain,
|
|
1609
|
+
});
|
|
1610
|
+
},
|
|
1611
|
+
function() {
|
|
1612
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1613
|
+
transaction: txB64,
|
|
1614
|
+
chain: chain,
|
|
1615
|
+
});
|
|
1616
|
+
},
|
|
1617
|
+
function() {
|
|
1618
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1619
|
+
transactionBlock: txRaw,
|
|
1620
|
+
options: txOptions,
|
|
1621
|
+
});
|
|
1622
|
+
},
|
|
1623
|
+
function() {
|
|
1624
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1625
|
+
transactionBlock: txBytes,
|
|
1626
|
+
options: txOptions,
|
|
1627
|
+
});
|
|
1628
|
+
},
|
|
1629
|
+
function() {
|
|
1630
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1631
|
+
transactionBlock: txB64,
|
|
1632
|
+
options: txOptions,
|
|
1633
|
+
});
|
|
1634
|
+
},
|
|
1635
|
+
function() {
|
|
1636
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1637
|
+
transaction: txBytes,
|
|
1638
|
+
options: txOptions,
|
|
1639
|
+
});
|
|
1640
|
+
},
|
|
1641
|
+
function() {
|
|
1642
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1643
|
+
transaction: txB64,
|
|
1644
|
+
options: txOptions,
|
|
1645
|
+
});
|
|
1646
|
+
},
|
|
1647
|
+
function() {
|
|
1648
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1649
|
+
transactionBlock: txRaw,
|
|
1650
|
+
});
|
|
1651
|
+
},
|
|
1652
|
+
function() {
|
|
1653
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1654
|
+
transactionBlock: txBytes,
|
|
1655
|
+
});
|
|
1656
|
+
},
|
|
1657
|
+
function() {
|
|
1658
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1659
|
+
transactionBlock: txB64,
|
|
1660
|
+
});
|
|
1661
|
+
},
|
|
1662
|
+
function() {
|
|
1663
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1664
|
+
transaction: txBytes,
|
|
1665
|
+
});
|
|
1666
|
+
},
|
|
1667
|
+
function() {
|
|
1668
|
+
return signExecBlockFeature.signAndExecuteTransactionBlock({
|
|
1669
|
+
transaction: txB64,
|
|
1670
|
+
});
|
|
1671
|
+
},
|
|
1672
|
+
]);
|
|
1673
|
+
} catch (err) {
|
|
1674
|
+
if (singleAttempt) throw err;
|
|
1675
|
+
console.warn('signAndExecuteTransactionBlock failed:', err.message);
|
|
1676
|
+
}
|
|
1677
|
+
return null;
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
if (preferTransactionBlock) {
|
|
1681
|
+
var byBlock = await __wkTrySignAndExecuteTransactionBlock();
|
|
1682
|
+
if (byBlock) return byBlock;
|
|
1683
|
+
var byTx = await __wkTrySignAndExecuteTransaction();
|
|
1684
|
+
if (byTx) return byTx;
|
|
1685
|
+
} else {
|
|
1686
|
+
var byTxDefault = await __wkTrySignAndExecuteTransaction();
|
|
1687
|
+
if (byTxDefault) return byTxDefault;
|
|
1688
|
+
var byBlockDefault = await __wkTrySignAndExecuteTransactionBlock();
|
|
1689
|
+
if (byBlockDefault) return byBlockDefault;
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
if (phantom && isPhantomWallet) {
|
|
1693
|
+
try {
|
|
1694
|
+
var networkCandidates = __wkNetworkCandidates(chain);
|
|
1695
|
+
var senderAddress = __wkResolveConnectionAddress(conn, account);
|
|
1696
|
+
return await __wkTryCalls([
|
|
1697
|
+
function() {
|
|
1698
|
+
if (typeof phantom.signAndExecuteTransactionBlock !== 'function') throw new Error('Unavailable');
|
|
1699
|
+
return phantom.signAndExecuteTransactionBlock({
|
|
1700
|
+
transactionBlock: txB64,
|
|
1701
|
+
options: txOptions,
|
|
1702
|
+
});
|
|
1703
|
+
},
|
|
1704
|
+
function() {
|
|
1705
|
+
if (typeof phantom.signAndExecuteTransaction !== 'function') throw new Error('Unavailable');
|
|
1706
|
+
return phantom.signAndExecuteTransaction({
|
|
1707
|
+
transaction: txB64,
|
|
1708
|
+
address: senderAddress,
|
|
1709
|
+
networkID: networkCandidates[0],
|
|
1710
|
+
options: txOptions,
|
|
1711
|
+
});
|
|
1712
|
+
},
|
|
1713
|
+
function() {
|
|
1714
|
+
if (typeof phantom.signAndExecuteTransaction !== 'function') throw new Error('Unavailable');
|
|
1715
|
+
return phantom.signAndExecuteTransaction({
|
|
1716
|
+
transaction: txB64,
|
|
1717
|
+
address: senderAddress,
|
|
1718
|
+
networkID: networkCandidates.length > 1 ? networkCandidates[1] : networkCandidates[0],
|
|
1719
|
+
options: txOptions,
|
|
1720
|
+
});
|
|
1721
|
+
},
|
|
1722
|
+
function() {
|
|
1723
|
+
if (typeof phantom.signAndExecuteTransaction !== 'function') throw new Error('Unavailable');
|
|
1724
|
+
return phantom.signAndExecuteTransaction({
|
|
1725
|
+
transaction: txB64,
|
|
1726
|
+
address: senderAddress,
|
|
1727
|
+
});
|
|
1728
|
+
},
|
|
1729
|
+
function() {
|
|
1730
|
+
if (typeof phantom.signAndExecuteTransaction !== 'function') throw new Error('Unavailable');
|
|
1731
|
+
return phantom.signAndExecuteTransaction({
|
|
1732
|
+
transaction: txB64,
|
|
1733
|
+
options: txOptions,
|
|
1734
|
+
});
|
|
1735
|
+
},
|
|
1736
|
+
function() {
|
|
1737
|
+
if (typeof phantom.signAndExecuteTransaction !== 'function') throw new Error('Unavailable');
|
|
1738
|
+
return phantom.signAndExecuteTransaction({
|
|
1739
|
+
transaction: txB64,
|
|
1740
|
+
});
|
|
1741
|
+
},
|
|
1742
|
+
function() {
|
|
1743
|
+
if (typeof phantom.signAndExecuteTransactionBlock !== 'function') throw new Error('Unavailable');
|
|
1744
|
+
return phantom.signAndExecuteTransactionBlock({
|
|
1745
|
+
transaction: txB64,
|
|
1746
|
+
options: txOptions,
|
|
1747
|
+
});
|
|
1748
|
+
},
|
|
1749
|
+
function() {
|
|
1750
|
+
if (typeof phantom.signAndExecuteTransactionBlock !== 'function') throw new Error('Unavailable');
|
|
1751
|
+
return phantom.signAndExecuteTransactionBlock({ transactionBlock: txB64 });
|
|
1752
|
+
},
|
|
1753
|
+
function() {
|
|
1754
|
+
if (typeof phantom.signAndExecuteTransactionBlock !== 'function') throw new Error('Unavailable');
|
|
1755
|
+
return phantom.signAndExecuteTransactionBlock({ transaction: txB64 });
|
|
1756
|
+
},
|
|
1757
|
+
]);
|
|
1758
|
+
} catch (_e) {
|
|
1759
|
+
if (singleAttempt) throw _e;
|
|
1760
|
+
try {
|
|
1761
|
+
var signCalls = [];
|
|
1762
|
+
for (var ni = 0; ni < networkCandidates.length; ni++) {
|
|
1763
|
+
var networkID = networkCandidates[ni];
|
|
1764
|
+
signCalls.push(function(networkIDCopy) {
|
|
1765
|
+
return function() {
|
|
1766
|
+
if (typeof phantom.signTransaction !== 'function') throw new Error('Unavailable');
|
|
1767
|
+
return phantom.signTransaction({
|
|
1768
|
+
transaction: txB64,
|
|
1769
|
+
address: senderAddress,
|
|
1770
|
+
networkID: networkIDCopy,
|
|
1771
|
+
});
|
|
1772
|
+
};
|
|
1773
|
+
}(networkID));
|
|
1774
|
+
}
|
|
1775
|
+
signCalls.push(function() {
|
|
1776
|
+
if (typeof phantom.signTransaction !== 'function') throw new Error('Unavailable');
|
|
1777
|
+
return phantom.signTransaction({ transaction: txB64, address: senderAddress });
|
|
1778
|
+
});
|
|
1779
|
+
signCalls.push(function() {
|
|
1780
|
+
if (typeof phantom.signTransaction !== 'function') throw new Error('Unavailable');
|
|
1781
|
+
return phantom.signTransaction({ transaction: txB64 });
|
|
1782
|
+
});
|
|
1783
|
+
signCalls.push(function() {
|
|
1784
|
+
if (typeof phantom.signTransactionBlock !== 'function') throw new Error('Unavailable');
|
|
1785
|
+
return phantom.signTransactionBlock({ transactionBlock: txB64 });
|
|
1786
|
+
});
|
|
1787
|
+
signCalls.push(function() {
|
|
1788
|
+
if (typeof phantom.signTransactionBlock !== 'function') throw new Error('Unavailable');
|
|
1789
|
+
return phantom.signTransactionBlock({ transaction: txB64 });
|
|
1790
|
+
});
|
|
1791
|
+
|
|
1792
|
+
var signedPhantom = await __wkTryCalls(signCalls);
|
|
1793
|
+
if (signedPhantom && signedPhantom.digest) return signedPhantom;
|
|
1794
|
+
return await __wkExecuteSignedTransaction(signedPhantom, txB64, txOptions);
|
|
1795
|
+
} catch (_e2) {
|
|
1796
|
+
if (singleAttempt) throw _e2;
|
|
1797
|
+
// Continue to other wallet fallbacks.
|
|
1798
|
+
}
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
if (window.suiWallet && window.suiWallet.signAndExecuteTransactionBlock) {
|
|
1803
|
+
try {
|
|
1804
|
+
return await __wkTryCalls([
|
|
1805
|
+
function() {
|
|
1806
|
+
return window.suiWallet.signAndExecuteTransactionBlock({
|
|
1807
|
+
transactionBlock: txBytes,
|
|
1808
|
+
options: txOptions,
|
|
1809
|
+
});
|
|
1810
|
+
},
|
|
1811
|
+
function() {
|
|
1812
|
+
return window.suiWallet.signAndExecuteTransactionBlock({
|
|
1813
|
+
transaction: txBytes,
|
|
1814
|
+
options: txOptions,
|
|
1815
|
+
});
|
|
1816
|
+
},
|
|
1817
|
+
function() {
|
|
1818
|
+
return window.suiWallet.signAndExecuteTransactionBlock({
|
|
1819
|
+
transactionBlock: txB64,
|
|
1820
|
+
options: txOptions,
|
|
1821
|
+
});
|
|
1822
|
+
},
|
|
1823
|
+
]);
|
|
1824
|
+
} catch (_e) {
|
|
1825
|
+
if (singleAttempt) throw _e;
|
|
1826
|
+
}
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
if (typeof SuiWalletKit.signTransaction === 'function') {
|
|
1830
|
+
try {
|
|
1831
|
+
var signed = await SuiWalletKit.signTransaction(txInput, {
|
|
1832
|
+
account: account,
|
|
1833
|
+
chain: chain,
|
|
1834
|
+
});
|
|
1835
|
+
if (signed && signed.digest) return signed;
|
|
1836
|
+
return await __wkExecuteSignedTransaction(signed, txB64, txOptions);
|
|
1837
|
+
} catch (_e) {
|
|
1838
|
+
if (singleAttempt) throw _e;
|
|
1839
|
+
}
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
if (topFrameSigningError) {
|
|
1843
|
+
throw new Error('Wallet requires reconnect in the bridge iframe. Reconnect wallet and retry.');
|
|
1844
|
+
}
|
|
1845
|
+
throw new Error('No compatible signing method found. Install a Sui wallet extension.');
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
SuiWalletKit.signAndExecute = async function signAndExecute(txInput, options) {
|
|
1849
|
+
var operationOptions = __skiBuildOperationOptions(options);
|
|
1850
|
+
var onSubdomain = __skiIsSubdomainHost();
|
|
1851
|
+
var bypassBridgeForSlush = __skiShouldBypassBridgeForSlush(operationOptions);
|
|
1852
|
+
var mustUseBridge = !bypassBridgeForSlush && !!(onSubdomain || (operationOptions && operationOptions.forceSignBridge));
|
|
1853
|
+
var preferredWalletName = __skiResolvePreferredWalletNameForOperation(operationOptions);
|
|
1854
|
+
|
|
1855
|
+
if (__skiShouldUseBridge(operationOptions)) {
|
|
1856
|
+
var bridgeError = null;
|
|
1857
|
+
var txOptions = (operationOptions && operationOptions.txOptions) || {};
|
|
1858
|
+
try {
|
|
1859
|
+
return await __skiSignViaBridge(txInput, txOptions, operationOptions, preferredWalletName);
|
|
1860
|
+
} catch (err) {
|
|
1861
|
+
bridgeError = err;
|
|
1862
|
+
console.warn('Sign bridge failed:', err && err.message ? err.message : err);
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
if (mustUseBridge || __wkIsUserRejection(bridgeError)) {
|
|
1866
|
+
if (
|
|
1867
|
+
mustUseBridge
|
|
1868
|
+
&& !__wkIsUserRejection(bridgeError)
|
|
1869
|
+
&& (
|
|
1870
|
+
__skiRequiresTopFrameSigning(bridgeError)
|
|
1871
|
+
|| __skiIsBridgeWalletAvailabilityError(bridgeError)
|
|
1872
|
+
)
|
|
1873
|
+
) {
|
|
1874
|
+
try {
|
|
1875
|
+
await __skiEnsureBridgeConnectionViaIframe(
|
|
1876
|
+
preferredWalletName,
|
|
1877
|
+
__skiResolveBridgeExpectedSender(operationOptions),
|
|
1878
|
+
);
|
|
1879
|
+
return await __skiSignViaBridge(txInput, txOptions, operationOptions, preferredWalletName);
|
|
1880
|
+
} catch (reconnectErr) {
|
|
1881
|
+
bridgeError = reconnectErr || bridgeError;
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
if (
|
|
1885
|
+
mustUseBridge
|
|
1886
|
+
&& __skiMaybeStartTopFrameHandoff(
|
|
1887
|
+
preferredWalletName,
|
|
1888
|
+
bridgeError,
|
|
1889
|
+
__skiResolveBridgeExpectedSender(operationOptions),
|
|
1890
|
+
)
|
|
1891
|
+
) {
|
|
1892
|
+
throw new Error('Redirecting to top-frame wallet authorization...');
|
|
1893
|
+
}
|
|
1894
|
+
throw bridgeError || new Error('Sign bridge failed. Reconnect wallet from sui.ski and retry.');
|
|
1895
|
+
}
|
|
1896
|
+
|
|
1897
|
+
var reconnected = await __skiEnsureConnectedWalletForSigning(preferredWalletName);
|
|
1898
|
+
if (reconnected && reconnected.wallet) {
|
|
1899
|
+
return await __skiWalletSignAndExecute(txInput, reconnected, operationOptions);
|
|
1900
|
+
}
|
|
1901
|
+
if (bridgeError) throw bridgeError;
|
|
1902
|
+
} else if (mustUseBridge) {
|
|
1903
|
+
throw new Error('Sign bridge not available. Reconnect wallet from sui.ski and retry.');
|
|
1904
|
+
}
|
|
1905
|
+
if (bypassBridgeForSlush) {
|
|
1906
|
+
var slushConn = await __skiEnsureConnectedWalletForSigning('Slush');
|
|
1907
|
+
if (!slushConn || !slushConn.wallet) {
|
|
1908
|
+
throw new Error('Slush extension not detected in this tab. Open Slush and retry.');
|
|
1909
|
+
}
|
|
1910
|
+
return await __skiWalletSignAndExecute(txInput, slushConn, operationOptions);
|
|
1911
|
+
}
|
|
1912
|
+
return await __skiWalletSignAndExecute(txInput, __wkGetWallet(), operationOptions);
|
|
1913
|
+
};
|
|
1914
|
+
|
|
1915
|
+
SuiWalletKit.signAndExecuteFromBytes = SuiWalletKit.signAndExecute;
|
|
1916
|
+
|
|
1917
|
+
var __wkNativeSignPersonalMessage = typeof SuiWalletKit.signPersonalMessage === 'function'
|
|
1918
|
+
? SuiWalletKit.signPersonalMessage.bind(SuiWalletKit)
|
|
1919
|
+
: null;
|
|
1920
|
+
|
|
1921
|
+
SuiWalletKit.signPersonalMessage = async function signPersonalMessage(message, options) {
|
|
1922
|
+
var operationOptions = __skiBuildOperationOptions(options);
|
|
1923
|
+
var onSubdomain = __skiIsSubdomainHost();
|
|
1924
|
+
var bypassBridgeForSlush = __skiShouldBypassBridgeForSlush(operationOptions);
|
|
1925
|
+
var preferredWalletName = __skiResolvePreferredWalletNameForOperation(operationOptions);
|
|
1926
|
+
if (__skiShouldUseBridge(operationOptions)) {
|
|
1927
|
+
var bridgeError = null;
|
|
1928
|
+
try {
|
|
1929
|
+
var signedMessage = await __skiSignMessageViaBridge(message, operationOptions, preferredWalletName);
|
|
1930
|
+
console.log('[WalletTx] Message sign bridge success');
|
|
1931
|
+
return signedMessage;
|
|
1932
|
+
} catch (err) {
|
|
1933
|
+
bridgeError = err;
|
|
1934
|
+
console.warn('Message sign bridge failed:', err && err.message ? err.message : err);
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
var mustUseBridge = !bypassBridgeForSlush && !!(onSubdomain || (operationOptions && operationOptions.forceSignBridge));
|
|
1938
|
+
if (mustUseBridge || __wkIsUserRejection(bridgeError)) {
|
|
1939
|
+
if (
|
|
1940
|
+
mustUseBridge
|
|
1941
|
+
&& !__wkIsUserRejection(bridgeError)
|
|
1942
|
+
&& (
|
|
1943
|
+
__skiRequiresTopFrameSigning(bridgeError)
|
|
1944
|
+
|| __skiIsBridgeWalletAvailabilityError(bridgeError)
|
|
1945
|
+
)
|
|
1946
|
+
) {
|
|
1947
|
+
try {
|
|
1948
|
+
await __skiEnsureBridgeConnectionViaIframe(
|
|
1949
|
+
preferredWalletName,
|
|
1950
|
+
__skiResolveBridgeExpectedSender(operationOptions),
|
|
1951
|
+
);
|
|
1952
|
+
return await __skiSignMessageViaBridge(message, operationOptions, preferredWalletName);
|
|
1953
|
+
} catch (reconnectErr) {
|
|
1954
|
+
bridgeError = reconnectErr || bridgeError;
|
|
1955
|
+
}
|
|
1956
|
+
}
|
|
1957
|
+
if (
|
|
1958
|
+
mustUseBridge
|
|
1959
|
+
&& __skiMaybeStartTopFrameHandoff(
|
|
1960
|
+
preferredWalletName,
|
|
1961
|
+
bridgeError,
|
|
1962
|
+
__skiResolveBridgeExpectedSender(operationOptions),
|
|
1963
|
+
)
|
|
1964
|
+
) {
|
|
1965
|
+
throw new Error('Redirecting to top-frame wallet authorization...');
|
|
1966
|
+
}
|
|
1967
|
+
throw bridgeError || new Error('Sign bridge failed. Reconnect wallet from sui.ski and retry.');
|
|
1968
|
+
}
|
|
1969
|
+
|
|
1970
|
+
var reconnected = await __skiEnsureConnectedWalletForSigning(preferredWalletName);
|
|
1971
|
+
if (reconnected && reconnected.wallet && __wkNativeSignPersonalMessage) {
|
|
1972
|
+
return await __wkNativeSignPersonalMessage(message);
|
|
1973
|
+
}
|
|
1974
|
+
if (bridgeError) throw bridgeError;
|
|
1975
|
+
} else {
|
|
1976
|
+
var onSubdomainFallback = __skiIsSubdomainHost();
|
|
1977
|
+
if ((!bypassBridgeForSlush && onSubdomainFallback) || (operationOptions && operationOptions.forceSignBridge)) {
|
|
1978
|
+
throw new Error('Sign bridge not available. Reconnect wallet from sui.ski and retry.');
|
|
1979
|
+
}
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
if (bypassBridgeForSlush) {
|
|
1983
|
+
var slushMsgConn = await __skiEnsureConnectedWalletForSigning('Slush');
|
|
1984
|
+
if (!slushMsgConn || !slushMsgConn.wallet) {
|
|
1985
|
+
throw new Error('Slush extension not detected in this tab. Open Slush and retry.');
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
|
|
1989
|
+
if (!__wkNativeSignPersonalMessage) {
|
|
1990
|
+
throw new Error('Current wallet does not support personal message signing');
|
|
1991
|
+
}
|
|
1992
|
+
return await __wkNativeSignPersonalMessage(message);
|
|
1993
|
+
};
|
|
1994
|
+
|
|
1995
|
+
SuiWalletKit.signTransaction = async function signTransaction(txInput, options) {
|
|
1996
|
+
var operationOptions = __skiBuildOperationOptions(options);
|
|
1997
|
+
var onSubdomain = __skiIsSubdomainHost();
|
|
1998
|
+
var bypassBridgeForSlush = __skiShouldBypassBridgeForSlush(operationOptions);
|
|
1999
|
+
var mustUseBridge = !bypassBridgeForSlush && !!(onSubdomain || (operationOptions && operationOptions.forceSignBridge));
|
|
2000
|
+
var preferredWalletName = __skiResolvePreferredWalletNameForOperation(operationOptions);
|
|
2001
|
+
if (__skiShouldUseBridge(operationOptions)) {
|
|
2002
|
+
var bridgeError = null;
|
|
2003
|
+
try {
|
|
2004
|
+
return await __skiSignViaBridge(txInput, {}, operationOptions, preferredWalletName);
|
|
2005
|
+
} catch (err) {
|
|
2006
|
+
bridgeError = err;
|
|
2007
|
+
console.warn('Sign bridge failed:', err && err.message ? err.message : err);
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
if (mustUseBridge) {
|
|
2011
|
+
if (
|
|
2012
|
+
!__wkIsUserRejection(bridgeError)
|
|
2013
|
+
&& (
|
|
2014
|
+
__skiRequiresTopFrameSigning(bridgeError)
|
|
2015
|
+
|| __skiIsBridgeWalletAvailabilityError(bridgeError)
|
|
2016
|
+
)
|
|
2017
|
+
) {
|
|
2018
|
+
try {
|
|
2019
|
+
await __skiEnsureBridgeConnectionViaIframe(
|
|
2020
|
+
preferredWalletName,
|
|
2021
|
+
__skiResolveBridgeExpectedSender(operationOptions),
|
|
2022
|
+
);
|
|
2023
|
+
return await __skiSignViaBridge(txInput, {}, operationOptions, preferredWalletName);
|
|
2024
|
+
} catch (reconnectErr) {
|
|
2025
|
+
bridgeError = reconnectErr || bridgeError;
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
if (
|
|
2029
|
+
__skiMaybeStartTopFrameHandoff(
|
|
2030
|
+
preferredWalletName,
|
|
2031
|
+
bridgeError,
|
|
2032
|
+
__skiResolveBridgeExpectedSender(operationOptions),
|
|
2033
|
+
)
|
|
2034
|
+
) {
|
|
2035
|
+
throw new Error('Redirecting to top-frame wallet authorization...');
|
|
2036
|
+
}
|
|
2037
|
+
throw bridgeError || new Error('Sign bridge failed. Reconnect wallet from sui.ski and retry.');
|
|
2038
|
+
}
|
|
2039
|
+
|
|
2040
|
+
var reconnected = await __skiEnsureConnectedWalletForSigning(preferredWalletName);
|
|
2041
|
+
if (reconnected && reconnected.wallet) {
|
|
2042
|
+
// Continue into direct wallet signing flow below.
|
|
2043
|
+
} else if (bridgeError) {
|
|
2044
|
+
throw bridgeError;
|
|
2045
|
+
}
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
if (bypassBridgeForSlush) {
|
|
2049
|
+
var slushTxConn = await __skiEnsureConnectedWalletForSigning('Slush');
|
|
2050
|
+
if (!slushTxConn || !slushTxConn.wallet) {
|
|
2051
|
+
throw new Error('Slush extension not detected in this tab. Open Slush and retry.');
|
|
2052
|
+
}
|
|
2053
|
+
}
|
|
2054
|
+
|
|
2055
|
+
var txRaw = await __skiSerializeForWallet(txInput);
|
|
2056
|
+
var txBytes = txRaw;
|
|
2057
|
+
if (txRaw && typeof txRaw.serialize === 'function') {
|
|
2058
|
+
try {
|
|
2059
|
+
txBytes = await txRaw.serialize();
|
|
2060
|
+
} catch (_e) {
|
|
2061
|
+
if (txRaw && typeof txRaw.build === 'function') {
|
|
2062
|
+
try {
|
|
2063
|
+
var RpcClient = window.SuiJsonRpcClient || window.SuiClient;
|
|
2064
|
+
if (RpcClient) {
|
|
2065
|
+
var rpcClient = new RpcClient({ url: __wkGetRpcUrl() });
|
|
2066
|
+
txBytes = await txRaw.build({ client: rpcClient });
|
|
2067
|
+
}
|
|
2068
|
+
} catch (_e2) {}
|
|
2069
|
+
}
|
|
2070
|
+
}
|
|
2071
|
+
}
|
|
2072
|
+
var txB64 = txBytes;
|
|
2073
|
+
if (
|
|
2074
|
+
txBytes instanceof Uint8Array ||
|
|
2075
|
+
txBytes instanceof ArrayBuffer ||
|
|
2076
|
+
Array.isArray(txBytes)
|
|
2077
|
+
) {
|
|
2078
|
+
txB64 = __wkBytesToBase64(txBytes);
|
|
2079
|
+
}
|
|
2080
|
+
var conn = __wkGetWallet();
|
|
2081
|
+
var wallet = conn.wallet;
|
|
2082
|
+
var account = __wkResolveWalletAccount(conn, options && options.account);
|
|
2083
|
+
var chain = (options && options.chain) || __wkChain;
|
|
2084
|
+
async function __wkTryCalls(calls) {
|
|
2085
|
+
var lastErr = null;
|
|
2086
|
+
for (var i = 0; i < calls.length; i++) {
|
|
2087
|
+
try {
|
|
2088
|
+
return await calls[i]();
|
|
2089
|
+
} catch (err) {
|
|
2090
|
+
lastErr = err;
|
|
2091
|
+
}
|
|
2092
|
+
}
|
|
2093
|
+
if (lastErr) throw lastErr;
|
|
2094
|
+
throw new Error('Wallet does not support transaction signing. Try a different wallet or update your current one.');
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
var signFeature = wallet.features && wallet.features['sui:signTransaction'];
|
|
2098
|
+
if (signFeature && signFeature.signTransaction) {
|
|
2099
|
+
try {
|
|
2100
|
+
return await __wkTryCalls([
|
|
2101
|
+
function() {
|
|
2102
|
+
return signFeature.signTransaction({
|
|
2103
|
+
transaction: txRaw,
|
|
2104
|
+
account: account,
|
|
2105
|
+
chain: chain,
|
|
2106
|
+
});
|
|
2107
|
+
},
|
|
2108
|
+
function() {
|
|
2109
|
+
return signFeature.signTransaction({
|
|
2110
|
+
transaction: txRaw,
|
|
2111
|
+
account: account,
|
|
2112
|
+
});
|
|
2113
|
+
},
|
|
2114
|
+
function() {
|
|
2115
|
+
return signFeature.signTransaction({
|
|
2116
|
+
transaction: txRaw,
|
|
2117
|
+
});
|
|
2118
|
+
},
|
|
2119
|
+
function() {
|
|
2120
|
+
return signFeature.signTransaction({
|
|
2121
|
+
transaction: txBytes,
|
|
2122
|
+
account: account,
|
|
2123
|
+
chain: chain,
|
|
2124
|
+
});
|
|
2125
|
+
},
|
|
2126
|
+
function() {
|
|
2127
|
+
return signFeature.signTransaction({
|
|
2128
|
+
transaction: txBytes,
|
|
2129
|
+
account: account,
|
|
2130
|
+
});
|
|
2131
|
+
},
|
|
2132
|
+
function() {
|
|
2133
|
+
return signFeature.signTransaction({
|
|
2134
|
+
transaction: txBytes,
|
|
2135
|
+
});
|
|
2136
|
+
},
|
|
2137
|
+
function() {
|
|
2138
|
+
return signFeature.signTransaction({
|
|
2139
|
+
transaction: txB64,
|
|
2140
|
+
account: account,
|
|
2141
|
+
chain: chain,
|
|
2142
|
+
});
|
|
2143
|
+
},
|
|
2144
|
+
function() {
|
|
2145
|
+
return signFeature.signTransaction({
|
|
2146
|
+
transaction: txB64,
|
|
2147
|
+
account: account,
|
|
2148
|
+
});
|
|
2149
|
+
},
|
|
2150
|
+
function() {
|
|
2151
|
+
return signFeature.signTransaction({
|
|
2152
|
+
transaction: txB64,
|
|
2153
|
+
});
|
|
2154
|
+
},
|
|
2155
|
+
]);
|
|
2156
|
+
} catch (err) {
|
|
2157
|
+
console.warn('signTransaction failed:', err && err.message ? err.message : err);
|
|
2158
|
+
}
|
|
2159
|
+
}
|
|
2160
|
+
|
|
2161
|
+
var signBlockFeature = wallet.features && wallet.features['sui:signTransactionBlock'];
|
|
2162
|
+
if (signBlockFeature && signBlockFeature.signTransactionBlock) {
|
|
2163
|
+
try {
|
|
2164
|
+
return await __wkTryCalls([
|
|
2165
|
+
function() {
|
|
2166
|
+
return signBlockFeature.signTransactionBlock({
|
|
2167
|
+
transactionBlock: txRaw,
|
|
2168
|
+
account: account,
|
|
2169
|
+
chain: chain,
|
|
2170
|
+
});
|
|
2171
|
+
},
|
|
2172
|
+
function() {
|
|
2173
|
+
return signBlockFeature.signTransactionBlock({
|
|
2174
|
+
transactionBlock: txRaw,
|
|
2175
|
+
account: account,
|
|
2176
|
+
});
|
|
2177
|
+
},
|
|
2178
|
+
function() {
|
|
2179
|
+
return signBlockFeature.signTransactionBlock({
|
|
2180
|
+
transactionBlock: txRaw,
|
|
2181
|
+
});
|
|
2182
|
+
},
|
|
2183
|
+
function() {
|
|
2184
|
+
return signBlockFeature.signTransactionBlock({
|
|
2185
|
+
transactionBlock: txBytes,
|
|
2186
|
+
account: account,
|
|
2187
|
+
chain: chain,
|
|
2188
|
+
});
|
|
2189
|
+
},
|
|
2190
|
+
function() {
|
|
2191
|
+
return signBlockFeature.signTransactionBlock({
|
|
2192
|
+
transactionBlock: txBytes,
|
|
2193
|
+
account: account,
|
|
2194
|
+
});
|
|
2195
|
+
},
|
|
2196
|
+
function() {
|
|
2197
|
+
return signBlockFeature.signTransactionBlock({
|
|
2198
|
+
transactionBlock: txBytes,
|
|
2199
|
+
});
|
|
2200
|
+
},
|
|
2201
|
+
function() {
|
|
2202
|
+
return signBlockFeature.signTransactionBlock({
|
|
2203
|
+
transactionBlock: txB64,
|
|
2204
|
+
account: account,
|
|
2205
|
+
chain: chain,
|
|
2206
|
+
});
|
|
2207
|
+
},
|
|
2208
|
+
function() {
|
|
2209
|
+
return signBlockFeature.signTransactionBlock({
|
|
2210
|
+
transactionBlock: txB64,
|
|
2211
|
+
account: account,
|
|
2212
|
+
});
|
|
2213
|
+
},
|
|
2214
|
+
function() {
|
|
2215
|
+
return signBlockFeature.signTransactionBlock({
|
|
2216
|
+
transactionBlock: txB64,
|
|
2217
|
+
});
|
|
2218
|
+
},
|
|
2219
|
+
function() {
|
|
2220
|
+
return signBlockFeature.signTransactionBlock({
|
|
2221
|
+
transaction: txRaw,
|
|
2222
|
+
account: account,
|
|
2223
|
+
});
|
|
2224
|
+
},
|
|
2225
|
+
function() {
|
|
2226
|
+
return signBlockFeature.signTransactionBlock({
|
|
2227
|
+
transaction: txBytes,
|
|
2228
|
+
account: account,
|
|
2229
|
+
});
|
|
2230
|
+
},
|
|
2231
|
+
function() {
|
|
2232
|
+
return signBlockFeature.signTransactionBlock({
|
|
2233
|
+
transaction: txB64,
|
|
2234
|
+
account: account,
|
|
2235
|
+
});
|
|
2236
|
+
},
|
|
2237
|
+
]);
|
|
2238
|
+
} catch (err) {
|
|
2239
|
+
console.warn('signTransactionBlock failed:', err && err.message ? err.message : err);
|
|
2240
|
+
}
|
|
2241
|
+
}
|
|
2242
|
+
|
|
2243
|
+
var phantom = __wkGetPhantomProvider();
|
|
2244
|
+
var walletName = String((wallet && wallet.name) || '').toLowerCase();
|
|
2245
|
+
var isPhantomWallet = !!(
|
|
2246
|
+
(walletName && walletName.indexOf('phantom') !== -1)
|
|
2247
|
+
|| (wallet && wallet.isPhantom)
|
|
2248
|
+
|| (wallet && wallet._raw && wallet._raw.isPhantom)
|
|
2249
|
+
|| (
|
|
2250
|
+
phantom && (
|
|
2251
|
+
wallet === phantom
|
|
2252
|
+
|| (wallet && wallet._raw === phantom)
|
|
2253
|
+
)
|
|
2254
|
+
)
|
|
2255
|
+
);
|
|
2256
|
+
if (phantom && phantom.signTransactionBlock && isPhantomWallet) {
|
|
2257
|
+
try {
|
|
2258
|
+
return await __wkTryCalls([
|
|
2259
|
+
function() { return phantom.signTransactionBlock({ transactionBlock: txRaw }); },
|
|
2260
|
+
function() { return phantom.signTransactionBlock({ transaction: txRaw }); },
|
|
2261
|
+
function() { return phantom.signTransactionBlock({ transactionBlock: txBytes }); },
|
|
2262
|
+
function() { return phantom.signTransactionBlock({ transaction: txBytes }); },
|
|
2263
|
+
function() { return phantom.signTransactionBlock({ transactionBlock: txB64 }); },
|
|
2264
|
+
function() { return phantom.signTransactionBlock({ transaction: txB64 }); },
|
|
2265
|
+
]);
|
|
2266
|
+
} catch (_e) {
|
|
2267
|
+
// Continue to wallet fallback.
|
|
2268
|
+
}
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
if (window.suiWallet && window.suiWallet.signTransactionBlock) {
|
|
2272
|
+
try {
|
|
2273
|
+
return await __wkTryCalls([
|
|
2274
|
+
function() { return window.suiWallet.signTransactionBlock({ transactionBlock: txRaw }); },
|
|
2275
|
+
function() { return window.suiWallet.signTransactionBlock({ transaction: txRaw }); },
|
|
2276
|
+
function() { return window.suiWallet.signTransactionBlock({ transactionBlock: txBytes }); },
|
|
2277
|
+
function() { return window.suiWallet.signTransactionBlock({ transaction: txBytes }); },
|
|
2278
|
+
function() { return window.suiWallet.signTransactionBlock({ transactionBlock: txB64 }); },
|
|
2279
|
+
function() { return window.suiWallet.signTransactionBlock({ transaction: txB64 }); },
|
|
2280
|
+
]);
|
|
2281
|
+
} catch (_e) {}
|
|
2282
|
+
}
|
|
2283
|
+
|
|
2284
|
+
throw new Error('Wallet does not support transaction signing. Try a different wallet or update your current one.');
|
|
2285
|
+
};
|
|
2286
|
+
`
|
|
2287
|
+
}
|