@swapkit/toolboxes 1.0.0-beta.10 → 1.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/solana/index.cjs +2 -2
- package/dist/solana/index.cjs.map +3 -3
- package/dist/solana/index.js +2 -2
- package/dist/solana/index.js.map +3 -3
- package/dist/utxo/index.cjs +2 -2
- package/dist/utxo/index.cjs.map +6 -6
- package/dist/utxo/index.js +2 -2
- package/dist/utxo/index.js.map +6 -6
- package/package.json +1 -1
- package/src/solana/toolbox.ts +8 -8
- package/src/utxo/helpers/api.ts +1 -1
- package/src/utxo/helpers/txSize.ts +1 -1
- package/src/utxo/toolbox/bitcoinCash.ts +1 -1
- package/src/utxo/toolbox/utxo.ts +7 -7
package/dist/solana/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var I={};v(I,{getSolanaToolbox:()=>J,getSolanaAddressValidator:()=>j,createKeysForPath:()=>W});module.exports=$(I);var p=require("@swapkit/helpers"),M=require("ts-pattern"),B=require("ts-pattern");async function j(){let{PublicKey:a}=
|
|
1
|
+
var I={};v(I,{getSolanaToolbox:()=>J,getSolanaAddressValidator:()=>j,createKeysForPath:()=>W});module.exports=$(I);var p=require("@swapkit/helpers"),M=require("ts-pattern"),B=require("ts-pattern");async function j(){let{PublicKey:a}=await import("@solana/web3.js");return(T)=>{try{let l=new a(T);return a.isOnCurve(l.toBytes())}catch(l){return!1}}}async function J(a){let T=a&&"index"in a?a.index||0:0,l=p.derivationPathToString(a&&"derivationPath"in a&&a.derivationPath?a.derivationPath:p.updateDerivationPath(p.NetworkDerivationPath[p.Chain.Solana],{index:T})),o=await B.match(a).with({phrase:M.P.string},({phrase:y})=>W({phrase:y,derivationPath:l})).with({signer:M.P.any},({signer:y})=>y).otherwise(()=>{return});function P(){return o?.publicKey?d(o.publicKey):""}return{getConnection:h,getAddress:P,createKeysForPath:W,getAddressFromPubKey:d,getPubkeyFromAddress:A,createTransaction:u(h),createTransactionFromInstructions:Y,getBalance:z(p.Chain.Solana),transfer:Z(h,o),broadcastTransaction:E(h),getAddressValidator:j,signTransaction:_(h,o),estimateTransactionFee:N(h)}}function N(a){return async({recipient:T,assetValue:l,memo:o,isProgramDerivedAddress:P,sender:y})=>{let S=await a(),b=(await u(a)({recipient:T,assetValue:l,memo:o,isProgramDerivedAddress:P,sender:y})).compileMessage(),m=await S.getFeeForMessage(b);if(m.value===null)throw new p.SwapKitError("toolbox_solana_fee_estimation_failed","Could not estimate Solana fee.");return p.AssetValue.from({chain:p.Chain.Solana,value:m.value,fromBaseDecimal:p.BaseDecimal[p.Chain.Solana]})}}async function h(){let{Connection:a}=await import("@solana/web3.js");return new a(p.SKConfig.get("rpcUrls").SOL,"confirmed")}function Q(a){return async({assetValue:T,recipient:l,sender:o,isProgramDerivedAddress:P})=>{let y=await a(),S=await A(o);if(T.isGasAsset){let{Transaction:x,SystemProgram:b,PublicKey:m}=await import("@solana/web3.js");return new x().add(b.transfer({fromPubkey:S,lamports:T.getBaseValue("number"),toPubkey:new m(l)}))}if(T.address)return X({amount:T.getBaseValue("number"),connection:y,decimals:T.decimal,from:S,recipient:l,tokenAddress:T.address,isProgramDerivedAddress:P});return}}async function X({tokenAddress:a,recipient:T,from:l,connection:o,amount:P,decimals:y,isProgramDerivedAddress:S}){let{getAssociatedTokenAddress:x,getAccount:b,createAssociatedTokenAccountInstruction:m,createTransferCheckedInstruction:O}=await import("@solana/spl-token"),{Transaction:w,PublicKey:L}=await import("@solana/web3.js"),G=new w,R=new L(a),F=await x(R,l),U=new L(T),q=await x(R,U,S),V=!1;try{await b(o,q),V=!0}catch(H){}if(!V)G.add(m(l,q,U,R));return G.add(O(F,R,q,l,P,y)),G}function u(a){return async({recipient:T,assetValue:l,memo:o,isProgramDerivedAddress:P,sender:y})=>{let{createMemoInstruction:S}=await import("@solana/spl-memo"),x=await A(y),b=await j();if(!(P||b(T)))throw new p.SwapKitError("core_transaction_invalid_recipient_address");let m=await a(),O=await Q(a)({assetValue:l,recipient:T,sender:y,isProgramDerivedAddress:P});if(!O)throw new p.SwapKitError("core_transaction_invalid_sender_address");if(o)O.add(S(o));let w=await m.getLatestBlockhash();return O.recentBlockhash=w.blockhash,O.feePayer=x,O}}async function Y({instructions:a}){let{Transaction:T}=await import("@solana/web3.js"),l=new T().add(...a);if(!l)throw new p.SwapKitError("core_transaction_invalid_sender_address");return l}function Z(a,T){return async({recipient:l,assetValue:o,memo:P,isProgramDerivedAddress:y})=>{if(!T)throw new p.SwapKitError("core_transaction_invalid_sender_address");let S=T.publicKey?.toString()??(await T.connect()).publicKey.toString(),x=await u(a)({recipient:l,assetValue:o,memo:P,isProgramDerivedAddress:y,sender:S});if("connect"in T){let b=await T.signTransaction(x);return E(a)(b)}return x.sign(T),E(a)(x)}}function E(a){return async(T)=>{return(await a()).sendRawTransaction(T.serialize())}}function _(a,T){return async(l)=>{let{VersionedTransaction:o}=await import("@solana/web3.js");if(!T)throw new p.SwapKitError("toolbox_solana_no_signer");if(!(l instanceof o)){let y=await(await a()).getLatestBlockhash();l.recentBlockhash=y.blockhash,l.feePayer=T.publicKey||void 0}if("connect"in T)return await T.signTransaction(l);return await l.sign([T]),l}}async function W({phrase:a,derivationPath:T=p.DerivationPath.SOL}){let{HDKey:l}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:o}=await import("@scure/bip39"),{Keypair:P}=await import("@solana/web3.js"),y=o(a),S=l.fromMasterSeed(y);return P.fromSeed(S.derive(T,!0).privateKey)}function d(a){return a.toString()}async function A(a){let{PublicKey:T}=await import("@solana/web3.js");return new T(a)}
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=10DF173C02A9BC6564756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/solana/toolbox.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { P } from \"ts-pattern\";\nimport { match } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \".\";\nimport { getBalance } from \"../utils\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\nexport async function getSolanaAddressValidator() {\n const { PublicKey } = (await import(\"@solana/web3.js\")).default;\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 getSolanaToolbox(\n toolboxParams?:\n | { signer?: SolanaSigner }\n | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n return {\n getConnection,\n getAddress,\n createKeysForPath,\n getAddressFromPubKey,\n getPubkeyFromAddress,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n getBalance: getBalance(Chain.Solana),\n transfer: transfer(getConnection, signer),\n broadcastTransaction: broadcastTransaction(getConnection),\n getAddressValidator: getSolanaAddressValidator,\n signTransaction: signTransaction(getConnection, signer),\n estimateTransactionFee: estimateTransactionFee(getConnection),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n isProgramDerivedAddress?: boolean;\n }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new SwapKitError(\n \"toolbox_solana_fee_estimation_failed\",\n \"Could not estimate Solana fee.\",\n );\n }\n\n return AssetValue.from({\n chain: Chain.Solana,\n value: feeInLamports.value,\n fromBaseDecimal: BaseDecimal[Chain.Solana],\n });\n };\n}\n\nasync function getConnection() {\n const { Connection } = (await import(\"@solana/web3.js\")).default;\n return new Connection(SKConfig.get(\"rpcUrls\").SOL, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = (await import(\"@solana/web3.js\")).default;\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n recipient,\n tokenAddress: assetValue.address,\n isProgramDerivedAddress,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\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\")).default;\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(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\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\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new SwapKitError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n });\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 = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: { instructions: TransactionInstruction[]; isProgramDerivedAddress?: boolean }) {\n const { Transaction } = (await import(\"@solana/web3.js\")).default;\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender =\n signer.publicKey?.toString() ??\n (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = (await import(\"@solana/web3.js\")).default;\n if (!signer) {\n throw new SwapKitError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async 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\")).default;\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = (await import(\"@solana/web3.js\")).default;\n return new PublicKey(address);\n}\n"
|
|
5
|
+
"import type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { P } from \"ts-pattern\";\nimport { match } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \".\";\nimport { getBalance } from \"../utils\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\nexport async function getSolanaAddressValidator() {\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 getSolanaToolbox(\n toolboxParams?:\n | { signer?: SolanaSigner }\n | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n return {\n getConnection,\n getAddress,\n createKeysForPath,\n getAddressFromPubKey,\n getPubkeyFromAddress,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n getBalance: getBalance(Chain.Solana),\n transfer: transfer(getConnection, signer),\n broadcastTransaction: broadcastTransaction(getConnection),\n getAddressValidator: getSolanaAddressValidator,\n signTransaction: signTransaction(getConnection, signer),\n estimateTransactionFee: estimateTransactionFee(getConnection),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n isProgramDerivedAddress?: boolean;\n }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new SwapKitError(\n \"toolbox_solana_fee_estimation_failed\",\n \"Could not estimate Solana fee.\",\n );\n }\n\n return AssetValue.from({\n chain: Chain.Solana,\n value: feeInLamports.value,\n fromBaseDecimal: BaseDecimal[Chain.Solana],\n });\n };\n}\n\nasync function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n return new Connection(SKConfig.get(\"rpcUrls\").SOL, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = await import(\"@solana/web3.js\");\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n recipient,\n tokenAddress: assetValue.address,\n isProgramDerivedAddress,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\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(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\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\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new SwapKitError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n });\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 = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: { instructions: TransactionInstruction[]; isProgramDerivedAddress?: boolean }) {\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender =\n signer.publicKey?.toString() ??\n (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n if (!signer) {\n throw new SwapKitError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async 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 getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n return new PublicKey(address);\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "mHAoBO,IAZP,8BAaA,wBACA,wBAMA,eAAsB,CAAyB,EAAG,CAChD,IAAQ,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "10DF173C02A9BC6564756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/solana/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{b as B}from"../chunk-0h4xdrwz.js";import{c as S,d as f}from"../chunk-p1kdg37m.js";import{AssetValue as N,BaseDecimal as Q,Chain as G,DerivationPath as X,NetworkDerivationPath as Y,SKConfig as Z,SwapKitError as R,derivationPathToString as _,updateDerivationPath as $}from"@swapkit/helpers";import{P as V}from"ts-pattern";import{match as v}from"ts-pattern";async function F(){let{PublicKey:a}=
|
|
1
|
+
import{b as B}from"../chunk-0h4xdrwz.js";import{c as S,d as f}from"../chunk-p1kdg37m.js";import{AssetValue as N,BaseDecimal as Q,Chain as G,DerivationPath as X,NetworkDerivationPath as Y,SKConfig as Z,SwapKitError as R,derivationPathToString as _,updateDerivationPath as $}from"@swapkit/helpers";import{P as V}from"ts-pattern";import{match as v}from"ts-pattern";async function F(){let{PublicKey:a}=await import("@solana/web3.js");return(T)=>{try{let l=new a(T);return a.isOnCurve(l.toBytes())}catch(l){return!1}}}async function g(a){let T=a&&"index"in a?a.index||0:0,l=_(a&&"derivationPath"in a&&a.derivationPath?a.derivationPath:$(Y[G.Solana],{index:T})),p=await v(a).with({phrase:V.string},({phrase:o})=>d({phrase:o,derivationPath:l})).with({signer:V.any},({signer:o})=>o).otherwise(()=>{return});function y(){return p?.publicKey?z(p.publicKey):""}return{getConnection:h,getAddress:y,createKeysForPath:d,getAddressFromPubKey:z,getPubkeyFromAddress:u,createTransaction:j(h),createTransactionFromInstructions:D,getBalance:B(G.Solana),transfer:k(h,p),broadcastTransaction:W(h),getAddressValidator:F,signTransaction:s(h,p),estimateTransactionFee:I(h)}}function I(a){return async({recipient:T,assetValue:l,memo:p,isProgramDerivedAddress:y,sender:o})=>{let P=await a(),b=(await j(a)({recipient:T,assetValue:l,memo:p,isProgramDerivedAddress:y,sender:o})).compileMessage(),m=await P.getFeeForMessage(b);if(m.value===null)throw new R("toolbox_solana_fee_estimation_failed","Could not estimate Solana fee.");return N.from({chain:G.Solana,value:m.value,fromBaseDecimal:Q[G.Solana]})}}async function h(){let{Connection:a}=await import("@solana/web3.js");return new a(Z.get("rpcUrls").SOL,"confirmed")}function H(a){return async({assetValue:T,recipient:l,sender:p,isProgramDerivedAddress:y})=>{let o=await a(),P=await u(p);if(T.isGasAsset){let{Transaction:x,SystemProgram:b,PublicKey:m}=await import("@solana/web3.js");return new x().add(b.transfer({fromPubkey:P,lamports:T.getBaseValue("number"),toPubkey:new m(l)}))}if(T.address)return K({amount:T.getBaseValue("number"),connection:o,decimals:T.decimal,from:P,recipient:l,tokenAddress:T.address,isProgramDerivedAddress:y});return}}async function K({tokenAddress:a,recipient:T,from:l,connection:p,amount:y,decimals:o,isProgramDerivedAddress:P}){let{getAssociatedTokenAddress:x,getAccount:b,createAssociatedTokenAccountInstruction:m,createTransferCheckedInstruction:O}=await import("@solana/spl-token"),{Transaction:q,PublicKey:A}=await import("@solana/web3.js"),M=new q,w=new A(a),J=await x(w,l),L=new A(T),E=await x(w,L,P),U=!1;try{await b(p,E),U=!0}catch(C){}if(!U)M.add(m(l,E,L,w));return M.add(O(J,w,E,l,y,o)),M}function j(a){return async({recipient:T,assetValue:l,memo:p,isProgramDerivedAddress:y,sender:o})=>{let{createMemoInstruction:P}=await import("@solana/spl-memo"),x=await u(o),b=await F();if(!(y||b(T)))throw new R("core_transaction_invalid_recipient_address");let m=await a(),O=await H(a)({assetValue:l,recipient:T,sender:o,isProgramDerivedAddress:y});if(!O)throw new R("core_transaction_invalid_sender_address");if(p)O.add(P(p));let q=await m.getLatestBlockhash();return O.recentBlockhash=q.blockhash,O.feePayer=x,O}}async function D({instructions:a}){let{Transaction:T}=await import("@solana/web3.js"),l=new T().add(...a);if(!l)throw new R("core_transaction_invalid_sender_address");return l}function k(a,T){return async({recipient:l,assetValue:p,memo:y,isProgramDerivedAddress:o})=>{if(!T)throw new R("core_transaction_invalid_sender_address");let P=T.publicKey?.toString()??(await T.connect()).publicKey.toString(),x=await j(a)({recipient:l,assetValue:p,memo:y,isProgramDerivedAddress:o,sender:P});if("connect"in T){let b=await T.signTransaction(x);return W(a)(b)}return x.sign(T),W(a)(x)}}function W(a){return async(T)=>{return(await a()).sendRawTransaction(T.serialize())}}function s(a,T){return async(l)=>{let{VersionedTransaction:p}=await import("@solana/web3.js");if(!T)throw new R("toolbox_solana_no_signer");if(!(l instanceof p)){let o=await(await a()).getLatestBlockhash();l.recentBlockhash=o.blockhash,l.feePayer=T.publicKey||void 0}if("connect"in T)return await T.signTransaction(l);return await l.sign([T]),l}}async function d({phrase:a,derivationPath:T=X.SOL}){let{HDKey:l}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:p}=await import("@scure/bip39"),{Keypair:y}=await import("@solana/web3.js"),o=p(a),P=l.fromMasterSeed(o);return y.fromSeed(P.derive(T,!0).privateKey)}function z(a){return a.toString()}async function u(a){let{PublicKey:T}=await import("@solana/web3.js");return new T(a)}export{g as getSolanaToolbox,F as getSolanaAddressValidator,d as createKeysForPath};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=96EDFBAA436A5BDE64756E2164756E21
|
package/dist/solana/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/solana/toolbox.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { P } from \"ts-pattern\";\nimport { match } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \".\";\nimport { getBalance } from \"../utils\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\nexport async function getSolanaAddressValidator() {\n const { PublicKey } = (await import(\"@solana/web3.js\")).default;\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 getSolanaToolbox(\n toolboxParams?:\n | { signer?: SolanaSigner }\n | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n return {\n getConnection,\n getAddress,\n createKeysForPath,\n getAddressFromPubKey,\n getPubkeyFromAddress,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n getBalance: getBalance(Chain.Solana),\n transfer: transfer(getConnection, signer),\n broadcastTransaction: broadcastTransaction(getConnection),\n getAddressValidator: getSolanaAddressValidator,\n signTransaction: signTransaction(getConnection, signer),\n estimateTransactionFee: estimateTransactionFee(getConnection),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n isProgramDerivedAddress?: boolean;\n }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new SwapKitError(\n \"toolbox_solana_fee_estimation_failed\",\n \"Could not estimate Solana fee.\",\n );\n }\n\n return AssetValue.from({\n chain: Chain.Solana,\n value: feeInLamports.value,\n fromBaseDecimal: BaseDecimal[Chain.Solana],\n });\n };\n}\n\nasync function getConnection() {\n const { Connection } = (await import(\"@solana/web3.js\")).default;\n return new Connection(SKConfig.get(\"rpcUrls\").SOL, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = (await import(\"@solana/web3.js\")).default;\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n recipient,\n tokenAddress: assetValue.address,\n isProgramDerivedAddress,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\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\")).default;\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(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\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\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new SwapKitError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n });\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 = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: { instructions: TransactionInstruction[]; isProgramDerivedAddress?: boolean }) {\n const { Transaction } = (await import(\"@solana/web3.js\")).default;\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender =\n signer.publicKey?.toString() ??\n (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = (await import(\"@solana/web3.js\")).default;\n if (!signer) {\n throw new SwapKitError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async 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\")).default;\n const seed = mnemonicToSeedSync(phrase);\n const hdKey = HDKey.fromMasterSeed(seed);\n\n return Keypair.fromSeed(hdKey.derive(derivationPath, true).privateKey);\n}\n\nfunction getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = (await import(\"@solana/web3.js\")).default;\n return new PublicKey(address);\n}\n"
|
|
5
|
+
"import type {\n Connection,\n PublicKey,\n Signer,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport {\n AssetValue,\n BaseDecimal,\n Chain,\n DerivationPath,\n type DerivationPathArray,\n type GenericCreateTransactionParams,\n NetworkDerivationPath,\n SKConfig,\n SwapKitError,\n derivationPathToString,\n updateDerivationPath,\n} from \"@swapkit/helpers\";\nimport { P } from \"ts-pattern\";\nimport { match } from \"ts-pattern\";\nimport type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from \".\";\nimport { getBalance } from \"../utils\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\nexport async function getSolanaAddressValidator() {\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 getSolanaToolbox(\n toolboxParams?:\n | { signer?: SolanaSigner }\n | { phrase?: string; index?: number; derivationPath?: DerivationPathArray },\n) {\n const index = toolboxParams && \"index\" in toolboxParams ? toolboxParams.index || 0 : 0;\n const derivationPath = derivationPathToString(\n toolboxParams && \"derivationPath\" in toolboxParams && toolboxParams.derivationPath\n ? toolboxParams.derivationPath\n : updateDerivationPath(NetworkDerivationPath[Chain.Solana], { index }),\n );\n\n const signer = await match(toolboxParams)\n .with({ phrase: P.string }, ({ phrase }) => createKeysForPath({ phrase, derivationPath }))\n .with({ signer: P.any }, ({ signer }) => signer)\n .otherwise(() => undefined);\n\n function getAddress() {\n return signer?.publicKey ? getAddressFromPubKey(signer.publicKey) : \"\";\n }\n\n return {\n getConnection,\n getAddress,\n createKeysForPath,\n getAddressFromPubKey,\n getPubkeyFromAddress,\n createTransaction: createTransaction(getConnection),\n createTransactionFromInstructions,\n getBalance: getBalance(Chain.Solana),\n transfer: transfer(getConnection, signer),\n broadcastTransaction: broadcastTransaction(getConnection),\n getAddressValidator: getSolanaAddressValidator,\n signTransaction: signTransaction(getConnection, signer),\n estimateTransactionFee: estimateTransactionFee(getConnection),\n };\n}\n\nfunction estimateTransactionFee(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: Omit<GenericCreateTransactionParams, \"feeRate\"> & {\n isProgramDerivedAddress?: boolean;\n }) => {\n const connection = await getConnection();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n const message = transaction.compileMessage();\n const feeInLamports = await connection.getFeeForMessage(message);\n\n if (feeInLamports.value === null) {\n throw new SwapKitError(\n \"toolbox_solana_fee_estimation_failed\",\n \"Could not estimate Solana fee.\",\n );\n }\n\n return AssetValue.from({\n chain: Chain.Solana,\n value: feeInLamports.value,\n fromBaseDecimal: BaseDecimal[Chain.Solana],\n });\n };\n}\n\nasync function getConnection() {\n const { Connection } = await import(\"@solana/web3.js\");\n return new Connection(SKConfig.get(\"rpcUrls\").SOL, \"confirmed\");\n}\n\nfunction createAssetTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n }: SolanaCreateTransactionParams) => {\n const connection = await getConnection();\n const fromPubkey = await getPubkeyFromAddress(sender);\n\n if (assetValue.isGasAsset) {\n const { Transaction, SystemProgram, PublicKey } = await import(\"@solana/web3.js\");\n\n return new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: fromPubkey,\n lamports: assetValue.getBaseValue(\"number\"),\n toPubkey: new PublicKey(recipient),\n }),\n );\n }\n if (assetValue.address) {\n return createSolanaTokenTransaction({\n amount: assetValue.getBaseValue(\"number\"),\n connection,\n decimals: assetValue.decimal as number,\n from: fromPubkey,\n recipient,\n tokenAddress: assetValue.address,\n isProgramDerivedAddress,\n });\n }\n\n return undefined;\n };\n}\n\nasync function createSolanaTokenTransaction({\n tokenAddress,\n recipient,\n from,\n connection,\n amount,\n decimals,\n isProgramDerivedAddress,\n}: {\n tokenAddress: string;\n recipient: string;\n from: PublicKey;\n connection: Connection;\n amount: number;\n decimals: number;\n isProgramDerivedAddress?: boolean;\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(\n tokenPublicKey,\n recipientPublicKey,\n isProgramDerivedAddress,\n );\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\nfunction createTransaction(getConnection: () => Promise<Connection>) {\n return async ({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n }: SolanaCreateTransactionParams) => {\n const { createMemoInstruction } = await import(\"@solana/spl-memo\");\n\n const fromPubkey = await getPubkeyFromAddress(sender);\n const validateAddress = await getSolanaAddressValidator();\n\n if (!(isProgramDerivedAddress || validateAddress(recipient))) {\n throw new SwapKitError(\"core_transaction_invalid_recipient_address\");\n }\n\n const connection = await getConnection();\n const transaction = await createAssetTransaction(getConnection)({\n assetValue,\n recipient,\n sender,\n isProgramDerivedAddress,\n });\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 = fromPubkey;\n\n return transaction;\n };\n}\n\nasync function createTransactionFromInstructions({\n instructions,\n}: { instructions: TransactionInstruction[]; isProgramDerivedAddress?: boolean }) {\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = new Transaction().add(...instructions);\n\n if (!transaction) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n return transaction;\n}\n\nfunction transfer(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async ({ recipient, assetValue, memo, isProgramDerivedAddress }: SolanaTransferParams) => {\n if (!signer) {\n throw new SwapKitError(\"core_transaction_invalid_sender_address\");\n }\n\n const sender =\n signer.publicKey?.toString() ??\n (await (signer as SolanaProvider).connect()).publicKey.toString();\n\n const transaction = await createTransaction(getConnection)({\n recipient,\n assetValue,\n memo,\n isProgramDerivedAddress,\n sender,\n });\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return broadcastTransaction(getConnection)(signedTransaction);\n }\n\n transaction.sign(signer);\n\n return broadcastTransaction(getConnection)(transaction);\n };\n}\n\nfunction broadcastTransaction(getConnection: () => Promise<Connection>) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const connection = await getConnection();\n return connection.sendRawTransaction(transaction.serialize());\n };\n}\n\nfunction signTransaction(getConnection: () => Promise<Connection>, signer?: SolanaSigner) {\n return async (transaction: Transaction | VersionedTransaction) => {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n if (!signer) {\n throw new SwapKitError(\"toolbox_solana_no_signer\");\n }\n\n if (!(transaction instanceof VersionedTransaction)) {\n const connection = await getConnection();\n\n const blockHash = await connection.getLatestBlockhash();\n transaction.recentBlockhash = blockHash.blockhash;\n transaction.feePayer = signer.publicKey || undefined;\n }\n\n if (\"connect\" in signer) {\n const signedTransaction = await signer.signTransaction(transaction);\n return signedTransaction;\n }\n\n await transaction.sign([signer] as Signer & Signer[]);\n return transaction;\n };\n}\n\nexport async 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 getAddressFromPubKey(publicKey: PublicKey) {\n return publicKey.toString();\n}\n\nasync function getPubkeyFromAddress(address: string) {\n const { PublicKey } = await import(\"@solana/web3.js\");\n return new PublicKey(address);\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "8FAQA,gBACE,iBACA,WACA,oBACA,2BAGA,cACA,kBACA,4BACA,0BACA,yBAEF,YAAS,mBACT,gBAAS,mBAMT,eAAsB,CAAyB,EAAG,CAChD,IAAQ,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "96EDFBAA436A5BDE64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/utxo/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var uX={};pX(uX,{toLegacyAddress:()=>S,toCashAddress:()=>f,stripToCashAddress:()=>V,stripPrefix:()=>b,nonSegwitChains:()=>l,isValidAddress:()=>XX,getUtxoToolbox:()=>hX,getUtxoNetwork:()=>P,getUtxoApi:()=>I,getUTXOAddressValidator:()=>vX,getScriptTypeForAddress:()=>x,getOutputSize:()=>g,getInputSize:()=>y,getDustThreshold:()=>r,getCreateKeysForPath:()=>c,detectAddressNetwork:()=>GX,createUTXOToolbox:()=>h,createCustomUtxoApi:()=>wX,createBCHToolbox:()=>QX,compileMemo:()=>O,calculateTxSize:()=>A,bchValidateAddress:()=>E,addressFromKeysGetter:()=>JX,accumulative:()=>N,UtxoNetwork:()=>e,UTXOScriptType:()=>o,TX_OVERHEAD:()=>$X,OutputSizes:()=>m,OP_RETURN_OVERHEAD:()=>VX,MIN_TX_FEE:()=>EX,InputSizes:()=>n});module.exports=cX(uX);var R=require("@swapkit/helpers");var F=require("@swapkit/helpers");var v=require("@swapkit/helpers");async function zX({chain:X,txHash:G}){let $=v.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[G],id:WX()}),Q=await v.RequestClient.post($,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new Error(`failed to broadcast a transaction: ${Q.error?.message}`);if(Q.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Q.result}function i(X){return`https://api.blockchair.com/${YX(X)}`}function LX(X){switch(X){case v.Chain.Bitcoin:return 5;case v.Chain.Dogecoin:return 1e4;case v.Chain.Litecoin:return 1;default:return 2}}function YX(X){switch(X){case v.Chain.BitcoinCash:return"bitcoin-cash";case v.Chain.Litecoin:return"litecoin";case v.Chain.Dash:return"dash";case v.Chain.Dogecoin:return"dogecoin";case v.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function IX(X){try{let{feePerKb:G}=await v.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),$=G/1000;return Math.max($,LX(X))}catch(G){return LX(X)}}async function a(X,G){try{let $=await v.RequestClient.get(X);if(!$||$.context.code!==200)throw new Error(`failed to query ${X}`);return $.data}catch($){if(!G)throw $;let J=await v.RequestClient.get(`${X}${G?`&key=${G}`:""}`);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}}async function qX({address:X,chain:G,apiKey:$}){if(!X)throw new Error("address is required");try{return(await a(`${i(G)}/dashboards/address/${X}?transaction_details=true`,$))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function _X({address:X,chain:G,apiKey:$}){return(await qX({address:X,chain:G,apiKey:$}))?.address.balance||0}async function DX({chain:X,apiKey:G,txHash:$}){if(!$)throw new Error("txHash is required");try{return(await a(`${i(X)}/raw/transaction/${$}`,G))?.[$]?.raw_transaction||""}catch(J){return console.error(J),""}}async function PX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){return(await a(`${i(X)}/outputs?q=is_spent(false),recipient(${G})&limit=${Q}&offset=${J}`,$)).filter(({is_spent:j})=>!j).map(({script_hex:j,block_id:W,transaction_hash:q,index:D,value:B,spending_signature_hex:T})=>({hash:q,index:D,value:B,txHex:T,script_hex:j,is_confirmed:W!==-1}))}async function jX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){if(!G)throw new Error("address is required");try{let L=await PX({chain:X,address:G,apiKey:$,offset:J,limit:Q});if(L.length<=Q)return L;let Z=await jX({chain:X,address:G,apiKey:$,offset:J+Q,limit:Q});return[...L,...Z]}catch(L){return console.error(L),[]}}async function FX({address:X,chain:G,apiKey:$,fetchTxHex:J=!0}){let Q=await jX({chain:G,address:X,apiKey:$}),L=[];for(let{hash:Z,index:j,script_hex:W,value:q}of Q){let D;if(J)D=await DX({txHash:Z,chain:G,apiKey:$});L.push({address:X,hash:Z,index:j,txHex:D,value:q,witnessUtxo:{value:q,script:Buffer.from(W,"hex")}})}return L}function KX(X){let G=v.SKConfig.get("apiKeys").blockchair||"";return v.warnOnce(!G,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:($)=>zX({txHash:$,chain:X}),getRawTx:($)=>DX({txHash:$,chain:X,apiKey:G}),getSuggestedTxFee:()=>IX(X),getBalance:($)=>_X({address:$,chain:X,apiKey:G}),getAddressData:($)=>qX({address:$,chain:X,apiKey:G}),scanUTXOs:($)=>FX({...$,chain:X,apiKey:G})}}function wX(X){return X}function I(X){let G=v.SKConfig.get("apis")[X];if(G)return v.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),G;return KX(X)}async function P(){let X=await import("coininfo"),{networks:G}=(await import("bitcoinjs-lib")).default;return function $(J){switch(J){case v.Chain.Bitcoin:return G.bitcoin;case v.Chain.BitcoinCash:return X.bitcoincash.main.toBitcoinJS();case v.Chain.Dash:return X.dash.main.toBitcoinJS();case v.Chain.Litecoin:return X.litecoin.main.toBitcoinJS();case v.Chain.Dogecoin:{let Q={private:70615956,public:70617039},L=X.dogecoin.test;return L.versions.bip32=Q,X.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}var s=Y(require("bs58check")),t=Y(require("cashaddrjs"));var e;(($)=>{$.Mainnet="mainnet";$.Testnet="testnet"})(e||={});var M={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function XX(X){try{return u(X),!0}catch(G){return!1}}function GX(X){return u(X)?.network}function S(X){let G=u(X);if(G?.format==="legacy")return X;return OX(G)}function f(X){let G=u(X);return kX(G)}function u(X){try{return yX(X)}catch(G){}try{return NX(X)}catch(G){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function yX(X){try{let G=s.default.decode(X);if(G.length!==21)throw new Error("Received an invalid Bitcoin Cash address as input.");let $=G[0],J=Array.prototype.slice.call(G,1);switch($){case M.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case M.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case M.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case M.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case M.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case M.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new Error("Received an invalid Bitcoin Cash address as input.")}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function NX(X){if(X.indexOf(":")!==-1)try{return BX(X)}catch(G){}else{let G=["bitcoincash","bchtest","bchreg"];for(let $ of G)try{return BX(`${$}:${X}`)}catch(J){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function BX(X){try{let{hash:G,prefix:$,type:J}=t.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(G,0),network:$==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function OX(X){let G=M.legacy[X.network][X.type],$=Buffer.alloc(1+X.hash.length);return $[0]=G,$.set(X.hash,1),s.default.encode($)}function kX(X){let G=X.network==="mainnet"?"bitcoincash":"bchtest",$=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return t.default.encode(G,$,J)}var k=require("@swapkit/helpers");var r=(X)=>{switch(X){case k.Chain.Bitcoin:case k.Chain.BitcoinCash:return 550;case k.Chain.Dash:case k.Chain.Litecoin:return 5500;case k.Chain.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},N=({inputs:X,outputs:G,feeRate:$=1,chain:J=k.Chain.Bitcoin})=>{let Q=Math.ceil($),L=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Z=X.filter((T)=>y(T)*Q<=T.value),j=$X+G.reduce((T,z)=>T+g(z,L),0),W=G.reduce((T,z)=>T+z.value,0),q=j*Q,D=0,B=[];for(let T of Z){let z=y(T),C=Q*z;q+=C,D+=T.value,B.push(T);let H=q+W;if(D<H)continue;let K=D-H,w=Q*g({address:"",value:0},L);if(K>w){let p=w+q,ZX=D-(W+p);if(ZX>Math.max(y({})*Q,r(J)))return{inputs:B,outputs:G.concat({value:ZX,address:""}),fee:p}}return{inputs:B,outputs:G,fee:q}}return{fee:Q*A({inputs:X,outputs:G,feeRate:Q})}};var EX=1000,$X=10,VX=10;async function O(X){let{script:G,opcodes:$}=(await import("bitcoinjs-lib")).default,J=Buffer.from(X,"utf8");return G.compile([$.OP_RETURN,J])}var o;(($)=>{$.P2PKH="P2PKH";$.P2WPKH="P2WPKH"})(o||={});var n={["P2PKH"]:148,["P2WPKH"]:68},m={["P2PKH"]:34,["P2WPKH"]:31},x=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},A=({inputs:X,outputs:G,feeRate:$})=>{let J=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Q=X.filter((Z)=>Z.value>=n["type"in Z?Z.type:"P2PKH"]*Math.ceil($)).reduce((Z,j)=>Z+y(j),0),L=G?.reduce((Z,j)=>Z+g(j),0)||m[J];return 10+Q+L},y=(X)=>{if("type"in X)return n[X.type];if("address"in X&&X.address)return n[x(X.address)];return 148},g=(X,G)=>{if(X?.script)return 10+X.script.length+(X.script.length>=74?2:1);if(G)return m[G];return m.P2PKH};var U=require("@swapkit/helpers");var l=[U.Chain.Dash,U.Chain.Dogecoin];async function SX({inputs:X,outputs:G,chain:$,psbt:J,sender:Q,compiledMemo:L}){for(let W of X){let q=!!W.witnessUtxo&&!l.includes($)&&{witnessUtxo:W.witnessUtxo},D=l.includes($)&&{nonWitnessUtxo:W.txHex?Buffer.from(W.txHex,"hex"):void 0};J.addInput({hash:W.hash,index:W.index,...q,...D})}let{initEccLib:Z}=(await import("bitcoinjs-lib")).default,j=(await import("@bitcoinerlab/secp256k1")).default;for(let W of G){let q="address"in W&&W.address?W.address:Q,D=W.script;if(D&&!L)continue;let B=D?{script:L,value:0}:{address:q,value:W.value};Z(j),J.addOutput(B)}return{psbt:J,inputs:X}}async function TX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q,fetchTxHex:L=!1}){let Z=X.chain,{Psbt:j}=(await import("bitcoinjs-lib")).default,W=$?await O($):null,q=await HX({assetValue:X,recipient:G,memo:$,sender:Q,fetchTxHex:L}),{inputs:D,outputs:B}=N({...q,feeRate:J,chain:Z});if(!(D&&B))throw new Error("Insufficient Balance for transaction");let T=await P(),z=new j({network:T(Z)});if(Z===U.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:C,inputs:H}=await SX({inputs:D,outputs:B,chain:Z,psbt:z,sender:Q,compiledMemo:W});return{psbt:C,utxos:q.inputs,inputs:H}}async function vX(){let X=(await import("@bitcoinerlab/secp256k1")).default,{initEccLib:G,address:$}=(await import("bitcoinjs-lib")).default,J=await P();return function Q({address:L,chain:Z}){if(Z===U.Chain.BitcoinCash)return E(L);try{return G(X),$.toOutputScript(L,J(Z)),!0}catch(j){return!1}}}async function AX({chain:X,phrase:G,derivationPath:$}){let J=(await c(X))({phrase:G,derivationPath:$});async function Q(Z){return await Z.signAllInputs(J),Z}async function L(){return(await JX(X))(J)}return{getAddress:L,signTransaction:Q}}async function h({chain:X,...G}){let $="phrase"in G?G.phrase:void 0,J="index"in G?G.index||0:0,Q=U.derivationPathToString("derivationPath"in G&&G.derivationPath?G.derivationPath:U.updateDerivationPath(U.NetworkDerivationPath[X],{index:J})),L=$?await AX({chain:X,phrase:$,derivationPath:Q}):("signer"in G)?G.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let j=await JX(X),W=await vX(),q=await c(X);return{accumulative:N,calculateTxSize:A,getAddressFromKeys:j,getAddress:Z,validateAddress:(D)=>W({address:D,chain:X}),broadcastTx:(D)=>I(X).broadcastTx(D),createTransaction:TX,createKeysForPath:q,getFeeRates:()=>d(X),getInputsOutputsFee:MX,transfer:fX(L),getPrivateKeyFromMnemonic:(D)=>{return q(D).toWIF()},getBalance:UX(X),estimateTransactionFee:RX(X),estimateMaxSendableAmount:bX(X)}}async function MX({assetValue:X,feeOptionKey:G=U.FeeOption.Fast,feeRate:$,memo:J,sender:Q,recipient:L}){let Z=X.chain,j=await HX({assetValue:X,sender:Q,memo:J,recipient:L}),W=$?Math.floor($):(await d(Z))[G];return N({...j,feeRate:W,chain:Z})}function bX(X){return async function G({from:$,memo:J,feeRate:Q,feeOptionKey:L=U.FeeOption.Fast,recipients:Z=1}){let j=await I(X).getAddressData($),W=Q?Math.ceil(Q):(await d(X))[L],q=j?.utxo.map((C)=>({...C,type:"P2PKH",hash:""})).filter((C)=>C.value>Math.max(r(X),y(C)*W));if(!q?.length)return U.AssetValue.from({chain:X});let D=U.AssetValue.from({chain:X,value:q.reduce((C,H)=>C+H.value,0)}),B=typeof Z==="number"?Array.from({length:Z},()=>({address:$,value:0})):Z;if(J){let C=await O(J);B.push({address:$,script:C,value:0})}let z=A({inputs:q,outputs:B,feeRate:W})*W;return D.sub(z)}}function RX(X){return async(G)=>{let $=await MX(G);return U.AssetValue.from({chain:X,value:U.SwapKitNumber.fromBigInt(BigInt($.fee),8).getValue("string")})}}async function c(X){let{ECPairFactory:G}=await import("ecpair"),$=(await import("@bitcoinerlab/secp256k1")).default,{HDKey:J}=await import("@scure/bip32"),{mnemonicToSeedSync:Q}=await import("@scure/bip39"),L=await P(),{HDNode:Z,ECPair:j}=await import("@psf/bitcoincashjs-lib");switch(X){case U.Chain.BitcoinCash:return function W({phrase:q,derivationPath:D=`${U.DerivationPath.BCH}/0`,wif:B}){let T=L(X);if(B)return j.fromWIF(B,T);if(!q)throw new Error("No phrase provided");return Z.fromSeedBuffer(Buffer.from(Q(q)),T).derivePath(D).keyPair};case U.Chain.Bitcoin:case U.Chain.Dogecoin:case U.Chain.Litecoin:case U.Chain.Dash:return function W({phrase:q,wif:D,derivationPath:B}){if(!(D||q))throw new Error("Either phrase or wif must be provided");let T=G($),z=L(X);if(D)return T.fromWIF(D,z);let C=Q(q),H=J.fromMasterSeed(C,z).derive(B);if(!H.privateKey)throw new Error("Could not get private key from phrase");return T.fromPrivateKey(Buffer.from(H.privateKey),{network:z})};default:throw new Error(`Chain ${X} is not supported`)}}async function JX(X){let{payments:G}=(await import("bitcoinjs-lib")).default,$=await P();return function J(Q){if(!Q)throw new Error("Keys must be provided");let L=l.includes(X)?G.p2pkh:G.p2wpkh,{address:Z}=L({pubkey:Q.publicKey,network:$(X)});if(!Z)throw new Error("Address not defined");return Z}}function fX(X){return async function G({memo:$,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:Z}){let j=await X?.getAddress(),W=Z.chain;if(!(X&&j))throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");let q=L||(await d(W))[Q||U.FeeOption.Fast],{psbt:D}=await TX({recipient:J,feeRate:q,sender:j,assetValue:Z,memo:$}),B=await X.signTransaction(D);return B.finalizeAllInputs(),I(W).broadcastTx(B.extractTransaction().toHex())}}async function d(X){let G=await I(X).getSuggestedTxFee();return{[U.FeeOption.Average]:G,[U.FeeOption.Fast]:G*1.5,[U.FeeOption.Fastest]:G*2}}async function HX({assetValue:X,recipient:G,memo:$,sender:J,fetchTxHex:Q=!1}){let L=X.chain,Z=Q||l.includes(L);return{inputs:await I(L).scanUTXOs({address:J,fetchTxHex:Z}),outputs:[{address:G,value:Number(X.bigIntValue)},...$?[{address:"",script:await O($),value:0}]:[]]}}var _=F.Chain.BitcoinCash;function b(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let G=b(X);return XX(G)&&GX(G)==="mainnet"}function V(X){return b(f(X))}async function gX(X){async function G({builder:J,utxos:Q}){return Q.forEach((L,Z)=>{J.sign(Z,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(V(J))},signTransaction:G}}async function QX(X){let G="phrase"in X?X.phrase:void 0,$="index"in X?X.index||0:0,J=F.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:F.updateDerivationPath(F.NetworkDerivationPath[_],{index:$})),Q=(await c(_))({phrase:G,derivationPath:J}),L=Q?await gX(Q):("signer"in X)?X.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let{getBalance:j,getFeeRates:W,broadcastTx:q,...D}=await h({chain:_});function B(T,z=!0){return j(b(f(T)))}return{...D,getAddress:Z,broadcastTx:q,createTransaction:CX,buildTx:mX,getAddressFromKeys:lX,getBalance:B,getFeeRates:W,stripPrefix:b,stripToCashAddress:V,validateAddress:E,transfer:xX({getFeeRates:W,broadcastTx:q,signer:L})}}async function CX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Transaction:L,TransactionBuilder:Z,address:j}=await import("@psf/bitcoincashjs-lib");if(!E(G))throw new Error("Invalid address");let W=await I(_).scanUTXOs({address:V(Q),fetchTxHex:!0}),q=$?await O($):null,D=[];D.push({address:G,value:X.getBaseValue("number")});let{inputs:B,outputs:T}=N({inputs:W,outputs:D,feeRate:J,chain:_});if(!(B&&T))throw new Error("Balance insufficient for transaction");let z=await P(),C=new Z(z(_));await Promise.all(B.map(async(H)=>{let K=await I(_).getRawTx(H.hash);C.addInput(L.fromBuffer(Buffer.from(K,"hex")),H.index)}));for(let H of T){let K="address"in H&&H.address?H.address:S(Q),w=await P(),p=j.toOutputScript(S(K),w(_));C.addOutput(p,H.value)}if(q)C.addOutput(q,0);return{builder:C,utxos:B}}function xX({broadcastTx:X,getFeeRates:G,signer:$}){return async function J({recipient:Q,assetValue:L,feeOptionKey:Z=F.FeeOption.Fast,...j}){let W=await $?.getAddress();if(!($&&W))throw new Error("Signer must provider address");if(!Q)throw new Error("Recipient address must be provided");let q=j.feeRate||(await G())[Z],{builder:D,utxos:B}=await CX({...j,assetValue:L,feeRate:q,recipient:Q,sender:W}),z=(await $.signTransaction({builder:D,utxos:B})).toHex();return X(z)}}async function mX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Psbt:L}=(await import("bitcoinjs-lib")).default,Z=f(G);if(!E(Z))throw new Error("Invalid address");let j=await I(_).scanUTXOs({address:V(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=$?await O($):null,D=[];if(D.push({address:S(G),value:X.getBaseValue("number")}),q)D.push({script:q,value:0});let{inputs:B,outputs:T}=N({inputs:j,outputs:D,feeRate:W,chain:_});if(!(B&&T))throw new Error("Balance insufficient for transaction");let z=await P(),C=new L({network:z(_)});for(let{hash:H,index:K,witnessUtxo:w}of B)C.addInput({hash:H,index:K,witnessUtxo:w});for(let H of T){let K="address"in H&&H.address?H.address:S(Q),w=H.script?q?{script:q,value:0}:void 0:{address:K,value:H.value};if(w)C.addOutput(w)}return{psbt:C,utxos:j,inputs:B}}function lX(X){let G=X.getAddress(0);return V(G)}async function hX(X,G){switch(X){case R.Chain.BitcoinCash:return await QX(G);case R.Chain.Bitcoin:case R.Chain.Dogecoin:case R.Chain.Litecoin:case R.Chain.Dash:return await h({chain:X,...G});default:throw new Error(`Chain ${X} is not supported`)}}
|
|
1
|
+
var uX={};pX(uX,{toLegacyAddress:()=>S,toCashAddress:()=>f,stripToCashAddress:()=>V,stripPrefix:()=>b,nonSegwitChains:()=>l,isValidAddress:()=>XX,getUtxoToolbox:()=>hX,getUtxoNetwork:()=>P,getUtxoApi:()=>I,getUTXOAddressValidator:()=>vX,getScriptTypeForAddress:()=>x,getOutputSize:()=>g,getInputSize:()=>y,getDustThreshold:()=>r,getCreateKeysForPath:()=>c,detectAddressNetwork:()=>GX,createUTXOToolbox:()=>h,createCustomUtxoApi:()=>wX,createBCHToolbox:()=>QX,compileMemo:()=>O,calculateTxSize:()=>A,bchValidateAddress:()=>E,addressFromKeysGetter:()=>JX,accumulative:()=>N,UtxoNetwork:()=>e,UTXOScriptType:()=>o,TX_OVERHEAD:()=>$X,OutputSizes:()=>m,OP_RETURN_OVERHEAD:()=>VX,MIN_TX_FEE:()=>EX,InputSizes:()=>n});module.exports=cX(uX);var R=require("@swapkit/helpers");var F=require("@swapkit/helpers");var v=require("@swapkit/helpers");async function zX({chain:X,txHash:G}){let $=v.SKConfig.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[G],id:WX()}),Q=await v.RequestClient.post($,{headers:{"Content-Type":"application/json"},body:J});if(Q.error)throw new Error(`failed to broadcast a transaction: ${Q.error?.message}`);if(Q.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Q.result}function i(X){return`https://api.blockchair.com/${YX(X)}`}function LX(X){switch(X){case v.Chain.Bitcoin:return 5;case v.Chain.Dogecoin:return 1e4;case v.Chain.Litecoin:return 1;default:return 2}}function YX(X){switch(X){case v.Chain.BitcoinCash:return"bitcoin-cash";case v.Chain.Litecoin:return"litecoin";case v.Chain.Dash:return"dash";case v.Chain.Dogecoin:return"dogecoin";case v.Chain.Polkadot:return"polkadot";default:return"bitcoin"}}async function IX(X){try{let{feePerKb:G}=await v.RequestClient.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),$=G/1000;return Math.max($,LX(X))}catch(G){return LX(X)}}async function a(X,G){try{let $=await v.RequestClient.get(X);if(!$||$.context.code!==200)throw new Error(`failed to query ${X}`);return $.data}catch($){if(!G)throw $;let J=await v.RequestClient.get(`${X}${G?`&key=${G}`:""}`);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}}async function qX({address:X,chain:G,apiKey:$}){if(!X)throw new Error("address is required");try{return(await a(`${i(G)}/dashboards/address/${X}?transaction_details=true`,$))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function _X({address:X,chain:G,apiKey:$}){return(await qX({address:X,chain:G,apiKey:$}))?.address.balance||0}async function DX({chain:X,apiKey:G,txHash:$}){if(!$)throw new Error("txHash is required");try{return(await a(`${i(X)}/raw/transaction/${$}`,G))?.[$]?.raw_transaction||""}catch(J){return console.error(J),""}}async function PX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){return(await a(`${i(X)}/outputs?q=is_spent(false),recipient(${G})&limit=${Q}&offset=${J}`,$)).filter(({is_spent:j})=>!j).map(({script_hex:j,block_id:W,transaction_hash:q,index:D,value:B,spending_signature_hex:T})=>({hash:q,index:D,value:B,txHex:T,script_hex:j,is_confirmed:W!==-1}))}async function jX({chain:X,address:G,apiKey:$,offset:J=0,limit:Q=100}){if(!G)throw new Error("address is required");try{let L=await PX({chain:X,address:G,apiKey:$,offset:J,limit:Q});if(L.length<=Q)return L;let Z=await jX({chain:X,address:G,apiKey:$,offset:J+Q,limit:Q});return[...L,...Z]}catch(L){return console.error(L),[]}}async function FX({address:X,chain:G,apiKey:$,fetchTxHex:J=!0}){let Q=await jX({chain:G,address:X,apiKey:$}),L=[];for(let{hash:Z,index:j,script_hex:W,value:q}of Q){let D;if(J)D=await DX({txHash:Z,chain:G,apiKey:$});L.push({address:X,hash:Z,index:j,txHex:D,value:q,witnessUtxo:{value:q,script:Buffer.from(W,"hex")}})}return L}function KX(X){let G=v.SKConfig.get("apiKeys").blockchair||"";return v.warnOnce(!G,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:($)=>zX({txHash:$,chain:X}),getRawTx:($)=>DX({txHash:$,chain:X,apiKey:G}),getSuggestedTxFee:()=>IX(X),getBalance:($)=>_X({address:$,chain:X,apiKey:G}),getAddressData:($)=>qX({address:$,chain:X,apiKey:G}),scanUTXOs:($)=>FX({...$,chain:X,apiKey:G})}}function wX(X){return X}function I(X){let G=v.SKConfig.get("apis")[X];if(G)return v.warnOnce(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),G;return KX(X)}async function P(){let X=await import("coininfo"),{networks:G}=await import("bitcoinjs-lib");return function $(J){switch(J){case v.Chain.Bitcoin:return G.bitcoin;case v.Chain.BitcoinCash:return X.bitcoincash.main.toBitcoinJS();case v.Chain.Dash:return X.dash.main.toBitcoinJS();case v.Chain.Litecoin:return X.litecoin.main.toBitcoinJS();case v.Chain.Dogecoin:{let Q={private:70615956,public:70617039},L=X.dogecoin.test;return L.versions.bip32=Q,X.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}var s=Y(require("bs58check")),t=Y(require("cashaddrjs"));var e;(($)=>{$.Mainnet="mainnet";$.Testnet="testnet"})(e||={});var M={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function XX(X){try{return u(X),!0}catch(G){return!1}}function GX(X){return u(X)?.network}function S(X){let G=u(X);if(G?.format==="legacy")return X;return OX(G)}function f(X){let G=u(X);return kX(G)}function u(X){try{return yX(X)}catch(G){}try{return NX(X)}catch(G){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function yX(X){try{let G=s.default.decode(X);if(G.length!==21)throw new Error("Received an invalid Bitcoin Cash address as input.");let $=G[0],J=Array.prototype.slice.call(G,1);switch($){case M.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case M.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case M.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case M.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case M.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case M.bitpay.mainnet.p2sh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2sh"};default:throw new Error("Received an invalid Bitcoin Cash address as input.")}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function NX(X){if(X.indexOf(":")!==-1)try{return BX(X)}catch(G){}else{let G=["bitcoincash","bchtest","bchreg"];for(let $ of G)try{return BX(`${$}:${X}`)}catch(J){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function BX(X){try{let{hash:G,prefix:$,type:J}=t.default.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call(G,0),network:$==="bitcoincash"?"mainnet":"testnet",type:J==="P2PKH"?"p2pkh":"p2sh"}}catch(G){throw new Error("Received an invalid Bitcoin Cash address as input.")}}function OX(X){let G=M.legacy[X.network][X.type],$=Buffer.alloc(1+X.hash.length);return $[0]=G,$.set(X.hash,1),s.default.encode($)}function kX(X){let G=X.network==="mainnet"?"bitcoincash":"bchtest",$=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return t.default.encode(G,$,J)}var k=require("@swapkit/helpers");var r=(X)=>{switch(X){case k.Chain.Bitcoin:case k.Chain.BitcoinCash:return 550;case k.Chain.Dash:case k.Chain.Litecoin:return 5500;case k.Chain.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},N=({inputs:X,outputs:G,feeRate:$=1,chain:J=k.Chain.Bitcoin})=>{let Q=Math.ceil($),L=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Z=X.filter((T)=>y(T)*Q<=T.value),j=$X+G.reduce((T,z)=>T+g(z,L),0),W=G.reduce((T,z)=>T+z.value,0),q=j*Q,D=0,B=[];for(let T of Z){let z=y(T),C=Q*z;q+=C,D+=T.value,B.push(T);let H=q+W;if(D<H)continue;let K=D-H,w=Q*g({address:"",value:0},L);if(K>w){let p=w+q,ZX=D-(W+p);if(ZX>Math.max(y({})*Q,r(J)))return{inputs:B,outputs:G.concat({value:ZX,address:""}),fee:p}}return{inputs:B,outputs:G,fee:q}}return{fee:Q*A({inputs:X,outputs:G,feeRate:Q})}};var EX=1000,$X=10,VX=10;async function O(X){let{script:G,opcodes:$}=await import("bitcoinjs-lib"),J=Buffer.from(X,"utf8");return G.compile([$.OP_RETURN,J])}var o;(($)=>{$.P2PKH="P2PKH";$.P2WPKH="P2WPKH"})(o||={});var n={["P2PKH"]:148,["P2WPKH"]:68},m={["P2PKH"]:34,["P2WPKH"]:31},x=(X)=>{if(X.startsWith("bc1")||X.startsWith("ltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("3")||X.startsWith("L")||X.startsWith("M")||X.startsWith("X")||X.startsWith("D")||X.startsWith("bitcoincash:q")||X.startsWith("q"))return"P2PKH";throw new Error("Invalid address")},A=({inputs:X,outputs:G,feeRate:$})=>{let J=X[0]&&"address"in X[0]&&X[0].address?x(X[0].address):"P2PKH",Q=X.filter((Z)=>Z.value>=n["type"in Z?Z.type:"P2PKH"]*Math.ceil($)).reduce((Z,j)=>Z+y(j),0),L=G?.reduce((Z,j)=>Z+g(j),0)||m[J];return 10+Q+L},y=(X)=>{if("type"in X)return n[X.type];if("address"in X&&X.address)return n[x(X.address)];return 148},g=(X,G)=>{if(X?.script)return 10+X.script.length+(X.script.length>=74?2:1);if(G)return m[G];return m.P2PKH};var U=require("@swapkit/helpers");var l=[U.Chain.Dash,U.Chain.Dogecoin];async function SX({inputs:X,outputs:G,chain:$,psbt:J,sender:Q,compiledMemo:L}){for(let W of X){let q=!!W.witnessUtxo&&!l.includes($)&&{witnessUtxo:W.witnessUtxo},D=l.includes($)&&{nonWitnessUtxo:W.txHex?Buffer.from(W.txHex,"hex"):void 0};J.addInput({hash:W.hash,index:W.index,...q,...D})}let{initEccLib:Z}=await import("bitcoinjs-lib"),j=await import("@bitcoinerlab/secp256k1");for(let W of G){let q="address"in W&&W.address?W.address:Q,D=W.script;if(D&&!L)continue;let B=D?{script:L,value:0}:{address:q,value:W.value};Z(j),J.addOutput(B)}return{psbt:J,inputs:X}}async function TX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q,fetchTxHex:L=!1}){let Z=X.chain,{Psbt:j}=await import("bitcoinjs-lib"),W=$?await O($):null,q=await HX({assetValue:X,recipient:G,memo:$,sender:Q,fetchTxHex:L}),{inputs:D,outputs:B}=N({...q,feeRate:J,chain:Z});if(!(D&&B))throw new Error("Insufficient Balance for transaction");let T=await P(),z=new j({network:T(Z)});if(Z===U.Chain.Dogecoin)z.setMaximumFeeRate(650000000);let{psbt:C,inputs:H}=await SX({inputs:D,outputs:B,chain:Z,psbt:z,sender:Q,compiledMemo:W});return{psbt:C,utxos:q.inputs,inputs:H}}async function vX(){let X=await import("@bitcoinerlab/secp256k1"),{initEccLib:G,address:$}=await import("bitcoinjs-lib"),J=await P();return function Q({address:L,chain:Z}){if(Z===U.Chain.BitcoinCash)return E(L);try{return G(X),$.toOutputScript(L,J(Z)),!0}catch(j){return!1}}}async function AX({chain:X,phrase:G,derivationPath:$}){let J=(await c(X))({phrase:G,derivationPath:$});async function Q(Z){return await Z.signAllInputs(J),Z}async function L(){return(await JX(X))(J)}return{getAddress:L,signTransaction:Q}}async function h({chain:X,...G}){let $="phrase"in G?G.phrase:void 0,J="index"in G?G.index||0:0,Q=U.derivationPathToString("derivationPath"in G&&G.derivationPath?G.derivationPath:U.updateDerivationPath(U.NetworkDerivationPath[X],{index:J})),L=$?await AX({chain:X,phrase:$,derivationPath:Q}):("signer"in G)?G.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let j=await JX(X),W=await vX(),q=await c(X);return{accumulative:N,calculateTxSize:A,getAddressFromKeys:j,getAddress:Z,validateAddress:(D)=>W({address:D,chain:X}),broadcastTx:(D)=>I(X).broadcastTx(D),createTransaction:TX,createKeysForPath:q,getFeeRates:()=>d(X),getInputsOutputsFee:MX,transfer:fX(L),getPrivateKeyFromMnemonic:(D)=>{return q(D).toWIF()},getBalance:UX(X),estimateTransactionFee:RX(X),estimateMaxSendableAmount:bX(X)}}async function MX({assetValue:X,feeOptionKey:G=U.FeeOption.Fast,feeRate:$,memo:J,sender:Q,recipient:L}){let Z=X.chain,j=await HX({assetValue:X,sender:Q,memo:J,recipient:L}),W=$?Math.floor($):(await d(Z))[G];return N({...j,feeRate:W,chain:Z})}function bX(X){return async function G({from:$,memo:J,feeRate:Q,feeOptionKey:L=U.FeeOption.Fast,recipients:Z=1}){let j=await I(X).getAddressData($),W=Q?Math.ceil(Q):(await d(X))[L],q=j?.utxo.map((C)=>({...C,type:"P2PKH",hash:""})).filter((C)=>C.value>Math.max(r(X),y(C)*W));if(!q?.length)return U.AssetValue.from({chain:X});let D=U.AssetValue.from({chain:X,value:q.reduce((C,H)=>C+H.value,0)}),B=typeof Z==="number"?Array.from({length:Z},()=>({address:$,value:0})):Z;if(J){let C=await O(J);B.push({address:$,script:C,value:0})}let z=A({inputs:q,outputs:B,feeRate:W})*W;return D.sub(z)}}function RX(X){return async(G)=>{let $=await MX(G);return U.AssetValue.from({chain:X,value:U.SwapKitNumber.fromBigInt(BigInt($.fee),8).getValue("string")})}}async function c(X){let{ECPairFactory:G}=await import("ecpair"),$=await import("@bitcoinerlab/secp256k1"),{HDKey:J}=await import("@scure/bip32"),{mnemonicToSeedSync:Q}=await import("@scure/bip39"),L=await P(),{HDNode:Z,ECPair:j}=await import("@psf/bitcoincashjs-lib");switch(X){case U.Chain.BitcoinCash:return function W({phrase:q,derivationPath:D=`${U.DerivationPath.BCH}/0`,wif:B}){let T=L(X);if(B)return j.fromWIF(B,T);if(!q)throw new Error("No phrase provided");return Z.fromSeedBuffer(Buffer.from(Q(q)),T).derivePath(D).keyPair};case U.Chain.Bitcoin:case U.Chain.Dogecoin:case U.Chain.Litecoin:case U.Chain.Dash:return function W({phrase:q,wif:D,derivationPath:B}){if(!(D||q))throw new Error("Either phrase or wif must be provided");let T=G($),z=L(X);if(D)return T.fromWIF(D,z);let C=Q(q),H=J.fromMasterSeed(C,z).derive(B);if(!H.privateKey)throw new Error("Could not get private key from phrase");return T.fromPrivateKey(Buffer.from(H.privateKey),{network:z})};default:throw new Error(`Chain ${X} is not supported`)}}async function JX(X){let{payments:G}=await import("bitcoinjs-lib"),$=await P();return function J(Q){if(!Q)throw new Error("Keys must be provided");let L=l.includes(X)?G.p2pkh:G.p2wpkh,{address:Z}=L({pubkey:Q.publicKey,network:$(X)});if(!Z)throw new Error("Address not defined");return Z}}function fX(X){return async function G({memo:$,recipient:J,feeOptionKey:Q,feeRate:L,assetValue:Z}){let j=await X?.getAddress(),W=Z.chain;if(!(X&&j))throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");let q=L||(await d(W))[Q||U.FeeOption.Fast],{psbt:D}=await TX({recipient:J,feeRate:q,sender:j,assetValue:Z,memo:$}),B=await X.signTransaction(D);return B.finalizeAllInputs(),I(W).broadcastTx(B.extractTransaction().toHex())}}async function d(X){let G=await I(X).getSuggestedTxFee();return{[U.FeeOption.Average]:G,[U.FeeOption.Fast]:G*1.5,[U.FeeOption.Fastest]:G*2}}async function HX({assetValue:X,recipient:G,memo:$,sender:J,fetchTxHex:Q=!1}){let L=X.chain,Z=Q||l.includes(L);return{inputs:await I(L).scanUTXOs({address:J,fetchTxHex:Z}),outputs:[{address:G,value:Number(X.bigIntValue)},...$?[{address:"",script:await O($),value:0}]:[]]}}var _=F.Chain.BitcoinCash;function b(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function E(X){let G=b(X);return XX(G)&&GX(G)==="mainnet"}function V(X){return b(f(X))}async function gX(X){async function G({builder:J,utxos:Q}){return Q.forEach((L,Z)=>{J.sign(Z,X,void 0,65,L.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(V(J))},signTransaction:G}}async function QX(X){let G="phrase"in X?X.phrase:void 0,$="index"in X?X.index||0:0,J=F.derivationPathToString("derivationPath"in X&&X.derivationPath?X.derivationPath:F.updateDerivationPath(F.NetworkDerivationPath[_],{index:$})),Q=(await c(_))({phrase:G,derivationPath:J}),L=Q?await gX(Q):("signer"in X)?X.signer:void 0;function Z(){return Promise.resolve(L?.getAddress())}let{getBalance:j,getFeeRates:W,broadcastTx:q,...D}=await h({chain:_});function B(T,z=!0){return j(b(f(T)))}return{...D,getAddress:Z,broadcastTx:q,createTransaction:CX,buildTx:mX,getAddressFromKeys:lX,getBalance:B,getFeeRates:W,stripPrefix:b,stripToCashAddress:V,validateAddress:E,transfer:xX({getFeeRates:W,broadcastTx:q,signer:L})}}async function CX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Transaction:L,TransactionBuilder:Z,address:j}=await import("@psf/bitcoincashjs-lib");if(!E(G))throw new Error("Invalid address");let W=await I(_).scanUTXOs({address:V(Q),fetchTxHex:!0}),q=$?await O($):null,D=[];D.push({address:G,value:X.getBaseValue("number")});let{inputs:B,outputs:T}=N({inputs:W,outputs:D,feeRate:J,chain:_});if(!(B&&T))throw new Error("Balance insufficient for transaction");let z=await P(),C=new Z(z(_));await Promise.all(B.map(async(H)=>{let K=await I(_).getRawTx(H.hash);C.addInput(L.fromBuffer(Buffer.from(K,"hex")),H.index)}));for(let H of T){let K="address"in H&&H.address?H.address:S(Q),w=await P(),p=j.toOutputScript(S(K),w(_));C.addOutput(p,H.value)}if(q)C.addOutput(q,0);return{builder:C,utxos:B}}function xX({broadcastTx:X,getFeeRates:G,signer:$}){return async function J({recipient:Q,assetValue:L,feeOptionKey:Z=F.FeeOption.Fast,...j}){let W=await $?.getAddress();if(!($&&W))throw new Error("Signer must provider address");if(!Q)throw new Error("Recipient address must be provided");let q=j.feeRate||(await G())[Z],{builder:D,utxos:B}=await CX({...j,assetValue:L,feeRate:q,recipient:Q,sender:W}),z=(await $.signTransaction({builder:D,utxos:B})).toHex();return X(z)}}async function mX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Q}){let{Psbt:L}=await import("bitcoinjs-lib"),Z=f(G);if(!E(Z))throw new Error("Invalid address");let j=await I(_).scanUTXOs({address:V(Q),fetchTxHex:!0}),W=Number(J.toFixed(0)),q=$?await O($):null,D=[];if(D.push({address:S(G),value:X.getBaseValue("number")}),q)D.push({script:q,value:0});let{inputs:B,outputs:T}=N({inputs:j,outputs:D,feeRate:W,chain:_});if(!(B&&T))throw new Error("Balance insufficient for transaction");let z=await P(),C=new L({network:z(_)});for(let{hash:H,index:K,witnessUtxo:w}of B)C.addInput({hash:H,index:K,witnessUtxo:w});for(let H of T){let K="address"in H&&H.address?H.address:S(Q),w=H.script?q?{script:q,value:0}:void 0:{address:K,value:H.value};if(w)C.addOutput(w)}return{psbt:C,utxos:j,inputs:B}}function lX(X){let G=X.getAddress(0);return V(G)}async function hX(X,G){switch(X){case R.Chain.BitcoinCash:return await QX(G);case R.Chain.Bitcoin:case R.Chain.Dogecoin:case R.Chain.Litecoin:case R.Chain.Dash:return await h({chain:X,...G});default:throw new Error(`Chain ${X} is not supported`)}}
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=07C373AE3814952E64756E2164756E21
|