@neutral-trade/sdk 0.4.5 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as SupportedToken, B as DEFAULT_BUNDLE_PROGRAM_ID_DEVNET, C as VaultRegistryEntry, D as UserBundleAccount, E as OracleData, F as ALLOWLISTED_BUNDLE_PROGRAM_IDS_BY_CLUSTER, G as getDefaultBundleProgramIdByCluster, H as assertAllowlistedBundleProgramId, I as BUNDLE_PROGRAM_ID_V2_MAINNET, K as isAllowlistedBundleProgramId, L as BundleCluster, M as getSolanaTokenDecimals, N as getSolanaTokenMint, O as UserBundleTempData, P as tokens, R as BundleProgram, S as VaultRegistry, T as BundleAccount, U as createAllowlistedBundleProgram, V as DEFAULT_BUNDLE_PROGRAM_ID_MAINNET, W as createBundleProgramById, _ as vaults, b as VaultBalanceData, d as NeutralTradeConfig, f as getBundleProgramId, g as isValidVaultAddress, h as getVaultRegistry, j as Token, k as SupportedChain, m as getVaultById, p as getVaultByAddress, t as NeutralTradeCoreContext, u as NeutralTrade, v as vaultsDevnet, w as VaultType, x as VaultCategory, y as UserBalanceResult, z as BundleProvider } from "./neutral-trade-core-BGjOiCsY.mjs";
2
- import { AnchorProvider, Wallet } from "@coral-xyz/anchor";
1
+ import { A as SupportedToken, B as DEFAULT_BUNDLE_PROGRAM_ID_DEVNET, C as VaultRegistryEntry, D as UserBundleAccount, E as OracleData, F as ALLOWLISTED_BUNDLE_PROGRAM_IDS_BY_CLUSTER, G as getDefaultBundleProgramIdByCluster, H as assertAllowlistedBundleProgramId, I as BUNDLE_PROGRAM_ID_V2_MAINNET, K as isAllowlistedBundleProgramId, L as BundleCluster, M as getSolanaTokenDecimals, N as getSolanaTokenMint, O as UserBundleTempData, P as tokens, R as BundleProgram, S as VaultRegistry, T as BundleAccount, U as createAllowlistedBundleProgram, V as DEFAULT_BUNDLE_PROGRAM_ID_MAINNET, W as createBundleProgramById, _ as vaults$1, b as VaultBalanceData, d as NeutralTradeConfig, f as getBundleProgramId, g as isValidVaultAddress, h as getVaultRegistry, j as Token, k as SupportedChain, m as getVaultById, p as getVaultByAddress, t as NeutralTradeCoreContext, u as NeutralTrade, v as vaultsDevnet, w as VaultType, x as VaultCategory, y as UserBalanceResult, z as BundleProvider } from "./neutral-trade-core-BGjOiCsY.mjs";
2
+ import { AnchorProvider, Program, Wallet } from "@coral-xyz/anchor";
3
3
  import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js";
4
4
  import BN from "bn.js";
5
5
 
@@ -199,6 +199,24 @@ declare function parseAmountRawToBigInt(amountRaw: string): bigint;
199
199
  */
200
200
  declare function humanFloatToAmountRawString(human: number, decimals: number): string;
201
201
  //#endregion
202
+ //#region src/utils/bundle.d.ts
203
+ /**
204
+ * Estimated unpaid bundle fees in deposit token (mgmt + performance), matching on-chain `charge_user_fees`.
205
+ */
206
+ declare function estimatePendingBundleFeeToken({
207
+ oracleData,
208
+ bundleData,
209
+ userBundle,
210
+ assetDecimals,
211
+ nowUnixSeconds
212
+ }: {
213
+ oracleData: OracleData;
214
+ bundleData: BundleAccount;
215
+ userBundle: UserBundleAccount;
216
+ assetDecimals: number;
217
+ nowUnixSeconds?: number;
218
+ }): number;
219
+ //#endregion
202
220
  //#region src/utils/bundle-fee-override.d.ts
203
221
  /** Mirrors `bundle-sc` `FEE_OVERRIDE_*` bit flags. */
204
222
  declare const FEE_OVERRIDE: {
@@ -206,6 +224,7 @@ declare const FEE_OVERRIDE: {
206
224
  readonly WITHDRAWAL: number;
207
225
  readonly PERFORMANCE: number;
208
226
  readonly MANAGEMENT: number;
227
+ readonly ALL: number;
209
228
  };
210
229
  interface EffectiveFeeBps {
211
230
  depositFeeBps: number;
@@ -213,6 +232,14 @@ interface EffectiveFeeBps {
213
232
  performanceFeeBps: number;
214
233
  managementFeeBps: number;
215
234
  }
235
+ /** Normalized per-user fee override fields (bps + flag mask). */
236
+ interface UserFeeOverrideFields {
237
+ feeOverrideFlags: number;
238
+ customDepositFeeBps: number;
239
+ customWithdrawalFeeBps: number;
240
+ customPerformanceFeeBps: number;
241
+ customManagementFeeBps: number;
242
+ }
216
243
  /** Decimal fees matching frontend `VaultConfig` (`0.01` = 1%). */
217
244
  interface EffectiveVaultFeeDecimals {
218
245
  dfee: number;
@@ -222,12 +249,22 @@ interface EffectiveVaultFeeDecimals {
222
249
  }
223
250
  declare function bpsToFeeDecimal(bps: number): number;
224
251
  declare function feeDecimalToBps(decimal: number): number;
252
+ declare function bpsToPercentLabel(bps: number): string;
253
+ declare function hasFeeOverrideFlag(flags: number, bit: number): boolean;
254
+ declare function buildFeeOverrideMask(flags: {
255
+ deposit?: boolean;
256
+ withdrawal?: boolean;
257
+ performance?: boolean;
258
+ management?: boolean;
259
+ }): number;
260
+ declare function formatFeeOverrideFlags(flags: number): string;
261
+ declare function readUserFeeOverrideFields(account: Record<string, unknown>): UserFeeOverrideFields;
225
262
  declare function vaultFeeDecimalsToBps(fees: EffectiveVaultFeeDecimals): EffectiveFeeBps;
226
263
  declare function effectiveFeeBpsToDecimals(fees: EffectiveFeeBps): EffectiveVaultFeeDecimals;
227
264
  /**
228
265
  * Apply per-user fee override flags onto default bps (bundle or vault-config defaults).
229
266
  */
230
- declare function resolveEffectiveFeeBpsFromDefaults(defaults: EffectiveFeeBps, user: UserBundleAccount): EffectiveFeeBps;
267
+ declare function resolveEffectiveFeeBpsFromDefaults(defaults: EffectiveFeeBps, user: UserFeeOverrideFields): EffectiveFeeBps;
231
268
  /**
232
269
  * Mirror on-chain `resolve_effective_fees`. Returns fee rates in bps.
233
270
  */
@@ -243,6 +280,11 @@ declare function computeDepositFeePreview(grossAmount: number, depositFeeDecimal
243
280
  feeAmount: number;
244
281
  netAmount: number;
245
282
  };
283
+ /** Same linear preview as deposit: fee = gross × rate, net = gross − fee. */
284
+ declare function computeWithdrawFeePreview(grossAmount: number, withdrawalFeeDecimal: number): {
285
+ feeAmount: number;
286
+ netAmount: number;
287
+ };
246
288
  //#endregion
247
289
  //#region src/utils/request-withdraw-shares.d.ts
248
290
  /**
@@ -326,4 +368,4 @@ declare function derivePendingAuthPDA(bundlePDA: PublicKey, programId: PublicKey
326
368
  */
327
369
  declare function getVaultDepositorAddressSync(programId: PublicKey, vault: PublicKey, authority: PublicKey): PublicKey;
328
370
  //#endregion
329
- export { ALLOWLISTED_BUNDLE_PROGRAM_IDS_BY_CLUSTER, BUNDLE_PROGRAM_ID_V2_MAINNET, type BuildBundleDepositInstructionsParams, type BuildBundleRequestWithdrawInstructionParams, type BundleAccount, type BundleCluster, type BundleProgram, type BundleProvider, DEFAULT_BUNDLE_PROGRAM_ID_DEVNET, DEFAULT_BUNDLE_PROGRAM_ID_MAINNET, DevnetVaultId, type EffectiveFeeBps, type EffectiveVaultFeeDecimals, FEE_OVERRIDE, NeutralTrade, type NeutralTradeConfig, type NeutralTradeCoreContext, type OracleData, SEED_ORACLE, SEED_PENDING_AUTH, SEED_TEMP, SEED_USER, SupportedChain, SupportedToken, type Token, type UserBalanceResult, type UserBundleAccount, type UserBundleTempData, type VaultBalanceData, VaultCategory, VaultId, type VaultRegistry, type VaultRegistryEntry, VaultType, assertAllowlistedBundleProgramId, bpsToFeeDecimal, buildBundleDepositInstructions, buildBundleRequestWithdrawInstruction, computeDepositFeePreview, computeRequestWithdrawalSharesFromAmountRaw, createAllowlistedBundleProgram, createBundleProgramById, createDummyWallet, deriveOraclePDA, derivePendingAuthPDA, deriveTempDataPDA, deriveUserPDA, effectiveFeeBpsToDecimals, feeDecimalToBps, getBundleProgramId, getDefaultBundleProgramIdByCluster, getSolanaTokenDecimals, getSolanaTokenMint, getVaultByAddress, getVaultById, getVaultDepositorAddressSync, getVaultRegistry, hasAnyFeeOverride, hasCustomFeeRate, humanFloatToAmountRawString, isAllowlistedBundleProgramId, isValidVaultAddress, parseAmountRawToBigInt, resolveEffectiveFeeBps, resolveEffectiveFeeBpsFromDefaults, resolveEffectiveVaultFees, tokens, vaultFeeDecimalsToBps, vaults, vaultsDevnet };
371
+ export { ALLOWLISTED_BUNDLE_PROGRAM_IDS_BY_CLUSTER, BUNDLE_PROGRAM_ID_V2_MAINNET, type BuildBundleDepositInstructionsParams, type BuildBundleRequestWithdrawInstructionParams, type BundleAccount, type BundleCluster, type BundleProgram, type BundleProvider, DEFAULT_BUNDLE_PROGRAM_ID_DEVNET, DEFAULT_BUNDLE_PROGRAM_ID_MAINNET, DevnetVaultId, type EffectiveFeeBps, type EffectiveVaultFeeDecimals, FEE_OVERRIDE, NeutralTrade, type NeutralTradeConfig, type NeutralTradeCoreContext, type OracleData, SEED_ORACLE, SEED_PENDING_AUTH, SEED_TEMP, SEED_USER, SupportedChain, SupportedToken, type Token, type UserBalanceResult, type UserBundleAccount, type UserBundleTempData, type UserFeeOverrideFields, type VaultBalanceData, VaultCategory, VaultId, type VaultRegistry, type VaultRegistryEntry, VaultType, assertAllowlistedBundleProgramId, bpsToFeeDecimal, bpsToPercentLabel, buildBundleDepositInstructions, buildBundleRequestWithdrawInstruction, buildFeeOverrideMask, computeDepositFeePreview, computeRequestWithdrawalSharesFromAmountRaw, computeWithdrawFeePreview, createAllowlistedBundleProgram, createBundleProgramById, createDummyWallet, deriveOraclePDA, derivePendingAuthPDA, deriveTempDataPDA, deriveUserPDA, effectiveFeeBpsToDecimals, estimatePendingBundleFeeToken, feeDecimalToBps, formatFeeOverrideFlags, getBundleProgramId, getDefaultBundleProgramIdByCluster, getSolanaTokenDecimals, getSolanaTokenMint, getVaultByAddress, getVaultById, getVaultDepositorAddressSync, getVaultRegistry, hasAnyFeeOverride, hasCustomFeeRate, hasFeeOverrideFlag, humanFloatToAmountRawString, isAllowlistedBundleProgramId, isValidVaultAddress, parseAmountRawToBigInt, readUserFeeOverrideFields, resolveEffectiveFeeBps, resolveEffectiveFeeBpsFromDefaults, resolveEffectiveVaultFees, tokens, vaultFeeDecimalsToBps, vaults$1 as vaults, vaultsDevnet };
package/dist/index.mjs CHANGED
@@ -191,7 +191,8 @@ const FEE_OVERRIDE = {
191
191
  DEPOSIT: 1,
192
192
  WITHDRAWAL: 2,
193
193
  PERFORMANCE: 4,
194
- MANAGEMENT: 8
194
+ MANAGEMENT: 8,
195
+ ALL: 15
195
196
  };
196
197
  const FEE_EPS = 1e-9;
197
198
  function bpsToFeeDecimal(bps) {
@@ -200,6 +201,37 @@ function bpsToFeeDecimal(bps) {
200
201
  function feeDecimalToBps(decimal) {
201
202
  return Math.round(decimal * 1e4);
202
203
  }
204
+ function bpsToPercentLabel(bps) {
205
+ return (bps / 100).toFixed(4).replace(/\.?0+$/, "");
206
+ }
207
+ function hasFeeOverrideFlag(flags, bit) {
208
+ return (flags & bit) !== 0;
209
+ }
210
+ function buildFeeOverrideMask(flags) {
211
+ let mask = 0;
212
+ if (flags.deposit) mask |= FEE_OVERRIDE.DEPOSIT;
213
+ if (flags.withdrawal) mask |= FEE_OVERRIDE.WITHDRAWAL;
214
+ if (flags.performance) mask |= FEE_OVERRIDE.PERFORMANCE;
215
+ if (flags.management) mask |= FEE_OVERRIDE.MANAGEMENT;
216
+ return mask;
217
+ }
218
+ function formatFeeOverrideFlags(flags) {
219
+ const parts = [];
220
+ if (hasFeeOverrideFlag(flags, FEE_OVERRIDE.DEPOSIT)) parts.push("deposit");
221
+ if (hasFeeOverrideFlag(flags, FEE_OVERRIDE.WITHDRAWAL)) parts.push("withdrawal");
222
+ if (hasFeeOverrideFlag(flags, FEE_OVERRIDE.PERFORMANCE)) parts.push("performance");
223
+ if (hasFeeOverrideFlag(flags, FEE_OVERRIDE.MANAGEMENT)) parts.push("management");
224
+ return parts.length > 0 ? parts.join(", ") : "none";
225
+ }
226
+ function readUserFeeOverrideFields(account) {
227
+ return {
228
+ feeOverrideFlags: toNum(account.feeOverrideFlags ?? account.fee_override_flags),
229
+ customDepositFeeBps: toNum(account.customDepositFeeBps ?? account.custom_deposit_fee_bps),
230
+ customWithdrawalFeeBps: toNum(account.customWithdrawalFeeBps ?? account.custom_withdrawal_fee_bps),
231
+ customPerformanceFeeBps: toNum(account.customPerformanceFeeBps ?? account.custom_performance_fee_bps),
232
+ customManagementFeeBps: toNum(account.customManagementFeeBps ?? account.custom_management_fee_bps)
233
+ };
234
+ }
203
235
  function toNum(value) {
204
236
  if (typeof value === "number") return value;
205
237
  if (typeof value === "bigint") return Number(value);
@@ -276,6 +308,10 @@ function computeDepositFeePreview(grossAmount, depositFeeDecimal) {
276
308
  netAmount: grossAmount - feeAmount
277
309
  };
278
310
  }
311
+ /** Same linear preview as deposit: fee = gross × rate, net = gross − fee. */
312
+ function computeWithdrawFeePreview(grossAmount, withdrawalFeeDecimal) {
313
+ return computeDepositFeePreview(grossAmount, withdrawalFeeDecimal);
314
+ }
279
315
 
280
316
  //#endregion
281
317
  //#region src/utils/bundle.ts
@@ -500,4 +536,4 @@ var NeutralTrade = class NeutralTrade {
500
536
  };
501
537
 
502
538
  //#endregion
503
- export { ALLOWLISTED_BUNDLE_PROGRAM_IDS_BY_CLUSTER, BUNDLE_PROGRAM_ID_V2_MAINNET, DEFAULT_BUNDLE_PROGRAM_ID_DEVNET, DEFAULT_BUNDLE_PROGRAM_ID_MAINNET, DevnetVaultId, FEE_OVERRIDE, NeutralTrade, SEED_ORACLE, SEED_PENDING_AUTH, SEED_TEMP, SEED_USER, SupportedChain, SupportedToken, VaultCategory, VaultId, VaultType, assertAllowlistedBundleProgramId, bpsToFeeDecimal, buildBundleDepositInstructions, buildBundleRequestWithdrawInstruction, computeDepositFeePreview, computeRequestWithdrawalSharesFromAmountRaw, createAllowlistedBundleProgram, createBundleProgramById, createDummyWallet, deriveOraclePDA, derivePendingAuthPDA, deriveTempDataPDA, deriveUserPDA, effectiveFeeBpsToDecimals, feeDecimalToBps, getBundleProgramId, getDefaultBundleProgramIdByCluster, getSolanaTokenDecimals, getSolanaTokenMint, getVaultByAddress, getVaultById, getVaultDepositorAddressSync, getVaultRegistry, hasAnyFeeOverride, hasCustomFeeRate, humanFloatToAmountRawString, isAllowlistedBundleProgramId, isValidVaultAddress, parseAmountRawToBigInt, resolveEffectiveFeeBps, resolveEffectiveFeeBpsFromDefaults, resolveEffectiveVaultFees, tokens, vaultFeeDecimalsToBps, vaults, vaultsDevnet };
539
+ export { ALLOWLISTED_BUNDLE_PROGRAM_IDS_BY_CLUSTER, BUNDLE_PROGRAM_ID_V2_MAINNET, DEFAULT_BUNDLE_PROGRAM_ID_DEVNET, DEFAULT_BUNDLE_PROGRAM_ID_MAINNET, DevnetVaultId, FEE_OVERRIDE, NeutralTrade, SEED_ORACLE, SEED_PENDING_AUTH, SEED_TEMP, SEED_USER, SupportedChain, SupportedToken, VaultCategory, VaultId, VaultType, assertAllowlistedBundleProgramId, bpsToFeeDecimal, bpsToPercentLabel, buildBundleDepositInstructions, buildBundleRequestWithdrawInstruction, buildFeeOverrideMask, computeDepositFeePreview, computeRequestWithdrawalSharesFromAmountRaw, computeWithdrawFeePreview, createAllowlistedBundleProgram, createBundleProgramById, createDummyWallet, deriveOraclePDA, derivePendingAuthPDA, deriveTempDataPDA, deriveUserPDA, effectiveFeeBpsToDecimals, estimatePendingBundleFeeToken, feeDecimalToBps, formatFeeOverrideFlags, getBundleProgramId, getDefaultBundleProgramIdByCluster, getSolanaTokenDecimals, getSolanaTokenMint, getVaultByAddress, getVaultById, getVaultDepositorAddressSync, getVaultRegistry, hasAnyFeeOverride, hasCustomFeeRate, hasFeeOverrideFlag, humanFloatToAmountRawString, isAllowlistedBundleProgramId, isValidVaultAddress, parseAmountRawToBigInt, readUserFeeOverrideFields, resolveEffectiveFeeBps, resolveEffectiveFeeBpsFromDefaults, resolveEffectiveVaultFees, tokens, vaultFeeDecimalsToBps, vaults, vaultsDevnet };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@neutral-trade/sdk",
3
3
  "type": "module",
4
- "version": "0.4.5",
4
+ "version": "0.4.9",
5
5
  "description": "SDK for Neutral Trade vaults",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/neutral-trade/sdk#readme",