@swapkit/toolboxes 0.0.0-nightly-20250304130539

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.
Files changed (83) hide show
  1. package/dist/chunk-fazw0jvt.js +3 -0
  2. package/dist/chunk-fazw0jvt.js.map +9 -0
  3. package/dist/chunk-tvrdndbw.js +4 -0
  4. package/dist/chunk-tvrdndbw.js.map +9 -0
  5. package/dist/cosmos/index.cjs +3 -0
  6. package/dist/cosmos/index.cjs.map +19 -0
  7. package/dist/cosmos/index.js +3 -0
  8. package/dist/cosmos/index.js.map +19 -0
  9. package/dist/evm/index.cjs +3 -0
  10. package/dist/evm/index.cjs.map +18 -0
  11. package/dist/evm/index.js +3 -0
  12. package/dist/evm/index.js.map +18 -0
  13. package/dist/index.cjs +3 -0
  14. package/dist/index.cjs.map +9 -0
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +9 -0
  17. package/dist/radix/index.cjs +3 -0
  18. package/dist/radix/index.cjs.map +10 -0
  19. package/dist/radix/index.js +3 -0
  20. package/dist/radix/index.js.map +10 -0
  21. package/dist/solana/index.cjs +3 -0
  22. package/dist/solana/index.cjs.map +10 -0
  23. package/dist/solana/index.js +3 -0
  24. package/dist/solana/index.js.map +10 -0
  25. package/dist/substrate/index.cjs +3 -0
  26. package/dist/substrate/index.cjs.map +12 -0
  27. package/dist/substrate/index.js +3 -0
  28. package/dist/substrate/index.js.map +12 -0
  29. package/dist/utxo/index.cjs +3 -0
  30. package/dist/utxo/index.cjs.map +17 -0
  31. package/dist/utxo/index.js +3 -0
  32. package/dist/utxo/index.js.map +17 -0
  33. package/package.json +102 -0
  34. package/src/cosmos/index.ts +8 -0
  35. package/src/cosmos/thorchainUtils/addressFormat.ts +23 -0
  36. package/src/cosmos/thorchainUtils/index.ts +4 -0
  37. package/src/cosmos/thorchainUtils/messages.ts +244 -0
  38. package/src/cosmos/thorchainUtils/registry.ts +47 -0
  39. package/src/cosmos/thorchainUtils/types/client-types.ts +79 -0
  40. package/src/cosmos/thorchainUtils/types/index.ts +1 -0
  41. package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.js +2806 -0
  42. package/src/cosmos/thorchainUtils/types/proto/MsgCompiled.ts +2802 -0
  43. package/src/cosmos/thorchainUtils/util.ts +46 -0
  44. package/src/cosmos/toolbox/BaseCosmosToolbox.ts +257 -0
  45. package/src/cosmos/toolbox/gaia.ts +39 -0
  46. package/src/cosmos/toolbox/getToolboxByChain.ts +29 -0
  47. package/src/cosmos/toolbox/kujira.ts +61 -0
  48. package/src/cosmos/toolbox/thorchain.ts +305 -0
  49. package/src/cosmos/types.ts +42 -0
  50. package/src/cosmos/util.ts +230 -0
  51. package/src/evm/__tests__/ethereum.test.ts +147 -0
  52. package/src/evm/api.ts +157 -0
  53. package/src/evm/contracts/eth/multicall.ts +165 -0
  54. package/src/evm/contracts/op/gasOracle.ts +151 -0
  55. package/src/evm/helpers.ts +213 -0
  56. package/src/evm/index.ts +15 -0
  57. package/src/evm/toolbox/baseEVMToolbox.ts +670 -0
  58. package/src/evm/toolbox/evm.ts +89 -0
  59. package/src/evm/toolbox/getToolboxByChain.ts +37 -0
  60. package/src/evm/toolbox/op.ts +152 -0
  61. package/src/evm/types.ts +110 -0
  62. package/src/index.ts +0 -0
  63. package/src/radix/index.ts +151 -0
  64. package/src/radix/toolbox.ts +693 -0
  65. package/src/solana/index.ts +49 -0
  66. package/src/solana/toolbox.ts +271 -0
  67. package/src/substrate/index.ts +3 -0
  68. package/src/substrate/toolbox/baseSubstrateToolbox.ts +288 -0
  69. package/src/substrate/toolbox/index.ts +40 -0
  70. package/src/substrate/types/index.ts +2 -0
  71. package/src/substrate/types/network.ts +42 -0
  72. package/src/substrate/types/wallet.ts +78 -0
  73. package/src/utxo/helpers/api.ts +431 -0
  74. package/src/utxo/helpers/bchaddrjs.ts +177 -0
  75. package/src/utxo/helpers/coinselect.ts +96 -0
  76. package/src/utxo/helpers/index.ts +5 -0
  77. package/src/utxo/helpers/txSize.ts +103 -0
  78. package/src/utxo/helpers/utils.ts +48 -0
  79. package/src/utxo/index.ts +7 -0
  80. package/src/utxo/toolbox/bitcoinCash.ts +268 -0
  81. package/src/utxo/toolbox/index.ts +41 -0
  82. package/src/utxo/toolbox/utxo.ts +372 -0
  83. package/src/utxo/types.ts +51 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/solana/toolbox.ts"],
4
+ "sourcesContent": [
5
+ "import type { Connection, Keypair, PublicKey, Transaction } from \"@solana/web3.js\";\nimport {\n AssetValue,\n Chain,\n DerivationPath,\n SKConfig,\n SwapKitError,\n SwapKitNumber,\n type WalletTxParams,\n} from \"@swapkit/helpers\";\n\nexport async function getAddressValidator() {\n const { PublicKey } = await import(\"@solana/web3.js\");\n\n return (address: string) => {\n try {\n const pubkey = new PublicKey(address);\n return PublicKey.isOnCurve(pubkey.toBytes());\n } catch (_) {\n return false;\n }\n };\n}\n\nexport async function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n}) {\n const {\n getAssociatedTokenAddress,\n getAccount,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n } = await import(\"@solana/spl-token\");\n const { Transaction, PublicKey } = await import(\"@solana/web3.js\");\n\n const transaction = new Transaction();\n const tokenPublicKey = new PublicKey(tokenAddress);\n const fromSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, from);\n\n const recipientPublicKey = new PublicKey(recipient);\n const recipientSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, recipientPublicKey);\n\n let recipientAccountExists = false;\n try {\n await getAccount(connection, recipientSPLAddress);\n recipientAccountExists = true;\n } catch (_) {\n // Recipient's associated token account doesn't exist\n }\n\n if (!recipientAccountExists) {\n transaction.add(\n createAssociatedTokenAccountInstruction(\n from,\n recipientSPLAddress,\n recipientPublicKey,\n tokenPublicKey,\n ),\n );\n }\n\n transaction.add(\n createTransferCheckedInstruction(\n fromSPLAddress,\n tokenPublicKey,\n recipientSPLAddress,\n from,\n amount,\n decimals,\n ),\n );\n\n return transaction;\n}\n\nexport const SOLToolbox = () => {\n async function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n return new Connection(SKConfig.get(\"rpcUrls\").SOL, \"confirmed\");\n }\n\n return {\n getConnection,\n createKeysForPath,\n getAddressFromKeys,\n createSolanaTransaction: createSolanaTransaction(getConnection),\n getBalance: getBalance(getConnection),\n transfer: transfer(getConnection),\n broadcastTransaction: broadcastTransaction(getConnection),\n getAddressValidator,\n };\n};\n\nfunction createSolanaTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n fromPublicKey,\n memo,\n isProgramDerivedAddress,\n }: WalletTxParams & {\n assetValue: AssetValue;\n fromPublicKey: PublicKey;\n isProgramDerivedAddress?: boolean;\n }) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n const { Transaction, PublicKey, SystemProgram } = await import(\"@solana/web3.js\");\n const validateAddress = await getAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new SwapKitError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n\n const transaction = assetValue.isGasAsset\n ? new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPublicKey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n )\n : assetValue.address\n ? await createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPublicKey,\n recipient,\n tokenAddress: assetValue.address,\n })\n : undefined;\n\n if (!transaction) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n if (memo) transaction.add(createMemoInstruction(memo));\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = fromPublicKey;\n\n return transaction;\n };\n}\n\nfunction transfer(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n fromKeypair,\n memo,\n isProgramDerivedAddress,\n }: WalletTxParams & {\n assetValue: AssetValue;\n fromKeypair: Keypair;\n isProgramDerivedAddress?: boolean;\n }) => {\n const { sendAndConfirmTransaction } = await import(\"@solana/web3.js\");\n const connection = await getConnection();\n\n const transaction = await createSolanaTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n fromPublicKey: fromKeypair.publicKey,\n isProgramDerivedAddress,\n });\n\n return sendAndConfirmTransaction(connection, transaction, [fromKeypair]);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath = DerivationPath.SOL,\n}: { phrase: string; derivationPath?: string }) {\n const { HDKey } = await import(\"micro-key-producer/slip10.js\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { Keypair } = await import(\"@solana/web3.js\");\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromKeys(keypair: Keypair) {\n return keypair.publicKey.toString();\n}\n\nasync function getTokenBalances({\n connection,\n address,\n}: { connection: Connection; address: string }) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const { TokenListProvider } = await import(\"@solana/spl-token-registry\");\n\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey(address), {\n programId: TOKEN_PROGRAM_ID,\n });\n const tokenListProvider = new TokenListProvider();\n const tokenListContainer = await tokenListProvider.resolve();\n const tokenList = tokenListContainer.filterByChainId(101).getList();\n\n // Group token balances by mint address\n const tokenBalanceMap = new Map<string, { amount: bigint; decimal: number; symbol: string }>();\n\n for await (const tokenAccountInfo of tokenAccounts.value) {\n const accountInfo = tokenAccountInfo.account.data.parsed.info;\n const mintAddress = accountInfo.mint;\n const decimal = accountInfo.tokenAmount.decimals;\n const amount = BigInt(accountInfo.tokenAmount.amount);\n\n if (amount <= BigInt(0)) continue;\n\n const tokenInfo = tokenList.find((token) => token.address === mintAddress);\n const tokenSymbol = tokenInfo?.symbol ?? \"UNKNOWN\";\n const existing = tokenBalanceMap.get(mintAddress);\n\n tokenBalanceMap.set(mintAddress, {\n amount: existing ? existing.amount + amount : amount,\n decimal,\n symbol: tokenSymbol,\n });\n }\n\n // Convert grouped balances to AssetValue array\n const tokenBalances: AssetValue[] = Array.from(tokenBalanceMap.entries()).map(\n ([mintAddress, { amount, decimal, symbol }]) =>\n new AssetValue({\n value: SwapKitNumber.fromBigInt(amount, decimal),\n decimal,\n identifier: `${Chain.Solana}.${symbol}${mintAddress ? `-${mintAddress.toString()}` : \"\"}`,\n }),\n );\n\n return tokenBalances;\n}\n\nfunction getBalance(getConnection: () => Promise<Connection>) {\n return async (address: string) => {\n const { PublicKey } = await import(\"@solana/web3.js\");\n const connection = await getConnection();\n const SOLBalance = await connection.getBalance(new PublicKey(address));\n const tokenBalances = await getTokenBalances({ connection, address });\n\n return [AssetValue.from({ chain: Chain.Solana, value: BigInt(SOLBalance) }), ...tokenBalances];\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "857DCD4407AD404264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,3 @@
1
+ import{a as q,b as O}from"../chunk-tvrdndbw.js";import{AssetValue as $,Chain as v,DerivationPath as b,SKConfig as H,SwapKitError as Z,SwapKitNumber as _}from"@swapkit/helpers";async function G(){let{PublicKey:T}=await import("@solana/web3.js");return(p)=>{try{let h=new T(p);return T.isOnCurve(h.toBytes())}catch(h){return!1}}}async function P({tokenAddress:T,recipient:p,from:h,connection:S,amount:W,decimals:j}){let{getAssociatedTokenAddress:R,getAccount:z,createAssociatedTokenAccountInstruction:U,createTransferCheckedInstruction:g}=await import("@solana/spl-token"),{Transaction:L,PublicKey:E}=await import("@solana/web3.js"),x=new L,w=new E(T),J=await R(w,h),F=new E(p),Q=await R(w,F),X=!1;try{await z(S,Q),X=!0}catch(Y){}if(!X)x.add(U(h,Q,F,w));return x.add(g(J,w,Q,h,W,j)),x}var A=()=>{async function T(){let{Connection:p}=await import("@solana/web3.js");return new p(H.get("rpcUrls").SOL,"confirmed")}return{getConnection:T,createKeysForPath:B,getAddressFromKeys:I,createSolanaTransaction:M(T),getBalance:l(T),transfer:y(T),broadcastTransaction:D(T),getAddressValidator:G}};function M(T){return async({recipient:p,assetValue:h,fromPublicKey:S,memo:W,isProgramDerivedAddress:j})=>{let{createMemoInstruction:R}=await import("@solana/spl-memo"),{Transaction:z,PublicKey:U,SystemProgram:g}=await import("@solana/web3.js"),L=await G();if(!(j||L(p)))throw new Z("core_transaction_invalid_recipient_address");let E=await T(),x=h.isGasAsset?new z().add(g.transfer({fromPubkey:S,lamports:h.getBaseValue("number"),toPubkey:new U(p)})):h.address?await P({amount:h.getBaseValue("number"),connection:E,decimals:h.decimal,from:S,recipient:p,tokenAddress:h.address}):void 0;if(!x)throw new Z("core_transaction_invalid_sender_address");if(W)x.add(R(W));let w=await E.getLatestBlockhash();return x.recentBlockhash=w.blockhash,x.feePayer=S,x}}function y(T){return async({recipient:p,assetValue:h,fromKeypair:S,memo:W,isProgramDerivedAddress:j})=>{let{sendAndConfirmTransaction:R}=await import("@solana/web3.js"),z=await T(),U=await M(T)({recipient:p,assetValue:h,memo:W,fromPublicKey:S.publicKey,isProgramDerivedAddress:j});return R(z,U,[S])}}function D(T){return async(p)=>{return(await T()).sendRawTransaction(p.serialize())}}async function B({phrase:T,derivationPath:p=b.SOL}){let{HDKey:h}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:S}=await import("@scure/bip39"),{Keypair:W}=await import("@solana/web3.js"),j=S(T),R=h.fromMasterSeed(j);return W.fromSeed(R.derive(p,!0).privateKey)}function I(T){return T.publicKey.toString()}async function V({connection:T,address:p}){let{PublicKey:h}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:S}=await import("@solana/spl-token"),{TokenListProvider:W}=await import("@solana/spl-token-registry"),j=await T.getParsedTokenAccountsByOwner(new h(p),{programId:S}),U=(await new W().resolve()).filterByChainId(101).getList(),g=new Map;for await(let E of j.value){let x=E.account.data.parsed.info,w=x.mint,J=x.tokenAmount.decimals,F=BigInt(x.tokenAmount.amount);if(F<=BigInt(0))continue;let X=U.find((N)=>N.address===w)?.symbol??"UNKNOWN",Y=g.get(w);g.set(w,{amount:Y?Y.amount+F:F,decimal:J,symbol:X})}return Array.from(g.entries()).map(([E,{amount:x,decimal:w,symbol:J}])=>new $({value:_.fromBigInt(x,w),decimal:w,identifier:`${v.Solana}.${J}${E?`-${E.toString()}`:""}`}))}function l(T){return async(p)=>{let{PublicKey:h}=await import("@solana/web3.js"),S=await T(),W=await S.getBalance(new h(p)),j=await V({connection:S,address:p});return[$.from({chain:v.Solana,value:BigInt(W)}),...j]}}export{G as getAddressValidator,P as createSolanaTokenTransaction,A as SOLToolbox};
2
+
3
+ //# debugId=049A2B1F2EFC50B264756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/solana/toolbox.ts"],
4
+ "sourcesContent": [
5
+ "import type { Connection, Keypair, PublicKey, Transaction } from \"@solana/web3.js\";\nimport {\n AssetValue,\n Chain,\n DerivationPath,\n SKConfig,\n SwapKitError,\n SwapKitNumber,\n type WalletTxParams,\n} from \"@swapkit/helpers\";\n\nexport async function getAddressValidator() {\n const { PublicKey } = await import(\"@solana/web3.js\");\n\n return (address: string) => {\n try {\n const pubkey = new PublicKey(address);\n return PublicKey.isOnCurve(pubkey.toBytes());\n } catch (_) {\n return false;\n }\n };\n}\n\nexport async function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n}) {\n const {\n getAssociatedTokenAddress,\n getAccount,\n createAssociatedTokenAccountInstruction,\n createTransferCheckedInstruction,\n } = await import(\"@solana/spl-token\");\n const { Transaction, PublicKey } = await import(\"@solana/web3.js\");\n\n const transaction = new Transaction();\n const tokenPublicKey = new PublicKey(tokenAddress);\n const fromSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, from);\n\n const recipientPublicKey = new PublicKey(recipient);\n const recipientSPLAddress = await getAssociatedTokenAddress(tokenPublicKey, recipientPublicKey);\n\n let recipientAccountExists = false;\n try {\n await getAccount(connection, recipientSPLAddress);\n recipientAccountExists = true;\n } catch (_) {\n // Recipient's associated token account doesn't exist\n }\n\n if (!recipientAccountExists) {\n transaction.add(\n createAssociatedTokenAccountInstruction(\n from,\n recipientSPLAddress,\n recipientPublicKey,\n tokenPublicKey,\n ),\n );\n }\n\n transaction.add(\n createTransferCheckedInstruction(\n fromSPLAddress,\n tokenPublicKey,\n recipientSPLAddress,\n from,\n amount,\n decimals,\n ),\n );\n\n return transaction;\n}\n\nexport const SOLToolbox = () => {\n async function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n return new Connection(SKConfig.get(\"rpcUrls\").SOL, \"confirmed\");\n }\n\n return {\n getConnection,\n createKeysForPath,\n getAddressFromKeys,\n createSolanaTransaction: createSolanaTransaction(getConnection),\n getBalance: getBalance(getConnection),\n transfer: transfer(getConnection),\n broadcastTransaction: broadcastTransaction(getConnection),\n getAddressValidator,\n };\n};\n\nfunction createSolanaTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n fromPublicKey,\n memo,\n isProgramDerivedAddress,\n }: WalletTxParams & {\n assetValue: AssetValue;\n fromPublicKey: PublicKey;\n isProgramDerivedAddress?: boolean;\n }) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n const { Transaction, PublicKey, SystemProgram } = await import(\"@solana/web3.js\");\n const validateAddress = await getAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new SwapKitError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n\n const transaction = assetValue.isGasAsset\n ? new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPublicKey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n )\n : assetValue.address\n ? await createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPublicKey,\n recipient,\n tokenAddress: assetValue.address,\n })\n : undefined;\n\n if (!transaction) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n if (memo) transaction.add(createMemoInstruction(memo));\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = fromPublicKey;\n\n return transaction;\n };\n}\n\nfunction transfer(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n fromKeypair,\n memo,\n isProgramDerivedAddress,\n }: WalletTxParams & {\n assetValue: AssetValue;\n fromKeypair: Keypair;\n isProgramDerivedAddress?: boolean;\n }) => {\n const { sendAndConfirmTransaction } = await import(\"@solana/web3.js\");\n const connection = await getConnection();\n\n const transaction = await createSolanaTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n fromPublicKey: fromKeypair.publicKey,\n isProgramDerivedAddress,\n });\n\n return sendAndConfirmTransaction(connection, transaction, [fromKeypair]);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath = DerivationPath.SOL,\n}: { phrase: string; derivationPath?: string }) {\n const { HDKey } = await import(\"micro-key-producer/slip10.js\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const { Keypair } = await import(\"@solana/web3.js\");\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromKeys(keypair: Keypair) {\n return keypair.publicKey.toString();\n}\n\nasync function getTokenBalances({\n connection,\n address,\n}: { connection: Connection; address: string }) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const { TokenListProvider } = await import(\"@solana/spl-token-registry\");\n\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey(address), {\n programId: TOKEN_PROGRAM_ID,\n });\n const tokenListProvider = new TokenListProvider();\n const tokenListContainer = await tokenListProvider.resolve();\n const tokenList = tokenListContainer.filterByChainId(101).getList();\n\n // Group token balances by mint address\n const tokenBalanceMap = new Map<string, { amount: bigint; decimal: number; symbol: string }>();\n\n for await (const tokenAccountInfo of tokenAccounts.value) {\n const accountInfo = tokenAccountInfo.account.data.parsed.info;\n const mintAddress = accountInfo.mint;\n const decimal = accountInfo.tokenAmount.decimals;\n const amount = BigInt(accountInfo.tokenAmount.amount);\n\n if (amount <= BigInt(0)) continue;\n\n const tokenInfo = tokenList.find((token) => token.address === mintAddress);\n const tokenSymbol = tokenInfo?.symbol ?? \"UNKNOWN\";\n const existing = tokenBalanceMap.get(mintAddress);\n\n tokenBalanceMap.set(mintAddress, {\n amount: existing ? existing.amount + amount : amount,\n decimal,\n symbol: tokenSymbol,\n });\n }\n\n // Convert grouped balances to AssetValue array\n const tokenBalances: AssetValue[] = Array.from(tokenBalanceMap.entries()).map(\n ([mintAddress, { amount, decimal, symbol }]) =>\n new AssetValue({\n value: SwapKitNumber.fromBigInt(amount, decimal),\n decimal,\n identifier: `${Chain.Solana}.${symbol}${mintAddress ? `-${mintAddress.toString()}` : \"\"}`,\n }),\n );\n\n return tokenBalances;\n}\n\nfunction getBalance(getConnection: () => Promise<Connection>) {\n return async (address: string) => {\n const { PublicKey } = await import(\"@solana/web3.js\");\n const connection = await getConnection();\n const SOLBalance = await connection.getBalance(new PublicKey(address));\n const tokenBalances = await getTokenBalances({ connection, address });\n\n return [AssetValue.from({ chain: Chain.Solana, value: BigInt(SOLBalance) }), ...tokenBalances];\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "049A2B1F2EFC50B264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,3 @@
1
+ var c={};n(c,{subtrateNetwork:()=>q,substrateValidateAddress:()=>T,polkadotNetwork:()=>O,isKeyringPair:()=>D,getToolboxByChain:()=>x,createKeyring:()=>z,chainflipNetwork:()=>S,ToolboxFactory:()=>N,PolkadotToolbox:()=>U,Network:()=>M,ChainflipToolbox:()=>X,BaseSubstrateToolbox:()=>Q});module.exports=V(c);var E=require("@polkadot/util"),R=require("@polkadot/util-crypto"),f=require("@swapkit/helpers");var O={prefix:0,network:"polkadot",displayName:"Polkadot Relay Chain",symbols:["DOT"],decimals:[10],standardAccount:"*25519",website:"https://polkadot.network"},S={prefix:2112,network:"chainflip",displayName:"Chainflip",symbols:["FLIP"],decimals:[18],standardAccount:"*25519",website:"https://chainflip.io/"},q={prefix:42,network:"substrate",displayName:"Substrate",symbols:[],decimals:[],standardAccount:"*25519",website:"https://substrate.io/"},M={DOT:O,FLIP:S,GENERIC:q};var D=(t)=>{return"address"in t},z=async(t,o)=>{let{Keyring:I}=await import("@polkadot/api"),{cryptoWaitReady:m}=await import("@polkadot/util-crypto");return await m(),new I({type:"sr25519",ss58Format:o}).addFromUri(t)},G=(t,o)=>t.rpc.system.accountNextIndex(o),Y=async(t,o,I)=>{let m=await t.query.system?.account?.(I);if(!m?.data?.free||m?.data?.isEmpty)return[o.set(0)];return[o.set(f.SwapKitNumber.fromBigInt(BigInt(m.data.free.toString()),o.decimal).getValue("string"))]},W=(t,o)=>{try{let I=F(t,o);return J(I,"ss58",o),!0}catch(I){return!1}},H=(t,{recipient:o,amount:I})=>t.tx.balances?.transferAllowDeath?.(o,I),Z=async(t,o,{recipient:I,assetValue:m,from:j})=>{let v=H(t,{recipient:I,amount:m.getBaseValue("number")}),y=D(o);if(!v)return;let p=j||(y?o.address:void 0);if(!p)throw new f.SwapKitError("core_transaction_invalid_sender_address");let L=await G(t,p);return(await v.signAndSend(y?o:p,{signer:y?void 0:o,nonce:L}))?.toString()},_=async(t,o,I,{recipient:m,assetValue:j,from:v})=>{let y=H(t,{recipient:m,amount:j.getBaseValue("number")}),p=v||D(o)&&o.address;if(!p)return;let L=await y?.paymentInfo(p,{nonce:await G(t,p)})||{partialFee:0};return I.set(f.SwapKitNumber.fromBigInt(BigInt(L.partialFee.toString()),I.decimal).getValue("string"))},$=async(t,o)=>{if(o)return t.send(o);return(await t.send()).toString()},C=async(t,o)=>{return await o.signAsync(t)},b=(t,o,I)=>{if(I)return o.signAndSend(t,I);return o.signAndSend(t).toString()},B=async({signer:t,address:o,tx:I,callback:m,api:j})=>{let v=await G(j,o);if(m)I.signAndSend(o,{nonce:v,signer:t},m);return I.signAndSend(o,{nonce:v,signer:t}).toString()};function h(t,o){let I=R.decodeAddress(t);return R.encodeAddress(I,o)}function F(t,o){return E.isHex(t)?E.hexToU8a(t):R.decodeAddress(t,void 0,o)}function J(t,o="ss58",I){if(o==="hex")return E.u8aToHex(t);return R.encodeAddress(t,I)}var Q=({api:t,network:o,gasAsset:I,signer:m})=>({api:t,network:o,gasAsset:I,decodeAddress:F,encodeAddress:J,convertAddress:h,createKeyring:(j)=>z(j,o.prefix),getAddress:(j=m)=>D(j)?j.address:void 0,createTransfer:({recipient:j,assetValue:v})=>H(t,{recipient:j,amount:v.getBaseValue("number")}),getBalance:(j)=>Y(t,I,j),validateAddress:(j)=>W(j,o.prefix),transfer:(j)=>Z(t,m,j),estimateTransactionFee:(j)=>_(t,m,I,j),sign:(j)=>{if(D(m))return C(m,j);throw new f.SwapKitError("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},broadcast:(j,v)=>$(j,v),signAndBroadcast:({tx:j,callback:v,address:y})=>{if(D(m))return b(m,j,v);if(y)return B({signer:m,address:y,tx:j,callback:v,api:t});throw new f.SwapKitError("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")}}),T=({address:t,chain:o})=>{let{prefix:I}=o===f.Chain.Polkadot?M.DOT:M.FLIP;return W(t,I)||W(t,M.GENERIC.prefix)};async function N({generic:t,chain:o,signer:I}){let{ApiPromise:m,WsProvider:j}=await import("@polkadot/api"),v=new j(f.SKConfig.get("rpcUrls")[o]),y=await m.create({provider:v}),p=f.AssetValue.from({chain:o}),L=t?M.GENERIC:M[o];return Q({api:y,signer:I,gasAsset:p,network:L})}var u=require("@swapkit/helpers");var U=({signer:t,generic:o=!1})=>{return N({chain:u.Chain.Polkadot,generic:o,signer:t})},X=async({signer:t,generic:o=!1})=>{let I=await N({chain:u.Chain.Chainflip,generic:o,signer:t});async function m(j){let{balance:v}=await I.api.query.flip?.account?.(j);return[u.AssetValue.from({chain:u.Chain.Chainflip,value:BigInt(v.toString())})]}return{...I,getBalance:m}},x=(t,o)=>{switch(t){case u.Chain.Chainflip:return X(o);case u.Chain.Polkadot:return U(o);default:throw new Error(`Chain ${t} is not supported`)}};
2
+
3
+ //# debugId=9D6CA13C6DE1B3EC64756E2164756E21
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/substrate/toolbox/baseSubstrateToolbox.ts", "../src/substrate/types/network.ts", "../src/substrate/toolbox/index.ts"],
4
+ "sourcesContent": [
5
+ "import type { ApiPromise } from \"@polkadot/api\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { Callback, IKeyringPair, ISubmittableResult, Signer } from \"@polkadot/types/types\";\nimport { hexToU8a, isHex, u8aToHex } from \"@polkadot/util\";\nimport {\n decodeAddress as decodePolkadotAddress,\n encodeAddress as encodePolkadotAddress,\n} from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n SKConfig,\n type SubstrateChain,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\n\nimport { Network, type SubstrateNetwork } from \"../types/network\";\n\n// TODO combine this type with the more general SK type\ntype SubstrateTransferParams = {\n recipient: string;\n assetValue: AssetValue;\n from?: string;\n};\n\nexport const isKeyringPair = (account: IKeyringPair | Signer): account is IKeyringPair => {\n return \"address\" in account;\n};\n\nexport const createKeyring = async (phrase: string, networkPrefix: number) => {\n const { Keyring } = await import(\"@polkadot/api\");\n const { cryptoWaitReady } = await import(\"@polkadot/util-crypto\");\n await cryptoWaitReady();\n\n return new Keyring({ type: \"sr25519\", ss58Format: networkPrefix }).addFromUri(phrase);\n};\n\nconst getNonce = (api: ApiPromise, address: string) => api.rpc.system.accountNextIndex(address);\n\nconst getBalance = async (api: ApiPromise, gasAsset: AssetValue, address: string) => {\n const data = await api.query.system?.account?.(address);\n\n // @ts-expect-error @Towan some parts of data missing?\n if (!data?.data?.free || data?.data?.isEmpty) {\n return [gasAsset.set(0)];\n }\n\n return [\n gasAsset.set(\n // @ts-expect-error @Towan some parts of data missing?\n SwapKitNumber.fromBigInt(BigInt(data.data.free.toString()), gasAsset.decimal).getValue(\n \"string\",\n ),\n ),\n ];\n};\n\nconst validateAddress = (address: string, networkPrefix: number) => {\n try {\n const decodedAddress = decodeAddress(address, networkPrefix);\n\n encodeAddress(decodedAddress, \"ss58\", networkPrefix);\n\n return true;\n } catch (_error) {\n return false;\n }\n};\n\nconst createTransfer = (\n api: ApiPromise,\n { recipient, amount }: { recipient: string; amount: number },\n) => api.tx.balances?.transferAllowDeath?.(recipient, amount);\n\nconst transfer = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n { recipient, assetValue, from }: SubstrateTransferParams,\n) => {\n const transfer = createTransfer(api, {\n recipient,\n amount: assetValue.getBaseValue(\"number\"),\n });\n\n const isKeyring = isKeyringPair(signer);\n\n if (!transfer) return;\n\n const address = from || (isKeyring ? (signer as IKeyringPair).address : undefined);\n if (!address) throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n\n const nonce = await getNonce(api, address);\n\n const tx = await transfer.signAndSend(isKeyring ? signer : address, {\n signer: isKeyring ? undefined : signer,\n nonce,\n });\n\n return tx?.toString();\n};\n\nconst estimateTransactionFee = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n gasAsset: AssetValue,\n { recipient, assetValue, from }: SubstrateTransferParams,\n) => {\n const transfer = createTransfer(api, { recipient, amount: assetValue.getBaseValue(\"number\") });\n\n const address = from || (isKeyringPair(signer) && signer.address);\n if (!address) return;\n\n const paymentInfo = (await transfer?.paymentInfo(address, {\n nonce: await getNonce(api, address),\n })) || { partialFee: 0 };\n return gasAsset.set(\n SwapKitNumber.fromBigInt(BigInt(paymentInfo.partialFee.toString()), gasAsset.decimal).getValue(\n \"string\",\n ),\n );\n};\n\nconst broadcast = async (\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\n if (callback) return tx.send(callback);\n const hash = await tx.send();\n return hash.toString();\n};\n\nconst sign = async (signer: IKeyringPair, tx: SubmittableExtrinsic<\"promise\">) => {\n const signedTx = await tx.signAsync(signer);\n return signedTx;\n};\n\nconst signAndBroadcastKeyring = (\n signer: IKeyringPair,\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\n if (callback) return tx.signAndSend(signer, callback);\n const hash = tx.signAndSend(signer);\n return hash.toString();\n};\n\nconst signAndBroadcast = async ({\n signer,\n address,\n tx,\n callback,\n api,\n}: {\n signer: Signer;\n address: string;\n tx: SubmittableExtrinsic<\"promise\">;\n api: ApiPromise;\n callback?: Callback<ISubmittableResult>;\n}) => {\n const nonce = await getNonce(api, address);\n if (callback) {\n tx.signAndSend(address, { nonce, signer }, callback);\n }\n const hash = tx.signAndSend(address, { nonce, signer });\n return hash.toString();\n};\n\nfunction convertAddress(address: string, newPrefix: number) {\n const decodedAddress = decodePolkadotAddress(address);\n const convertedAddress = encodePolkadotAddress(decodedAddress, newPrefix);\n return convertedAddress;\n}\n\nfunction decodeAddress(address: string, networkPrefix?: number) {\n return isHex(address)\n ? hexToU8a(address)\n : decodePolkadotAddress(address, undefined, networkPrefix);\n}\n\nfunction encodeAddress(\n address: Uint8Array,\n encoding: \"ss58\" | \"hex\" = \"ss58\",\n networkPrefix?: number,\n) {\n if (encoding === \"hex\") {\n return u8aToHex(address);\n }\n\n return encodePolkadotAddress(address, networkPrefix);\n}\n\nexport const BaseSubstrateToolbox = ({\n api,\n network,\n gasAsset,\n signer,\n}: {\n api: ApiPromise;\n network: SubstrateNetwork;\n gasAsset: AssetValue;\n signer: IKeyringPair | Signer;\n}) => ({\n api,\n network,\n gasAsset,\n decodeAddress,\n encodeAddress,\n convertAddress,\n createKeyring: (phrase: string) => createKeyring(phrase, network.prefix),\n getAddress: (keyring: IKeyringPair | Signer = signer) =>\n isKeyringPair(keyring) ? keyring.address : undefined,\n createTransfer: ({ recipient, assetValue }: { recipient: string; assetValue: AssetValue }) =>\n createTransfer(api, { recipient, amount: assetValue.getBaseValue(\"number\") }),\n getBalance: (address: string) => getBalance(api, gasAsset, address),\n validateAddress: (address: string) => validateAddress(address, network.prefix),\n transfer: (params: SubstrateTransferParams) => transfer(api, signer, params),\n estimateTransactionFee: (params: SubstrateTransferParams) =>\n estimateTransactionFee(api, signer, gasAsset, params),\n sign: (tx: SubmittableExtrinsic<\"promise\">) => {\n if (isKeyringPair(signer)) {\n return sign(signer, tx);\n }\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n broadcast: (tx: SubmittableExtrinsic<\"promise\">, callback?: Callback<ISubmittableResult>) =>\n broadcast(tx, callback),\n signAndBroadcast: ({\n tx,\n callback,\n address,\n }: {\n tx: SubmittableExtrinsic<\"promise\">;\n callback?: Callback<ISubmittableResult>;\n address?: string;\n }) => {\n if (isKeyringPair(signer)) {\n return signAndBroadcastKeyring(signer, tx, callback);\n }\n\n if (address) {\n return signAndBroadcast({ signer, address, tx, callback, api });\n }\n\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n});\n\nexport const substrateValidateAddress = ({\n address,\n chain,\n}: { address: string; chain: Chain.Polkadot | Chain.Chainflip }) => {\n const { prefix } = chain === Chain.Polkadot ? Network.DOT : Network.FLIP;\n\n return validateAddress(address, prefix) || validateAddress(address, Network.GENERIC.prefix);\n};\n\nexport async function ToolboxFactory({\n generic,\n chain,\n signer,\n}: ToolboxParams & { chain: SubstrateChain }) {\n const { ApiPromise, WsProvider } = await import(\"@polkadot/api\");\n\n const provider = new WsProvider(SKConfig.get(\"rpcUrls\")[chain]);\n const api = await ApiPromise.create({ provider });\n const gasAsset = AssetValue.from({ chain });\n const network = generic ? Network.GENERIC : Network[chain];\n\n return BaseSubstrateToolbox({ api, signer, gasAsset, network });\n}\n\nexport type ToolboxParams = {\n generic?: boolean;\n signer: KeyringPair | Signer;\n};\n\nexport type BaseSubstrateWallet = ReturnType<typeof BaseSubstrateToolbox>;\nexport type SubstrateWallets = {\n [chain in SubstrateChain]: BaseSubstrateWallet;\n};\n",
6
+ "import type { SubstrateChain } from \"@swapkit/helpers\";\n\nexport const polkadotNetwork = {\n prefix: 0,\n network: \"polkadot\",\n displayName: \"Polkadot Relay Chain\",\n symbols: [\"DOT\"],\n decimals: [10],\n standardAccount: \"*25519\",\n website: \"https://polkadot.network\",\n};\n\nexport const chainflipNetwork = {\n prefix: 2112,\n network: \"chainflip\",\n displayName: \"Chainflip\",\n symbols: [\"FLIP\"],\n decimals: [18],\n standardAccount: \"*25519\",\n website: \"https://chainflip.io/\",\n};\n\nexport const subtrateNetwork = {\n prefix: 42,\n network: \"substrate\",\n displayName: \"Substrate\",\n symbols: [],\n decimals: [],\n standardAccount: \"*25519\",\n website: \"https://substrate.io/\",\n};\n\nexport const Network: Record<SubstrateChain | \"GENERIC\", SubstrateNetwork> = {\n DOT: polkadotNetwork,\n FLIP: chainflipNetwork,\n GENERIC: subtrateNetwork,\n};\n\nexport type SubstrateNetwork =\n | typeof polkadotNetwork\n | typeof chainflipNetwork\n | typeof subtrateNetwork;\n",
7
+ "import { AssetValue, Chain } from \"@swapkit/helpers\";\n\nimport { ToolboxFactory, type ToolboxParams } from \"./baseSubstrateToolbox\";\n\nexport const PolkadotToolbox = ({ signer, generic = false }: ToolboxParams) => {\n return ToolboxFactory({ chain: Chain.Polkadot, generic, signer });\n};\n\nexport const ChainflipToolbox = async ({ signer, generic = false }: ToolboxParams) => {\n const toolbox = await ToolboxFactory({ chain: Chain.Chainflip, generic, signer });\n\n async function getBalance(address: string) {\n // @ts-expect-error @Towan some parts of data missing?\n // biome-ignore lint/correctness/noUnsafeOptionalChaining: @Towan some parts of data missing?\n const { balance } = await toolbox.api.query.flip?.account?.(address);\n\n return [AssetValue.from({ chain: Chain.Chainflip, value: BigInt(balance.toString()) })];\n }\n\n return { ...toolbox, getBalance };\n};\n\ntype ToolboxType = {\n DOT: ReturnType<typeof PolkadotToolbox>;\n FLIP: ReturnType<typeof ChainflipToolbox>;\n};\n\nexport const getToolboxByChain = <T extends keyof ToolboxType>(\n chain: T,\n params: ToolboxParams,\n): ToolboxType[T] => {\n switch (chain) {\n case Chain.Chainflip:\n return ChainflipToolbox(params);\n case Chain.Polkadot:\n return PolkadotToolbox(params);\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n};\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "9D6CA13C6DE1B3EC64756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,3 @@
1
+ import{a as E,b as R}from"../chunk-tvrdndbw.js";import{hexToU8a as U,isHex as X,u8aToHex as Y}from"@polkadot/util";import{decodeAddress as H,encodeAddress as O}from"@polkadot/util-crypto";import{AssetValue as Z,Chain as _,SKConfig as $,SwapKitError as L,SwapKitNumber as S}from"@swapkit/helpers";var F={prefix:0,network:"polkadot",displayName:"Polkadot Relay Chain",symbols:["DOT"],decimals:[10],standardAccount:"*25519",website:"https://polkadot.network"},J={prefix:2112,network:"chainflip",displayName:"Chainflip",symbols:["FLIP"],decimals:[18],standardAccount:"*25519",website:"https://chainflip.io/"},Q={prefix:42,network:"substrate",displayName:"Substrate",symbols:[],decimals:[],standardAccount:"*25519",website:"https://substrate.io/"},p={DOT:F,FLIP:J,GENERIC:Q};var M=(t)=>{return"address"in t},C=async(t,o)=>{let{Keyring:I}=await import("@polkadot/api"),{cryptoWaitReady:m}=await import("@polkadot/util-crypto");return await m(),new I({type:"sr25519",ss58Format:o}).addFromUri(t)},P=(t,o)=>t.rpc.system.accountNextIndex(o),b=async(t,o,I)=>{let m=await t.query.system?.account?.(I);if(!m?.data?.free||m?.data?.isEmpty)return[o.set(0)];return[o.set(S.fromBigInt(BigInt(m.data.free.toString()),o.decimal).getValue("string"))]},N=(t,o)=>{try{let I=q(t,o);return z(I,"ss58",o),!0}catch(I){return!1}},W=(t,{recipient:o,amount:I})=>t.tx.balances?.transferAllowDeath?.(o,I),B=async(t,o,{recipient:I,assetValue:m,from:j})=>{let v=W(t,{recipient:I,amount:m.getBaseValue("number")}),f=M(o);if(!v)return;let y=j||(f?o.address:void 0);if(!y)throw new L("core_transaction_invalid_sender_address");let u=await P(t,y);return(await v.signAndSend(f?o:y,{signer:f?void 0:o,nonce:u}))?.toString()},h=async(t,o,I,{recipient:m,assetValue:j,from:v})=>{let f=W(t,{recipient:m,amount:j.getBaseValue("number")}),y=v||M(o)&&o.address;if(!y)return;let u=await f?.paymentInfo(y,{nonce:await P(t,y)})||{partialFee:0};return I.set(S.fromBigInt(BigInt(u.partialFee.toString()),I.decimal).getValue("string"))},T=async(t,o)=>{if(o)return t.send(o);return(await t.send()).toString()},x=async(t,o)=>{return await o.signAsync(t)},V=(t,o,I)=>{if(I)return o.signAndSend(t,I);return o.signAndSend(t).toString()},n=async({signer:t,address:o,tx:I,callback:m,api:j})=>{let v=await P(j,o);if(m)I.signAndSend(o,{nonce:v,signer:t},m);return I.signAndSend(o,{nonce:v,signer:t}).toString()};function c(t,o){let I=H(t);return O(I,o)}function q(t,o){return X(t)?U(t):H(t,void 0,o)}function z(t,o="ss58",I){if(o==="hex")return Y(t);return O(t,I)}var w=({api:t,network:o,gasAsset:I,signer:m})=>({api:t,network:o,gasAsset:I,decodeAddress:q,encodeAddress:z,convertAddress:c,createKeyring:(j)=>C(j,o.prefix),getAddress:(j=m)=>M(j)?j.address:void 0,createTransfer:({recipient:j,assetValue:v})=>W(t,{recipient:j,amount:v.getBaseValue("number")}),getBalance:(j)=>b(t,I,j),validateAddress:(j)=>N(j,o.prefix),transfer:(j)=>B(t,m,j),estimateTransactionFee:(j)=>h(t,m,I,j),sign:(j)=>{if(M(m))return x(m,j);throw new L("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},broadcast:(j,v)=>T(j,v),signAndBroadcast:({tx:j,callback:v,address:f})=>{if(M(m))return V(m,j,v);if(f)return n({signer:m,address:f,tx:j,callback:v,api:t});throw new L("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")}}),a=({address:t,chain:o})=>{let{prefix:I}=o===_.Polkadot?p.DOT:p.FLIP;return N(t,I)||N(t,p.GENERIC.prefix)};async function G({generic:t,chain:o,signer:I}){let{ApiPromise:m,WsProvider:j}=await import("@polkadot/api"),v=new j($.get("rpcUrls")[o]),f=await m.create({provider:v}),y=Z.from({chain:o}),u=t?p.GENERIC:p[o];return w({api:f,signer:I,gasAsset:y,network:u})}import{AssetValue as K,Chain as D}from"@swapkit/helpers";var e=({signer:t,generic:o=!1})=>{return G({chain:D.Polkadot,generic:o,signer:t})},A=async({signer:t,generic:o=!1})=>{let I=await G({chain:D.Chainflip,generic:o,signer:t});async function m(j){let{balance:v}=await I.api.query.flip?.account?.(j);return[K.from({chain:D.Chainflip,value:BigInt(v.toString())})]}return{...I,getBalance:m}},It=(t,o)=>{switch(t){case D.Chainflip:return A(o);case D.Polkadot:return e(o);default:throw new Error(`Chain ${t} is not supported`)}};export{Q as subtrateNetwork,a as substrateValidateAddress,F as polkadotNetwork,M as isKeyringPair,It as getToolboxByChain,C as createKeyring,J as chainflipNetwork,G as ToolboxFactory,e as PolkadotToolbox,p as Network,A as ChainflipToolbox,w as BaseSubstrateToolbox};
2
+
3
+ //# debugId=DE2E7792AC99696464756E2164756E21
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/substrate/toolbox/baseSubstrateToolbox.ts", "../src/substrate/types/network.ts", "../src/substrate/toolbox/index.ts"],
4
+ "sourcesContent": [
5
+ "import type { ApiPromise } from \"@polkadot/api\";\nimport type { SubmittableExtrinsic } from \"@polkadot/api/types\";\nimport type { KeyringPair } from \"@polkadot/keyring/types\";\nimport type { Callback, IKeyringPair, ISubmittableResult, Signer } from \"@polkadot/types/types\";\nimport { hexToU8a, isHex, u8aToHex } from \"@polkadot/util\";\nimport {\n decodeAddress as decodePolkadotAddress,\n encodeAddress as encodePolkadotAddress,\n} from \"@polkadot/util-crypto\";\nimport {\n AssetValue,\n Chain,\n SKConfig,\n type SubstrateChain,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\n\nimport { Network, type SubstrateNetwork } from \"../types/network\";\n\n// TODO combine this type with the more general SK type\ntype SubstrateTransferParams = {\n recipient: string;\n assetValue: AssetValue;\n from?: string;\n};\n\nexport const isKeyringPair = (account: IKeyringPair | Signer): account is IKeyringPair => {\n return \"address\" in account;\n};\n\nexport const createKeyring = async (phrase: string, networkPrefix: number) => {\n const { Keyring } = await import(\"@polkadot/api\");\n const { cryptoWaitReady } = await import(\"@polkadot/util-crypto\");\n await cryptoWaitReady();\n\n return new Keyring({ type: \"sr25519\", ss58Format: networkPrefix }).addFromUri(phrase);\n};\n\nconst getNonce = (api: ApiPromise, address: string) => api.rpc.system.accountNextIndex(address);\n\nconst getBalance = async (api: ApiPromise, gasAsset: AssetValue, address: string) => {\n const data = await api.query.system?.account?.(address);\n\n // @ts-expect-error @Towan some parts of data missing?\n if (!data?.data?.free || data?.data?.isEmpty) {\n return [gasAsset.set(0)];\n }\n\n return [\n gasAsset.set(\n // @ts-expect-error @Towan some parts of data missing?\n SwapKitNumber.fromBigInt(BigInt(data.data.free.toString()), gasAsset.decimal).getValue(\n \"string\",\n ),\n ),\n ];\n};\n\nconst validateAddress = (address: string, networkPrefix: number) => {\n try {\n const decodedAddress = decodeAddress(address, networkPrefix);\n\n encodeAddress(decodedAddress, \"ss58\", networkPrefix);\n\n return true;\n } catch (_error) {\n return false;\n }\n};\n\nconst createTransfer = (\n api: ApiPromise,\n { recipient, amount }: { recipient: string; amount: number },\n) => api.tx.balances?.transferAllowDeath?.(recipient, amount);\n\nconst transfer = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n { recipient, assetValue, from }: SubstrateTransferParams,\n) => {\n const transfer = createTransfer(api, {\n recipient,\n amount: assetValue.getBaseValue(\"number\"),\n });\n\n const isKeyring = isKeyringPair(signer);\n\n if (!transfer) return;\n\n const address = from || (isKeyring ? (signer as IKeyringPair).address : undefined);\n if (!address) throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n\n const nonce = await getNonce(api, address);\n\n const tx = await transfer.signAndSend(isKeyring ? signer : address, {\n signer: isKeyring ? undefined : signer,\n nonce,\n });\n\n return tx?.toString();\n};\n\nconst estimateTransactionFee = async (\n api: ApiPromise,\n signer: IKeyringPair | Signer,\n gasAsset: AssetValue,\n { recipient, assetValue, from }: SubstrateTransferParams,\n) => {\n const transfer = createTransfer(api, { recipient, amount: assetValue.getBaseValue(\"number\") });\n\n const address = from || (isKeyringPair(signer) && signer.address);\n if (!address) return;\n\n const paymentInfo = (await transfer?.paymentInfo(address, {\n nonce: await getNonce(api, address),\n })) || { partialFee: 0 };\n return gasAsset.set(\n SwapKitNumber.fromBigInt(BigInt(paymentInfo.partialFee.toString()), gasAsset.decimal).getValue(\n \"string\",\n ),\n );\n};\n\nconst broadcast = async (\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\n if (callback) return tx.send(callback);\n const hash = await tx.send();\n return hash.toString();\n};\n\nconst sign = async (signer: IKeyringPair, tx: SubmittableExtrinsic<\"promise\">) => {\n const signedTx = await tx.signAsync(signer);\n return signedTx;\n};\n\nconst signAndBroadcastKeyring = (\n signer: IKeyringPair,\n tx: SubmittableExtrinsic<\"promise\">,\n callback?: Callback<ISubmittableResult>,\n) => {\n if (callback) return tx.signAndSend(signer, callback);\n const hash = tx.signAndSend(signer);\n return hash.toString();\n};\n\nconst signAndBroadcast = async ({\n signer,\n address,\n tx,\n callback,\n api,\n}: {\n signer: Signer;\n address: string;\n tx: SubmittableExtrinsic<\"promise\">;\n api: ApiPromise;\n callback?: Callback<ISubmittableResult>;\n}) => {\n const nonce = await getNonce(api, address);\n if (callback) {\n tx.signAndSend(address, { nonce, signer }, callback);\n }\n const hash = tx.signAndSend(address, { nonce, signer });\n return hash.toString();\n};\n\nfunction convertAddress(address: string, newPrefix: number) {\n const decodedAddress = decodePolkadotAddress(address);\n const convertedAddress = encodePolkadotAddress(decodedAddress, newPrefix);\n return convertedAddress;\n}\n\nfunction decodeAddress(address: string, networkPrefix?: number) {\n return isHex(address)\n ? hexToU8a(address)\n : decodePolkadotAddress(address, undefined, networkPrefix);\n}\n\nfunction encodeAddress(\n address: Uint8Array,\n encoding: \"ss58\" | \"hex\" = \"ss58\",\n networkPrefix?: number,\n) {\n if (encoding === \"hex\") {\n return u8aToHex(address);\n }\n\n return encodePolkadotAddress(address, networkPrefix);\n}\n\nexport const BaseSubstrateToolbox = ({\n api,\n network,\n gasAsset,\n signer,\n}: {\n api: ApiPromise;\n network: SubstrateNetwork;\n gasAsset: AssetValue;\n signer: IKeyringPair | Signer;\n}) => ({\n api,\n network,\n gasAsset,\n decodeAddress,\n encodeAddress,\n convertAddress,\n createKeyring: (phrase: string) => createKeyring(phrase, network.prefix),\n getAddress: (keyring: IKeyringPair | Signer = signer) =>\n isKeyringPair(keyring) ? keyring.address : undefined,\n createTransfer: ({ recipient, assetValue }: { recipient: string; assetValue: AssetValue }) =>\n createTransfer(api, { recipient, amount: assetValue.getBaseValue(\"number\") }),\n getBalance: (address: string) => getBalance(api, gasAsset, address),\n validateAddress: (address: string) => validateAddress(address, network.prefix),\n transfer: (params: SubstrateTransferParams) => transfer(api, signer, params),\n estimateTransactionFee: (params: SubstrateTransferParams) =>\n estimateTransactionFee(api, signer, gasAsset, params),\n sign: (tx: SubmittableExtrinsic<\"promise\">) => {\n if (isKeyringPair(signer)) {\n return sign(signer, tx);\n }\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n broadcast: (tx: SubmittableExtrinsic<\"promise\">, callback?: Callback<ISubmittableResult>) =>\n broadcast(tx, callback),\n signAndBroadcast: ({\n tx,\n callback,\n address,\n }: {\n tx: SubmittableExtrinsic<\"promise\">;\n callback?: Callback<ISubmittableResult>;\n address?: string;\n }) => {\n if (isKeyringPair(signer)) {\n return signAndBroadcastKeyring(signer, tx, callback);\n }\n\n if (address) {\n return signAndBroadcast({ signer, address, tx, callback, api });\n }\n\n throw new SwapKitError(\n \"core_wallet_not_keypair_wallet\",\n \"Signer does not have keyring pair capabilities required for signing.\",\n );\n },\n});\n\nexport const substrateValidateAddress = ({\n address,\n chain,\n}: { address: string; chain: Chain.Polkadot | Chain.Chainflip }) => {\n const { prefix } = chain === Chain.Polkadot ? Network.DOT : Network.FLIP;\n\n return validateAddress(address, prefix) || validateAddress(address, Network.GENERIC.prefix);\n};\n\nexport async function ToolboxFactory({\n generic,\n chain,\n signer,\n}: ToolboxParams & { chain: SubstrateChain }) {\n const { ApiPromise, WsProvider } = await import(\"@polkadot/api\");\n\n const provider = new WsProvider(SKConfig.get(\"rpcUrls\")[chain]);\n const api = await ApiPromise.create({ provider });\n const gasAsset = AssetValue.from({ chain });\n const network = generic ? Network.GENERIC : Network[chain];\n\n return BaseSubstrateToolbox({ api, signer, gasAsset, network });\n}\n\nexport type ToolboxParams = {\n generic?: boolean;\n signer: KeyringPair | Signer;\n};\n\nexport type BaseSubstrateWallet = ReturnType<typeof BaseSubstrateToolbox>;\nexport type SubstrateWallets = {\n [chain in SubstrateChain]: BaseSubstrateWallet;\n};\n",
6
+ "import type { SubstrateChain } from \"@swapkit/helpers\";\n\nexport const polkadotNetwork = {\n prefix: 0,\n network: \"polkadot\",\n displayName: \"Polkadot Relay Chain\",\n symbols: [\"DOT\"],\n decimals: [10],\n standardAccount: \"*25519\",\n website: \"https://polkadot.network\",\n};\n\nexport const chainflipNetwork = {\n prefix: 2112,\n network: \"chainflip\",\n displayName: \"Chainflip\",\n symbols: [\"FLIP\"],\n decimals: [18],\n standardAccount: \"*25519\",\n website: \"https://chainflip.io/\",\n};\n\nexport const subtrateNetwork = {\n prefix: 42,\n network: \"substrate\",\n displayName: \"Substrate\",\n symbols: [],\n decimals: [],\n standardAccount: \"*25519\",\n website: \"https://substrate.io/\",\n};\n\nexport const Network: Record<SubstrateChain | \"GENERIC\", SubstrateNetwork> = {\n DOT: polkadotNetwork,\n FLIP: chainflipNetwork,\n GENERIC: subtrateNetwork,\n};\n\nexport type SubstrateNetwork =\n | typeof polkadotNetwork\n | typeof chainflipNetwork\n | typeof subtrateNetwork;\n",
7
+ "import { AssetValue, Chain } from \"@swapkit/helpers\";\n\nimport { ToolboxFactory, type ToolboxParams } from \"./baseSubstrateToolbox\";\n\nexport const PolkadotToolbox = ({ signer, generic = false }: ToolboxParams) => {\n return ToolboxFactory({ chain: Chain.Polkadot, generic, signer });\n};\n\nexport const ChainflipToolbox = async ({ signer, generic = false }: ToolboxParams) => {\n const toolbox = await ToolboxFactory({ chain: Chain.Chainflip, generic, signer });\n\n async function getBalance(address: string) {\n // @ts-expect-error @Towan some parts of data missing?\n // biome-ignore lint/correctness/noUnsafeOptionalChaining: @Towan some parts of data missing?\n const { balance } = await toolbox.api.query.flip?.account?.(address);\n\n return [AssetValue.from({ chain: Chain.Chainflip, value: BigInt(balance.toString()) })];\n }\n\n return { ...toolbox, getBalance };\n};\n\ntype ToolboxType = {\n DOT: ReturnType<typeof PolkadotToolbox>;\n FLIP: ReturnType<typeof ChainflipToolbox>;\n};\n\nexport const getToolboxByChain = <T extends keyof ToolboxType>(\n chain: T,\n params: ToolboxParams,\n): ToolboxType[T] => {\n switch (chain) {\n case Chain.Chainflip:\n return ChainflipToolbox(params);\n case Chain.Polkadot:\n return PolkadotToolbox(params);\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n};\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "DE2E7792AC99696464756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,3 @@
1
+ var iX={};dX(iX,{validateAddress:()=>E,uniqid:()=>XX,toLegacyAddress:()=>A,toCashAddress:()=>f,stripToCashAddress:()=>g,stripPrefix:()=>R,standardFeeRates:()=>e,nonSegwitChains:()=>h,isValidAddress:()=>ZX,getUtxoNetwork:()=>O,getUtxoApi:()=>F,getToolboxByChain:()=>cX,getScriptTypeForAddress:()=>l,getOutputSize:()=>m,getInputSize:()=>N,getDustThreshold:()=>d,getAddressValidator:()=>vX,detectAddressNetwork:()=>GX,createUTXOToolbox:()=>p,createCustomUtxoApi:()=>kX,compileMemo:()=>k,calculateTxSize:()=>S,buildTx:()=>LX,accumulative:()=>w,UTXOScriptType:()=>i,TX_OVERHEAD:()=>WX,OutputSizes:()=>o,OP_RETURN_OVERHEAD:()=>RX,Network:()=>QX,MIN_TX_FEE:()=>SX,InputSizes:()=>a});module.exports=nX(iX);var x=require("@swapkit/helpers");var y=require("@swapkit/helpers");var H=require("@swapkit/helpers");var V=require("@swapkit/helpers"),CX=typeof process!=="undefined"&&process.pid?process.pid.toString(36):"";async function O(){let{coininfo:X}=await import("coininfo"),{networks:$}=await import("bitcoinjs-lib");return function J(Q){switch(Q){case V.Chain.Bitcoin:return $.bitcoin;case V.Chain.BitcoinCash:return X.bitcoincash.main.toBitcoinJS();case V.Chain.Dash:return X.dash.main.toBitcoinJS();case V.Chain.Litecoin:return X.litecoin.main.toBitcoinJS();case V.Chain.Dogecoin:{let Z={private:70615956,public:70617039},G=X.dogecoin.test;return G.versions.bip32=Z,X.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}var e=(X)=>({[V.FeeOption.Average]:X,[V.FeeOption.Fast]:X*1.5,[V.FeeOption.Fastest]:X*2}),t=0,IX=()=>{let X=Date.now(),$=t||X;return t=$,X>t?X:$+1},XX=()=>CX+IX().toString(36);async function TX({chain:X,txHash:$}){let J=H.SKConfig.get("rpcUrls")[X],Q=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[$],id:XX()}),Z=await H.RequestClient.post(J,{headers:{"Content-Type":"application/json"},body:Q});if(Z.error)throw new Error(`failed to broadcast a transaction: ${Z.error?.message}`);if(Z.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Z.result}function r(X){return`https://api.blockchair.com/${_X(X)}`}function qX(X){switch(X){case H.Chain.Bitcoin:return 5;case H.Chain.Dogecoin:return 1e4;case H.Chain.Litecoin:return 1;default:return 2}}function _X(X){switch(X){case H.Chain.BitcoinCash:return"bitcoin-cash";case H.Chain.Litecoin:return"litecoin";case H.Chain.Dash:return"dash";case H.Chain.Dogecoin:return"dogecoin";case H.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function OX(X){try{let{feePerKb:$}=await H.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),J=$/1000;return Math.max(J,qX(X))}catch($){return qX(X)}}async function c(X,$){try{let J=await H.RequestClient.get(X);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}catch(J){if(!$)throw J;let Q=await H.RequestClient.get(`${X}${$?`&key=${$}`:""}`);if(!Q||Q.context.code!==200)throw new Error(`failed to query ${X}`);return Q.data}}async function DX({address:X,chain:$,apiKey:J}){if(!X)throw new Error("address is required");try{return(await c(`${r($)}/dashboards/address/${X}?transaction_details=true`,J))[X]}catch(Q){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function FX({address:X,chain:$,apiKey:J}){return(await DX({address:X,chain:$,apiKey:J}))?.address.balance||0}async function VX({chain:X,address:$,apiKey:J}){if(!$)throw new Error("address is required");try{return(await c(`${r(X)}/addresses/balances?addresses=${$}`,J))[$]||0}catch(Q){return 0}}async function UX({chain:X,apiKey:$,txHash:J}){if(!J)throw new Error("txHash is required");try{return(await c(`${r(X)}/raw/transaction/${J}`,$))?.[J]?.raw_transaction||""}catch(Q){return console.error(Q),""}}async function KX({chain:X,address:$,apiKey:J,offset:Q=0,limit:Z=100}){return(await c(`${r(X)}/outputs?q=is_spent(false),recipient(${$})&limit=${Z}&offset=${Q}`,J)).filter(({is_spent:L})=>!L).map(({script_hex:L,block_id:q,transaction_hash:j,index:D,value:U,spending_signature_hex:M})=>({hash:j,index:D,value:U,txHex:M,script_hex:L,is_confirmed:q!==-1}))}async function MX({chain:X,address:$,apiKey:J,offset:Q=0,limit:Z=100}){if(!$)throw new Error("address is required");try{let G=await KX({chain:X,address:$,apiKey:J,offset:Q,limit:Z});if(G.length<=Z)return G;let W=await MX({chain:X,address:$,apiKey:J,offset:Q+Z,limit:Z});return[...G,...W]}catch(G){return console.error(G),[]}}async function NX({address:X,chain:$,apiKey:J,fetchTxHex:Q=!0}){let Z=await MX({chain:$,address:X,apiKey:J}),G=[];for(let{hash:W,index:L,script_hex:q,value:j}of Z){let D;if(Q)D=await UX({txHash:W,chain:$,apiKey:J});G.push({address:X,hash:W,index:L,txHex:D,value:j,witnessUtxo:{value:j,script:Buffer.from(q,"hex")}})}return G}function wX(X){let $=H.SKConfig.get("apiKeys").blockchair||"";return H.warnOnce(!$,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(J)=>TX({txHash:J,chain:X}),getConfirmedBalance:(J)=>VX({chain:X,address:J,apiKey:$}),getRawTx:(J)=>UX({txHash:J,chain:X,apiKey:$}),getSuggestedTxFee:()=>OX(X),getBalance:(J)=>FX({address:J,chain:X,apiKey:$}),getAddressData:(J)=>DX({address:J,chain:X,apiKey:$}),scanUTXOs:(J)=>NX({...J,chain:X,apiKey:$})}}function kX(X){return X}function F(X){let $=H.SKConfig.get("apis")[X];if($)return H.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),$;return wX(X)}var $X=Y(require("bs58check")),JX=Y(require("cashaddrjs"));var QX;((J)=>{J.Mainnet="mainnet";J.Testnet="testnet"})(QX||={});var P={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function ZX(X){try{return n(X),!0}catch($){return!1}}function GX(X){return n(X)?.network}function A(X){let $=n(X);if($?.format==="legacy")return X;return yX($)}function f(X){let $=n(X);return AX($)}function n(X){try{return bX(X)}catch($){}try{return EX(X)}catch($){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function bX(X){try{let $=$X.default.decode(X);if($.length!==21)throw new Error("Received an invalid Bitcoin Cash address as input.");let J=$[0],Q=Array.prototype.slice.call($,1);switch(J){case P.legacy.mainnet.p2pkh:return{hash:Q,format:"legacy",network:"mainnet",type:"p2pkh"};case P.legacy.mainnet.p2sh:return{hash:Q,format:"legacy",network:"mainnet",type:"p2sh"};case P.legacy.testnet.p2pkh:return{hash:Q,format:"legacy",network:"testnet",type:"p2pkh"};case P.legacy.testnet.p2sh:return{hash:Q,format:"legacy",network:"testnet",type:"p2sh"};case P.bitpay.mainnet.p2pkh:return{hash:Q,format:"bitpay",network:"mainnet",type:"p2pkh"};case P.bitpay.mainnet.p2sh:return{hash:Q,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new Error("Received an invalid Bitcoin Cash address as input.")}}catch($){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function EX(X){if(X.indexOf(":")!==-1)try{return PX(X)}catch($){}else{let $=["bitcoincash","bchtest","bchreg"];for(let J of $)try{return PX(`${J}:${X}`)}catch(Q){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function PX(X){try{let{hash:$,prefix:J,type:Q}=JX.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call($,0),network:J==="bitcoincash"?"mainnet":"testnet",type:Q==="P2PKH"?"p2pkh":"p2sh"}}catch($){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function yX(X){let $=P.legacy[X.network][X.type],J=Buffer.alloc(1+X.hash.length);return J[0]=$,J.set(X.hash,1),$X.default.encode(J)}function AX(X){let $=X.network==="mainnet"?"bitcoincash":"bchtest",J=X.type==="p2pkh"?"P2PKH":"P2SH",Q=new Uint8Array(X.hash);return JX.default.encode($,J,Q)}var b=require("@swapkit/helpers");var d=(X)=>{switch(X){case b.Chain.Bitcoin:case b.Chain.BitcoinCash:return 550;case b.Chain.Dash:case b.Chain.Litecoin:return 5500;case b.Chain.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},w=({inputs:X,outputs:$,feeRate:J=1,chain:Q=b.Chain.Bitcoin})=>{let Z=Math.ceil(J),G=X[0]&&"address"in X[0]&&X[0].address?l(X[0].address):"P2PKH",W=X.filter((M)=>N(M)*Z<=M.value),L=WX+$.reduce((M,C)=>M+m(C,G),0),q=$.reduce((M,C)=>M+C.value,0),j=L*Z,D=0,U=[];for(let M of W){let C=N(M),v=Z*C;j+=v,D+=M.value,U.push(M);let z=j+q;if(D<z)continue;let _=D-z,T=Z*m({address:"",value:0},G);if(_>T){let I=T+j,u=D-(q+I);if(u>Math.max(N({})*Z,d(Q)))return{inputs:U,outputs:$.concat({value:u,address:""}),fee:I}}return{inputs:U,outputs:$,fee:j}}return{fee:Z*S({inputs:X,outputs:$,feeRate:Z})}};var SX=1000,WX=10,RX=10;async function k(X){let{script:$,opcodes:J}=await import("bitcoinjs-lib"),Q=Buffer.from(X,"utf8");return $.compile([J.OP_RETURN,Q])}var i;((J)=>{J.P2PKH="P2PKH";J.P2WPKH="P2WPKH"})(i||={});var a={["P2PKH"]:148,["P2WPKH"]:68},o={["P2PKH"]:34,["P2WPKH"]:31},l=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},S=({inputs:X,outputs:$,feeRate:J})=>{let Q=X[0]&&"address"in X[0]&&X[0].address?l(X[0].address):"P2PKH",Z=X.filter((W)=>W.value>=a["type"in W?W.type:"P2PKH"]*Math.ceil(J)).reduce((W,L)=>W+N(L),0),G=$?.reduce((W,L)=>W+m(L),0)||o[Q];return 10+Z+G},N=(X)=>{if("type"in X)return a[X.type];if("address"in X&&X.address)return a[l(X.address)];return 148},m=(X,$)=>{if(X?.script)return 10+X.script.length+(X.script.length>=74?2:1);if($)return o[$];return o.P2PKH};var B=require("@swapkit/helpers");var h=[B.Chain.Dash,B.Chain.Dogecoin];function LX(X){return async function $({assetValue:J,recipient:Q,memo:Z,feeRate:G,sender:W,fetchTxHex:L=!1}){let q=await import("@bitcoinerlab/secp256k1"),{initEccLib:j,Psbt:D}=await import("bitcoinjs-lib"),U=Z?await k(Z):null,C=await HX(X)({assetValue:J,recipient:Q,memo:Z,sender:W,fetchTxHex:L}),{inputs:v,outputs:z}=w({...C,feeRate:G,chain:X});if(!(v&&z))throw new Error("Insufficient Balance for transaction");let _=await O(),T=new D({network:_(X)});if(X===B.Chain.Dogecoin)T.setMaximumFeeRate(650000000);for(let I of v)T.addInput({hash:I.hash,index:I.index,...!!I.witnessUtxo&&!h.includes(X)&&{witnessUtxo:I.witnessUtxo},...h.includes(X)&&{nonWitnessUtxo:I.txHex?Buffer.from(I.txHex,"hex"):void 0}});for(let I of z){let u="address"in I&&I.address?I.address:W,jX=I.script?U?{script:U,value:0}:void 0:{address:u,value:I.value};if(jX)j(q),T.addOutput(jX)}return{psbt:T,utxos:C.inputs,inputs:v}}}async function vX(){let X=await import("@bitcoinerlab/secp256k1"),{initEccLib:$,address:J}=await import("bitcoinjs-lib"),Q=await O();return function Z({chain:G,address:W}){if(G===B.Chain.BitcoinCash)return E(W);return function L(q){try{return $(X),J.toOutputScript(q,Q(G)),!0}catch(j){return!1}}}}async function p(X){let $=await mX(X),J=await vX(),Q=await fX(X);return function Z(){return{accumulative:w,calculateTxSize:S,getAddressFromKeys:$,validateAddress:(G)=>J({chain:X,address:G}),broadcastTx:(G)=>F(X).broadcastTx(G),buildTx:LX(X),createKeysForPath:Q,getFeeRates:()=>s(X),getInputsOutputsFee:zX(X),transfer:lX(X),getPrivateKeyFromMnemonic:(G)=>{return Q(G).toWIF()},getBalance:oX(X),estimateTransactionFee:xX(X),estimateMaxSendableAmount:gX(X)}}}function zX(X){return async function $({assetValue:J,feeOptionKey:Q=B.FeeOption.Fast,feeRate:Z,fetchTxHex:G=!1,memo:W,recipient:L,from:q}){let D=await HX(X)({assetValue:J,recipient:L,memo:W,sender:q,fetchTxHex:G}),U=Z?Math.floor(Z):(await s(X))[Q];return w({...D,feeRate:U,chain:X})}}function gX(X){return async function $({from:J,memo:Q,feeRate:Z,feeOptionKey:G=B.FeeOption.Fast,recipients:W=1}){let L=await F(X).getAddressData(J),q=Z?Math.ceil(Z):(await s(X))[G],j=L?.utxo.map((v)=>({...v,type:"P2PKH",hash:""})).filter((v)=>v.value>Math.max(d(X),N(v)*q));if(!j?.length)return B.AssetValue.from({chain:X});let D=B.AssetValue.from({chain:X,value:j.reduce((v,z)=>v+z.value,0)}),U=typeof W==="number"?Array.from({length:W},()=>({address:J,value:0})):W;if(Q){let v=await k(Q);U.push({address:J,script:v,value:0})}let C=S({inputs:j,outputs:U,feeRate:q})*q;return D.sub(C)}}function xX(X){return async($)=>{let Q=await zX(X)($);return B.AssetValue.from({chain:X,value:B.SwapKitNumber.fromBigInt(BigInt(Q.fee),8).getValue("string")})}}async function fX(X){let{ECPairFactory:$}=await import("ecpair"),J=await import("@bitcoinerlab/secp256k1"),{HDKey:Q}=await import("@scure/bip32"),{mnemonicToSeedSync:Z}=await import("@scure/bip39"),G=await O();return function W({phrase:L,wif:q,derivationPath:j}){if(!(q||L))throw new Error("Either phrase or wif must be provided");let D=$(J),U=G(X);if(q)return D.fromWIF(q,U);let M=Z(L),C=Q.fromMasterSeed(M,U).derive(j);if(!C.privateKey)throw new Error("Could not get private key from phrase");return D.fromPrivateKey(Buffer.from(C.privateKey),{network:U})}}async function mX(X){let{payments:$}=await import("bitcoinjs-lib"),J=await O();return function Q(Z){if(!Z)throw new Error("Keys must be provided");let G=h.includes(X)?$.p2pkh:$.p2wpkh,{address:W}=G({pubkey:Z.publicKey,network:J(X)});if(!W)throw new Error("Address not defined");return W}}function lX(X){return async function $({signTransaction:J,from:Q,memo:Z,recipient:G,feeOptionKey:W,broadcastTx:L,feeRate:q,assetValue:j}){if(!Q)throw new Error("From address must be provided");if(!G)throw new Error("Recipient address must be provided");if(!J)throw new Error("Sign transaction must be provided");let D=q||(await s(X))[W||B.FeeOption.Fast],{psbt:U}=await LX(X)({recipient:G,feeRate:D,sender:Q,fetchTxHex:h.includes(X),assetValue:j,memo:Z}),M=await J(U);return M.finalizeAllInputs(),L(M.extractTransaction().toHex())}}function oX(X){return async function $(J,Q=!0){let Z=await F(X).getBalance(J),G=B.SwapKitNumber.fromBigInt(BigInt(Z),B.BaseDecimal[X]).getValue("string");return[B.AssetValue.from({asset:`${X}.${X}`,value:G})]}}async function s(X){let $=await F(X).getSuggestedTxFee();return e($)}function HX(X){return async function $({assetValue:J,recipient:Q,memo:Z,sender:G,fetchTxHex:W=!1}){return{inputs:await F(X).scanUTXOs({address:G,fetchTxHex:W}),outputs:[{address:Q,value:Number(J.bigIntValue)},...Z?[{address:"",script:await k(Z),value:0}]:[]]}}}var K=y.Chain.BitcoinCash;function R(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let $=R(X);return ZX($)&&GX($)==="mainnet"}function g(X){return R(f(X))}async function YX(){let{getBalance:X,getFeeRates:$,broadcastTx:J,...Q}=(await p(y.Chain.BitcoinCash))();function Z(G,W=!0){return X(R(f(G)))}return function G(){return{...Q,broadcastTx:J,buildBCHTx:BX,buildTx:pX,createKeysForPath:uX,getAddressFromKeys:rX,getBalance:Z,getFeeRates:$,stripPrefix:R,stripToCashAddress:g,validateAddress:E,transfer:hX({getFeeRates:$,broadcastTx:J})}}}async function BX({assetValue:X,recipient:$,memo:J,feeRate:Q,sender:Z}){let{Transaction:G,TransactionBuilder:W,address:L}=await import("@psf/bitcoincashjs-lib");if(!E($))throw new Error("Invalid address");let q=await F(K).scanUTXOs({address:g(Z),fetchTxHex:!0}),j=J?await k(J):null,D=[];D.push({address:$,value:X.getBaseValue("number")});let{inputs:U,outputs:M}=w({inputs:q,outputs:D,feeRate:Q,chain:K});if(!(U&&M))throw new Error("Balance insufficient for transaction");let C=await O(),v=new W(C(K));await Promise.all(U.map(async(z)=>{let _=await F(K).getRawTx(z.hash);v.addInput(G.fromBuffer(Buffer.from(_,"hex")),z.index)}));for(let z of M){let _="address"in z&&z.address?z.address:A(Z),T=await O(),I=L.toOutputScript(A(_),T(K));v.addOutput(I,z.value)}if(j)v.addOutput(j,0);return{builder:v,utxos:U}}function hX({broadcastTx:X,getFeeRates:$}){return async function J({signTransaction:Q,from:Z,recipient:G,assetValue:W,...L}){if(!Z)throw new Error("From address must be provided");if(!G)throw new Error("Recipient address must be provided");if(!Q)throw new Error("signTransaction must be provided");let q=L.feeRate||(await $())[y.FeeOption.Fast],{builder:j,utxos:D}=await BX({...L,assetValue:W,feeRate:q,recipient:G,sender:Z}),M=(await Q({builder:j,utxos:D})).toHex();return X(M)}}async function pX({assetValue:X,recipient:$,memo:J,feeRate:Q,sender:Z}){let{Psbt:G}=await import("bitcoinjs-lib"),W=f($);if(!E(W))throw new Error("Invalid address");let L=await F(K).scanUTXOs({address:g(Z),fetchTxHex:!0}),q=Number(Q.toFixed(0)),j=J?await k(J):null,D=[];if(D.push({address:A($),value:X.getBaseValue("number")}),j)D.push({script:j,value:0});let{inputs:U,outputs:M}=w({inputs:L,outputs:D,feeRate:q,chain:K});if(!(U&&M))throw new Error("Balance insufficient for transaction");let C=await O(),v=new G({network:C(K)});for(let{hash:z,index:_,witnessUtxo:T}of U)v.addInput({hash:z,index:_,witnessUtxo:T});for(let z of M){let _="address"in z&&z.address?z.address:A(Z),T=z.script?j?{script:j,value:0}:void 0:{address:_,value:z.value};if(T)v.addOutput(T)}return{psbt:v,utxos:L,inputs:U}}async function uX({phrase:X,derivationPath:$=`${y.DerivationPath.BCH}/0`,wif:J}){let{ECPairFactory:Q}=await import("ecpair"),Z=await import("@bitcoinerlab/secp256k1"),{mnemonicToSeedSync:G}=await import("@scure/bip39"),{HDNode:W}=await import("@psf/bitcoincashjs-lib"),q=(await O())(K);if(J)return Q(Z).fromWIF(J,q);if(!X)throw new Error("No phrase provided");return W.fromSeedBuffer(Buffer.from(G(X)),q).derivePath($).keyPair}function rX(X){let $=X.getAddress(0);return g($)}async function cX(X){switch(X){case x.Chain.BitcoinCash:return await YX();case x.Chain.Bitcoin:case x.Chain.Dogecoin:case x.Chain.Litecoin:case x.Chain.Dash:return await p(X);default:throw new Error(`Chain ${X} is not supported`)}}
2
+
3
+ //# debugId=8751536D1BE8ACCB64756E2164756E21
@@ -0,0 +1,17 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utxo/toolbox/index.ts", "../src/utxo/toolbox/bitcoinCash.ts", "../src/utxo/helpers/api.ts", "../src/utxo/helpers/utils.ts", "../src/utxo/helpers/bchaddrjs.ts", "../src/utxo/helpers/coinselect.ts", "../src/utxo/helpers/txSize.ts", "../src/utxo/toolbox/utxo.ts"],
4
+ "sourcesContent": [
5
+ "import { Chain, type UTXOChain } from \"@swapkit/helpers\";\n\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport { createUTXOToolbox } from \"./utxo\";\n\ntype BCHToolbox = Awaited<ReturnType<typeof createBCHToolbox>>;\ntype CommonUTXOToolbox = Awaited<ReturnType<typeof createUTXOToolbox>>;\n\ntype UTXOToolboxes = {\n [Chain.BitcoinCash]: BCHToolbox;\n [Chain.Bitcoin]: CommonUTXOToolbox;\n [Chain.Dogecoin]: CommonUTXOToolbox;\n [Chain.Litecoin]: CommonUTXOToolbox;\n [Chain.Dash]: CommonUTXOToolbox;\n};\n\nexport type UTXOWallets = {\n [key in keyof UTXOToolboxes]: ReturnType<UTXOToolboxes[key]>;\n};\n\nexport async function getToolboxByChain<T extends UTXOChain>(chain: T): Promise<UTXOToolboxes[T]> {\n switch (chain) {\n case Chain.BitcoinCash: {\n const toolbox = await createBCHToolbox();\n return toolbox as UTXOToolboxes[T];\n }\n\n case Chain.Bitcoin:\n case Chain.Dogecoin:\n case Chain.Litecoin:\n case Chain.Dash: {\n const toolbox = await createUTXOToolbox(chain);\n return toolbox as UTXOToolboxes[T];\n }\n\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n}\n\nexport { stripToCashAddress, stripPrefix, validateAddress } from \"./bitcoinCash\";\n",
6
+ "import { Chain, DerivationPath, FeeOption, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n accumulative,\n Network as bchNetwork,\n compileMemo,\n detectAddressNetwork,\n getUtxoApi,\n getUtxoNetwork,\n isValidAddress,\n toCashAddress,\n toLegacyAddress,\n} from \"../helpers\";\nimport type {\n TargetOutput,\n TransactionType,\n UTXOBuildTxParams,\n UTXOType,\n UTXOWalletTransferParams,\n} from \"../types\";\nimport { createUTXOToolbox } from \"./utxo\";\n\nconst chain = Chain.BitcoinCash as UTXOChain;\n\nexport function stripPrefix(address: string) {\n return address.replace(/(bchtest:|bitcoincash:)/, \"\");\n}\n\nexport function validateAddress(address: string) {\n const strippedAddress = stripPrefix(address);\n return (\n isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet\n );\n}\n\nexport function stripToCashAddress(address: string) {\n return stripPrefix(toCashAddress(address));\n}\n\nexport async function createBCHToolbox() {\n const { getBalance, getFeeRates, broadcastTx, ...toolbox } = (\n await createUTXOToolbox(Chain.BitcoinCash)\n )();\n\n function handleGetBalance(address: string, _scamFilter = true) {\n return getBalance(stripPrefix(toCashAddress(address)));\n }\n\n return function createBCHToolbox() {\n return {\n ...toolbox,\n broadcastTx,\n buildBCHTx,\n buildTx,\n createKeysForPath,\n getAddressFromKeys,\n getBalance: handleGetBalance,\n getFeeRates,\n stripPrefix,\n stripToCashAddress,\n validateAddress,\n transfer: transfer({ getFeeRates, broadcastTx }),\n };\n };\n}\n\nasync function buildBCHTx({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n const {\n Transaction,\n TransactionBuilder,\n address: bchAddress,\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n } = await import(\"@psf/bitcoincashjs-lib\");\n if (!validateAddress(recipient)) throw new Error(\"Invalid address\");\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs: TargetOutput[] = [];\n // output to recipient\n targetOutputs.push({ address: recipient, value: assetValue.getBaseValue(\"number\") });\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Balance insufficient for transaction\");\n const getNetwork = await getUtxoNetwork();\n const builder = new TransactionBuilder(getNetwork(chain));\n\n await Promise.all(\n inputs.map(async (utxo: UTXOType) => {\n const txHex = await getUtxoApi(chain).getRawTx(utxo.hash);\n\n builder.addInput(Transaction.fromBuffer(Buffer.from(txHex, \"hex\")), utxo.index);\n }),\n );\n\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const getNetwork = await getUtxoNetwork();\n const outputScript = bchAddress.toOutputScript(toLegacyAddress(address), getNetwork(chain));\n\n builder.addOutput(outputScript, output.value);\n }\n\n // add output for memo\n if (compiledMemo) {\n builder.addOutput(compiledMemo, 0); // Add OP_RETURN {script, value}\n }\n\n return { builder, utxos: inputs };\n}\n\nfunction transfer({\n broadcastTx,\n getFeeRates,\n}: {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\n}) {\n return async function transfer({\n signTransaction,\n from,\n recipient,\n assetValue,\n ...rest\n }: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n >) {\n if (!from) throw new Error(\"From address must be provided\");\n if (!recipient) throw new Error(\"Recipient address must be provided\");\n if (!signTransaction) throw new Error(\"signTransaction must be provided\");\n\n const feeRate = rest.feeRate || (await getFeeRates())[FeeOption.Fast];\n\n // try out if psbt tx is faster/better/nicer\n const { builder, utxos } = await buildBCHTx({\n ...rest,\n assetValue,\n feeRate,\n recipient,\n sender: from,\n });\n\n const tx = await signTransaction({ builder, utxos });\n const txHex = tx.toHex();\n\n return broadcastTx(txHex);\n };\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\nasync function buildTx({ assetValue, recipient, memo, feeRate, sender }: UTXOBuildTxParams) {\n const { Psbt } = await import(\"bitcoinjs-lib\");\n const recipientCashAddress = toCashAddress(recipient);\n if (!validateAddress(recipientCashAddress)) throw new Error(\"Invalid address\");\n\n const utxos = await getUtxoApi(chain).scanUTXOs({\n address: stripToCashAddress(sender),\n fetchTxHex: true,\n });\n\n const feeRateWhole = Number(feeRate.toFixed(0));\n const compiledMemo = memo ? await compileMemo(memo) : null;\n\n const targetOutputs = [] as TargetOutput[];\n\n // output to recipient\n targetOutputs.push({\n address: toLegacyAddress(recipient),\n value: assetValue.getBaseValue(\"number\"),\n });\n\n //2. add output memo to targets (optional)\n if (compiledMemo) {\n targetOutputs.push({ script: compiledMemo, value: 0 });\n }\n\n const { inputs, outputs } = accumulative({\n inputs: utxos,\n outputs: targetOutputs,\n feeRate: feeRateWhole,\n chain,\n });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Balance insufficient for transaction\");\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) }); // Network-specific\n\n for (const { hash, index, witnessUtxo } of inputs) {\n psbt.addInput({ hash, index, witnessUtxo });\n }\n\n // Outputs\n for (const output of outputs) {\n const address =\n \"address\" in output && output.address ? output.address : toLegacyAddress(sender);\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos, inputs: inputs as UTXOType[] };\n}\n\nasync function createKeysForPath({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n}: { wif?: string; phrase?: string; derivationPath?: string }) {\n const { ECPairFactory } = await import(\"ecpair\");\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n const { HDNode } = await import(\"@psf/bitcoincashjs-lib\");\n const getNetwork = await getUtxoNetwork();\n\n const network = getNetwork(chain);\n\n if (wif) {\n return ECPairFactory(secp256k1).fromWIF(wif, network);\n }\n if (!phrase) throw new Error(\"No phrase provided\");\n\n const masterHDNode = HDNode.fromSeedBuffer(Buffer.from(mnemonicToSeedSync(phrase)), network);\n const keyPair = masterHDNode.derivePath(derivationPath).keyPair;\n // TODO: Figure out same pattern as in BTC\n // const testWif = keyPair.toWIF();\n // const k = ECPairFactory(secp256k1).fromWIF(testWif, network);\n // const a = payments.p2pkh({ pubkey: k.publicKey, network });\n\n return keyPair;\n}\n\nfunction getAddressFromKeys(keys: { getAddress: (index?: number) => string }) {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n}\n\ntype TransactionBuilderType = {\n inputs: any[];\n sign(\n vin: number,\n keyPair: { getAddress: (index?: number) => string },\n redeemScript?: Buffer,\n hashType?: number,\n witnessValue?: number,\n witnessScript?: Buffer,\n signatureAlgorithm?: string,\n ): void;\n build(): TransactionType;\n};\n",
7
+ "import { Chain, RequestClient, SKConfig, type UTXOChain, warnOnce } from \"@swapkit/helpers\";\nimport { uniqid } from \"./utils\";\n\ntype BlockchairParams<T> = T & { chain: Chain; apiKey?: string };\ntype BlockchairFetchUnspentUtxoParams = BlockchairParams<{\n offset?: number;\n limit?: number;\n address: string;\n}>;\n\nasync function broadcastUTXOTx({ chain, txHash }: { chain: Chain; txHash: string }) {\n const rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const body = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"sendrawtransaction\",\n params: [txHash],\n id: uniqid(),\n });\n\n const response = await RequestClient.post<{\n id: string;\n result: string;\n error: { message: string; code?: number } | null;\n }>(rpcUrl, { headers: { \"Content-Type\": \"application/json\" }, body });\n\n if (response.error) {\n throw new Error(`failed to broadcast a transaction: ${response.error?.message}`);\n }\n\n if (response.result.includes('\"code\":-26')) {\n throw new Error(\"Invalid transaction: the transaction amount was too low\");\n }\n\n return response.result;\n}\n\nfunction baseUrl(chain: Chain) {\n return `https://api.blockchair.com/${mapChainToBlockchairChain(chain)}`;\n}\n\nfunction getDefaultTxFeeByChain(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return 5;\n case Chain.Dogecoin:\n return 10000;\n case Chain.Litecoin:\n return 1;\n default:\n return 2;\n }\n}\n\nfunction mapChainToBlockchairChain(chain: Chain) {\n switch (chain) {\n case Chain.BitcoinCash:\n return \"bitcoin-cash\";\n case Chain.Litecoin:\n return \"litecoin\";\n case Chain.Dash:\n return \"dash\";\n case Chain.Dogecoin:\n return \"dogecoin\";\n case Chain.Polkadot:\n return \"polkadot\";\n default:\n return \"bitcoin\";\n }\n}\n\nasync function getSuggestedTxFee(chain: Chain) {\n try {\n //Use Bitgo API for fee estimation\n //Refer: https://app.bitgo.com/docs/#operation/v2.tx.getfeeestimate\n const { feePerKb } = await RequestClient.get<{\n feePerKb: number;\n cpfpFeePerKb: number;\n numBlocks: number;\n feeByBlockTarget: { 1: number; 3: number };\n }>(`https://app.bitgo.com/api/v2/${chain.toLowerCase()}/tx/fee`);\n const suggestedFee = feePerKb / 1000;\n\n return Math.max(suggestedFee, getDefaultTxFeeByChain(chain));\n } catch (_error) {\n return getDefaultTxFeeByChain(chain);\n }\n}\n\nasync function blockchairRequest<T>(url: string, apiKey?: string): Promise<T> {\n try {\n const response = await RequestClient.get<BlockchairResponse<T>>(url);\n if (!response || response.context.code !== 200) throw new Error(`failed to query ${url}`);\n\n return response.data as T;\n } catch (error) {\n if (!apiKey) throw error;\n const response = await RequestClient.get<BlockchairResponse<T>>(\n `${url}${apiKey ? `&key=${apiKey}` : \"\"}`,\n );\n\n if (!response || response.context.code !== 200) throw new Error(`failed to query ${url}`);\n\n return response.data as T;\n }\n}\n\nasync function getAddressData({ address, chain, apiKey }: BlockchairParams<{ address?: string }>) {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const response = await blockchairRequest<BlockchairAddressResponse>(\n `${baseUrl(chain)}/dashboards/address/${address}?transaction_details=true`,\n apiKey,\n );\n\n return response[address];\n } catch (_error) {\n return { utxo: [], address: { balance: 0, transaction_count: 0 } };\n }\n}\n\nasync function getUnconfirmedBalance({\n address,\n chain,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n const response = await getAddressData({ address, chain, apiKey });\n\n return response?.address.balance || 0;\n}\n\nasync function getConfirmedBalance({\n chain,\n address,\n apiKey,\n}: BlockchairParams<{ address?: string }>) {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const response = await blockchairRequest<BlockchairMultipleBalancesResponse>(\n `${baseUrl(chain)}/addresses/balances?addresses=${address}`,\n apiKey,\n );\n\n return response[address] || 0;\n } catch (_error) {\n return 0;\n }\n}\n\nasync function getRawTx({ chain, apiKey, txHash }: BlockchairParams<{ txHash?: string }>) {\n if (!txHash) throw new Error(\"txHash is required\");\n\n try {\n const rawTxResponse = await blockchairRequest<BlockchairRawTransactionResponse>(\n `${baseUrl(chain)}/raw/transaction/${txHash}`,\n apiKey,\n );\n return rawTxResponse?.[txHash]?.raw_transaction || \"\";\n } catch (error) {\n console.error(error);\n return \"\";\n }\n}\n\nasync function fetchUnspentUtxoBatch({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams) {\n const response = await blockchairRequest<BlockchairOutputsResponse[]>(\n `${baseUrl(chain)}/outputs?q=is_spent(false),recipient(${address})&limit=${limit}&offset=${offset}`,\n apiKey,\n );\n\n const txs = response\n .filter(({ is_spent }) => !is_spent)\n .map(({ script_hex, block_id, transaction_hash, index, value, spending_signature_hex }) => ({\n hash: transaction_hash,\n index,\n value,\n txHex: spending_signature_hex,\n script_hex,\n is_confirmed: block_id !== -1,\n }));\n\n return txs;\n}\n\nasync function getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset = 0,\n limit = 100,\n}: BlockchairFetchUnspentUtxoParams): Promise<Awaited<ReturnType<typeof fetchUnspentUtxoBatch>>> {\n if (!address) throw new Error(\"address is required\");\n\n try {\n const txs = await fetchUnspentUtxoBatch({ chain, address, apiKey, offset, limit });\n\n if (txs.length <= limit) return txs;\n\n const nextBatch = await getUnspentUtxos({\n chain,\n address,\n apiKey,\n offset: offset + limit,\n limit,\n });\n\n return [...txs, ...nextBatch];\n } catch (error) {\n console.error(error);\n return [];\n }\n}\n\nasync function scanUTXOs({\n address,\n chain,\n apiKey,\n fetchTxHex = true,\n}: BlockchairParams<{ address: string; fetchTxHex?: boolean }>) {\n const utxos = await getUnspentUtxos({ chain, address, apiKey });\n const results = [];\n\n for (const { hash, index, script_hex, value } of utxos) {\n let txHex: string | undefined;\n if (fetchTxHex) {\n txHex = await getRawTx({ txHash: hash, chain, apiKey });\n }\n results.push({\n address,\n hash,\n index,\n txHex,\n value,\n witnessUtxo: { value, script: Buffer.from(script_hex, \"hex\") },\n });\n }\n return results;\n}\n\nfunction utxoApi(chain: UTXOChain) {\n const apiKey = SKConfig.get(\"apiKeys\").blockchair || \"\";\n\n warnOnce(!apiKey, \"No Blockchair API key found. Functionality will be limited.\");\n\n return {\n broadcastTx: (txHash: string) => broadcastUTXOTx({ txHash, chain }),\n getConfirmedBalance: (address: string) => getConfirmedBalance({ chain, address, apiKey }),\n getRawTx: (txHash: string) => getRawTx({ txHash, chain, apiKey }),\n getSuggestedTxFee: () => getSuggestedTxFee(chain),\n getBalance: (address: string) => getUnconfirmedBalance({ address, chain, apiKey }),\n getAddressData: (address: string) => getAddressData({ address, chain, apiKey }),\n scanUTXOs: (params: { address: string; fetchTxHex?: boolean }) =>\n scanUTXOs({ ...params, chain, apiKey }),\n };\n}\n\n/**\n * \"Factory\" to ensure typing for custom UTXO APIs\n */\nexport function createCustomUtxoApi(methods: ReturnType<typeof utxoApi>) {\n return methods;\n}\n\nexport function getUtxoApi(chain: UTXOChain) {\n const customUtxoApi = SKConfig.get(\"apis\")[chain];\n\n if (customUtxoApi) {\n warnOnce(true, \"Using custom UTXO API. Be sure to implement all methods to avoid issues.\");\n return customUtxoApi as ReturnType<typeof utxoApi>;\n }\n\n return utxoApi(chain);\n}\n\ninterface BlockchairMultipleBalancesResponse {\n [key: string]: number;\n}\n\ninterface BlockchairVin {\n txid: string;\n vout: number;\n scriptSig: {\n asm: string;\n hex: string;\n };\n sequence: number;\n}\n\ninterface BlockchairVout {\n value: number;\n n: number;\n scriptPubKey: {\n asm: string;\n hex: string;\n address: string;\n type: string;\n addresses: string[];\n reqSigs: number;\n };\n}\n\ninterface BlockchairTransaction {\n block_id: number;\n hash: string;\n time: string;\n balance_change: number;\n}\n\ninterface BlockchairUtxo {\n block_id: number;\n transaction_hash: string;\n index: number;\n value: number;\n}\n\ninterface BlockchairAddressCoreData {\n type: string;\n script_hex: string;\n balance: number;\n balance_usd: number;\n received: number;\n received_usd: number;\n spent: number;\n spent_usd: number;\n output_count: number;\n unspent_output_count: number;\n first_seen_receiving: string;\n last_seen_receiving: string;\n first_seen_spending: null | string;\n last_seen_spending: null | string;\n transaction_count: number;\n scripthash_type: null | string;\n}\n\ninterface BlockchairInputOutputCommonData {\n block_id: number;\n transaction_id: number;\n index: number;\n transaction_hash: string;\n date: string;\n time: string;\n value: number;\n value_usd: number;\n recipient: string;\n type: string;\n script_hex: string;\n is_from_coinbase: boolean;\n is_spendable: boolean | null;\n is_spent: boolean;\n lifespan: number | null;\n cdd: number | null;\n}\n\ninterface BlockchairSpendingBlockData {\n spending_block_id: number | null;\n spending_transaction_id: number | null;\n spending_index: number | null;\n spending_transaction_hash: string | null;\n spending_date: string | null;\n spending_time: string | null;\n spending_value_usd: number | null;\n spending_sequence: number | null;\n spending_signature_hex: string | null;\n spending_witness: string | null;\n}\n\ninterface BlockchairAddressResponse {\n [key: string]: {\n address: BlockchairAddressCoreData;\n transactions: BlockchairTransaction[];\n utxo: BlockchairUtxo[];\n };\n}\n\ninterface BlockchairOutputsResponse\n extends BlockchairSpendingBlockData,\n BlockchairInputOutputCommonData {}\n\ninterface BlockchairRawTransactionResponse {\n [key: string]: {\n raw_transaction: string;\n decoded_raw_transaction: {\n txid: string;\n hash: string;\n version: number;\n size: number;\n vsize: number;\n weight: number;\n locktime: number;\n vin: BlockchairVin[];\n vout: BlockchairVout[];\n };\n };\n}\n\ninterface BlockchairResponse<T> {\n data: T;\n context: {\n code: number;\n source: string;\n results: number;\n state: number;\n market_price_usd: number;\n cache: {\n live: boolean;\n duration: number;\n since: string;\n until: string;\n time: any;\n };\n api: {\n version: string;\n last_major_update: string;\n next_major_update: null | string;\n documentation: string;\n notice: string;\n };\n servers: string;\n time: number;\n render_time: number;\n full_time: number;\n request_cost: number;\n };\n}\n",
8
+ "import { Chain, FeeOption } from \"@swapkit/helpers\";\n\nconst pid = typeof process !== \"undefined\" && process.pid ? process.pid.toString(36) : \"\";\n\nexport async function getUtxoNetwork() {\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n const { coininfo } = await import(\"coininfo\");\n const { networks } = await import(\"bitcoinjs-lib\");\n\n return function getNetwork(chain: Chain) {\n switch (chain) {\n case Chain.Bitcoin:\n return networks.bitcoin;\n case Chain.BitcoinCash:\n return coininfo.bitcoincash.main.toBitcoinJS();\n case Chain.Dash:\n return coininfo.dash.main.toBitcoinJS();\n case Chain.Litecoin:\n return coininfo.litecoin.main.toBitcoinJS();\n\n case Chain.Dogecoin: {\n const bip32 = { private: 0x04358394, public: 0x043587cf };\n const test = coininfo.dogecoin.test;\n test.versions.bip32 = bip32;\n return coininfo.dogecoin.main.toBitcoinJS();\n }\n default:\n throw new Error(\"Invalid chain\");\n }\n };\n}\n\nexport const standardFeeRates = (rate: number) => ({\n [FeeOption.Average]: rate,\n [FeeOption.Fast]: rate * 1.5,\n [FeeOption.Fastest]: rate * 2.0,\n});\n\nlet last = 0;\nconst now = () => {\n const time = Date.now();\n const lastTime = last || time;\n last = lastTime;\n\n return time > last ? time : lastTime + 1;\n};\n\nexport const uniqid = () => pid + now().toString(36);\n",
9
+ "import base58check from \"bs58check\";\n// @ts-expect-error\nimport cashaddr from \"cashaddrjs\";\n\nenum Format {\n Legacy = \"legacy\",\n Bitpay = \"bitpay\",\n Cashaddr = \"cashaddr\",\n}\nenum Network {\n Mainnet = \"mainnet\",\n Testnet = \"testnet\",\n}\nenum Type {\n P2PKH = \"p2pkh\",\n P2SH = \"p2sh\",\n}\n\nconst VERSION_BYTE = {\n [Format.Legacy]: {\n [Network.Mainnet]: {\n [Type.P2PKH]: 0,\n [Type.P2SH]: 5,\n },\n [Network.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n [Format.Bitpay]: {\n [Network.Mainnet]: {\n [Type.P2PKH]: 28,\n [Type.P2SH]: 40,\n },\n [Network.Testnet]: {\n [Type.P2PKH]: 111,\n [Type.P2SH]: 196,\n },\n },\n};\n\ntype DecodedType = {\n format: Format;\n network: Network;\n type: Type;\n hash: any;\n};\n\nfunction isValidAddress(input: any) {\n try {\n decodeAddress(input);\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction detectAddressNetwork(address: string) {\n return decodeAddress(address)?.network;\n}\n\nfunction toLegacyAddress(address: string): string {\n const decoded = decodeAddress(address);\n if (decoded?.format === Format.Legacy) {\n return address;\n }\n return encodeAsLegacy(decoded);\n}\n\nfunction toCashAddress(address: string): string {\n const decoded = decodeAddress(address);\n return encodeAsCashaddr(decoded);\n}\n\nfunction decodeAddress(address: string) {\n try {\n return decodeBase58Address(address);\n } catch (_error) {\n // Try to decode as cashaddr if base58 decoding fails.\n }\n try {\n return decodeCashAddress(address);\n } catch (_error) {\n // Try to decode as bitpay if cashaddr decoding fails.\n }\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n}\n\nfunction decodeBase58Address(address: string) {\n try {\n const payload = base58check.decode(address);\n\n // BASE_58_CHECK_PAYLOAD_LENGTH\n if (payload.length !== 21)\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n const versionByte = payload[0];\n const hash = Array.prototype.slice.call(payload, 1);\n\n switch (versionByte) {\n case VERSION_BYTE[Format.Legacy][Network.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: Network.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][Network.Mainnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: Network.Mainnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Legacy][Network.Testnet][Type.P2PKH]:\n return { hash, format: Format.Legacy, network: Network.Testnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Legacy][Network.Testnet][Type.P2SH]:\n return { hash, format: Format.Legacy, network: Network.Testnet, type: Type.P2SH };\n\n case VERSION_BYTE[Format.Bitpay][Network.Mainnet][Type.P2PKH]:\n return { hash, format: Format.Bitpay, network: Network.Mainnet, type: Type.P2PKH };\n\n case VERSION_BYTE[Format.Bitpay][Network.Mainnet][Type.P2SH]:\n return { hash, format: Format.Bitpay, network: Network.Mainnet, type: Type.P2SH };\n\n default:\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n } catch (_error) {\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n}\n\nfunction decodeCashAddress(address: string) {\n if (address.indexOf(\":\") !== -1) {\n try {\n return decodeCashAddressWithPrefix(address);\n } catch (_error) {\n // Try to decode as legacy if cashaddr decoding fails.\n }\n } else {\n const prefixes = [\"bitcoincash\", \"bchtest\", \"bchreg\"];\n for (const prefix of prefixes) {\n try {\n return decodeCashAddressWithPrefix(`${prefix}:${address}`);\n } catch (_error) {\n // Try next prefix if decoding fails.\n }\n }\n }\n\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n}\n\nfunction decodeCashAddressWithPrefix(address: string): DecodedType {\n try {\n const { hash, prefix, type } = cashaddr.decode(address);\n\n return {\n format: Format.Cashaddr,\n hash: Array.prototype.slice.call(hash, 0),\n network: prefix === \"bitcoincash\" ? Network.Mainnet : Network.Testnet,\n type: type === \"P2PKH\" ? Type.P2PKH : Type.P2SH,\n };\n } catch (_error) {\n throw new Error(\"Received an invalid Bitcoin Cash address as input.\");\n }\n}\n\nfunction encodeAsLegacy(decoded: DecodedType) {\n const versionByte = VERSION_BYTE[Format.Legacy][decoded.network][decoded.type];\n const buffer = Buffer.alloc(1 + decoded.hash.length);\n buffer[0] = versionByte;\n buffer.set(decoded.hash, 1);\n return base58check.encode(buffer);\n}\n\nfunction encodeAsCashaddr(decoded: DecodedType) {\n const prefix = decoded.network === Network.Mainnet ? \"bitcoincash\" : \"bchtest\";\n const type = decoded.type === Type.P2PKH ? \"P2PKH\" : \"P2SH\";\n const hash = new Uint8Array(decoded.hash);\n return cashaddr.encode(prefix, type, hash);\n}\n\nexport { detectAddressNetwork, isValidAddress, Network, toCashAddress, toLegacyAddress };\n",
10
+ "import { Chain, type UTXOChain } from \"@swapkit/helpers\";\n\nimport {\n TX_OVERHEAD,\n UTXOScriptType,\n calculateTxSize,\n getInputSize,\n getOutputSize,\n getScriptTypeForAddress,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOCalculateTxSizeParams, UTXOType } from \"../types\";\n\nexport const getDustThreshold = (chain: UTXOChain) => {\n switch (chain) {\n case Chain.Bitcoin:\n case Chain.BitcoinCash:\n return 550;\n case Chain.Dash:\n case Chain.Litecoin:\n return 5500;\n case Chain.Dogecoin:\n return 100000;\n default:\n throw new Error(\"Invalid Chain\");\n }\n};\n\nexport const accumulative = ({\n inputs,\n outputs,\n feeRate: initialFeeRate = 1,\n chain = Chain.Bitcoin,\n}: UTXOCalculateTxSizeParams & { outputs: TargetOutput[]; chain: UTXOChain }) => {\n const feeRate = Math.ceil(initialFeeRate);\n\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n // skip input if adding it would cost more than input is worth\n const filteredInputs = inputs.filter((input) => getInputSize(input) * feeRate <= input.value);\n\n const txSizeWithoutInputs =\n TX_OVERHEAD + outputs.reduce((total, output) => total + getOutputSize(output, newTxType), 0);\n\n const amountToSend = outputs.reduce((total, output) => total + output.value, 0);\n\n let fees = txSizeWithoutInputs * feeRate;\n let inputsValue = 0;\n const inputsToUse: typeof inputs = [];\n\n for (const input of filteredInputs) {\n const inputSize = getInputSize(input);\n const inputFee = feeRate * inputSize;\n\n fees += inputFee;\n inputsValue += input.value;\n\n inputsToUse.push(input);\n\n const totalCost = fees + amountToSend;\n\n // we need more inputs\n if (inputsValue < totalCost) continue;\n\n const remainder = inputsValue - totalCost;\n\n const feeForExtraOutput = feeRate * getOutputSize({ address: \"\", value: 0 }, newTxType);\n\n // potential change address\n if (remainder > feeForExtraOutput) {\n const feeAfterExtraOutput = feeForExtraOutput + fees;\n const remainderAfterExtraOutput = inputsValue - (amountToSend + feeAfterExtraOutput);\n\n // is it worth a change output aka can we send it in the future?\n if (\n remainderAfterExtraOutput >\n Math.max(getInputSize({} as UTXOType) * feeRate, getDustThreshold(chain))\n ) {\n return {\n inputs: inputsToUse,\n outputs: outputs.concat({ value: remainderAfterExtraOutput, address: \"\" }),\n fee: feeAfterExtraOutput,\n };\n }\n }\n return {\n inputs: inputsToUse,\n outputs,\n fee: fees,\n };\n }\n\n // We don't have enough inputs, let's calculate transaction fee accrude to the last input\n return { fee: feeRate * calculateTxSize({ inputs, outputs, feeRate }) };\n};\n",
11
+ "import type {\n TargetOutput,\n UTXOCalculateTxSizeParams,\n UTXOInputWithScriptType,\n UTXOType,\n} from \"../types\";\n\n/**\n * Minimum transaction fee\n * 1000 satoshi/kB (similar to current `minrelaytxfee`)\n * @see https://github.com/bitcoin/bitcoin/blob/db88db47278d2e7208c50d16ab10cb355067d071/src/validation.h#L56\n */\nexport const MIN_TX_FEE = 1000;\nexport const TX_OVERHEAD = 4 + 1 + 1 + 4; //10\nexport const OP_RETURN_OVERHEAD = 1 + 8 + 1; //10\nconst TX_INPUT_BASE = 32 + 4 + 1 + 4; // 41\nconst TX_INPUT_PUBKEYHASH = 107;\n\nexport async function compileMemo(memo: string) {\n const { script, opcodes } = await import(\"bitcoinjs-lib\");\n const data = Buffer.from(memo, \"utf8\"); // converts MEMO to buffer\n return script.compile([opcodes.OP_RETURN as number, data]); // Compile OP_RETURN script\n}\n\nexport enum UTXOScriptType {\n P2PKH = \"P2PKH\", // legacy\n // P2SH = 'P2SH', // multisig\n P2WPKH = \"P2WPKH\", // bech32 - native segwit\n // P2TR = \"P2TR\", // taproot\n}\n\nexport const InputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 148,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 68,\n};\n\nexport const OutputSizes: Record<UTXOScriptType, number> = {\n [UTXOScriptType.P2PKH]: 34,\n // [UTXOScriptType.P2SH]: 91,\n [UTXOScriptType.P2WPKH]: 31,\n};\n\nexport const getScriptTypeForAddress = (address: string) => {\n if (address.startsWith(\"bc1\") || address.startsWith(\"ltc1\")) {\n return UTXOScriptType.P2WPKH;\n }\n // if (address.startsWith('3') || address.startsWith('M')) {\n // return UTXOScriptType.P2SH;\n // }\n if (\n address.startsWith(\"1\") ||\n address.startsWith(\"3\") ||\n address.startsWith(\"L\") ||\n address.startsWith(\"M\") ||\n address.startsWith(\"X\") ||\n address.startsWith(\"D\") ||\n address.startsWith(\"bitcoincash:q\") ||\n address.startsWith(\"q\")\n ) {\n return UTXOScriptType.P2PKH;\n }\n throw new Error(\"Invalid address\");\n};\n\nexport const calculateTxSize = ({ inputs, outputs, feeRate }: UTXOCalculateTxSizeParams) => {\n const newTxType =\n inputs[0] && \"address\" in inputs[0] && inputs[0].address\n ? getScriptTypeForAddress(inputs[0].address)\n : UTXOScriptType.P2PKH;\n const inputSize = inputs\n .filter(\n (utxo) =>\n utxo.value >=\n InputSizes[\"type\" in utxo ? utxo.type : UTXOScriptType.P2PKH] * Math.ceil(feeRate),\n )\n .reduce((total, utxo) => total + getInputSize(utxo), 0);\n\n const outputSize =\n outputs?.reduce((total, output) => total + getOutputSize(output), 0) || OutputSizes[newTxType];\n\n return TX_OVERHEAD + inputSize + outputSize;\n};\n\nexport const getInputSize = (input: UTXOInputWithScriptType | UTXOType) => {\n if (\"type\" in input) {\n return InputSizes[input.type];\n }\n if (\"address\" in input && input.address) {\n return InputSizes[getScriptTypeForAddress(input.address as string)];\n }\n return TX_INPUT_BASE + TX_INPUT_PUBKEYHASH;\n};\n\nexport const getOutputSize = (output: TargetOutput, scriptType?: UTXOScriptType) => {\n if (output?.script) {\n return OP_RETURN_OVERHEAD + output.script.length + (output.script.length >= 74 ? 2 : 1);\n }\n if (scriptType) {\n return OutputSizes[scriptType];\n }\n return OutputSizes[UTXOScriptType.P2PKH];\n};\n",
12
+ "import {\n AssetValue,\n BaseDecimal,\n Chain,\n FeeOption,\n SwapKitNumber,\n type UTXOChain,\n} from \"@swapkit/helpers\";\nimport type { Psbt } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\n\nimport {\n UTXOScriptType,\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getUtxoApi,\n getUtxoNetwork,\n standardFeeRates,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOBuildTxParams, UTXOType, UTXOWalletTransferParams } from \"../types\";\nimport { validateAddress as validateBCHAddress } from \"./bitcoinCash\";\n\nexport const nonSegwitChains = [Chain.Dash, Chain.Dogecoin];\n\nexport function buildTx(chain: UTXOChain) {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\n return async function buildTx({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n fetchTxHex = false,\n }: UTXOBuildTxParams): Promise<{\n psbt: Psbt;\n utxos: UTXOType[];\n inputs: UTXOType[];\n }> {\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { initEccLib, Psbt } = await import(\"bitcoinjs-lib\");\n const compiledMemo = memo ? await compileMemo(memo) : null;\n const getInputsAndOutputs = getInputsAndTargetOutputs(chain);\n\n const inputsAndOutputs = await getInputsAndOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex,\n });\n\n const { inputs, outputs } = accumulative({ ...inputsAndOutputs, feeRate, chain });\n\n // .inputs and .outputs will be undefined if no solution was found\n if (!(inputs && outputs)) throw new Error(\"Insufficient Balance for transaction\");\n const getNetwork = await getUtxoNetwork();\n const psbt = new Psbt({ network: getNetwork(chain) });\n\n if (chain === Chain.Dogecoin) psbt.setMaximumFeeRate(650000000);\n\n for (const utxo of inputs) {\n psbt.addInput({\n hash: utxo.hash,\n index: utxo.index,\n ...(!!utxo.witnessUtxo &&\n !nonSegwitChains.includes(chain) && { witnessUtxo: utxo.witnessUtxo }),\n ...(nonSegwitChains.includes(chain) && {\n nonWitnessUtxo: utxo.txHex ? Buffer.from(utxo.txHex, \"hex\") : undefined,\n }),\n });\n }\n\n for (const output of outputs) {\n const address = \"address\" in output && output.address ? output.address : sender;\n const params = output.script\n ? compiledMemo\n ? { script: compiledMemo, value: 0 }\n : undefined\n : { address, value: output.value };\n\n if (params) {\n initEccLib(secp256k1);\n psbt.addOutput(params);\n }\n }\n\n return { psbt, utxos: inputsAndOutputs.inputs, inputs };\n };\n}\n\nexport async function getAddressValidator() {\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { initEccLib, address: btcLibAddress } = await import(\"bitcoinjs-lib\");\n const getNetwork = await getUtxoNetwork();\n\n return function validateAddress({ chain, address }: { chain: UTXOChain; address: string }) {\n if (chain === Chain.BitcoinCash) {\n return validateBCHAddress(address);\n }\n\n return function validateAddress(address: string) {\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch (_error) {\n return false;\n }\n };\n };\n}\n\nexport async function createUTXOToolbox(chain: UTXOChain) {\n const getAddressFromKeys = await addressFromKeysGetter(chain);\n const validateAddress = await getAddressValidator();\n const createKeysForPath = await getCreateKeysForPath(chain);\n\n return function createUTXOToolbox() {\n return {\n accumulative,\n calculateTxSize,\n getAddressFromKeys,\n validateAddress: (address: string) => validateAddress({ chain, address }),\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n buildTx: buildTx(chain),\n createKeysForPath,\n getFeeRates: () => getFeeRates(chain),\n getInputsOutputsFee: getInputsOutputsFee(chain),\n transfer: transfer(chain),\n getPrivateKeyFromMnemonic: (params: { phrase: string; derivationPath: string }) => {\n const keys = createKeysForPath(params);\n return keys.toWIF();\n },\n\n getBalance: getBalance(chain),\n estimateTransactionFee: estimateTransactionFee(chain),\n estimateMaxSendableAmount: estimateMaxSendableAmount(chain),\n };\n };\n}\n\nfunction getInputsOutputsFee(chain: UTXOChain) {\n return async function getInputsOutputsFee({\n assetValue,\n feeOptionKey = FeeOption.Fast,\n feeRate,\n fetchTxHex = false,\n memo,\n recipient,\n from,\n }: {\n assetValue: AssetValue;\n recipient: string;\n memo?: string;\n from: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) {\n const getInputsAndOutputs = getInputsAndTargetOutputs(chain);\n const inputsAndOutputs = await getInputsAndOutputs({\n assetValue,\n recipient,\n memo,\n sender: from,\n fetchTxHex,\n });\n\n const feeRateWhole = feeRate ? Math.floor(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n return accumulative({ ...inputsAndOutputs, feeRate: feeRateWhole, chain });\n };\n}\n\nfunction estimateMaxSendableAmount(chain: UTXOChain) {\n return async function estimateMaxSendableAmount({\n from,\n memo,\n feeRate,\n feeOptionKey = FeeOption.Fast,\n recipients = 1,\n }: {\n from: string;\n memo?: string;\n feeRate?: number;\n feeOptionKey?: FeeOption;\n recipients?: number | TargetOutput[];\n }) {\n const addressData = await getUtxoApi(chain).getAddressData(from);\n const feeRateWhole = feeRate ? Math.ceil(feeRate) : (await getFeeRates(chain))[feeOptionKey];\n\n const inputs = addressData?.utxo\n .map((utxo) => ({\n ...utxo,\n // type: utxo.witnessUtxo ? UTXOScriptType.P2WPKH : UTXOScriptType.P2PKH,\n type: UTXOScriptType.P2PKH,\n hash: \"\",\n }))\n .filter(\n (utxo) => utxo.value > Math.max(getDustThreshold(chain), getInputSize(utxo) * feeRateWhole),\n );\n\n if (!inputs?.length) return AssetValue.from({ chain });\n\n const balance = AssetValue.from({\n chain,\n value: inputs.reduce((sum, utxo) => sum + utxo.value, 0),\n });\n\n const outputs =\n typeof recipients === \"number\"\n ? (Array.from({ length: recipients }, () => ({\n address: from,\n value: 0,\n })) as TargetOutput[])\n : recipients;\n\n if (memo) {\n const script = await compileMemo(memo);\n outputs.push({ address: from, script, value: 0 });\n }\n\n const txSize = calculateTxSize({ inputs, outputs, feeRate: feeRateWhole });\n\n const fee = txSize * feeRateWhole;\n\n return balance.sub(fee);\n };\n}\n\nfunction estimateTransactionFee(chain: UTXOChain) {\n return async (params: {\n assetValue: AssetValue;\n recipient: string;\n from: string;\n memo?: string;\n feeOptionKey?: FeeOption;\n feeRate?: number;\n fetchTxHex?: boolean;\n }) => {\n const getInputsFee = getInputsOutputsFee(chain);\n const inputFees = await getInputsFee(params);\n\n return AssetValue.from({\n chain,\n value: SwapKitNumber.fromBigInt(BigInt(inputFees.fee), 8).getValue(\"string\"),\n });\n };\n}\n\nasync function getCreateKeysForPath(chain: Chain) {\n const { ECPairFactory } = await import(\"ecpair\");\n const secp256k1 = await import(\"@bitcoinerlab/secp256k1\");\n const { HDKey } = await import(\"@scure/bip32\");\n const { mnemonicToSeedSync } = await import(\"@scure/bip39\");\n const getNetwork = await getUtxoNetwork();\n\n return function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n }: { phrase?: string; wif?: string; derivationPath: string }) {\n if (!(wif || phrase)) throw new Error(\"Either phrase or wif must be provided\");\n\n const factory = ECPairFactory(secp256k1);\n const network = getNetwork(chain);\n\n if (wif) return factory.fromWIF(wif, network);\n\n const seed = mnemonicToSeedSync(phrase as string);\n const master = HDKey.fromMasterSeed(seed, network).derive(derivationPath);\n if (!master.privateKey) throw new Error(\"Could not get private key from phrase\");\n\n return factory.fromPrivateKey(Buffer.from(master.privateKey), { network });\n };\n}\n\nasync function addressFromKeysGetter(chain: UTXOChain) {\n const { payments } = await import(\"bitcoinjs-lib\");\n const getNetwork = await getUtxoNetwork();\n\n return function getAddressFromKeys(keys: ECPairInterface) {\n if (!keys) throw new Error(\"Keys must be provided\");\n\n const method = nonSegwitChains.includes(chain) ? payments.p2pkh : payments.p2wpkh;\n const { address } = method({ pubkey: keys.publicKey, network: getNetwork(chain) });\n if (!address) throw new Error(\"Address not defined\");\n\n return address;\n };\n}\n\nfunction transfer(chain: UTXOChain) {\n return async function transfer({\n signTransaction,\n from,\n memo,\n recipient,\n feeOptionKey,\n broadcastTx,\n feeRate,\n assetValue,\n }: UTXOWalletTransferParams<Psbt, Psbt>) {\n if (!from) throw new Error(\"From address must be provided\");\n if (!recipient) throw new Error(\"Recipient address must be provided\");\n if (!signTransaction) throw new Error(\"Sign transaction must be provided\");\n const txFeeRate = feeRate || (await getFeeRates(chain))[feeOptionKey || FeeOption.Fast];\n\n const { psbt } = await buildTx(chain)({\n recipient,\n feeRate: txFeeRate,\n sender: from,\n fetchTxHex: nonSegwitChains.includes(chain),\n assetValue,\n memo,\n });\n const signedPsbt = await signTransaction(psbt);\n signedPsbt.finalizeAllInputs(); // Finalise inputs\n // TX extracted and formatted to hex\n return broadcastTx(signedPsbt.extractTransaction().toHex());\n };\n}\n\nfunction getBalance(chain: UTXOChain) {\n return async function getBalance(address: string, _scamFilter = true) {\n const baseBalance = await getUtxoApi(chain).getBalance(address);\n const balance = SwapKitNumber.fromBigInt(BigInt(baseBalance), BaseDecimal[chain]).getValue(\n \"string\",\n );\n const asset = AssetValue.from({ asset: `${chain}.${chain}`, value: balance });\n\n return [asset];\n };\n}\n\nasync function getFeeRates(chain: UTXOChain) {\n const suggestedFeeRate = await getUtxoApi(chain).getSuggestedTxFee();\n\n return standardFeeRates(suggestedFeeRate);\n}\n\nfunction getInputsAndTargetOutputs(chain: UTXOChain) {\n return async function getInputsAndTargetOutputs({\n assetValue,\n recipient,\n memo,\n sender,\n fetchTxHex = false,\n }: {\n assetValue: AssetValue;\n recipient: string;\n memo?: string;\n sender: string;\n fetchTxHex?: boolean;\n }) {\n const inputs = await getUtxoApi(chain).scanUTXOs({ address: sender, fetchTxHex });\n\n //1. add output amount and recipient to targets\n //2. add output memo to targets (optional)\n\n return {\n inputs,\n outputs: [\n { address: recipient, value: Number(assetValue.bigIntValue) },\n ...(memo ? [{ address: \"\", script: await compileMemo(memo), value: 0 }] : []),\n ],\n };\n };\n}\n"
13
+ ],
14
+ "mappings": "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",
15
+ "debugId": "8751536D1BE8ACCB64756E2164756E21",
16
+ "names": []
17
+ }
@@ -0,0 +1,3 @@
1
+ import{a as H,b as Y}from"../chunk-tvrdndbw.js";import{Chain as g}from"@swapkit/helpers";import{Chain as OX,DerivationPath as dX,FeeOption as iX}from"@swapkit/helpers";import{Chain as V,RequestClient as f,SKConfig as e,warnOnce as jX}from"@swapkit/helpers";import{Chain as E,FeeOption as s}from"@swapkit/helpers";var KX=typeof process!=="undefined"&&process.pid?process.pid.toString(36):"";async function _(){let{coininfo:X}=await import("coininfo"),{networks:$}=await import("bitcoinjs-lib");return function J(Q){switch(Q){case E.Bitcoin:return $.bitcoin;case E.BitcoinCash:return X.bitcoincash.main.toBitcoinJS();case E.Dash:return X.dash.main.toBitcoinJS();case E.Litecoin:return X.litecoin.main.toBitcoinJS();case E.Dogecoin:{let Z={private:70615956,public:70617039},G=X.dogecoin.test;return G.versions.bip32=Z,X.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}var GX=(X)=>({[s.Average]:X,[s.Fast]:X*1.5,[s.Fastest]:X*2}),t=0,NX=()=>{let X=Date.now(),$=t||X;return t=$,X>t?X:$+1},WX=()=>KX+NX().toString(36);async function wX({chain:X,txHash:$}){let J=e.get("rpcUrls")[X],Q=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[$],id:WX()}),Z=await f.post(J,{headers:{"Content-Type":"application/json"},body:Q});if(Z.error)throw new Error(`failed to broadcast a transaction: ${Z.error?.message}`);if(Z.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Z.result}function m(X){return`https://api.blockchair.com/${kX(X)}`}function LX(X){switch(X){case V.Bitcoin:return 5;case V.Dogecoin:return 1e4;case V.Litecoin:return 1;default:return 2}}function kX(X){switch(X){case V.BitcoinCash:return"bitcoin-cash";case V.Litecoin:return"litecoin";case V.Dash:return"dash";case V.Dogecoin:return"dogecoin";case V.Polkadot:return"polkadot";default:return"bitcoin"}}async function bX(X){try{let{feePerKb:$}=await f.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),J=$/1000;return Math.max(J,LX(X))}catch($){return LX(X)}}async function l(X,$){try{let J=await f.get(X);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}catch(J){if(!$)throw J;let Q=await f.get(`${X}${$?`&key=${$}`:""}`);if(!Q||Q.context.code!==200)throw new Error(`failed to query ${X}`);return Q.data}}async function qX({address:X,chain:$,apiKey:J}){if(!X)throw new Error("address is required");try{return(await l(`${m($)}/dashboards/address/${X}?transaction_details=true`,J))[X]}catch(Q){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function EX({address:X,chain:$,apiKey:J}){return(await qX({address:X,chain:$,apiKey:J}))?.address.balance||0}async function yX({chain:X,address:$,apiKey:J}){if(!$)throw new Error("address is required");try{return(await l(`${m(X)}/addresses/balances?addresses=${$}`,J))[$]||0}catch(Q){return 0}}async function DX({chain:X,apiKey:$,txHash:J}){if(!J)throw new Error("txHash is required");try{return(await l(`${m(X)}/raw/transaction/${J}`,$))?.[J]?.raw_transaction||""}catch(Q){return console.error(Q),""}}async function AX({chain:X,address:$,apiKey:J,offset:Q=0,limit:Z=100}){return(await l(`${m(X)}/outputs?q=is_spent(false),recipient(${$})&limit=${Z}&offset=${Q}`,J)).filter(({is_spent:L})=>!L).map(({script_hex:L,block_id:q,transaction_hash:j,index:D,value:U,spending_signature_hex:M})=>({hash:j,index:D,value:U,txHex:M,script_hex:L,is_confirmed:q!==-1}))}async function UX({chain:X,address:$,apiKey:J,offset:Q=0,limit:Z=100}){if(!$)throw new Error("address is required");try{let G=await AX({chain:X,address:$,apiKey:J,offset:Q,limit:Z});if(G.length<=Z)return G;let W=await UX({chain:X,address:$,apiKey:J,offset:Q+Z,limit:Z});return[...G,...W]}catch(G){return console.error(G),[]}}async function SX({address:X,chain:$,apiKey:J,fetchTxHex:Q=!0}){let Z=await UX({chain:$,address:X,apiKey:J}),G=[];for(let{hash:W,index:L,script_hex:q,value:j}of Z){let D;if(Q)D=await DX({txHash:W,chain:$,apiKey:J});G.push({address:X,hash:W,index:L,txHex:D,value:j,witnessUtxo:{value:j,script:Buffer.from(q,"hex")}})}return G}function RX(X){let $=e.get("apiKeys").blockchair||"";return jX(!$,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(J)=>wX({txHash:J,chain:X}),getConfirmedBalance:(J)=>yX({chain:X,address:J,apiKey:$}),getRawTx:(J)=>DX({txHash:J,chain:X,apiKey:$}),getSuggestedTxFee:()=>bX(X),getBalance:(J)=>EX({address:J,chain:X,apiKey:$}),getAddressData:(J)=>qX({address:J,chain:X,apiKey:$}),scanUTXOs:(J)=>SX({...J,chain:X,apiKey:$})}}function Z$(X){return X}function O(X){let $=e.get("apis")[X];if($)return jX(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),$;return RX(X)}import PX from"bs58check";import vX from"cashaddrjs";var zX;((J)=>{J.Mainnet="mainnet";J.Testnet="testnet"})(zX||={});var P={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function HX(X){try{return h(X),!0}catch($){return!1}}function YX(X){return h(X)?.network}function y(X){let $=h(X);if($?.format==="legacy")return X;return fX($)}function o(X){let $=h(X);return mX($)}function h(X){try{return gX(X)}catch($){}try{return xX(X)}catch($){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function gX(X){try{let $=PX.decode(X);if($.length!==21)throw new Error("Received an invalid Bitcoin Cash address as input.");let J=$[0],Q=Array.prototype.slice.call($,1);switch(J){case P.legacy.mainnet.p2pkh:return{hash:Q,format:"legacy",network:"mainnet",type:"p2pkh"};case P.legacy.mainnet.p2sh:return{hash:Q,format:"legacy",network:"mainnet",type:"p2sh"};case P.legacy.testnet.p2pkh:return{hash:Q,format:"legacy",network:"testnet",type:"p2pkh"};case P.legacy.testnet.p2sh:return{hash:Q,format:"legacy",network:"testnet",type:"p2sh"};case P.bitpay.mainnet.p2pkh:return{hash:Q,format:"bitpay",network:"mainnet",type:"p2pkh"};case P.bitpay.mainnet.p2sh:return{hash:Q,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new Error("Received an invalid Bitcoin Cash address as input.")}}catch($){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function xX(X){if(X.indexOf(":")!==-1)try{return MX(X)}catch($){}else{let $=["bitcoincash","bchtest","bchreg"];for(let J of $)try{return MX(`${J}:${X}`)}catch(Q){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function MX(X){try{let{hash:$,prefix:J,type:Q}=vX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call($,0),network:J==="bitcoincash"?"mainnet":"testnet",type:Q==="P2PKH"?"p2pkh":"p2sh"}}catch($){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function fX(X){let $=P.legacy[X.network][X.type],J=Buffer.alloc(1+X.hash.length);return J[0]=$,J.set(X.hash,1),PX.encode(J)}function mX(X){let $=X.network==="mainnet"?"bitcoincash":"bchtest",J=X.type==="p2pkh"?"P2PKH":"P2SH",Q=new Uint8Array(X.hash);return vX.encode($,J,Q)}import{Chain as k}from"@swapkit/helpers";var XX=(X)=>{switch(X){case k.Bitcoin:case k.BitcoinCash:return 550;case k.Dash:case k.Litecoin:return 5500;case k.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},N=({inputs:X,outputs:$,feeRate:J=1,chain:Q=k.Bitcoin})=>{let Z=Math.ceil(J),G=X[0]&&"address"in X[0]&&X[0].address?u(X[0].address):"P2PKH",W=X.filter((M)=>K(M)*Z<=M.value),L=BX+$.reduce((M,B)=>M+p(B,G),0),q=$.reduce((M,B)=>M+B.value,0),j=L*Z,D=0,U=[];for(let M of W){let B=K(M),v=Z*B;j+=v,D+=M.value,U.push(M);let z=j+q;if(D<z)continue;let T=D-z,I=Z*p({address:"",value:0},G);if(T>I){let C=I+j,x=D-(q+C);if(x>Math.max(K({})*Z,XX(Q)))return{inputs:U,outputs:$.concat({value:x,address:""}),fee:C}}return{inputs:U,outputs:$,fee:j}}return{fee:Z*A({inputs:X,outputs:$,feeRate:Z})}};var M$=1000,BX=10,P$=10;async function w(X){let{script:$,opcodes:J}=await import("bitcoinjs-lib"),Q=Buffer.from(X,"utf8");return $.compile([J.OP_RETURN,Q])}var $X;((J)=>{J.P2PKH="P2PKH";J.P2WPKH="P2WPKH"})($X||={});var JX={["P2PKH"]:148,["P2WPKH"]:68},r={["P2PKH"]:34,["P2WPKH"]:31},u=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},A=({inputs:X,outputs:$,feeRate:J})=>{let Q=X[0]&&"address"in X[0]&&X[0].address?u(X[0].address):"P2PKH",Z=X.filter((W)=>W.value>=JX["type"in W?W.type:"P2PKH"]*Math.ceil(J)).reduce((W,L)=>W+K(L),0),G=$?.reduce((W,L)=>W+p(L),0)||r[Q];return 10+Z+G},K=(X)=>{if("type"in X)return JX[X.type];if("address"in X&&X.address)return JX[u(X.address)];return 148},p=(X,$)=>{if(X?.script)return 10+X.script.length+(X.script.length>=74?2:1);if($)return r[$];return r.P2PKH};import{AssetValue as c,BaseDecimal as lX,Chain as n,FeeOption as QX,SwapKitNumber as CX}from"@swapkit/helpers";var d=[n.Dash,n.Dogecoin];function IX(X){return async function $({assetValue:J,recipient:Q,memo:Z,feeRate:G,sender:W,fetchTxHex:L=!1}){let q=await import("@bitcoinerlab/secp256k1"),{initEccLib:j,Psbt:D}=await import("bitcoinjs-lib"),U=Z?await w(Z):null,B=await _X(X)({assetValue:J,recipient:Q,memo:Z,sender:W,fetchTxHex:L}),{inputs:v,outputs:z}=N({...B,feeRate:G,chain:X});if(!(v&&z))throw new Error("Insufficient Balance for transaction");let T=await _(),I=new D({network:T(X)});if(X===n.Dogecoin)I.setMaximumFeeRate(650000000);for(let C of v)I.addInput({hash:C.hash,index:C.index,...!!C.witnessUtxo&&!d.includes(X)&&{witnessUtxo:C.witnessUtxo},...d.includes(X)&&{nonWitnessUtxo:C.txHex?Buffer.from(C.txHex,"hex"):void 0}});for(let C of z){let x="address"in C&&C.address?C.address:W,ZX=C.script?U?{script:U,value:0}:void 0:{address:x,value:C.value};if(ZX)j(q),I.addOutput(ZX)}return{psbt:I,utxos:B.inputs,inputs:v}}}async function oX(){let X=await import("@bitcoinerlab/secp256k1"),{initEccLib:$,address:J}=await import("bitcoinjs-lib"),Q=await _();return function Z({chain:G,address:W}){if(G===n.BitcoinCash)return b(W);return function L(q){try{return $(X),J.toOutputScript(q,Q(G)),!0}catch(j){return!1}}}}async function i(X){let $=await rX(X),J=await oX(),Q=await uX(X);return function Z(){return{accumulative:N,calculateTxSize:A,getAddressFromKeys:$,validateAddress:(G)=>J({chain:X,address:G}),broadcastTx:(G)=>O(X).broadcastTx(G),buildTx:IX(X),createKeysForPath:Q,getFeeRates:()=>a(X),getInputsOutputsFee:TX(X),transfer:cX(X),getPrivateKeyFromMnemonic:(G)=>{return Q(G).toWIF()},getBalance:nX(X),estimateTransactionFee:pX(X),estimateMaxSendableAmount:hX(X)}}}function TX(X){return async function $({assetValue:J,feeOptionKey:Q=QX.Fast,feeRate:Z,fetchTxHex:G=!1,memo:W,recipient:L,from:q}){let D=await _X(X)({assetValue:J,recipient:L,memo:W,sender:q,fetchTxHex:G}),U=Z?Math.floor(Z):(await a(X))[Q];return N({...D,feeRate:U,chain:X})}}function hX(X){return async function $({from:J,memo:Q,feeRate:Z,feeOptionKey:G=QX.Fast,recipients:W=1}){let L=await O(X).getAddressData(J),q=Z?Math.ceil(Z):(await a(X))[G],j=L?.utxo.map((v)=>({...v,type:"P2PKH",hash:""})).filter((v)=>v.value>Math.max(XX(X),K(v)*q));if(!j?.length)return c.from({chain:X});let D=c.from({chain:X,value:j.reduce((v,z)=>v+z.value,0)}),U=typeof W==="number"?Array.from({length:W},()=>({address:J,value:0})):W;if(Q){let v=await w(Q);U.push({address:J,script:v,value:0})}let B=A({inputs:j,outputs:U,feeRate:q})*q;return D.sub(B)}}function pX(X){return async($)=>{let Q=await TX(X)($);return c.from({chain:X,value:CX.fromBigInt(BigInt(Q.fee),8).getValue("string")})}}async function uX(X){let{ECPairFactory:$}=await import("ecpair"),J=await import("@bitcoinerlab/secp256k1"),{HDKey:Q}=await import("@scure/bip32"),{mnemonicToSeedSync:Z}=await import("@scure/bip39"),G=await _();return function W({phrase:L,wif:q,derivationPath:j}){if(!(q||L))throw new Error("Either phrase or wif must be provided");let D=$(J),U=G(X);if(q)return D.fromWIF(q,U);let M=Z(L),B=Q.fromMasterSeed(M,U).derive(j);if(!B.privateKey)throw new Error("Could not get private key from phrase");return D.fromPrivateKey(Buffer.from(B.privateKey),{network:U})}}async function rX(X){let{payments:$}=await import("bitcoinjs-lib"),J=await _();return function Q(Z){if(!Z)throw new Error("Keys must be provided");let G=d.includes(X)?$.p2pkh:$.p2wpkh,{address:W}=G({pubkey:Z.publicKey,network:J(X)});if(!W)throw new Error("Address not defined");return W}}function cX(X){return async function $({signTransaction:J,from:Q,memo:Z,recipient:G,feeOptionKey:W,broadcastTx:L,feeRate:q,assetValue:j}){if(!Q)throw new Error("From address must be provided");if(!G)throw new Error("Recipient address must be provided");if(!J)throw new Error("Sign transaction must be provided");let D=q||(await a(X))[W||QX.Fast],{psbt:U}=await IX(X)({recipient:G,feeRate:D,sender:Q,fetchTxHex:d.includes(X),assetValue:j,memo:Z}),M=await J(U);return M.finalizeAllInputs(),L(M.extractTransaction().toHex())}}function nX(X){return async function $(J,Q=!0){let Z=await O(X).getBalance(J),G=CX.fromBigInt(BigInt(Z),lX[X]).getValue("string");return[c.from({asset:`${X}.${X}`,value:G})]}}async function a(X){let $=await O(X).getSuggestedTxFee();return GX($)}function _X(X){return async function $({assetValue:J,recipient:Q,memo:Z,sender:G,fetchTxHex:W=!1}){return{inputs:await O(X).scanUTXOs({address:G,fetchTxHex:W}),outputs:[{address:Q,value:Number(J.bigIntValue)},...Z?[{address:"",script:await w(Z),value:0}]:[]]}}}var F=OX.BitcoinCash;function S(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function b(X){let $=S(X);return HX($)&&YX($)==="mainnet"}function R(X){return S(o(X))}async function FX(){let{getBalance:X,getFeeRates:$,broadcastTx:J,...Q}=(await i(OX.BitcoinCash))();function Z(G,W=!0){return X(S(o(G)))}return function G(){return{...Q,broadcastTx:J,buildBCHTx:VX,buildTx:sX,createKeysForPath:tX,getAddressFromKeys:eX,getBalance:Z,getFeeRates:$,stripPrefix:S,stripToCashAddress:R,validateAddress:b,transfer:aX({getFeeRates:$,broadcastTx:J})}}}async function VX({assetValue:X,recipient:$,memo:J,feeRate:Q,sender:Z}){let{Transaction:G,TransactionBuilder:W,address:L}=await import("@psf/bitcoincashjs-lib");if(!b($))throw new Error("Invalid address");let q=await O(F).scanUTXOs({address:R(Z),fetchTxHex:!0}),j=J?await w(J):null,D=[];D.push({address:$,value:X.getBaseValue("number")});let{inputs:U,outputs:M}=N({inputs:q,outputs:D,feeRate:Q,chain:F});if(!(U&&M))throw new Error("Balance insufficient for transaction");let B=await _(),v=new W(B(F));await Promise.all(U.map(async(z)=>{let T=await O(F).getRawTx(z.hash);v.addInput(G.fromBuffer(Buffer.from(T,"hex")),z.index)}));for(let z of M){let T="address"in z&&z.address?z.address:y(Z),I=await _(),C=L.toOutputScript(y(T),I(F));v.addOutput(C,z.value)}if(j)v.addOutput(j,0);return{builder:v,utxos:U}}function aX({broadcastTx:X,getFeeRates:$}){return async function J({signTransaction:Q,from:Z,recipient:G,assetValue:W,...L}){if(!Z)throw new Error("From address must be provided");if(!G)throw new Error("Recipient address must be provided");if(!Q)throw new Error("signTransaction must be provided");let q=L.feeRate||(await $())[iX.Fast],{builder:j,utxos:D}=await VX({...L,assetValue:W,feeRate:q,recipient:G,sender:Z}),M=(await Q({builder:j,utxos:D})).toHex();return X(M)}}async function sX({assetValue:X,recipient:$,memo:J,feeRate:Q,sender:Z}){let{Psbt:G}=await import("bitcoinjs-lib"),W=o($);if(!b(W))throw new Error("Invalid address");let L=await O(F).scanUTXOs({address:R(Z),fetchTxHex:!0}),q=Number(Q.toFixed(0)),j=J?await w(J):null,D=[];if(D.push({address:y($),value:X.getBaseValue("number")}),j)D.push({script:j,value:0});let{inputs:U,outputs:M}=N({inputs:L,outputs:D,feeRate:q,chain:F});if(!(U&&M))throw new Error("Balance insufficient for transaction");let B=await _(),v=new G({network:B(F)});for(let{hash:z,index:T,witnessUtxo:I}of U)v.addInput({hash:z,index:T,witnessUtxo:I});for(let z of M){let T="address"in z&&z.address?z.address:y(Z),I=z.script?j?{script:j,value:0}:void 0:{address:T,value:z.value};if(I)v.addOutput(I)}return{psbt:v,utxos:L,inputs:U}}async function tX({phrase:X,derivationPath:$=`${dX.BCH}/0`,wif:J}){let{ECPairFactory:Q}=await import("ecpair"),Z=await import("@bitcoinerlab/secp256k1"),{mnemonicToSeedSync:G}=await import("@scure/bip39"),{HDNode:W}=await import("@psf/bitcoincashjs-lib"),q=(await _())(F);if(J)return Q(Z).fromWIF(J,q);if(!X)throw new Error("No phrase provided");return W.fromSeedBuffer(Buffer.from(G(X)),q).derivePath($).keyPair}function eX(X){let $=X.getAddress(0);return R($)}async function y$(X){switch(X){case g.BitcoinCash:return await FX();case g.Bitcoin:case g.Dogecoin:case g.Litecoin:case g.Dash:return await i(X);default:throw new Error(`Chain ${X} is not supported`)}}export{b as validateAddress,WX as uniqid,y as toLegacyAddress,o as toCashAddress,R as stripToCashAddress,S as stripPrefix,GX as standardFeeRates,d as nonSegwitChains,HX as isValidAddress,_ as getUtxoNetwork,O as getUtxoApi,y$ as getToolboxByChain,u as getScriptTypeForAddress,p as getOutputSize,K as getInputSize,XX as getDustThreshold,oX as getAddressValidator,YX as detectAddressNetwork,i as createUTXOToolbox,Z$ as createCustomUtxoApi,w as compileMemo,A as calculateTxSize,IX as buildTx,N as accumulative,$X as UTXOScriptType,BX as TX_OVERHEAD,r as OutputSizes,P$ as OP_RETURN_OVERHEAD,zX as Network,M$ as MIN_TX_FEE,JX as InputSizes};
2
+
3
+ //# debugId=BA9D6587A2CF2EB364756E2164756E21