multisigns-sdk 1.0.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/dist/chunk-DGUM43GV.js +11 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-DIRO3HK2.js +156 -0
- package/dist/chunk-DIRO3HK2.js.map +1 -0
- package/dist/chunk-DRU5TCIR.js +177 -0
- package/dist/chunk-DRU5TCIR.js.map +1 -0
- package/dist/chunk-KXIOGAV2.js +156 -0
- package/dist/chunk-KXIOGAV2.js.map +1 -0
- package/dist/chunk-L45R2ICF.js +55 -0
- package/dist/chunk-L45R2ICF.js.map +1 -0
- package/dist/chunk-OTW5PZKP.js +122 -0
- package/dist/chunk-OTW5PZKP.js.map +1 -0
- package/dist/chunk-VM6L5X3N.js +217 -0
- package/dist/chunk-VM6L5X3N.js.map +1 -0
- package/dist/chunk-XYPJCLZQ.js +578 -0
- package/dist/chunk-XYPJCLZQ.js.map +1 -0
- package/dist/config-D7BTGWZB.js +34 -0
- package/dist/config-D7BTGWZB.js.map +1 -0
- package/dist/createSolanaMultisigOrder-ABBIJ4ZX.js +11 -0
- package/dist/createSolanaMultisigOrder-ABBIJ4ZX.js.map +1 -0
- package/dist/evm-validation-LYH2LHXM.js +138 -0
- package/dist/evm-validation-LYH2LHXM.js.map +1 -0
- package/dist/index.cjs +8373 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1181 -0
- package/dist/index.d.ts +1181 -0
- package/dist/index.js +6297 -0
- package/dist/index.js.map +1 -0
- package/dist/order-helpers-4TZ72BRJ.js +418 -0
- package/dist/order-helpers-4TZ72BRJ.js.map +1 -0
- package/dist/shares-Y4CE3S2X.js +32 -0
- package/dist/shares-Y4CE3S2X.js.map +1 -0
- package/dist/wallet.api-GK3OBWQS.js +9 -0
- package/dist/wallet.api-GK3OBWQS.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
import {
|
|
2
|
+
encryptRsaOaep
|
|
3
|
+
} from "./chunk-KXIOGAV2.js";
|
|
4
|
+
import {
|
|
5
|
+
EChainType
|
|
6
|
+
} from "./chunk-L45R2ICF.js";
|
|
7
|
+
|
|
8
|
+
// src/strategies/iframeServices/solana/createSolanaMultisigOrder.ts
|
|
9
|
+
import {
|
|
10
|
+
Connection,
|
|
11
|
+
PublicKey as PublicKey2,
|
|
12
|
+
SystemProgram,
|
|
13
|
+
Transaction,
|
|
14
|
+
TransactionMessage
|
|
15
|
+
} from "@solana/web3.js";
|
|
16
|
+
import {
|
|
17
|
+
ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
18
|
+
getAssociatedTokenAddress,
|
|
19
|
+
createTransferCheckedInstruction,
|
|
20
|
+
createAssociatedTokenAccountInstruction
|
|
21
|
+
} from "@solana/spl-token";
|
|
22
|
+
|
|
23
|
+
// src/strategies/types.ts
|
|
24
|
+
var EChainType2 = {
|
|
25
|
+
EVM: "EVM",
|
|
26
|
+
SOL: "SOL",
|
|
27
|
+
TRON: "TRON",
|
|
28
|
+
BTC: "BTC",
|
|
29
|
+
BTC_T3: "BTC_T3"
|
|
30
|
+
};
|
|
31
|
+
var ESolanaInstructionType = {
|
|
32
|
+
native: "native",
|
|
33
|
+
spl: "spl",
|
|
34
|
+
addOwner: "addOwner",
|
|
35
|
+
removeOwner: "removeOwner",
|
|
36
|
+
changeThreshold: "changeThreshold"
|
|
37
|
+
};
|
|
38
|
+
var TransactionExecutionType = {
|
|
39
|
+
ExecOrder: "execOrder",
|
|
40
|
+
Send: "send",
|
|
41
|
+
ActivateMultisig: "activateMultisig"
|
|
42
|
+
};
|
|
43
|
+
var TransactionEstimatingType = {
|
|
44
|
+
ExecOrder: "execOrder",
|
|
45
|
+
Send: "send",
|
|
46
|
+
ActivateMultisig: "activateMultisig",
|
|
47
|
+
SignOrder: "SignOrder",
|
|
48
|
+
CreateOrder: "CreateOrder",
|
|
49
|
+
ChangeMultisig: "ChangeMultisig"
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// src/strategies/iframeServices/solana/createSolanaMultisigOrder.ts
|
|
53
|
+
import * as Squads2 from "@sqds/multisig";
|
|
54
|
+
|
|
55
|
+
// src/strategies/iframeServices/solana/utils/reconstructAndVerifySolKey.ts
|
|
56
|
+
import { Keypair as Keypair2 } from "@solana/web3.js";
|
|
57
|
+
|
|
58
|
+
// src/strategies/iframeServices/types.ts
|
|
59
|
+
var EChainType3 = EChainType;
|
|
60
|
+
var IS_MAINNET = process.env.IS_MAINNET === "true" || false;
|
|
61
|
+
|
|
62
|
+
// src/strategies/iframeServices/utils/crypto.ts
|
|
63
|
+
import { ethers } from "ethers";
|
|
64
|
+
import { combine } from "shamir-secret-sharing";
|
|
65
|
+
import { Keypair } from "@solana/web3.js";
|
|
66
|
+
import * as ecc from "tiny-secp256k1";
|
|
67
|
+
import { Buffer } from "buffer";
|
|
68
|
+
import { ECPairFactory } from "ecpair";
|
|
69
|
+
import * as bitcoin from "bitcoinjs-lib";
|
|
70
|
+
var ECPair = ECPairFactory(ecc);
|
|
71
|
+
var IS_MAINNET2 = process.env.IS_MAINNET === "true" || false;
|
|
72
|
+
var combineShares = async (shares) => {
|
|
73
|
+
const shareBuffers = shares.map((share) => ethers.getBytes(share));
|
|
74
|
+
const reconstructed = await combine(shareBuffers);
|
|
75
|
+
return reconstructed;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// src/strategies/iframeServices/api/wallet.ts
|
|
79
|
+
import { ethers as ethers2 } from "ethers";
|
|
80
|
+
var fetchServerShare = async (apiKey, walletAddress, chainType, apiUrl) => {
|
|
81
|
+
const res = await fetch(
|
|
82
|
+
`${apiUrl}/sdk/wallets/share/c/${chainType}/${walletAddress}`,
|
|
83
|
+
{
|
|
84
|
+
headers: {
|
|
85
|
+
"X-API-KEY": apiKey
|
|
86
|
+
},
|
|
87
|
+
credentials: "include"
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
if (!res.ok) {
|
|
91
|
+
throw new Error("Failed to fetch server share");
|
|
92
|
+
}
|
|
93
|
+
const data = await res.json();
|
|
94
|
+
return data.share;
|
|
95
|
+
};
|
|
96
|
+
var fetchRecoveryShare = async (apiKey, walletAddress, chainType, apiUrl) => {
|
|
97
|
+
const res = await fetch(
|
|
98
|
+
`${apiUrl}/sdk/wallets/share/s/${chainType}/${walletAddress}`,
|
|
99
|
+
{
|
|
100
|
+
headers: {
|
|
101
|
+
"X-API-KEY": apiKey
|
|
102
|
+
},
|
|
103
|
+
credentials: "include"
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
if (!res.ok) {
|
|
107
|
+
throw new Error("Failed to fetch recovery share");
|
|
108
|
+
}
|
|
109
|
+
const data = await res.json();
|
|
110
|
+
return data.share;
|
|
111
|
+
};
|
|
112
|
+
var fetchShares = async (apiKey, walletAddress, chainType, apiUrl) => {
|
|
113
|
+
const [recovery, server] = await Promise.all([
|
|
114
|
+
fetchRecoveryShare(apiKey, walletAddress, chainType, apiUrl),
|
|
115
|
+
fetchServerShare(apiKey, walletAddress, chainType, apiUrl)
|
|
116
|
+
]);
|
|
117
|
+
return {
|
|
118
|
+
recovery,
|
|
119
|
+
server
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
var SHAMIR_THRESHOLD_PERSONAL = 2;
|
|
123
|
+
var SHAMIR_SHARES_NUM = 3;
|
|
124
|
+
var combineSharesFromHex = async (shares) => {
|
|
125
|
+
const { combine: combine2 } = await import("shamir-secret-sharing");
|
|
126
|
+
const shareBuffers = shares.map((share) => ethers2.getBytes(share));
|
|
127
|
+
const reconstructed = await combine2(shareBuffers);
|
|
128
|
+
return reconstructed;
|
|
129
|
+
};
|
|
130
|
+
var splitPrivateKey = async (privateKeyBytes) => {
|
|
131
|
+
const { split } = await import("shamir-secret-sharing");
|
|
132
|
+
const shares = await split(
|
|
133
|
+
privateKeyBytes,
|
|
134
|
+
SHAMIR_SHARES_NUM,
|
|
135
|
+
SHAMIR_THRESHOLD_PERSONAL
|
|
136
|
+
);
|
|
137
|
+
const { ethers: ethers3 } = await import("ethers");
|
|
138
|
+
const deviceShare = ethers3.hexlify(shares[0]);
|
|
139
|
+
const serverShare = ethers3.hexlify(shares[1]);
|
|
140
|
+
const recoveryShare = ethers3.hexlify(shares[2]);
|
|
141
|
+
return {
|
|
142
|
+
deviceShare,
|
|
143
|
+
serverShare,
|
|
144
|
+
recoveryShare
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
var createShares = async (privateKeyBytes) => {
|
|
148
|
+
if (!privateKeyBytes) {
|
|
149
|
+
throw new Error("Cannot create shares");
|
|
150
|
+
}
|
|
151
|
+
const shares = await splitPrivateKey(privateKeyBytes);
|
|
152
|
+
return shares;
|
|
153
|
+
};
|
|
154
|
+
var updateShares = async (walletAddress, serverShare, recoveryShare, apiKey, apiUrl) => {
|
|
155
|
+
try {
|
|
156
|
+
const reconstructed = await combineSharesFromHex([recoveryShare, serverShare]);
|
|
157
|
+
const shares = await createShares(reconstructed);
|
|
158
|
+
const pubkeyResponse = await fetch(`${apiUrl}/sdk/wallets/pubkey`, {
|
|
159
|
+
method: "GET",
|
|
160
|
+
headers: {
|
|
161
|
+
"Content-Type": "application/json",
|
|
162
|
+
"X-API-KEY": apiKey
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
if (!pubkeyResponse.ok) {
|
|
166
|
+
await pubkeyResponse.text().catch(() => "N/A");
|
|
167
|
+
console.error(
|
|
168
|
+
`Critical Failure [${walletAddress}]: STEP 2 (Get Pubkey). Status: ${pubkeyResponse.status}.`
|
|
169
|
+
);
|
|
170
|
+
throw new Error(
|
|
171
|
+
`Failed to fetch public key. Status: ${pubkeyResponse.status}`
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const { pubkey } = await pubkeyResponse.json();
|
|
175
|
+
const encryptedRecoveryShare = await encryptRsaOaep(
|
|
176
|
+
pubkey,
|
|
177
|
+
shares.recoveryShare
|
|
178
|
+
);
|
|
179
|
+
const updateResponse = await fetch(`${apiUrl}/sdk/wallets/update`, {
|
|
180
|
+
method: "POST",
|
|
181
|
+
headers: {
|
|
182
|
+
"Content-Type": "application/json",
|
|
183
|
+
"X-API-KEY": apiKey
|
|
184
|
+
},
|
|
185
|
+
body: JSON.stringify({
|
|
186
|
+
walletAddress,
|
|
187
|
+
serverShare: shares.serverShare,
|
|
188
|
+
encryptedRecoveryShare
|
|
189
|
+
})
|
|
190
|
+
});
|
|
191
|
+
if (!updateResponse.ok) {
|
|
192
|
+
await updateResponse.text().catch(() => "N/A");
|
|
193
|
+
console.error(
|
|
194
|
+
`Critical Failure [${walletAddress}]: STEP 4 (Update Shares). Status: ${updateResponse.status}.`
|
|
195
|
+
);
|
|
196
|
+
throw new Error(
|
|
197
|
+
`Failed to update shares on server. Status: ${updateResponse.status}`
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
recovery: "",
|
|
202
|
+
server: shares.serverShare,
|
|
203
|
+
device: shares.deviceShare
|
|
204
|
+
};
|
|
205
|
+
} catch (err) {
|
|
206
|
+
console.error(`UpdateShares Critical Failure for ${walletAddress}:`, err);
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// src/strategies/iframeServices/utils/getReconstructionShares.ts
|
|
212
|
+
var API_URL = process.env.AFRIDAX_API_URL || "https://afridax-backend-production.up.railway.app";
|
|
213
|
+
var getReconstructionShares = async (deviceShare, walletAddress, apiKey, forceUpdate, chainType) => {
|
|
214
|
+
let mainShare;
|
|
215
|
+
let additionalShare;
|
|
216
|
+
let newDeviceShare = null;
|
|
217
|
+
debugger;
|
|
218
|
+
if (forceUpdate || !deviceShare || deviceShare === "-") {
|
|
219
|
+
const shares = await fetchShares(apiKey, walletAddress, chainType, API_URL);
|
|
220
|
+
const { device, server } = await updateShares(
|
|
221
|
+
walletAddress,
|
|
222
|
+
shares.server,
|
|
223
|
+
shares.recovery,
|
|
224
|
+
apiKey,
|
|
225
|
+
API_URL
|
|
226
|
+
);
|
|
227
|
+
mainShare = device;
|
|
228
|
+
additionalShare = server;
|
|
229
|
+
newDeviceShare = device;
|
|
230
|
+
} else {
|
|
231
|
+
const serverShare = await fetchServerShare(apiKey, walletAddress, chainType, API_URL);
|
|
232
|
+
mainShare = deviceShare;
|
|
233
|
+
additionalShare = serverShare;
|
|
234
|
+
}
|
|
235
|
+
if (!mainShare || !additionalShare) {
|
|
236
|
+
throw new Error("Failed to retrieve key shares.");
|
|
237
|
+
}
|
|
238
|
+
return { mainShare, additionalShare, newDeviceShare };
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
// src/strategies/iframeServices/solana/utils/reconstructAndVerifySolKey.ts
|
|
242
|
+
var reconstructAndVerifySolKey = async (deviceShare, address, accessToken, forceUpdate) => {
|
|
243
|
+
const { mainShare, additionalShare, newDeviceShare } = await getReconstructionShares(
|
|
244
|
+
deviceShare,
|
|
245
|
+
address,
|
|
246
|
+
accessToken,
|
|
247
|
+
forceUpdate,
|
|
248
|
+
EChainType3.SOL
|
|
249
|
+
);
|
|
250
|
+
const reconstructed = await combineShares([mainShare, additionalShare]);
|
|
251
|
+
let signer;
|
|
252
|
+
try {
|
|
253
|
+
signer = Keypair2.fromSecretKey(reconstructed);
|
|
254
|
+
} catch (err) {
|
|
255
|
+
console.error("Keypair reconstruction failed:", err.message);
|
|
256
|
+
throw new Error("KEY_MISMATCH");
|
|
257
|
+
}
|
|
258
|
+
if (signer.publicKey.toBase58() !== address) {
|
|
259
|
+
throw new Error("KEY_MISMATCH");
|
|
260
|
+
}
|
|
261
|
+
return { signer, newDeviceShare };
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// src/strategies/iframeServices/solana/utils/prepareActions.ts
|
|
265
|
+
import { PublicKey } from "@solana/web3.js";
|
|
266
|
+
import * as Squads from "@sqds/multisig";
|
|
267
|
+
var prepareActions = (props) => {
|
|
268
|
+
const { instructions: instructions2, threshold } = props;
|
|
269
|
+
switch (instructions2.type) {
|
|
270
|
+
case ESolanaInstructionType.addOwner: {
|
|
271
|
+
const newMember = instructions2.newOwner;
|
|
272
|
+
if (!newMember) {
|
|
273
|
+
throw new Error("Error: newMember doesn't exist");
|
|
274
|
+
}
|
|
275
|
+
const add = {
|
|
276
|
+
__kind: "AddMember",
|
|
277
|
+
newMember: {
|
|
278
|
+
key: new PublicKey(newMember),
|
|
279
|
+
permissions: Squads.types.Permissions.all()
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const changeThreshold = {
|
|
283
|
+
__kind: "ChangeThreshold",
|
|
284
|
+
newThreshold: threshold
|
|
285
|
+
};
|
|
286
|
+
const actions = threshold ? [add, changeThreshold] : [add];
|
|
287
|
+
return actions;
|
|
288
|
+
}
|
|
289
|
+
case ESolanaInstructionType.removeOwner: {
|
|
290
|
+
const oldMember = instructions2.removeOwner;
|
|
291
|
+
if (!oldMember) {
|
|
292
|
+
throw new Error("Error: oldMember doesn't exist");
|
|
293
|
+
}
|
|
294
|
+
const remove = {
|
|
295
|
+
__kind: "RemoveMember",
|
|
296
|
+
oldMember: new PublicKey(oldMember)
|
|
297
|
+
};
|
|
298
|
+
const changeThreshold = {
|
|
299
|
+
__kind: "ChangeThreshold",
|
|
300
|
+
newThreshold: threshold
|
|
301
|
+
};
|
|
302
|
+
const actions = threshold ? [remove, changeThreshold] : [remove];
|
|
303
|
+
return actions;
|
|
304
|
+
}
|
|
305
|
+
case ESolanaInstructionType.changeThreshold: {
|
|
306
|
+
const newThreshold = instructions2.newThreshold;
|
|
307
|
+
const change = {
|
|
308
|
+
__kind: "ChangeThreshold",
|
|
309
|
+
newThreshold
|
|
310
|
+
};
|
|
311
|
+
const actions = [change];
|
|
312
|
+
return actions;
|
|
313
|
+
}
|
|
314
|
+
case ESolanaInstructionType.spl: {
|
|
315
|
+
throw new Error("SPL instructions are not yet supported.");
|
|
316
|
+
}
|
|
317
|
+
default:
|
|
318
|
+
throw new Error(`Unsupported method type: ${instructions2?.type}`);
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
// src/strategies/iframeServices/solana/utils/solToLamports.ts
|
|
323
|
+
var solToLamports = (amountString) => {
|
|
324
|
+
const amount = String(amountString);
|
|
325
|
+
const DECIMAL_REGEX = /^\d+(\.\d{1,9})?$/;
|
|
326
|
+
let numericValue;
|
|
327
|
+
try {
|
|
328
|
+
numericValue = parseFloat(amount);
|
|
329
|
+
} catch (e) {
|
|
330
|
+
throw new Error("Invalid number format for SOL amount.");
|
|
331
|
+
}
|
|
332
|
+
if (isNaN(numericValue) || numericValue < 0) {
|
|
333
|
+
throw new Error("Invalid or negative SOL amount provided.");
|
|
334
|
+
}
|
|
335
|
+
const fixedAmountString = numericValue.toFixed(9).replace(/\.?0+$/, "");
|
|
336
|
+
if (!DECIMAL_REGEX.test(fixedAmountString)) {
|
|
337
|
+
throw new Error(
|
|
338
|
+
"SOL amount must have up to 9 decimal places and contain only digits and a period."
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
const lamportsNumber = Math.floor(numericValue * 1e9);
|
|
342
|
+
if (lamportsNumber === 0 && numericValue > 0) {
|
|
343
|
+
throw new Error(
|
|
344
|
+
"Amount is too small to be represented in lamports (potential dust)."
|
|
345
|
+
);
|
|
346
|
+
}
|
|
347
|
+
return BigInt(lamportsNumber);
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// src/strategies/iframeServices/solana/utils/detectTokenProgram.ts
|
|
351
|
+
import { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token";
|
|
352
|
+
var detectTokenProgram = async (connection, mintPublicKey) => {
|
|
353
|
+
try {
|
|
354
|
+
const accountInfo = await connection.getAccountInfo(mintPublicKey);
|
|
355
|
+
if (!accountInfo) {
|
|
356
|
+
throw new Error("Token mint account not found");
|
|
357
|
+
}
|
|
358
|
+
if (accountInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) {
|
|
359
|
+
console.log("Detected Token-2022 (Token Extensions) program");
|
|
360
|
+
return TOKEN_2022_PROGRAM_ID;
|
|
361
|
+
}
|
|
362
|
+
console.log("Detected legacy Token program");
|
|
363
|
+
return TOKEN_PROGRAM_ID;
|
|
364
|
+
} catch (error) {
|
|
365
|
+
console.warn(
|
|
366
|
+
"Failed to detect token program, defaulting to TOKEN_PROGRAM_ID:",
|
|
367
|
+
error
|
|
368
|
+
);
|
|
369
|
+
return TOKEN_PROGRAM_ID;
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
// src/strategies/iframeServices/solana/createSolanaMultisigOrder.ts
|
|
374
|
+
var parseTokenAmount = (amount, decimals) => {
|
|
375
|
+
const [whole = "0", fraction = ""] = amount.split(".");
|
|
376
|
+
const fracPadded = (fraction + "0".repeat(decimals)).slice(0, decimals);
|
|
377
|
+
const combined = whole + (fracPadded || "0".repeat(decimals));
|
|
378
|
+
const normalized = combined.replace(/^0+(?=\d)/, "");
|
|
379
|
+
return normalized === "" ? 0n : BigInt(normalized);
|
|
380
|
+
};
|
|
381
|
+
var createSolanaMultisigOrder = async (props) => {
|
|
382
|
+
const {
|
|
383
|
+
deviceShare,
|
|
384
|
+
address,
|
|
385
|
+
accessToken,
|
|
386
|
+
multisigPda,
|
|
387
|
+
method,
|
|
388
|
+
instructions: instructions2,
|
|
389
|
+
orderId,
|
|
390
|
+
rpcUrl,
|
|
391
|
+
vaultAddress,
|
|
392
|
+
selectedToken
|
|
393
|
+
} = props;
|
|
394
|
+
let signer;
|
|
395
|
+
let updatedDeviceShare = null;
|
|
396
|
+
try {
|
|
397
|
+
const result = await reconstructAndVerifySolKey(
|
|
398
|
+
deviceShare,
|
|
399
|
+
address,
|
|
400
|
+
accessToken,
|
|
401
|
+
false
|
|
402
|
+
);
|
|
403
|
+
signer = result.signer;
|
|
404
|
+
updatedDeviceShare = result.newDeviceShare;
|
|
405
|
+
} catch (error) {
|
|
406
|
+
if (error.message !== "KEY_MISMATCH") {
|
|
407
|
+
throw error;
|
|
408
|
+
}
|
|
409
|
+
try {
|
|
410
|
+
const result = await reconstructAndVerifySolKey(
|
|
411
|
+
deviceShare,
|
|
412
|
+
address,
|
|
413
|
+
accessToken,
|
|
414
|
+
true
|
|
415
|
+
);
|
|
416
|
+
signer = result.signer;
|
|
417
|
+
updatedDeviceShare = result.newDeviceShare;
|
|
418
|
+
} catch (retryError) {
|
|
419
|
+
throw new Error(
|
|
420
|
+
"Wallet key verification failed, even after forcing a share update. The account may be corrupted."
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
const connection = new Connection(rpcUrl, "confirmed");
|
|
425
|
+
const multisigPkey = new PublicKey2(multisigPda);
|
|
426
|
+
const multisigInfo = await Squads2.accounts.Multisig.fromAccountAddress(
|
|
427
|
+
connection,
|
|
428
|
+
multisigPkey
|
|
429
|
+
);
|
|
430
|
+
const transactionIndex = BigInt(multisigInfo.transactionIndex.toString()) + 1n;
|
|
431
|
+
const tx = new Transaction();
|
|
432
|
+
const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;
|
|
433
|
+
if (method === ESolanaInstructionType.native) {
|
|
434
|
+
if (!instructions2[0].toPubkey || !instructions2[0].amount) {
|
|
435
|
+
throw new Error("Error: toPubkey or amount doesn't exist");
|
|
436
|
+
}
|
|
437
|
+
const lamports = solToLamports(String(instructions2[0].amount));
|
|
438
|
+
const instructionIx = SystemProgram.transfer({
|
|
439
|
+
fromPubkey: new PublicKey2(vaultAddress),
|
|
440
|
+
toPubkey: new PublicKey2(instructions2[0].toPubkey),
|
|
441
|
+
lamports
|
|
442
|
+
});
|
|
443
|
+
const transferMessage = new TransactionMessage({
|
|
444
|
+
payerKey: new PublicKey2(vaultAddress),
|
|
445
|
+
recentBlockhash,
|
|
446
|
+
instructions: [instructionIx]
|
|
447
|
+
});
|
|
448
|
+
const ix = Squads2.instructions.vaultTransactionCreate({
|
|
449
|
+
multisigPda: multisigPkey,
|
|
450
|
+
transactionIndex,
|
|
451
|
+
creator: signer.publicKey,
|
|
452
|
+
vaultIndex: 0,
|
|
453
|
+
ephemeralSigners: 0,
|
|
454
|
+
transactionMessage: transferMessage,
|
|
455
|
+
memo: orderId
|
|
456
|
+
});
|
|
457
|
+
tx.add(ix);
|
|
458
|
+
} else if (method === ESolanaInstructionType.spl) {
|
|
459
|
+
try {
|
|
460
|
+
const inst = instructions2[0];
|
|
461
|
+
if (!inst?.toPubkey || !inst?.amount)
|
|
462
|
+
throw new Error("SPL: missing toPubkey or amount");
|
|
463
|
+
if (!selectedToken?.address || typeof selectedToken.decimals !== "number")
|
|
464
|
+
throw new Error("SPL: selectedToken info missing (mint/decimals)");
|
|
465
|
+
const [vaultPda] = Squads2.getVaultPda({
|
|
466
|
+
multisigPda: multisigPkey,
|
|
467
|
+
index: 0
|
|
468
|
+
});
|
|
469
|
+
const mint = new PublicKey2(selectedToken.address);
|
|
470
|
+
const recipient = new PublicKey2(inst.toPubkey);
|
|
471
|
+
const tokenProgramId = await detectTokenProgram(connection, mint);
|
|
472
|
+
console.log(`\u{1F50D} Using token program: ${tokenProgramId.toBase58()}`);
|
|
473
|
+
const tokenAccounts = await connection.getTokenAccountsByOwner(vaultPda, {
|
|
474
|
+
mint,
|
|
475
|
+
programId: tokenProgramId
|
|
476
|
+
});
|
|
477
|
+
if (tokenAccounts.value.length === 0) {
|
|
478
|
+
throw new Error(
|
|
479
|
+
`SPL: vault has no token account for mint ${selectedToken.address}`
|
|
480
|
+
);
|
|
481
|
+
}
|
|
482
|
+
const fromAta = tokenAccounts.value[0].pubkey;
|
|
483
|
+
const toAta = await getAssociatedTokenAddress(
|
|
484
|
+
mint,
|
|
485
|
+
recipient,
|
|
486
|
+
true,
|
|
487
|
+
tokenProgramId,
|
|
488
|
+
ASSOCIATED_TOKEN_PROGRAM_ID
|
|
489
|
+
);
|
|
490
|
+
const instructionsList = [];
|
|
491
|
+
const toAtaInfo = await connection.getAccountInfo(toAta);
|
|
492
|
+
if (!toAtaInfo) {
|
|
493
|
+
instructionsList.push(
|
|
494
|
+
createAssociatedTokenAccountInstruction(
|
|
495
|
+
signer.publicKey,
|
|
496
|
+
toAta,
|
|
497
|
+
recipient,
|
|
498
|
+
mint,
|
|
499
|
+
tokenProgramId,
|
|
500
|
+
ASSOCIATED_TOKEN_PROGRAM_ID
|
|
501
|
+
)
|
|
502
|
+
);
|
|
503
|
+
}
|
|
504
|
+
const amount = parseTokenAmount(
|
|
505
|
+
String(inst.amount),
|
|
506
|
+
selectedToken.decimals
|
|
507
|
+
);
|
|
508
|
+
if (amount <= 0n) throw new Error("SPL: amount must be > 0");
|
|
509
|
+
instructionsList.push(
|
|
510
|
+
createTransferCheckedInstruction(
|
|
511
|
+
fromAta,
|
|
512
|
+
mint,
|
|
513
|
+
toAta,
|
|
514
|
+
vaultPda,
|
|
515
|
+
amount,
|
|
516
|
+
selectedToken.decimals,
|
|
517
|
+
[],
|
|
518
|
+
tokenProgramId
|
|
519
|
+
)
|
|
520
|
+
);
|
|
521
|
+
const transferMessage = new TransactionMessage({
|
|
522
|
+
payerKey: vaultPda,
|
|
523
|
+
recentBlockhash,
|
|
524
|
+
instructions: instructionsList
|
|
525
|
+
});
|
|
526
|
+
const ix = Squads2.instructions.vaultTransactionCreate({
|
|
527
|
+
multisigPda: multisigPkey,
|
|
528
|
+
transactionIndex,
|
|
529
|
+
creator: signer.publicKey,
|
|
530
|
+
vaultIndex: 0,
|
|
531
|
+
ephemeralSigners: 0,
|
|
532
|
+
transactionMessage: transferMessage,
|
|
533
|
+
memo: orderId
|
|
534
|
+
});
|
|
535
|
+
tx.add(ix);
|
|
536
|
+
} catch (err) {
|
|
537
|
+
console.error("createSolanaMultisigOrder (SPL) failed:", err);
|
|
538
|
+
throw err;
|
|
539
|
+
}
|
|
540
|
+
} else {
|
|
541
|
+
const actions = props.instructions.map((inst) => prepareActions({ ...props, instructions: inst })).flat();
|
|
542
|
+
const ix = Squads2.instructions.configTransactionCreate({
|
|
543
|
+
multisigPda: multisigPkey,
|
|
544
|
+
creator: signer.publicKey,
|
|
545
|
+
transactionIndex,
|
|
546
|
+
actions,
|
|
547
|
+
memo: orderId,
|
|
548
|
+
rentPayer: signer.publicKey
|
|
549
|
+
});
|
|
550
|
+
tx.add(ix);
|
|
551
|
+
}
|
|
552
|
+
const proposalIx = Squads2.instructions.proposalCreate({
|
|
553
|
+
creator: signer.publicKey,
|
|
554
|
+
multisigPda: multisigPkey,
|
|
555
|
+
transactionIndex
|
|
556
|
+
});
|
|
557
|
+
tx.add(proposalIx);
|
|
558
|
+
tx.feePayer = signer.publicKey;
|
|
559
|
+
tx.recentBlockhash = recentBlockhash;
|
|
560
|
+
tx.partialSign(signer);
|
|
561
|
+
const vaultTransaction = tx.serialize().toString("base64");
|
|
562
|
+
console.log("\u{1F680} ~ vaultTransaction:", vaultTransaction);
|
|
563
|
+
return {
|
|
564
|
+
tx: vaultTransaction,
|
|
565
|
+
updatedDeviceShare
|
|
566
|
+
};
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
export {
|
|
570
|
+
EChainType2 as EChainType,
|
|
571
|
+
ESolanaInstructionType,
|
|
572
|
+
TransactionExecutionType,
|
|
573
|
+
TransactionEstimatingType,
|
|
574
|
+
reconstructAndVerifySolKey,
|
|
575
|
+
solToLamports,
|
|
576
|
+
createSolanaMultisigOrder
|
|
577
|
+
};
|
|
578
|
+
//# sourceMappingURL=chunk-XYPJCLZQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/strategies/iframeServices/solana/createSolanaMultisigOrder.ts","../src/strategies/types.ts","../src/strategies/iframeServices/solana/utils/reconstructAndVerifySolKey.ts","../src/strategies/iframeServices/types.ts","../src/strategies/iframeServices/utils/crypto.ts","../src/strategies/iframeServices/api/wallet.ts","../src/strategies/iframeServices/utils/getReconstructionShares.ts","../src/strategies/iframeServices/solana/utils/prepareActions.ts","../src/strategies/iframeServices/solana/utils/solToLamports.ts","../src/strategies/iframeServices/solana/utils/detectTokenProgram.ts"],"sourcesContent":["import {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionMessage,\n} from \"@solana/web3.js\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddress,\n createTransferCheckedInstruction,\n createAssociatedTokenAccountInstruction,\n} from \"@solana/spl-token\";\nimport {\n ESolanaInstructionType,\n type IframeTxResponse,\n type SolOrderData,\n} from \"../../types\";\nimport * as Squads from \"@sqds/multisig\";\nimport { reconstructAndVerifySolKey } from \"./utils/reconstructAndVerifySolKey\";\nimport { prepareActions } from \"./utils/prepareActions\";\nimport { solToLamports } from \"./utils/solToLamports\";\nimport { detectTokenProgram } from \"./utils/detectTokenProgram\";\n\nconst parseTokenAmount = (amount: string, decimals: number): bigint => {\n const [whole = \"0\", fraction = \"\"] = amount.split(\".\");\n const fracPadded = (fraction + \"0\".repeat(decimals)).slice(0, decimals);\n const combined = whole + (fracPadded || \"0\".repeat(decimals));\n const normalized = combined.replace(/^0+(?=\\d)/, \"\");\n return normalized === \"\" ? 0n : BigInt(normalized);\n};\n\nexport const createSolanaMultisigOrder = async (\n props: SolOrderData<any[]>\n): Promise<IframeTxResponse> => {\n const {\n deviceShare,\n address,\n accessToken,\n multisigPda,\n method,\n instructions,\n orderId,\n rpcUrl,\n vaultAddress,\n selectedToken,\n } = props;\n\n let signer: Keypair;\n let updatedDeviceShare: string | null = null;\n\n try {\n const result = await reconstructAndVerifySolKey(\n deviceShare,\n address,\n accessToken,\n false\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (error: any) {\n if (error.message !== \"KEY_MISMATCH\") {\n throw error;\n }\n\n try {\n const result = await reconstructAndVerifySolKey(\n deviceShare,\n address,\n accessToken,\n true\n );\n signer = result.signer;\n updatedDeviceShare = result.newDeviceShare;\n } catch (retryError: any) {\n throw new Error(\n \"Wallet key verification failed, even after forcing a share update. The account may be corrupted.\"\n );\n }\n }\n\n const connection = new Connection(rpcUrl, \"confirmed\");\n\n const multisigPkey = new PublicKey(multisigPda);\n const multisigInfo = await Squads.accounts.Multisig.fromAccountAddress(\n connection,\n multisigPkey\n );\n const transactionIndex =\n BigInt(multisigInfo.transactionIndex.toString()) + 1n;\n\n const tx = new Transaction();\n const recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n\n if (method === ESolanaInstructionType.native) {\n if (!instructions[0].toPubkey || !instructions[0].amount) {\n throw new Error(\"Error: toPubkey or amount doesn't exist\");\n }\n const lamports = solToLamports(String(instructions[0].amount));\n\n const instructionIx = SystemProgram.transfer({\n fromPubkey: new PublicKey(vaultAddress),\n toPubkey: new PublicKey(instructions[0].toPubkey),\n lamports,\n });\n\n const transferMessage = new TransactionMessage({\n payerKey: new PublicKey(vaultAddress),\n recentBlockhash,\n instructions: [instructionIx],\n });\n\n const ix = Squads.instructions.vaultTransactionCreate({\n multisigPda: multisigPkey,\n transactionIndex: transactionIndex,\n creator: signer.publicKey,\n vaultIndex: 0,\n ephemeralSigners: 0,\n transactionMessage: transferMessage,\n memo: orderId,\n });\n\n tx.add(ix);\n } else if (method === ESolanaInstructionType.spl) {\n try {\n const inst = instructions[0];\n if (!inst?.toPubkey || !inst?.amount)\n throw new Error(\"SPL: missing toPubkey or amount\");\n if (!selectedToken?.address || typeof selectedToken.decimals !== \"number\")\n throw new Error(\"SPL: selectedToken info missing (mint/decimals)\");\n\n const [vaultPda] = Squads.getVaultPda({\n multisigPda: multisigPkey,\n index: 0,\n });\n\n const mint = new PublicKey(selectedToken.address);\n const recipient = new PublicKey(inst.toPubkey);\n\n const tokenProgramId = await detectTokenProgram(connection, mint);\n console.log(`🔍 Using token program: ${tokenProgramId.toBase58()}`);\n\n const tokenAccounts = await connection.getTokenAccountsByOwner(vaultPda, {\n mint,\n programId: tokenProgramId,\n });\n if (tokenAccounts.value.length === 0) {\n throw new Error(\n `SPL: vault has no token account for mint ${selectedToken.address}`\n );\n }\n const fromAta = tokenAccounts.value[0].pubkey;\n\n const toAta = await getAssociatedTokenAddress(\n mint,\n recipient,\n true,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n const instructionsList = [];\n const toAtaInfo = await connection.getAccountInfo(toAta);\n if (!toAtaInfo) {\n instructionsList.push(\n createAssociatedTokenAccountInstruction(\n signer.publicKey,\n toAta,\n recipient,\n mint,\n tokenProgramId,\n ASSOCIATED_TOKEN_PROGRAM_ID\n )\n );\n }\n\n const amount = parseTokenAmount(\n String(inst.amount),\n selectedToken.decimals\n );\n if (amount <= 0n) throw new Error(\"SPL: amount must be > 0\");\n\n instructionsList.push(\n createTransferCheckedInstruction(\n fromAta,\n mint,\n toAta,\n vaultPda,\n amount,\n selectedToken.decimals,\n [],\n tokenProgramId\n )\n );\n\n const transferMessage = new TransactionMessage({\n payerKey: vaultPda,\n recentBlockhash,\n instructions: instructionsList,\n });\n\n const ix = Squads.instructions.vaultTransactionCreate({\n multisigPda: multisigPkey,\n transactionIndex,\n creator: signer.publicKey,\n vaultIndex: 0,\n ephemeralSigners: 0,\n transactionMessage: transferMessage,\n memo: orderId,\n });\n\n tx.add(ix);\n } catch (err) {\n console.error(\"createSolanaMultisigOrder (SPL) failed:\", err);\n throw err;\n }\n } else {\n const actions = props.instructions\n .map((inst) => prepareActions({ ...props, instructions: inst }))\n .flat();\n\n const ix = Squads.instructions.configTransactionCreate({\n multisigPda: multisigPkey,\n creator: signer.publicKey,\n transactionIndex: transactionIndex,\n actions: actions as any,\n memo: orderId,\n rentPayer: signer.publicKey,\n });\n tx.add(ix);\n }\n\n const proposalIx = Squads.instructions.proposalCreate({\n creator: signer.publicKey,\n multisigPda: multisigPkey,\n transactionIndex,\n });\n tx.add(proposalIx);\n tx.feePayer = signer.publicKey;\n tx.recentBlockhash = recentBlockhash;\n tx.partialSign(signer);\n\n const vaultTransaction = tx.serialize().toString(\"base64\");\n console.log(\"🚀 ~ vaultTransaction:\", vaultTransaction);\n\n return {\n tx: vaultTransaction,\n updatedDeviceShare,\n };\n};\n","import type { TWallet, Order, EstimatedFee, OrderInstruction, TokenMultisignBalance, MultisigsItem } from '../core/types';\n\nexport type ChainType = 'evm' | 'solana' | 'tron' | 'btc';\n\nexport const EChainType = {\n EVM: 'EVM',\n SOL: 'SOL',\n TRON: 'TRON',\n BTC: 'BTC',\n BTC_T3: 'BTC_T3',\n} as const;\n\nexport type EChainTypeValue = (typeof EChainType)[keyof typeof EChainType];\n\nexport type ESolanaInstructionType = 'native' | 'spl' | 'addOwner' | 'removeOwner' | 'changeThreshold';\nexport const ESolanaInstructionType = {\n native: 'native',\n spl: 'spl',\n addOwner: 'addOwner',\n removeOwner: 'removeOwner',\n changeThreshold: 'changeThreshold',\n} as const;\n\nexport type EvmMethodType = 'execTransaction' | 'addOwnerWithThreshold' | 'removeOwner' | 'changeThreshold' | 'multiSend';\nexport type ETronOrderType = 'native' | 'trc' | 'addOwner' | 'removeOwner' | 'changeThreshold';\nexport type OrderMethodType = ESolanaInstructionType | EvmMethodType | ETronOrderType;\n\nexport interface SolOrderData<T = any> {\n deviceShare: string;\n address: string;\n accessToken: string;\n multisigPda: string;\n method: OrderMethodType;\n instructions: T;\n orderId: string;\n rpcUrl: string;\n vaultAddress: string;\n selectedToken?: any;\n threshold?: number;\n action?: string;\n [key: string]: any;\n}\n\nexport interface OrderInstructions {\n type?: OrderMethodType;\n toPubkey?: string;\n amount?: string;\n newThreshold?: number;\n newOwner?: string;\n removeOwner?: string;\n tokenAddress?: string;\n to?: string;\n value?: string;\n data?: string;\n owners?: string[];\n}\n\nexport interface SendData {\n to: string;\n amount: string | number;\n estimatedFee?: EstimatedFee;\n tokenAddress?: string;\n isNativeToken?: boolean;\n decimals?: number;\n}\n\nexport interface ExecOrderData {\n order: Order;\n multisigAddress: string;\n multisigId: string;\n multisigChainId: string;\n estimatedFee?: EstimatedFee;\n}\n\nexport interface ActivateMultisigData {\n multisig: MultisigsItem;\n gasLimit?: string;\n gasPrice?: string;\n}\n\nexport const TransactionExecutionType = {\n ExecOrder: 'execOrder',\n Send: 'send',\n ActivateMultisig: 'activateMultisig',\n} as const;\n\nexport type TransactionExecutionTypeValue = typeof TransactionExecutionType[keyof typeof TransactionExecutionType];\n\nexport const TransactionEstimatingType = {\n ExecOrder: 'execOrder',\n Send: 'send',\n ActivateMultisig: 'activateMultisig',\n SignOrder: 'SignOrder',\n CreateOrder: 'CreateOrder',\n ChangeMultisig: 'ChangeMultisig',\n} as const;\n\nexport type TransactionEstimatingTypeValue = typeof TransactionEstimatingType[keyof typeof TransactionEstimatingType];\n\nexport type ExecuteTransactionInput =\n | { type: typeof TransactionExecutionType.Send; data: SendData }\n | { type: typeof TransactionExecutionType.ExecOrder; data: ExecOrderData }\n | { type: typeof TransactionExecutionType.ActivateMultisig; data: ActivateMultisigData };\n\nexport interface ActivateMultisigEstimateData {\n multisig: MultisigsItem;\n}\n\nexport interface ExecOrderEstimateData {\n order: Order;\n multisigAddress: string;\n}\n\nexport interface ChangeMultisigEstimateData {\n multisig: MultisigsItem;\n newOwners: string[];\n newThreshold: number;\n}\n\nexport interface SignOrderData {\n order: Order;\n}\n\nexport interface CreateOrderData {\n to: string;\n amount: string;\n tokenAddress?: string | null;\n method?: ESolanaInstructionType | ETronOrderType;\n multisig: MultisigsItem;\n tokenDecimals: number;\n}\n\nexport type EstimateTransactionInput =\n | { type: typeof TransactionEstimatingType.ActivateMultisig; data: ActivateMultisigEstimateData }\n | { type: typeof TransactionEstimatingType.ExecOrder; data: ExecOrderEstimateData }\n | { type: typeof TransactionEstimatingType.Send; data: SendData }\n | { type: typeof TransactionEstimatingType.SignOrder; data: SignOrderData }\n | { type: typeof TransactionEstimatingType.CreateOrder; data: CreateOrderData }\n | { type: typeof TransactionEstimatingType.ChangeMultisig; data: ChangeMultisigEstimateData };\n\nexport interface SignOrderParams {\n orderId: string;\n multisigId: string;\n wallet: TWallet;\n deviceShare: string;\n networkType: string;\n order?: Order;\n}\n\nexport interface CreateOrderParams {\n multisigId: string;\n wallet: TWallet;\n threshold?: number;\n method: OrderMethodType;\n instructions: OrderInstructions[];\n selectedToken?: TokenMultisignBalance | null;\n deviceShare: string;\n networkType: string;\n orderToActivate?: any;\n}\n\nexport interface RejectOrderParams {\n multisigId?: string;\n orderId: string;\n wallet: TWallet;\n deviceShare: string;\n networkType: string;\n}\n\nexport interface ExecuteTransactionParams {\n input: ExecuteTransactionInput;\n actualWallet?: TWallet;\n networkType: string;\n chainId: string | number;\n}\n\nexport interface EstimateFeeParams {\n input: EstimateTransactionInput;\n actualWallet: TWallet;\n chainId: string | number;\n}\n\nexport interface IframeTxResponse {\n tx: string;\n updatedDeviceShare: string | null;\n version?: string;\n}\n\n/**\n * Chain Strategy Interface\n * Defines the contract that all chain-specific implementations must follow.\n */\nexport interface ChainStrategy<TProvider = unknown> {\n getProvider?: (networkType?: string | number) => TProvider;\n getBalance?: (address: string, provider: TProvider) => Promise<string>;\n getTransactionHash?: (unsignedTx: string) => string | Promise<string>;\n getFeeData?: (provider: TProvider) => Promise<unknown>;\n getNonce?: (provider: TProvider, address: string) => Promise<number>;\n simulateTransaction?: (provider: TProvider, tx: unknown) => Promise<unknown>;\n getSignedTransaction?: (serializedTx: string) => Promise<unknown>;\n broadcastTransaction?: (provider: TProvider, rawTx: string) => Promise<unknown>;\n\n signOrder: (params: SignOrderParams) => Promise<IframeTxResponse>;\n createOrder: (params: CreateOrderParams) => Promise<{ order: Order; proposalHash: string }>;\n rejectOrder: (params: RejectOrderParams) => Promise<{ rejectionHash: string; order: unknown }>;\n\n executeTransaction: (params: ExecuteTransactionParams) => Promise<unknown>;\n estimateFee?: (params: EstimateFeeParams) => Promise<EstimatedFee>;\n\n encodeExecTransaction?: (to: string, value: string, data: string, operation: number, signature: string) => string;\n getOwners?: (multisigAddress: string, provider: TProvider) => Promise<string[]>;\n encodeRemoveOwner?: (owners: string[], ownerToRemove: string, newThreshold: number) => string;\n encodeChangeThreshold?: (newThreshold: number) => string;\n encodeAddOwnerWithThreshold?: (newOwner: string, threshold: number) => string;\n}\n","import { Keypair } from \"@solana/web3.js\";\nimport { EChainType } from \"../../types\";\nimport { combineShares } from \"../../utils/crypto\";\nimport { getReconstructionShares } from \"../../utils/getReconstructionShares\";\n\nexport const reconstructAndVerifySolKey = async (\n deviceShare: string,\n address: string,\n accessToken: string,\n forceUpdate: boolean\n): Promise<{ signer: Keypair; newDeviceShare: string | null }> => {\n const { mainShare, additionalShare, newDeviceShare } =\n await getReconstructionShares(\n deviceShare,\n address,\n accessToken,\n forceUpdate,\n EChainType.SOL\n );\n const reconstructed = await combineShares([mainShare, additionalShare]);\n\n let signer: Keypair;\n\n try {\n signer = Keypair.fromSecretKey(reconstructed);\n } catch (err: any) {\n console.error(\"Keypair reconstruction failed:\", err.message);\n\n throw new Error(\"KEY_MISMATCH\");\n }\n\n if (signer.publicKey.toBase58() !== address) {\n throw new Error(\"KEY_MISMATCH\");\n }\n\n return { signer, newDeviceShare };\n};\n","import { EChainType as EChainTypeEnum, ESolanaInstructionType as ESolanaInstructionTypeEnum } from '../../core/types';\nimport { TRON_FULL_HOST as TRON_FULL_HOST_CONFIG } from '../../core/config';\nexport type { ChainType as EChainTypeValue, ChainIdValue, NetworkMode } from '../../core/types';\n\nexport const EChainType = EChainTypeEnum;\nexport type EChainType = EChainTypeEnum;\n\nexport const ESolanaInstructionType = ESolanaInstructionTypeEnum;\nexport type ESolanaInstructionType = ESolanaInstructionTypeEnum;\n\nexport const TRON_FULL_HOST = TRON_FULL_HOST_CONFIG;\nexport const IS_MAINNET = process.env.IS_MAINNET === \"true\" || false;\n\nexport const BTC_API_TESTNET_MEMPOOL = \"https://mempool.space/testnet/api\";\n\nexport interface IframeTxResponse {\n tx: string;\n updatedDeviceShare: string | null;\n}\n\nexport interface TokenMultisignBalance {\n name: string;\n symbol: string;\n balanceWei: string;\n balance: string;\n decimals: number;\n address: string;\n logoURL: string;\n nativeTokenSymbol: string;\n nativeTokenName: string;\n amountNum?: number;\n priceUsd?: number;\n priceChange24h?: number;\n valueUsd?: number;\n}\n\nexport interface SolOrderData<T> {\n deviceShare: string;\n address: string;\n accessToken: string;\n multisigPda: string;\n method: string;\n instructions: T;\n orderId: string;\n rpcUrl: string;\n threshold?: number;\n vaultAddress: string;\n selectedToken: TokenMultisignBalance;\n}\n\nexport interface BtcOrderData {\n orderId: string;\n multisigId: string;\n data: string;\n walletInitiator: string;\n to: string;\n value: string;\n feeSats: string;\n}\n\nexport interface TronOrderData {\n transaction: any;\n orderId: string;\n multisigId: string;\n isUpdateMultisigParams?: boolean;\n}\n\nexport interface MultisigParams {\n multisigPda: string;\n transactionIndex: string;\n orderId: string;\n rpcUrl: string;\n index?: string;\n}\n","import { ethers } from \"ethers\";\nimport { combine } from \"shamir-secret-sharing\";\nimport { Keypair } from \"@solana/web3.js\";\nimport * as ecc from \"tiny-secp256k1\";\nimport { Buffer } from 'buffer';\nimport { ECPairFactory } from \"ecpair\";\nimport * as bitcoin from \"bitcoinjs-lib\";\n\nconst ECPair = ECPairFactory(ecc);\n\nconst IS_MAINNET = process.env.IS_MAINNET === \"true\" || false;\n\nexport const combineShares = async (shares: string[]): Promise<Uint8Array> => {\n const shareBuffers = shares.map((share) => ethers.getBytes(share));\n const reconstructed = await combine(shareBuffers);\n return reconstructed;\n};\n\nexport const combineSolanaSharesToPrivateKey = (\n raw: Uint8Array\n): Uint8Array => {\n const key = Keypair.fromSecretKey(raw);\n return key.secretKey;\n};\n\nexport const combineEvmSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const reconstructedPK = \"0x\" + Buffer.from(raw).toString(\"hex\");\n return reconstructedPK;\n};\n\nexport const combineBtcSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const keyPair = ECPair.fromPrivateKey(Buffer.from(raw), {\n network: IS_MAINNET ? bitcoin.networks.bitcoin : bitcoin.networks.testnet,\n });\n return keyPair.toWIF();\n};\n\nexport const combineTronSharesToPrivateKey = async (\n raw: Uint8Array\n): Promise<string> => {\n const privateKey = Buffer.from(raw).toString(\"hex\");\n return privateKey;\n};\n","import { ethers } from 'ethers';\nimport { combineShares as shamirCombine } from '../../../crypto/shamir';\nimport { hexToBytes, bytesToHex, encryptRsaOaep } from '../../../crypto/util';\nimport type { EChainTypeValue } from '../types';\n\n\nexport const fetchServerShare = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(\n `${apiUrl}/sdk/wallets/share/c/${chainType}/${walletAddress}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n },\n credentials: \"include\",\n }\n );\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch server share\");\n }\n\n const data = await res.json();\n return data.share;\n};\n\nexport const fetchRecoveryShare = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(\n `${apiUrl}/sdk/wallets/share/s/${chainType}/${walletAddress}`,\n {\n headers: {\n \"X-API-KEY\": apiKey,\n },\n credentials: \"include\",\n }\n );\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch recovery share\");\n }\n\n const data = await res.json();\n return data.share;\n};\n\nexport const fetchShares = async (\n apiKey: string,\n walletAddress: string,\n chainType: EChainTypeValue,\n apiUrl: string\n): Promise<{\n recovery: string;\n server: string;\n}> => {\n const [recovery, server] = await Promise.all([\n fetchRecoveryShare(apiKey, walletAddress, chainType, apiUrl),\n fetchServerShare(apiKey, walletAddress, chainType, apiUrl),\n ]);\n return {\n recovery,\n server,\n };\n};\n\nexport const fetchMultisigServerShare = async (\n multisigId: string,\n walletAddress: string,\n apiKey: string,\n apiUrl: string\n): Promise<string> => {\n const res = await fetch(`${apiUrl}/sdk/multisig/share/tron`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n body: JSON.stringify({\n multisigId,\n walletAddress,\n }),\n });\n\n if (!res.ok) {\n throw new Error(\"Failed to fetch multisig server share\");\n }\n\n const data = await res.json();\n if (!data?.share) {\n throw new Error(\"Failed to fetch multisig server share\");\n }\n\n return data.share;\n};\n\nexport interface SplitPrivateKey {\n deviceShare: string;\n serverShare: string;\n recoveryShare: string;\n}\n\nexport const SHAMIR_THRESHOLD_PERSONAL = 2;\nexport const SHAMIR_SHARES_NUM = 3;\n\nexport const combineSharesFromHex = async (shares: string[]): Promise<Uint8Array> => {\n const { combine } = await import('shamir-secret-sharing');\n const shareBuffers = shares.map((share) => ethers.getBytes(share));\n const reconstructed = await combine(shareBuffers);\n return reconstructed;\n};\n\nexport const splitPrivateKey = async (\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> => {\n const { split } = await import('shamir-secret-sharing');\n const shares = await split(\n privateKeyBytes,\n SHAMIR_SHARES_NUM,\n SHAMIR_THRESHOLD_PERSONAL\n );\n const { ethers } = await import('ethers');\n\n const deviceShare = ethers.hexlify(shares[0]);\n const serverShare = ethers.hexlify(shares[1]);\n const recoveryShare = ethers.hexlify(shares[2]);\n return {\n deviceShare,\n serverShare,\n recoveryShare,\n };\n};\n\nexport const createShares = async (\n privateKeyBytes: Uint8Array\n): Promise<SplitPrivateKey> => {\n if (!privateKeyBytes) {\n throw new Error(\"Cannot create shares\");\n }\n const shares = await splitPrivateKey(privateKeyBytes);\n return shares;\n};\n\nexport const updateShares = async (\n walletAddress: string,\n serverShare: string,\n recoveryShare: string,\n apiKey: string,\n apiUrl: string\n): Promise<{\n device: string;\n server: string;\n recovery: string;\n}> => {\n try {\n const reconstructed = await combineSharesFromHex([recoveryShare, serverShare]);\n const shares = await createShares(reconstructed);\n const pubkeyResponse = await fetch(`${apiUrl}/sdk/wallets/pubkey`, {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n });\n\n if (!pubkeyResponse.ok) {\n await pubkeyResponse.text().catch(() => \"N/A\");\n console.error(\n `Critical Failure [${walletAddress}]: STEP 2 (Get Pubkey). Status: ${pubkeyResponse.status}.`\n );\n throw new Error(\n `Failed to fetch public key. Status: ${pubkeyResponse.status}`\n );\n }\n\n const { pubkey } = await pubkeyResponse.json();\n const encryptedRecoveryShare = await encryptRsaOaep(\n pubkey,\n shares.recoveryShare\n );\n const updateResponse = await fetch(`${apiUrl}/sdk/wallets/update`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": apiKey,\n },\n body: JSON.stringify({\n walletAddress,\n serverShare: shares.serverShare,\n encryptedRecoveryShare,\n }),\n });\n\n if (!updateResponse.ok) {\n await updateResponse.text().catch(() => \"N/A\");\n console.error(\n `Critical Failure [${walletAddress}]: STEP 4 (Update Shares). Status: ${updateResponse.status}.`\n );\n throw new Error(\n `Failed to update shares on server. Status: ${updateResponse.status}`\n );\n }\n\n return {\n recovery: \"\",\n server: shares.serverShare,\n device: shares.deviceShare,\n };\n } catch (err) {\n console.error(`UpdateShares Critical Failure for ${walletAddress}:`, err);\n throw err;\n }\n};\n","import { fetchServerShare, fetchShares, updateShares } from \"../api/wallet\";\nimport type { EChainTypeValue } from \"../types\";\n\nconst API_URL = process.env.AFRIDAX_API_URL || \"https://afridax-backend-production.up.railway.app\";\n\nexport const getReconstructionShares = async (\n deviceShare: string,\n walletAddress: string,\n apiKey: string,\n forceUpdate: boolean,\n chainType: EChainTypeValue\n): Promise<{\n mainShare: string;\n additionalShare: string;\n newDeviceShare: string | null;\n}> => {\n let mainShare: string | null;\n let additionalShare: string | null;\n let newDeviceShare: string | null = null;\n debugger;\n\n if (forceUpdate || !deviceShare || deviceShare === \"-\") {\n const shares = await fetchShares(apiKey, walletAddress, chainType, API_URL);\n const { device, server } = await updateShares(\n walletAddress,\n shares.server,\n shares.recovery,\n apiKey,\n API_URL\n );\n mainShare = device;\n additionalShare = server;\n newDeviceShare = device;\n } else {\n const serverShare = await fetchServerShare(apiKey, walletAddress, chainType, API_URL);\n mainShare = deviceShare;\n additionalShare = serverShare;\n }\n\n if (!mainShare || !additionalShare) {\n throw new Error(\"Failed to retrieve key shares.\");\n }\n\n return { mainShare, additionalShare, newDeviceShare };\n};\n","import { PublicKey } from \"@solana/web3.js\";\nimport { ESolanaInstructionType, type SolOrderData } from \"../../../types\";\nimport * as Squads from \"@sqds/multisig\";\n\nexport const prepareActions = (props: SolOrderData<any>): any[] => {\n const { instructions, threshold } = props;\n\n switch (instructions.type) {\n case ESolanaInstructionType.addOwner: {\n const newMember = instructions.newOwner;\n if (!newMember) {\n throw new Error(\"Error: newMember doesn't exist\");\n }\n const add = {\n __kind: \"AddMember\",\n newMember: {\n key: new PublicKey(newMember),\n permissions: Squads.types.Permissions.all(),\n },\n };\n const changeThreshold = {\n __kind: \"ChangeThreshold\",\n newThreshold: threshold,\n };\n const actions = threshold ? [add, changeThreshold] : [add];\n return actions;\n }\n\n case ESolanaInstructionType.removeOwner: {\n const oldMember = instructions.removeOwner;\n if (!oldMember) {\n throw new Error(\"Error: oldMember doesn't exist\");\n }\n const remove = {\n __kind: \"RemoveMember\",\n oldMember: new PublicKey(oldMember),\n };\n const changeThreshold = {\n __kind: \"ChangeThreshold\",\n newThreshold: threshold,\n };\n const actions = threshold ? [remove, changeThreshold] : [remove];\n return actions;\n }\n\n case ESolanaInstructionType.changeThreshold: {\n const newThreshold = instructions.newThreshold;\n const change = {\n __kind: \"ChangeThreshold\",\n newThreshold,\n };\n const actions = [change];\n return actions;\n }\n case ESolanaInstructionType.spl: {\n throw new Error(\"SPL instructions are not yet supported.\");\n }\n default:\n throw new Error(`Unsupported method type: ${instructions?.type}`);\n }\n};\n","export const solToLamports = (amountString: string | number): bigint => {\n const amount = String(amountString);\n const DECIMAL_REGEX = /^\\d+(\\.\\d{1,9})?$/;\n\n let numericValue: number;\n try {\n numericValue = parseFloat(amount);\n } catch (e) {\n throw new Error(\"Invalid number format for SOL amount.\");\n }\n\n if (isNaN(numericValue) || numericValue < 0) {\n throw new Error(\"Invalid or negative SOL amount provided.\");\n }\n\n const fixedAmountString = numericValue.toFixed(9).replace(/\\.?0+$/, \"\");\n\n if (!DECIMAL_REGEX.test(fixedAmountString)) {\n throw new Error(\n \"SOL amount must have up to 9 decimal places and contain only digits and a period.\"\n );\n }\n\n const lamportsNumber = Math.floor(numericValue * 1_000_000_000);\n\n if (lamportsNumber === 0 && numericValue > 0) {\n throw new Error(\n \"Amount is too small to be represented in lamports (potential dust).\"\n );\n }\n\n return BigInt(lamportsNumber);\n};\n","import type { Connection, PublicKey } from \"@solana/web3.js\";\nimport { TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\n\nexport const detectTokenProgram = async (\n connection: Connection,\n mintPublicKey: PublicKey\n): Promise<PublicKey> => {\n try {\n const accountInfo = await connection.getAccountInfo(mintPublicKey);\n\n if (!accountInfo) {\n throw new Error(\"Token mint account not found\");\n }\n\n if (accountInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) {\n console.log(\"Detected Token-2022 (Token Extensions) program\");\n return TOKEN_2022_PROGRAM_ID;\n }\n\n console.log(\"Detected legacy Token program\");\n return TOKEN_PROGRAM_ID;\n } catch (error) {\n console.warn(\n \"Failed to detect token program, defaulting to TOKEN_PROGRAM_ID:\",\n error\n );\n return TOKEN_PROGRAM_ID;\n }\n};\n"],"mappings":"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","names":["PublicKey","EChainType","Squads","Keypair","EChainType","IS_MAINNET","ethers","combine","ethers","EChainType","Keypair","instructions","instructions","PublicKey"]}
|