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.
@@ -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-XYPJCLZQ.js.map
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":";;;;;;;;AAAA;AAAA,EACE;AAAA,EAEA,aAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTA,IAAMC,cAAa;AAAA,EACxB,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AAKO,IAAM,yBAAyB;AAAA,EACpC,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,UAAU;AAAA,EACV,aAAa;AAAA,EACb,iBAAiB;AACnB;AA2DO,IAAM,2BAA2B;AAAA,EACtC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,kBAAkB;AACpB;AAIO,IAAM,4BAA4B;AAAA,EACvC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,gBAAgB;AAClB;;;AD5EA,YAAYC,aAAY;;;AEnBxB,SAAS,WAAAC,gBAAe;;;ACIjB,IAAMC,cAAa;AAOnB,IAAM,aAAa,QAAQ,IAAI,eAAe,UAAU;;;ACX/D,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,eAAe;AACxB,YAAY,SAAS;AACrB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,YAAY,aAAa;AAEzB,IAAM,SAAS,cAAc,GAAG;AAEhC,IAAMC,cAAa,QAAQ,IAAI,eAAe,UAAU;AAEjD,IAAM,gBAAgB,OAAO,WAA0C;AAC5E,QAAM,eAAe,OAAO,IAAI,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AACjE,QAAM,gBAAgB,MAAM,QAAQ,YAAY;AAChD,SAAO;AACT;;;AChBA,SAAS,UAAAC,eAAc;AAMhB,IAAM,mBAAmB,OAC9B,QACA,eACA,WACA,WACoB;AACpB,QAAM,MAAM,MAAM;AAAA,IAChB,GAAG,MAAM,wBAAwB,SAAS,IAAI,aAAa;AAAA,IAC3D;AAAA,MACE,SAAS;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,SAAO,KAAK;AACd;AAEO,IAAM,qBAAqB,OAChC,QACA,eACA,WACA,WACoB;AACpB,QAAM,MAAM,MAAM;AAAA,IAChB,GAAG,MAAM,wBAAwB,SAAS,IAAI,aAAa;AAAA,IAC3D;AAAA,MACE,SAAS;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,SAAO,KAAK;AACd;AAEO,IAAM,cAAc,OACzB,QACA,eACA,WACA,WAII;AACJ,QAAM,CAAC,UAAU,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3C,mBAAmB,QAAQ,eAAe,WAAW,MAAM;AAAA,IAC3D,iBAAiB,QAAQ,eAAe,WAAW,MAAM;AAAA,EAC3D,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAsCO,IAAM,4BAA4B;AAClC,IAAM,oBAAoB;AAE1B,IAAM,uBAAuB,OAAO,WAA0C;AACnF,QAAM,EAAE,SAAAC,SAAQ,IAAI,MAAM,OAAO,uBAAuB;AACxD,QAAM,eAAe,OAAO,IAAI,CAAC,UAAUC,QAAO,SAAS,KAAK,CAAC;AACjE,QAAM,gBAAgB,MAAMD,SAAQ,YAAY;AAChD,SAAO;AACT;AAEO,IAAM,kBAAkB,OAC7B,oBAC6B;AAC7B,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,uBAAuB;AACtD,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,EAAE,QAAAC,QAAO,IAAI,MAAM,OAAO,QAAQ;AAExC,QAAM,cAAcA,QAAO,QAAQ,OAAO,CAAC,CAAC;AAC5C,QAAM,cAAcA,QAAO,QAAQ,OAAO,CAAC,CAAC;AAC5C,QAAM,gBAAgBA,QAAO,QAAQ,OAAO,CAAC,CAAC;AAC9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,eAAe,OAC1B,oBAC6B;AAC7B,MAAI,CAAC,iBAAiB;AACpB,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AACA,QAAM,SAAS,MAAM,gBAAgB,eAAe;AACpD,SAAO;AACT;AAEO,IAAM,eAAe,OAC1B,eACA,aACA,eACA,QACA,WAKI;AACJ,MAAI;AACF,UAAM,gBAAgB,MAAM,qBAAqB,CAAC,eAAe,WAAW,CAAC;AAC7E,UAAM,SAAS,MAAM,aAAa,aAAa;AAC/C,UAAM,iBAAiB,MAAM,MAAM,GAAG,MAAM,uBAAuB;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAED,QAAI,CAAC,eAAe,IAAI;AACtB,YAAM,eAAe,KAAK,EAAE,MAAM,MAAM,KAAK;AAC7C,cAAQ;AAAA,QACN,qBAAqB,aAAa,mCAAmC,eAAe,MAAM;AAAA,MAC5F;AACA,YAAM,IAAI;AAAA,QACR,uCAAuC,eAAe,MAAM;AAAA,MAC9D;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI,MAAM,eAAe,KAAK;AAC7C,UAAM,yBAAyB,MAAM;AAAA,MACnC;AAAA,MACA,OAAO;AAAA,IACT;AACA,UAAM,iBAAiB,MAAM,MAAM,GAAG,MAAM,uBAAuB;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,aAAa;AAAA,MACf;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,aAAa,OAAO;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,eAAe,IAAI;AACtB,YAAM,eAAe,KAAK,EAAE,MAAM,MAAM,KAAK;AAC7C,cAAQ;AAAA,QACN,qBAAqB,aAAa,sCAAsC,eAAe,MAAM;AAAA,MAC/F;AACA,YAAM,IAAI;AAAA,QACR,8CAA8C,eAAe,MAAM;AAAA,MACrE;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,qCAAqC,aAAa,KAAK,GAAG;AACxE,UAAM;AAAA,EACR;AACF;;;ACxNA,IAAM,UAAU,QAAQ,IAAI,mBAAmB;AAExC,IAAM,0BAA0B,OACrC,aACA,eACA,QACA,aACA,cAKI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,iBAAgC;AACpC;AAEA,MAAI,eAAe,CAAC,eAAe,gBAAgB,KAAK;AACtD,UAAM,SAAS,MAAM,YAAY,QAAQ,eAAe,WAAW,OAAO;AAC1E,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM;AAAA,MAC/B;AAAA,MACA,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AACA,gBAAY;AACZ,sBAAkB;AAClB,qBAAiB;AAAA,EACnB,OAAO;AACL,UAAM,cAAc,MAAM,iBAAiB,QAAQ,eAAe,WAAW,OAAO;AACpF,gBAAY;AACZ,sBAAkB;AAAA,EACpB;AAEA,MAAI,CAAC,aAAa,CAAC,iBAAiB;AAClC,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,SAAO,EAAE,WAAW,iBAAiB,eAAe;AACtD;;;AJvCO,IAAM,6BAA6B,OACxC,aACA,SACA,aACA,gBACgE;AAChE,QAAM,EAAE,WAAW,iBAAiB,eAAe,IACjD,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAC,YAAW;AAAA,EACb;AACF,QAAM,gBAAgB,MAAM,cAAc,CAAC,WAAW,eAAe,CAAC;AAEtE,MAAI;AAEJ,MAAI;AACF,aAASC,SAAQ,cAAc,aAAa;AAAA,EAC9C,SAAS,KAAU;AACjB,YAAQ,MAAM,kCAAkC,IAAI,OAAO;AAE3D,UAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AAEA,MAAI,OAAO,UAAU,SAAS,MAAM,SAAS;AAC3C,UAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AAEA,SAAO,EAAE,QAAQ,eAAe;AAClC;;;AKpCA,SAAS,iBAAiB;AAE1B,YAAY,YAAY;AAEjB,IAAM,iBAAiB,CAAC,UAAoC;AACjE,QAAM,EAAE,cAAAC,eAAc,UAAU,IAAI;AAEpC,UAAQA,cAAa,MAAM;AAAA,IACzB,KAAK,uBAAuB,UAAU;AACpC,YAAM,YAAYA,cAAa;AAC/B,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,YAAM,MAAM;AAAA,QACV,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,KAAK,IAAI,UAAU,SAAS;AAAA,UAC5B,aAAoB,aAAM,YAAY,IAAI;AAAA,QAC5C;AAAA,MACF;AACA,YAAM,kBAAkB;AAAA,QACtB,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AACA,YAAM,UAAU,YAAY,CAAC,KAAK,eAAe,IAAI,CAAC,GAAG;AACzD,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,uBAAuB,aAAa;AACvC,YAAM,YAAYA,cAAa;AAC/B,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,MAAM,gCAAgC;AAAA,MAClD;AACA,YAAM,SAAS;AAAA,QACb,QAAQ;AAAA,QACR,WAAW,IAAI,UAAU,SAAS;AAAA,MACpC;AACA,YAAM,kBAAkB;AAAA,QACtB,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AACA,YAAM,UAAU,YAAY,CAAC,QAAQ,eAAe,IAAI,CAAC,MAAM;AAC/D,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,uBAAuB,iBAAiB;AAC3C,YAAM,eAAeA,cAAa;AAClC,YAAM,SAAS;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,MACF;AACA,YAAM,UAAU,CAAC,MAAM;AACvB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,uBAAuB,KAAK;AAC/B,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AAAA,IACA;AACE,YAAM,IAAI,MAAM,4BAA4BA,eAAc,IAAI,EAAE;AAAA,EACpE;AACF;;;AC5DO,IAAM,gBAAgB,CAAC,iBAA0C;AACtE,QAAM,SAAS,OAAO,YAAY;AAClC,QAAM,gBAAgB;AAEtB,MAAI;AACJ,MAAI;AACF,mBAAe,WAAW,MAAM;AAAA,EAClC,SAAS,GAAG;AACV,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,MAAI,MAAM,YAAY,KAAK,eAAe,GAAG;AAC3C,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,QAAM,oBAAoB,aAAa,QAAQ,CAAC,EAAE,QAAQ,UAAU,EAAE;AAEtE,MAAI,CAAC,cAAc,KAAK,iBAAiB,GAAG;AAC1C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,KAAK,MAAM,eAAe,GAAa;AAE9D,MAAI,mBAAmB,KAAK,eAAe,GAAG;AAC5C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,cAAc;AAC9B;;;AC/BA,SAAS,kBAAkB,6BAA6B;AAEjD,IAAM,qBAAqB,OAChC,YACA,kBACuB;AACvB,MAAI;AACF,UAAM,cAAc,MAAM,WAAW,eAAe,aAAa;AAEjE,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,QAAI,YAAY,MAAM,OAAO,qBAAqB,GAAG;AACnD,cAAQ,IAAI,gDAAgD;AAC5D,aAAO;AAAA,IACT;AAEA,YAAQ,IAAI,+BAA+B;AAC3C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ATHA,IAAM,mBAAmB,CAAC,QAAgB,aAA6B;AACrE,QAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,IAAI,OAAO,MAAM,GAAG;AACrD,QAAM,cAAc,WAAW,IAAI,OAAO,QAAQ,GAAG,MAAM,GAAG,QAAQ;AACtE,QAAM,WAAW,SAAS,cAAc,IAAI,OAAO,QAAQ;AAC3D,QAAM,aAAa,SAAS,QAAQ,aAAa,EAAE;AACnD,SAAO,eAAe,KAAK,KAAK,OAAO,UAAU;AACnD;AAEO,IAAM,4BAA4B,OACvC,UAC8B;AAC9B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI;AACJ,MAAI,qBAAoC;AAExC,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,aAAS,OAAO;AAChB,yBAAqB,OAAO;AAAA,EAC9B,SAAS,OAAY;AACnB,QAAI,MAAM,YAAY,gBAAgB;AACpC,YAAM;AAAA,IACR;AAEA,QAAI;AACF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,eAAS,OAAO;AAChB,2BAAqB,OAAO;AAAA,IAC9B,SAAS,YAAiB;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,WAAW,QAAQ,WAAW;AAErD,QAAM,eAAe,IAAIC,WAAU,WAAW;AAC9C,QAAM,eAAe,MAAa,iBAAS,SAAS;AAAA,IAClD;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBACJ,OAAO,aAAa,iBAAiB,SAAS,CAAC,IAAI;AAErD,QAAM,KAAK,IAAI,YAAY;AAC3B,QAAM,mBAAmB,MAAM,WAAW,mBAAmB,GAAG;AAEhE,MAAI,WAAW,uBAAuB,QAAQ;AAC5C,QAAI,CAACD,cAAa,CAAC,EAAE,YAAY,CAACA,cAAa,CAAC,EAAE,QAAQ;AACxD,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC3D;AACA,UAAM,WAAW,cAAc,OAAOA,cAAa,CAAC,EAAE,MAAM,CAAC;AAE7D,UAAM,gBAAgB,cAAc,SAAS;AAAA,MAC3C,YAAY,IAAIC,WAAU,YAAY;AAAA,MACtC,UAAU,IAAIA,WAAUD,cAAa,CAAC,EAAE,QAAQ;AAAA,MAChD;AAAA,IACF,CAAC;AAED,UAAM,kBAAkB,IAAI,mBAAmB;AAAA,MAC7C,UAAU,IAAIC,WAAU,YAAY;AAAA,MACpC;AAAA,MACA,cAAc,CAAC,aAAa;AAAA,IAC9B,CAAC;AAED,UAAM,KAAY,qBAAa,uBAAuB;AAAA,MACpD,aAAa;AAAA,MACb;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,MAAM;AAAA,IACR,CAAC;AAED,OAAG,IAAI,EAAE;AAAA,EACX,WAAW,WAAW,uBAAuB,KAAK;AAChD,QAAI;AACF,YAAM,OAAOD,cAAa,CAAC;AAC3B,UAAI,CAAC,MAAM,YAAY,CAAC,MAAM;AAC5B,cAAM,IAAI,MAAM,iCAAiC;AACnD,UAAI,CAAC,eAAe,WAAW,OAAO,cAAc,aAAa;AAC/D,cAAM,IAAI,MAAM,iDAAiD;AAEnE,YAAM,CAAC,QAAQ,IAAW,oBAAY;AAAA,QACpC,aAAa;AAAA,QACb,OAAO;AAAA,MACT,CAAC;AAED,YAAM,OAAO,IAAIC,WAAU,cAAc,OAAO;AAChD,YAAM,YAAY,IAAIA,WAAU,KAAK,QAAQ;AAE7C,YAAM,iBAAiB,MAAM,mBAAmB,YAAY,IAAI;AAChE,cAAQ,IAAI,kCAA2B,eAAe,SAAS,CAAC,EAAE;AAElE,YAAM,gBAAgB,MAAM,WAAW,wBAAwB,UAAU;AAAA,QACvE;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AACD,UAAI,cAAc,MAAM,WAAW,GAAG;AACpC,cAAM,IAAI;AAAA,UACR,4CAA4C,cAAc,OAAO;AAAA,QACnE;AAAA,MACF;AACA,YAAM,UAAU,cAAc,MAAM,CAAC,EAAE;AAEvC,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,mBAAmB,CAAC;AAC1B,YAAM,YAAY,MAAM,WAAW,eAAe,KAAK;AACvD,UAAI,CAAC,WAAW;AACd,yBAAiB;AAAA,UACf;AAAA,YACE,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb,OAAO,KAAK,MAAM;AAAA,QAClB,cAAc;AAAA,MAChB;AACA,UAAI,UAAU,GAAI,OAAM,IAAI,MAAM,yBAAyB;AAE3D,uBAAiB;AAAA,QACf;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc;AAAA,UACd,CAAC;AAAA,UACD;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,IAAI,mBAAmB;AAAA,QAC7C,UAAU;AAAA,QACV;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AAED,YAAM,KAAY,qBAAa,uBAAuB;AAAA,QACpD,aAAa;AAAA,QACb;AAAA,QACA,SAAS,OAAO;AAAA,QAChB,YAAY;AAAA,QACZ,kBAAkB;AAAA,QAClB,oBAAoB;AAAA,QACpB,MAAM;AAAA,MACR,CAAC;AAED,SAAG,IAAI,EAAE;AAAA,IACX,SAAS,KAAK;AACZ,cAAQ,MAAM,2CAA2C,GAAG;AAC5D,YAAM;AAAA,IACR;AAAA,EACF,OAAO;AACL,UAAM,UAAU,MAAM,aACnB,IAAI,CAAC,SAAS,eAAe,EAAE,GAAG,OAAO,cAAc,KAAK,CAAC,CAAC,EAC9D,KAAK;AAER,UAAM,KAAY,qBAAa,wBAAwB;AAAA,MACrD,aAAa;AAAA,MACb,SAAS,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW,OAAO;AAAA,IACpB,CAAC;AACD,OAAG,IAAI,EAAE;AAAA,EACX;AAEA,QAAM,aAAoB,qBAAa,eAAe;AAAA,IACpD,SAAS,OAAO;AAAA,IAChB,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACD,KAAG,IAAI,UAAU;AACjB,KAAG,WAAW,OAAO;AACrB,KAAG,kBAAkB;AACrB,KAAG,YAAY,MAAM;AAErB,QAAM,mBAAmB,GAAG,UAAU,EAAE,SAAS,QAAQ;AACzD,UAAQ,IAAI,iCAA0B,gBAAgB;AAEtD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,EACF;AACF;","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"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createSolanaMultisigOrder
3
- } from "./chunk-XYPJCLZQ.js";
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-ABBIJ4ZX.js.map
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.data;
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
  });