multisigns-sdk 1.0.0 → 1.0.2
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-XYPJCLZQ.js → chunk-HJV4STV4.js} +1 -2
- package/dist/{chunk-XYPJCLZQ.js.map → chunk-HJV4STV4.js.map} +1 -1
- package/dist/{createSolanaMultisigOrder-ABBIJ4ZX.js → createSolanaMultisigOrder-JUSIAM5U.js} +2 -2
- package/dist/index.cjs +13 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +15 -15
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- /package/dist/{createSolanaMultisigOrder-ABBIJ4ZX.js.map → createSolanaMultisigOrder-JUSIAM5U.js.map} +0 -0
|
@@ -214,7 +214,6 @@ var getReconstructionShares = async (deviceShare, walletAddress, apiKey, forceUp
|
|
|
214
214
|
let mainShare;
|
|
215
215
|
let additionalShare;
|
|
216
216
|
let newDeviceShare = null;
|
|
217
|
-
debugger;
|
|
218
217
|
if (forceUpdate || !deviceShare || deviceShare === "-") {
|
|
219
218
|
const shares = await fetchShares(apiKey, walletAddress, chainType, API_URL);
|
|
220
219
|
const { device, server } = await updateShares(
|
|
@@ -575,4 +574,4 @@ export {
|
|
|
575
574
|
solToLamports,
|
|
576
575
|
createSolanaMultisigOrder
|
|
577
576
|
};
|
|
578
|
-
//# sourceMappingURL=chunk-
|
|
577
|
+
//# sourceMappingURL=chunk-HJV4STV4.js.map
|
|
@@ -1 +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"]}
|
|
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\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"]}
|
package/dist/{createSolanaMultisigOrder-ABBIJ4ZX.js → createSolanaMultisigOrder-JUSIAM5U.js}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createSolanaMultisigOrder
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HJV4STV4.js";
|
|
4
4
|
import "./chunk-DRU5TCIR.js";
|
|
5
5
|
import "./chunk-KXIOGAV2.js";
|
|
6
6
|
import "./chunk-L45R2ICF.js";
|
|
@@ -8,4 +8,4 @@ import "./chunk-DGUM43GV.js";
|
|
|
8
8
|
export {
|
|
9
9
|
createSolanaMultisigOrder
|
|
10
10
|
};
|
|
11
|
-
//# sourceMappingURL=createSolanaMultisigOrder-
|
|
11
|
+
//# sourceMappingURL=createSolanaMultisigOrder-JUSIAM5U.js.map
|
package/dist/index.cjs
CHANGED
|
@@ -1554,7 +1554,6 @@ var init_getReconstructionShares = __esm({
|
|
|
1554
1554
|
let mainShare;
|
|
1555
1555
|
let additionalShare;
|
|
1556
1556
|
let newDeviceShare = null;
|
|
1557
|
-
debugger;
|
|
1558
1557
|
if (forceUpdate || !deviceShare || deviceShare === "-") {
|
|
1559
1558
|
const shares = await fetchShares2(apiKey, walletAddress, chainType, API_URL);
|
|
1560
1559
|
const { device, server } = await updateShares2(
|
|
@@ -2923,7 +2922,7 @@ var EvmStrategy = class {
|
|
|
2923
2922
|
}
|
|
2924
2923
|
async createOrder(params) {
|
|
2925
2924
|
const { multisigId, wallet, method, instructions: instructions4 } = params;
|
|
2926
|
-
const response = await this.apiClient.post("/order/create/evm", {
|
|
2925
|
+
const response = await this.apiClient.post("/sdk/order/create/evm", {
|
|
2927
2926
|
multisigId,
|
|
2928
2927
|
walletAddress: wallet.address,
|
|
2929
2928
|
method,
|
|
@@ -2939,7 +2938,7 @@ var EvmStrategy = class {
|
|
|
2939
2938
|
if (!multisigId) {
|
|
2940
2939
|
throw new Error("Vault id missing");
|
|
2941
2940
|
}
|
|
2942
|
-
const response = await this.apiClient.post("/order/reject/evm", {
|
|
2941
|
+
const response = await this.apiClient.post("/sdk/order/reject/evm", {
|
|
2943
2942
|
orderId,
|
|
2944
2943
|
multisigId,
|
|
2945
2944
|
walletAddress: wallet.address
|
|
@@ -6135,7 +6134,7 @@ var WalletService = class {
|
|
|
6135
6134
|
const response = await this.client.get(
|
|
6136
6135
|
`/sdk/wallets/${address2}`
|
|
6137
6136
|
);
|
|
6138
|
-
return response
|
|
6137
|
+
return response;
|
|
6139
6138
|
}
|
|
6140
6139
|
/**
|
|
6141
6140
|
* Gets all wallets for the user.
|
|
@@ -6662,7 +6661,7 @@ var SolanaStrategy = class {
|
|
|
6662
6661
|
async signOrder(params) {
|
|
6663
6662
|
const { orderId, wallet, deviceShare, multisigId } = params;
|
|
6664
6663
|
const connection = this.getProvider();
|
|
6665
|
-
const response = await this.apiClient.get(`/order/params/sol/${orderId}`);
|
|
6664
|
+
const response = await this.apiClient.get(`/sdk/order/params/sol/${orderId}`);
|
|
6666
6665
|
const { order, params: orderParams } = response;
|
|
6667
6666
|
if (!orderParams?.multisigPda || !orderParams?.transactionIndex) {
|
|
6668
6667
|
throw new Error("Missing Vault params from backend response");
|
|
@@ -6746,7 +6745,7 @@ var SolanaStrategy = class {
|
|
|
6746
6745
|
orderToCreate = orderToActivate.order;
|
|
6747
6746
|
} else {
|
|
6748
6747
|
const createResponse = await this.apiClient.post(
|
|
6749
|
-
"/order/create/sol",
|
|
6748
|
+
"/sdk/order/create/sol",
|
|
6750
6749
|
{
|
|
6751
6750
|
multisigId,
|
|
6752
6751
|
walletAddress: wallet.address,
|
|
@@ -6777,7 +6776,7 @@ var SolanaStrategy = class {
|
|
|
6777
6776
|
// Cast strictly to match SolOrderData requirements
|
|
6778
6777
|
// We pass extra props that createSolanaMultisigOrder expects (from IframeCreateSolanaMultisigOrderInput)
|
|
6779
6778
|
});
|
|
6780
|
-
const response = await this.apiClient.post("/order/activate/sol", {
|
|
6779
|
+
const response = await this.apiClient.post("/sdk/order/activate/sol", {
|
|
6781
6780
|
transaction: signedTx,
|
|
6782
6781
|
multisigId,
|
|
6783
6782
|
orderId: orderToCreate.id,
|
|
@@ -6823,7 +6822,7 @@ var SolanaStrategy = class {
|
|
|
6823
6822
|
tx.recentBlockhash = recentBlockhash;
|
|
6824
6823
|
tx.partialSign(signer);
|
|
6825
6824
|
const serializedTx = tx.serialize().toString("base64");
|
|
6826
|
-
const response = await this.apiClient.post("/order/reject/sol", {
|
|
6825
|
+
const response = await this.apiClient.post("/sdk/order/reject/sol", {
|
|
6827
6826
|
orderId,
|
|
6828
6827
|
walletAddress: wallet.address,
|
|
6829
6828
|
transaction: serializedTx
|
|
@@ -7024,7 +7023,7 @@ var TronStrategy = class {
|
|
|
7024
7023
|
type: instructions4[0]?.type,
|
|
7025
7024
|
tokenAddress: instructions4[0]?.tokenAddress
|
|
7026
7025
|
}] : instructions4;
|
|
7027
|
-
const response = await this.apiClient.post("/order/create/tron", {
|
|
7026
|
+
const response = await this.apiClient.post("/sdk/order/create/tron", {
|
|
7028
7027
|
multisigId,
|
|
7029
7028
|
walletAddress: wallet.address,
|
|
7030
7029
|
actions
|
|
@@ -7039,7 +7038,7 @@ var TronStrategy = class {
|
|
|
7039
7038
|
if (!multisigId) {
|
|
7040
7039
|
throw new Error("Vault id missing");
|
|
7041
7040
|
}
|
|
7042
|
-
const response = await this.apiClient.post("/order/reject/tron", {
|
|
7041
|
+
const response = await this.apiClient.post("/sdk/order/reject/tron", {
|
|
7043
7042
|
orderId,
|
|
7044
7043
|
multisigId,
|
|
7045
7044
|
walletAddress: wallet.address
|
|
@@ -7108,7 +7107,7 @@ var TronStrategy = class {
|
|
|
7108
7107
|
return { hash: broadcastResult.txid };
|
|
7109
7108
|
}
|
|
7110
7109
|
async executeTronOrder(order, wallet) {
|
|
7111
|
-
const response = await this.apiClient.patch("/order/execute/tron", {
|
|
7110
|
+
const response = await this.apiClient.patch("/sdk/order/execute/tron", {
|
|
7112
7111
|
orderId: order.id,
|
|
7113
7112
|
walletAddress: wallet.address
|
|
7114
7113
|
});
|
|
@@ -7364,7 +7363,7 @@ var BtcStrategy = class {
|
|
|
7364
7363
|
}
|
|
7365
7364
|
async createOrder(params) {
|
|
7366
7365
|
const { multisigId, wallet, instructions: instructions4 } = params;
|
|
7367
|
-
const response = await this.apiClient.post("/order/create/btc", {
|
|
7366
|
+
const response = await this.apiClient.post("/sdk/order/create/btc", {
|
|
7368
7367
|
multisigId,
|
|
7369
7368
|
walletAddress: wallet.address,
|
|
7370
7369
|
instructions: {
|
|
@@ -7383,7 +7382,7 @@ var BtcStrategy = class {
|
|
|
7383
7382
|
if (!multisigId) {
|
|
7384
7383
|
throw new Error("Vault id missing");
|
|
7385
7384
|
}
|
|
7386
|
-
const response = await this.apiClient.post("/order/reject/btc", {
|
|
7385
|
+
const response = await this.apiClient.post("/sdk/order/reject/btc", {
|
|
7387
7386
|
orderId,
|
|
7388
7387
|
multisigId,
|
|
7389
7388
|
walletAddress: wallet.address
|
|
@@ -7501,7 +7500,7 @@ var BtcStrategy = class {
|
|
|
7501
7500
|
return { hash: txHash };
|
|
7502
7501
|
}
|
|
7503
7502
|
async executeBtcOrder(order, wallet) {
|
|
7504
|
-
const response = await this.apiClient.patch("/order/execute/btc", {
|
|
7503
|
+
const response = await this.apiClient.patch("/sdk/order/execute/btc", {
|
|
7505
7504
|
orderId: order.id,
|
|
7506
7505
|
walletAddress: wallet.address
|
|
7507
7506
|
});
|