@swapkit/toolboxes 0.0.0-rc-20260727094911 → 0.0.0-rc-20260728115044

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/CHANGELOG.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # @swapkit/toolboxes
2
2
 
3
- ## 0.0.0-rc-20260727094911
3
+ ## 0.0.0-rc-20260728115044
4
4
 
5
5
  ### Major Changes
6
6
 
7
- - [#249](https://github.com/swapkit/sdk/pull/249) [`622632d`](https://github.com/swapkit/sdk/commit/622632dd59bf1ff0063d1acb85b6a6de135c1361) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Replace `@cosmjs/{amino,crypto,proto-signing,stargate}@0.39.0` with native `@swapkit/cosmos-signer` package. The new signer is ESM-native (no CJS↔ESM-only-noble breakage), uses only `@noble/curves`, `@noble/hashes`, `@scure/{base,bip32,bip39}` + `cosmjs-types` for proto encoders. **No `@cosmjs/*` runtime dependency.**
7
+ - [#249](https://github.com/swapkit/sdk/pull/249) [`41505dc`](https://github.com/swapkit/sdk/commit/41505dc0f4f77dd301cfced063013efb6307b9bb) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Replace `@cosmjs/{amino,crypto,proto-signing,stargate}@0.39.0` with native `@swapkit/cosmos-signer` package. The new signer is ESM-native (no CJS↔ESM-only-noble breakage), uses only `@noble/curves`, `@noble/hashes`, `@scure/{base,bip32,bip39}` + `cosmjs-types` for proto encoders. **No `@cosmjs/*` runtime dependency.**
8
8
 
9
9
  **Public API preserved**: all `@swapkit/toolboxes/cosmos` exports keep their signatures (`getCosmosToolbox`, `getThorchainToolbox`, `signTransaction`, `signAndBroadcastTransaction`, `transfer`, `signMultisigTx`, `broadcastMultisigTx`, etc.). Wallet adapter interfaces (`OfflineDirectSigner` / `OfflineAminoSigner`) keep the same shape so Keplr/Leap/Ledger integrations compile unchanged.
10
10
 
@@ -12,54 +12,13 @@
12
12
 
13
13
  **New package**: `@swapkit/cosmos-signer@0.1.0` exposes HD wallet derivation, bech32 address helpers, direct/amino signing (byte-equal vs cosmjs), proto tx encoding (TxBody/AuthInfo/TxRaw/MsgSend), multi-sig (byte-exact fixture from cosmjs@0.39 over a known THORChain 2-of-3 set), Tendermint JSON-RPC client with optional URL-array failover, and typed queries (`getAccount`, `getBalances`, `broadcastTx`).
14
14
 
15
- - [#251](https://github.com/swapkit/sdk/pull/251) [`a3718bb`](https://github.com/swapkit/sdk/commit/a3718bb81da091a002b5b6905588ac05bd1582f8) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Migrate Solana stack from `@solana/web3.js@1` + `@solana/spl-*` to the new `@solana/kit` modular SDK (anza-xyz/kit) + `@solana-program/{system,token,memo}`. **`@solana/web3.js` is removed entirely.**
15
+ - [#344](https://github.com/swapkit/sdk/pull/344) [`7f99d74`](https://github.com/swapkit/sdk/commit/7f99d74ec21d58d07b2cccc5b111f8fdae6c7afb) Thanks [@ice-chillios](https://github.com/ice-chillios)! - **ESM-only packages.** CommonJS output (`.cjs`) and `require` export conditions have been removed; every package now ships ESM only (code-splitting stays enabled), with a uniform `{ default, types }` exports shape. `buildPackage` from `@swapkit/tools-builder` no longer emits CJS and the unused `esmOnly` option has been removed.
16
16
 
17
- **Why major**: `SolanaWallet = ReturnType<typeof getSolanaToolbox>` return shape changes — `createTransaction` returns a kit `Transaction` instead of v1 `Transaction`, `createKeysForPath` returns kit `KeyPairSigner` instead of v1 `Keypair`, `getPubkeyFromAddress` / `getAddressFromPubKey` operate on kit `Address` (branded string) instead of v1 `PublicKey`. Public method names preserved; return types changed.
18
-
19
- **`SolanaProvider` interface is now kit-native** (BREAKING for wallet adapter consumers):
20
-
21
- ```ts
22
- // Before (v1):
23
- interface SolanaProvider {
24
- connect(opts?): Promise<{ publicKey: PublicKey }>;
25
- publicKey: PublicKey | null;
26
- signTransaction<T extends Transaction | VersionedTransaction>(
27
- tx: T
28
- ): Promise<T>;
29
- }
30
-
31
- // After (kit):
32
- interface SolanaProvider {
33
- connect(opts?): Promise<{ address: Address }>;
34
- address: Address | null;
35
- signTransaction(tx: Transaction): Promise<Transaction>; // kit Transaction
36
- }
37
- ```
38
-
39
- Phantom/Solflare/Backpack and other wallet adapters that still emit v1 `Transaction` / `VersionedTransaction` shapes must perform their own v1↔kit conversion (e.g. via `@solana/compat`'s `fromVersionedTransaction`) before passing values to `SolanaProvider.signTransaction`. SwapKit deliberately does **not** bundle the v1 bridge — keeps the SDK kit-only.
40
-
41
- **Catalog changes**:
42
-
43
- - **Removed**: `@solana/spl-memo@0.2.5`, `@solana/spl-token@0.4.14`, `@solana/web3.js@1.98.4`, `@solana/compat@6.9.0`
44
- - **Added**: `@solana/kit@6.9.0`, `@solana-program/system@0.12.0`, `@solana-program/token@0.13.0`, `@solana-program/memo@0.11.0`
45
-
46
- **Bug fix**: `validateSolanaAddress` now uses kit's `isAddress` instead of v1's `PublicKey.isOnCurve`. PDAs (off-curve Program Derived Addresses) — which are valid recipient addresses for `transfer()` — are now correctly accepted. v1's stricter check incorrectly rejected them.
47
-
48
- **Plugins**: `solana`, `garden`, and `swapkit` plugins decode quote-API base64 tx strings via `getTransactionDecoder()` + `getBase64Encoder()` from `@solana/kit` instead of `VersionedTransaction.deserialize`.
49
-
50
- **Soft-rename**: `getConnection` is now a `@deprecated` alias for the new `getRpc` (kit RPC; not a v1 Connection).
17
+ For CommonJS consumers: on Node >= 20.19 / >= 22.12, `require()` of these packages continues to work via Node's native require(ESM) support (the entrypoints contain no top-level `await`). On older Node versions, `require()` throws `ERR_REQUIRE_ESM` — migrate to `import` or dynamic `import()`.
51
18
 
52
19
  ### Minor Changes
53
20
 
54
- - [#251](https://github.com/swapkit/sdk/pull/251) [`3d1a825`](https://github.com/swapkit/sdk/commit/3d1a8256bc1ff92d060679f4526f7f2dd021d35c) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Bump `@aptos-labs/ts-sdk` from 1.34.0 to 7.0.1. v7 is ESM-only and requires Node 22+. Adds two `AptosConfig` parameters required by v7: `network: Network.MAINNET` (custom endpoints now require an explicit network) and `clientConfig: { http2: false }` (Bun's HTTP/2 client isn't mature; v7 warns at construction otherwise). No public API change in our usage.
55
-
56
- - [#251](https://github.com/swapkit/sdk/pull/251) [`f1aa29f`](https://github.com/swapkit/sdk/commit/f1aa29f90f57bfab4be3a12ed32af8dec32bd8e3) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Bump `@polkadot/api`, `@polkadot/rpc-provider`, `@polkadot/types` from 15.10.2 to 16.5.6. Also moves `@polkadot/types` from a hard-pin in `toolboxes/package.json` to the root catalog. Public API unchanged in our usage. v16's Metadata v16 surface-renames (`signedExtensions` → `transactionExtensions`) live inside `api.runtimeMetadata.asV*` which we do not touch.
57
-
58
- - [#251](https://github.com/swapkit/sdk/pull/251) [`ae522b6`](https://github.com/swapkit/sdk/commit/ae522b6c6db0e6fed803d2391690c4358f27deb7) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Bump `@polkadot/keyring`, `@polkadot/util`, `@polkadot/util-crypto` from 13.5.7 to 14.0.3. sr25519 implementation now uses pure-JS `micro-sr25519` instead of WASM, shrinking the substrate bundle. Public API unchanged; `cryptoWaitReady()` remains required for ed25519/secp256k1 paths.
59
-
60
- - [#251](https://github.com/swapkit/sdk/pull/251) [`5be49f1`](https://github.com/swapkit/sdk/commit/5be49f1fec6fffb702fc8748e65f06d22c7fd44a) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Bump `@mysten/sui` from 1.44.0 to 2.17.0. The JSON-RPC entry moved from `@mysten/sui/client` to `@mysten/sui/jsonRpc` and `SuiClient` was renamed to `SuiJsonRpcClient` (aliased locally so no public type changes). `network` is now a mandatory `SuiJsonRpcClient` option. Adds a regression test asserting that built transactions carry a non-empty expiration, guarding against silent reversion of v2's epoch+1 default.
61
-
62
- - [#298](https://github.com/swapkit/sdk/pull/298) [`aa9bc14`](https://github.com/swapkit/sdk/commit/aa9bc14f303ecb19d14c82a26ea66f56bce89537) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Speed up `createTransaction` across toolboxes by removing serial and redundant network round-trips from the build path. Two techniques, both backward-compatible:
21
+ - [#298](https://github.com/swapkit/sdk/pull/298) [`3017621`](https://github.com/swapkit/sdk/commit/3017621ee5c2da15550036853df74d81f59d6ffb) Thanks [@ice-chillios](https://github.com/ice-chillios)! - Speed up `createTransaction` across toolboxes by removing serial and redundant network round-trips from the build path. Two techniques, both backward-compatible:
63
22
 
64
23
  **Parallelize independent round-trips**
65
24
 
@@ -85,9 +44,17 @@
85
44
 
86
45
  ### Patch Changes
87
46
 
88
- - Updated dependencies [[`622632d`](https://github.com/swapkit/sdk/commit/622632dd59bf1ff0063d1acb85b6a6de135c1361), [`de811bd`](https://github.com/swapkit/sdk/commit/de811bd5d9b793855cdaff695f315c2d18d078cb), [`b7004ac`](https://github.com/swapkit/sdk/commit/b7004ac9e7fe20181a43b5bc8f70051bfe1644c9)]:
89
- - @swapkit/cosmos-signer@0.0.0-rc-20260727094911
90
- - @swapkit/helpers@0.0.0-rc-20260727094911
47
+ - Updated dependencies [[`41505dc`](https://github.com/swapkit/sdk/commit/41505dc0f4f77dd301cfced063013efb6307b9bb), [`fd1d5d7`](https://github.com/swapkit/sdk/commit/fd1d5d7304eda3ff20c53b14d0eb5998fb6b8250), [`7f99d74`](https://github.com/swapkit/sdk/commit/7f99d74ec21d58d07b2cccc5b111f8fdae6c7afb), [`bd408bd`](https://github.com/swapkit/sdk/commit/bd408bdb42f6464fa17c36383ee8d37f35f9e779), [`fd1d5d7`](https://github.com/swapkit/sdk/commit/fd1d5d7304eda3ff20c53b14d0eb5998fb6b8250)]:
48
+ - @swapkit/cosmos-signer@0.0.0-rc-20260728115044
49
+ - @swapkit/helpers@0.0.0-rc-20260728115044
50
+ - @swapkit/utxo-signer@0.0.0-rc-20260728115044
51
+
52
+ ## 4.28.0
53
+
54
+ ### Minor Changes
55
+
56
+ - [#335](https://github.com/swapkit/sdk/pull/335) [`d724200`](https://github.com/swapkit/sdk/commit/d7242000b765b5090013740dab893960bee1744c) Thanks [@towanTG](https://github.com/towanTG)! - Support the Zcash NU6.3 "Ironwood" network upgrade (mainnet activation at block 3,428,143, ~2026-07-28; testnet activated 2026-07-01).
57
+ - Update generated token lists. (via @swapkit/helpers@4.20.1)
91
58
 
92
59
  ## 4.27.1
93
60
 
@@ -1 +1 @@
1
- import{ga as x}from"../../chunk-xbdjxeqd.js";import{bech32 as JG}from"@scure/base";import{mnemonicToEntropy as QG}from"@scure/bip39";import{wordlist as ZG}from"@scure/bip39/wordlists/english.js";import{AssetValue as f,Chain as L,getChainConfig as $G,SwapKitError as k}from"@swapkit/helpers";import U from"bignumber.js";var r="mainnet3YT7XK6NidLPlkHxxyBB5V0WzXUOTIJS",s="https://cardano-mainnet.blockfrost.io/api/v0",p=2147483648,o=0;async function c(G,J){let Z=await fetch(`${s}${G}`,{...J,headers:{project_id:r,...J?.headers}});if(!Z.ok)throw Error(`Blockfrost API error: ${Z.status} ${Z.statusText}`);return Z.json()}async function a(G){try{return await c(`/addresses/${G}/utxos`)}catch{return[]}}async function zG(){return(await c("/blocks/latest")).slot}async function XG(){let G=await c("/epochs/latest/parameters"),J={PlutusScriptV1:G.cost_models.PlutusV1?Object.values(G.cost_models.PlutusV1):[],PlutusScriptV2:G.cost_models.PlutusV2?Object.values(G.cost_models.PlutusV2):[],PlutusScriptV3:G.cost_models.PlutusV3?Object.values(G.cost_models.PlutusV3):[]};return{collateralPercent:new U(G.collateral_percent),languageView:J,maxValueSize:Number.parseInt(G.max_val_size,10),minFeeA:new U(G.min_fee_a),minFeeB:new U(G.min_fee_b),minFeeRefScriptCostPerByte:new U(15),priceMem:new U(G.price_mem),priceSteps:new U(G.price_step),stakeKeyDeposit:new U(2000000),utxoCostPerByte:new U(G.coins_per_utxo_size)}}async function t(G){let J=await fetch(`${s}/tx/submit`,{body:Buffer.from(G,"hex"),headers:{"Content-Type":"application/cbor",project_id:r},method:"POST"});if(!J.ok){let Z=await J.text();throw Error(`Transaction submission failed: ${Z}`)}return J.json()}function jG(G,J){return G.map((Z)=>{let W=Z.amount.find((Q)=>Q.unit==="lovelace"),X=W?new U(W.quantity):new U(0),q=Z.amount.filter((Q)=>Q.unit!=="lovelace").map((Q)=>({amount:new U(Q.quantity),assetName:Q.unit.slice(56),policyId:Q.unit.slice(0,56)}));return{address:J,amount:X,index:Z.output_index,tokens:q,txId:Z.tx_hash}})}function WG({TransactionConstructor:G,auxiliaryData:J,bufferedParams:Z,currentSlot:W,inputs:X,recipientAddress:q}){let Q=X.reduce((C,$)=>C.plus($.amount),new U(0));if(!Q.isPositive())throw new k({errorKey:"toolbox_sweep_amount_too_low",info:{available:Q.toString()}});let j=new G({protocolParams:Z});for(let C of X)j.addInput(C);if(j.addOutput({address:q,amount:Q,tokens:[]}),j.setTTL(W+3600),J)j.setAuxiliaryData(J);j.setFee(j.calculateFee());let R=j.getFee(),F=Q.minus(R),Y={address:q,amount:F,tokens:[]},O=j.calculateMinUtxoAmountBabbage(Y);if(!F.isPositive()||F.lt(O))throw new k({errorKey:"toolbox_sweep_amount_too_low",info:{available:Q.toString(),fee:R.toString(),minimumOutput:O.toString()}});return new G({protocolParams:Z}).paymentTransaction({auxiliaryData:J,changeAddress:q,inputs:X,outputs:[Y],ttl:W+3600})}async function qG(G){try{let J=await a(G),Z=0n,W=new Map;for(let Q of J){if(!Q.amount||!Array.isArray(Q.amount))continue;for(let j of Q.amount){let{unit:R,quantity:F}=j;if(R==="lovelace")Z+=BigInt(F);else{let Y=W.get(R)||0n;W.set(R,Y+BigInt(F))}}}let X=[],{baseDecimal:q}=$G(L.Cardano);if(Z>0n)X.push(f.from({chain:L.Cardano,fromBaseDecimal:q,value:Z.toString()}));for(let[Q,j]of W)X.push(f.from({asset:`${L.Cardano}.${Q}`,value:j.toString()}));if(X.length===0)return[f.from({chain:L.Cardano})];return X}catch(J){let Z=J instanceof Error?J.message:String(J);return console.error(`Cardano balance fetch error: ${Z}`),[f.from({chain:L.Cardano})]}}function FG(G){if(!G||typeof G!=="string")return!1;try{let J=JG.decode(G,120);return J.prefix==="addr"||J.prefix==="addr_test"}catch{return!1}}async function UG(G,J=0,Z=0){let{Bip32PrivateKey:W}=await import("@stricahq/bip32ed25519"),{types:X,address:q,crypto:Q}=await import("@stricahq/typhonjs"),j=QG(G,ZG),F=(await W.fromEntropy(Buffer.from(Array.from(j)))).derive(p+1852).derive(p+1815).derive(p+J),Y=F.derive(0).derive(Z),O=Y.toBip32PublicKey().toPublicKey().toBytes(),w=Q.hash28(O),$=F.derive(2).derive(0).toBip32PublicKey().toPublicKey().toBytes(),z=Q.hash28($),M={hash:w,type:X.HashType.ADDRESS},D={hash:z,type:X.HashType.ADDRESS},N=new q.BaseAddress(X.NetworkId.MAINNET,M,D).getBech32(),V=Y.toPrivateKey();return{getAddress:()=>N,publicKey:O,publicKeyHash:w,signRaw:(E)=>V.sign(E),signTransaction:async(E)=>{try{let _=await import("@stricahq/cbors"),b=Buffer.from(E,"hex"),T=_.Decoder.decode(b),[K,S,y,m]=T.value,h=_.Encoder.encode(K),P=Q.hash32(h),g=V.sign(P),B=S instanceof Map?S:new Map,A=B.get(o)||[];A.push([O,g]),B.set(o,A);let l=[K,B,y,m];return _.Encoder.encode(l).toString("hex")}catch(_){throw new k("toolbox_cardano_sign_transaction_failed",{message:String(_)})}}}}function kG(G){let J,Z,W;async function X(){if(!W)W=await XG();return W}async function q(){if(J!==void 0)return J;if(G&&"phrase"in G&&G.phrase){let $=G.index??0;return J=await UG(G.phrase,0,$),J}if(G&&"signer"in G&&G.signer)return J=G.signer,J;return}async function Q(){if(Z)return Z;let $=await q();if(!$)return"";if("getAddress"in $)return Z=await $.getAddress(),Z;return""}async function j($){let z=$||await Q();if(!z)throw new k("core_wallet_connection_not_found");return qG(z)}async function R($){if($)try{let{tx:v}=await F($),N=v.getFee();return f.from({chain:L.Cardano,fromBaseDecimal:6,value:N.toString()})}catch{}let z=await X(),M=400,D=z.minFeeB.plus(z.minFeeA.times(M));return f.from({chain:L.Cardano,fromBaseDecimal:6,value:D.toString()})}async function F({sender:$="",recipient:z,assetValue:M,memo:D,pureLovelaceOnly:v=!1,sweep:N=!1}){let{Transaction:V,utils:E}=await import("@stricahq/typhonjs"),_=$||await Q();if(!_)throw new k("core_wallet_connection_not_found");let[b,T,K]=await Promise.all([a(_),zG(),X()]);if(N&&!M.isGasAsset)throw new k({errorKey:"toolbox_not_supported",info:{asset:M.toString(),chain:L.Cardano,feature:"token_sweep"}});let S=N&&M.isGasAsset,y=v||S,m=b.filter((H)=>y?H.amount.some((I)=>I.unit==="lovelace")&&H.amount.every((I)=>I.unit==="lovelace"):H.amount.some((I)=>I.unit==="lovelace")).sort((H,I)=>{let n=H.amount.some((u)=>u.unit!=="lovelace"),GG=I.amount.some((u)=>u.unit!=="lovelace");if(n===GG)return 0;return n?1:-1}),h=E.getAddressFromString(_),P=E.getAddressFromString(z),g=jG(m,h),B;if(D){let H=new Map;H.set("msg",[D]),B={metadata:[{data:H,label:674}]}}let A={...K,minFeeB:K.minFeeB.plus(K.minFeeA.times(4))};if(S){let H=WG({auxiliaryData:B,bufferedParams:A,currentSlot:T,inputs:g,recipientAddress:P,TransactionConstructor:V}),{payload:I}=H.buildTransaction();return{tx:H,unsignedTx:I}}let l=new U(M.getBaseValue("string")),d=[{address:P,amount:l,tokens:[]}],i=new V({protocolParams:A}).paymentTransaction({auxiliaryData:B,changeAddress:h,inputs:g,outputs:d,ttl:T+3600}),{payload:e}=i.buildTransaction();return{tx:i,unsignedTx:e}}async function Y($){let z=await q();if(!z||!("signTransaction"in z))throw new k("core_wallet_connection_not_found");return z.signTransaction($)}async function O($){let z=await q();if(!z||!("signRaw"in z)||typeof z.signRaw!=="function")throw new k("core_wallet_connection_not_found");return z.signRaw($)}async function w({recipient:$,assetValue:z,memo:M,sweep:D}){let v=await q();if(!v||!("signTransaction"in v))throw new k("core_wallet_connection_not_found");let{unsignedTx:N}=await F({assetValue:z,memo:M,recipient:$,sender:await Q(),sweep:D}),V=await Y(N);return await t(V)}async function C($){let z=await Y($);return await t(z)}return{createTransaction:F,estimateTransactionFee:R,getAddress:Q,getBalance:j,signAndBroadcastTransaction:C,signRaw:O,signTransaction:Y,transfer:w,validateAddress:FG}}export{FG as validateCardanoAddress,kG as getCardanoToolbox};
1
+ import{ga as b}from"../../chunk-xbdjxeqd.js";import{bech32 as JG}from"@scure/base";import{mnemonicToEntropy as QG}from"@scure/bip39";import{wordlist as ZG}from"@scure/bip39/wordlists/english.js";import{AssetValue as B,Chain as D,getChainConfig as $G,SwapKitError as N}from"@swapkit/helpers";import U from"bignumber.js";var t="mainnet3YT7XK6NidLPlkHxxyBB5V0WzXUOTIJS",r="https://cardano-mainnet.blockfrost.io/api/v0",p=2147483648,n=0;async function c(G,J){let Z=await fetch(`${r}${G}`,{...J,headers:{project_id:t,...J?.headers}});if(!Z.ok)throw Error(`Blockfrost API error: ${Z.status} ${Z.statusText}`);return Z.json()}async function s(G){try{return await c(`/addresses/${G}/utxos`)}catch{return[]}}async function zG(){return(await c("/blocks/latest")).slot}async function XG(){let G=await c("/epochs/latest/parameters"),J={PlutusScriptV1:G.cost_models.PlutusV1?Object.values(G.cost_models.PlutusV1):[],PlutusScriptV2:G.cost_models.PlutusV2?Object.values(G.cost_models.PlutusV2):[],PlutusScriptV3:G.cost_models.PlutusV3?Object.values(G.cost_models.PlutusV3):[]};return{collateralPercent:new U(G.collateral_percent),languageView:J,maxValueSize:Number.parseInt(G.max_val_size,10),minFeeA:new U(G.min_fee_a),minFeeB:new U(G.min_fee_b),minFeeRefScriptCostPerByte:new U(15),priceMem:new U(G.price_mem),priceSteps:new U(G.price_step),stakeKeyDeposit:new U(2000000),utxoCostPerByte:new U(G.coins_per_utxo_size)}}async function o(G){let J=await fetch(`${r}/tx/submit`,{body:Buffer.from(G,"hex"),headers:{"Content-Type":"application/cbor",project_id:t},method:"POST"});if(!J.ok){let Z=await J.text();throw Error(`Transaction submission failed: ${Z}`)}return J.json()}function jG(G,J){return G.map((Z)=>{let W=Z.amount.find((Q)=>Q.unit==="lovelace"),X=W?new U(W.quantity):new U(0),q=Z.amount.filter((Q)=>Q.unit!=="lovelace").map((Q)=>({amount:new U(Q.quantity),assetName:Q.unit.slice(56),policyId:Q.unit.slice(0,56)}));return{address:J,amount:X,index:Z.output_index,tokens:q,txId:Z.tx_hash}})}function WG({TransactionConstructor:G,auxiliaryData:J,bufferedParams:Z,currentSlot:W,inputs:X,recipientAddress:q}){let Q=X.reduce(($,z)=>$.plus(z.amount),new U(0));if(!Q.isPositive())throw new N({errorKey:"toolbox_sweep_amount_too_low",info:{available:Q.toString()}});let j=new G({protocolParams:Z});for(let $ of X)j.addInput($);if(j.addOutput({address:q,amount:Q,tokens:[]}),j.setTTL(W+3600),J)j.setAuxiliaryData(J);j.setFee(j.calculateFee());let H=j.getFee(),F=Q.minus(H),Y={address:q,amount:F,tokens:[]},I=j.calculateMinUtxoAmountBabbage(Y);if(!F.isPositive()||F.lt(I))throw new N({errorKey:"toolbox_sweep_amount_too_low",info:{available:Q.toString(),fee:H.toString(),minimumOutput:I.toString()}});return new G({protocolParams:Z}).paymentTransaction({auxiliaryData:J,changeAddress:q,inputs:X,outputs:[Y],ttl:W+3600})}async function qG(G){try{let J=await s(G),Z=0n,W=new Map;for(let Q of J){if(!Q.amount||!Array.isArray(Q.amount))continue;for(let j of Q.amount){let{unit:H,quantity:F}=j;if(H==="lovelace")Z+=BigInt(F);else{let Y=W.get(H)||0n;W.set(H,Y+BigInt(F))}}}let X=[],{baseDecimal:q}=$G(D.Cardano);if(Z>0n)X.push(B.from({chain:D.Cardano,fromBaseDecimal:q,value:Z.toString()}));for(let[Q,j]of W)X.push(B.from({asset:`${D.Cardano}.${Q}`,value:j.toString()}));if(X.length===0)return[B.from({chain:D.Cardano})];return X}catch(J){let Z=J instanceof Error?J.message:String(J);return console.error(`Cardano balance fetch error: ${Z}`),[B.from({chain:D.Cardano})]}}function FG(G){if(!G||typeof G!=="string")return!1;try{let J=JG.decode(G,120);return J.prefix==="addr"||J.prefix==="addr_test"}catch{return!1}}async function UG(G,J=0,Z=0){let{Bip32PrivateKey:W}=await import("@stricahq/bip32ed25519"),{types:X,address:q,crypto:Q}=await import("@stricahq/typhonjs"),j=QG(G,ZG),F=(await W.fromEntropy(Buffer.from(Array.from(j)))).derive(p+1852).derive(p+1815).derive(p+J),Y=F.derive(0).derive(Z),I=Y.toBip32PublicKey().toPublicKey().toBytes(),C=Q.hash28(I),z=F.derive(2).derive(0).toBip32PublicKey().toPublicKey().toBytes(),M=Q.hash28(z),k={hash:C,type:X.HashType.ADDRESS},O={hash:M,type:X.HashType.ADDRESS},V=new q.BaseAddress(X.NetworkId.MAINNET,k,O).getBech32(),K=Y.toPrivateKey();return{getAddress:()=>V,publicKey:I,publicKeyHash:C,signTransaction:async(w)=>{try{let v=await import("@stricahq/cbors"),T=Buffer.from(w,"hex"),f=v.Decoder.decode(T),[S,h,m,P]=f.value,g=v.Encoder.encode(S),y=Q.hash32(g),A=K.sign(y),E=h instanceof Map?h:new Map,x=E.get(n)||[];x.push([I,A]),E.set(n,x);let l=[S,E,m,P];return v.Encoder.encode(l).toString("hex")}catch(v){throw new N("toolbox_cardano_sign_transaction_failed",{message:String(v)})}}}}function IG(G){let J,Z,W;async function X(){if(!W)W=await XG();return W}async function q(){if(J!==void 0)return J;if(G&&"phrase"in G&&G.phrase){let $=G.index??0;return J=await UG(G.phrase,0,$),J}if(G&&"signer"in G&&G.signer)return J=G.signer,J;return}async function Q(){if(Z)return Z;let $=await q();if(!$)return"";if("getAddress"in $)return Z=await $.getAddress(),Z;return""}async function j($){let z=$||await Q();if(!z)throw new N("core_wallet_connection_not_found");return qG(z)}async function H($){if($)try{let{tx:O}=await F($),L=O.getFee();return B.from({chain:D.Cardano,fromBaseDecimal:6,value:L.toString()})}catch{}let z=await X(),M=400,k=z.minFeeB.plus(z.minFeeA.times(M));return B.from({chain:D.Cardano,fromBaseDecimal:6,value:k.toString()})}async function F({sender:$="",recipient:z,assetValue:M,memo:k,pureLovelaceOnly:O=!1,sweep:L=!1}){let{Transaction:V,utils:K}=await import("@stricahq/typhonjs"),w=$||await Q();if(!w)throw new N("core_wallet_connection_not_found");let[v,T,f]=await Promise.all([s(w),zG(),X()]);if(L&&!M.isGasAsset)throw new N({errorKey:"toolbox_not_supported",info:{asset:M.toString(),chain:D.Cardano,feature:"token_sweep"}});let S=L&&M.isGasAsset,h=O||S,m=v.filter((R)=>h?R.amount.some((_)=>_.unit==="lovelace")&&R.amount.every((_)=>_.unit==="lovelace"):R.amount.some((_)=>_.unit==="lovelace")).sort((R,_)=>{let i=R.amount.some((u)=>u.unit!=="lovelace"),GG=_.amount.some((u)=>u.unit!=="lovelace");if(i===GG)return 0;return i?1:-1}),P=K.getAddressFromString(w),g=K.getAddressFromString(z),y=jG(m,P),A;if(k){let R=new Map;R.set("msg",[k]),A={metadata:[{data:R,label:674}]}}let E={...f,minFeeB:f.minFeeB.plus(f.minFeeA.times(4))};if(S){let R=WG({auxiliaryData:A,bufferedParams:E,currentSlot:T,inputs:y,recipientAddress:g,TransactionConstructor:V}),{payload:_}=R.buildTransaction();return{tx:R,unsignedTx:_}}let x=new U(M.getBaseValue("string")),l=[{address:g,amount:x,tokens:[]}],d=new V({protocolParams:E}).paymentTransaction({auxiliaryData:A,changeAddress:P,inputs:y,outputs:l,ttl:T+3600}),{payload:e}=d.buildTransaction();return{tx:d,unsignedTx:e}}async function Y($){let z=await q();if(!z||!("signTransaction"in z))throw new N("core_wallet_connection_not_found");return z.signTransaction($)}async function I({recipient:$,assetValue:z,memo:M,sweep:k}){let O=await q();if(!O||!("signTransaction"in O))throw new N("core_wallet_connection_not_found");let{unsignedTx:L}=await F({assetValue:z,memo:M,recipient:$,sender:await Q(),sweep:k}),V=await Y(L);return await o(V)}async function C($){let z=await Y($);return await o(z)}return{createTransaction:F,estimateTransactionFee:H,getAddress:Q,getBalance:j,signAndBroadcastTransaction:C,signTransaction:Y,transfer:I,validateAddress:FG}}export{FG as validateCardanoAddress,IG as getCardanoToolbox};
@@ -1 +1 @@
1
- import{fa as e}from"../../chunk-nvfkjbyq.js";import{ga as h}from"../../chunk-xbdjxeqd.js";import{address as U,appendTransactionMessageInstructions as l,compileTransaction as g,createKeyPairSignerFromPrivateKeyBytes as Gj,createNoopSigner as Jj,createSolanaRpcFromTransport as Mj,createTransactionMessage as u,getBase64Decoder as Nj,getBase64EncodedWireTransaction as Oj,getBase64Encoder as Qj,getTransactionDecoder as Uj,isAddress as Wj,signTransaction as Xj,lamports as p,pipe as m,setTransactionMessageFeePayer as d,setTransactionMessageLifetimeUsingBlockhash as o}from"@solana/kit";import{createHttpTransportForSolanaRpc as Yj}from"@solana/rpc-transport-http";import{getAddMemoInstruction as Zj}from"@solana-program/memo";import{getTransferSolInstruction as c}from"@solana-program/system";import{findAssociatedTokenPda as i,getCreateAssociatedTokenIdempotentInstructionAsync as _j,getTransferCheckedInstruction as $j,TOKEN_PROGRAM_ADDRESS as P}from"@solana-program/token";import{AssetValue as v,Chain as Y,derivationPathToString as Hj,getChainConfig as jj,getRPCUrl as Kj,NetworkDerivationPath as Rj,SwapKitError as Q,updateDerivationPath as bj}from"@swapkit/helpers";import{match as kj,P as t}from"ts-pattern";function a(j){return Uj().decode(Qj().encode(j))}function n(j){return Nj().decode(j.messageBytes)}async function xj(j){let E=v.from({address:j,chain:Y.Solana});if(E.symbol!=="UNKNOWN")return{decimals:E.decimal||0,id:j,logoURI:E.getIconUrl(),name:E.symbol,symbol:E.ticker};let k=`https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(j)}`;try{let W=await fetch(k);if(!W.ok)return null;let M=await W.json();if(!Array.isArray(M)||M.length===0)return null;return M.find((N)=>N.id===j)||null}catch{return null}}function r(j){if(typeof j!=="string"||j.length===0)return!1;return Wj(j)}async function yj(j){let E=await H(),{baseDecimal:k}=jj(Y.Solana),{value:W}=await E.getBalance(U(j)).send(),M=[v.from({chain:Y.Solana,fromBaseDecimal:k,value:W.toString()})],{value:y}=await E.getTokenAccountsByOwner(U(j),{programId:P},{encoding:"jsonParsed"}).send();for(let{account:N}of y){let Z=N.data.parsed.info,T=Z.mint,B=Z.tokenAmount.amount;if(Number(B)===0)continue;let L=await xj(T),I=L?.symbol||"UNKNOWN",F=L?.decimals||Z.tokenAmount.decimals;M.push(v.from({asset:`${Y.Solana}.${I}-${T}`,fromBaseDecimal:F,value:B}))}return M}async function H(){let j=await Kj(Y.Solana),E=Yj({url:j});return Mj(E)}function Bj(j){return j.toString()}function Lj(j){return U(j)}function A(j){if(qj(j))return j.address;return j.address??void 0}function qj(j){return"keyPair"in j&&"address"in j}function Aj(j){let E=j&&"index"in j?j.index||0:0,W=(j&&"derivationPath"in j&&j.derivationPath?j.derivationPath:Rj[Y.Solana]).slice(0,4),M=j&&"derivationPath"in j&&j.derivationPath?W:bj(W,{index:E}),y=Hj(M),N;async function Z(){if(N)return N;return N=await kj(j).with({phrase:t.string},({phrase:q})=>s({derivationPath:y,phrase:q})).with({signer:t.any},({signer:q})=>q).otherwise(()=>{return}),N}async function T(){let q=await Z();if(!q)return"";let z=A(q);if(z)return z;if("connect"in q)return(await q.connect()).address;return""}async function B(q){let z=await Z();if(!z)throw new Q("toolbox_solana_no_signer");let C=typeof q==="string"?a(q):q;if(qj(z))return Xj([z.keyPair],C);return z.signTransaction(C)}async function L(q){let z=await H(),C=typeof q==="string"?a(q):q,X=Oj(C);return z.sendTransaction(X,{encoding:"base64"}).send()}async function I(q){let z=await B(q);return L(z)}async function F({recipient:q,assetValue:z,memo:C,isProgramDerivedAddress:X,sender:K,sweep:J}){if(!(X||r(q)))throw new Q("core_transaction_invalid_recipient_address");let G=U(K),_=Jj(G),R=[];if(z.isGasAsset)R.push(c({amount:p(J?0n:BigInt(z.getBaseValue("string"))),destination:U(q),source:_}));else if(z.address){let $=U(z.address),[O]=await i({mint:$,owner:G,tokenProgram:P}),[S]=await i({mint:$,owner:U(q),tokenProgram:P}),D=await _j({mint:$,owner:U(q),payer:_,tokenProgram:P}),x=J?BigInt((await(await H()).getTokenAccountBalance(O).send()).value.amount):BigInt(z.getBaseValue("string"));if(J&&x<=0n)throw new Q({errorKey:"toolbox_sweep_amount_too_low",info:{asset:z.address,balance:x.toString()}});let f=$j({amount:x,authority:_,decimals:z.decimal,destination:S,mint:$,source:O});R.push(D,f)}else throw new Q("core_transaction_invalid_sender_address");if(C)R.push(Zj({memo:C}));let b=await H(),{value:w}=await b.getLatestBlockhash().send();function V(){let $=m(u({version:0}),(O)=>d(G,O),(O)=>o(w,O),(O)=>l(R,O));return g($)}if(J&&z.isGasAsset){let $=V(),O=n($),[{value:S},{value:D},x]=await Promise.all([b.getBalance(G).send(),b.getFeeForMessage(O).send(),b.getMinimumBalanceForRentExemption(0n).send()]);if(D===null)throw new Q("toolbox_fee_estimation_failed","Could not estimate Solana fee.");let f=S-D-x;if(f<=0n)throw new Q({errorKey:"toolbox_sweep_amount_too_low",info:{balance:S.toString(),fee:D.toString(),rentReserve:x.toString()}});R[0]=c({amount:p(f),destination:U(q),source:_})}return V()}async function zj({instructions:q}){let z=await Z();if(!z)throw new Q("toolbox_solana_no_signer");let C=A(z);if(!C)throw new Q("core_transaction_invalid_sender_address");let X=await H(),{value:K}=await X.getLatestBlockhash().send(),J=m(u({version:0}),(G)=>d(U(C),G),(G)=>o(K,G),(G)=>l(q,G));return g(J)}async function Cj({recipient:q,assetValue:z,memo:C,isProgramDerivedAddress:X,sender:K,sweep:J}){let G=await F({assetValue:z,isProgramDerivedAddress:X,memo:C,recipient:q,sender:K,sweep:J}),_=await H(),R=n(G),{value:b}=await _.getFeeForMessage(R).send();if(b===null)throw new Q("toolbox_fee_estimation_failed","Could not estimate Solana fee.");let{baseDecimal:w}=jj(Y.Solana);return v.from({chain:Y.Solana,fromBaseDecimal:w,value:b.toString()})}async function Ej({recipient:q,assetValue:z,memo:C,isProgramDerivedAddress:X,sweep:K}){let J=await Z();if(!J)throw new Q("toolbox_solana_no_signer");let G=A(J)??(await J.connect()).address,_=await F({assetValue:z,isProgramDerivedAddress:X,memo:C,recipient:q,sender:G,sweep:K});return I(_)}return{broadcastTransaction:L,createKeysForPath:s,createTransaction:F,createTransactionFromInstructions:zj,estimateTransactionFee:Cj,getAddress:T,getAddressFromPubKey:Bj,getBalance:e(Y.Solana),getBalanceFromRPC:yj,getConnection:H,getPubkeyFromAddress:Lj,getRpc:H,signAndBroadcastTransaction:I,signTransaction:B,transfer:Ej,validateAddress:r}}var Fj="m/44'/501'/0'/0'";async function s({phrase:j,derivationPath:E=Fj}){let{HDKey:k}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:W}=await import("@scure/bip39"),M=W(j),N=k.fromMasterSeed(M).derive(E,!0).privateKey;return Gj(N)}export{r as validateSolanaAddress,Aj as getSolanaToolbox,xj as fetchTokenMetaData,s as createKeysForPath};
1
+ import{fa as v}from"../../chunk-nvfkjbyq.js";import{ga as X}from"../../chunk-xbdjxeqd.js";import{PublicKey as H}from"@solana/web3.js";import{AssetValue as T,Chain as E,DerivationPath as C,derivationPathToString as h,getChainConfig as b,getRPCUrl as P,NetworkDerivationPath as u,SwapKitError as x,updateDerivationPath as l}from"@swapkit/helpers";import{match as p,P as D}from"ts-pattern";async function m(j){let q=T.from({address:j,chain:E.Solana});if(q.symbol!=="UNKNOWN")return{decimals:q.decimal||0,id:j,logoURI:q.getIconUrl(),name:q.symbol,symbol:q.ticker};let z=`https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(j)}`;try{let F=await fetch(z);if(!F.ok)return null;let J=await F.json();if(!Array.isArray(J)||J.length===0)return null;return J.find((G)=>G.id===j)||null}catch{return null}}async function d(j){let q=await M(),{PublicKey:z}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:F}=await import("@solana/spl-token"),J=new z(j),{baseDecimal:Q}=b(E.Solana),G=await q.getBalance(J),N=[T.from({chain:E.Solana,fromBaseDecimal:Q,value:G||0})],U=await q.getParsedTokenAccountsByOwner(J,{programId:F});for(let{account:W}of U.value){let _=W.data.parsed.info,R=_.mint,Y=_.tokenAmount.amount;if(Number(Y)===0)continue;let Z=await m(R),$=Z?.symbol||"UNKNOWN",B=Z?.decimals||_.tokenAmount.decimals;N.push(T.from({asset:`${E.Solana}.${$}-${R}`,fromBaseDecimal:B,value:Y}))}return N}function k(j){try{let q=new H(j);return H.isOnCurve(q.toBytes())}catch{return!1}}function e(j){let q=j&&"index"in j?j.index||0:0,z=h(j&&"derivationPath"in j&&j.derivationPath?j.derivationPath:l(u[E.Solana],{index:q})),F;async function J(){if(F)return F;return F=await p(j).with({phrase:D.string},({phrase:G})=>K({derivationPath:z,phrase:G})).with({signer:D.any},({signer:G})=>G).otherwise(()=>{return}),F}async function Q(){let G=await J();return G?.publicKey?f(G.publicKey):""}return{broadcastTransaction:w(M),createKeysForPath:K,createTransaction:V(M),createTransactionFromInstructions:s,estimateTransactionFee:g(M),getAddress:Q,getAddressFromPubKey:f,getBalance:v(E.Solana),getBalanceFromRPC:d,getConnection:M,getPubkeyFromAddress:(G)=>new H(G),signAndBroadcastTransaction:async(G)=>{let N=await A(M,J)(G);return w(M)(N)},signTransaction:A(M,J),transfer:o(M,J),validateAddress:k}}function g(j){return async({recipient:q,assetValue:z,memo:F,isProgramDerivedAddress:J,sender:Q})=>{let G=await j(),N=await V(j)({assetValue:z,isProgramDerivedAddress:J,memo:F,recipient:q,sender:Q}),U=await y(G,N),{baseDecimal:W}=b(E.Solana);return T.from({chain:E.Solana,fromBaseDecimal:W,value:U})}}async function y(j,q){let z=await j.getFeeForMessage(q.compileMessage());if(z.value===null)throw new x("toolbox_fee_estimation_failed","Could not estimate Solana fee.");return z.value}async function M(){let{Connection:j}=await import("@solana/web3.js"),q=await P(E.Solana);return new j(q,{commitment:"confirmed",fetchMiddleware:(z,F,J)=>{let Q={};for(let[G,N]of Object.entries(F?.headers??{})){let U=G.toLowerCase();if(U!=="pragma"&&U!=="solana-client")Q[G]=N}J(z,{...F,headers:Q})}})}function c(j){return async({assetValue:q,recipient:z,sender:F,isProgramDerivedAddress:J,sweep:Q})=>{let G=new H(F);if(q.isGasAsset){let{Transaction:N,SystemProgram:U}=await import("@solana/web3.js");return new N().add(U.transfer({fromPubkey:G,lamports:Q?0:q.getBaseValue("number"),toPubkey:new H(z)}))}if(q.address){let N=await j();return a({amount:Q?0:q.getBaseValue("number"),connection:N,decimals:q.decimal,from:G,isProgramDerivedAddress:J,recipient:z,sweep:Q,tokenAddress:q.address})}return}}async function a({tokenAddress:j,recipient:q,from:z,connection:F,amount:J,decimals:Q,isProgramDerivedAddress:G,sweep:N}){let{getAssociatedTokenAddress:U,getAccount:W,createAssociatedTokenAccountInstruction:_,createTransferCheckedInstruction:R}=await import("@solana/spl-token"),{Transaction:Y}=await import("@solana/web3.js"),Z=new Y,$=new H(j),B=await U($,z),O=new H(q),L=await U($,O,G),I=!1;try{await W(F,L),I=!0}catch{}if(!I)Z.add(_(z,L,O,$));let S=N?BigInt((await F.getTokenAccountBalance(B)).value.amount):J;if(N&&S<=0n)throw new x({errorKey:"toolbox_sweep_amount_too_low",info:{asset:j,balance:S.toString()}});return Z.add(R(B,$,L,z,S,Q)),Z}function V(j){return async({recipient:q,assetValue:z,memo:F,isProgramDerivedAddress:J,sender:Q,recentBlockhash:G,sweep:N})=>{let{createMemoInstruction:U}=await import("@solana/spl-memo"),W=new H(Q);if(!(J||k(q)))throw new x("core_transaction_invalid_recipient_address");let _,R=()=>_??=j(),Y=await c(R)({assetValue:z,isProgramDerivedAddress:J,recipient:q,sender:Q,sweep:N});if(!Y)throw new x("core_transaction_invalid_sender_address");if(F)Y.add(U(F));if(Y.recentBlockhash=G??(await(await R()).getLatestBlockhash()).blockhash,Y.feePayer=W,N&&z.isGasAsset){let Z=await R(),[$,B,O]=await Promise.all([Z.getBalance(W),y(Z,Y),Z.getMinimumBalanceForRentExemption(0)]),L=$-B-O;if(L<=0)throw new x({errorKey:"toolbox_sweep_amount_too_low",info:{balance:$,fee:B,rentReserve:O}});let{SystemProgram:I}=await import("@solana/web3.js");Y.instructions[0]=I.transfer({fromPubkey:W,lamports:L,toPubkey:new H(q)})}return Y}}async function s({instructions:j}){let{Transaction:q}=await import("@solana/web3.js"),z=new q().add(...j);if(!z)throw new x("core_transaction_invalid_sender_address");return z}function o(j,q){return async({recipient:z,assetValue:F,memo:J,isProgramDerivedAddress:Q,sweep:G})=>{let N=await q();if(!N)throw new x("core_transaction_invalid_sender_address");let U=N.publicKey?.toString()??(await N.connect()).publicKey.toString(),W=await V(j)({assetValue:F,isProgramDerivedAddress:Q,memo:J,recipient:z,sender:U,sweep:G});if("signTransaction"in N){let _=await N.signTransaction(W);return w(j)(_)}return W.sign(N),w(j)(W)}}function w(j){return async(q)=>{return(await j()).sendRawTransaction(q.serialize())}}function A(j,q){return async(z)=>{let F=await q();if(!F)throw new x("toolbox_solana_no_signer");let{VersionedTransaction:J}=await import("@solana/web3.js");if(!(z instanceof J)){let G=await(await j()).getLatestBlockhash();z.recentBlockhash=G.blockhash,z.feePayer=F.publicKey||void 0}if("connect"in F)return await F.signTransaction(z);return z.sign([F]),z}}async function K({phrase:j,derivationPath:q=C.SOL}){let{HDKey:z}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:F}=await import("@scure/bip39"),{Keypair:J}=await import("@solana/web3.js"),Q=F(j),G=z.fromMasterSeed(Q);return J.fromSeed(G.derive(q,!0).privateKey)}function f(j){return j.toString()}export{k as validateSolanaAddress,e as getSolanaToolbox,m as fetchTokenMetaData,K as createKeysForPath};
@@ -1 +1 @@
1
- import{ea as J2,fa as N2}from"../../chunk-nvfkjbyq.js";import"../../chunk-xbdjxeqd.js";import{NetworkDerivationPath as u2}from"@swapkit/helpers";function K(X,$){if(!Number.isInteger($)||$<0)throw RangeError(`${X} must be a non-negative integer, got: ${$}`)}function n({accountIndex:X,chain:$,derivationPath:J}){if(X!==void 0)K("accountIndex",X);let j=[...J?.slice(0,3)??u2[$].slice(0,3)];if(X!==void 0)j[2]=X;return j}function NX({accountIndex:X,change:$=!1,chain:J,derivationPath:j,index:Q}){return K("index",Q),[...n({accountIndex:X,chain:J,derivationPath:j}),Number($),Q]}function ZX(X){return X[2]??0}function p2({deriveAddress:X,getBalance:$,getUtxos:J}){async function j(Y){let{accountIndex:q,count:G,startIndex:U=0,change:W=!1}=Y;if(K("count",G),G<1)throw RangeError("count must be at least 1");K("startIndex",U);let L=[];for(let B=0;B<G;B++){let _=await X({accountIndex:q,change:W,index:U+B});if(_)L.push(_)}return L}async function Q(Y){let{gapLimit:q=20,change:G=!1}=Y??{},U=[],W=0,L=0;while(W<q){let B=await X({change:G,index:L});if(!B)break;if((await $(B.address)).some((D)=>D.getValue("number")>0))U.push(B),W=0;else W++;L++}return U}async function Z(Y=20){let[q,G]=await Promise.all([Q({change:!1,gapLimit:Y}),Q({change:!0,gapLimit:Y})]),U=[...q,...G],W=await Promise.all(U.map(async(B)=>{let C=(await $(B.address)).reduce((D,b)=>D+b.getValue("number"),0);return{...B,balance:C}})),L=W.reduce((B,_)=>B+_.balance,0);return{addresses:W,total:L}}async function z(Y=20){let[q,G]=await Promise.all([Q({change:!1,gapLimit:Y}),Q({change:!0,gapLimit:Y})]),U=[...q,...G];return(await Promise.all(U.map(async(L)=>{return(await J(L.address)).map((_)=>({..._,address:L.address,derivationIndex:L.index,isChange:L.change}))}))).flat()}return{deriveAddresses:j,getAggregatedBalance:Z,getAggregatedUtxos:z,scanForAddresses:Q}}import{Chain as T,getRPCUrl as d2,RequestClient as FX,SKConfig as r2,SwapKitError as m,warnOnce as n2}from"@swapkit/helpers";import{NETWORKS as GX}from"@swapkit/utxo-signer";async function i2({chain:X,txHash:$}){let J=`${MX(X)}/push/transaction`,j=JSON.stringify({data:$});try{let Q=await FX.post(J,{body:j,headers:{"Content-Type":"application/json"}});if(Q.context.code!==200)throw new m("toolbox_utxo_broadcast_failed",{error:Q.context.error||"Transaction broadcast failed"});return Q.data?.transaction_hash||$}catch(Q){let Z=await d2(X);if(Z){let z=JSON.stringify({id:J2(),jsonrpc:"2.0",method:"sendrawtransaction",params:[$]}),Y=await FX.post(Z,{body:z,headers:{"Content-Type":"application/json"}});if(Y.error)throw new m("toolbox_utxo_broadcast_failed",{error:Y.error?.message});if(Y.result.includes('"code":-26'))throw new m("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Y.result}throw Q}}function MX(X){return`https://api.blockchair.com/${s2(X)}`}function X2(X){switch(X){case T.Bitcoin:return 5;case T.Dogecoin:return 1e4;case T.Litecoin:return 1;case T.Zcash:return 1;default:return 2}}function s2(X){switch(X){case T.BitcoinCash:return"bitcoin-cash";case T.Litecoin:return"litecoin";case T.Dash:return"dash";case T.Dogecoin:return"dogecoin";case T.Zcash:return"zcash";case T.Polkadot:return"polkadot";default:return"bitcoin"}}async function a2(X){try{let{feePerKb:$}=await FX.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),J=$/1000;return Math.max(J,X2(X))}catch{return X2(X)}}async function fX(X,$){let J=await FX.get(`${X}${$?`${X.includes("?")?"&":"?"}key=${$}`:""}`);if(!J||J.context.code!==200)throw new m("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return J.data}async function j2({address:X,chain:$,apiKey:J}){if(!X)throw new m("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await fX(`${MX($)}/dashboards/address/${X}?transaction_details=true`,J))[X]}catch{return{address:{balance:0,transaction_count:0},utxo:[]}}}async function t2({address:X,chain:$,apiKey:J}){return(await j2({address:X,apiKey:J,chain:$}))?.address.balance||0}async function Q2({chain:X,apiKey:$,txHash:J}){if(!J)throw new m("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await fX(`${MX(X)}/raw/transaction/${J}`,$))?.[J]?.raw_transaction||""}catch(j){let Q=j instanceof Error?j.message:String(j);return console.error(`Failed to fetch raw transaction: ${Q}`),""}}var e2=4294967294;async function X0({chain:X,apiKey:$,txHash:J}){if(!J)throw new m("toolbox_utxo_invalid_params",{error:"TxHash is required"});let Q=(await fX(`${MX(X)}/dashboards/transaction/${J}`,$))?.[J];if(!Q)throw new m("toolbox_utxo_tx_not_found",{txHash:J});let{transaction:Z,inputs:z,outputs:Y}=Q,q=z.map((U)=>U.spending_sequence),G=Z.is_rbf===!0||q.some((U)=>U<e2);return{blockId:Z.block_id,confirmed:Z.block_id!==-1,fee:Z.fee,inputs:z,isRBF:G,outputs:Y,sequences:q,size:Z.size,txid:Z.hash,weight:Z.weight}}async function $0({chain:X,address:$,apiKey:J,offset:j=0,limit:Q=30}){return(await fX(`${MX(X)}/outputs?q=recipient(${$}),is_spent(false)&s=value(desc)&fields=is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex&limit=${Q}&offset=${j}`,J)).map(({is_spent:q,script_hex:G,block_id:U,transaction_hash:W,index:L,value:B,spending_signature_hex:_})=>({hash:W,index:L,is_confirmed:U!==-1,is_spent:q,script_hex:G,txHex:_,value:B}))}function J0(X){return X.reduce(($,J)=>$+J.value,0)}function $2(X,$){let J=[...X].sort((j,Q)=>Q.value-j.value);if($){let j=[],Q=0;for(let Z of J)if(j.push(Z),Q+=Z.value,Q>=$)break;return j}return J}async function Z2({chain:X,address:$,apiKey:J,targetValue:j,accumulativeValue:Q=0,offset:Z=0,limit:z=30}){if(!$)throw new m("toolbox_utxo_invalid_params",{error:"Address is required"});try{let Y=await $0({address:$,apiKey:J,chain:X,limit:z,offset:Z,targetValue:j}),G=Y.length<z,U=Y.filter(({is_spent:D})=>!D),W=J0(U),L=Q+W,B=j&&L>=j;if(G||B)return $2(U,j);let _=await Z2({accumulativeValue:L,address:$,apiKey:J,chain:X,limit:z,offset:Z+z,targetValue:j}),C=[...U,..._];return $2(C,j)}catch(Y){let q=Y instanceof Error?Y.message:String(Y);return console.error(`Failed to fetch unspent UTXOs: ${q}`),[]}}async function j0({address:X,chain:$,apiKey:J,fetchTxHex:j=!0,targetValue:Q}){let Z=await Z2({address:X,apiKey:J,chain:$,targetValue:Q}),z=j?await Promise.all(Z.map(({hash:Y})=>Q2({apiKey:J,chain:$,txHash:Y}))):[];return Z.map(({hash:Y,index:q,script_hex:G,value:U},W)=>({address:X,hash:Y,index:q,txHex:j?z[W]:void 0,value:U,witnessUtxo:{script:Buffer.from(G,"hex"),value:U}}))}function P(X){let $=r2.get("apiKeys").blockchair||"";return n2({condition:!$,id:"no_blockchair_api_key_warning",warning:"No Blockchair API key found. Functionality will be limited."}),{broadcastTx:(J)=>i2({chain:X,txHash:J}),getAddressData:(J)=>j2({address:J,apiKey:$,chain:X}),getBalance:(J)=>t2({address:J,apiKey:$,chain:X}),getRawTx:(J)=>Q2({apiKey:$,chain:X,txHash:J}),getSuggestedTxFee:()=>a2(X),getTransactionDetails:(J)=>X0({apiKey:$,chain:X,txHash:J}),getUtxos:(J)=>j0({...J,apiKey:$,chain:X})}}function T1(X){return X}function E1(){return function($){switch($){case T.Bitcoin:return GX.bitcoin;case T.BitcoinCash:return GX.bitcoinCash;case T.Dash:return GX.dash;case T.Litecoin:return GX.litecoin;case T.Dogecoin:return GX.dogecoin;case T.Zcash:return GX.zcash;default:throw new m("toolbox_utxo_not_supported",{chain:$})}}}import{sha256 as z0}from"@noble/hashes/sha2.js";import{createBase58check as U0}from"@scure/base";import{SwapKitError as Y2}from"@swapkit/helpers";import{CashAddrType as yX,decodeCashAddr as Q0,encodeCashAddr as Z0}from"@swapkit/utxo-signer";var G0={P2PKH:yX.P2PKH,P2SH:yX.P2SH},Y0={[yX.P2PKH]:"P2PKH",[yX.P2SH]:"P2SH"};function q0(X,$,J){return Z0({hash:J,prefix:X,type:G0[$]})}function L0(X){let $=Q0(X),J=Y0[$.type];if(!J)throw Error(`Unknown CashAddr type: ${$.type}`);return{hash:$.hash,prefix:$.prefix,type:J}}var hX={decode:L0,encode:q0};var q2=U0(z0);var L2;((J)=>{J.Mainnet="mainnet";J.Testnet="testnet"})(L2||={});var i={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function z2(X){try{return RX(X),!0}catch{return!1}}function U2(X){return RX(X)?.network}function o(X){let $=RX(X);if($?.format==="legacy")return X;return _0($)}function AX(X){let $=RX(X);return N0($)}function RX(X){try{let $=W0(X);if($)return $}catch{}try{let $=B0(X);if($)return $}catch{}throw new Y2("toolbox_utxo_invalid_address",{address:X})}function W0(X){try{let $=q2.decode(X);if($.length!==21)throw new Y2("toolbox_utxo_invalid_address",{address:X});let J=$[0],j=Array.prototype.slice.call($,1);switch(J){case i.legacy.mainnet.p2pkh:return{format:"legacy",hash:j,network:"mainnet",type:"p2pkh"};case i.legacy.mainnet.p2sh:return{format:"legacy",hash:j,network:"mainnet",type:"p2sh"};case i.legacy.testnet.p2pkh:return{format:"legacy",hash:j,network:"testnet",type:"p2pkh"};case i.legacy.testnet.p2sh:return{format:"legacy",hash:j,network:"testnet",type:"p2sh"};case i.bitpay.mainnet.p2pkh:return{format:"bitpay",hash:j,network:"mainnet",type:"p2pkh"};case i.bitpay.mainnet.p2sh:return{format:"bitpay",hash:j,network:"mainnet",type:"p2sh"};default:return}}catch{return}}function B0(X){if(X.indexOf(":")!==-1)try{return G2(X)}catch{}else{let $=["bitcoincash","bchtest","bchreg"];for(let J of $)try{return G2(`${J}:${X}`)}catch{}}return}function G2(X){try{let{hash:$,prefix:J,type:j}=hX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call($,0),network:J==="bitcoincash"?"mainnet":"testnet",type:j==="P2PKH"?"p2pkh":"p2sh"}}catch{return}}function _0(X){let $=i.legacy[X.network][X.type],J=Buffer.alloc(1+X.hash.length);return J[0]=$,J.set(X.hash,1),q2.encode(J)}function N0(X){let $=X.network==="mainnet"?"bitcoincash":"bchtest",J=X.type==="p2pkh"?"P2PKH":"P2SH",j=new Uint8Array(X.hash);return hX.encode($,J,j)}import{Chain as a,SwapKitError as dX}from"@swapkit/helpers";import{SwapKitError as M0}from"@swapkit/helpers";import{Script as D0}from"@swapkit/utxo-signer";var g1=1000,oX=10,uX=2,C0=10,H0=41,O0=107;function R(X){let $=new Uint8Array(Buffer.from(X,"utf8"));return D0.encode(["RETURN",$])}var pX;((J)=>{J.P2PKH="P2PKH";J.P2WPKH="P2WPKH"})(pX||={});var cX={["P2PKH"]:148,["P2WPKH"]:68},vX={["P2PKH"]:34,["P2WPKH"]:31},DX=(X)=>{if(X.startsWith("bc1")||X.startsWith("tb1")||X.startsWith("ltc1")||X.startsWith("tltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("m")||X.startsWith("n")||X.startsWith("bitcoincash:q")||X.startsWith("bitcoincash:p")||X.startsWith("q")||X.startsWith("p")||X.startsWith("L")||X.startsWith("M")||X.startsWith("3")||X.startsWith("D")||X.startsWith("A")||X.startsWith("9")||X.startsWith("X")||X.startsWith("7")||X.startsWith("y")||X.startsWith("t1")||X.startsWith("t3")||X.startsWith("tm"))return"P2PKH";throw new M0("toolbox_utxo_invalid_address",{address:X})},YX=({inputs:X,outputs:$,feeRate:J})=>{let j=X[0]&&"address"in X[0]&&X[0].address?DX(X[0].address):"P2PKH",Z=(J?X.filter((G)=>G.value>=cX["type"in G&&G.type?G.type:"P2PKH"]*Math.ceil(J)):X).reduce((G,U)=>G+s(U),0),z=$?.reduce((G,U)=>G+SX(U),0)||vX[j],Y=oX+Z+z;return j==="P2WPKH"?Math.ceil(Y+uX/4):Y},s=(X)=>{if("type"in X&&X.type)return cX[X.type];if("address"in X&&X.address)return cX[DX(X.address)];return H0+O0},SX=(X,$)=>{if(X?.script)return C0+X.script.length+(X.script.length>=74?2:1);if($)return vX[$];if("address"in X&&X.address)return vX[DX(X.address)];return vX.P2PKH};function CX(X){switch(X){case a.Bitcoin:case a.BitcoinCash:return 550;case a.Dash:case a.Litecoin:return 5500;case a.Dogecoin:return 1e5;case a.Zcash:return 546;default:throw new dX("toolbox_utxo_not_supported",{chain:X})}}function v({inputs:X,outputs:$,feeRate:J=1,chain:j=a.Bitcoin,changeAddress:Q="",sweep:Z=!1}){let z=CX(j),Y=X.filter((D)=>{let b=s(D)*J;return Z?D.value>Math.max(b,z):b<=D.value});if(Z){let D=Math.ceil(J*YX({inputs:Y,outputs:$})),b=Y.reduce((y,l)=>y+l.value,0),u=b-D;if(u<=z)throw new dX("toolbox_sweep_amount_too_low",{available:b,dustThreshold:z,fee:D});let p=$.findIndex((y)=>("address"in y)&&y.address);if(p===-1)throw new dX("toolbox_utxo_invalid_params",{error:"Sweep requires a recipient output"});return{fee:D,inputs:Y,outputs:$.map((y,l)=>l===p?{...y,value:u}:y)}}let U=(X[0]&&"address"in X[0]&&X[0].address?DX(X[0].address):"P2PKH")==="P2WPKH"?Math.ceil(uX/4):0,W=oX+U+$.reduce((D,b)=>D+SX(b),0),L=$.reduce((D,b)=>D+b.value,0),B=W*J,_=0,C=[];for(let D of Y){let b=s(D),u=J*b;B+=u,_+=D.value,C.push(D);let p=B+L;if(_<p)continue;let y=_-p,l=J*SX({address:Q,value:0});if(y>l){let VX=l+B,bX=_-(L+Math.ceil(VX));if(bX>Math.max(s({value:0})*J,CX(j)))return{fee:Math.ceil(VX),inputs:C,outputs:$.concat({address:Q,value:bX})}}return{fee:Math.ceil(B),inputs:C,outputs:$}}return{fee:Math.ceil(J*YX({inputs:X,outputs:$}))}}import{Chain as WX,SwapKitError as O1}from"@swapkit/helpers";import{hex as E2}from"@scure/base";import{Chain as g0,derivationPathToString as l0,FeeOption as x0,NetworkDerivationPath as h0,SwapKitError as h,updateDerivationPath as c0}from"@swapkit/helpers";import{BCHSigHash as o0,CashAddrPrefix as F2,CashAddrType as f2,encodeCashAddr as y2,NETWORKS as u0,p2pkh as A2,Transaction as R2}from"@swapkit/utxo-signer";import{secp256k1 as k0}from"@noble/curves/secp256k1.js";import{hex as e}from"@scure/base";import{HDKey as M2}from"@scure/bip32";import{mnemonicToSeedSync as iX}from"@scure/bip39";import{AssetValue as rX,applyFeeMultiplier as W2,Chain as I,derivationPathToString as OX,FeeOption as S,NetworkDerivationPath as D2,SwapKitError as V,SwapKitNumber as V0,updateDerivationPath as b0,warnOnce as I0}from"@swapkit/helpers";import{Address as P0,BCHSigHash as sX,CashAddrPrefix as T0,CashAddrType as E0,encodeCashAddr as F0,NETWORKS as LX,p2pkh as B2,p2wpkh as f0,RBF_SEQUENCE as y0,SigHash as C2,Transaction as nX,WIF as H2}from"@swapkit/utxo-signer";import{match as O2}from"ts-pattern";import{validateZcashAddress as HX}from"@swapkit/utxo-signer";function qX(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function t(X){let $=qX(X);return z2($)&&U2($)==="mainnet"}var KX=[I.Dash,I.Dogecoin,I.Zcash,I.BitcoinCash],wX=[I.Bitcoin];function k2({address:X,chain:$}){return O2($).with(I.BitcoinCash,()=>t(X)).with(I.Zcash,()=>HX(X)).otherwise(()=>{try{return P0(F($)).decode(X),!0}catch{return!1}})}function F(X){return O2(X).with(I.Bitcoin,()=>LX.bitcoin).with(I.BitcoinCash,()=>LX.bitcoinCash).with(I.Dash,()=>LX.dash).with(I.Dogecoin,()=>LX.dogecoin).with(I.Litecoin,()=>LX.litecoin).with(I.Zcash,()=>LX.zcash).exhaustive()}function A0({phrase:X,derivationPath:$,network:J,seed:j}){let Q=j??iX(X),z=M2.fromMasterSeed(Q,J.bip32).derive($);if(!z.privateKey)throw new V("toolbox_utxo_invalid_params",{error:"Could not derive private key from phrase"});return z.privateKey}function _2(X){return k0.getPublicKey(X,!0)}function kX({publicKey:X,chain:$,network:J}){if($===I.BitcoinCash){let Z=B2(X,J);if(!Z.hash)throw new V("toolbox_utxo_invalid_address",{error:"Could not derive BCH address hash"});return F0({hash:Z.hash,prefix:T0.MAINNET,type:E0.P2PKH}).replace(/^bitcoincash:/,"")}let Q=!KX.includes($)?f0(X,J):B2(X,J);if(!Q.address)throw new V("toolbox_utxo_invalid_address",{error:"Could not derive address"});return Q.address}function zX({phrase:X,derivationPath:$,chain:J,wif:j,seed:Q}){let Z=F(J);if(j){let G=H2(Z).decode(j),U=_2(G);return{privateKey:G,publicKey:U}}if(!X)throw new V("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let z=$||OX(D2[J]),Y=A0({derivationPath:z,network:Z,phrase:X,seed:Q}),q=_2(Y);return{privateKey:Y,publicKey:q}}function R0(X,$){return H2(F($)).encode(X)}function v0({phrase:X,derivationPath:$,chain:J,seed:j}){let Q=$.split("/");if(Q.length<4)throw new V("toolbox_utxo_invalid_params",{error:`Derivation path must have at least 4 levels (got ${Q.length}): ${$}`});let Z=F(J),z=j??iX(X),Y=M2.fromMasterSeed(z,Z.bip32),q=Q.slice(0,4).join("/");return Y.derive(q)}function XX({inputs:X,outputs:$,chain:J,tx:j,sender:Q,compiledMemo:Z,enableRBF:z=!1}){let Y=F(J),q=!KX.includes(J),G=z?y0:void 0,U=new Set;for(let W of X){let L=`${W.hash}:${W.index}`;if(U.has(L))throw new V("toolbox_utxo_invalid_params",{error:"Duplicate input detected"});U.add(L);let B=typeof W.hash==="string"?e.decode(W.hash):W.hash;if(q&&W.witnessUtxo)j.addInput({index:W.index,sequence:G,txid:B,witnessUtxo:{amount:BigInt(W.witnessUtxo.value),script:W.witnessUtxo.script}});else if(W.txHex)j.addInput({index:W.index,nonWitnessUtxo:e.decode(W.txHex),sequence:G,txid:B,...J===I.BitcoinCash?{sighashType:sX.ALL}:{}});else throw new V("toolbox_utxo_invalid_params",{error:"Input requires either witnessUtxo or txHex for non-segwit chains"})}for(let W of $){let L="address"in W&&W.address?W.address:Q;if(J===I.BitcoinCash)L=o(L);if(W.script){if(Z)j.addOutput({amount:0n,script:Z})}else j.addOutputAddress(L,BigInt(W.value),Y)}return{inputs:X,tx:j}}async function UX(X){let $=await P(X).getSuggestedTxFee();return{[S.Average]:$,[S.Fast]:W2($,S.Fast),[S.Fastest]:W2($,S.Fastest)}}async function V2({assetValue:X,recipient:$,memo:J,sender:j,sweep:Q,fetchTxHex:Z=!1},z){let Y=X.chain,q=Z||KX.includes(Y),G=X.getBaseValue("number"),U=Q?void 0:z??(await UX(Y))[S.Fastest],W=Q||U===void 0?void 0:Math.ceil(G+U*5000);return{inputs:await P(Y).getUtxos({address:j,fetchTxHex:q,targetValue:W}),outputs:[{address:$,value:Q?0:G},...J?[{address:"",script:R(J),value:0}]:[]]}}async function b2({assetValue:X,recipient:$,memo:J,feeRate:j,sender:Q,fetchTxHex:Z=!1,enableRBF:z=!1,sweep:Y}){let q=X.chain,G=J?R(J):null,U=await V2({assetValue:X,fetchTxHex:Z,memo:J,recipient:$,sender:Q,sweep:Y},j),{inputs:W,outputs:L}=v({...U,chain:q,feeRate:j,sweep:Y});if(!(W&&L))throw new V("toolbox_utxo_insufficient_balance",{assetValue:X,sender:Q});let B=new nX({allowLegacyWitnessUtxo:!0,allowUnknownOutputs:!!G,version:1}),{inputs:_,tx:C}=XX({chain:q,compiledMemo:G,enableRBF:z,inputs:W,outputs:L,sender:Q,tx:B});return{inputs:_,tx:C,utxos:U.inputs}}async function I2({assetValue:X,feeOptionKey:$=S.Fast,feeRate:J,memo:j,sender:Q,recipient:Z,sweep:z}){let Y=X.chain,q,G;if(J!==void 0)q=J,G=Math.floor(J);else{let W=await UX(Y);q=W[S.Fastest],G=W[$]}let U=await V2({assetValue:X,memo:j,recipient:Z,sender:Q,sweep:z},q);return v({...U,chain:Y,feeRate:G,sweep:z})}function S0(X){return async function({from:J,memo:j,feeRate:Q,feeOptionKey:Z=S.Fast,recipient:z=J,recipients:Y=1}){let q=Q??(await UX(X))[Z],U=(await P(X).getUtxos({address:J,fetchTxHex:!1})).filter((C)=>C.value>Math.max(CX(X),s(C)*q));if(!U.length)return rX.from({chain:X});let W=typeof Y==="number"?Math.max(Y,1):Y.length,L=typeof Y==="number"||W===0?Array.from({length:W||1},()=>({address:z,value:0})):[...Y];if(j)L.push({address:J,script:R(j),value:0});let{outputs:B}=v({chain:X,feeRate:q,inputs:U,outputs:L,sweep:!0}),_=B?.[0]?.value??0;return rX.from({chain:X,value:BigInt(_)})}}function w0(X){return async function(J){let{fee:j}=await I2(J);return rX.from({chain:X,value:V0.fromBigInt(BigInt(j),8).getValue("string")})}}function K0({chain:X,phrase:$,derivationPath:J,seed:j}){let Q=F(X),{privateKey:Z,publicKey:z}=zX({chain:X,derivationPath:J,phrase:$,seed:j}),Y=X===I.BitcoinCash?[sX.ALL]:[C2.ALL];return{getAddress:()=>kX({chain:X,network:Q,publicKey:z}),privateKey:Z,publicKey:z,signTransaction:(q)=>{return q.sign(Z,Y),q}}}function m0(X,$){return async function({memo:j,recipient:Q,feeOptionKey:Z,feeRate:z,assetValue:Y,enableRBF:q=!1,sweep:G}){let U=await $?.getAddress();if(!($&&U))throw new V("toolbox_utxo_no_signer");if(!Q)throw new V("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});I0({condition:q&&!wX.includes(X),id:`rbf_not_supported_${X}`,warning:`RBF (Replace-by-Fee) is not reliably supported on ${X}. Transaction will be created without RBF signaling.`});let W=q&&wX.includes(X),L=z||(await UX(X))[Z||S.Fast],{tx:B}=await b2({assetValue:Y,enableRBF:W,feeRate:L,memo:j,recipient:Q,sender:U,sweep:G}),_=await $.signTransaction(B);return _.finalize(),P(X).broadcastTx(e.encode(_.extract()))}}function P2(X){return($)=>k2({address:$,chain:X})}function T2(X){let $=F(X);return function(j){if(!j)throw new V("toolbox_utxo_invalid_params",{error:"Keys must be provided"});return kX({chain:X,network:$,publicKey:j.publicKey})}}function $X({chain:X,...$}){let J="phrase"in $?$.phrase:void 0,j="index"in $?$.index||0:0,Q=J?iX(J):void 0,Z="derivationPath"in $&&$.derivationPath?$.derivationPath:b0(D2[X],{index:j}),z=OX(Z),Y=J?K0({chain:X,derivationPath:z,phrase:J,seed:Q}):void 0,q="signer"in $?$.signer:void 0,G=Y||q,U=J?zX({chain:X,derivationPath:z,phrase:J,seed:Q}):void 0;function W(){if(G)return G.getAddress();return Promise.resolve(void 0)}function L(N){if(!J)return;let M=n({accountIndex:N,chain:X,derivationPath:Z});return v0({chain:X,derivationPath:OX(M),phrase:J,seed:Q})}let B=L();function _(){if(!B)return;return B.publicExtendedKey}function C({accountIndex:N}={}){let M=N===void 0?B:L(N);if(!M)return;let H=n({accountIndex:N,chain:X,derivationPath:Z});return{accountIndex:ZX(H),path:OX(H),xpub:M.publicExtendedKey}}function D({accountIndex:N,index:M,change:H=!1}){let O=N===void 0?B:L(N);if(!O)return;let k=NX({accountIndex:N,chain:X,change:H,derivationPath:Z,index:M}),A=F(X),w=O.deriveChild(Number(H)).deriveChild(M);if(!w.publicKey)throw new V("toolbox_utxo_invalid_params",{error:"Could not derive public key"});let f=kX({chain:X,network:A,publicKey:w.publicKey}),c=e.encode(w.publicKey);return{accountIndex:ZX(k),address:f,change:H,index:M,path:OX(k),pubkey:c}}async function b(N){if(!wX.includes(X))return{reason:`RBF is not supported on ${X}`,supported:!1};let M=await P(X).getTransactionDetails(N);return{canReplace:M.isRBF&&!M.confirmed,confirmed:M.confirmed,enabled:M.isRBF,fee:M.fee,sequences:M.sequences,supported:!0}}async function u({txid:N,newFeeRate:M,recipient:H,memo:O}){if(!wX.includes(X))throw new V("toolbox_utxo_rbf_not_supported",{chain:X});let k=await P(X).getTransactionDetails(N);if(!k.isRBF)throw new V("toolbox_utxo_tx_not_replaceable",{txid:N});if(k.confirmed)throw new V("toolbox_utxo_tx_already_confirmed",{blockId:k.blockId,txid:N});let A=k.inputs.reduce((E,x)=>E+x.value,0),f=k.outputs.find((E)=>E.recipient===H)?.value||0;if(f===0)throw new V("toolbox_utxo_invalid_params",{error:"Could not determine send amount from original transaction"});let c=await Promise.all(k.inputs.map(async(E)=>{let x=await P(X).getRawTx(E.transaction_hash);return{hash:E.transaction_hash,index:E.index,txHex:x,value:E.value,witnessUtxo:void 0}})),BX=O?R(O):null,IX=YX({feeRate:M,inputs:c.map((E)=>({...E,type:"P2WPKH"})),outputs:[{address:H,value:f}]}),d=Math.ceil(IX*M);if(d<=k.fee)throw new V("toolbox_utxo_rbf_fee_too_low",{newFee:d,originalFee:k.fee});let jX=d-k.fee,QX=f-jX;if(QX<=0)throw new V("toolbox_utxo_rbf_insufficient_change");let r=new nX({allowLegacyWitnessUtxo:!0,version:1}),PX=[{address:H,value:QX},...O?[{address:"",script:R(O),value:0}]:[]],TX=A-QX-d,_X=await W();if(TX>CX(X)&&_X)PX.push({address:_X,value:TX});return XX({chain:X,compiledMemo:BX,inputs:c,outputs:PX,sender:_X||H,tx:r}),{feeDelta:jX,newFee:d,originalFee:k.fee,tx:r}}async function p({txid:N,newFeeRate:M,recipient:H,memo:O}){let{tx:k,originalFee:A,newFee:w}=await u({memo:O,newFeeRate:M,recipient:H,txid:N}),f=await lX(k);f.finalize();let c=await P(X).broadcastTx(e.encode(f.extract()));return{newFee:w,originalFee:A,txid:c}}function y({accountIndex:N,index:M,change:H=!1}){K("index",M);let O=N===void 0?B:L(N);if(!O)return;return O.deriveChild(Number(H)).deriveChild(M).privateKey||void 0}function l({tx:N,inputDerivations:M}){if(!B)throw new V("toolbox_utxo_no_signer");let H=X===I.BitcoinCash?[sX.ALL]:[C2.ALL];for(let O=0;O<M.length;O++){let k=M[O];if(!k)continue;let{derivationIndex:A,isChange:w}=k,f=y({change:w,index:A});if(!f)throw new V("toolbox_utxo_invalid_params",{error:`Could not derive private key for input ${O} at index ${A}`});N.signIdx(f,O,H)}return N}async function VX({utxos:N,recipient:M,assetValue:H,memo:O,feeRate:k,feeOptionKey:A,changeAddress:w,sweep:f}){if(f)throw new V("toolbox_utxo_invalid_params",{error:"Sweep is not supported for transfers from multiple addresses"});if(!B)throw new V("toolbox_utxo_no_signer");let c=k||(await UX(X))[A||S.Fast],BX=O?R(O):null,IX=[{address:M,value:H.getBaseValue("number")}];if(BX)IX.push({address:"",script:BX,value:0});let d=N.map(({hash:E,index:x,value:EX,txHex:o2,witnessUtxo:xX})=>({hash:E,index:x,txHex:o2,value:EX,witnessUtxo:xX?{script:xX.script,value:xX.value}:void 0})),{inputs:jX,outputs:QX}=v({chain:X,feeRate:c,inputs:d,outputs:IX});if(!(jX&&QX))throw new V("toolbox_utxo_insufficient_balance",{assetValue:H,sender:"multiple addresses"});let r=new nX({allowLegacyWitnessUtxo:!0,version:1}),PX=N[0]?.address,TX=w||await W()||PX||M;XX({chain:X,compiledMemo:BX,inputs:jX,outputs:QX,sender:TX,tx:r});let _X=jX.map((E)=>{let x=N.find((EX)=>EX.hash===E.hash&&EX.index===E.index);return x?{derivationIndex:x.derivationIndex,isChange:x.isChange}:{derivationIndex:0,isChange:!1}});return l({inputDerivations:_X,tx:r}),r.finalize(),P(X).broadcastTx(e.encode(r.extract()))}function bX({address:N,gapLimit:M=20}){if(!B)return;for(let H=0;H<M;H++){let O=D({change:!1,index:H}),k=D({change:!0,index:H}),A=O?.address===N?!1:k?.address===N;if(O?.address===N||k?.address===N)return{change:A,index:H}}return}function lX(N){if(!G)throw new V("toolbox_utxo_no_signer");return G.signTransaction(N)}async function c2(N){let M=await lX(N);return M.finalize(),await P(X).broadcastTx(e.encode(M.extract()))}return{accumulative:v,broadcastTx:(N)=>P(X).broadcastTx(N),bumpFee:p,calculateTxSize:YX,createKeysForPath:(N)=>zX({...N,chain:X}),createReplacementTransaction:u,createTransaction:b2,deriveAddressAtIndex:D,derivePrivateKeyAtIndex:y,estimateMaxSendableAmount:S0(X),estimateTransactionFee:w0(X),getAddress:W,getAddressFromKeys:T2(X),getBalance:N2(X),getExtendedPublicKey:_,getExtendedPublicKeyInfo:C,getFeeRates:()=>UX(X),getInputsOutputsFee:I2,getNetworkForChain:()=>F(X),getPrivateKeyFromMnemonic:(N)=>R0(zX({...N,chain:X}).privateKey,X),isRBFEnabled:b,keys:U,resolveDerivationIndex:bX,signAndBroadcastTransaction:c2,signTransaction:lX,signTransactionWithMultipleKeys:l,transfer:m0(X,G),transferFromMultipleAddresses:VX,validateAddress:P2(X)}}var g=g0.BitcoinCash;function mX(X){return qX(AX(X))}function p0(X){let $=F(g);function J(Q){return Q.sign(X.privateKey,[o0.ALL]),Q}function j(){let Q=A2(X.publicKey,$);if(!Q.hash)throw new h("toolbox_utxo_invalid_address",{error:"Could not derive BCH address hash"});let Z=y2({hash:Q.hash,prefix:F2.MAINNET,type:f2.P2PKH});return Promise.resolve(Z.replace(/^bitcoincash:/,""))}return{getAddress:j,signTransaction:J}}function v2(X){let $="phrase"in X?X.phrase:void 0,J="index"in X?X.index||0:0,j=l0("derivationPath"in X&&X.derivationPath?X.derivationPath:c0(h0[g],{index:J})),Q=$?zX({chain:g,derivationPath:j,phrase:$}):void 0,Z=Q?p0(Q):("signer"in X)?X.signer:void 0;function z(){return Promise.resolve(Z?.getAddress())}let{getBalance:Y,getFeeRates:q,broadcastTx:G,...U}=$X({chain:g});function W(_,C=!0){return Y(qX(AX(_)))}function L(_){if(!Z)throw new h("toolbox_utxo_no_signer");return Z.signTransaction(_)}async function B(_){let C=await L(_);return C.finalize(),await G(E2.encode(C.extract()))}return{...U,broadcastTx:G,buildTx:r0,createTransaction:S2,getAddress:z,getAddressFromKeys:n0,getBalance:W,getFeeRates:q,signAndBroadcastTransaction:B,signTransaction:L,stripPrefix:qX,stripToCashAddress:mX,transfer:d0({broadcastTx:G,getFeeRates:q,signer:Z}),validateAddress:t}}async function S2({assetValue:X,recipient:$,memo:J,feeRate:j,sender:Q,sweep:Z}){if(!t($))throw new h("toolbox_utxo_invalid_address",{address:$});let z=Math.ceil(X.getBaseValue("number")+j*7500),Y=await P(g).getUtxos({address:mX(Q),fetchTxHex:!0,targetValue:Z?void 0:z}),q=J?R(J):null,G=[],U=o($);if(G.push({address:U,value:Z?0:X.getBaseValue("number")}),q)G.push({script:q,value:0});let{inputs:W,outputs:L}=v({chain:g,feeRate:j,inputs:Y,outputs:G,sweep:Z});if(!(W&&L))throw new h("toolbox_utxo_insufficient_balance",{assetValue:X,sender:Q});let B=new R2({allowLegacyWitnessUtxo:!0,allowUnknownOutputs:!!q,version:1}),_=o(Q),{inputs:C,tx:D}=XX({chain:g,compiledMemo:q,inputs:W,outputs:L.map((b)=>("address"in b)&&b.address?{...b,address:o(b.address)}:b),sender:_,tx:B});return{inputs:C,tx:D,utxos:W}}function d0({broadcastTx:X,getFeeRates:$,signer:J}){return async function({recipient:Q,assetValue:Z,feeOptionKey:z=x0.Fast,sweep:Y,...q}){let G=await J?.getAddress();if(!(J&&G))throw new h("toolbox_utxo_no_signer");if(!Q)throw new h("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let U=q.feeRate||(await $())[z],{tx:W}=await S2({...q,assetValue:Z,feeRate:U,recipient:Q,sender:G,sweep:Y}),L=await J.signTransaction(W);return L.finalize(),X(E2.encode(L.extract()))}}async function r0({assetValue:X,recipient:$,memo:J,feeRate:j,sender:Q}){let Z=AX($);if(!t(Z))throw new h("toolbox_utxo_invalid_address",{address:Z});let z=Math.ceil(X.getBaseValue("number")+j*7500),Y=await P(g).getUtxos({address:mX(Q),fetchTxHex:!0,targetValue:z}),q=Number(j.toFixed(0)),G=J?R(J):null,U=[];if(U.push({address:o($),value:X.getBaseValue("number")}),G)U.push({script:G,value:0});let{inputs:W,outputs:L}=v({chain:g,feeRate:q,inputs:Y,outputs:U});if(!(W&&L))throw new h("toolbox_utxo_insufficient_balance",{assetValue:X,sender:Q});let B=new R2({allowLegacyWitnessUtxo:!0,allowUnknownOutputs:!!G,version:1}),{inputs:_,tx:C}=XX({chain:g,compiledMemo:G,inputs:W,outputs:L,sender:o(Q),tx:B});return{inputs:_,tx:C,utxos:Y}}function n0(X){let $=u0.bitcoinCash,J=A2(X.publicKey,$);if(!J.hash)throw new h("toolbox_utxo_invalid_address",{error:"Could not derive BCH address hash"});return y2({hash:J.hash,prefix:F2.MAINNET,type:f2.P2PKH}).replace(/^bitcoincash:/,"")}import{createBase58check as i0,hex as s0}from"@scure/base";import{HDKey as m2}from"@scure/bip32";import{mnemonicToSeedSync as g2}from"@scure/bip39";import{Chain as gX,derivationPathToString as a0,FeeOption as t0,NetworkDerivationPath as e0,SKConfig as l2,SwapKitError as JX,updateDerivationPath as X1}from"@swapkit/helpers";import{Address as $1,createZcashTransaction as J1,isTransparentZcashAddress as w2,OutScript as j1,PCZT as Q1,utils as x2,WIF as Z1,ZCASH_NETWORK as G1,ZCASH_TEST_NETWORK as Y1,ZcashConsensusBranchId as q1,ZcashPSBT as L1,ZcashSigHash as aX,ZcashVersionGroupId as z1}from"@swapkit/utxo-signer";import{match as U1,P as tX}from"ts-pattern";function eX(){let{isStagenet:X}=l2.get("envs");return X?Y1:G1}var W1=i0(x2.sha256);function B1(X){return W1.encode(X)}function _1({phrase:X,derivationPath:$}){let J=g2(X),Q=m2.fromMasterSeed(J).derive($);if(!Q.privateKey||!Q.publicKey)throw new JX("toolbox_utxo_invalid_params");let{privateKey:Z,publicKey:z}=Q,Y=x2.hash160(z),{isStagenet:q}=l2.get("envs"),G=q?new Uint8Array([29,37]):new Uint8Array([28,184]),U=new Uint8Array(G.length+Y.length);U.set(G,0),U.set(Y,G.length);let W=B1(U);return{getAddress:()=>Promise.resolve(W),signTransaction:(L)=>{if(L instanceof L1){let B=L.toPCZT();return B.signAllInputs(Z,z,aX.ALL),B.finalizeAllInputs(),Promise.resolve(B.extract())}if(L instanceof Q1)return L.signAllInputs(Z,z,aX.ALL),L.finalizeAllInputs(),Promise.resolve(L.extract());return L.signAllInputs(Z,z,aX.ALL),Promise.resolve(L)}}}function N1({inputs:X,outputs:$,tx:J,sender:j,compiledMemo:Q}){let Z=eX();for(let z of X){let Y=$1(Z).decode(j),q=j1.encode(Y);J.addInput({index:z.index,script:q,sequence:4294967295,txid:s0.decode(z.hash),value:BigInt(z.value)})}for(let z of $){let Y="address"in z&&z.address?z.address:j,q=z.script;if(q&&!Q)continue;if(q&&Q)J.addOutput({amount:0n,script:Q});else J.addOutputAddress(Y,BigInt(z.value),Z)}return{inputs:X,tx:J}}async function K2(X){let{assetValue:$,recipient:J,memo:j,feeRate:Q,sender:Z,fetchTxHex:z,sweep:Y}=X,q=eX();if(!w2(Z,q))throw new JX("toolbox_utxo_invalid_address",{address:Z});if(!w2(J,q))throw new JX("toolbox_utxo_invalid_address",{address:J,error:"Zcash transaction creation currently supports transparent addresses only"});let G=j?R(j):null,U=await P(gX.Zcash).getUtxos({address:Z,fetchTxHex:z!==!1}),W=[{address:J,value:Y?0:Number($.getBaseValue("string"))},...G?[{script:G,value:0}]:[]],{inputs:L,outputs:B}=v({chain:gX.Zcash,changeAddress:Z,feeRate:Q,inputs:U,outputs:W,sweep:Y});if(!(L&&B))throw new JX("toolbox_utxo_insufficient_balance",{assetValue:$,sender:Z});let _=J1({consensusBranchId:q1.NU6_2,expiryHeight:0,lockTime:0,version:4,versionGroupId:z1.SAPLING}),{tx:C,inputs:D}=N1({compiledMemo:G,inputs:L,outputs:B,sender:Z,tx:_});return{inputs:D,outputs:B,tx:C}}function h2(X){let $=U1(X).with({signer:tX.not(tX.nullish)},({signer:q})=>q).with({phrase:tX.string},({phrase:q,derivationPath:G,index:U=0})=>{let W=G||e0[gX.Zcash]||[44,133,0,0,0],L=X1(W,{index:U}),B=a0(L);return _1({derivationPath:B,phrase:q})}).otherwise(()=>{return}),J=$X({chain:gX.Zcash,signer:$});async function j(q){if(!$)throw new JX("toolbox_utxo_no_signer");return await $.signTransaction(q)}async function Q(q){let G=await j(q);return J.broadcastTx(G.toHex())}async function Z({recipient:q,assetValue:G,feeOptionKey:U=t0.Fast,sweep:W,...L}){let B=await $?.getAddress();if(!($&&B))throw new JX("toolbox_utxo_no_signer");let _=L.feeRate||(await J.getFeeRates())[U],{tx:C}=await K2({...L,assetValue:G,feeRate:_,recipient:q,sender:B,sweep:W}),b=(await $.signTransaction(C)).toHex();return J.broadcastTx(b)}function z({phrase:q,derivationPath:G="m/44'/133'/0'/0/0"}){let U=g2(q),L=m2.fromMasterSeed(U).derive(G);if(!L.privateKey||!L.publicKey)throw new JX("toolbox_utxo_invalid_params");return{privateKey:L.privateKey,publicKey:L.publicKey}}function Y({phrase:q,derivationPath:G="m/44'/133'/0'/0/0"}){let U=z({derivationPath:G,phrase:q}),W=eX();return Z1(W).encode(U.privateKey)}return{...J,createKeysForPath:z,createTransaction:K2,getPrivateKeyFromMnemonic:Y,signAndBroadcastTransaction:Q,signTransaction:j,transfer:Z,validateAddress:HX}}import{hex as M1}from"@scure/base";import{HDKey as D1}from"@scure/bip32";import{derivationPathToString as C1}from"@swapkit/helpers";function H1({xpub:X,chain:$,count:J,startIndex:j=0,accountIndex:Q}){if(K("count",J),J<1)throw RangeError("count must be at least 1");K("startIndex",j);let Z=F($),z=D1.fromExtendedKey(X,Z.bip32),Y=n({accountIndex:Q,chain:$}),q=ZX(Y),G=[];for(let U of[!1,!0]){let W=z.deriveChild(Number(U));for(let L=0;L<J;L++){let B=j+L,_=W.deriveChild(B);if(!_.publicKey)continue;let C=NX({accountIndex:Q,chain:$,change:U,index:B});G.push({accountIndex:q,address:kX({chain:$,network:Z,publicKey:_.publicKey}),change:U,index:B,path:C1(C),pubkey:M1.encode(_.publicKey)})}}return G}function K8(X,$){switch(X){case WX.BitcoinCash:return v2($||{});case WX.Zcash:return h2($);case WX.Bitcoin:case WX.Dogecoin:case WX.Litecoin:case WX.Dash:return $X({chain:X,...$});default:throw new O1("toolbox_utxo_not_supported",{chain:X})}}export{HX as validateZcashAddress,k2 as validateUtxoAddress,t as validateBchAddress,o as toLegacyAddress,AX as toCashAddress,mX as stripToCashAddress,qX as stripPrefix,KX as nonSegwitChains,z2 as isValidAddress,K8 as getUtxoToolbox,E1 as getUtxoNetwork,P as getUtxoApi,P2 as getUTXOAddressValidator,NX as getUTXOAddressPath,n as getUTXOAccountPath,ZX as getUTXOAccountIndexFromPath,DX as getScriptTypeForAddress,SX as getOutputSize,F as getNetworkForChain,s as getInputSize,CX as getDustThreshold,U2 as detectAddressNetwork,H1 as deriveAddressesFromXpub,h2 as createZcashToolbox,$X as createUTXOToolbox,p2 as createHDWalletHelpers,T1 as createCustomUtxoApi,v2 as createBCHToolbox,R as compileMemo,YX as calculateTxSize,K as assertDerivationIndex,T2 as addressFromKeysGetter,XX as addInputsAndOutputs,v as accumulative,L2 as UtxoNetwork,pX as UTXOScriptType,oX as TX_OVERHEAD,uX as SEGWIT_MARKER_FLAG_WEIGHT,vX as OutputSizes,C0 as OP_RETURN_OVERHEAD,g1 as MIN_TX_FEE,cX as InputSizes};
1
+ import{ea as j2,fa as M2}from"../../chunk-nvfkjbyq.js";import"../../chunk-xbdjxeqd.js";import{NetworkDerivationPath as p2}from"@swapkit/helpers";function m(X,$){if(!Number.isInteger($)||$<0)throw RangeError(`${X} must be a non-negative integer, got: ${$}`)}function n({accountIndex:X,chain:$,derivationPath:J}){if(X!==void 0)m("accountIndex",X);let j=[...J?.slice(0,3)??p2[$].slice(0,3)];if(X!==void 0)j[2]=X;return j}function MX({accountIndex:X,change:$=!1,chain:J,derivationPath:j,index:Q}){return m("index",Q),[...n({accountIndex:X,chain:J,derivationPath:j}),Number($),Q]}function ZX(X){return X[2]??0}function d2({deriveAddress:X,getBalance:$,getUtxos:J}){async function j(Y){let{accountIndex:q,count:G,startIndex:W=0,change:U=!1}=Y;if(m("count",G),G<1)throw RangeError("count must be at least 1");m("startIndex",W);let L=[];for(let _=0;_<G;_++){let N=await X({accountIndex:q,change:U,index:W+_});if(N)L.push(N)}return L}async function Q(Y){let{gapLimit:q=20,change:G=!1}=Y??{},W=[],U=0,L=0;while(U<q){let _=await X({change:G,index:L});if(!_)break;if((await $(_.address)).some((D)=>D.getValue("number")>0))W.push(_),U=0;else U++;L++}return W}async function Z(Y=20){let[q,G]=await Promise.all([Q({change:!1,gapLimit:Y}),Q({change:!0,gapLimit:Y})]),W=[...q,...G],U=await Promise.all(W.map(async(_)=>{let H=(await $(_.address)).reduce((D,b)=>D+b.getValue("number"),0);return{..._,balance:H}})),L=U.reduce((_,N)=>_+N.balance,0);return{addresses:U,total:L}}async function z(Y=20){let[q,G]=await Promise.all([Q({change:!1,gapLimit:Y}),Q({change:!0,gapLimit:Y})]),W=[...q,...G];return(await Promise.all(W.map(async(L)=>{return(await J(L.address)).map((N)=>({...N,address:L.address,derivationIndex:L.index,isChange:L.change}))}))).flat()}return{deriveAddresses:j,getAggregatedBalance:Z,getAggregatedUtxos:z,scanForAddresses:Q}}import{Chain as T,getRPCUrl as r2,RequestClient as AX,SKConfig as n2,SwapKitError as v,warnOnce as i2}from"@swapkit/helpers";import{NETWORKS as GX}from"@swapkit/utxo-signer";async function s2({chain:X,txHash:$}){let J=`${YX(X)}/push/transaction`,j=JSON.stringify({data:$});try{let Q=await AX.post(J,{body:j,headers:{"Content-Type":"application/json"}});if(Q.context.code!==200)throw new v("toolbox_utxo_broadcast_failed",{error:Q.context.error||"Transaction broadcast failed"});return Q.data?.transaction_hash||$}catch(Q){let Z=await r2(X);if(Z){let z=JSON.stringify({id:j2(),jsonrpc:"2.0",method:"sendrawtransaction",params:[$]}),Y=await AX.post(Z,{body:z,headers:{"Content-Type":"application/json"}});if(Y.error)throw new v("toolbox_utxo_broadcast_failed",{error:Y.error?.message});if(Y.result.includes('"code":-26'))throw new v("toolbox_utxo_invalid_transaction",{error:"Transaction amount was too low"});return Y.result}throw Q}}function YX(X){return`https://api.blockchair.com/${a2(X)}`}function $2(X){switch(X){case T.Bitcoin:return 5;case T.Dogecoin:return 1e4;case T.Litecoin:return 1;case T.Zcash:return 1;default:return 2}}function a2(X){switch(X){case T.BitcoinCash:return"bitcoin-cash";case T.Litecoin:return"litecoin";case T.Dash:return"dash";case T.Dogecoin:return"dogecoin";case T.Zcash:return"zcash";case T.Polkadot:return"polkadot";default:return"bitcoin"}}async function t2(X){try{let{feePerKb:$}=await AX.get(`https://app.bitgo.com/api/v2/${X.toLowerCase()}/tx/fee`),J=$/1000;return Math.max(J,$2(X))}catch{return $2(X)}}async function DX(X,$){let J=await AX.get(`${X}${$?`${X.includes("?")?"&":"?"}key=${$}`:""}`);if(!J||J.context.code!==200)throw new v("toolbox_utxo_api_error",{error:`Failed to query ${X}`});return J.data}async function e2({chain:X,apiKey:$}){let J=await DX(`${YX(X)}/stats`,$);if(typeof J.best_block_height!=="number")throw new v("toolbox_utxo_api_error",{error:"Missing best_block_height in stats response"});return J.best_block_height}async function Q2({address:X,chain:$,apiKey:J}){if(!X)throw new v("toolbox_utxo_invalid_params",{error:"Address is required"});try{return(await DX(`${YX($)}/dashboards/address/${X}?transaction_details=true`,J))[X]}catch{return{address:{balance:0,transaction_count:0},utxo:[]}}}async function X0({address:X,chain:$,apiKey:J}){return(await Q2({address:X,apiKey:J,chain:$}))?.address.balance||0}async function Z2({chain:X,apiKey:$,txHash:J}){if(!J)throw new v("toolbox_utxo_invalid_params",{error:"TxHash is required"});try{return(await DX(`${YX(X)}/raw/transaction/${J}`,$))?.[J]?.raw_transaction||""}catch(j){let Q=j instanceof Error?j.message:String(j);return console.error(`Failed to fetch raw transaction: ${Q}`),""}}var $0=4294967294;async function J0({chain:X,apiKey:$,txHash:J}){if(!J)throw new v("toolbox_utxo_invalid_params",{error:"TxHash is required"});let Q=(await DX(`${YX(X)}/dashboards/transaction/${J}`,$))?.[J];if(!Q)throw new v("toolbox_utxo_tx_not_found",{txHash:J});let{transaction:Z,inputs:z,outputs:Y}=Q,q=z.map((W)=>W.spending_sequence),G=Z.is_rbf===!0||q.some((W)=>W<$0);return{blockId:Z.block_id,confirmed:Z.block_id!==-1,fee:Z.fee,inputs:z,isRBF:G,outputs:Y,sequences:q,size:Z.size,txid:Z.hash,weight:Z.weight}}async function j0({chain:X,address:$,apiKey:J,offset:j=0,limit:Q=30}){return(await DX(`${YX(X)}/outputs?q=recipient(${$}),is_spent(false)&s=value(desc)&fields=is_spent,transaction_hash,index,value,script_hex,block_id,spending_signature_hex&limit=${Q}&offset=${j}`,J)).map(({is_spent:q,script_hex:G,block_id:W,transaction_hash:U,index:L,value:_,spending_signature_hex:N})=>({hash:U,index:L,is_confirmed:W!==-1,is_spent:q,script_hex:G,txHex:N,value:_}))}function Q0(X){return X.reduce(($,J)=>$+J.value,0)}function J2(X,$){let J=[...X].sort((j,Q)=>Q.value-j.value);if($){let j=[],Q=0;for(let Z of J)if(j.push(Z),Q+=Z.value,Q>=$)break;return j}return J}async function G2({chain:X,address:$,apiKey:J,targetValue:j,accumulativeValue:Q=0,offset:Z=0,limit:z=30}){if(!$)throw new v("toolbox_utxo_invalid_params",{error:"Address is required"});try{let Y=await j0({address:$,apiKey:J,chain:X,limit:z,offset:Z,targetValue:j}),G=Y.length<z,W=Y.filter(({is_spent:D})=>!D),U=Q0(W),L=Q+U,_=j&&L>=j;if(G||_)return J2(W,j);let N=await G2({accumulativeValue:L,address:$,apiKey:J,chain:X,limit:z,offset:Z+z,targetValue:j}),H=[...W,...N];return J2(H,j)}catch(Y){let q=Y instanceof Error?Y.message:String(Y);return console.error(`Failed to fetch unspent UTXOs: ${q}`),[]}}async function Z0({address:X,chain:$,apiKey:J,fetchTxHex:j=!0,targetValue:Q}){let Z=await G2({address:X,apiKey:J,chain:$,targetValue:Q}),z=j?await Promise.all(Z.map(({hash:Y})=>Z2({apiKey:J,chain:$,txHash:Y}))):[];return Z.map(({hash:Y,index:q,script_hex:G,value:W},U)=>({address:X,hash:Y,index:q,txHex:j?z[U]:void 0,value:W,witnessUtxo:{script:Buffer.from(G,"hex"),value:W}}))}function I(X){let $=n2.get("apiKeys").blockchair||"";return i2({condition:!$,id:"no_blockchair_api_key_warning",warning:"No Blockchair API key found. Functionality will be limited."}),{broadcastTx:(J)=>s2({chain:X,txHash:J}),getAddressData:(J)=>Q2({address:J,apiKey:$,chain:X}),getBalance:(J)=>X0({address:J,apiKey:$,chain:X}),getBlockHeight:()=>e2({apiKey:$,chain:X}),getRawTx:(J)=>Z2({apiKey:$,chain:X,txHash:J}),getSuggestedTxFee:()=>t2(X),getTransactionDetails:(J)=>J0({apiKey:$,chain:X,txHash:J}),getUtxos:(J)=>Z0({...J,apiKey:$,chain:X})}}function f1(X){return X}function A1(){return function($){switch($){case T.Bitcoin:return GX.bitcoin;case T.BitcoinCash:return GX.bitcoinCash;case T.Dash:return GX.dash;case T.Litecoin:return GX.litecoin;case T.Dogecoin:return GX.dogecoin;case T.Zcash:return GX.zcash;default:throw new v("toolbox_utxo_not_supported",{chain:$})}}}import{sha256 as U0}from"@noble/hashes/sha2.js";import{createBase58check as _0}from"@scure/base";import{SwapKitError as q2}from"@swapkit/helpers";import{CashAddrType as yX,decodeCashAddr as G0,encodeCashAddr as Y0}from"@swapkit/utxo-signer";var q0={P2PKH:yX.P2PKH,P2SH:yX.P2SH},L0={[yX.P2PKH]:"P2PKH",[yX.P2SH]:"P2SH"};function z0(X,$,J){return Y0({hash:J,prefix:X,type:q0[$]})}function W0(X){let $=G0(X),J=L0[$.type];if(!J)throw Error(`Unknown CashAddr type: ${$.type}`);return{hash:$.hash,prefix:$.prefix,type:J}}var hX={decode:W0,encode:z0};var L2=_0(U0);var z2;((J)=>{J.Mainnet="mainnet";J.Testnet="testnet"})(z2||={});var i={["legacy"]:{["mainnet"]:{["p2pkh"]:0,["p2sh"]:5},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}},["bitpay"]:{["mainnet"]:{["p2pkh"]:28,["p2sh"]:40},["testnet"]:{["p2pkh"]:111,["p2sh"]:196}}};function W2(X){try{return vX(X),!0}catch{return!1}}function U2(X){return vX(X)?.network}function o(X){let $=vX(X);if($?.format==="legacy")return X;return M0($)}function RX(X){let $=vX(X);return D0($)}function vX(X){try{let $=N0(X);if($)return $}catch{}try{let $=B0(X);if($)return $}catch{}throw new q2("toolbox_utxo_invalid_address",{address:X})}function N0(X){try{let $=L2.decode(X);if($.length!==21)throw new q2("toolbox_utxo_invalid_address",{address:X});let J=$[0],j=Array.prototype.slice.call($,1);switch(J){case i.legacy.mainnet.p2pkh:return{format:"legacy",hash:j,network:"mainnet",type:"p2pkh"};case i.legacy.mainnet.p2sh:return{format:"legacy",hash:j,network:"mainnet",type:"p2sh"};case i.legacy.testnet.p2pkh:return{format:"legacy",hash:j,network:"testnet",type:"p2pkh"};case i.legacy.testnet.p2sh:return{format:"legacy",hash:j,network:"testnet",type:"p2sh"};case i.bitpay.mainnet.p2pkh:return{format:"bitpay",hash:j,network:"mainnet",type:"p2pkh"};case i.bitpay.mainnet.p2sh:return{format:"bitpay",hash:j,network:"mainnet",type:"p2sh"};default:return}}catch{return}}function B0(X){if(X.indexOf(":")!==-1)try{return Y2(X)}catch{}else{let $=["bitcoincash","bchtest","bchreg"];for(let J of $)try{return Y2(`${J}:${X}`)}catch{}}return}function Y2(X){try{let{hash:$,prefix:J,type:j}=hX.decode(X);return{format:"cashaddr",hash:Array.prototype.slice.call($,0),network:J==="bitcoincash"?"mainnet":"testnet",type:j==="P2PKH"?"p2pkh":"p2sh"}}catch{return}}function M0(X){let $=i.legacy[X.network][X.type],J=Buffer.alloc(1+X.hash.length);return J[0]=$,J.set(X.hash,1),L2.encode(J)}function D0(X){let $=X.network==="mainnet"?"bitcoincash":"bchtest",J=X.type==="p2pkh"?"P2PKH":"P2SH",j=new Uint8Array(X.hash);return hX.encode($,J,j)}import{Chain as a,SwapKitError as dX}from"@swapkit/helpers";import{SwapKitError as H0}from"@swapkit/helpers";import{Script as C0}from"@swapkit/utxo-signer";var h1=1000,oX=10,uX=2,O0=10,k0=41,V0=107;function R(X){let $=new Uint8Array(Buffer.from(X,"utf8"));return C0.encode(["RETURN",$])}var pX;((J)=>{J.P2PKH="P2PKH";J.P2WPKH="P2WPKH"})(pX||={});var cX={["P2PKH"]:148,["P2WPKH"]:68},SX={["P2PKH"]:34,["P2WPKH"]:31},HX=(X)=>{if(X.startsWith("bc1")||X.startsWith("tb1")||X.startsWith("ltc1")||X.startsWith("tltc1"))return"P2WPKH";if(X.startsWith("1")||X.startsWith("m")||X.startsWith("n")||X.startsWith("bitcoincash:q")||X.startsWith("bitcoincash:p")||X.startsWith("q")||X.startsWith("p")||X.startsWith("L")||X.startsWith("M")||X.startsWith("3")||X.startsWith("D")||X.startsWith("A")||X.startsWith("9")||X.startsWith("X")||X.startsWith("7")||X.startsWith("y")||X.startsWith("t1")||X.startsWith("t3")||X.startsWith("tm"))return"P2PKH";throw new H0("toolbox_utxo_invalid_address",{address:X})},qX=({inputs:X,outputs:$,feeRate:J})=>{let j=X[0]&&"address"in X[0]&&X[0].address?HX(X[0].address):"P2PKH",Z=(J?X.filter((G)=>G.value>=cX["type"in G&&G.type?G.type:"P2PKH"]*Math.ceil(J)):X).reduce((G,W)=>G+s(W),0),z=$?.reduce((G,W)=>G+wX(W),0)||SX[j],Y=oX+Z+z;return j==="P2WPKH"?Math.ceil(Y+uX/4):Y},s=(X)=>{if("type"in X&&X.type)return cX[X.type];if("address"in X&&X.address)return cX[HX(X.address)];return k0+V0},wX=(X,$)=>{if(X?.script)return O0+X.script.length+(X.script.length>=74?2:1);if($)return SX[$];if("address"in X&&X.address)return SX[HX(X.address)];return SX.P2PKH};function CX(X){switch(X){case a.Bitcoin:case a.BitcoinCash:return 550;case a.Dash:case a.Litecoin:return 5500;case a.Dogecoin:return 1e5;case a.Zcash:return 546;default:throw new dX("toolbox_utxo_not_supported",{chain:X})}}function S({inputs:X,outputs:$,feeRate:J=1,chain:j=a.Bitcoin,changeAddress:Q="",sweep:Z=!1}){let z=CX(j),Y=X.filter((D)=>{let b=s(D)*J;return Z?D.value>Math.max(b,z):b<=D.value});if(Z){let D=Math.ceil(J*qX({inputs:Y,outputs:$})),b=Y.reduce((A,l)=>A+l.value,0),u=b-D;if(u<=z)throw new dX("toolbox_sweep_amount_too_low",{available:b,dustThreshold:z,fee:D});let p=$.findIndex((A)=>("address"in A)&&A.address);if(p===-1)throw new dX("toolbox_utxo_invalid_params",{error:"Sweep requires a recipient output"});return{fee:D,inputs:Y,outputs:$.map((A,l)=>l===p?{...A,value:u}:A)}}let W=(X[0]&&"address"in X[0]&&X[0].address?HX(X[0].address):"P2PKH")==="P2WPKH"?Math.ceil(uX/4):0,U=oX+W+$.reduce((D,b)=>D+wX(b),0),L=$.reduce((D,b)=>D+b.value,0),_=U*J,N=0,H=[];for(let D of Y){let b=s(D),u=J*b;_+=u,N+=D.value,H.push(D);let p=_+L;if(N<p)continue;let A=N-p,l=J*wX({address:Q,value:0});if(A>l){let IX=l+_,PX=N-(L+Math.ceil(IX));if(PX>Math.max(s({value:0})*J,CX(j)))return{fee:Math.ceil(IX),inputs:H,outputs:$.concat({address:Q,value:PX})}}return{fee:Math.ceil(_),inputs:H,outputs:$}}return{fee:Math.ceil(J*qX({inputs:X,outputs:$}))}}import{Chain as _X,SwapKitError as b1}from"@swapkit/helpers";import{hex as E2}from"@scure/base";import{Chain as x0,derivationPathToString as h0,FeeOption as c0,NetworkDerivationPath as o0,SwapKitError as h,updateDerivationPath as u0}from"@swapkit/helpers";import{BCHSigHash as p0,CashAddrPrefix as f2,CashAddrType as A2,encodeCashAddr as y2,NETWORKS as d0,p2pkh as R2,Transaction as v2}from"@swapkit/utxo-signer";import{secp256k1 as b0}from"@noble/curves/secp256k1.js";import{hex as e}from"@scure/base";import{HDKey as D2}from"@scure/bip32";import{mnemonicToSeedSync as iX}from"@scure/bip39";import{AssetValue as rX,applyFeeMultiplier as _2,Chain as P,derivationPathToString as kX,FeeOption as w,NetworkDerivationPath as H2,SwapKitError as V,SwapKitNumber as I0,updateDerivationPath as P0,warnOnce as T0}from"@swapkit/helpers";import{Address as F0,BCHSigHash as sX,CashAddrPrefix as E0,CashAddrType as f0,encodeCashAddr as A0,NETWORKS as zX,p2pkh as N2,p2wpkh as y0,RBF_SEQUENCE as R0,SigHash as C2,Transaction as nX,WIF as O2}from"@swapkit/utxo-signer";import{match as k2}from"ts-pattern";import{validateZcashAddress as OX}from"@swapkit/utxo-signer";function LX(X){return X.replace(/(bchtest:|bitcoincash:)/,"")}function t(X){let $=LX(X);return W2($)&&U2($)==="mainnet"}var mX=[P.Dash,P.Dogecoin,P.Zcash,P.BitcoinCash],KX=[P.Bitcoin];function V2({address:X,chain:$}){return k2($).with(P.BitcoinCash,()=>t(X)).with(P.Zcash,()=>OX(X)).otherwise(()=>{try{return F0(E($)).decode(X),!0}catch{return!1}})}function E(X){return k2(X).with(P.Bitcoin,()=>zX.bitcoin).with(P.BitcoinCash,()=>zX.bitcoinCash).with(P.Dash,()=>zX.dash).with(P.Dogecoin,()=>zX.dogecoin).with(P.Litecoin,()=>zX.litecoin).with(P.Zcash,()=>zX.zcash).exhaustive()}function v0({phrase:X,derivationPath:$,network:J,seed:j}){let Q=j??iX(X),z=D2.fromMasterSeed(Q,J.bip32).derive($);if(!z.privateKey)throw new V("toolbox_utxo_invalid_params",{error:"Could not derive private key from phrase"});return z.privateKey}function B2(X){return b0.getPublicKey(X,!0)}function VX({publicKey:X,chain:$,network:J}){if($===P.BitcoinCash){let Z=N2(X,J);if(!Z.hash)throw new V("toolbox_utxo_invalid_address",{error:"Could not derive BCH address hash"});return A0({hash:Z.hash,prefix:E0.MAINNET,type:f0.P2PKH}).replace(/^bitcoincash:/,"")}let Q=!mX.includes($)?y0(X,J):N2(X,J);if(!Q.address)throw new V("toolbox_utxo_invalid_address",{error:"Could not derive address"});return Q.address}function WX({phrase:X,derivationPath:$,chain:J,wif:j,seed:Q}){let Z=E(J);if(j){let G=O2(Z).decode(j),W=B2(G);return{privateKey:G,publicKey:W}}if(!X)throw new V("toolbox_utxo_invalid_params",{error:"Either phrase or wif must be provided"});let z=$||kX(H2[J]),Y=v0({derivationPath:z,network:Z,phrase:X,seed:Q}),q=B2(Y);return{privateKey:Y,publicKey:q}}function S0(X,$){return O2(E($)).encode(X)}function w0({phrase:X,derivationPath:$,chain:J,seed:j}){let Q=$.split("/");if(Q.length<4)throw new V("toolbox_utxo_invalid_params",{error:`Derivation path must have at least 4 levels (got ${Q.length}): ${$}`});let Z=E(J),z=j??iX(X),Y=D2.fromMasterSeed(z,Z.bip32),q=Q.slice(0,4).join("/");return Y.derive(q)}function XX({inputs:X,outputs:$,chain:J,tx:j,sender:Q,compiledMemo:Z,enableRBF:z=!1}){let Y=E(J),q=!mX.includes(J),G=z?R0:void 0,W=new Set;for(let U of X){let L=`${U.hash}:${U.index}`;if(W.has(L))throw new V("toolbox_utxo_invalid_params",{error:"Duplicate input detected"});W.add(L);let _=typeof U.hash==="string"?e.decode(U.hash):U.hash;if(q&&U.witnessUtxo)j.addInput({index:U.index,sequence:G,txid:_,witnessUtxo:{amount:BigInt(U.witnessUtxo.value),script:U.witnessUtxo.script}});else if(U.txHex)j.addInput({index:U.index,nonWitnessUtxo:e.decode(U.txHex),sequence:G,txid:_,...J===P.BitcoinCash?{sighashType:sX.ALL}:{}});else throw new V("toolbox_utxo_invalid_params",{error:"Input requires either witnessUtxo or txHex for non-segwit chains"})}for(let U of $){let L="address"in U&&U.address?U.address:Q;if(J===P.BitcoinCash)L=o(L);if(U.script){if(Z)j.addOutput({amount:0n,script:Z})}else j.addOutputAddress(L,BigInt(U.value),Y)}return{inputs:X,tx:j}}async function UX(X){let $=await I(X).getSuggestedTxFee();return{[w.Average]:$,[w.Fast]:_2($,w.Fast),[w.Fastest]:_2($,w.Fastest)}}async function b2({assetValue:X,recipient:$,memo:J,sender:j,sweep:Q,fetchTxHex:Z=!1},z){let Y=X.chain,q=Z||mX.includes(Y),G=X.getBaseValue("number"),W=Q?void 0:z??(await UX(Y))[w.Fastest],U=Q||W===void 0?void 0:Math.ceil(G+W*5000);return{inputs:await I(Y).getUtxos({address:j,fetchTxHex:q,targetValue:U}),outputs:[{address:$,value:Q?0:G},...J?[{address:"",script:R(J),value:0}]:[]]}}async function I2({assetValue:X,recipient:$,memo:J,feeRate:j,sender:Q,fetchTxHex:Z=!1,enableRBF:z=!1,sweep:Y}){let q=X.chain,G=J?R(J):null,W=await b2({assetValue:X,fetchTxHex:Z,memo:J,recipient:$,sender:Q,sweep:Y},j),{inputs:U,outputs:L}=S({...W,chain:q,feeRate:j,sweep:Y});if(!(U&&L))throw new V("toolbox_utxo_insufficient_balance",{assetValue:X,sender:Q});let _=new nX({allowLegacyWitnessUtxo:!0,allowUnknownOutputs:!!G,version:1}),{inputs:N,tx:H}=XX({chain:q,compiledMemo:G,enableRBF:z,inputs:U,outputs:L,sender:Q,tx:_});return{inputs:N,tx:H,utxos:W.inputs}}async function P2({assetValue:X,feeOptionKey:$=w.Fast,feeRate:J,memo:j,sender:Q,recipient:Z,sweep:z}){let Y=X.chain,q,G;if(J!==void 0)q=J,G=Math.floor(J);else{let U=await UX(Y);q=U[w.Fastest],G=U[$]}let W=await b2({assetValue:X,memo:j,recipient:Z,sender:Q,sweep:z},q);return S({...W,chain:Y,feeRate:G,sweep:z})}function K0(X){return async function({from:J,memo:j,feeRate:Q,feeOptionKey:Z=w.Fast,recipient:z=J,recipients:Y=1}){let q=Q??(await UX(X))[Z],W=(await I(X).getUtxos({address:J,fetchTxHex:!1})).filter((H)=>H.value>Math.max(CX(X),s(H)*q));if(!W.length)return rX.from({chain:X});let U=typeof Y==="number"?Math.max(Y,1):Y.length,L=typeof Y==="number"||U===0?Array.from({length:U||1},()=>({address:z,value:0})):[...Y];if(j)L.push({address:J,script:R(j),value:0});let{outputs:_}=S({chain:X,feeRate:q,inputs:W,outputs:L,sweep:!0}),N=_?.[0]?.value??0;return rX.from({chain:X,value:BigInt(N)})}}function m0(X){return async function(J){let{fee:j}=await P2(J);return rX.from({chain:X,value:I0.fromBigInt(BigInt(j),8).getValue("string")})}}function g0({chain:X,phrase:$,derivationPath:J,seed:j}){let Q=E(X),{privateKey:Z,publicKey:z}=WX({chain:X,derivationPath:J,phrase:$,seed:j}),Y=X===P.BitcoinCash?[sX.ALL]:[C2.ALL];return{getAddress:()=>VX({chain:X,network:Q,publicKey:z}),privateKey:Z,publicKey:z,signTransaction:(q)=>{return q.sign(Z,Y),q}}}function l0(X,$){return async function({memo:j,recipient:Q,feeOptionKey:Z,feeRate:z,assetValue:Y,enableRBF:q=!1,sweep:G}){let W=await $?.getAddress();if(!($&&W))throw new V("toolbox_utxo_no_signer");if(!Q)throw new V("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});T0({condition:q&&!KX.includes(X),id:`rbf_not_supported_${X}`,warning:`RBF (Replace-by-Fee) is not reliably supported on ${X}. Transaction will be created without RBF signaling.`});let U=q&&KX.includes(X),L=z||(await UX(X))[Z||w.Fast],{tx:_}=await I2({assetValue:Y,enableRBF:U,feeRate:L,memo:j,recipient:Q,sender:W,sweep:G}),N=await $.signTransaction(_);return N.finalize(),I(X).broadcastTx(e.encode(N.extract()))}}function T2(X){return($)=>V2({address:$,chain:X})}function F2(X){let $=E(X);return function(j){if(!j)throw new V("toolbox_utxo_invalid_params",{error:"Keys must be provided"});return VX({chain:X,network:$,publicKey:j.publicKey})}}function $X({chain:X,...$}){let J="phrase"in $?$.phrase:void 0,j="index"in $?$.index||0:0,Q=J?iX(J):void 0,Z="derivationPath"in $&&$.derivationPath?$.derivationPath:P0(H2[X],{index:j}),z=kX(Z),Y=J?g0({chain:X,derivationPath:z,phrase:J,seed:Q}):void 0,q="signer"in $?$.signer:void 0,G=Y||q,W=J?WX({chain:X,derivationPath:z,phrase:J,seed:Q}):void 0;function U(){if(G)return G.getAddress();return Promise.resolve(void 0)}function L(B){if(!J)return;let M=n({accountIndex:B,chain:X,derivationPath:Z});return w0({chain:X,derivationPath:kX(M),phrase:J,seed:Q})}let _=L();function N(){if(!_)return;return _.publicExtendedKey}function H({accountIndex:B}={}){let M=B===void 0?_:L(B);if(!M)return;let C=n({accountIndex:B,chain:X,derivationPath:Z});return{accountIndex:ZX(C),path:kX(C),xpub:M.publicExtendedKey}}function D({accountIndex:B,index:M,change:C=!1}){let O=B===void 0?_:L(B);if(!O)return;let k=MX({accountIndex:B,chain:X,change:C,derivationPath:Z,index:M}),y=E(X),K=O.deriveChild(Number(C)).deriveChild(M);if(!K.publicKey)throw new V("toolbox_utxo_invalid_params",{error:"Could not derive public key"});let f=VX({chain:X,network:y,publicKey:K.publicKey}),c=e.encode(K.publicKey);return{accountIndex:ZX(k),address:f,change:C,index:M,path:kX(k),pubkey:c}}async function b(B){if(!KX.includes(X))return{reason:`RBF is not supported on ${X}`,supported:!1};let M=await I(X).getTransactionDetails(B);return{canReplace:M.isRBF&&!M.confirmed,confirmed:M.confirmed,enabled:M.isRBF,fee:M.fee,sequences:M.sequences,supported:!0}}async function u({txid:B,newFeeRate:M,recipient:C,memo:O}){if(!KX.includes(X))throw new V("toolbox_utxo_rbf_not_supported",{chain:X});let k=await I(X).getTransactionDetails(B);if(!k.isRBF)throw new V("toolbox_utxo_tx_not_replaceable",{txid:B});if(k.confirmed)throw new V("toolbox_utxo_tx_already_confirmed",{blockId:k.blockId,txid:B});let y=k.inputs.reduce((F,x)=>F+x.value,0),f=k.outputs.find((F)=>F.recipient===C)?.value||0;if(f===0)throw new V("toolbox_utxo_invalid_params",{error:"Could not determine send amount from original transaction"});let c=await Promise.all(k.inputs.map(async(F)=>{let x=await I(X).getRawTx(F.transaction_hash);return{hash:F.transaction_hash,index:F.index,txHex:x,value:F.value,witnessUtxo:void 0}})),NX=O?R(O):null,TX=qX({feeRate:M,inputs:c.map((F)=>({...F,type:"P2WPKH"})),outputs:[{address:C,value:f}]}),d=Math.ceil(TX*M);if(d<=k.fee)throw new V("toolbox_utxo_rbf_fee_too_low",{newFee:d,originalFee:k.fee});let jX=d-k.fee,QX=f-jX;if(QX<=0)throw new V("toolbox_utxo_rbf_insufficient_change");let r=new nX({allowLegacyWitnessUtxo:!0,version:1}),FX=[{address:C,value:QX},...O?[{address:"",script:R(O),value:0}]:[]],EX=y-QX-d,BX=await U();if(EX>CX(X)&&BX)FX.push({address:BX,value:EX});return XX({chain:X,compiledMemo:NX,inputs:c,outputs:FX,sender:BX||C,tx:r}),{feeDelta:jX,newFee:d,originalFee:k.fee,tx:r}}async function p({txid:B,newFeeRate:M,recipient:C,memo:O}){let{tx:k,originalFee:y,newFee:K}=await u({memo:O,newFeeRate:M,recipient:C,txid:B}),f=await lX(k);f.finalize();let c=await I(X).broadcastTx(e.encode(f.extract()));return{newFee:K,originalFee:y,txid:c}}function A({accountIndex:B,index:M,change:C=!1}){m("index",M);let O=B===void 0?_:L(B);if(!O)return;return O.deriveChild(Number(C)).deriveChild(M).privateKey||void 0}function l({tx:B,inputDerivations:M}){if(!_)throw new V("toolbox_utxo_no_signer");let C=X===P.BitcoinCash?[sX.ALL]:[C2.ALL];for(let O=0;O<M.length;O++){let k=M[O];if(!k)continue;let{derivationIndex:y,isChange:K}=k,f=A({change:K,index:y});if(!f)throw new V("toolbox_utxo_invalid_params",{error:`Could not derive private key for input ${O} at index ${y}`});B.signIdx(f,O,C)}return B}async function IX({utxos:B,recipient:M,assetValue:C,memo:O,feeRate:k,feeOptionKey:y,changeAddress:K,sweep:f}){if(f)throw new V("toolbox_utxo_invalid_params",{error:"Sweep is not supported for transfers from multiple addresses"});if(!_)throw new V("toolbox_utxo_no_signer");let c=k||(await UX(X))[y||w.Fast],NX=O?R(O):null,TX=[{address:M,value:C.getBaseValue("number")}];if(NX)TX.push({address:"",script:NX,value:0});let d=B.map(({hash:F,index:x,value:fX,txHex:u2,witnessUtxo:xX})=>({hash:F,index:x,txHex:u2,value:fX,witnessUtxo:xX?{script:xX.script,value:xX.value}:void 0})),{inputs:jX,outputs:QX}=S({chain:X,feeRate:c,inputs:d,outputs:TX});if(!(jX&&QX))throw new V("toolbox_utxo_insufficient_balance",{assetValue:C,sender:"multiple addresses"});let r=new nX({allowLegacyWitnessUtxo:!0,version:1}),FX=B[0]?.address,EX=K||await U()||FX||M;XX({chain:X,compiledMemo:NX,inputs:jX,outputs:QX,sender:EX,tx:r});let BX=jX.map((F)=>{let x=B.find((fX)=>fX.hash===F.hash&&fX.index===F.index);return x?{derivationIndex:x.derivationIndex,isChange:x.isChange}:{derivationIndex:0,isChange:!1}});return l({inputDerivations:BX,tx:r}),r.finalize(),I(X).broadcastTx(e.encode(r.extract()))}function PX({address:B,gapLimit:M=20}){if(!_)return;for(let C=0;C<M;C++){let O=D({change:!1,index:C}),k=D({change:!0,index:C}),y=O?.address===B?!1:k?.address===B;if(O?.address===B||k?.address===B)return{change:y,index:C}}return}function lX(B){if(!G)throw new V("toolbox_utxo_no_signer");return G.signTransaction(B)}async function o2(B){let M=await lX(B);return M.finalize(),await I(X).broadcastTx(e.encode(M.extract()))}return{accumulative:S,broadcastTx:(B)=>I(X).broadcastTx(B),bumpFee:p,calculateTxSize:qX,createKeysForPath:(B)=>WX({...B,chain:X}),createReplacementTransaction:u,createTransaction:I2,deriveAddressAtIndex:D,derivePrivateKeyAtIndex:A,estimateMaxSendableAmount:K0(X),estimateTransactionFee:m0(X),getAddress:U,getAddressFromKeys:F2(X),getBalance:M2(X),getExtendedPublicKey:N,getExtendedPublicKeyInfo:H,getFeeRates:()=>UX(X),getInputsOutputsFee:P2,getNetworkForChain:()=>E(X),getPrivateKeyFromMnemonic:(B)=>S0(WX({...B,chain:X}).privateKey,X),isRBFEnabled:b,keys:W,resolveDerivationIndex:PX,signAndBroadcastTransaction:o2,signTransaction:lX,signTransactionWithMultipleKeys:l,transfer:l0(X,G),transferFromMultipleAddresses:IX,validateAddress:T2(X)}}var g=x0.BitcoinCash;function gX(X){return LX(RX(X))}function r0(X){let $=E(g);function J(Q){return Q.sign(X.privateKey,[p0.ALL]),Q}function j(){let Q=R2(X.publicKey,$);if(!Q.hash)throw new h("toolbox_utxo_invalid_address",{error:"Could not derive BCH address hash"});let Z=y2({hash:Q.hash,prefix:f2.MAINNET,type:A2.P2PKH});return Promise.resolve(Z.replace(/^bitcoincash:/,""))}return{getAddress:j,signTransaction:J}}function S2(X){let $="phrase"in X?X.phrase:void 0,J="index"in X?X.index||0:0,j=h0("derivationPath"in X&&X.derivationPath?X.derivationPath:u0(o0[g],{index:J})),Q=$?WX({chain:g,derivationPath:j,phrase:$}):void 0,Z=Q?r0(Q):("signer"in X)?X.signer:void 0;function z(){return Promise.resolve(Z?.getAddress())}let{getBalance:Y,getFeeRates:q,broadcastTx:G,...W}=$X({chain:g});function U(N,H=!0){return Y(LX(RX(N)))}function L(N){if(!Z)throw new h("toolbox_utxo_no_signer");return Z.signTransaction(N)}async function _(N){let H=await L(N);return H.finalize(),await G(E2.encode(H.extract()))}return{...W,broadcastTx:G,buildTx:i0,createTransaction:w2,getAddress:z,getAddressFromKeys:s0,getBalance:U,getFeeRates:q,signAndBroadcastTransaction:_,signTransaction:L,stripPrefix:LX,stripToCashAddress:gX,transfer:n0({broadcastTx:G,getFeeRates:q,signer:Z}),validateAddress:t}}async function w2({assetValue:X,recipient:$,memo:J,feeRate:j,sender:Q,sweep:Z}){if(!t($))throw new h("toolbox_utxo_invalid_address",{address:$});let z=Math.ceil(X.getBaseValue("number")+j*7500),Y=await I(g).getUtxos({address:gX(Q),fetchTxHex:!0,targetValue:Z?void 0:z}),q=J?R(J):null,G=[],W=o($);if(G.push({address:W,value:Z?0:X.getBaseValue("number")}),q)G.push({script:q,value:0});let{inputs:U,outputs:L}=S({chain:g,feeRate:j,inputs:Y,outputs:G,sweep:Z});if(!(U&&L))throw new h("toolbox_utxo_insufficient_balance",{assetValue:X,sender:Q});let _=new v2({allowLegacyWitnessUtxo:!0,allowUnknownOutputs:!!q,version:1}),N=o(Q),{inputs:H,tx:D}=XX({chain:g,compiledMemo:q,inputs:U,outputs:L.map((b)=>("address"in b)&&b.address?{...b,address:o(b.address)}:b),sender:N,tx:_});return{inputs:H,tx:D,utxos:U}}function n0({broadcastTx:X,getFeeRates:$,signer:J}){return async function({recipient:Q,assetValue:Z,feeOptionKey:z=c0.Fast,sweep:Y,...q}){let G=await J?.getAddress();if(!(J&&G))throw new h("toolbox_utxo_no_signer");if(!Q)throw new h("toolbox_utxo_invalid_params",{error:"Recipient address must be provided"});let W=q.feeRate||(await $())[z],{tx:U}=await w2({...q,assetValue:Z,feeRate:W,recipient:Q,sender:G,sweep:Y}),L=await J.signTransaction(U);return L.finalize(),X(E2.encode(L.extract()))}}async function i0({assetValue:X,recipient:$,memo:J,feeRate:j,sender:Q}){let Z=RX($);if(!t(Z))throw new h("toolbox_utxo_invalid_address",{address:Z});let z=Math.ceil(X.getBaseValue("number")+j*7500),Y=await I(g).getUtxos({address:gX(Q),fetchTxHex:!0,targetValue:z}),q=Number(j.toFixed(0)),G=J?R(J):null,W=[];if(W.push({address:o($),value:X.getBaseValue("number")}),G)W.push({script:G,value:0});let{inputs:U,outputs:L}=S({chain:g,feeRate:q,inputs:Y,outputs:W});if(!(U&&L))throw new h("toolbox_utxo_insufficient_balance",{assetValue:X,sender:Q});let _=new v2({allowLegacyWitnessUtxo:!0,allowUnknownOutputs:!!G,version:1}),{inputs:N,tx:H}=XX({chain:g,compiledMemo:G,inputs:U,outputs:L,sender:o(Q),tx:_});return{inputs:N,tx:H,utxos:Y}}function s0(X){let $=d0.bitcoinCash,J=R2(X.publicKey,$);if(!J.hash)throw new h("toolbox_utxo_invalid_address",{error:"Could not derive BCH address hash"});return y2({hash:J.hash,prefix:f2.MAINNET,type:A2.P2PKH}).replace(/^bitcoincash:/,"")}import{createBase58check as a0,hex as t0}from"@scure/base";import{HDKey as l2}from"@scure/bip32";import{mnemonicToSeedSync as x2}from"@scure/bip39";import{Chain as bX,derivationPathToString as e0,FeeOption as X1,NetworkDerivationPath as $1,SKConfig as eX,SwapKitError as JX,updateDerivationPath as J1}from"@swapkit/helpers";import{Address as j1,createZcashTransaction as Q1,getZcashConsensusBranchId as Z1,isTransparentZcashAddress as K2,OutScript as G1,PCZT as Y1,utils as h2,WIF as q1,ZCASH_NETWORK as L1,ZCASH_TEST_NETWORK as z1,ZcashConsensusBranchId as m2,ZcashPSBT as W1,ZcashSigHash as aX,ZcashVersionGroupId as U1}from"@swapkit/utxo-signer";import{match as _1,P as tX}from"ts-pattern";function X2(){let{isStagenet:X}=eX.get("envs");return X?z1:L1}var N1=a0(h2.sha256);function B1(X){return N1.encode(X)}function M1({phrase:X,derivationPath:$}){let J=x2(X),Q=l2.fromMasterSeed(J).derive($);if(!Q.privateKey||!Q.publicKey)throw new JX("toolbox_utxo_invalid_params");let{privateKey:Z,publicKey:z}=Q,Y=h2.hash160(z),{isStagenet:q}=eX.get("envs"),G=q?new Uint8Array([29,37]):new Uint8Array([28,184]),W=new Uint8Array(G.length+Y.length);W.set(G,0),W.set(Y,G.length);let U=B1(W);return{getAddress:()=>Promise.resolve(U),signTransaction:(L)=>{if(L instanceof W1){let _=L.toPCZT();return _.signAllInputs(Z,z,aX.ALL),_.finalizeAllInputs(),Promise.resolve(_.extract())}if(L instanceof Y1)return L.signAllInputs(Z,z,aX.ALL),L.finalizeAllInputs(),Promise.resolve(L.extract());return L.signAllInputs(Z,z,aX.ALL),Promise.resolve(L)}}}function D1({inputs:X,outputs:$,tx:J,sender:j,compiledMemo:Q}){let Z=X2();for(let z of X){let Y=j1(Z).decode(j),q=G1.encode(Y);J.addInput({index:z.index,script:q,sequence:4294967295,txid:t0.decode(z.hash),value:BigInt(z.value)})}for(let z of $){let Y="address"in z&&z.address?z.address:j,q=z.script;if(q&&!Q)continue;if(q&&Q)J.addOutput({amount:0n,script:Q});else J.addOutputAddress(Y,BigInt(z.value),Z)}return{inputs:X,tx:J}}async function H1(){let{isStagenet:X}=eX.get("envs");if(X)return m2.IRONWOOD;try{let $=await I(bX.Zcash).getBlockHeight();return Z1($+1)}catch{return m2.IRONWOOD}}async function g2(X){let{assetValue:$,recipient:J,memo:j,feeRate:Q,sender:Z,fetchTxHex:z,sweep:Y}=X,q=X2();if(!K2(Z,q))throw new JX("toolbox_utxo_invalid_address",{address:Z});if(!K2(J,q))throw new JX("toolbox_utxo_invalid_address",{address:J,error:"Zcash transaction creation currently supports transparent addresses only"});let G=j?R(j):null,W=await I(bX.Zcash).getUtxos({address:Z,fetchTxHex:z!==!1}),U=[{address:J,value:Y?0:Number($.getBaseValue("string"))},...G?[{script:G,value:0}]:[]],{inputs:L,outputs:_}=S({chain:bX.Zcash,changeAddress:Z,feeRate:Q,inputs:W,outputs:U,sweep:Y});if(!(L&&_))throw new JX("toolbox_utxo_insufficient_balance",{assetValue:$,sender:Z});let N=Q1({consensusBranchId:await H1(),expiryHeight:0,lockTime:0,version:4,versionGroupId:U1.SAPLING}),{tx:H,inputs:D}=D1({compiledMemo:G,inputs:L,outputs:_,sender:Z,tx:N});return{inputs:D,outputs:_,tx:H}}function c2(X){let $=_1(X).with({signer:tX.not(tX.nullish)},({signer:q})=>q).with({phrase:tX.string},({phrase:q,derivationPath:G,index:W=0})=>{let U=G||$1[bX.Zcash]||[44,133,0,0,0],L=J1(U,{index:W}),_=e0(L);return M1({derivationPath:_,phrase:q})}).otherwise(()=>{return}),J=$X({chain:bX.Zcash,signer:$});async function j(q){if(!$)throw new JX("toolbox_utxo_no_signer");return await $.signTransaction(q)}async function Q(q){let G=await j(q);return J.broadcastTx(G.toHex())}async function Z({recipient:q,assetValue:G,feeOptionKey:W=X1.Fast,sweep:U,...L}){let _=await $?.getAddress();if(!($&&_))throw new JX("toolbox_utxo_no_signer");let N=L.feeRate||(await J.getFeeRates())[W],{tx:H}=await g2({...L,assetValue:G,feeRate:N,recipient:q,sender:_,sweep:U}),b=(await $.signTransaction(H)).toHex();return J.broadcastTx(b)}function z({phrase:q,derivationPath:G="m/44'/133'/0'/0/0"}){let W=x2(q),L=l2.fromMasterSeed(W).derive(G);if(!L.privateKey||!L.publicKey)throw new JX("toolbox_utxo_invalid_params");return{privateKey:L.privateKey,publicKey:L.publicKey}}function Y({phrase:q,derivationPath:G="m/44'/133'/0'/0/0"}){let W=z({derivationPath:G,phrase:q}),U=X2();return q1(U).encode(W.privateKey)}return{...J,createKeysForPath:z,createTransaction:g2,getPrivateKeyFromMnemonic:Y,signAndBroadcastTransaction:Q,signTransaction:j,transfer:Z,validateAddress:OX}}import{hex as C1}from"@scure/base";import{HDKey as O1}from"@scure/bip32";import{derivationPathToString as k1}from"@swapkit/helpers";function V1({xpub:X,chain:$,count:J,startIndex:j=0,accountIndex:Q}){if(m("count",J),J<1)throw RangeError("count must be at least 1");m("startIndex",j);let Z=E($),z=O1.fromExtendedKey(X,Z.bip32),Y=n({accountIndex:Q,chain:$}),q=ZX(Y),G=[];for(let W of[!1,!0]){let U=z.deriveChild(Number(W));for(let L=0;L<J;L++){let _=j+L,N=U.deriveChild(_);if(!N.publicKey)continue;let H=MX({accountIndex:Q,chain:$,change:W,index:_});G.push({accountIndex:q,address:VX({chain:$,network:Z,publicKey:N.publicKey}),change:W,index:_,path:k1(H),pubkey:C1.encode(N.publicKey)})}}return G}function l8(X,$){switch(X){case _X.BitcoinCash:return S2($||{});case _X.Zcash:return c2($);case _X.Bitcoin:case _X.Dogecoin:case _X.Litecoin:case _X.Dash:return $X({chain:X,...$});default:throw new b1("toolbox_utxo_not_supported",{chain:X})}}export{OX as validateZcashAddress,V2 as validateUtxoAddress,t as validateBchAddress,o as toLegacyAddress,RX as toCashAddress,gX as stripToCashAddress,LX as stripPrefix,mX as nonSegwitChains,W2 as isValidAddress,l8 as getUtxoToolbox,A1 as getUtxoNetwork,I as getUtxoApi,T2 as getUTXOAddressValidator,MX as getUTXOAddressPath,n as getUTXOAccountPath,ZX as getUTXOAccountIndexFromPath,HX as getScriptTypeForAddress,wX as getOutputSize,E as getNetworkForChain,s as getInputSize,CX as getDustThreshold,U2 as detectAddressNetwork,V1 as deriveAddressesFromXpub,c2 as createZcashToolbox,$X as createUTXOToolbox,d2 as createHDWalletHelpers,f1 as createCustomUtxoApi,S2 as createBCHToolbox,R as compileMemo,qX as calculateTxSize,m as assertDerivationIndex,F2 as addressFromKeysGetter,XX as addInputsAndOutputs,S as accumulative,z2 as UtxoNetwork,pX as UTXOScriptType,oX as TX_OVERHEAD,uX as SEGWIT_MARKER_FLAG_WEIGHT,SX as OutputSizes,O0 as OP_RETURN_OVERHEAD,h1 as MIN_TX_FEE,cX as InputSizes};
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Standard BIP-39 test mnemonic (all-zero index, the "abandon…about" phrase) used
3
+ * across toolbox test suites. Derives to well-known, publicly-documented addresses
4
+ * so test fixtures stay deterministic without requiring a private key file.
5
+ *
6
+ * Do NOT use this phrase for anything other than tests — the resulting keys are
7
+ * known to anyone reading BIP-39 spec examples.
8
+ */
9
+ export declare const TEST_MNEMONIC = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
1
10
  /**
2
11
  * Captures a plain-object snapshot of an ESM namespace import so it can be
3
12
  * re-installed via `mock.module(...)` in `afterAll`.
@@ -4,7 +4,6 @@ import type { CardanoCreateTransactionParams, CardanoProvider, CardanoTransferPa
4
4
  type CardanoChainSigner = ChainSigner<string, string> & {
5
5
  publicKey: Buffer;
6
6
  publicKeyHash: Buffer;
7
- signRaw: (data: Buffer) => Buffer;
8
7
  };
9
8
  type CardanoSigner = CardanoProvider | CardanoChainSigner;
10
9
  export declare function validateCardanoAddress(address: string): boolean;
@@ -23,7 +22,6 @@ export declare function getCardanoToolbox(toolboxParams?: {
23
22
  getAddress: () => Promise<string>;
24
23
  getBalance: (addressParam?: string) => Promise<AssetValue[]>;
25
24
  signAndBroadcastTransaction: (txInput: string) => Promise<string>;
26
- signRaw: (data: Buffer) => Promise<Buffer>;
27
25
  signTransaction: (tx: string) => Promise<string>;
28
26
  transfer: ({ recipient, assetValue, memo, sweep }: CardanoTransferParams) => Promise<string>;
29
27
  validateAddress: typeof validateCardanoAddress;
@@ -1,4 +1,4 @@
1
- import type { Address, Transaction } from "@solana/kit";
1
+ import type { PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
2
2
  import type { GenericCreateTransactionParams, GenericTransferParams } from "@swapkit/helpers";
3
3
  import type { getSolanaToolbox } from "./toolbox";
4
4
  interface ConnectOpts {
@@ -6,22 +6,13 @@ interface ConnectOpts {
6
6
  }
7
7
  export * from "./toolbox";
8
8
  export type SolanaWallet = ReturnType<typeof getSolanaToolbox>;
9
- /**
10
- * Wallet-provider interface (Phantom, Solflare, Backpack, etc.).
11
- *
12
- * Kit-native: providers must emit `@solana/kit` `Transaction` and `Address`
13
- * shapes. Wallet adapter packages that still produce legacy
14
- * `@solana/web3.js` types must perform their own v1↔kit conversion (e.g.
15
- * via `@solana/compat`) before passing values to this interface. SwapKit
16
- * deliberately does not bundle the v1 bridge.
17
- */
18
9
  export interface SolanaProvider {
19
10
  connect: (opts?: Partial<ConnectOpts>) => Promise<{
20
- address: Address;
11
+ publicKey: PublicKey;
21
12
  }>;
22
13
  disconnect: () => Promise<void>;
23
- address: Address | null;
24
- signTransaction: (transaction: Transaction) => Promise<Transaction>;
14
+ publicKey: PublicKey | null;
15
+ signTransaction: <T extends Transaction | VersionedTransaction = Transaction>(transaction: T) => Promise<T>;
25
16
  }
26
17
  export type SolanaCreateTransactionParams = Omit<GenericCreateTransactionParams, "feeRate"> & {
27
18
  isProgramDerivedAddress?: boolean;
@@ -1,8 +1,7 @@
1
- import { type Address, type Instruction, type KeyPairSigner, type Rpc, type SolanaRpcApi, type Transaction } from "@solana/kit";
1
+ import { type Connection, PublicKey, type Signer, type Transaction, type TransactionInstruction, type VersionedTransaction } from "@solana/web3.js";
2
2
  import { AssetValue, type DerivationPathArray, type GenericCreateTransactionParams } from "@swapkit/helpers";
3
3
  import type { SolanaCreateTransactionParams, SolanaProvider, SolanaTransferParams } from "./index";
4
- type SolanaSigner = SolanaProvider | KeyPairSigner;
5
- type SolanaRpc = Rpc<SolanaRpcApi>;
4
+ type SolanaSigner = SolanaProvider | Signer;
6
5
  type TokenMetadata = {
7
6
  name: string;
8
7
  symbol: string;
@@ -13,11 +12,8 @@ type TokenMetadata = {
13
12
  id: string;
14
13
  };
15
14
  export declare function fetchTokenMetaData(mintAddress: string): Promise<TokenMetadata | null>;
16
- export declare function validateSolanaAddress(addr: string): boolean;
17
- declare function getSolanaBalance(addr: string): Promise<AssetValue[]>;
18
- declare function getRpc(): Promise<SolanaRpc>;
19
- declare function getAddressFromPubKey(publicKey: Address | string): string;
20
- declare function getPubkeyFromAddress(addr: string): Address;
15
+ declare function getSolanaBalance(address: string): Promise<AssetValue[]>;
16
+ export declare function validateSolanaAddress(address: string): boolean;
21
17
  export declare function getSolanaToolbox(toolboxParams?: {
22
18
  signer?: SolanaSigner;
23
19
  } | {
@@ -25,31 +21,32 @@ export declare function getSolanaToolbox(toolboxParams?: {
25
21
  index?: number;
26
22
  derivationPath?: DerivationPathArray;
27
23
  }): {
28
- broadcastTransaction: (transaction: Transaction | string) => Promise<string>;
24
+ broadcastTransaction: (transaction: Transaction | VersionedTransaction) => Promise<string>;
29
25
  createKeysForPath: typeof createKeysForPath;
30
- createTransaction: ({ recipient, assetValue, memo, isProgramDerivedAddress, sender, sweep, }: SolanaCreateTransactionParams) => Promise<Transaction>;
31
- createTransactionFromInstructions: ({ instructions, }: {
32
- instructions: Instruction[];
33
- isProgramDerivedAddress?: boolean;
34
- }) => Promise<Transaction>;
35
- estimateTransactionFee: ({ recipient, assetValue, memo, isProgramDerivedAddress, sender, sweep, }: Omit<GenericCreateTransactionParams, "feeRate"> & {
26
+ createTransaction: ({ recipient, assetValue, memo, isProgramDerivedAddress, sender, recentBlockhash, sweep, }: SolanaCreateTransactionParams) => Promise<Transaction>;
27
+ createTransactionFromInstructions: typeof createTransactionFromInstructions;
28
+ estimateTransactionFee: ({ recipient, assetValue, memo, isProgramDerivedAddress, sender, }: Omit<GenericCreateTransactionParams, "feeRate"> & {
36
29
  isProgramDerivedAddress?: boolean;
37
30
  }) => Promise<AssetValue>;
38
31
  getAddress: () => Promise<string>;
39
32
  getAddressFromPubKey: typeof getAddressFromPubKey;
40
33
  getBalance: (address: string, scamFilter?: boolean) => Promise<AssetValue[]>;
41
34
  getBalanceFromRPC: typeof getSolanaBalance;
42
- /** @deprecated Use `getRpc()` instead. Will be removed in next major version. */
43
- getConnection: typeof getRpc;
44
- getPubkeyFromAddress: typeof getPubkeyFromAddress;
45
- getRpc: typeof getRpc;
46
- signAndBroadcastTransaction: (transaction: Transaction | string) => Promise<string>;
47
- signTransaction: (transaction: Transaction | string) => Promise<Transaction>;
35
+ getConnection: typeof getConnection;
36
+ getPubkeyFromAddress: (address: string) => PublicKey;
37
+ signAndBroadcastTransaction: (transaction: Transaction | VersionedTransaction) => Promise<string>;
38
+ signTransaction: (transaction: Transaction | VersionedTransaction) => Promise<Transaction | VersionedTransaction>;
48
39
  transfer: ({ recipient, assetValue, memo, isProgramDerivedAddress, sweep }: SolanaTransferParams) => Promise<string>;
49
40
  validateAddress: typeof validateSolanaAddress;
50
41
  };
42
+ declare function getConnection(): Promise<Connection>;
43
+ declare function createTransactionFromInstructions({ instructions, }: {
44
+ instructions: TransactionInstruction[];
45
+ isProgramDerivedAddress?: boolean;
46
+ }): Promise<Transaction>;
51
47
  export declare function createKeysForPath({ phrase, derivationPath, }: {
52
48
  phrase: string;
53
49
  derivationPath?: string;
54
- }): Promise<KeyPairSigner>;
50
+ }): Promise<import("@solana/web3.js/lib").Keypair>;
51
+ declare function getAddressFromPubKey(publicKey: PublicKey): string;
55
52
  export {};
@@ -13,6 +13,7 @@ export declare function getUtxoApi(chain: UTXOChain): {
13
13
  utxo: never[];
14
14
  } | undefined>;
15
15
  getBalance: (address: string) => Promise<number>;
16
+ getBlockHeight: () => Promise<number>;
16
17
  getRawTx: (txHash: string) => Promise<string>;
17
18
  getSuggestedTxFee: () => Promise<number>;
18
19
  getTransactionDetails: (txHash: string) => Promise<{
@@ -72,6 +73,7 @@ export declare function createCustomUtxoApi(methods: ReturnType<typeof getUtxoAp
72
73
  utxo: never[];
73
74
  } | undefined>;
74
75
  getBalance: (address: string) => Promise<number>;
76
+ getBlockHeight: () => Promise<number>;
75
77
  getRawTx: (txHash: string) => Promise<string>;
76
78
  getSuggestedTxFee: () => Promise<number>;
77
79
  getTransactionDetails: (txHash: string) => Promise<{