@swapkit/toolboxes 6.0.0 → 6.0.1
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,5 +1,12 @@
|
|
|
1
1
|
# @swapkit/toolboxes
|
|
2
2
|
|
|
3
|
+
## 6.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#424](https://github.com/swapkit/sdk/pull/424) [`3254bf4`](https://github.com/swapkit/sdk/commit/3254bf4d7496289307c2f22edabf627f63479611) Thanks [@hippocampusSK](https://github.com/hippocampusSK)! - Solana: the payer SOL check for SPL transfers that create the recipient's associated token account is now opt-in. Pass `checkPayerBalance: true` to `createTransaction` or `transfer` to get `toolbox_solana_insufficient_balance` instead of a transaction that fails simulation; by default no extra RPC calls are made and the transaction is returned as before. The recipient token account is still created with `CreateIdempotent`.
|
|
8
|
+
- [#415](https://github.com/swapkit/sdk/pull/415) [`3e3dca0`](https://github.com/swapkit/sdk/commit/3e3dca0aea7625917a797c1a8183c60a47ae5574) Thanks [@github-actions](https://github.com/apps/github-actions)! - Update generated token lists. (via @swapkit/helpers@6.0.1)
|
|
9
|
+
|
|
3
10
|
## 6.0.0
|
|
4
11
|
|
|
5
12
|
### Major Changes
|
package/dist/src/solana/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ia as D}from"../../chunk-xdkdc1f0.js";import{ja as
|
|
1
|
+
import{ia as D}from"../../chunk-xdkdc1f0.js";import{ja as d}from"../../chunk-exyqap7m.js";import{PublicKey as P}from"@solana/web3.js";import{AssetValue as A,Chain as p,DerivationPath as F,derivationPathToString as G,getChainConfig as O,getRPCUrl as N,NetworkDerivationPath as L,SwapKitError as T,updateDerivationPath as E}from"@swapkit/helpers";import{match as U,P as B}from"ts-pattern";async function j(n){let e=A.from({address:n,chain:p.Solana});if(e.symbol!=="UNKNOWN")return{decimals:e.decimal||0,id:n,logoURI:e.getIconUrl(),name:e.symbol,symbol:e.ticker};let t=`https://lite-api.jup.ag/tokens/v2/search?query=${encodeURIComponent(n)}`;try{let o=await fetch(t);if(!o.ok)return null;let r=await o.json();if(!Array.isArray(r)||r.length===0)return null;return r.find((a)=>a.id===n)||null}catch{return null}}async function V(n){let e=await w(),{PublicKey:t}=await import("@solana/web3.js"),{TOKEN_PROGRAM_ID:o}=await import("@solana/spl-token"),r=new t(n),{baseDecimal:i}=O(p.Solana),a=await e.getBalance(r),c=[A.from({chain:p.Solana,fromBaseDecimal:i,value:a||0})],s=await e.getParsedTokenAccountsByOwner(r,{programId:o});for(let{account:m}of s.value){let l=m.data.parsed.info,f=l.mint,y=l.tokenAmount.amount;if(Number(y)===0)continue;let u=await j(f),g=u?.symbol||"UNKNOWN",h=u?.decimals||l.tokenAmount.decimals;c.push(A.from({asset:`${p.Solana}.${g}-${f}`,fromBaseDecimal:h,value:y}))}return c}function M(n){try{let e=new P(n);return P.isOnCurve(e.toBytes())}catch{return!1}}function en(n){let e=n&&"index"in n?n.index||0:0,t=G(n&&"derivationPath"in n&&n.derivationPath?n.derivationPath:E(L[p.Solana],{index:e})),o;async function r(){if(o)return o;return o=await U(n).with({phrase:B.string},({phrase:a})=>I({derivationPath:t,phrase:a})).with({signer:B.any},({signer:a})=>a).otherwise(()=>{return}),o}async function i(){let a=await r();return a?.publicKey?R(a.publicKey):""}return{broadcastTransaction:_(w),createKeysForPath:I,createTransaction:K(w),createTransactionFromInstructions:Z,estimateTransactionFee:q(w),getAddress:i,getAddressFromPubKey:R,getBalance:D(p.Solana),getBalanceFromRPC:V,getConnection:w,getPubkeyFromAddress:(a)=>new P(a),signAndBroadcastTransaction:async(a)=>{let c=await x(w,r)(a);return _(w)(c)},signTransaction:x(w,r),transfer:J(w,r),validateAddress:M}}function q(n){return async({recipient:e,assetValue:t,memo:o,isProgramDerivedAddress:r,sender:i})=>{let a=await n(),c=await K(n)({assetValue:t,isProgramDerivedAddress:r,memo:o,recipient:e,sender:i}),s=await C(a,c),{baseDecimal:m}=O(p.Solana);return A.from({chain:p.Solana,fromBaseDecimal:m,value:s})}}async function C(n,e){let t=await n.getFeeForMessage(e.compileMessage());if(t.value===null)throw new T("toolbox_fee_estimation_failed","Could not estimate Solana fee.");return t.value}async function w(){let{Connection:n}=await import("@solana/web3.js"),e=await N(p.Solana);return new n(e,{commitment:"confirmed",fetchMiddleware:(t,o,r)=>{let i={};for(let[a,c]of Object.entries(o?.headers??{})){let s=a.toLowerCase();if(s!=="pragma"&&s!=="solana-client")i[a]=c}r(t,{...o,headers:i})}})}function W(n){return async({assetValue:e,recipient:t,sender:o,isProgramDerivedAddress:r,sweep:i})=>{let a=new P(o);if(e.isGasAsset){let{Transaction:c,SystemProgram:s}=await import("@solana/web3.js");return new c().add(s.transfer({fromPubkey:a,lamports:i?0:e.getBaseValue("number"),toPubkey:new P(t)}))}if(e.address){let c=await n();return H({amount:i?0:e.getBaseValue("number"),connection:c,decimals:e.decimal,from:a,isProgramDerivedAddress:r,recipient:t,sweep:i,tokenAddress:e.address})}return}}async function H({tokenAddress:n,recipient:e,from:t,connection:o,amount:r,decimals:i,isProgramDerivedAddress:a,sweep:c}){let{getAssociatedTokenAddress:s,getAccount:m,createAssociatedTokenAccountIdempotentInstruction:l,createTransferCheckedInstruction:f}=await import("@solana/spl-token"),{Transaction:y}=await import("@solana/web3.js"),u=new y,g=new P(n),h=await s(g,t),S=new P(e),b=await s(g,S,a),k=!1;try{await m(o,b),k=!0}catch{}if(!k)u.add(l(t,b,S,g));let v=c?BigInt((await o.getTokenAccountBalance(h)).value.amount):r;if(c&&v<=0n)throw new T({errorKey:"toolbox_sweep_amount_too_low",info:{asset:n,balance:v.toString()}});return u.add(f(h,g,b,t,v,i)),u}async function z(n,e,t){let{ACCOUNT_SIZE:o,ASSOCIATED_TOKEN_PROGRAM_ID:r}=await import("@solana/spl-token");if(!e.instructions.some(({programId:f})=>f.equals(r)))return;let[a,c,s,m]=await Promise.all([n.getBalance(t),C(n,e),n.getMinimumBalanceForRentExemption(o),n.getMinimumBalanceForRentExemption(0)]),l=c+s+m;if(a<l)throw new T({errorKey:"toolbox_solana_insufficient_balance",info:{balance:a,fee:c,rentReserve:m,required:l,tokenAccountRent:s}})}function K(n){return async({checkPayerBalance:e=!1,recipient:t,assetValue:o,memo:r,isProgramDerivedAddress:i,sender:a,recentBlockhash:c,sweep:s})=>{let{createMemoInstruction:m}=await import("@solana/spl-memo"),l=new P(a);if(!(i||M(t)))throw new T("core_transaction_invalid_recipient_address");let f,y=()=>f??=n(),u=await W(y)({assetValue:o,isProgramDerivedAddress:i,recipient:t,sender:a,sweep:s});if(!u)throw new T("core_transaction_invalid_sender_address");if(r)u.add(m(r));if(u.recentBlockhash=c??(await(await y()).getLatestBlockhash()).blockhash,u.feePayer=l,e&&!o.isGasAsset)await z(await y(),u,l);if(s&&o.isGasAsset){let g=await y(),[h,S,b]=await Promise.all([g.getBalance(l),C(g,u),g.getMinimumBalanceForRentExemption(0)]),k=h-S-b;if(k<=0)throw new T({errorKey:"toolbox_sweep_amount_too_low",info:{balance:h,fee:S,rentReserve:b}});let{SystemProgram:v}=await import("@solana/web3.js");u.instructions[0]=v.transfer({fromPubkey:l,lamports:k,toPubkey:new P(t)})}return u}}async function Z({instructions:n}){let{Transaction:e}=await import("@solana/web3.js"),t=new e().add(...n);if(!t)throw new T("core_transaction_invalid_sender_address");return t}function J(n,e){return async({recipient:t,assetValue:o,checkPayerBalance:r,memo:i,isProgramDerivedAddress:a,sweep:c})=>{let s=await e();if(!s)throw new T("core_transaction_invalid_sender_address");let m=s.publicKey?.toString()??(await s.connect()).publicKey.toString(),l=await K(n)({assetValue:o,checkPayerBalance:r,isProgramDerivedAddress:a,memo:i,recipient:t,sender:m,sweep:c});if("signTransaction"in s){let f=await s.signTransaction(l);return _(n)(f)}return l.sign(s),_(n)(l)}}function _(n){return async(e)=>(await n()).sendRawTransaction(e.serialize())}function x(n,e){return async(t)=>{let o=await e();if(!o)throw new T("toolbox_solana_no_signer");let{VersionedTransaction:r}=await import("@solana/web3.js");if(!(t instanceof r)){let a=await(await n()).getLatestBlockhash();t.recentBlockhash=a.blockhash,t.feePayer=o.publicKey||void 0}if("connect"in o)return await o.signTransaction(t);return t.sign([o]),t}}async function I({phrase:n,derivationPath:e=F.SOL}){let{HDKey:t}=await import("micro-key-producer/slip10.js"),{mnemonicToSeedSync:o}=await import("@scure/bip39"),{Keypair:r}=await import("@solana/web3.js"),i=o(n),a=t.fromMasterSeed(i);return r.fromSeed(a.derive(e,!0).privateKey)}function R(n){return n.toString()}export{I as createKeysForPath,j as fetchTokenMetaData,en as getSolanaToolbox,M as validateSolanaAddress};
|
|
@@ -15,10 +15,13 @@ export interface SolanaProvider {
|
|
|
15
15
|
signTransaction: <T extends Transaction | VersionedTransaction = Transaction>(transaction: T) => Promise<T>;
|
|
16
16
|
}
|
|
17
17
|
export type SolanaCreateTransactionParams = Omit<GenericCreateTransactionParams, "feeRate"> & {
|
|
18
|
+
/** Rejects SPL transfers whose SOL can't cover the fee and the recipient token account rent. Off by default. */
|
|
19
|
+
checkPayerBalance?: boolean;
|
|
18
20
|
isProgramDerivedAddress?: boolean;
|
|
19
21
|
/** Pre-fetched recent blockhash; when provided, skips the getLatestBlockhash round-trip. */
|
|
20
22
|
recentBlockhash?: string;
|
|
21
23
|
};
|
|
22
24
|
export type SolanaTransferParams = Omit<GenericTransferParams, "feeRate"> & {
|
|
25
|
+
checkPayerBalance?: boolean;
|
|
23
26
|
isProgramDerivedAddress?: boolean;
|
|
24
27
|
};
|
|
@@ -23,7 +23,7 @@ export declare function getSolanaToolbox(toolboxParams?: {
|
|
|
23
23
|
}): {
|
|
24
24
|
broadcastTransaction: (transaction: Transaction | VersionedTransaction) => Promise<string>;
|
|
25
25
|
createKeysForPath: typeof createKeysForPath;
|
|
26
|
-
createTransaction: ({ recipient, assetValue, memo, isProgramDerivedAddress, sender, recentBlockhash, sweep, }: SolanaCreateTransactionParams) => Promise<Transaction>;
|
|
26
|
+
createTransaction: ({ checkPayerBalance, recipient, assetValue, memo, isProgramDerivedAddress, sender, recentBlockhash, sweep, }: SolanaCreateTransactionParams) => Promise<Transaction>;
|
|
27
27
|
createTransactionFromInstructions: typeof createTransactionFromInstructions;
|
|
28
28
|
estimateTransactionFee: ({ recipient, assetValue, memo, isProgramDerivedAddress, sender, }: Omit<GenericCreateTransactionParams, "feeRate"> & {
|
|
29
29
|
isProgramDerivedAddress?: boolean;
|
|
@@ -36,7 +36,7 @@ export declare function getSolanaToolbox(toolboxParams?: {
|
|
|
36
36
|
getPubkeyFromAddress: (address: string) => PublicKey;
|
|
37
37
|
signAndBroadcastTransaction: (transaction: Transaction | VersionedTransaction) => Promise<string>;
|
|
38
38
|
signTransaction: (transaction: Transaction | VersionedTransaction) => Promise<Transaction | VersionedTransaction>;
|
|
39
|
-
transfer: ({ recipient, assetValue, memo, isProgramDerivedAddress, sweep }: SolanaTransferParams) => Promise<string>;
|
|
39
|
+
transfer: ({ recipient, assetValue, checkPayerBalance, memo, isProgramDerivedAddress, sweep, }: SolanaTransferParams) => Promise<string>;
|
|
40
40
|
validateAddress: typeof validateSolanaAddress;
|
|
41
41
|
};
|
|
42
42
|
declare function getConnection(): Promise<Connection>;
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"dependencies": { "@swapkit/helpers": "6.0.
|
|
2
|
+
"dependencies": { "@swapkit/helpers": "6.0.1", "@swapkit/utxo-signer": "3.1.0" },
|
|
3
3
|
"description": "SwapKit - Toolboxes",
|
|
4
4
|
"devDependencies": {
|
|
5
5
|
"@aptos-labs/ts-sdk": "7.0.1",
|
|
@@ -131,5 +131,5 @@
|
|
|
131
131
|
"type-check:go": "tsgo"
|
|
132
132
|
},
|
|
133
133
|
"type": "module",
|
|
134
|
-
"version": "6.0.
|
|
134
|
+
"version": "6.0.1"
|
|
135
135
|
}
|