@swapkit/toolboxes 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) 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 +24 -0
  11. package/dist/evm/index.js +3 -0
  12. package/dist/evm/index.js.map +24 -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 +18 -0
  31. package/dist/utxo/index.js +3 -0
  32. package/dist/utxo/index.js.map +18 -0
  33. package/package.json +105 -0
  34. package/src/cosmos/index.ts +11 -0
  35. package/src/cosmos/thorchainUtils/addressFormat.ts +24 -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 +80 -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 +254 -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 +321 -0
  49. package/src/cosmos/types.ts +31 -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 +145 -0
  56. package/src/evm/index.ts +20 -0
  57. package/src/evm/provider.ts +6 -0
  58. package/src/evm/toolbox/EVMToolbox.ts +662 -0
  59. package/src/evm/toolbox/arb.ts +61 -0
  60. package/src/evm/toolbox/avax.ts +36 -0
  61. package/src/evm/toolbox/base.ts +42 -0
  62. package/src/evm/toolbox/bsc.ts +34 -0
  63. package/src/evm/toolbox/eth.ts +44 -0
  64. package/src/evm/toolbox/getToolboxByChain.ts +42 -0
  65. package/src/evm/toolbox/matic.ts +42 -0
  66. package/src/evm/toolbox/op.ts +163 -0
  67. package/src/evm/types.ts +118 -0
  68. package/src/index.ts +0 -0
  69. package/src/radix/index.ts +151 -0
  70. package/src/radix/toolbox.ts +693 -0
  71. package/src/solana/index.ts +49 -0
  72. package/src/solana/toolbox.ts +272 -0
  73. package/src/substrate/index.ts +3 -0
  74. package/src/substrate/toolbox/baseSubstrateToolbox.ts +286 -0
  75. package/src/substrate/toolbox/index.ts +40 -0
  76. package/src/substrate/types/index.ts +2 -0
  77. package/src/substrate/types/network.ts +42 -0
  78. package/src/substrate/types/wallet.ts +78 -0
  79. package/src/utxo/helpers/api.ts +431 -0
  80. package/src/utxo/helpers/bchaddrjs.ts +177 -0
  81. package/src/utxo/helpers/coinselect.ts +96 -0
  82. package/src/utxo/helpers/index.ts +5 -0
  83. package/src/utxo/helpers/txSize.ts +104 -0
  84. package/src/utxo/helpers/utils.ts +45 -0
  85. package/src/utxo/index.ts +9 -0
  86. package/src/utxo/toolbox/bitcoinCash.ts +281 -0
  87. package/src/utxo/toolbox/index.ts +37 -0
  88. package/src/utxo/toolbox/utxo.ts +360 -0
  89. package/src/utxo/types.ts +70 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/radix/index.ts"],
4
+ "sourcesContent": [
5
+ "import {\n type FungibleResourcesCollectionItem,\n GatewayApiClient,\n type StateEntityDetailsVaultResponseItem,\n type StateEntityFungiblesPageRequest,\n type StateEntityFungiblesPageResponse,\n} from \"@radixdlt/babylon-gateway-api-sdk\";\nimport { RadixDappToolkit } from \"@radixdlt/radix-dapp-toolkit\";\nimport { AssetValue, Chain, type SKConfigIntegrations } from \"@swapkit/helpers\";\n\nexport type RadixWallets = {\n [Chain.Radix]: Awaited<ReturnType<typeof RadixToolbox>>;\n};\n\ntype RadixGetBalanceParams = {\n address: string;\n networkApi: GatewayApiClient;\n};\n// Could not find anything sync in SDK, ask Radix team\nexport function validateAddress(address: string) {\n return address.startsWith(\"account_rdx1\") && address.length === 66;\n}\n\nfunction getBalance({ networkApi }: { networkApi: GatewayApiClient }) {\n return async function getBalance(address: string) {\n const fungibleResources = await fetchFungibleResources({ address, networkApi });\n const fungibleBalances = convertResourcesToBalances({\n resources: fungibleResources,\n networkApi,\n });\n return fungibleBalances;\n };\n}\n\nasync function fetchFungibleResources({\n address,\n networkApi,\n}: RadixGetBalanceParams): Promise<FungibleResourcesCollectionItem[]> {\n let hasNextPage = true;\n let nextCursor: string | undefined;\n let fungibleResources: FungibleResourcesCollectionItem[] = [];\n const stateVersion = await currentStateVersion(networkApi);\n while (hasNextPage) {\n const stateEntityFungiblesPageRequest: StateEntityFungiblesPageRequest = {\n address: address,\n limit_per_page: 100,\n cursor: nextCursor,\n at_ledger_state: {\n state_version: stateVersion,\n },\n };\n\n const stateEntityFungiblesPageResponse: StateEntityFungiblesPageResponse =\n await networkApi.state.innerClient.entityFungiblesPage({\n stateEntityFungiblesPageRequest: stateEntityFungiblesPageRequest,\n });\n\n fungibleResources = fungibleResources.concat(stateEntityFungiblesPageResponse.items);\n if (stateEntityFungiblesPageResponse.next_cursor) {\n nextCursor = stateEntityFungiblesPageResponse.next_cursor;\n } else {\n hasNextPage = false;\n }\n }\n return fungibleResources;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: <explanation>\nasync function convertResourcesToBalances({\n resources,\n networkApi,\n}: {\n resources: FungibleResourcesCollectionItem[]; //| NonFungibleResourcesCollectionItem[];\n networkApi: GatewayApiClient;\n}): Promise<AssetValue[]> {\n const balances: AssetValue[] = [];\n const BATCH_SIZE = 50;\n\n // Split resources into batches of up to 50 items\n const resourceBatches: FungibleResourcesCollectionItem[][] = [];\n for (let i = 0; i < resources.length; i += BATCH_SIZE) {\n resourceBatches.push(resources.slice(i, i + BATCH_SIZE));\n }\n\n for (const batch of resourceBatches) {\n const addresses = batch.map((item) => item.resource_address);\n const response: StateEntityDetailsVaultResponseItem[] =\n await networkApi.state.getEntityDetailsVaultAggregated(addresses);\n\n const divisibilities = new Map<string, { decimals: number; symbol: string }>();\n\n for (const result of response) {\n if (result.details !== undefined) {\n const metaDataSymbol = result.metadata?.items.find((item) => item.key === \"symbol\");\n const symbol =\n metaDataSymbol?.value.typed.type === \"String\" ? metaDataSymbol.value.typed.value : \"?\";\n\n if (result.details.type === \"FungibleResource\") {\n divisibilities.set(result.address, {\n decimals: result.details.divisibility,\n symbol,\n });\n }\n }\n }\n\n for (const item of batch) {\n if (item.aggregation_level === \"Global\") {\n const assetInfo = divisibilities.get(item.resource_address) || { decimals: 0, symbol: \"?\" };\n\n const balance = AssetValue.from({\n asset:\n assetInfo.symbol !== Chain.Radix\n ? `${Chain.Radix}.${assetInfo.symbol}-${item.resource_address}`\n : \"XRD.XRD\",\n value: item.amount,\n });\n balances.push(balance);\n }\n }\n }\n\n return balances;\n}\n\nasync function currentStateVersion(networkApi: GatewayApiClient) {\n return networkApi.status.getCurrent().then((status) => status.ledger_state.state_version);\n}\n\nexport const RadixToolbox = async ({\n dappConfig,\n}: { dappConfig: SKConfigIntegrations[\"radix\"] }) => {\n const radixToolkit = RadixDappToolkit({\n ...dappConfig,\n networkId: dappConfig.network?.networkId || 1,\n });\n\n const networkApi = GatewayApiClient.initialize(radixToolkit.gatewayApi.clientConfig);\n\n return {\n networkApi,\n getBalance: getBalance({ networkApi }),\n getAddress: () => {\n return \"\";\n },\n validateAddress,\n signAndBroadcast: (() => {\n throw new Error(\"Not implemented\");\n }) as (params: any) => Promise<string>,\n };\n};\n"
6
+ ],
7
+ "mappings": "6BAAA,2BAEE,0CAKF,2BAAS,qCACT,qBAAS,WAAY,yBAWd,SAAS,CAAe,CAAC,EAAiB,CAC/C,OAAO,EAAQ,WAAW,cAAc,GAAK,EAAQ,SAAW,GAGlE,SAAS,CAAU,EAAG,cAAgD,CACpE,OAAO,eAAe,CAAU,CAAC,EAAiB,CAChD,IAAM,EAAoB,MAAM,EAAuB,CAAE,UAAS,YAAW,CAAC,EAK9E,OAJyB,EAA2B,CAClD,UAAW,EACX,YACF,CAAC,GAKL,eAAe,CAAsB,EACnC,UACA,cACoE,CACpE,IAAI,EAAc,GACd,EACA,EAAuD,CAAC,EACtD,EAAe,MAAM,EAAoB,CAAU,EACzD,MAAO,EAAa,CAClB,IAAM,EAAmE,CACvE,QAAS,EACT,eAAgB,IAChB,OAAQ,EACR,gBAAiB,CACf,cAAe,CACjB,CACF,EAEM,EACJ,MAAM,EAAW,MAAM,YAAY,oBAAoB,CACrD,gCAAiC,CACnC,CAAC,EAGH,GADA,EAAoB,EAAkB,OAAO,EAAiC,KAAK,EAC/E,EAAiC,YACnC,EAAa,EAAiC,gBAE9C,GAAc,GAGlB,OAAO,EAIT,eAAe,CAA0B,EACvC,YACA,cAIwB,CACxB,IAAM,EAAyB,CAAC,EAC1B,EAAa,GAGb,EAAuD,CAAC,EAC9D,QAAS,EAAI,EAAG,EAAI,EAAU,OAAQ,GAJnB,GAKjB,EAAgB,KAAK,EAAU,MAAM,EAAG,EALvB,EAKqC,CAAC,EAGzD,QAAW,KAAS,EAAiB,CACnC,IAAM,EAAY,EAAM,IAAI,CAAC,IAAS,EAAK,gBAAgB,EACrD,EACJ,MAAM,EAAW,MAAM,gCAAgC,CAAS,EAE5D,EAAiB,IAAI,IAE3B,QAAW,KAAU,EACnB,GAAI,EAAO,UAAY,OAAW,CAChC,IAAM,EAAiB,EAAO,UAAU,MAAM,KAAK,CAAC,IAAS,EAAK,MAAQ,QAAQ,EAC5E,EACJ,GAAgB,MAAM,MAAM,OAAS,SAAW,EAAe,MAAM,MAAM,MAAQ,IAErF,GAAI,EAAO,QAAQ,OAAS,mBAC1B,EAAe,IAAI,EAAO,QAAS,CACjC,SAAU,EAAO,QAAQ,aACzB,QACF,CAAC,EAKP,QAAW,KAAQ,EACjB,GAAI,EAAK,oBAAsB,SAAU,CACvC,IAAM,EAAY,EAAe,IAAI,EAAK,gBAAgB,GAAK,CAAE,SAAU,EAAG,OAAQ,GAAI,EAEpF,EAAU,EAAW,KAAK,CAC9B,MACE,EAAU,SAAW,EAAM,MACvB,GAAG,EAAM,SAAS,EAAU,UAAU,EAAK,mBAC3C,UACN,MAAO,EAAK,MACd,CAAC,EACD,EAAS,KAAK,CAAO,GAK3B,OAAO,EAGT,eAAe,CAAmB,CAAC,EAA8B,CAC/D,OAAO,EAAW,OAAO,WAAW,EAAE,KAAK,CAAC,IAAW,EAAO,aAAa,aAAa,EAGnF,IAAM,EAAe,OAC1B,gBACmD,CACnD,IAAM,EAAe,EAAiB,IACjC,EACH,UAAW,EAAW,SAAS,WAAa,CAC9C,CAAC,EAEK,EAAa,EAAiB,WAAW,EAAa,WAAW,YAAY,EAEnF,MAAO,CACL,aACA,WAAY,EAAW,CAAE,YAAW,CAAC,EACrC,WAAY,IAAM,CAChB,MAAO,IAET,kBACA,iBAAmB,IAAM,CACvB,MAAM,IAAI,MAAM,iBAAiB,EAErC",
8
+ "debugId": "1EC1285B373EA15064756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,3 @@
1
+ var I={};B(I,{getAddressValidator:()=>Z,createSolanaTokenTransaction:()=>$,SOLToolbox:()=>M});module.exports=D(I);var q=require("@swapkit/helpers");async function Z(){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 $({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 M=()=>{async function T(){let{Connection:p}=await import("@solana/web3.js");return new p(q.SKConfig.get("rpcUrls").SOL,"confirmed")}return{getConnection:T,createKeysForPath:H,getAddressFromKeys:_,createSolanaTransaction:v(T),getBalance:y(T),transfer:N(T),broadcastTransaction:b(T),getAddressValidator:Z}};function v(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 Z();if(!(j||L(p)))throw new q.SwapKitError("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 $({amount:h.getBaseValue("number"),connection:E,decimals:h.decimal,from:S,recipient:p,tokenAddress:h.address}):void 0;if(!x)throw new q.SwapKitError("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 N(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 v(T)({recipient:p,assetValue:h,memo:W,fromPublicKey:S.publicKey,isProgramDerivedAddress:j});return R(z,U,[S])}}function b(T){return async(p)=>{return(await T()).sendRawTransaction(p.serialize())}}async function H({phrase:T,derivationPath:p=q.DerivationPath.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 _(T){return T.publicKey.toString()}async function P({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((G)=>G.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 q.AssetValue({value:q.SwapKitNumber.fromBigInt(x,w),decimal:w,identifier:`${q.Chain.Solana}.${J}${E?`-${E.toString()}`:""}`}))}function y(T){return async(p)=>{let{PublicKey:h}=await import("@solana/web3.js"),S=await T(),W=await S.getBalance(new h(p)),j=await P({connection:S,address:p});return[q.AssetValue.from({chain:q.Chain.Solana,value:BigInt(W)}),...j]}}
2
+
3
+ //# debugId=857DCD4407AD404264756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/solana/toolbox.ts"],
4
+ "sourcesContent": [
5
+ "import type { TokenInfo } from \"@solana/spl-token-registry\";\nimport 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: TokenInfo) => 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 { TokenInfo } from \"@solana/spl-token-registry\";\nimport 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: TokenInfo) => 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:()=>E,getToolboxByChain:()=>x,createKeyring:()=>z,chainflipNetwork:()=>S,ToolboxFactory:()=>N,PolkadotToolbox:()=>X,Network:()=>D,ChainflipToolbox:()=>Y,BaseSubstrateToolbox:()=>Q});module.exports=V(c);var R=require("@polkadot/api"),L=require("@polkadot/util"),u=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/"},D={DOT:O,FLIP:S,GENERIC:q};var E=(t)=>{return"address"in t},z=async(t,o)=>{return await u.cryptoWaitReady(),new R.Keyring({type:"sr25519",ss58Format:o}).addFromUri(t)},G=(t,o)=>t.rpc.system.accountNextIndex(o),Z=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),_=async(t,o,{recipient:I,assetValue:m,from:j})=>{let v=H(t,{recipient:I,amount:m.getBaseValue("number")}),p=E(o);if(!v)return;let y=j||(p?o.address:void 0);if(!y)throw new f.SwapKitError("core_transaction_invalid_sender_address");let P=await G(t,y);return(await v.signAndSend(p?o:y,{signer:p?void 0:o,nonce:P}))?.toString()},$=async(t,o,I,{recipient:m,assetValue:j,from:v})=>{let p=H(t,{recipient:m,amount:j.getBaseValue("number")}),y=v||E(o)&&o.address;if(!y)return;let P=await p?.paymentInfo(y,{nonce:await G(t,y)})||{partialFee:0};return I.set(f.SwapKitNumber.fromBigInt(BigInt(P.partialFee.toString()),I.decimal).getValue("string"))},U=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=u.decodeAddress(t);return u.encodeAddress(I,o)}function F(t,o){return L.isHex(t)?L.hexToU8a(t):u.decodeAddress(t,void 0,o)}function J(t,o="ss58",I){if(o==="hex")return L.u8aToHex(t);return u.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)=>E(j)?j.address:void 0,createTransfer:({recipient:j,assetValue:v})=>H(t,{recipient:j,amount:v.getBaseValue("number")}),getBalance:(j)=>Z(t,I,j),validateAddress:(j)=>W(j,o.prefix),transfer:(j)=>_(t,m,j),estimateTransactionFee:(j)=>$(t,m,I,j),sign:(j)=>{if(E(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)=>U(j,v),signAndBroadcast:({tx:j,callback:v,address:p})=>{if(E(m))return b(m,j,v);if(p)return B({signer:m,address:p,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?D.DOT:D.FLIP;return W(t,I)||W(t,D.GENERIC.prefix)};async function N({generic:t,chain:o,signer:I}){let m=f.SKConfig.get("rpcUrls")[o],j=new R.WsProvider(m),v=await R.ApiPromise.create({provider:j}),p=f.AssetValue.from({chain:o}),y=t?D.GENERIC:D[o];return Q({api:v,signer:I,gasAsset:p,network:y})}var M=require("@swapkit/helpers");var X=({signer:t,generic:o=!1})=>{return N({chain:M.Chain.Polkadot,generic:o,signer:t})},Y=async({signer:t,generic:o=!1})=>{let I=await N({chain:M.Chain.Chainflip,generic:o,signer:t});async function m(j){let{balance:v}=await I.api.query.flip?.account?.(j);return[M.AssetValue.from({chain:M.Chain.Chainflip,value:BigInt(v.toString())})]}return{...I,getBalance:m}},x=(t,o)=>{switch(t){case M.Chain.Chainflip:return Y(o);case M.Chain.Polkadot:return X(o);default:throw new Error(`Chain ${t} is not supported`)}};
2
+
3
+ //# debugId=FAD382FC548F30DD64756E2164756E21
@@ -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 { ApiPromise, Keyring, WsProvider } 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 cryptoWaitReady,\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 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 rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const provider = new WsProvider(rpcUrl);\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": "FAD382FC548F30DD64756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,3 @@
1
+ import"../chunk-tvrdndbw.js";import{ApiPromise as J,Keyring as Q,WsProvider as X}from"@polkadot/api";import{hexToU8a as Y,isHex as Z,u8aToHex as _}from"@polkadot/util";import{cryptoWaitReady as $,decodeAddress as W,encodeAddress as G}from"@polkadot/util-crypto";import{AssetValue as U,Chain as C,SKConfig as b,SwapKitError as E,SwapKitNumber as H}from"@swapkit/helpers";var q={prefix:0,network:"polkadot",displayName:"Polkadot Relay Chain",symbols:["DOT"],decimals:[10],standardAccount:"*25519",website:"https://polkadot.network"},z={prefix:2112,network:"chainflip",displayName:"Chainflip",symbols:["FLIP"],decimals:[18],standardAccount:"*25519",website:"https://chainflip.io/"},F={prefix:42,network:"substrate",displayName:"Substrate",symbols:[],decimals:[],standardAccount:"*25519",website:"https://substrate.io/"},y={DOT:q,FLIP:z,GENERIC:F};var u=(t)=>{return"address"in t},B=async(t,o)=>{return await $(),new Q({type:"sr25519",ss58Format:o}).addFromUri(t)},L=(t,o)=>t.rpc.system.accountNextIndex(o),h=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(H.fromBigInt(BigInt(m.data.free.toString()),o.decimal).getValue("string"))]},R=(t,o)=>{try{let I=O(t,o);return S(I,"ss58",o),!0}catch(I){return!1}},N=(t,{recipient:o,amount:I})=>t.tx.balances?.transferAllowDeath?.(o,I),T=async(t,o,{recipient:I,assetValue:m,from:j})=>{let v=N(t,{recipient:I,amount:m.getBaseValue("number")}),f=u(o);if(!v)return;let p=j||(f?o.address:void 0);if(!p)throw new E("core_transaction_invalid_sender_address");let D=await L(t,p);return(await v.signAndSend(f?o:p,{signer:f?void 0:o,nonce:D}))?.toString()},x=async(t,o,I,{recipient:m,assetValue:j,from:v})=>{let f=N(t,{recipient:m,amount:j.getBaseValue("number")}),p=v||u(o)&&o.address;if(!p)return;let D=await f?.paymentInfo(p,{nonce:await L(t,p)})||{partialFee:0};return I.set(H.fromBigInt(BigInt(D.partialFee.toString()),I.decimal).getValue("string"))},V=async(t,o)=>{if(o)return t.send(o);return(await t.send()).toString()},n=async(t,o)=>{return await o.signAsync(t)},c=(t,o,I)=>{if(I)return o.signAndSend(t,I);return o.signAndSend(t).toString()},w=async({signer:t,address:o,tx:I,callback:m,api:j})=>{let v=await L(j,o);if(m)I.signAndSend(o,{nonce:v,signer:t},m);return I.signAndSend(o,{nonce:v,signer:t}).toString()};function K(t,o){let I=W(t);return G(I,o)}function O(t,o){return Z(t)?Y(t):W(t,void 0,o)}function S(t,o="ss58",I){if(o==="hex")return _(t);return G(t,I)}var e=({api:t,network:o,gasAsset:I,signer:m})=>({api:t,network:o,gasAsset:I,decodeAddress:O,encodeAddress:S,convertAddress:K,createKeyring:(j)=>B(j,o.prefix),getAddress:(j=m)=>u(j)?j.address:void 0,createTransfer:({recipient:j,assetValue:v})=>N(t,{recipient:j,amount:v.getBaseValue("number")}),getBalance:(j)=>h(t,I,j),validateAddress:(j)=>R(j,o.prefix),transfer:(j)=>T(t,m,j),estimateTransactionFee:(j)=>x(t,m,I,j),sign:(j)=>{if(u(m))return n(m,j);throw new E("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},broadcast:(j,v)=>V(j,v),signAndBroadcast:({tx:j,callback:v,address:f})=>{if(u(m))return c(m,j,v);if(f)return w({signer:m,address:f,tx:j,callback:v,api:t});throw new E("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")}}),ot=({address:t,chain:o})=>{let{prefix:I}=o===C.Polkadot?y.DOT:y.FLIP;return R(t,I)||R(t,y.GENERIC.prefix)};async function P({generic:t,chain:o,signer:I}){let m=b.get("rpcUrls")[o],j=new X(m),v=await J.create({provider:j}),f=U.from({chain:o}),p=t?y.GENERIC:y[o];return e({api:v,signer:I,gasAsset:f,network:p})}import{AssetValue as k,Chain as M}from"@swapkit/helpers";var l=({signer:t,generic:o=!1})=>{return P({chain:M.Polkadot,generic:o,signer:t})},A=async({signer:t,generic:o=!1})=>{let I=await P({chain:M.Chainflip,generic:o,signer:t});async function m(j){let{balance:v}=await I.api.query.flip?.account?.(j);return[k.from({chain:M.Chainflip,value:BigInt(v.toString())})]}return{...I,getBalance:m}},vt=(t,o)=>{switch(t){case M.Chainflip:return A(o);case M.Polkadot:return l(o);default:throw new Error(`Chain ${t} is not supported`)}};export{F as subtrateNetwork,ot as substrateValidateAddress,q as polkadotNetwork,u as isKeyringPair,vt as getToolboxByChain,B as createKeyring,z as chainflipNetwork,P as ToolboxFactory,l as PolkadotToolbox,y as Network,A as ChainflipToolbox,e as BaseSubstrateToolbox};
2
+
3
+ //# debugId=A5BCCBBFDFBE7EA664756E2164756E21
@@ -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 { ApiPromise, Keyring, WsProvider } 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 cryptoWaitReady,\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 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 rpcUrl = SKConfig.get(\"rpcUrls\")[chain];\n const provider = new WsProvider(rpcUrl);\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": "6BAAA,qBAAS,aAAY,gBAAS,sBAI9B,mBAAS,WAAU,cAAO,uBAC1B,0BACE,mBACA,mBACA,8BAEF,qBACE,WACA,cACA,kBAEA,mBACA,yBCdK,IAAM,EAAkB,CAC7B,OAAQ,EACR,QAAS,WACT,YAAa,uBACb,QAAS,CAAC,KAAK,EACf,SAAU,CAAC,EAAE,EACb,gBAAiB,SACjB,QAAS,0BACX,EAEa,EAAmB,CAC9B,OAAQ,KACR,QAAS,YACT,YAAa,YACb,QAAS,CAAC,MAAM,EAChB,SAAU,CAAC,EAAE,EACb,gBAAiB,SACjB,QAAS,uBACX,EAEa,EAAkB,CAC7B,OAAQ,GACR,QAAS,YACT,YAAa,YACb,QAAS,CAAC,EACV,SAAU,CAAC,EACX,gBAAiB,SACjB,QAAS,uBACX,EAEa,EAAgE,CAC3E,IAAK,EACL,KAAM,EACN,QAAS,CACX,EDRO,IAAM,EAAgB,CAAC,IAA4D,CACxF,MAAO,YAAa,GAGT,EAAgB,MAAO,EAAgB,IAA0B,CAG5E,OAFA,MAAM,EAAgB,EAEf,IAAI,EAAQ,CAAE,KAAM,UAAW,WAAY,CAAc,CAAC,EAAE,WAAW,CAAM,GAGhF,EAAW,CAAC,EAAiB,IAAoB,EAAI,IAAI,OAAO,iBAAiB,CAAO,EAExF,EAAa,MAAO,EAAiB,EAAsB,IAAoB,CACnF,IAAM,EAAO,MAAM,EAAI,MAAM,QAAQ,UAAU,CAAO,EAGtD,IAAK,GAAM,MAAM,MAAQ,GAAM,MAAM,QACnC,MAAO,CAAC,EAAS,IAAI,CAAC,CAAC,EAGzB,MAAO,CACL,EAAS,IAEP,EAAc,WAAW,OAAO,EAAK,KAAK,KAAK,SAAS,CAAC,EAAG,EAAS,OAAO,EAAE,SAC5E,QACF,CACF,CACF,GAGI,EAAkB,CAAC,EAAiB,IAA0B,CAClE,GAAI,CACF,IAAM,EAAiB,EAAc,EAAS,CAAa,EAI3D,OAFA,EAAc,EAAgB,OAAQ,CAAa,EAE5C,SACA,EAAP,CACA,MAAO,KAIL,EAAiB,CACrB,GACE,YAAW,YACV,EAAI,GAAG,UAAU,qBAAqB,EAAW,CAAM,EAEtD,EAAW,MACf,EACA,GACE,YAAW,aAAY,UACtB,CACH,IAAM,EAAW,EAAe,EAAK,CACnC,YACA,OAAQ,EAAW,aAAa,QAAQ,CAC1C,CAAC,EAEK,EAAY,EAAc,CAAM,EAEtC,IAAK,EAAU,OAEf,IAAM,EAAU,IAAS,EAAa,EAAwB,QAAU,QACxE,IAAK,EAAS,MAAM,IAAI,EAAa,yCAAyC,EAE9E,IAAM,EAAQ,MAAM,EAAS,EAAK,CAAO,EAOzC,OALW,MAAM,EAAS,YAAY,EAAY,EAAS,EAAS,CAClE,OAAQ,EAAY,OAAY,EAChC,OACF,CAAC,IAEU,SAAS,GAGhB,EAAyB,MAC7B,EACA,EACA,GACE,YAAW,aAAY,UACtB,CACH,IAAM,EAAW,EAAe,EAAK,CAAE,YAAW,OAAQ,EAAW,aAAa,QAAQ,CAAE,CAAC,EAEvF,EAAU,GAAS,EAAc,CAAM,GAAK,EAAO,QACzD,IAAK,EAAS,OAEd,IAAM,EAAe,MAAM,GAAU,YAAY,EAAS,CACxD,MAAO,MAAM,EAAS,EAAK,CAAO,CACpC,CAAC,GAAM,CAAE,WAAY,CAAE,EACvB,OAAO,EAAS,IACd,EAAc,WAAW,OAAO,EAAY,WAAW,SAAS,CAAC,EAAG,EAAS,OAAO,EAAE,SACpF,QACF,CACF,GAGI,EAAY,MAChB,EACA,IACG,CACH,GAAI,EAAU,OAAO,EAAG,KAAK,CAAQ,EAErC,OADa,MAAM,EAAG,KAAK,GACf,SAAS,GAGjB,EAAO,MAAO,EAAsB,IAAwC,CAEhF,OADiB,MAAM,EAAG,UAAU,CAAM,GAItC,EAA0B,CAC9B,EACA,EACA,IACG,CACH,GAAI,EAAU,OAAO,EAAG,YAAY,EAAQ,CAAQ,EAEpD,OADa,EAAG,YAAY,CAAM,EACtB,SAAS,GAGjB,EAAmB,OACvB,SACA,UACA,KACA,WACA,SAOI,CACJ,IAAM,EAAQ,MAAM,EAAS,EAAK,CAAO,EACzC,GAAI,EACF,EAAG,YAAY,EAAS,CAAE,QAAO,QAAO,EAAG,CAAQ,EAGrD,OADa,EAAG,YAAY,EAAS,CAAE,QAAO,QAAO,CAAC,EAC1C,SAAS,GAGvB,SAAS,CAAc,CAAC,EAAiB,EAAmB,CAC1D,IAAM,EAAiB,EAAsB,CAAO,EAEpD,OADyB,EAAsB,EAAgB,CAAS,EAI1E,SAAS,CAAa,CAAC,EAAiB,EAAwB,CAC9D,OAAO,EAAM,CAAO,EAChB,EAAS,CAAO,EAChB,EAAsB,EAAS,OAAW,CAAa,EAG7D,SAAS,CAAa,CACpB,EACA,EAA2B,OAC3B,EACA,CACA,GAAI,IAAa,MACf,OAAO,EAAS,CAAO,EAGzB,OAAO,EAAsB,EAAS,CAAa,EAG9C,IAAM,EAAuB,EAClC,MACA,UACA,WACA,aAMK,CACL,MACA,UACA,WACA,gBACA,gBACA,iBACA,cAAe,CAAC,IAAmB,EAAc,EAAQ,EAAQ,MAAM,EACvE,WAAY,CAAC,EAAiC,IAC5C,EAAc,CAAO,EAAI,EAAQ,QAAU,OAC7C,eAAgB,EAAG,YAAW,gBAC5B,EAAe,EAAK,CAAE,YAAW,OAAQ,EAAW,aAAa,QAAQ,CAAE,CAAC,EAC9E,WAAY,CAAC,IAAoB,EAAW,EAAK,EAAU,CAAO,EAClE,gBAAiB,CAAC,IAAoB,EAAgB,EAAS,EAAQ,MAAM,EAC7E,SAAU,CAAC,IAAoC,EAAS,EAAK,EAAQ,CAAM,EAC3E,uBAAwB,CAAC,IACvB,EAAuB,EAAK,EAAQ,EAAU,CAAM,EACtD,KAAM,CAAC,IAAwC,CAC7C,GAAI,EAAc,CAAM,EACtB,OAAO,EAAK,EAAQ,CAAE,EAExB,MAAM,IAAI,EACR,iCACA,sEACF,GAEF,UAAW,CAAC,EAAqC,IAC/C,EAAU,EAAI,CAAQ,EACxB,iBAAkB,EAChB,KACA,WACA,aAKI,CACJ,GAAI,EAAc,CAAM,EACtB,OAAO,EAAwB,EAAQ,EAAI,CAAQ,EAGrD,GAAI,EACF,OAAO,EAAiB,CAAE,SAAQ,UAAS,KAAI,WAAU,KAAI,CAAC,EAGhE,MAAM,IAAI,EACR,iCACA,sEACF,EAEJ,GAEa,GAA2B,EACtC,UACA,WACkE,CAClE,IAAQ,UAAW,IAAU,EAAM,SAAW,EAAQ,IAAM,EAAQ,KAEpE,OAAO,EAAgB,EAAS,CAAM,GAAK,EAAgB,EAAS,EAAQ,QAAQ,MAAM,GAG5F,eAAsB,CAAc,EAClC,UACA,QACA,UAC4C,CAC5C,IAAM,EAAS,EAAS,IAAI,SAAS,EAAE,GACjC,EAAW,IAAI,EAAW,CAAM,EAChC,EAAM,MAAM,EAAW,OAAO,CAAE,UAAS,CAAC,EAC1C,EAAW,EAAW,KAAK,CAAE,OAAM,CAAC,EACpC,EAAU,EAAU,EAAQ,QAAU,EAAQ,GAEpD,OAAO,EAAqB,CAAE,MAAK,SAAQ,WAAU,SAAQ,CAAC,EElRhE,qBAAS,WAAY,yBAId,IAAM,EAAkB,EAAG,SAAQ,UAAU,MAA2B,CAC7E,OAAO,EAAe,CAAE,MAAO,EAAM,SAAU,UAAS,QAAO,CAAC,GAGrD,EAAmB,OAAS,SAAQ,UAAU,MAA2B,CACpF,IAAM,EAAU,MAAM,EAAe,CAAE,MAAO,EAAM,UAAW,UAAS,QAAO,CAAC,EAEhF,eAAe,CAAU,CAAC,EAAiB,CAGzC,IAAQ,WAAY,MAAM,EAAQ,IAAI,MAAM,MAAM,UAAU,CAAO,EAEnE,MAAO,CAAC,EAAW,KAAK,CAAE,MAAO,EAAM,UAAW,MAAO,OAAO,EAAQ,SAAS,CAAC,CAAE,CAAC,CAAC,EAGxF,MAAO,IAAK,EAAS,YAAW,GAQrB,GAAoB,CAC/B,EACA,IACmB,CACnB,OAAQ,QACD,EAAM,UACT,OAAO,EAAiB,CAAM,OAC3B,EAAM,SACT,OAAO,EAAgB,CAAM,UAE7B,MAAM,IAAI,MAAM,SAAS,oBAAwB",
10
+ "debugId": "A5BCCBBFDFBE7EA664756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,3 @@
1
+ var z$={};v$(z$,{validateAddress:()=>E,utxoValidateAddress:()=>X$,uniqid:()=>QG,toLegacyAddress:()=>g,toCashAddress:()=>m,stripToCashAddress:()=>f,stripPrefix:()=>R,standardFeeRates:()=>JG,nonSegwitChains:()=>r,networks:()=>l.networks,isValidAddress:()=>DG,getUtxoApi:()=>b,getToolboxByChain:()=>q$,getScriptTypeForAddress:()=>h,getOutputSize:()=>o,getNetwork:()=>Y,getInputSize:()=>N,getDustThreshold:()=>i,detectAddressNetwork:()=>WG,createCustomUtxoApi:()=>cG,compileMemo:()=>_,calculateTxSize:()=>x,buildTx:()=>qG,accumulative:()=>V,UTXOScriptType:()=>a,Transaction:()=>l.Transaction,TX_OVERHEAD:()=>t,Psbt:()=>l.Psbt,OutputSizes:()=>p,OP_RETURN_OVERHEAD:()=>bG,Network:()=>LG,MIN_TX_FEE:()=>aG,LTCToolbox:()=>gG,InputSizes:()=>s,DOGEToolbox:()=>SG,DASHToolbox:()=>AG,BaseUTXOToolbox:()=>k,BTCToolbox:()=>EG,BCHToolbox:()=>OG});module.exports=M$(z$);var l=require("bitcoinjs-lib");var I=require("@swapkit/helpers");var Z$=y(require("@bitcoinerlab/secp256k1")),K=require("@psf/bitcoincashjs-lib"),_G=require("@scure/bip39"),A=require("@swapkit/helpers"),kG=require("bitcoinjs-lib");var B=require("@swapkit/helpers");var C=require("@swapkit/helpers"),PG=require("bitcoinjs-lib"),S=y(require("coininfo")),xG=typeof process!=="undefined"&&process.pid?process.pid.toString(36):"",Y=(G)=>{switch(G){case C.Chain.Bitcoin:return PG.networks.bitcoin;case C.Chain.BitcoinCash:return S.default.bitcoincash.main.toBitcoinJS();case C.Chain.Dash:return S.default.dash.main.toBitcoinJS();case C.Chain.Litecoin:return S.default.litecoin.main.toBitcoinJS();case C.Chain.Dogecoin:{let $={private:70615956,public:70617039},J=S.default.dogecoin.test;return J.versions.bip32=$,S.default.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}},JG=(G)=>({[C.FeeOption.Average]:G,[C.FeeOption.Fast]:G*1.5,[C.FeeOption.Fastest]:G*2}),$G=0,RG=()=>{let G=Date.now(),$=$G||G;return $G=$,G>$G?G:$+1},QG=()=>xG+RG().toString(36);async function fG({chain:G,txHash:$}){let J=B.SKConfig.get("rpcUrls")[G],Q=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[$],id:QG()}),X=await B.RequestClient.post(J,{headers:{"Content-Type":"application/json"},body:Q});if(X.error)throw new Error(`failed to broadcast a transaction: ${X.error?.message}`);if(X.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return X.result}function c(G){return`https://api.blockchair.com/${lG(G)}`}function UG(G){switch(G){case B.Chain.Bitcoin:return 5;case B.Chain.Dogecoin:return 1e4;case B.Chain.Litecoin:return 1;default:return 2}}function lG(G){switch(G){case B.Chain.BitcoinCash:return"bitcoin-cash";case B.Chain.Litecoin:return"litecoin";case B.Chain.Dash:return"dash";case B.Chain.Dogecoin:return"dogecoin";case B.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function mG(G){try{let{feePerKb:$}=await B.RequestClient.get(`https://app.bitgo.com/api/v2/${G.toLowerCase()}/tx/fee`),J=$/1000;return Math.max(J,UG(G))}catch($){return UG(G)}}async function n(G,$){try{let J=await B.RequestClient.get(G);if(!J||J.context.code!==200)throw new Error(`failed to query ${G}`);return J.data}catch(J){if(!$)throw J;let Q=await B.RequestClient.get(`${G}${$?`&key=${$}`:""}`);if(!Q||Q.context.code!==200)throw new Error(`failed to query ${G}`);return Q.data}}async function BG({address:G,chain:$,apiKey:J}){if(!G)throw new Error("address is required");try{return(await n(`${c($)}/dashboards/address/${G}?transaction_details=true`,J))[G]}catch(Q){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function oG({address:G,chain:$,apiKey:J}){return(await BG({address:G,chain:$,apiKey:J}))?.address.balance||0}async function hG({chain:G,address:$,apiKey:J}){if(!$)throw new Error("address is required");try{return(await n(`${c(G)}/addresses/balances?addresses=${$}`,J))[$]||0}catch(Q){return 0}}async function TG({chain:G,apiKey:$,txHash:J}){if(!J)throw new Error("txHash is required");try{return(await n(`${c(G)}/raw/transaction/${J}`,$))?.[J]?.raw_transaction||""}catch(Q){return console.error(Q),""}}async function pG({chain:G,address:$,apiKey:J,offset:Q=0,limit:X=100}){return(await n(`${c(G)}/outputs?q=is_spent(false),recipient(${$})&limit=${X}&offset=${Q}`,J)).filter(({is_spent:W})=>!W).map(({script_hex:W,block_id:D,transaction_hash:z,index:q,value:j,spending_signature_hex:M})=>({hash:z,index:q,value:j,txHex:M,script_hex:W,is_confirmed:D!==-1}))}async function HG({chain:G,address:$,apiKey:J,offset:Q=0,limit:X=100}){if(!$)throw new Error("address is required");try{let L=await pG({chain:G,address:$,apiKey:J,offset:Q,limit:X});if(L.length<=X)return L;let Z=await HG({chain:G,address:$,apiKey:J,offset:Q+X,limit:X});return[...L,...Z]}catch(L){return console.error(L),[]}}async function rG({address:G,chain:$,apiKey:J,fetchTxHex:Q=!0}){let X=await HG({chain:$,address:G,apiKey:J}),L=[];for(let{hash:Z,index:W,script_hex:D,value:z}of X){let q;if(Q)q=await TG({txHash:Z,chain:$,apiKey:J});L.push({address:G,hash:Z,index:W,txHex:q,value:z,witnessUtxo:{value:z,script:Buffer.from(D,"hex")}})}return L}function uG(G){let $=B.SKConfig.get("apiKeys").blockchair||"";return B.warnOnce(!$,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(J)=>fG({txHash:J,chain:G}),getConfirmedBalance:(J)=>hG({chain:G,address:J,apiKey:$}),getRawTx:(J)=>TG({txHash:J,chain:G,apiKey:$}),getSuggestedTxFee:()=>mG(G),getBalance:(J)=>oG({address:J,chain:G,apiKey:$}),getAddressData:(J)=>BG({address:J,chain:G,apiKey:$}),scanUTXOs:(J)=>rG({...J,chain:G,apiKey:$})}}function cG(G){return G}function b(G){let $=B.SKConfig.get("apis")[G];if($)return B.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),$;return uG(G)}var XG=y(require("bs58check")),ZG=y(require("cashaddrjs"));var LG;((J)=>{J.Mainnet="mainnet";J.Testnet="testnet"})(LG||={});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 DG(G){try{return d(G),!0}catch($){return!1}}function WG(G){return d(G)?.network}function g(G){let $=d(G);if($?.format==="legacy")return G;return iG($)}function m(G){let $=d(G);return tG($)}function d(G){try{return nG(G)}catch($){}try{return dG(G)}catch($){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function nG(G){try{let $=XG.default.decode(G);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 dG(G){if(G.indexOf(":")!==-1)try{return YG(G)}catch($){}else{let $=["bitcoincash","bchtest","bchreg"];for(let J of $)try{return YG(`${J}:${G}`)}catch(Q){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function YG(G){try{let{hash:$,prefix:J,type:Q}=ZG.default.decode(G);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 iG(G){let $=P.legacy[G.network][G.type],J=Buffer.alloc(1+G.hash.length);return J[0]=$,J.set(G.hash,1),XG.default.encode(J)}function tG(G){let $=G.network==="mainnet"?"bitcoincash":"bchtest",J=G.type==="p2pkh"?"P2PKH":"P2SH",Q=new Uint8Array(G.hash);return ZG.default.encode($,J,Q)}var O=require("@swapkit/helpers");var i=(G)=>{switch(G){case O.Chain.Bitcoin:case O.Chain.BitcoinCash:return 550;case O.Chain.Dash:case O.Chain.Litecoin:return 5500;case O.Chain.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},V=({inputs:G,outputs:$,feeRate:J=1,chain:Q=O.Chain.Bitcoin})=>{let X=Math.ceil(J),L=G[0]&&"address"in G[0]&&G[0].address?h(G[0].address):"P2PKH",Z=G.filter((M)=>N(M)*X<=M.value),W=t+$.reduce((M,U)=>M+o(U,L),0),D=$.reduce((M,U)=>M+U.value,0),z=W*X,q=0,j=[];for(let M of Z){let U=N(M),v=X*U;z+=v,q+=M.value,j.push(M);let H=z+D;if(q<H)continue;let u=q-H,MG=X*o({address:"",value:0},L);if(u>MG){let vG=MG+z,zG=q-(D+vG);if(zG>Math.max(N({})*X,i(Q)))return{inputs:j,outputs:$.concat({value:zG,address:""}),fee:vG}}return{inputs:j,outputs:$,fee:z}}return{fee:X*x({inputs:G,outputs:$,feeRate:X})}};var e=require("bitcoinjs-lib"),aG=1000,t=10,bG=10,sG=41,eG=107,_=(G)=>{let $=Buffer.from(G,"utf8");return e.script.compile([e.opcodes.OP_RETURN,$])},a;((J)=>{J.P2PKH="P2PKH";J.P2WPKH="P2WPKH"})(a||={});var s={["P2PKH"]:148,["P2WPKH"]:68},p={["P2PKH"]:34,["P2WPKH"]:31},h=(G)=>{if(G.startsWith("bc1")||G.startsWith("ltc1"))return"P2WPKH";if(G.startsWith("1")||G.startsWith("3")||G.startsWith("L")||G.startsWith("M")||G.startsWith("X")||G.startsWith("D")||G.startsWith("bitcoincash:q")||G.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},x=({inputs:G,outputs:$,feeRate:J})=>{let Q=G[0]&&"address"in G[0]&&G[0].address?h(G[0].address):"P2PKH",X=G.filter((Z)=>Z.value>=s["type"in Z?Z.type:"P2PKH"]*Math.ceil(J)).reduce((Z,W)=>Z+N(W),0),L=$?.reduce((Z,W)=>Z+o(W),0)||p[Q];return t+X+L},N=(G)=>{if("type"in G)return s[G.type];if("address"in G&&G.address)return s[h(G.address)];return sG+eG},o=(G,$)=>{if(G?.script)return bG+G.script.length+(G.script.length>=74?2:1);if($)return p[$];return p.P2PKH};var jG=y(require("@bitcoinerlab/secp256k1")),IG=require("@scure/bip32"),wG=require("@scure/bip39"),T=require("@swapkit/helpers"),F=require("bitcoinjs-lib");var r=[T.Chain.Dash,T.Chain.Dogecoin];async function CG({phrase:G,wif:$,derivationPath:J,chain:Q}){let{ECPairFactory:X}=await import("ecpair");if(!($||G))throw new Error("Either phrase or wif must be provided");let L=X(jG),Z=Y(Q);if($)return L.fromWIF($,Z);let W=wG.mnemonicToSeedSync(G),D=IG.HDKey.fromMasterSeed(W,Z).derive(J);if(!D.privateKey)throw new Error("Could not get private key from phrase");return L.fromPrivateKey(Buffer.from(D.privateKey),{network:Z})}function NG({address:G,chain:$}){try{return F.initEccLib(jG),F.address.toOutputScript(G,Y($)),!0}catch(J){return!1}}function G$({keys:G,chain:$}){if(!G)throw new Error("Keys must be provided");let J=r.includes($)?F.payments.p2pkh:F.payments.p2wpkh,{address:Q}=J({pubkey:G.publicKey,network:Y($)});if(!Q)throw new Error("Address not defined");return Q}function $$(G){return async function $({signTransaction:J,from:Q,memo:X,recipient:L,feeOptionKey:Z,broadcastTx:W,feeRate:D,assetValue:z}){if(!Q)throw new Error("From address must be provided");if(!L)throw new Error("Recipient address must be provided");if(!J)throw new Error("Sign transaction must be provided");let q=D||(await GG(G))[Z||T.FeeOption.Fast],{psbt:j}=await qG(G)({recipient:L,feeRate:q,sender:Q,fetchTxHex:r.includes(G),assetValue:z,memo:X}),M=await J(j);return M.finalizeAllInputs(),W(M.extractTransaction().toHex())}}var J$=async({address:G,chain:$})=>{let J=await b($).getBalance(G),Q=T.SwapKitNumber.fromBigInt(BigInt(J),T.BaseDecimal[$]).getValue("string");return[T.AssetValue.from({asset:`${$}.${$}`,value:Q})]};async function GG(G){let $=await b(G).getSuggestedTxFee();return JG($)}function VG(G){return async function $({assetValue:J,recipient:Q,memo:X,sender:L,fetchTxHex:Z=!1}){return{inputs:await b(G).scanUTXOs({address:L,fetchTxHex:Z}),outputs:[{address:Q,value:Number(J.bigIntValue)},...X?[{address:"",script:_(X),value:0}]:[]]}}}function qG(G){return async function $({assetValue:J,recipient:Q,memo:X,feeRate:L,sender:Z,fetchTxHex:W=!1}){let D=X?_(X):null,q=await VG(G)({assetValue:J,recipient:Q,memo:X,sender:Z,fetchTxHex:W}),{inputs:j,outputs:M}=V({...q,feeRate:L,chain:G});if(!(j&&M))throw new Error("Insufficient Balance for transaction");let U=new F.Psbt({network:Y(G)});if(G===T.Chain.Dogecoin)U.setMaximumFeeRate(650000000);for(let v of j)U.addInput({hash:v.hash,index:v.index,...!!v.witnessUtxo&&!r.includes(G)&&{witnessUtxo:v.witnessUtxo},...r.includes(G)&&{nonWitnessUtxo:v.txHex?Buffer.from(v.txHex,"hex"):void 0}});for(let v of M){let H="address"in v&&v.address?v.address:Z,u=v.script?D?{script:D,value:0}:void 0:{address:H,value:v.value};if(u)F.initEccLib(jG),U.addOutput(u)}return{psbt:U,utxos:q.inputs,inputs:j}}}function FG(G){return async function $({assetValue:J,feeOptionKey:Q=T.FeeOption.Fast,feeRate:X,fetchTxHex:L=!1,memo:Z,recipient:W,from:D}){let q=await VG(G)({assetValue:J,recipient:W,memo:Z,sender:D,fetchTxHex:L}),j=X?Math.floor(X):(await GG(G))[Q];return V({...q,feeRate:j,chain:G})}}function Q$(G){return async function $({from:J,memo:Q,feeRate:X,feeOptionKey:L=T.FeeOption.Fast,recipients:Z=1}){let W=await b(G).getAddressData(J),D=X?Math.ceil(X):(await GG(G))[L],z=W?.utxo.map((v)=>({...v,type:"P2PKH",hash:""})).filter((v)=>v.value>Math.max(i(G),N(v)*D));if(!z?.length)return T.AssetValue.from({chain:G});let q=T.AssetValue.from({chain:G,value:z.reduce((v,H)=>v+H.value,0)}),j=typeof Z==="number"?Array.from({length:Z},()=>({address:J,value:0})):Z;if(Q){let v=_(Q);j.push({address:J,script:v,value:0})}let U=x({inputs:z,outputs:j,feeRate:D})*D;return q.sub(U)}}var k=(G)=>({accumulative:V,calculateTxSize:x,getFeeRates:()=>GG(G),buildTx:qG(G),transfer:$$(G),getInputsOutputsFee:FG(G),broadcastTx:($)=>b(G).broadcastTx($),getAddressFromKeys:($)=>G$({keys:$,chain:G}),validateAddress:($)=>NG({address:$,chain:G}),createKeysForPath:($)=>CG({...$,chain:G}),getPrivateKeyFromMnemonic:async($)=>{return(await CG({...$,chain:G})).toWIF()},getBalance:async($,J)=>J$({address:$,chain:G}),estimateTransactionFee:async($)=>{let Q=await FG(G)($);return T.AssetValue.from({chain:G,value:T.SwapKitNumber.fromBigInt(BigInt(Q.fee),8).getValue("string")})},estimateMaxSendableAmount:async($)=>Q$({...$,chain:G})});function X$({chain:G,address:$}){return G===T.Chain.BitcoinCash?E($):NG({address:$,chain:G})}var w=A.Chain.BitcoinCash,f=(G)=>R(m(G)),KG=async({assetValue:G,recipient:$,memo:J,feeRate:Q,sender:X})=>{if(!E($))throw new Error("Invalid address");let L=await b(w).scanUTXOs({address:f(X),fetchTxHex:!0}),Z=J?_(J):null,W=[];W.push({address:$,value:G.getBaseValue("number")});let{inputs:D,outputs:z}=V({inputs:L,outputs:W,feeRate:Q,chain:w});if(!(D&&z))throw new Error("Balance insufficient for transaction");let q=new K.TransactionBuilder(Y(w));await Promise.all(D.map(async(j)=>{let M=await b(w).getRawTx(j.hash);q.addInput(K.Transaction.fromBuffer(Buffer.from(M,"hex")),j.index)}));for(let j of z){let M="address"in j&&j.address?j.address:g(X),U=K.address.toOutputScript(g(M),Y(w));q.addOutput(U,j.value)}if(Z)q.addOutput(Z,0);return{builder:q,utxos:D}},L$=async({signTransaction:G,from:$,recipient:J,assetValue:Q,broadcastTx:X,getFeeRates:L,...Z})=>{if(!$)throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");if(!G)throw new Error("signTransaction must be provided");let W=Z.feeRate||(await L())[A.FeeOption.Fast],{builder:D,utxos:z}=await KG({...Z,assetValue:Q,feeRate:W,recipient:J,sender:$}),j=(await G({builder:D,utxos:z})).toHex();return X(j)},D$=async({assetValue:G,recipient:$,memo:J,feeRate:Q,sender:X})=>{let L=m($);if(!E(L))throw new Error("Invalid address");let Z=await b(w).scanUTXOs({address:f(X),fetchTxHex:!0}),W=Number(Q.toFixed(0)),D=J?_(J):null,z=[];if(z.push({address:g($),value:G.getBaseValue("number")}),D)z.push({script:D,value:0});let{inputs:q,outputs:j}=V({inputs:Z,outputs:z,feeRate:W,chain:w});if(!(q&&j))throw new Error("Balance insufficient for transaction");let M=new kG.Psbt({network:Y(w)});for(let{hash:U,index:v,witnessUtxo:H}of q)M.addInput({hash:U,index:v,witnessUtxo:H});for(let U of j){let v="address"in U&&U.address?U.address:g(X),H=U.script?D?{script:D,value:0}:void 0:{address:v,value:U.value};if(H)M.addOutput(H)}return{psbt:M,utxos:Z,inputs:q}},R=(G)=>G.replace(/(bchtest:|bitcoincash:)/,""),E=(G)=>{let $=R(G);return DG($)&&WG($)==="mainnet"},W$=async({phrase:G,derivationPath:$=`${A.DerivationPath.BCH}/0`,wif:J})=>{let{ECPairFactory:Q}=await import("ecpair"),X=Y(w);if(J)return Q(Z$).fromWIF(J,X);if(!G)throw new Error("No phrase provided");return K.HDNode.fromSeedBuffer(Buffer.from(_G.mnemonicToSeedSync(G)),X).derivePath($).keyPair},j$=(G)=>{let $=G.getAddress(0);return f($)},yG=()=>{let{getBalance:G,...$}=k(A.Chain.BitcoinCash);return{...$,stripPrefix:R,stripToCashAddress:f,validateAddress:E,createKeysForPath:W$,getAddressFromKeys:j$,buildBCHTx:KG,buildTx:D$,getBalance:(J,Q)=>G(R(m(J))),transfer:(J)=>L$({...J,getFeeRates:$.getFeeRates,broadcastTx:$.broadcastTx})}};var OG=yG,EG=()=>k(I.Chain.Bitcoin),AG=()=>k(I.Chain.Dash),SG=()=>k(I.Chain.Dogecoin),gG=()=>k(I.Chain.Litecoin),q$=(G)=>{switch(G){case I.Chain.BitcoinCash:return OG;case I.Chain.Bitcoin:return EG;case I.Chain.Dogecoin:return SG;case I.Chain.Litecoin:return gG;case I.Chain.Dash:return AG;default:throw new Error(`Chain ${G} is not supported`)}};
2
+
3
+ //# debugId=C5DC7708B6AABAF864756E2164756E21
@@ -0,0 +1,18 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utxo/index.ts", "../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
+ "export { type Network, networks, Psbt, Transaction } from \"bitcoinjs-lib\";\n\n/**\n * Package\n */\nexport * from \"./toolbox/index\";\nexport * from \"./toolbox/utxo\";\nexport * from \"./helpers/index\";\nexport * from \"./types\";\n",
6
+ "import { Chain } from \"@swapkit/helpers\";\n\nimport { createBCHToolbox } from \"./bitcoinCash\";\nimport { BaseUTXOToolbox } from \"./utxo\";\n\ntype ToolboxType = {\n BCH: typeof BCHToolbox;\n BTC: typeof BTCToolbox;\n DOGE: typeof DOGEToolbox;\n LTC: typeof LTCToolbox;\n DASH: typeof DASHToolbox;\n};\n\nexport const BCHToolbox = createBCHToolbox;\nexport const BTCToolbox = () => BaseUTXOToolbox(Chain.Bitcoin);\nexport const DASHToolbox = () => BaseUTXOToolbox(Chain.Dash);\nexport const DOGEToolbox = () => BaseUTXOToolbox(Chain.Dogecoin);\nexport const LTCToolbox = () => BaseUTXOToolbox(Chain.Litecoin);\n\nexport const getToolboxByChain = <T extends keyof ToolboxType>(chain: T): ToolboxType[T] => {\n switch (chain) {\n case Chain.BitcoinCash:\n return BCHToolbox as ToolboxType[T];\n case Chain.Bitcoin:\n return BTCToolbox as ToolboxType[T];\n case Chain.Dogecoin:\n return DOGEToolbox as ToolboxType[T];\n case Chain.Litecoin:\n return LTCToolbox as ToolboxType[T];\n case Chain.Dash:\n return DASHToolbox as ToolboxType[T];\n default:\n throw new Error(`Chain ${chain} is not supported`);\n }\n};\n\nexport { stripToCashAddress, stripPrefix, validateAddress } from \"./bitcoinCash\";\n",
7
+ "import * as secp256k1 from \"@bitcoinerlab/secp256k1\";\nimport {\n HDNode,\n Transaction,\n TransactionBuilder,\n address as bchAddress,\n // @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\n} from \"@psf/bitcoincashjs-lib\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport { Chain, DerivationPath, FeeOption, type UTXOChain } from \"@swapkit/helpers\";\nimport { Psbt } from \"bitcoinjs-lib\";\n\nimport {\n accumulative,\n Network as bchNetwork,\n compileMemo,\n detectAddressNetwork,\n getNetwork,\n getUtxoApi,\n isValidAddress,\n toCashAddress,\n toLegacyAddress,\n} from \"../helpers\";\nimport type {\n TargetOutput,\n TransactionBuilderType,\n TransactionType,\n UTXOBuildTxParams,\n UTXOType,\n UTXOWalletTransferParams,\n} from \"../types\";\n\nimport { BaseUTXOToolbox } from \"./utxo\";\n\n// needed because TS can not infer types\ntype BCHMethods = {\n stripPrefix: (address: string) => string;\n stripToCashAddress: (address: string) => string;\n validateAddress: (address: string, chain?: UTXOChain) => boolean;\n createKeysForPath: (params: {\n wif?: string;\n phrase?: string;\n derivationPath?: string;\n }) => Promise<{ getAddress: (index?: number) => string }>;\n getAddressFromKeys: (keys: { getAddress: (index?: number) => string }) => string;\n buildBCHTx: (\n params: UTXOBuildTxParams,\n ) => Promise<{ builder: TransactionBuilderType; utxos: UTXOType[] }>;\n buildTx: (params: UTXOBuildTxParams) => Promise<{ psbt: Psbt }>;\n transfer: (\n params: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n >,\n ) => Promise<string>;\n};\n\nconst chain = Chain.BitcoinCash as UTXOChain;\n\nexport const stripToCashAddress = (address: string) => stripPrefix(toCashAddress(address));\n\nconst buildBCHTx: BCHMethods[\"buildBCHTx\"] = async ({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n}) => {\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 ? 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\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 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\nconst transfer = async ({\n signTransaction,\n from,\n recipient,\n assetValue,\n broadcastTx,\n getFeeRates,\n ...rest\n}: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n> & {\n broadcastTx: (txHash: string) => Promise<string>;\n getFeeRates: () => Promise<Record<FeeOption, number>>;\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\nconst buildTx = async ({\n assetValue,\n recipient,\n memo,\n feeRate,\n sender,\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: TODO: refactor\n}: UTXOBuildTxParams) => {\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 ? 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 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\nexport const stripPrefix = (address: string) => address.replace(/(bchtest:|bitcoincash:)/, \"\");\n\nexport const validateAddress = (address: string) => {\n const strippedAddress = stripPrefix(address);\n return (\n isValidAddress(strippedAddress) && detectAddressNetwork(strippedAddress) === bchNetwork.Mainnet\n );\n};\n\nconst createKeysForPath: BCHMethods[\"createKeysForPath\"] = async ({\n phrase,\n derivationPath = `${DerivationPath.BCH}/0`,\n wif,\n}) => {\n const { ECPairFactory } = await import(\"ecpair\");\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\nconst getAddressFromKeys = (keys: { getAddress: (index?: number) => string }) => {\n const address = keys.getAddress(0);\n return stripToCashAddress(address);\n};\n\nexport const createBCHToolbox = (): Omit<\n ReturnType<typeof BaseUTXOToolbox>,\n \"getAddressFromKeys\" | \"transfer\" | \"createKeysForPath\"\n> &\n BCHMethods => {\n const { getBalance, ...toolbox } = BaseUTXOToolbox(Chain.BitcoinCash);\n\n return {\n ...toolbox,\n stripPrefix,\n stripToCashAddress,\n validateAddress,\n createKeysForPath,\n getAddressFromKeys,\n buildBCHTx,\n buildTx,\n getBalance: (address: string, _potentialScamFilter?: boolean) =>\n getBalance(stripPrefix(toCashAddress(address))),\n transfer: (\n params: UTXOWalletTransferParams<\n { builder: TransactionBuilderType; utxos: UTXOType[] },\n TransactionType\n >,\n ) =>\n transfer({ ...params, getFeeRates: toolbox.getFeeRates, broadcastTx: toolbox.broadcastTx }),\n };\n};\n",
8
+ "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",
9
+ "import { Chain, FeeOption } from \"@swapkit/helpers\";\nimport { networks } from \"bitcoinjs-lib\";\n// @ts-ignore TODO: check why wallets doesn't see modules included in toolbox\nimport coininfo from \"coininfo\";\n\nconst pid = typeof process !== \"undefined\" && process.pid ? process.pid.toString(36) : \"\";\n\nexport const 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\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",
10
+ "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",
11
+ "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",
12
+ "import { opcodes, script } from \"bitcoinjs-lib\";\n\nimport 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 const compileMemo = (memo: string) => {\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",
13
+ "import * as secp256k1 from \"@bitcoinerlab/secp256k1\";\nimport { HDKey } from \"@scure/bip32\";\nimport { mnemonicToSeedSync } from \"@scure/bip39\";\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n FeeOption,\n SwapKitNumber,\n type UTXOChain,\n} from \"@swapkit/helpers\";\nimport { Psbt, address as btcLibAddress, initEccLib, payments } from \"bitcoinjs-lib\";\nimport type { ECPairInterface } from \"ecpair\";\n\nimport {\n UTXOScriptType,\n accumulative,\n calculateTxSize,\n compileMemo,\n getDustThreshold,\n getInputSize,\n getNetwork,\n getUtxoApi,\n standardFeeRates,\n} from \"../helpers\";\nimport type { TargetOutput, UTXOBuildTxParams, UTXOType, UTXOWalletTransferParams } from \"../types\";\nimport { validateAddress as validateBCHAddress } from \"./bitcoinCash\";\nimport type { BCHToolbox, BTCToolbox, DASHToolbox, DOGEToolbox, LTCToolbox } from \"./index\";\n\nexport const nonSegwitChains = [Chain.Dash, Chain.Dogecoin];\n\nasync function createKeysForPath({\n phrase,\n wif,\n derivationPath,\n chain,\n}: { phrase?: string; wif?: string; derivationPath: string; chain: Chain }) {\n const { ECPairFactory } = await import(\"ecpair\");\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\nfunction validateAddress({ address, chain }: { address: string; chain: UTXOChain }) {\n try {\n initEccLib(secp256k1);\n btcLibAddress.toOutputScript(address, getNetwork(chain));\n return true;\n } catch (_error) {\n return false;\n }\n}\n\nfunction getAddressFromKeys({ keys, chain }: { chain: UTXOChain; 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\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\nconst getBalance = async ({ address, chain }: { address: string; chain: UTXOChain }) => {\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\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: compileMemo(memo), value: 0 }] : []),\n ],\n };\n };\n}\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 compiledMemo = memo ? 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 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\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 compiledMemo = compileMemo(memo);\n outputs.push({ address: from, script: compiledMemo, 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\nexport const BaseUTXOToolbox = (chain: UTXOChain) => ({\n accumulative,\n calculateTxSize,\n getFeeRates: () => getFeeRates(chain),\n buildTx: buildTx(chain),\n transfer: transfer(chain),\n getInputsOutputsFee: getInputsOutputsFee(chain),\n\n broadcastTx: (txHash: string) => getUtxoApi(chain).broadcastTx(txHash),\n getAddressFromKeys: (keys: ECPairInterface) => getAddressFromKeys({ keys, chain }),\n validateAddress: (address: string) => validateAddress({ address, chain }),\n createKeysForPath: (params: any) => createKeysForPath({ ...params, chain }),\n\n getPrivateKeyFromMnemonic: async (params: {\n phrase: string;\n derivationPath: string;\n }) => {\n const keys = await createKeysForPath({ ...params, chain });\n return keys.toWIF();\n },\n\n getBalance: async (address: string, _potentialScamFilter?: boolean) =>\n getBalance({ address, chain }),\n\n estimateTransactionFee: 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 estimateMaxSendableAmount: async (params: any) => estimateMaxSendableAmount({ ...params, chain }),\n});\n\nexport function utxoValidateAddress({ chain, address }: { chain: UTXOChain; address: string }) {\n return chain === Chain.BitcoinCash\n ? validateBCHAddress(address)\n : validateAddress({ address, chain });\n}\n\nexport type BaseUTXOWallet = ReturnType<typeof BaseUTXOToolbox>;\ntype UTXOWalletType = {\n [Chain.Bitcoin]: ReturnType<typeof BTCToolbox>;\n [Chain.BitcoinCash]: ReturnType<typeof BCHToolbox>;\n [Chain.Dogecoin]: ReturnType<typeof DOGEToolbox>;\n [Chain.Litecoin]: ReturnType<typeof LTCToolbox>;\n [Chain.Dash]: ReturnType<typeof DASHToolbox>;\n};\nexport type UTXOWallets = { [chain in UTXOChain]: BaseUTXOWallet & UTXOWalletType[chain] };\n"
14
+ ],
15
+ "mappings": "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",
16
+ "debugId": "C5DC7708B6AABAF864756E2164756E21",
17
+ "names": []
18
+ }
@@ -0,0 +1,3 @@
1
+ import{a as CG,b as FG}from"../chunk-tvrdndbw.js";import{networks as BJ,Psbt as TJ,Transaction as HJ}from"bitcoinjs-lib";import{Chain as b}from"@swapkit/helpers";import*as L$ from"@bitcoinerlab/secp256k1";import{HDNode as D$,Transaction as W$,TransactionBuilder as j$,address as q$}from"@psf/bitcoincashjs-lib";import{mnemonicToSeedSync as M$}from"@scure/bip39";import{Chain as kG,DerivationPath as v$,FeeOption as z$}from"@swapkit/helpers";import{Psbt as P$}from"bitcoinjs-lib";import{Chain as C,RequestClient as g,SKConfig as i,warnOnce as WG}from"@swapkit/helpers";import{Chain as k,FeeOption as n}from"@swapkit/helpers";import{networks as OG}from"bitcoinjs-lib";import K from"coininfo";var EG=typeof process!=="undefined"&&process.pid?process.pid.toString(36):"",T=(G)=>{switch(G){case k.Bitcoin:return OG.bitcoin;case k.BitcoinCash:return K.bitcoincash.main.toBitcoinJS();case k.Dash:return K.dash.main.toBitcoinJS();case k.Litecoin:return K.litecoin.main.toBitcoinJS();case k.Dogecoin:{let $={private:70615956,public:70617039},J=K.dogecoin.test;return J.versions.bip32=$,K.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}},ZG=(G)=>({[n.Average]:G,[n.Fast]:G*1.5,[n.Fastest]:G*2}),d=0,AG=()=>{let G=Date.now(),$=d||G;return d=$,G>d?G:$+1},LG=()=>EG+AG().toString(36);async function SG({chain:G,txHash:$}){let J=i.get("rpcUrls")[G],Q=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[$],id:LG()}),X=await g.post(J,{headers:{"Content-Type":"application/json"},body:Q});if(X.error)throw new Error(`failed to broadcast a transaction: ${X.error?.message}`);if(X.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return X.result}function x(G){return`https://api.blockchair.com/${gG(G)}`}function DG(G){switch(G){case C.Bitcoin:return 5;case C.Dogecoin:return 1e4;case C.Litecoin:return 1;default:return 2}}function gG(G){switch(G){case C.BitcoinCash:return"bitcoin-cash";case C.Litecoin:return"litecoin";case C.Dash:return"dash";case C.Dogecoin:return"dogecoin";case C.Polkadot:return"polkadot";default:return"bitcoin"}}async function xG(G){try{let{feePerKb:$}=await g.get(`https://app.bitgo.com/api/v2/${G.toLowerCase()}/tx/fee`),J=$/1000;return Math.max(J,DG(G))}catch($){return DG(G)}}async function R(G,$){try{let J=await g.get(G);if(!J||J.context.code!==200)throw new Error(`failed to query ${G}`);return J.data}catch(J){if(!$)throw J;let Q=await g.get(`${G}${$?`&key=${$}`:""}`);if(!Q||Q.context.code!==200)throw new Error(`failed to query ${G}`);return Q.data}}async function jG({address:G,chain:$,apiKey:J}){if(!G)throw new Error("address is required");try{return(await R(`${x($)}/dashboards/address/${G}?transaction_details=true`,J))[G]}catch(Q){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function RG({address:G,chain:$,apiKey:J}){return(await jG({address:G,chain:$,apiKey:J}))?.address.balance||0}async function fG({chain:G,address:$,apiKey:J}){if(!$)throw new Error("address is required");try{return(await R(`${x(G)}/addresses/balances?addresses=${$}`,J))[$]||0}catch(Q){return 0}}async function qG({chain:G,apiKey:$,txHash:J}){if(!J)throw new Error("txHash is required");try{return(await R(`${x(G)}/raw/transaction/${J}`,$))?.[J]?.raw_transaction||""}catch(Q){return console.error(Q),""}}async function lG({chain:G,address:$,apiKey:J,offset:Q=0,limit:X=100}){return(await R(`${x(G)}/outputs?q=is_spent(false),recipient(${$})&limit=${X}&offset=${Q}`,J)).filter(({is_spent:W})=>!W).map(({script_hex:W,block_id:D,transaction_hash:z,index:q,value:j,spending_signature_hex:M})=>({hash:z,index:q,value:j,txHex:M,script_hex:W,is_confirmed:D!==-1}))}async function MG({chain:G,address:$,apiKey:J,offset:Q=0,limit:X=100}){if(!$)throw new Error("address is required");try{let L=await lG({chain:G,address:$,apiKey:J,offset:Q,limit:X});if(L.length<=X)return L;let Z=await MG({chain:G,address:$,apiKey:J,offset:Q+X,limit:X});return[...L,...Z]}catch(L){return console.error(L),[]}}async function mG({address:G,chain:$,apiKey:J,fetchTxHex:Q=!0}){let X=await MG({chain:$,address:G,apiKey:J}),L=[];for(let{hash:Z,index:W,script_hex:D,value:z}of X){let q;if(Q)q=await qG({txHash:Z,chain:$,apiKey:J});L.push({address:G,hash:Z,index:W,txHex:q,value:z,witnessUtxo:{value:z,script:Buffer.from(D,"hex")}})}return L}function oG(G){let $=i.get("apiKeys").blockchair||"";return WG(!$,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:(J)=>SG({txHash:J,chain:G}),getConfirmedBalance:(J)=>fG({chain:G,address:J,apiKey:$}),getRawTx:(J)=>qG({txHash:J,chain:G,apiKey:$}),getSuggestedTxFee:()=>xG(G),getBalance:(J)=>RG({address:J,chain:G,apiKey:$}),getAddressData:(J)=>jG({address:J,chain:G,apiKey:$}),scanUTXOs:(J)=>mG({...J,chain:G,apiKey:$})}}function y$(G){return G}function H(G){let $=i.get("apis")[G];if($)return WG(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),$;return oG(G)}import zG from"bs58check";import PG from"cashaddrjs";var UG;((J)=>{J.Mainnet="mainnet";J.Testnet="testnet"})(UG||={});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 BG(G){try{return l(G),!0}catch($){return!1}}function TG(G){return l(G)?.network}function y(G){let $=l(G);if($?.format==="legacy")return G;return rG($)}function f(G){let $=l(G);return uG($)}function l(G){try{return hG(G)}catch($){}try{return pG(G)}catch($){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function hG(G){try{let $=zG.decode(G);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 pG(G){if(G.indexOf(":")!==-1)try{return vG(G)}catch($){}else{let $=["bitcoincash","bchtest","bchreg"];for(let J of $)try{return vG(`${J}:${G}`)}catch(Q){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function vG(G){try{let{hash:$,prefix:J,type:Q}=PG.decode(G);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 rG(G){let $=P.legacy[G.network][G.type],J=Buffer.alloc(1+G.hash.length);return J[0]=$,J.set(G.hash,1),zG.encode(J)}function uG(G){let $=G.network==="mainnet"?"bitcoincash":"bchtest",J=G.type==="p2pkh"?"P2PKH":"P2SH",Q=new Uint8Array(G.hash);return PG.encode($,J,Q)}import{Chain as V}from"@swapkit/helpers";var t=(G)=>{switch(G){case V.Bitcoin:case V.BitcoinCash:return 550;case V.Dash:case V.Litecoin:return 5500;case V.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},I=({inputs:G,outputs:$,feeRate:J=1,chain:Q=V.Bitcoin})=>{let X=Math.ceil(J),L=G[0]&&"address"in G[0]&&G[0].address?o(G[0].address):"P2PKH",Z=G.filter((M)=>F(M)*X<=M.value),W=a+$.reduce((M,U)=>M+m(U,L),0),D=$.reduce((M,U)=>M+U.value,0),z=W*X,q=0,j=[];for(let M of Z){let U=F(M),v=X*U;z+=v,q+=M.value,j.push(M);let B=z+D;if(q<B)continue;let S=q-B,JG=X*m({address:"",value:0},L);if(S>JG){let QG=JG+z,XG=q-(D+QG);if(XG>Math.max(F({})*X,t(Q)))return{inputs:j,outputs:$.concat({value:XG,address:""}),fee:QG}}return{inputs:j,outputs:$,fee:z}}return{fee:X*O({inputs:G,outputs:$,feeRate:X})}};import{opcodes as cG,script as nG}from"bitcoinjs-lib";var l$=1000,a=10,dG=10,iG=41,tG=107,w=(G)=>{let $=Buffer.from(G,"utf8");return nG.compile([cG.OP_RETURN,$])},s;((J)=>{J.P2PKH="P2PKH";J.P2WPKH="P2WPKH"})(s||={});var e={["P2PKH"]:148,["P2WPKH"]:68},h={["P2PKH"]:34,["P2WPKH"]:31},o=(G)=>{if(G.startsWith("bc1")||G.startsWith("ltc1"))return"P2WPKH";if(G.startsWith("1")||G.startsWith("3")||G.startsWith("L")||G.startsWith("M")||G.startsWith("X")||G.startsWith("D")||G.startsWith("bitcoincash:q")||G.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},O=({inputs:G,outputs:$,feeRate:J})=>{let Q=G[0]&&"address"in G[0]&&G[0].address?o(G[0].address):"P2PKH",X=G.filter((Z)=>Z.value>=e["type"in Z?Z.type:"P2PKH"]*Math.ceil(J)).reduce((Z,W)=>Z+F(W),0),L=$?.reduce((Z,W)=>Z+m(W),0)||h[Q];return a+X+L},F=(G)=>{if("type"in G)return e[G.type];if("address"in G&&G.address)return e[o(G.address)];return iG+tG},m=(G,$)=>{if(G?.script)return dG+G.script.length+(G.script.length>=74?2:1);if($)return h[$];return h.P2PKH};import*as GG from"@bitcoinerlab/secp256k1";import{HDKey as aG}from"@scure/bip32";import{mnemonicToSeedSync as sG}from"@scure/bip39";import{AssetValue as p,BaseDecimal as eG,Chain as r,FeeOption as $G,SwapKitNumber as IG}from"@swapkit/helpers";import{Psbt as G$,address as $$,initEccLib as wG,payments as HG}from"bitcoinjs-lib";var u=[r.Dash,r.Dogecoin];async function YG({phrase:G,wif:$,derivationPath:J,chain:Q}){let{ECPairFactory:X}=await import("ecpair");if(!($||G))throw new Error("Either phrase or wif must be provided");let L=X(GG),Z=T(Q);if($)return L.fromWIF($,Z);let W=sG(G),D=aG.fromMasterSeed(W,Z).derive(J);if(!D.privateKey)throw new Error("Could not get private key from phrase");return L.fromPrivateKey(Buffer.from(D.privateKey),{network:Z})}function NG({address:G,chain:$}){try{return wG(GG),$$.toOutputScript(G,T($)),!0}catch(J){return!1}}function J$({keys:G,chain:$}){if(!G)throw new Error("Keys must be provided");let J=u.includes($)?HG.p2pkh:HG.p2wpkh,{address:Q}=J({pubkey:G.publicKey,network:T($)});if(!Q)throw new Error("Address not defined");return Q}function Q$(G){return async function $({signTransaction:J,from:Q,memo:X,recipient:L,feeOptionKey:Z,broadcastTx:W,feeRate:D,assetValue:z}){if(!Q)throw new Error("From address must be provided");if(!L)throw new Error("Recipient address must be provided");if(!J)throw new Error("Sign transaction must be provided");let q=D||(await c(G))[Z||$G.Fast],{psbt:j}=await _G(G)({recipient:L,feeRate:q,sender:Q,fetchTxHex:u.includes(G),assetValue:z,memo:X}),M=await J(j);return M.finalizeAllInputs(),W(M.extractTransaction().toHex())}}var X$=async({address:G,chain:$})=>{let J=await H($).getBalance(G),Q=IG.fromBigInt(BigInt(J),eG[$]).getValue("string");return[p.from({asset:`${$}.${$}`,value:Q})]};async function c(G){let $=await H(G).getSuggestedTxFee();return ZG($)}function VG(G){return async function $({assetValue:J,recipient:Q,memo:X,sender:L,fetchTxHex:Z=!1}){return{inputs:await H(G).scanUTXOs({address:L,fetchTxHex:Z}),outputs:[{address:Q,value:Number(J.bigIntValue)},...X?[{address:"",script:w(X),value:0}]:[]]}}}function _G(G){return async function $({assetValue:J,recipient:Q,memo:X,feeRate:L,sender:Z,fetchTxHex:W=!1}){let D=X?w(X):null,q=await VG(G)({assetValue:J,recipient:Q,memo:X,sender:Z,fetchTxHex:W}),{inputs:j,outputs:M}=I({...q,feeRate:L,chain:G});if(!(j&&M))throw new Error("Insufficient Balance for transaction");let U=new G$({network:T(G)});if(G===r.Dogecoin)U.setMaximumFeeRate(650000000);for(let v of j)U.addInput({hash:v.hash,index:v.index,...!!v.witnessUtxo&&!u.includes(G)&&{witnessUtxo:v.witnessUtxo},...u.includes(G)&&{nonWitnessUtxo:v.txHex?Buffer.from(v.txHex,"hex"):void 0}});for(let v of M){let B="address"in v&&v.address?v.address:Z,S=v.script?D?{script:D,value:0}:void 0:{address:B,value:v.value};if(S)wG(GG),U.addOutput(S)}return{psbt:U,utxos:q.inputs,inputs:j}}}function bG(G){return async function $({assetValue:J,feeOptionKey:Q=$G.Fast,feeRate:X,fetchTxHex:L=!1,memo:Z,recipient:W,from:D}){let q=await VG(G)({assetValue:J,recipient:W,memo:Z,sender:D,fetchTxHex:L}),j=X?Math.floor(X):(await c(G))[Q];return I({...q,feeRate:j,chain:G})}}function Z$(G){return async function $({from:J,memo:Q,feeRate:X,feeOptionKey:L=$G.Fast,recipients:Z=1}){let W=await H(G).getAddressData(J),D=X?Math.ceil(X):(await c(G))[L],z=W?.utxo.map((v)=>({...v,type:"P2PKH",hash:""})).filter((v)=>v.value>Math.max(t(G),F(v)*D));if(!z?.length)return p.from({chain:G});let q=p.from({chain:G,value:z.reduce((v,B)=>v+B.value,0)}),j=typeof Z==="number"?Array.from({length:Z},()=>({address:J,value:0})):Z;if(Q){let v=w(Q);j.push({address:J,script:v,value:0})}let U=O({inputs:z,outputs:j,feeRate:D})*D;return q.sub(U)}}var N=(G)=>({accumulative:I,calculateTxSize:O,getFeeRates:()=>c(G),buildTx:_G(G),transfer:Q$(G),getInputsOutputsFee:bG(G),broadcastTx:($)=>H(G).broadcastTx($),getAddressFromKeys:($)=>J$({keys:$,chain:G}),validateAddress:($)=>NG({address:$,chain:G}),createKeysForPath:($)=>YG({...$,chain:G}),getPrivateKeyFromMnemonic:async($)=>{return(await YG({...$,chain:G})).toWIF()},getBalance:async($,J)=>X$({address:$,chain:G}),estimateTransactionFee:async($)=>{let Q=await bG(G)($);return p.from({chain:G,value:IG.fromBigInt(BigInt(Q.fee),8).getValue("string")})},estimateMaxSendableAmount:async($)=>Z$({...$,chain:G})});function e$({chain:G,address:$}){return G===r.BitcoinCash?_($):NG({address:$,chain:G})}var Y=kG.BitcoinCash,A=(G)=>E(f(G)),KG=async({assetValue:G,recipient:$,memo:J,feeRate:Q,sender:X})=>{if(!_($))throw new Error("Invalid address");let L=await H(Y).scanUTXOs({address:A(X),fetchTxHex:!0}),Z=J?w(J):null,W=[];W.push({address:$,value:G.getBaseValue("number")});let{inputs:D,outputs:z}=I({inputs:L,outputs:W,feeRate:Q,chain:Y});if(!(D&&z))throw new Error("Balance insufficient for transaction");let q=new j$(T(Y));await Promise.all(D.map(async(j)=>{let M=await H(Y).getRawTx(j.hash);q.addInput(W$.fromBuffer(Buffer.from(M,"hex")),j.index)}));for(let j of z){let M="address"in j&&j.address?j.address:y(X),U=q$.toOutputScript(y(M),T(Y));q.addOutput(U,j.value)}if(Z)q.addOutput(Z,0);return{builder:q,utxos:D}},U$=async({signTransaction:G,from:$,recipient:J,assetValue:Q,broadcastTx:X,getFeeRates:L,...Z})=>{if(!$)throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");if(!G)throw new Error("signTransaction must be provided");let W=Z.feeRate||(await L())[z$.Fast],{builder:D,utxos:z}=await KG({...Z,assetValue:Q,feeRate:W,recipient:J,sender:$}),j=(await G({builder:D,utxos:z})).toHex();return X(j)},B$=async({assetValue:G,recipient:$,memo:J,feeRate:Q,sender:X})=>{let L=f($);if(!_(L))throw new Error("Invalid address");let Z=await H(Y).scanUTXOs({address:A(X),fetchTxHex:!0}),W=Number(Q.toFixed(0)),D=J?w(J):null,z=[];if(z.push({address:y($),value:G.getBaseValue("number")}),D)z.push({script:D,value:0});let{inputs:q,outputs:j}=I({inputs:Z,outputs:z,feeRate:W,chain:Y});if(!(q&&j))throw new Error("Balance insufficient for transaction");let M=new P$({network:T(Y)});for(let{hash:U,index:v,witnessUtxo:B}of q)M.addInput({hash:U,index:v,witnessUtxo:B});for(let U of j){let v="address"in U&&U.address?U.address:y(X),B=U.script?D?{script:D,value:0}:void 0:{address:v,value:U.value};if(B)M.addOutput(B)}return{psbt:M,utxos:Z,inputs:q}},E=(G)=>G.replace(/(bchtest:|bitcoincash:)/,""),_=(G)=>{let $=E(G);return BG($)&&TG($)==="mainnet"},T$=async({phrase:G,derivationPath:$=`${v$.BCH}/0`,wif:J})=>{let{ECPairFactory:Q}=await import("ecpair"),X=T(Y);if(J)return Q(L$).fromWIF(J,X);if(!G)throw new Error("No phrase provided");return D$.fromSeedBuffer(Buffer.from(M$(G)),X).derivePath($).keyPair},H$=(G)=>{let $=G.getAddress(0);return A($)},yG=()=>{let{getBalance:G,...$}=N(kG.BitcoinCash);return{...$,stripPrefix:E,stripToCashAddress:A,validateAddress:_,createKeysForPath:T$,getAddressFromKeys:H$,buildBCHTx:KG,buildTx:B$,getBalance:(J,Q)=>G(E(f(J))),transfer:(J)=>U$({...J,getFeeRates:$.getFeeRates,broadcastTx:$.broadcastTx})}};var Y$=yG,b$=()=>N(b.Bitcoin),C$=()=>N(b.Dash),F$=()=>N(b.Dogecoin),I$=()=>N(b.Litecoin),MJ=(G)=>{switch(G){case b.BitcoinCash:return Y$;case b.Bitcoin:return b$;case b.Dogecoin:return F$;case b.Litecoin:return I$;case b.Dash:return C$;default:throw new Error(`Chain ${G} is not supported`)}};export{_ as validateAddress,e$ as utxoValidateAddress,LG as uniqid,y as toLegacyAddress,f as toCashAddress,A as stripToCashAddress,E as stripPrefix,ZG as standardFeeRates,u as nonSegwitChains,BJ as networks,BG as isValidAddress,H as getUtxoApi,MJ as getToolboxByChain,o as getScriptTypeForAddress,m as getOutputSize,T as getNetwork,F as getInputSize,t as getDustThreshold,TG as detectAddressNetwork,y$ as createCustomUtxoApi,w as compileMemo,O as calculateTxSize,_G as buildTx,I as accumulative,s as UTXOScriptType,HJ as Transaction,a as TX_OVERHEAD,TJ as Psbt,h as OutputSizes,dG as OP_RETURN_OVERHEAD,UG as Network,l$ as MIN_TX_FEE,I$ as LTCToolbox,e as InputSizes,F$ as DOGEToolbox,C$ as DASHToolbox,N as BaseUTXOToolbox,b$ as BTCToolbox,Y$ as BCHToolbox};
2
+
3
+ //# debugId=FF559E672E52B03064756E2164756E21