@swapkit/toolboxes 1.0.0-beta.15 → 1.0.0-beta.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-p1kdg37m.js → chunk-38ztynv0.js} +1 -1
- package/dist/{chunk-p1kdg37m.js.map → chunk-38ztynv0.js.map} +1 -1
- package/dist/{chunk-0f0249b1.js → chunk-cv69ewns.js} +1 -1
- package/dist/cosmos/index.js +1 -1
- package/dist/evm/index.cjs +2 -2
- package/dist/evm/index.cjs.map +3 -3
- package/dist/evm/index.js +2 -2
- package/dist/evm/index.js.map +3 -3
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +3 -3
- package/dist/radix/index.js +1 -1
- package/dist/ripple/index.cjs +2 -2
- package/dist/ripple/index.cjs.map +3 -3
- package/dist/ripple/index.js +2 -2
- package/dist/ripple/index.js.map +3 -3
- 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/substrate/index.js +1 -1
- package/dist/utxo/index.js +1 -1
- package/package.json +16 -16
- package/src/evm/__tests__/ethereum.test.ts +1 -1
- package/src/evm/toolbox/op.ts +11 -5
- package/src/index.ts +5 -0
- package/src/ripple/index.ts +14 -21
- package/src/solana/toolbox.ts +75 -2
- /package/dist/{chunk-0f0249b1.js.map → chunk-cv69ewns.js.map} +0 -0
package/dist/ripple/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"../chunk-
|
|
1
|
+
import"../chunk-38ztynv0.js";import{AssetValue as $,BaseDecimal as L,Chain as J,SKConfig as U,SwapKitError as M,SwapKitNumber as _}from"@swapkit/helpers";import{Client as f,Wallet as B,isValidAddress as b,xrpToDrops as R}from"xrpl";import{hashes as V}from"xrpl";var D={ACCOUNT_NOT_FOUND:19};function N(y){let z=B.fromMnemonic(y);return{getAddress:()=>Promise.resolve(z.address),signTransaction:(Y)=>Promise.resolve(z.sign(Y))}}function W(y){return b(y)}var E=async(y={})=>{let z="signer"in y&&y.signer?y.signer:("phrase"in y)&&y.phrase?N(y.phrase):void 0,Y=U.get("rpcUrls")[J.Ripple];if(!Y)throw new M({errorKey:"toolbox_ripple_rpc_not_configured",info:{chain:J.Ripple}});let Q=new f(Y);await Q.connect();let Z=()=>{if(!z)throw new M({errorKey:"toolbox_ripple_signer_not_found"});return z.getAddress()},H=async(j)=>{let G=j||await Z();try{let X=(await Q.request({command:"account_info",account:G})).result.account_data.Balance;return[$.from({chain:J.Ripple,value:X,fromBaseDecimal:L[J.Ripple]})]}catch(q){if(q.data.error_code===D.ACCOUNT_NOT_FOUND)return[$.from({chain:J.Ripple,value:0})];throw new M("toolbox_ripple_get_balance_error",{info:{address:G,error:q}})}},O=async()=>{let G=(await Q.request({command:"fee"})).result.drops.open_ledger_fee;return $.from({chain:J.Ripple,value:_.fromBigInt(BigInt(G),L[J.Ripple])})},k=async({assetValue:j,recipient:G,memo:q,sender:X})=>{if(!W(G))throw new M({errorKey:"core_transaction_invalid_recipient_address"});let P=X||await Z();if(!j.isGasAsset||j.chain!==J.Ripple)throw new M({errorKey:"toolbox_ripple_asset_not_supported",info:{asset:j.toString()}});let I={TransactionType:"Payment",Account:P,Amount:R(j.getValue("string")),Destination:G};if(q)I.Memos=[{Memo:{MemoData:Buffer.from(q).toString("hex")}}];return await Q.autofill(I)},v=(j)=>{if(!z)throw new M({errorKey:"toolbox_ripple_signer_not_found"});return z.signTransaction(j)},F=async(j)=>{let q=(await Q.submitAndWait(j)).result;if(q.validated)return q.hash;throw new M({errorKey:"toolbox_ripple_broadcast_error",info:{chain:J.Ripple}})};return{signer:z,createSigner:N,getAddress:Z,validateAddress:W,getBalance:H,createTransaction:k,signTransaction:v,broadcastTransaction:F,transfer:async(j)=>{if(!z)throw new M({errorKey:"toolbox_ripple_signer_not_found"});let G=await z.getAddress(),q=await k({...j,sender:G}),X=await v(q);return F(X.tx_blob)},estimateTransactionFee:O,disconnect:()=>Q.disconnect()}};export{W as rippleValidateAddress,V as hashes,E as getRippleToolbox};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=AD02AAC0A5102C8964756E2164756E21
|
package/dist/ripple/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/ripple/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n type ChainSigner,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\nimport type { Transaction } from \"xrpl\";\nimport { Client, type Payment, Wallet, isValidAddress, xrpToDrops } from \"xrpl\";\n\nexport type RippleWallet = Awaited<ReturnType<typeof getRippleToolbox>>;\n\n// Note: Ripple seeds generate a single address, no derivation path/index support.\nfunction createSigner(phrase: string): ChainSigner<Transaction, { tx_blob: string; hash: string }> {\n const wallet = Wallet.fromMnemonic(phrase);\n return {\n // publicKey: wallet.publicKey,\n // Address is sync, but interface requires async\n getAddress: () => Promise.resolve(wallet.address),\n // Signing is sync, but interface requires async\n signTransaction: (tx: Transaction) => Promise.resolve(wallet.sign(tx as Transaction)), // Cast needed as Wallet.sign expects Transaction\n };\n}\n\nexport function rippleValidateAddress(address: string) {\n return isValidAddress(address);\n}\n\ntype RippleToolboxParams =\n | { phrase: string }\n | { signer: ChainSigner<Transaction, { tx_blob: string; hash: string }> }\n | {};\n\nexport const getRippleToolbox = async (params: RippleToolboxParams = {}) => {\n const signer =\n \"signer\" in params && params.signer\n ? params.signer\n : \"phrase\" in params && params.phrase\n ? createSigner(params.phrase)\n : undefined;\n\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Ripple];\n if (!rpcUrl) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_rpc_not_configured\",\n info: { chain: Chain.Ripple },\n });\n }\n\n const client = new Client(rpcUrl);\n await client.connect();\n\n const getAddress = () => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.getAddress();\n };\n\n const getBalance = async (address?: string) => {\n const addr = address || (await getAddress());\n\n try {\n
|
|
5
|
+
"import {\n AssetValue,\n BaseDecimal,\n Chain,\n type ChainSigner,\n type GenericTransferParams,\n SKConfig,\n SwapKitError,\n SwapKitNumber,\n} from \"@swapkit/helpers\";\nimport type { Transaction } from \"xrpl\";\nimport { Client, type Payment, Wallet, isValidAddress, xrpToDrops } from \"xrpl\";\n\nexport type RippleWallet = Awaited<ReturnType<typeof getRippleToolbox>>;\n\nexport { hashes, type Transaction } from \"xrpl\";\n\nconst RIPPLE_ERROR_CODES = {\n ACCOUNT_NOT_FOUND: 19,\n} as const;\n\n// Note: Ripple seeds generate a single address, no derivation path/index support.\nfunction createSigner(phrase: string): ChainSigner<Transaction, { tx_blob: string; hash: string }> {\n const wallet = Wallet.fromMnemonic(phrase);\n return {\n // publicKey: wallet.publicKey,\n // Address is sync, but interface requires async\n getAddress: () => Promise.resolve(wallet.address),\n // Signing is sync, but interface requires async\n signTransaction: (tx: Transaction) => Promise.resolve(wallet.sign(tx as Transaction)), // Cast needed as Wallet.sign expects Transaction\n };\n}\n\nexport function rippleValidateAddress(address: string) {\n return isValidAddress(address);\n}\n\ntype RippleToolboxParams =\n | { phrase: string }\n | { signer: ChainSigner<Transaction, { tx_blob: string; hash: string }> }\n | {};\n\nexport const getRippleToolbox = async (params: RippleToolboxParams = {}) => {\n const signer =\n \"signer\" in params && params.signer\n ? params.signer\n : \"phrase\" in params && params.phrase\n ? createSigner(params.phrase)\n : undefined;\n\n const rpcUrl = SKConfig.get(\"rpcUrls\")[Chain.Ripple];\n if (!rpcUrl) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_rpc_not_configured\",\n info: { chain: Chain.Ripple },\n });\n }\n\n const client = new Client(rpcUrl);\n await client.connect();\n\n const getAddress = () => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.getAddress();\n };\n\n const getBalance = async (address?: string) => {\n const addr = address || (await getAddress());\n\n try {\n const accountInfo = await client.request({ command: \"account_info\", account: addr });\n\n const balance = accountInfo.result.account_data.Balance;\n\n return [\n AssetValue.from({\n chain: Chain.Ripple,\n value: balance,\n fromBaseDecimal: BaseDecimal[Chain.Ripple],\n }),\n ];\n } catch (error) {\n // empty account\n if ((error as any).data.error_code === RIPPLE_ERROR_CODES.ACCOUNT_NOT_FOUND) {\n return [\n AssetValue.from({\n chain: Chain.Ripple,\n value: 0,\n }),\n ];\n }\n throw new SwapKitError(\"toolbox_ripple_get_balance_error\", {\n info: { address: addr, error },\n });\n }\n };\n\n const estimateTransactionFee = async () => {\n const feeResponse = await client.request({ command: \"fee\" });\n const feeDrops = feeResponse.result.drops.open_ledger_fee; // Fee in drops\n\n return AssetValue.from({\n chain: Chain.Ripple,\n value: SwapKitNumber.fromBigInt(BigInt(feeDrops), BaseDecimal[Chain.Ripple]),\n });\n };\n\n const createTransaction = async ({\n assetValue,\n recipient,\n memo,\n sender,\n }: { assetValue: AssetValue; recipient: string; sender?: string; memo?: string }) => {\n if (!rippleValidateAddress(recipient)) {\n throw new SwapKitError({ errorKey: \"core_transaction_invalid_recipient_address\" });\n }\n\n const senderAddress = sender || (await getAddress());\n\n if (!assetValue.isGasAsset || assetValue.chain !== Chain.Ripple) {\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_asset_not_supported\",\n info: { asset: assetValue.toString() },\n });\n }\n\n const transaction: Payment = {\n TransactionType: \"Payment\",\n Account: senderAddress,\n Amount: xrpToDrops(assetValue.getValue(\"string\")),\n Destination: recipient,\n };\n\n if (memo) {\n transaction.Memos = [{ Memo: { MemoData: Buffer.from(memo).toString(\"hex\") } }];\n }\n\n const preparedTx = await client.autofill(transaction);\n return preparedTx;\n };\n\n const signTransaction = (tx: Transaction) => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n return signer.signTransaction(tx);\n };\n\n const broadcastTransaction = async (signedTxHex: string) => {\n const submitResult = await client.submitAndWait(signedTxHex);\n const result = submitResult.result;\n\n if (result.validated) {\n return result.hash;\n }\n\n throw new SwapKitError({\n errorKey: \"toolbox_ripple_broadcast_error\",\n info: { chain: Chain.Ripple },\n });\n };\n\n const transfer = async (params: GenericTransferParams) => {\n if (!signer) {\n throw new SwapKitError({ errorKey: \"toolbox_ripple_signer_not_found\" });\n }\n const sender = await signer.getAddress();\n const tx = await createTransaction({ ...params, sender });\n const signedTx = await signTransaction(tx);\n return broadcastTransaction(signedTx.tx_blob);\n };\n\n const disconnect = () => client.disconnect();\n\n return {\n // Signer related\n signer, // Expose the signer instance if created/provided\n createSigner, // Expose the helper\n // Core methods\n getAddress,\n validateAddress: rippleValidateAddress,\n getBalance,\n createTransaction,\n signTransaction,\n broadcastTransaction,\n transfer,\n estimateTransactionFee,\n disconnect,\n };\n};\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "6BAAA,qBACE,iBACA,WACA,cAGA,kBACA,mBACA,yBAGF,iBAAS,YAAsB,oBAAQ,gBAAgB,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "AD02AAC0A5102C8964756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/solana/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var
|
|
1
|
+
var H={};I(H,{getSolanaToolbox:()=>N,getSolanaAddressValidator:()=>u,createKeysForPath:()=>j});module.exports=v(H);var p=require("@swapkit/helpers"),E=require("ts-pattern"),z=require("ts-pattern");async function F(T){try{let a=await fetch(`https://lite-api.jup.ag/tokens/v1/token/${T}`);if(!a.ok)return null;return await a.json()}catch{return null}}async function J(T){let a=await h(),{PublicKey:l}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:y}=await import("@solana/spl-token"),P=new l(T),o=[],S=await a.getBalance(P);if(S>0)o.push(p.AssetValue.from({chain:p.Chain.Solana,value:S,fromBaseDecimal:p.BaseDecimal[p.Chain.Solana]}));let x=await a.getParsedTokenAccountsByOwner(P,{programId:y});for(let{account:m}of x.value){let b=m.data.parsed.info,O=b.mint,R=b.tokenAmount.amount;if(Number(R)===0)continue;let G=await F(O),q=G?.symbol||"UNKNOWN",w=G?.decimals||b.tokenAmount.decimals;o.push(p.AssetValue.from({chain:p.Chain.Solana,symbol:q,address:O,value:R,fromBaseDecimal:w}))}return o}async function u(){let{PublicKey:T}=await import("@solana/web3.js");return(a)=>{try{let l=new T(a);return T.isOnCurve(l.toBytes())}catch(l){return!1}}}async function N(T){let a=T&&"index"in T?T.index||0:0,l=p.derivationPathToString(T&&"derivationPath"in T&&T.derivationPath?T.derivationPath:p.updateDerivationPath(p.NetworkDerivationPath[p.Chain.Solana],{index:a})),y=await z.match(T).with({phrase:E.P.string},({phrase:o})=>j({phrase:o,derivationPath:l})).with({signer:E.P.any},({signer:o})=>o).otherwise(()=>{return});function P(){return y?.publicKey?d(y.publicKey):""}return{getConnection:h,getAddress:P,createKeysForPath:j,getAddressFromPubKey:d,getPubkeyFromAddress:L,createTransaction:A(h),createTransactionFromInstructions:Z,getBalance:(o)=>{let S=o||P();if(!S)throw new p.SwapKitError("core_wallet_connection_not_found");return J(S)},transfer:_(h,y),broadcastTransaction:W(h),getAddressValidator:u,signTransaction:$(h,y),estimateTransactionFee:Q(h)}}function Q(T){return async({recipient:a,assetValue:l,memo:y,isProgramDerivedAddress:P,sender:o})=>{let S=await T(),m=(await A(T)({recipient:a,assetValue:l,memo:y,isProgramDerivedAddress:P,sender:o})).compileMessage(),b=await S.getFeeForMessage(m);if(b.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:b.value,fromBaseDecimal:p.BaseDecimal[p.Chain.Solana]})}}async function h(){let{Connection:T}=await import("@solana/web3.js");return new T(p.SKConfig.get("rpcUrls").SOL,"confirmed")}function X(T){return async({assetValue:a,recipient:l,sender:y,isProgramDerivedAddress:P})=>{let o=await T(),S=await L(y);if(a.isGasAsset){let{Transaction:x,SystemProgram:m,PublicKey:b}=await import("@solana/web3.js");return new x().add(m.transfer({fromPubkey:S,lamports:a.getBaseValue("number"),toPubkey:new b(l)}))}if(a.address)return Y({amount:a.getBaseValue("number"),connection:o,decimals:a.decimal,from:S,recipient:l,tokenAddress:a.address,isProgramDerivedAddress:P});return}}async function Y({tokenAddress:T,recipient:a,from:l,connection:y,amount:P,decimals:o,isProgramDerivedAddress:S}){let{getAssociatedTokenAddress:x,getAccount:m,createAssociatedTokenAccountInstruction:b,createTransferCheckedInstruction:O}=await import("@solana/spl-token"),{Transaction:R,PublicKey:G}=await import("@solana/web3.js"),q=new R,w=new G(T),B=await x(w,l),U=new G(a),M=await x(w,U,S),V=!1;try{await m(y,M),V=!0}catch(K){}if(!V)q.add(b(l,M,U,w));return q.add(O(B,w,M,l,P,o)),q}function A(T){return async({recipient:a,assetValue:l,memo:y,isProgramDerivedAddress:P,sender:o})=>{let{createMemoInstruction:S}=await import("@solana/spl-memo"),x=await L(o),m=await u();if(!(P||m(a)))throw new p.SwapKitError("core_transaction_invalid_recipient_address");let b=await T(),O=await X(T)({assetValue:l,recipient:a,sender:o,isProgramDerivedAddress:P});if(!O)throw new p.SwapKitError("core_transaction_invalid_sender_address");if(y)O.add(S(y));let R=await b.getLatestBlockhash();return O.recentBlockhash=R.blockhash,O.feePayer=x,O}}async function Z({instructions:T}){let{Transaction:a}=await import("@solana/web3.js"),l=new a().add(...T);if(!l)throw new p.SwapKitError("core_transaction_invalid_sender_address");return l}function _(T,a){return async({recipient:l,assetValue:y,memo:P,isProgramDerivedAddress:o})=>{if(!a)throw new p.SwapKitError("core_transaction_invalid_sender_address");let S=a.publicKey?.toString()??(await a.connect()).publicKey.toString(),x=await A(T)({recipient:l,assetValue:y,memo:P,isProgramDerivedAddress:o,sender:S});if("connect"in a){let m=await a.signTransaction(x);return W(T)(m)}return x.sign(a),W(T)(x)}}function W(T){return async(a)=>{return(await T()).sendRawTransaction(a.serialize())}}function $(T,a){return async(l)=>{let{VersionedTransaction:y}=await import("@solana/web3.js");if(!a)throw new p.SwapKitError("toolbox_solana_no_signer");if(!(l instanceof y)){let o=await(await T()).getLatestBlockhash();l.recentBlockhash=o.blockhash,l.feePayer=a.publicKey||void 0}if("connect"in a)return await a.signTransaction(l);return await l.sign([a]),l}}async function j({phrase:T,derivationPath:a=p.DerivationPath.SOL}){let{HDKey:l}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:y}=await import("@scure/bip39"),{Keypair:P}=await import("@solana/web3.js"),o=y(T),S=l.fromMasterSeed(o);return P.fromSeed(S.derive(a,!0).privateKey)}function d(T){return T.toString()}async function L(T){let{PublicKey:a}=await import("@solana/web3.js");return new a(T)}
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=1A8C9387385F1E0B64756E2164756E21
|
|
@@ -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\");\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"
|
|
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 \".\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\ntype TokenMetadata = {\n name: string;\n symbol: string;\n decimals: number;\n logoURI?: string;\n tags?: string[];\n daily_volume?: number;\n};\n\nasync function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null> {\n try {\n const response = await fetch(`https://lite-api.jup.ag/tokens/v1/token/${mintAddress}`);\n if (!response.ok) return null;\n return await response.json();\n } catch {\n return null;\n }\n}\n\nasync function getSolanaBalance(address: string) {\n const connection = await getConnection();\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const publicKey = new PublicKey(address);\n\n const balances: AssetValue[] = [];\n\n // Get SOL balance\n const solBalance = await connection.getBalance(publicKey);\n if (solBalance > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Solana,\n value: solBalance,\n fromBaseDecimal: BaseDecimal[Chain.Solana],\n }),\n );\n }\n\n // Get token balances\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(publicKey, {\n programId: TOKEN_PROGRAM_ID,\n });\n\n for (const { account } of tokenAccounts.value) {\n const tokenInfo = account.data.parsed.info;\n const mintAddress = tokenInfo.mint;\n const amount = tokenInfo.tokenAmount.amount;\n\n if (Number(amount) === 0) continue;\n\n // Fetch token metadata from Jupiter\n const metadata = await fetchTokenMetaData(mintAddress);\n const symbol = metadata?.symbol || \"UNKNOWN\";\n const decimals = metadata?.decimals || tokenInfo.tokenAmount.decimals;\n\n balances.push(\n AssetValue.from({\n chain: Chain.Solana,\n symbol,\n address: mintAddress,\n value: amount,\n fromBaseDecimal: decimals,\n }),\n );\n }\n\n return balances;\n}\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: (addressParam?: string) => {\n const address = addressParam || getAddress();\n if (!address) throw new SwapKitError(\"core_wallet_connection_not_found\");\n return getSolanaBalance(address);\n },\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,
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "1A8C9387385F1E0B64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/solana/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{c as S,d as f}from"../chunk-38ztynv0.js";import{AssetValue as j,BaseDecimal as F,Chain as q,DerivationPath as Q,NetworkDerivationPath as X,SKConfig as Y,SwapKitError as R,derivationPathToString as Z,updateDerivationPath as _}from"@swapkit/helpers";import{P as d}from"ts-pattern";import{match as $}from"ts-pattern";async function v(T){try{let a=await fetch(`https://lite-api.jup.ag/tokens/v1/token/${T}`);if(!a.ok)return null;return await a.json()}catch{return null}}async function I(T){let a=await h(),{PublicKey:l}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:o}=await import("@solana/spl-token"),y=new l(T),p=[],P=await a.getBalance(y);if(P>0)p.push(j.from({chain:q.Solana,value:P,fromBaseDecimal:F[q.Solana]}));let x=await a.getParsedTokenAccountsByOwner(y,{programId:o});for(let{account:m}of x.value){let b=m.data.parsed.info,O=b.mint,w=b.tokenAmount.amount;if(Number(w)===0)continue;let M=await v(O),E=M?.symbol||"UNKNOWN",G=M?.decimals||b.tokenAmount.decimals;p.push(j.from({chain:q.Solana,symbol:E,address:O,value:w,fromBaseDecimal:G}))}return p}async function J(){let{PublicKey:T}=await import("@solana/web3.js");return(a)=>{try{let l=new T(a);return T.isOnCurve(l.toBytes())}catch(l){return!1}}}async function g(T){let a=T&&"index"in T?T.index||0:0,l=Z(T&&"derivationPath"in T&&T.derivationPath?T.derivationPath:_(X[q.Solana],{index:a})),o=await $(T).with({phrase:d.string},({phrase:p})=>z({phrase:p,derivationPath:l})).with({signer:d.any},({signer:p})=>p).otherwise(()=>{return});function y(){return o?.publicKey?B(o.publicKey):""}return{getConnection:h,getAddress:y,createKeysForPath:z,getAddressFromPubKey:B,getPubkeyFromAddress:L,createTransaction:A(h),createTransactionFromInstructions:k,getBalance:(p)=>{let P=p||y();if(!P)throw new R("core_wallet_connection_not_found");return I(P)},transfer:s(h,o),broadcastTransaction:u(h),getAddressValidator:J,signTransaction:C(h,o),estimateTransactionFee:H(h)}}function H(T){return async({recipient:a,assetValue:l,memo:o,isProgramDerivedAddress:y,sender:p})=>{let P=await T(),m=(await A(T)({recipient:a,assetValue:l,memo:o,isProgramDerivedAddress:y,sender:p})).compileMessage(),b=await P.getFeeForMessage(m);if(b.value===null)throw new R("toolbox_solana_fee_estimation_failed","Could not estimate Solana fee.");return j.from({chain:q.Solana,value:b.value,fromBaseDecimal:F[q.Solana]})}}async function h(){let{Connection:T}=await import("@solana/web3.js");return new T(Y.get("rpcUrls").SOL,"confirmed")}function K(T){return async({assetValue:a,recipient:l,sender:o,isProgramDerivedAddress:y})=>{let p=await T(),P=await L(o);if(a.isGasAsset){let{Transaction:x,SystemProgram:m,PublicKey:b}=await import("@solana/web3.js");return new x().add(m.transfer({fromPubkey:P,lamports:a.getBaseValue("number"),toPubkey:new b(l)}))}if(a.address)return D({amount:a.getBaseValue("number"),connection:p,decimals:a.decimal,from:P,recipient:l,tokenAddress:a.address,isProgramDerivedAddress:y});return}}async function D({tokenAddress:T,recipient:a,from:l,connection:o,amount:y,decimals:p,isProgramDerivedAddress:P}){let{getAssociatedTokenAddress:x,getAccount:m,createAssociatedTokenAccountInstruction:b,createTransferCheckedInstruction:O}=await import("@solana/spl-token"),{Transaction:w,PublicKey:M}=await import("@solana/web3.js"),E=new w,G=new M(T),N=await x(G,l),U=new M(a),W=await x(G,U,P),V=!1;try{await m(o,W),V=!0}catch(n){}if(!V)E.add(b(l,W,U,G));return E.add(O(N,G,W,l,y,p)),E}function A(T){return async({recipient:a,assetValue:l,memo:o,isProgramDerivedAddress:y,sender:p})=>{let{createMemoInstruction:P}=await import("@solana/spl-memo"),x=await L(p),m=await J();if(!(y||m(a)))throw new R("core_transaction_invalid_recipient_address");let b=await T(),O=await K(T)({assetValue:l,recipient:a,sender:p,isProgramDerivedAddress:y});if(!O)throw new R("core_transaction_invalid_sender_address");if(o)O.add(P(o));let w=await b.getLatestBlockhash();return O.recentBlockhash=w.blockhash,O.feePayer=x,O}}async function k({instructions:T}){let{Transaction:a}=await import("@solana/web3.js"),l=new a().add(...T);if(!l)throw new R("core_transaction_invalid_sender_address");return l}function s(T,a){return async({recipient:l,assetValue:o,memo:y,isProgramDerivedAddress:p})=>{if(!a)throw new R("core_transaction_invalid_sender_address");let P=a.publicKey?.toString()??(await a.connect()).publicKey.toString(),x=await A(T)({recipient:l,assetValue:o,memo:y,isProgramDerivedAddress:p,sender:P});if("connect"in a){let m=await a.signTransaction(x);return u(T)(m)}return x.sign(a),u(T)(x)}}function u(T){return async(a)=>{return(await T()).sendRawTransaction(a.serialize())}}function C(T,a){return async(l)=>{let{VersionedTransaction:o}=await import("@solana/web3.js");if(!a)throw new R("toolbox_solana_no_signer");if(!(l instanceof o)){let p=await(await T()).getLatestBlockhash();l.recentBlockhash=p.blockhash,l.feePayer=a.publicKey||void 0}if("connect"in a)return await a.signTransaction(l);return await l.sign([a]),l}}async function z({phrase:T,derivationPath:a=Q.SOL}){let{HDKey:l}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:o}=await import("@scure/bip39"),{Keypair:y}=await import("@solana/web3.js"),p=o(T),P=l.fromMasterSeed(p);return y.fromSeed(P.derive(a,!0).privateKey)}function B(T){return T.toString()}async function L(T){let{PublicKey:a}=await import("@solana/web3.js");return new a(T)}export{g as getSolanaToolbox,J as getSolanaAddressValidator,z as createKeysForPath};
|
|
2
2
|
|
|
3
|
-
//# debugId=
|
|
3
|
+
//# debugId=2D4DCF3D429F413464756E2164756E21
|
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\");\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"
|
|
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 \".\";\n\ntype SolanaSigner = SolanaProvider | Signer;\n\ntype TokenMetadata = {\n name: string;\n symbol: string;\n decimals: number;\n logoURI?: string;\n tags?: string[];\n daily_volume?: number;\n};\n\nasync function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null> {\n try {\n const response = await fetch(`https://lite-api.jup.ag/tokens/v1/token/${mintAddress}`);\n if (!response.ok) return null;\n return await response.json();\n } catch {\n return null;\n }\n}\n\nasync function getSolanaBalance(address: string) {\n const connection = await getConnection();\n const { PublicKey } = await import(\"@solana/web3.js\");\n const { TOKEN_PROGRAM_ID } = await import(\"@solana/spl-token\");\n const publicKey = new PublicKey(address);\n\n const balances: AssetValue[] = [];\n\n // Get SOL balance\n const solBalance = await connection.getBalance(publicKey);\n if (solBalance > 0) {\n balances.push(\n AssetValue.from({\n chain: Chain.Solana,\n value: solBalance,\n fromBaseDecimal: BaseDecimal[Chain.Solana],\n }),\n );\n }\n\n // Get token balances\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(publicKey, {\n programId: TOKEN_PROGRAM_ID,\n });\n\n for (const { account } of tokenAccounts.value) {\n const tokenInfo = account.data.parsed.info;\n const mintAddress = tokenInfo.mint;\n const amount = tokenInfo.tokenAmount.amount;\n\n if (Number(amount) === 0) continue;\n\n // Fetch token metadata from Jupiter\n const metadata = await fetchTokenMetaData(mintAddress);\n const symbol = metadata?.symbol || \"UNKNOWN\";\n const decimals = metadata?.decimals || tokenInfo.tokenAmount.decimals;\n\n balances.push(\n AssetValue.from({\n chain: Chain.Solana,\n symbol,\n address: mintAddress,\n value: amount,\n fromBaseDecimal: decimals,\n }),\n );\n }\n\n return balances;\n}\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: (addressParam?: string) => {\n const address = addressParam || getAddress();\n if (!address) throw new SwapKitError(\"core_wallet_connection_not_found\");\n return getSolanaBalance(address);\n },\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": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "2D4DCF3D429F413464756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
package/dist/substrate/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{b}from"../chunk-0h4xdrwz.js";import{c as f,d as g}from"../chunk-
|
|
1
|
+
import{b}from"../chunk-0h4xdrwz.js";import{c as f,d as g}from"../chunk-38ztynv0.js";import{hexToU8a as E,isHex as N,u8aToHex as j}from"@polkadot/util";import{decodeAddress as S,encodeAddress as k}from"@polkadot/util-crypto";import{AssetValue as R,Chain as p,SKConfig as D,SwapKitError as c,SwapKitNumber as B}from"@swapkit/helpers";import{P as x,match as F}from"ts-pattern";var v={prefix:0,network:"polkadot",displayName:"Polkadot Relay Chain",symbols:["DOT"],decimals:[10],standardAccount:"*25519",website:"https://polkadot.network"},C={prefix:2112,network:"chainflip",displayName:"Chainflip",symbols:["FLIP"],decimals:[18],standardAccount:"*25519",website:"https://chainflip.io/"},K={prefix:42,network:"substrate",displayName:"Substrate",symbols:[],decimals:[],standardAccount:"*25519",website:"https://substrate.io/"},d={DOT:v,FLIP:C,GENERIC:K};var M=({generic:e=!1,...t}={})=>{return _({chain:p.Polkadot,generic:e,...t})},G=async({generic:e=!1,...t}={})=>{return{...await _({chain:p.Chainflip,generic:e,...t}),getBalance:b(p.Chainflip)}};function te(e,t){switch(e){case p.Chainflip:return G(t);case p.Polkadot:return M(t);default:throw new Error(`Chain ${e} is not supported`)}}function u(e){return"address"in e}async function I(e,t){let{Keyring:r}=await import("@polkadot/api"),{cryptoWaitReady:n}=await import("@polkadot/util-crypto");return await n(),new r({type:"sr25519",ss58Format:t}).addFromUri(e)}var w=(e,t)=>e.rpc.system.accountNextIndex(t),y=(e,t)=>{try{let r=A(e,t);return T(r,"ss58",t),!0}catch(r){return!1}},P=(e,{recipient:t,assetValue:r})=>e.tx.balances?.transferAllowDeath?.(t,r.getBaseValue("number")),V=async(e,t,{recipient:r,assetValue:n,sender:a})=>{let i=P(e,{recipient:r,assetValue:n}),o=u(t);if(!i)return;let s=o?t.address:a;if(!s)throw new c("core_transaction_invalid_sender_address");let l=await w(e,s);return(await i.signAndSend(o?t:s,{signer:o?void 0:t,nonce:l}))?.toString()},L=async(e,t,r,{recipient:n,assetValue:a,sender:i})=>{let o=P(e,{recipient:n,assetValue:a}),s=u(t)?t.address:i;if(!s)return;let l=await o?.paymentInfo(s,{nonce:await w(e,s)})||{partialFee:0};return r.set(B.fromBigInt(BigInt(l.partialFee.toString()),r.decimal).getValue("string"))},U=async(e,t)=>{if(t)return e.send(t);return(await e.send()).toString()},H=async(e,t)=>{return await t.signAsync(e)},W=(e,t,r)=>{if(r)return t.signAndSend(e,r);return t.signAndSend(e).toString()},O=async({signer:e,address:t,tx:r,callback:n,api:a})=>{let i=await w(a,t);if(n)r.signAndSend(t,{nonce:i,signer:e},n);return r.signAndSend(t,{nonce:i,signer:e}).toString()};function q(e,t){let r=S(e);return k(r,t)}function A(e,t){return N(e)?E(e):S(e,void 0,t)}function T(e,t="ss58",r){if(t==="hex")return j(e);return k(e,r)}var $=({api:e,network:t,gasAsset:r,signer:n})=>({api:e,network:t,gasAsset:r,decodeAddress:A,encodeAddress:T,convertAddress:q,getBalance:b(p.Polkadot),createKeyring:(a)=>I(a,t.prefix),getAddress:(a)=>{let i=a||n;if(!i)throw new c("core_wallet_not_keypair_wallet");return u(i)?i.address:void 0},createTransaction:(a)=>P(e,a),validateAddress:(a)=>y(a,t.prefix),transfer:(a)=>{if(!n)throw new c("core_wallet_not_keypair_wallet");return V(e,n,a)},estimateTransactionFee:(a)=>{if(!n)throw new c("core_wallet_not_keypair_wallet");return L(e,n,r,a)},sign:(a)=>{if(!n)throw new c("core_wallet_not_keypair_wallet");if(u(n))return H(n,a);throw new c("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")},broadcast:U,signAndBroadcast:({tx:a,callback:i,address:o})=>{if(!n)throw new c("core_wallet_not_keypair_wallet");if(u(n))return W(n,a,i);if(o)return O({signer:n,address:o,tx:a,callback:i,api:e});throw new c("core_wallet_not_keypair_wallet","Signer does not have keyring pair capabilities required for signing.")}}),re=({address:e,chain:t})=>{let{prefix:r}=t===p.Polkadot?d.DOT:d.FLIP;return y(e,r)||y(e,d.GENERIC.prefix)};async function _({generic:e,chain:t,...r}){let{ApiPromise:n,WsProvider:a}=await import("@polkadot/api"),i=new a(D.get("rpcUrls")[t]),o=await n.create({provider:i}),s=R.from({chain:t}),l=e?d.GENERIC:d[t],h=await F(r).with({phrase:x.string},({phrase:m})=>I(m,d[t].prefix)).with({signer:x.any},({signer:m})=>m).otherwise(()=>{return});return $({api:o,signer:h,gasAsset:s,network:l})}export{re as substrateValidateAddress,u as isKeyringPair,te as getSubstrateToolbox,_ as createSubstrateToolbox,I as createKeyring,d as SubstrateNetwork,M as PolkadotToolbox,G as ChainflipToolbox,$ as BaseSubstrateToolbox};
|
|
2
2
|
|
|
3
3
|
//# debugId=4662675F7CC450C464756E2164756E21
|
package/dist/utxo/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as QX,b as TX}from"../chunk-0h4xdrwz.js";import"../chunk-p1kdg37m.js";import{Chain as A}from"@swapkit/helpers";import{Transaction as ZG,TransactionBuilder as jG,address as LG}from"@psf/bitcoincashjs-lib";import{Chain as WG,FeeOption as qG,NetworkDerivationPath as DG,derivationPathToString as BG,updateDerivationPath as UG}from"@swapkit/helpers";import{Psbt as vG}from"bitcoinjs-lib";import{Chain as z,RequestClient as R,SKConfig as r,warnOnce as ZX}from"@swapkit/helpers";import{networks as yX}from"bitcoinjs-lib";import V from"coininfo";async function KX({chain:X,txHash:G}){let $=r.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[G],id:QX()}),Z=await R.post($,{headers:{"Content-Type":"application/json"},body:J});if(Z.error)throw new Error(`failed to broadcast a transaction: ${Z.error?.message}`);if(Z.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Z.result}function o(X){return`https://api.blockchair.com/${kX(X)}`}function JX(X){switch(X){case z.Bitcoin:return 5;case z.Dogecoin:return 1e4;case z.Litecoin:return 1;default:return 2}}function kX(X){switch(X){case z.BitcoinCash:return"bitcoin-cash";case z.Litecoin:return"litecoin";case z.Dash:return"dash";case z.Dogecoin:return"dogecoin";case z.Polkadot:return"polkadot";default:return"bitcoin"}}async function NX(X){try{let{feePerKb:G}=await R.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),$=G/1000;return Math.max($,JX(X))}catch(G){return JX(X)}}async function n(X,G){try{let $=await R.get(X);if(!$||$.context.code!==200)throw new Error(`failed to query ${X}`);return $.data}catch($){if(!G)throw $;let J=await R.get(`${X}${G?`&key=${G}`:""}`);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}}async function jX({address:X,chain:G,apiKey:$}){if(!X)throw new Error("address is required");try{return(await n(`${o(G)}/dashboards/address/${X}?transaction_details=true`,$))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function OX({address:X,chain:G,apiKey:$}){return(await jX({address:X,chain:G,apiKey:$}))?.address.balance||0}async function LX({chain:X,apiKey:G,txHash:$}){if(!$)throw new Error("txHash is required");try{return(await n(`${o(X)}/raw/transaction/${$}`,G))?.[$]?.raw_transaction||""}catch(J){return console.error(J),""}}async function VX({chain:X,address:G,apiKey:$,offset:J=0,limit:Z=100}){return(await n(`${o(X)}/outputs?q=is_spent(false),recipient(${G})&limit=${Z}&offset=${J}`,$)).filter(({is_spent:W})=>!W).map(({script_hex:W,block_id:L,transaction_hash:q,index:D,value:U,spending_signature_hex:B})=>({hash:q,index:D,value:U,txHex:B,script_hex:W,is_confirmed:L!==-1}))}async function WX({chain:X,address:G,apiKey:$,offset:J=0,limit:Z=100}){if(!G)throw new Error("address is required");try{let j=await VX({chain:X,address:G,apiKey:$,offset:J,limit:Z});if(j.length<=Z)return j;let Q=await WX({chain:X,address:G,apiKey:$,offset:J+Z,limit:Z});return[...j,...Q]}catch(j){return console.error(j),[]}}async function EX({address:X,chain:G,apiKey:$,fetchTxHex:J=!0}){let Z=await WX({chain:G,address:X,apiKey:$}),j=[];for(let{hash:Q,index:W,script_hex:L,value:q}of Z){let D;if(J)D=await LX({txHash:Q,chain:G,apiKey:$});j.push({address:X,hash:Q,index:W,txHex:D,value:q,witnessUtxo:{value:q,script:Buffer.from(L,"hex")}})}return j}function bX(X){let G=r.get("apiKeys").blockchair||"";return ZX(!G,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:($)=>KX({txHash:$,chain:X}),getRawTx:($)=>LX({txHash:$,chain:X,apiKey:G}),getSuggestedTxFee:()=>NX(X),getBalance:($)=>OX({address:$,chain:X,apiKey:G}),getAddressData:($)=>jX({address:$,chain:X,apiKey:G}),scanUTXOs:($)=>EX({...$,chain:X,apiKey:G})}}function FG(X){return X}function Y(X){let G=r.get("apis")[X];if(G)return ZX(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),G;return bX(X)}function I(){return function X(G){switch(G){case z.Bitcoin:return yX.bitcoin;case z.BitcoinCash:return V.bitcoincash.main.toBitcoinJS();case z.Dash:return V.dash.main.toBitcoinJS();case z.Litecoin:return V.litecoin.main.toBitcoinJS();case z.Dogecoin:{let $={private:70615956,public:70617039},J=V.dogecoin.test;return J.versions.bip32=$,V.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}import DX from"bs58check";import BX from"cashaddrjs";var UX;(($)=>{$.Mainnet="mainnet";$.Testnet="testnet"})(UX||={});var v={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function vX(X){try{return g(X),!0}catch(G){return!1}}function MX(X){return g(X)?.network}function E(X){let G=g(X);if(G?.format==="legacy")return X;return RX(G)}function f(X){let G=g(X);return fX(G)}function g(X){try{return SX(X)}catch(G){}try{return AX(X)}catch(G){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function SX(X){try{let G=DX.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 v.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case v.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case v.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case v.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case v.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case v.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 AX(X){if(X.indexOf(":")!==-1)try{return qX(X)}catch(G){}else{let G=["bitcoincash","bchtest","bchreg"];for(let $ of G)try{return qX(`${$}:${X}`)}catch(J){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function qX(X){try{let{hash:G,prefix:$,type:J}=BX.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 RX(X){let G=v.legacy[X.network][X.type],$=Buffer.alloc(1+X.hash.length);return $[0]=G,$.set(X.hash,1),DX.encode($)}function fX(X){let G=X.network==="mainnet"?"bitcoincash":"bchtest",$=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return BX.encode(G,$,J)}import{Chain as K}from"@swapkit/helpers";var d=(X)=>{switch(X){case K.Bitcoin:case K.BitcoinCash:return 550;case K.Dash:case K.Litecoin:return 5500;case K.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},P=({inputs:X,outputs:G,feeRate:$=1,chain:J=K.Bitcoin})=>{let Z=Math.ceil($),j=X[0]&&"address"in X[0]&&X[0].address?m(X[0].address):"P2PKH",Q=X.filter((B)=>F(B)*Z<=B.value),W=i+G.reduce((B,C)=>B+x(C,j),0),L=G.reduce((B,C)=>B+C.value,0),q=W*Z,D=0,U=[];for(let B of Q){let C=F(B),M=Z*C;q+=M,D+=B.value,U.push(B);let H=q+L;if(D<H)continue;let y=D-H,XX=Z*x({address:"",value:0},j);if(y>XX){let GX=XX+q,$X=D-(L+GX);if($X>Math.max(F({})*Z,d(J)))return{inputs:U,outputs:G.concat({value:$X,address:""}),fee:GX}}return{inputs:U,outputs:G,fee:q}}return{fee:Z*b({inputs:X,outputs:G,feeRate:Z})}};import{opcodes as gX,script as xX}from"bitcoinjs-lib";var EG=1000,i=10,mX=10,lX=41,hX=107;function w(X){let G=Buffer.from(X,"utf8");return xX.compile([gX.OP_RETURN,G])}var a;(($)=>{$.P2PKH="P2PKH";$.P2WPKH="P2WPKH"})(a||={});var s={["P2PKH"]:148,["P2WPKH"]:68},l={["P2PKH"]:34,["P2WPKH"]:31},m=(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")},b=({inputs:X,outputs:G,feeRate:$})=>{let J=X[0]&&"address"in X[0]&&X[0].address?m(X[0].address):"P2PKH",Z=X.filter((Q)=>Q.value>=s["type"in Q?Q.type:"P2PKH"]*Math.ceil($)).reduce((Q,W)=>Q+F(W),0),j=G?.reduce((Q,W)=>Q+x(W),0)||l[J];return i+Z+j},F=(X)=>{if("type"in X)return s[X.type];if("address"in X&&X.address)return s[m(X.address)];return lX+hX},x=(X,G)=>{if(X?.script)return mX+X.script.length+(X.script.length>=74?2:1);if(G)return l[G];return l.P2PKH};import{AssetValue as t,Chain as _,DerivationPath as cX,FeeOption as k,NetworkDerivationPath as pX,SwapKitNumber as uX,derivationPathToString as rX,updateDerivationPath as oX}from"@swapkit/helpers";import{Psbt as nX,address as dX,initEccLib as HX,payments as CX}from"bitcoinjs-lib";import iX from"ecpair";import e from"@bitcoinerlab/secp256k1";import{ECPair as aX,HDNode as sX}from"@psf/bitcoincashjs-lib";import{HDKey as tX}from"@scure/bip32";import{mnemonicToSeedSync as zX}from"@scure/bip39";var h=[_.Dash,_.Dogecoin];function eX({inputs:X,outputs:G,chain:$,psbt:J,sender:Z,compiledMemo:j}){for(let Q of X){let W=!!Q.witnessUtxo&&!h.includes($)&&{witnessUtxo:Q.witnessUtxo},L=h.includes($)&&{nonWitnessUtxo:Q.txHex?Buffer.from(Q.txHex,"hex"):void 0};J.addInput({hash:Q.hash,index:Q.index,...W,...L})}for(let Q of G){let W="address"in Q&&Q.address?Q.address:Z,L=Q.script;if(L&&!j)continue;let q=L?{script:j,value:0}:{address:W,value:Q.value};HX(e),J.addOutput(q)}return{psbt:J,inputs:X}}async function YX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Z,fetchTxHex:j=!1}){let Q=X.chain,W=$?await w($):null,L=await FX({assetValue:X,recipient:G,memo:$,sender:Z,fetchTxHex:j}),{inputs:q,outputs:D}=P({...L,feeRate:J,chain:Q});if(!(q&&D))throw new Error("Insufficient Balance for transaction");let U=await I(),B=new nX({network:U(Q)});if(Q===_.Dogecoin)B.setMaximumFeeRate(650000000);let{psbt:C,inputs:M}=await eX({inputs:q,outputs:D,chain:Q,psbt:B,sender:Z,compiledMemo:W});return{psbt:C,utxos:L.inputs,inputs:M}}async function XG(){let X=await I();return function G({address:$,chain:J}){if(J===_.BitcoinCash)return N($);try{return HX(e),dX.toOutputScript($,X(J)),!0}catch(Z){return!1}}}async function GG({chain:X,phrase:G,derivationPath:$}){let J=(await p(X))({phrase:G,derivationPath:$});async function Z(Q){return await Q.signAllInputs(J),Q}async function j(){return(await _X(X))(J)}return{getAddress:j,signTransaction:Z}}async function c({chain:X,...G}){let $="phrase"in G?G.phrase:void 0,J="index"in G?G.index||0:0,Z=rX("derivationPath"in G&&G.derivationPath?G.derivationPath:oX(pX[X],{index:J})),j=$?await GG({chain:X,phrase:$,derivationPath:Z}):("signer"in G)?G.signer:void 0;function Q(){return Promise.resolve(j?.getAddress())}let W=await _X(X),L=await XG(),q=await p(X);return{accumulative:P,calculateTxSize:b,getAddressFromKeys:W,getAddress:Q,validateAddress:(D)=>L({address:D,chain:X}),broadcastTx:(D)=>Y(X).broadcastTx(D),createTransaction:YX,createKeysForPath:q,getFeeRates:()=>u(X),getInputsOutputsFee:IX,transfer:QG(j),getPrivateKeyFromMnemonic:(D)=>{return q(D).toWIF()},getBalance:TX(X),estimateTransactionFee:JG(X),estimateMaxSendableAmount:$G(X)}}async function IX({assetValue:X,feeOptionKey:G=k.Fast,feeRate:$,memo:J,sender:Z,recipient:j}){let Q=X.chain,W=await FX({assetValue:X,sender:Z,memo:J,recipient:j}),L=$?Math.floor($):(await u(Q))[G];return P({...W,feeRate:L,chain:Q})}function $G(X){return async function G({from:$,memo:J,feeRate:Z,feeOptionKey:j=k.Fast,recipients:Q=1}){let W=await Y(X).getAddressData($),L=Z?Math.ceil(Z):(await u(X))[j],q=W?.utxo.map((M)=>({...M,type:"P2PKH",hash:""})).filter((M)=>M.value>Math.max(d(X),F(M)*L));if(!q?.length)return t.from({chain:X});let D=t.from({chain:X,value:q.reduce((M,H)=>M+H.value,0)}),U=typeof Q==="number"?Array.from({length:Q},()=>({address:$,value:0})):Q;if(J){let M=await w(J);U.push({address:$,script:M,value:0})}let C=b({inputs:q,outputs:U,feeRate:L})*L;return D.sub(C)}}function JG(X){return async(G)=>{let $=await IX(G);return t.from({chain:X,value:uX.fromBigInt(BigInt($.fee),8).getValue("string")})}}async function p(X){let G=await I();switch(X){case _.BitcoinCash:return function $({phrase:J,derivationPath:Z=`${cX.BCH}/0`,wif:j}){let Q=G(X);if(j)return aX.fromWIF(j,Q);if(!J)throw new Error("No phrase provided");return sX.fromSeedBuffer(Buffer.from(zX(J)),Q).derivePath(Z).keyPair};case _.Bitcoin:case _.Dogecoin:case _.Litecoin:case _.Dash:return function $({phrase:J,wif:Z,derivationPath:j}){if(!(Z||J))throw new Error("Either phrase or wif must be provided");let Q=iX(e),W=G(X);if(Z)return Q.fromWIF(Z,W);let L=zX(J),q=tX.fromMasterSeed(L,W).derive(j);if(!q.privateKey)throw new Error("Could not get private key from phrase");return Q.fromPrivateKey(Buffer.from(q.privateKey),{network:W})};default:throw new Error(`Chain ${X} is not supported`)}}async function _X(X){let G=await I();return function $(J){if(!J)throw new Error("Keys must be provided");let Z=h.includes(X)?CX.p2pkh:CX.p2wpkh,{address:j}=Z({pubkey:J.publicKey,network:G(X)});if(!j)throw new Error("Address not defined");return j}}function QG(X){return async function G({memo:$,recipient:J,feeOptionKey:Z,feeRate:j,assetValue:Q}){let W=await X?.getAddress(),L=Q.chain;if(!(X&&W))throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");let q=j||(await u(L))[Z||k.Fast],{psbt:D}=await YX({recipient:J,feeRate:q,sender:W,assetValue:Q,memo:$}),U=await X.signTransaction(D);return U.finalizeAllInputs(),Y(L).broadcastTx(U.extractTransaction().toHex())}}async function u(X){let G=await Y(X).getSuggestedTxFee();return{[k.Average]:G,[k.Fast]:G*1.5,[k.Fastest]:G*2}}async function FX({assetValue:X,recipient:G,memo:$,sender:J,fetchTxHex:Z=!1}){let j=X.chain,Q=Z||h.includes(j);return{inputs:await Y(j).scanUTXOs({address:J,fetchTxHex:Q}),outputs:[{address:G,value:Number(X.bigIntValue)},...$?[{address:"",script:await w($),value:0}]:[]]}}var T=WG.BitcoinCash;function S(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function N(X){let G=S(X);return vX(G)&&MX(G)==="mainnet"}function O(X){return S(f(X))}async function MG(X){async function G({builder:J,utxos:Z}){return Z.forEach((j,Q)=>{J.sign(Q,X,void 0,65,j.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(O(J))},signTransaction:G}}async function PX(X){let G="phrase"in X?X.phrase:void 0,$="index"in X?X.index||0:0,J=BG("derivationPath"in X&&X.derivationPath?X.derivationPath:UG(DG[T],{index:$})),Z=(await p(T))({phrase:G,derivationPath:J}),j=Z?await MG(Z):("signer"in X)?X.signer:void 0;function Q(){return Promise.resolve(j?.getAddress())}let{getBalance:W,getFeeRates:L,broadcastTx:q,...D}=await c({chain:T});function U(B,C=!0){return W(S(f(B)))}return{...D,getAddress:Q,broadcastTx:q,createTransaction:wX,buildTx:zG,getAddressFromKeys:TG,getBalance:U,getFeeRates:L,stripPrefix:S,stripToCashAddress:O,validateAddress:N,transfer:CG({getFeeRates:L,broadcastTx:q,signer:j})}}async function wX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Z}){if(!N(G))throw new Error("Invalid address");let j=await Y(T).scanUTXOs({address:O(Z),fetchTxHex:!0}),Q=$?await w($):null,W=[];W.push({address:G,value:X.getBaseValue("number")});let{inputs:L,outputs:q}=P({inputs:j,outputs:W,feeRate:J,chain:T});if(!(L&&q))throw new Error("Balance insufficient for transaction");let D=await I(),U=new jG(D(T));await Promise.all(L.map(async(B)=>{let C=await Y(T).getRawTx(B.hash);U.addInput(ZG.fromBuffer(Buffer.from(C,"hex")),B.index)}));for(let B of q){let C="address"in B&&B.address?B.address:E(Z),M=await I(),H=LG.toOutputScript(E(C),M(T));U.addOutput(H,B.value)}if(Q)U.addOutput(Q,0);return{builder:U,utxos:L}}function CG({broadcastTx:X,getFeeRates:G,signer:$}){return async function J({recipient:Z,assetValue:j,feeOptionKey:Q=qG.Fast,...W}){let L=await $?.getAddress();if(!($&&L))throw new Error("Signer must provider address");if(!Z)throw new Error("Recipient address must be provided");let q=W.feeRate||(await G())[Q],{builder:D,utxos:U}=await wX({...W,assetValue:j,feeRate:q,recipient:Z,sender:L}),C=(await $.signTransaction({builder:D,utxos:U})).toHex();return X(C)}}async function zG({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Z}){let j=f(G);if(!N(j))throw new Error("Invalid address");let Q=await Y(T).scanUTXOs({address:O(Z),fetchTxHex:!0}),W=Number(J.toFixed(0)),L=$?await w($):null,q=[];if(q.push({address:E(G),value:X.getBaseValue("number")}),L)q.push({script:L,value:0});let{inputs:D,outputs:U}=P({inputs:Q,outputs:q,feeRate:W,chain:T});if(!(D&&U))throw new Error("Balance insufficient for transaction");let B=await I(),C=new vG({network:B(T)});for(let{hash:M,index:H,witnessUtxo:y}of D)C.addInput({hash:M,index:H,witnessUtxo:y});for(let M of U){let H="address"in M&&M.address?M.address:E(Z),y=M.script?L?{script:L,value:0}:void 0:{address:H,value:M.value};if(y)C.addOutput(y)}return{psbt:C,utxos:Q,inputs:D}}function TG(X){let G=X.getAddress(0);return O(G)}async function Q$(X,G){switch(X){case A.BitcoinCash:return await PX(G);case A.Bitcoin:case A.Dogecoin:case A.Litecoin:case A.Dash:return await c({chain:X,...G});default:throw new Error(`Chain ${X} is not supported`)}}export{E as toLegacyAddress,f as toCashAddress,O as stripToCashAddress,S as stripPrefix,h as nonSegwitChains,vX as isValidAddress,Q$ as getUtxoToolbox,I as getUtxoNetwork,Y as getUtxoApi,XG as getUTXOAddressValidator,m as getScriptTypeForAddress,x as getOutputSize,F as getInputSize,d as getDustThreshold,p as getCreateKeysForPath,MX as detectAddressNetwork,c as createUTXOToolbox,FG as createCustomUtxoApi,PX as createBCHToolbox,w as compileMemo,b as calculateTxSize,N as bchValidateAddress,_X as addressFromKeysGetter,P as accumulative,UX as UtxoNetwork,a as UTXOScriptType,i as TX_OVERHEAD,l as OutputSizes,mX as OP_RETURN_OVERHEAD,EG as MIN_TX_FEE,s as InputSizes};
|
|
1
|
+
import{a as QX,b as TX}from"../chunk-0h4xdrwz.js";import"../chunk-38ztynv0.js";import{Chain as A}from"@swapkit/helpers";import{Transaction as ZG,TransactionBuilder as jG,address as LG}from"@psf/bitcoincashjs-lib";import{Chain as WG,FeeOption as qG,NetworkDerivationPath as DG,derivationPathToString as BG,updateDerivationPath as UG}from"@swapkit/helpers";import{Psbt as vG}from"bitcoinjs-lib";import{Chain as z,RequestClient as R,SKConfig as r,warnOnce as ZX}from"@swapkit/helpers";import{networks as yX}from"bitcoinjs-lib";import V from"coininfo";async function KX({chain:X,txHash:G}){let $=r.get("rpcUrls")[X],J=JSON.stringify({jsonrpc:"2.0",method:"sendrawtransaction",params:[G],id:QX()}),Z=await R.post($,{headers:{"Content-Type":"application/json"},body:J});if(Z.error)throw new Error(`failed to broadcast a transaction: ${Z.error?.message}`);if(Z.result.includes('"code":-26'))throw new Error("Invalid transaction: the transaction amount was too low");return Z.result}function o(X){return`https://api.blockchair.com/${kX(X)}`}function JX(X){switch(X){case z.Bitcoin:return 5;case z.Dogecoin:return 1e4;case z.Litecoin:return 1;default:return 2}}function kX(X){switch(X){case z.BitcoinCash:return"bitcoin-cash";case z.Litecoin:return"litecoin";case z.Dash:return"dash";case z.Dogecoin:return"dogecoin";case z.Polkadot:return"polkadot";default:return"bitcoin"}}async function NX(X){try{let{feePerKb:G}=await R.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),$=G/1000;return Math.max($,JX(X))}catch(G){return JX(X)}}async function n(X,G){try{let $=await R.get(X);if(!$||$.context.code!==200)throw new Error(`failed to query ${X}`);return $.data}catch($){if(!G)throw $;let J=await R.get(`${X}${G?`&key=${G}`:""}`);if(!J||J.context.code!==200)throw new Error(`failed to query ${X}`);return J.data}}async function jX({address:X,chain:G,apiKey:$}){if(!X)throw new Error("address is required");try{return(await n(`${o(G)}/dashboards/address/${X}?transaction_details=true`,$))[X]}catch(J){return{utxo:[],address:{balance:0,transaction_count:0}}}}async function OX({address:X,chain:G,apiKey:$}){return(await jX({address:X,chain:G,apiKey:$}))?.address.balance||0}async function LX({chain:X,apiKey:G,txHash:$}){if(!$)throw new Error("txHash is required");try{return(await n(`${o(X)}/raw/transaction/${$}`,G))?.[$]?.raw_transaction||""}catch(J){return console.error(J),""}}async function VX({chain:X,address:G,apiKey:$,offset:J=0,limit:Z=100}){return(await n(`${o(X)}/outputs?q=is_spent(false),recipient(${G})&limit=${Z}&offset=${J}`,$)).filter(({is_spent:W})=>!W).map(({script_hex:W,block_id:L,transaction_hash:q,index:D,value:U,spending_signature_hex:B})=>({hash:q,index:D,value:U,txHex:B,script_hex:W,is_confirmed:L!==-1}))}async function WX({chain:X,address:G,apiKey:$,offset:J=0,limit:Z=100}){if(!G)throw new Error("address is required");try{let j=await VX({chain:X,address:G,apiKey:$,offset:J,limit:Z});if(j.length<=Z)return j;let Q=await WX({chain:X,address:G,apiKey:$,offset:J+Z,limit:Z});return[...j,...Q]}catch(j){return console.error(j),[]}}async function EX({address:X,chain:G,apiKey:$,fetchTxHex:J=!0}){let Z=await WX({chain:G,address:X,apiKey:$}),j=[];for(let{hash:Q,index:W,script_hex:L,value:q}of Z){let D;if(J)D=await LX({txHash:Q,chain:G,apiKey:$});j.push({address:X,hash:Q,index:W,txHex:D,value:q,witnessUtxo:{value:q,script:Buffer.from(L,"hex")}})}return j}function bX(X){let G=r.get("apiKeys").blockchair||"";return ZX(!G,"No Blockchair API key found. Functionality will be limited."),{broadcastTx:($)=>KX({txHash:$,chain:X}),getRawTx:($)=>LX({txHash:$,chain:X,apiKey:G}),getSuggestedTxFee:()=>NX(X),getBalance:($)=>OX({address:$,chain:X,apiKey:G}),getAddressData:($)=>jX({address:$,chain:X,apiKey:G}),scanUTXOs:($)=>EX({...$,chain:X,apiKey:G})}}function FG(X){return X}function Y(X){let G=r.get("apis")[X];if(G)return ZX(!0,"Using custom UTXO API. Be sure to implement all methods to avoid issues."),G;return bX(X)}function I(){return function X(G){switch(G){case z.Bitcoin:return yX.bitcoin;case z.BitcoinCash:return V.bitcoincash.main.toBitcoinJS();case z.Dash:return V.dash.main.toBitcoinJS();case z.Litecoin:return V.litecoin.main.toBitcoinJS();case z.Dogecoin:{let $={private:70615956,public:70617039},J=V.dogecoin.test;return J.versions.bip32=$,V.dogecoin.main.toBitcoinJS()}default:throw new Error("Invalid chain")}}}import DX from"bs58check";import BX from"cashaddrjs";var UX;(($)=>{$.Mainnet="mainnet";$.Testnet="testnet"})(UX||={});var v={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function vX(X){try{return g(X),!0}catch(G){return!1}}function MX(X){return g(X)?.network}function E(X){let G=g(X);if(G?.format==="legacy")return X;return RX(G)}function f(X){let G=g(X);return fX(G)}function g(X){try{return SX(X)}catch(G){}try{return AX(X)}catch(G){}throw new Error("Received an invalid Bitcoin Cash address as input.")}function SX(X){try{let G=DX.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 v.legacy.mainnet.p2pkh:return{hash:J,format:"legacy",network:"mainnet",type:"p2pkh"};case v.legacy.mainnet.p2sh:return{hash:J,format:"legacy",network:"mainnet",type:"p2sh"};case v.legacy.testnet.p2pkh:return{hash:J,format:"legacy",network:"testnet",type:"p2pkh"};case v.legacy.testnet.p2sh:return{hash:J,format:"legacy",network:"testnet",type:"p2sh"};case v.bitpay.mainnet.p2pkh:return{hash:J,format:"bitpay",network:"mainnet",type:"p2pkh"};case v.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 AX(X){if(X.indexOf(":")!==-1)try{return qX(X)}catch(G){}else{let G=["bitcoincash","bchtest","bchreg"];for(let $ of G)try{return qX(`${$}:${X}`)}catch(J){}}throw new Error("Received an invalid Bitcoin Cash address as input.")}function qX(X){try{let{hash:G,prefix:$,type:J}=BX.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 RX(X){let G=v.legacy[X.network][X.type],$=Buffer.alloc(1+X.hash.length);return $[0]=G,$.set(X.hash,1),DX.encode($)}function fX(X){let G=X.network==="mainnet"?"bitcoincash":"bchtest",$=X.type==="p2pkh"?"P2PKH":"P2SH",J=new Uint8Array(X.hash);return BX.encode(G,$,J)}import{Chain as K}from"@swapkit/helpers";var d=(X)=>{switch(X){case K.Bitcoin:case K.BitcoinCash:return 550;case K.Dash:case K.Litecoin:return 5500;case K.Dogecoin:return 1e5;default:throw new Error("Invalid Chain")}},P=({inputs:X,outputs:G,feeRate:$=1,chain:J=K.Bitcoin})=>{let Z=Math.ceil($),j=X[0]&&"address"in X[0]&&X[0].address?m(X[0].address):"P2PKH",Q=X.filter((B)=>F(B)*Z<=B.value),W=i+G.reduce((B,C)=>B+x(C,j),0),L=G.reduce((B,C)=>B+C.value,0),q=W*Z,D=0,U=[];for(let B of Q){let C=F(B),M=Z*C;q+=M,D+=B.value,U.push(B);let H=q+L;if(D<H)continue;let y=D-H,XX=Z*x({address:"",value:0},j);if(y>XX){let GX=XX+q,$X=D-(L+GX);if($X>Math.max(F({})*Z,d(J)))return{inputs:U,outputs:G.concat({value:$X,address:""}),fee:GX}}return{inputs:U,outputs:G,fee:q}}return{fee:Z*b({inputs:X,outputs:G,feeRate:Z})}};import{opcodes as gX,script as xX}from"bitcoinjs-lib";var EG=1000,i=10,mX=10,lX=41,hX=107;function w(X){let G=Buffer.from(X,"utf8");return xX.compile([gX.OP_RETURN,G])}var a;(($)=>{$.P2PKH="P2PKH";$.P2WPKH="P2WPKH"})(a||={});var s={["P2PKH"]:148,["P2WPKH"]:68},l={["P2PKH"]:34,["P2WPKH"]:31},m=(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")},b=({inputs:X,outputs:G,feeRate:$})=>{let J=X[0]&&"address"in X[0]&&X[0].address?m(X[0].address):"P2PKH",Z=X.filter((Q)=>Q.value>=s["type"in Q?Q.type:"P2PKH"]*Math.ceil($)).reduce((Q,W)=>Q+F(W),0),j=G?.reduce((Q,W)=>Q+x(W),0)||l[J];return i+Z+j},F=(X)=>{if("type"in X)return s[X.type];if("address"in X&&X.address)return s[m(X.address)];return lX+hX},x=(X,G)=>{if(X?.script)return mX+X.script.length+(X.script.length>=74?2:1);if(G)return l[G];return l.P2PKH};import{AssetValue as t,Chain as _,DerivationPath as cX,FeeOption as k,NetworkDerivationPath as pX,SwapKitNumber as uX,derivationPathToString as rX,updateDerivationPath as oX}from"@swapkit/helpers";import{Psbt as nX,address as dX,initEccLib as HX,payments as CX}from"bitcoinjs-lib";import iX from"ecpair";import e from"@bitcoinerlab/secp256k1";import{ECPair as aX,HDNode as sX}from"@psf/bitcoincashjs-lib";import{HDKey as tX}from"@scure/bip32";import{mnemonicToSeedSync as zX}from"@scure/bip39";var h=[_.Dash,_.Dogecoin];function eX({inputs:X,outputs:G,chain:$,psbt:J,sender:Z,compiledMemo:j}){for(let Q of X){let W=!!Q.witnessUtxo&&!h.includes($)&&{witnessUtxo:Q.witnessUtxo},L=h.includes($)&&{nonWitnessUtxo:Q.txHex?Buffer.from(Q.txHex,"hex"):void 0};J.addInput({hash:Q.hash,index:Q.index,...W,...L})}for(let Q of G){let W="address"in Q&&Q.address?Q.address:Z,L=Q.script;if(L&&!j)continue;let q=L?{script:j,value:0}:{address:W,value:Q.value};HX(e),J.addOutput(q)}return{psbt:J,inputs:X}}async function YX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Z,fetchTxHex:j=!1}){let Q=X.chain,W=$?await w($):null,L=await FX({assetValue:X,recipient:G,memo:$,sender:Z,fetchTxHex:j}),{inputs:q,outputs:D}=P({...L,feeRate:J,chain:Q});if(!(q&&D))throw new Error("Insufficient Balance for transaction");let U=await I(),B=new nX({network:U(Q)});if(Q===_.Dogecoin)B.setMaximumFeeRate(650000000);let{psbt:C,inputs:M}=await eX({inputs:q,outputs:D,chain:Q,psbt:B,sender:Z,compiledMemo:W});return{psbt:C,utxos:L.inputs,inputs:M}}async function XG(){let X=await I();return function G({address:$,chain:J}){if(J===_.BitcoinCash)return N($);try{return HX(e),dX.toOutputScript($,X(J)),!0}catch(Z){return!1}}}async function GG({chain:X,phrase:G,derivationPath:$}){let J=(await p(X))({phrase:G,derivationPath:$});async function Z(Q){return await Q.signAllInputs(J),Q}async function j(){return(await _X(X))(J)}return{getAddress:j,signTransaction:Z}}async function c({chain:X,...G}){let $="phrase"in G?G.phrase:void 0,J="index"in G?G.index||0:0,Z=rX("derivationPath"in G&&G.derivationPath?G.derivationPath:oX(pX[X],{index:J})),j=$?await GG({chain:X,phrase:$,derivationPath:Z}):("signer"in G)?G.signer:void 0;function Q(){return Promise.resolve(j?.getAddress())}let W=await _X(X),L=await XG(),q=await p(X);return{accumulative:P,calculateTxSize:b,getAddressFromKeys:W,getAddress:Q,validateAddress:(D)=>L({address:D,chain:X}),broadcastTx:(D)=>Y(X).broadcastTx(D),createTransaction:YX,createKeysForPath:q,getFeeRates:()=>u(X),getInputsOutputsFee:IX,transfer:QG(j),getPrivateKeyFromMnemonic:(D)=>{return q(D).toWIF()},getBalance:TX(X),estimateTransactionFee:JG(X),estimateMaxSendableAmount:$G(X)}}async function IX({assetValue:X,feeOptionKey:G=k.Fast,feeRate:$,memo:J,sender:Z,recipient:j}){let Q=X.chain,W=await FX({assetValue:X,sender:Z,memo:J,recipient:j}),L=$?Math.floor($):(await u(Q))[G];return P({...W,feeRate:L,chain:Q})}function $G(X){return async function G({from:$,memo:J,feeRate:Z,feeOptionKey:j=k.Fast,recipients:Q=1}){let W=await Y(X).getAddressData($),L=Z?Math.ceil(Z):(await u(X))[j],q=W?.utxo.map((M)=>({...M,type:"P2PKH",hash:""})).filter((M)=>M.value>Math.max(d(X),F(M)*L));if(!q?.length)return t.from({chain:X});let D=t.from({chain:X,value:q.reduce((M,H)=>M+H.value,0)}),U=typeof Q==="number"?Array.from({length:Q},()=>({address:$,value:0})):Q;if(J){let M=await w(J);U.push({address:$,script:M,value:0})}let C=b({inputs:q,outputs:U,feeRate:L})*L;return D.sub(C)}}function JG(X){return async(G)=>{let $=await IX(G);return t.from({chain:X,value:uX.fromBigInt(BigInt($.fee),8).getValue("string")})}}async function p(X){let G=await I();switch(X){case _.BitcoinCash:return function $({phrase:J,derivationPath:Z=`${cX.BCH}/0`,wif:j}){let Q=G(X);if(j)return aX.fromWIF(j,Q);if(!J)throw new Error("No phrase provided");return sX.fromSeedBuffer(Buffer.from(zX(J)),Q).derivePath(Z).keyPair};case _.Bitcoin:case _.Dogecoin:case _.Litecoin:case _.Dash:return function $({phrase:J,wif:Z,derivationPath:j}){if(!(Z||J))throw new Error("Either phrase or wif must be provided");let Q=iX(e),W=G(X);if(Z)return Q.fromWIF(Z,W);let L=zX(J),q=tX.fromMasterSeed(L,W).derive(j);if(!q.privateKey)throw new Error("Could not get private key from phrase");return Q.fromPrivateKey(Buffer.from(q.privateKey),{network:W})};default:throw new Error(`Chain ${X} is not supported`)}}async function _X(X){let G=await I();return function $(J){if(!J)throw new Error("Keys must be provided");let Z=h.includes(X)?CX.p2pkh:CX.p2wpkh,{address:j}=Z({pubkey:J.publicKey,network:G(X)});if(!j)throw new Error("Address not defined");return j}}function QG(X){return async function G({memo:$,recipient:J,feeOptionKey:Z,feeRate:j,assetValue:Q}){let W=await X?.getAddress(),L=Q.chain;if(!(X&&W))throw new Error("From address must be provided");if(!J)throw new Error("Recipient address must be provided");let q=j||(await u(L))[Z||k.Fast],{psbt:D}=await YX({recipient:J,feeRate:q,sender:W,assetValue:Q,memo:$}),U=await X.signTransaction(D);return U.finalizeAllInputs(),Y(L).broadcastTx(U.extractTransaction().toHex())}}async function u(X){let G=await Y(X).getSuggestedTxFee();return{[k.Average]:G,[k.Fast]:G*1.5,[k.Fastest]:G*2}}async function FX({assetValue:X,recipient:G,memo:$,sender:J,fetchTxHex:Z=!1}){let j=X.chain,Q=Z||h.includes(j);return{inputs:await Y(j).scanUTXOs({address:J,fetchTxHex:Q}),outputs:[{address:G,value:Number(X.bigIntValue)},...$?[{address:"",script:await w($),value:0}]:[]]}}var T=WG.BitcoinCash;function S(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function N(X){let G=S(X);return vX(G)&&MX(G)==="mainnet"}function O(X){return S(f(X))}async function MG(X){async function G({builder:J,utxos:Z}){return Z.forEach((j,Q)=>{J.sign(Q,X,void 0,65,j.witnessUtxo?.value)}),J.build()}return{getAddress:()=>{let J=X.getAddress(0);return Promise.resolve(O(J))},signTransaction:G}}async function PX(X){let G="phrase"in X?X.phrase:void 0,$="index"in X?X.index||0:0,J=BG("derivationPath"in X&&X.derivationPath?X.derivationPath:UG(DG[T],{index:$})),Z=(await p(T))({phrase:G,derivationPath:J}),j=Z?await MG(Z):("signer"in X)?X.signer:void 0;function Q(){return Promise.resolve(j?.getAddress())}let{getBalance:W,getFeeRates:L,broadcastTx:q,...D}=await c({chain:T});function U(B,C=!0){return W(S(f(B)))}return{...D,getAddress:Q,broadcastTx:q,createTransaction:wX,buildTx:zG,getAddressFromKeys:TG,getBalance:U,getFeeRates:L,stripPrefix:S,stripToCashAddress:O,validateAddress:N,transfer:CG({getFeeRates:L,broadcastTx:q,signer:j})}}async function wX({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Z}){if(!N(G))throw new Error("Invalid address");let j=await Y(T).scanUTXOs({address:O(Z),fetchTxHex:!0}),Q=$?await w($):null,W=[];W.push({address:G,value:X.getBaseValue("number")});let{inputs:L,outputs:q}=P({inputs:j,outputs:W,feeRate:J,chain:T});if(!(L&&q))throw new Error("Balance insufficient for transaction");let D=await I(),U=new jG(D(T));await Promise.all(L.map(async(B)=>{let C=await Y(T).getRawTx(B.hash);U.addInput(ZG.fromBuffer(Buffer.from(C,"hex")),B.index)}));for(let B of q){let C="address"in B&&B.address?B.address:E(Z),M=await I(),H=LG.toOutputScript(E(C),M(T));U.addOutput(H,B.value)}if(Q)U.addOutput(Q,0);return{builder:U,utxos:L}}function CG({broadcastTx:X,getFeeRates:G,signer:$}){return async function J({recipient:Z,assetValue:j,feeOptionKey:Q=qG.Fast,...W}){let L=await $?.getAddress();if(!($&&L))throw new Error("Signer must provider address");if(!Z)throw new Error("Recipient address must be provided");let q=W.feeRate||(await G())[Q],{builder:D,utxos:U}=await wX({...W,assetValue:j,feeRate:q,recipient:Z,sender:L}),C=(await $.signTransaction({builder:D,utxos:U})).toHex();return X(C)}}async function zG({assetValue:X,recipient:G,memo:$,feeRate:J,sender:Z}){let j=f(G);if(!N(j))throw new Error("Invalid address");let Q=await Y(T).scanUTXOs({address:O(Z),fetchTxHex:!0}),W=Number(J.toFixed(0)),L=$?await w($):null,q=[];if(q.push({address:E(G),value:X.getBaseValue("number")}),L)q.push({script:L,value:0});let{inputs:D,outputs:U}=P({inputs:Q,outputs:q,feeRate:W,chain:T});if(!(D&&U))throw new Error("Balance insufficient for transaction");let B=await I(),C=new vG({network:B(T)});for(let{hash:M,index:H,witnessUtxo:y}of D)C.addInput({hash:M,index:H,witnessUtxo:y});for(let M of U){let H="address"in M&&M.address?M.address:E(Z),y=M.script?L?{script:L,value:0}:void 0:{address:H,value:M.value};if(y)C.addOutput(y)}return{psbt:C,utxos:Q,inputs:D}}function TG(X){let G=X.getAddress(0);return O(G)}async function Q$(X,G){switch(X){case A.BitcoinCash:return await PX(G);case A.Bitcoin:case A.Dogecoin:case A.Litecoin:case A.Dash:return await c({chain:X,...G});default:throw new Error(`Chain ${X} is not supported`)}}export{E as toLegacyAddress,f as toCashAddress,O as stripToCashAddress,S as stripPrefix,h as nonSegwitChains,vX as isValidAddress,Q$ as getUtxoToolbox,I as getUtxoNetwork,Y as getUtxoApi,XG as getUTXOAddressValidator,m as getScriptTypeForAddress,x as getOutputSize,F as getInputSize,d as getDustThreshold,p as getCreateKeysForPath,MX as detectAddressNetwork,c as createUTXOToolbox,FG as createCustomUtxoApi,PX as createBCHToolbox,w as compileMemo,b as calculateTxSize,N as bchValidateAddress,_X as addressFromKeysGetter,P as accumulative,UX as UtxoNetwork,a as UTXOScriptType,i as TX_OVERHEAD,l as OutputSizes,mX as OP_RETURN_OVERHEAD,EG as MIN_TX_FEE,s as InputSizes};
|
|
2
2
|
|
|
3
3
|
//# debugId=BCE92A25C905BB6A64756E2164756E21
|
package/package.json
CHANGED
|
@@ -11,19 +11,19 @@
|
|
|
11
11
|
"@cosmjs/proto-signing": "0.33.1",
|
|
12
12
|
"@cosmjs/stargate": "0.33.1",
|
|
13
13
|
"@polkadot/api": "15.9.2",
|
|
14
|
-
"@polkadot/keyring": "13.
|
|
15
|
-
"@polkadot/util": "13.
|
|
16
|
-
"@polkadot/util-crypto": "13.
|
|
14
|
+
"@polkadot/keyring": "13.5.1",
|
|
15
|
+
"@polkadot/util": "13.5.1",
|
|
16
|
+
"@polkadot/util-crypto": "13.5.1",
|
|
17
17
|
"@psf/bitcoincashjs-lib": "4.0.3",
|
|
18
18
|
"@radixdlt/babylon-gateway-api-sdk": "1.10.1",
|
|
19
19
|
"@radixdlt/radix-dapp-toolkit": "2.2.1",
|
|
20
|
-
"@scure/base": "1.2.
|
|
21
|
-
"@scure/bip32": "1.
|
|
22
|
-
"@scure/bip39": "1.
|
|
20
|
+
"@scure/base": "1.2.6",
|
|
21
|
+
"@scure/bip32": "1.7.0",
|
|
22
|
+
"@scure/bip39": "1.6.0",
|
|
23
23
|
"@solana/spl-memo": "0.2.5",
|
|
24
24
|
"@solana/spl-token": "0.4.13",
|
|
25
25
|
"@solana/web3.js": "1.98.2",
|
|
26
|
-
"@swapkit/helpers": "3.0.0-beta.
|
|
26
|
+
"@swapkit/helpers": "3.0.0-beta.12",
|
|
27
27
|
"base64-js": "1.5.1",
|
|
28
28
|
"bitcoinjs-lib": "6.1.7",
|
|
29
29
|
"bs58check": "4.0.0",
|
|
@@ -31,20 +31,20 @@
|
|
|
31
31
|
"coininfo": "5.2.1",
|
|
32
32
|
"cosmjs-types": "0.9.0",
|
|
33
33
|
"ecpair": "2.1.0",
|
|
34
|
-
"ethers": "6.
|
|
35
|
-
"micro-key-producer": "0.7.
|
|
36
|
-
"protobufjs": "7.
|
|
37
|
-
"ts-pattern": "5.7.
|
|
38
|
-
"xrpl": "4.
|
|
34
|
+
"ethers": "6.14.3",
|
|
35
|
+
"micro-key-producer": "0.7.6",
|
|
36
|
+
"protobufjs": "7.5.3",
|
|
37
|
+
"ts-pattern": "5.7.1",
|
|
38
|
+
"xrpl": "4.3.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@nomicfoundation/hardhat-ethers": "3.0.
|
|
41
|
+
"@nomicfoundation/hardhat-ethers": "3.0.9",
|
|
42
42
|
"@nomicfoundation/hardhat-toolbox": "5.0.0",
|
|
43
43
|
"@polkadot/types": "15.9.2",
|
|
44
|
-
"@types/bn.js": "5.
|
|
44
|
+
"@types/bn.js": "5.2.0",
|
|
45
45
|
"@types/crypto-js": "4.2.2",
|
|
46
46
|
"@types/elliptic": "6.4.18",
|
|
47
|
-
"hardhat": "2.
|
|
47
|
+
"hardhat": "2.24.2"
|
|
48
48
|
},
|
|
49
49
|
"exports": {
|
|
50
50
|
".": {
|
|
@@ -105,5 +105,5 @@
|
|
|
105
105
|
"type-check:go": "tsgo"
|
|
106
106
|
},
|
|
107
107
|
"type": "module",
|
|
108
|
-
"version": "1.0.0-beta.
|
|
108
|
+
"version": "1.0.0-beta.17"
|
|
109
109
|
}
|
|
@@ -35,7 +35,7 @@ beforeEach(async () => {
|
|
|
35
35
|
},
|
|
36
36
|
});
|
|
37
37
|
context.provider = provider;
|
|
38
|
-
context.toolbox = await getEvmToolbox(Chain.Ethereum, { provider, signer });
|
|
38
|
+
context.toolbox = await getEvmToolbox(Chain.Ethereum, { provider, signer: signer as any });
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
afterEach(async () => {
|
package/src/evm/toolbox/op.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { BaseDecimal, Chain, ChainId, ChainToExplorerUrl, SKConfig } from "@swapkit/helpers";
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
Authorization,
|
|
4
|
+
BrowserProvider,
|
|
5
|
+
JsonRpcProvider,
|
|
6
|
+
Provider,
|
|
7
|
+
TransactionRequest,
|
|
8
|
+
} from "ethers";
|
|
3
9
|
import { Contract, HDNodeWallet } from "ethers";
|
|
4
10
|
|
|
5
11
|
import { P } from "ts-pattern";
|
|
@@ -33,13 +39,13 @@ function serializeTx<P extends JsonRpcProvider | BrowserProvider>(provider: P) {
|
|
|
33
39
|
const { Transaction } = await import("ethers");
|
|
34
40
|
|
|
35
41
|
if (!to) throw new Error("Missing to address");
|
|
36
|
-
|
|
42
|
+
|
|
43
|
+
return Transaction.from({
|
|
37
44
|
...tx,
|
|
45
|
+
authorizationList: tx.authorizationList as Authorization[],
|
|
38
46
|
to: to as string,
|
|
39
47
|
nonce: nonce ? nonce : from ? await provider.getTransactionCount(from) : 0,
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
return Transaction.from(txParams).serialized;
|
|
48
|
+
}).serialized;
|
|
43
49
|
};
|
|
44
50
|
}
|
|
45
51
|
|
package/src/index.ts
CHANGED
|
@@ -111,6 +111,10 @@ export async function getFeeEstimator<T extends keyof CreateTransactionParams>(c
|
|
|
111
111
|
);
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
+
case Chain.Ripple: {
|
|
115
|
+
return (toolbox as Awaited<ReturnType<typeof getRippleToolbox>>).estimateTransactionFee();
|
|
116
|
+
}
|
|
117
|
+
|
|
114
118
|
default:
|
|
115
119
|
return AssetValue.from({ chain });
|
|
116
120
|
}
|
|
@@ -151,6 +155,7 @@ type CreateTransactionParams = { [key in EVMChain]: EVMCreateTransactionParams }
|
|
|
151
155
|
[key in SubstrateChain]: GenericCreateTransactionParams;
|
|
152
156
|
} & {
|
|
153
157
|
[Chain.Radix]: GenericCreateTransactionParams;
|
|
158
|
+
[Chain.Ripple]: GenericCreateTransactionParams;
|
|
154
159
|
[Chain.Solana]: SolanaCreateTransactionParams;
|
|
155
160
|
};
|
|
156
161
|
|