@hodlmarkets/sdk 0.1.0 → 0.1.2

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.
Files changed (52) hide show
  1. package/README.md +6 -6
  2. package/dist/accounts.cjs +22 -0
  3. package/dist/accounts.cjs.map +1 -1
  4. package/dist/accounts.js +22 -0
  5. package/dist/accounts.js.map +1 -1
  6. package/dist/client.cjs +340 -28
  7. package/dist/client.cjs.map +1 -1
  8. package/dist/client.d.cts +6 -2
  9. package/dist/client.d.ts +6 -2
  10. package/dist/client.js +341 -29
  11. package/dist/client.js.map +1 -1
  12. package/dist/constants.cjs +3 -1
  13. package/dist/constants.cjs.map +1 -1
  14. package/dist/constants.d.cts +5 -3
  15. package/dist/constants.d.ts +5 -3
  16. package/dist/constants.js +3 -2
  17. package/dist/constants.js.map +1 -1
  18. package/dist/events.cjs +333 -14
  19. package/dist/events.cjs.map +1 -1
  20. package/dist/events.d.cts +9 -0
  21. package/dist/events.d.ts +9 -0
  22. package/dist/events.js +334 -15
  23. package/dist/events.js.map +1 -1
  24. package/dist/index.cjs +375 -31
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +3 -3
  27. package/dist/index.d.ts +3 -3
  28. package/dist/index.js +375 -32
  29. package/dist/index.js.map +1 -1
  30. package/dist/instructions.cjs +22 -0
  31. package/dist/instructions.cjs.map +1 -1
  32. package/dist/instructions.js +22 -0
  33. package/dist/instructions.js.map +1 -1
  34. package/dist/math.cjs +33 -0
  35. package/dist/math.cjs.map +1 -1
  36. package/dist/math.d.cts +14 -4
  37. package/dist/math.d.ts +14 -4
  38. package/dist/math.js +33 -1
  39. package/dist/math.js.map +1 -1
  40. package/dist/pda.cjs +1 -0
  41. package/dist/pda.cjs.map +1 -1
  42. package/dist/pda.js +1 -0
  43. package/dist/pda.js.map +1 -1
  44. package/dist/transaction.cjs +0 -13
  45. package/dist/transaction.cjs.map +1 -1
  46. package/dist/transaction.d.cts +5 -3
  47. package/dist/transaction.d.ts +5 -3
  48. package/dist/transaction.js +1 -13
  49. package/dist/transaction.js.map +1 -1
  50. package/dist/types.d.cts +3 -0
  51. package/dist/types.d.ts +3 -0
  52. package/package.json +5 -3
package/dist/math.d.cts CHANGED
@@ -39,9 +39,19 @@ declare function calculateTradableVaultedSplit(tokensOut: BN, tokensSold: BN, ba
39
39
  tradablePct: number;
40
40
  };
41
41
  /**
42
- * Calculate accrued (claimable) tokens for a position at a given timestamp.
43
- * Linear vesting: accrued = initialVaulted * elapsed / vestDuration
44
- * Capped at initialVaulted. Already-transferred tokens subtracted.
42
+ * Calculate claimable tokens for a position at a given timestamp.
43
+ *
44
+ * Mirrors the on-chain logic exactly:
45
+ * 1. update_position_accrual: vaulted tokens accrue linearly to tradable
46
+ * 2. claim_accrued: claimable = new_tradable - tokens_transferred
47
+ *
48
+ * Handles both per-position accrual and global pool unlock.
49
+ */
50
+ declare function calculateClaimableTokens(tradableTokens: BN, vaultedTokens: BN, initialVaulted: BN, tokensTransferred: BN, entryTimestamp: BN, poolCreationTimestamp: BN, vestDuration: BN, currentTimestamp: BN): BN;
51
+ /**
52
+ * @deprecated Use calculateClaimableTokens instead. This function doesn't account for
53
+ * the full position state and produces incorrect results when tokensTransferred
54
+ * includes the initial tradable portion.
45
55
  */
46
56
  declare function calculateAccruedTokens(initialVaulted: BN, tokensTransferred: BN, entryTimestamp: BN, vestDuration: BN, currentTimestamp: BN): BN;
47
57
  /**
@@ -55,4 +65,4 @@ declare function calculateSpotPrice(vammRealSol: BN, vammTokens: BN): BN;
55
65
  */
56
66
  declare function calculatePriceImpact(solIn: BN, tokensOut: BN, vammRealSol: BN, vammTokens: BN): number;
57
67
 
58
- export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
68
+ export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculateClaimableTokens, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
package/dist/math.d.ts CHANGED
@@ -39,9 +39,19 @@ declare function calculateTradableVaultedSplit(tokensOut: BN, tokensSold: BN, ba
39
39
  tradablePct: number;
40
40
  };
41
41
  /**
42
- * Calculate accrued (claimable) tokens for a position at a given timestamp.
43
- * Linear vesting: accrued = initialVaulted * elapsed / vestDuration
44
- * Capped at initialVaulted. Already-transferred tokens subtracted.
42
+ * Calculate claimable tokens for a position at a given timestamp.
43
+ *
44
+ * Mirrors the on-chain logic exactly:
45
+ * 1. update_position_accrual: vaulted tokens accrue linearly to tradable
46
+ * 2. claim_accrued: claimable = new_tradable - tokens_transferred
47
+ *
48
+ * Handles both per-position accrual and global pool unlock.
49
+ */
50
+ declare function calculateClaimableTokens(tradableTokens: BN, vaultedTokens: BN, initialVaulted: BN, tokensTransferred: BN, entryTimestamp: BN, poolCreationTimestamp: BN, vestDuration: BN, currentTimestamp: BN): BN;
51
+ /**
52
+ * @deprecated Use calculateClaimableTokens instead. This function doesn't account for
53
+ * the full position state and produces incorrect results when tokensTransferred
54
+ * includes the initial tradable portion.
45
55
  */
46
56
  declare function calculateAccruedTokens(initialVaulted: BN, tokensTransferred: BN, entryTimestamp: BN, vestDuration: BN, currentTimestamp: BN): BN;
47
57
  /**
@@ -55,4 +65,4 @@ declare function calculateSpotPrice(vammRealSol: BN, vammTokens: BN): BN;
55
65
  */
56
66
  declare function calculatePriceImpact(solIn: BN, tokensOut: BN, vammRealSol: BN, vammTokens: BN): number;
57
67
 
58
- export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
68
+ export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculateClaimableTokens, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
package/dist/math.js CHANGED
@@ -15,6 +15,7 @@ new BN2("100000000");
15
15
  PROTOCOL_FEES: Buffer.from("protocol_fees"),
16
16
  EVENT_AUTHORITY: Buffer.from("__event_authority")
17
17
  });
18
+ new BN2("85000000000");
18
19
 
19
20
  // src/math.ts
20
21
  var ZERO = new BN2(0);
@@ -55,6 +56,37 @@ function calculateTradableVaultedSplit(tokensOut, tokensSold, bandSize = BAND_SI
55
56
  const vaulted = tokensOut.sub(tradable);
56
57
  return { tradable, vaulted, tradablePct };
57
58
  }
59
+ function calculateClaimableTokens(tradableTokens, vaultedTokens, initialVaulted, tokensTransferred, entryTimestamp, poolCreationTimestamp, vestDuration, currentTimestamp) {
60
+ const totalTokens = tradableTokens.add(vaultedTokens);
61
+ if (totalTokens.isZero()) return ZERO;
62
+ const globalUnlockTime = poolCreationTimestamp.add(vestDuration);
63
+ if (currentTimestamp.gte(globalUnlockTime)) {
64
+ const claimable2 = totalTokens.sub(tokensTransferred);
65
+ return claimable2.isNeg() ? ZERO : claimable2;
66
+ }
67
+ if (initialVaulted.isZero() || vestDuration.isZero()) {
68
+ const claimable2 = totalTokens.sub(tokensTransferred);
69
+ return claimable2.isNeg() ? ZERO : claimable2;
70
+ }
71
+ const elapsed = currentTimestamp.sub(entryTimestamp);
72
+ if (elapsed.isNeg()) {
73
+ const claimable2 = tradableTokens.sub(tokensTransferred);
74
+ return claimable2.isNeg() ? ZERO : claimable2;
75
+ }
76
+ let currentVaulted;
77
+ if (elapsed.gte(vestDuration)) {
78
+ currentVaulted = ZERO;
79
+ } else {
80
+ const remainingBps = BPS.sub(elapsed.mul(BPS).div(vestDuration));
81
+ currentVaulted = initialVaulted.mul(remainingBps).div(BPS);
82
+ }
83
+ if (currentVaulted.gt(totalTokens)) {
84
+ currentVaulted = totalTokens;
85
+ }
86
+ const newTradable = totalTokens.sub(currentVaulted);
87
+ const claimable = newTradable.sub(tokensTransferred);
88
+ return claimable.isNeg() ? ZERO : claimable;
89
+ }
58
90
  function calculateAccruedTokens(initialVaulted, tokensTransferred, entryTimestamp, vestDuration, currentTimestamp) {
59
91
  if (initialVaulted.isZero()) return ZERO;
60
92
  const remaining = initialVaulted.sub(tokensTransferred);
@@ -80,6 +112,6 @@ function calculatePriceImpact(solIn, tokensOut, vammRealSol, vammTokens) {
80
112
  return ratioBps.sub(BPS).toNumber();
81
113
  }
82
114
 
83
- export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
115
+ export { applySlippage, calculateAccruedTokens, calculateBuyAmount, calculateClaimableTokens, calculatePriceImpact, calculateSellAmount, calculateSolForExactTokens, calculateSpotPrice, calculateTradableVaultedSplit };
84
116
  //# sourceMappingURL=math.js.map
85
117
  //# sourceMappingURL=math.js.map
package/dist/math.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/math.ts"],"names":["BN"],"mappings":"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","file":"math.js","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after vest_duration has passed. */\nexport const TRADE_FEE_BPS = 25\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n TEN_MINUTES: 600,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import BN from 'bn.js'\nimport { VIRTUAL_SOL } from './constants'\n\nconst ZERO = new BN(0)\nconst BPS = new BN(10_000)\n\n// Band logic from the program:\n// 40% tradable at 0-50M tokens sold, +5% per 50M band, 100% at 600M+\nconst BASE_TRADABLE_PCT = 40\nconst PCT_PER_BAND = 5\nconst BAND_SIZE = new BN('50000000000000') // 50M tokens × 10^6 decimals\nconst MAX_TRADABLE_PCT = 100\n\n/**\n * Calculate tokens out for a given SOL input using the vAMM constant product formula.\n * k = (vammRealSol + VIRTUAL_SOL) * vammTokens\n */\nexport function calculateBuyAmount(\n solIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (solIn.isZero() || solIn.isNeg()) return ZERO\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n const newSolSide = currentSolSide.add(solIn)\n const newTokenSide = vammK.div(newSolSide)\n return vammTokens.sub(newTokenSide)\n}\n\n/**\n * Calculate SOL out for a given token input.\n */\nexport function calculateSellAmount(\n tokensIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensIn.isZero() || tokensIn.isNeg()) return ZERO\n const newTokenSide = vammTokens.add(tokensIn)\n const newRealSol = vammK.div(newTokenSide).sub(VIRTUAL_SOL)\n return vammRealSol.sub(newRealSol)\n}\n\n/**\n * Calculate SOL required to buy an exact number of tokens.\n * Inverse of calculateBuyAmount.\n */\nexport function calculateSolForExactTokens(\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensOut.isZero() || tokensOut.isNeg()) return ZERO\n if (tokensOut.gte(vammTokens)) throw new Error('tokensOut exceeds available vAMM liquidity')\n const newTokenSide = vammTokens.sub(tokensOut)\n const newSolSide = vammK.div(newTokenSide)\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n return newSolSide.sub(currentSolSide)\n}\n\n/**\n * Apply slippage tolerance to a minimum output amount.\n * slippageBps: basis points, e.g. 100 = 1%\n */\nexport function applySlippage(amount: BN, slippageBps: number): BN {\n return amount.mul(new BN(10_000 - slippageBps)).div(BPS)\n}\n\n/**\n * Calculate the tradable/vaulted split for newly purchased tokens.\n *\n * Band logic (from the on-chain program):\n * 0–50M tokens sold: 40% tradable / 60% vaulted\n * each additional 50M band: +5% tradable\n * 600M+ tokens sold: 100% tradable / 0% vaulted\n *\n * After vest_duration has fully elapsed, all buys are 100% tradable.\n *\n * @param tokensOut tokens received from this buy\n * @param tokensSold cumulative tokens sold in the pool (before this buy)\n * @param bandSize band width in base token units (default 50M)\n */\nexport function calculateTradableVaultedSplit(\n tokensOut: BN,\n tokensSold: BN,\n bandSize: BN = BAND_SIZE,\n): { tradable: BN; vaulted: BN; tradablePct: number } {\n if (tokensOut.isZero()) return { tradable: ZERO, vaulted: ZERO, tradablePct: 0 }\n\n const bandIndex = bandSize.isZero() ? 0 : tokensSold.div(bandSize).toNumber()\n const tradablePct = Math.min(BASE_TRADABLE_PCT + PCT_PER_BAND * bandIndex, MAX_TRADABLE_PCT)\n const tradable = tokensOut.mul(new BN(tradablePct)).div(new BN(100))\n const vaulted = tokensOut.sub(tradable)\n\n return { tradable, vaulted, tradablePct }\n}\n\n/**\n * Calculate accrued (claimable) tokens for a position at a given timestamp.\n * Linear vesting: accrued = initialVaulted * elapsed / vestDuration\n * Capped at initialVaulted. Already-transferred tokens subtracted.\n */\nexport function calculateAccruedTokens(\n initialVaulted: BN,\n tokensTransferred: BN,\n entryTimestamp: BN,\n vestDuration: BN,\n currentTimestamp: BN,\n): BN {\n if (initialVaulted.isZero()) return ZERO\n const remaining = initialVaulted.sub(tokensTransferred)\n if (vestDuration.isZero()) return remaining\n const elapsed = currentTimestamp.sub(entryTimestamp)\n if (elapsed.isNeg()) return ZERO\n if (elapsed.gte(vestDuration)) return remaining\n const totalAccrued = initialVaulted.mul(elapsed).div(vestDuration)\n const claimable = totalAccrued.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n}\n\n/**\n * Spot price: how much SOL (in lamports) one whole token costs at the current curve position.\n * Returns price scaled by 1e6 for precision (i.e. micro-lamports per base token unit).\n */\nexport function calculateSpotPrice(\n vammRealSol: BN,\n vammTokens: BN,\n): BN {\n if (vammTokens.isZero()) return ZERO\n return vammRealSol.add(VIRTUAL_SOL).mul(new BN(1_000_000)).div(vammTokens)\n}\n\n/**\n * Price impact of a buy, in basis points.\n * Compares the effective price of the trade to the current spot price.\n */\nexport function calculatePriceImpact(\n solIn: BN,\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n): number {\n if (solIn.isZero() || tokensOut.isZero() || vammTokens.isZero()) return 0\n const solSide = vammRealSol.add(VIRTUAL_SOL)\n const numerator = solIn.mul(vammTokens).mul(BPS)\n const denominator = tokensOut.mul(solSide)\n if (denominator.isZero()) return 0\n const ratioBps = numerator.div(denominator)\n return ratioBps.sub(BPS).toNumber()\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/math.ts"],"names":["BN","claimable"],"mappings":"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","file":"math.js","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after migration threshold (85 SOL). */\nexport const TRADE_FEE_BPS = 25\n\n/** SOL threshold in lamports that triggers migration and fee activation (85 SOL). */\nexport const MIGRATION_SOL_THRESHOLD = new BN('85000000000')\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n THIRTY_MINUTES: 1800,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import BN from 'bn.js'\nimport { VIRTUAL_SOL } from './constants'\n\nconst ZERO = new BN(0)\nconst BPS = new BN(10_000)\n\n// Band logic from the program:\n// 40% tradable at 0-50M tokens sold, +5% per 50M band, 100% at 600M+\nconst BASE_TRADABLE_PCT = 40\nconst PCT_PER_BAND = 5\nconst BAND_SIZE = new BN('50000000000000') // 50M tokens × 10^6 decimals\nconst MAX_TRADABLE_PCT = 100\n\n/**\n * Calculate tokens out for a given SOL input using the vAMM constant product formula.\n * k = (vammRealSol + VIRTUAL_SOL) * vammTokens\n */\nexport function calculateBuyAmount(\n solIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (solIn.isZero() || solIn.isNeg()) return ZERO\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n const newSolSide = currentSolSide.add(solIn)\n const newTokenSide = vammK.div(newSolSide)\n return vammTokens.sub(newTokenSide)\n}\n\n/**\n * Calculate SOL out for a given token input.\n */\nexport function calculateSellAmount(\n tokensIn: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensIn.isZero() || tokensIn.isNeg()) return ZERO\n const newTokenSide = vammTokens.add(tokensIn)\n const newRealSol = vammK.div(newTokenSide).sub(VIRTUAL_SOL)\n return vammRealSol.sub(newRealSol)\n}\n\n/**\n * Calculate SOL required to buy an exact number of tokens.\n * Inverse of calculateBuyAmount.\n */\nexport function calculateSolForExactTokens(\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n vammK: BN,\n): BN {\n if (tokensOut.isZero() || tokensOut.isNeg()) return ZERO\n if (tokensOut.gte(vammTokens)) throw new Error('tokensOut exceeds available vAMM liquidity')\n const newTokenSide = vammTokens.sub(tokensOut)\n const newSolSide = vammK.div(newTokenSide)\n const currentSolSide = vammRealSol.add(VIRTUAL_SOL)\n return newSolSide.sub(currentSolSide)\n}\n\n/**\n * Apply slippage tolerance to a minimum output amount.\n * slippageBps: basis points, e.g. 100 = 1%\n */\nexport function applySlippage(amount: BN, slippageBps: number): BN {\n return amount.mul(new BN(10_000 - slippageBps)).div(BPS)\n}\n\n/**\n * Calculate the tradable/vaulted split for newly purchased tokens.\n *\n * Band logic (from the on-chain program):\n * 0–50M tokens sold: 40% tradable / 60% vaulted\n * each additional 50M band: +5% tradable\n * 600M+ tokens sold: 100% tradable / 0% vaulted\n *\n * After vest_duration has fully elapsed, all buys are 100% tradable.\n *\n * @param tokensOut tokens received from this buy\n * @param tokensSold cumulative tokens sold in the pool (before this buy)\n * @param bandSize band width in base token units (default 50M)\n */\nexport function calculateTradableVaultedSplit(\n tokensOut: BN,\n tokensSold: BN,\n bandSize: BN = BAND_SIZE,\n): { tradable: BN; vaulted: BN; tradablePct: number } {\n if (tokensOut.isZero()) return { tradable: ZERO, vaulted: ZERO, tradablePct: 0 }\n\n const bandIndex = bandSize.isZero() ? 0 : tokensSold.div(bandSize).toNumber()\n const tradablePct = Math.min(BASE_TRADABLE_PCT + PCT_PER_BAND * bandIndex, MAX_TRADABLE_PCT)\n const tradable = tokensOut.mul(new BN(tradablePct)).div(new BN(100))\n const vaulted = tokensOut.sub(tradable)\n\n return { tradable, vaulted, tradablePct }\n}\n\n/**\n * Calculate claimable tokens for a position at a given timestamp.\n *\n * Mirrors the on-chain logic exactly:\n * 1. update_position_accrual: vaulted tokens accrue linearly to tradable\n * 2. claim_accrued: claimable = new_tradable - tokens_transferred\n *\n * Handles both per-position accrual and global pool unlock.\n */\nexport function calculateClaimableTokens(\n tradableTokens: BN,\n vaultedTokens: BN,\n initialVaulted: BN,\n tokensTransferred: BN,\n entryTimestamp: BN,\n poolCreationTimestamp: BN,\n vestDuration: BN,\n currentTimestamp: BN,\n): BN {\n const totalTokens = tradableTokens.add(vaultedTokens)\n if (totalTokens.isZero()) return ZERO\n\n // Global unlock: if pool vest period has passed, everything is tradable\n const globalUnlockTime = poolCreationTimestamp.add(vestDuration)\n if (currentTimestamp.gte(globalUnlockTime)) {\n const claimable = totalTokens.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n }\n\n // Per-position accrual\n if (initialVaulted.isZero() || vestDuration.isZero()) {\n const claimable = totalTokens.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n }\n\n const elapsed = currentTimestamp.sub(entryTimestamp)\n if (elapsed.isNeg()) {\n // Before entry — only pre-existing tradable minus transferred\n const claimable = tradableTokens.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n }\n\n // current_vaulted = initial_vaulted * (1 - elapsed / vest_duration)\n let currentVaulted: BN\n if (elapsed.gte(vestDuration)) {\n currentVaulted = ZERO\n } else {\n const remainingBps = BPS.sub(elapsed.mul(BPS).div(vestDuration))\n currentVaulted = initialVaulted.mul(remainingBps).div(BPS)\n }\n\n // Cap: vaulted can't exceed total tokens\n if (currentVaulted.gt(totalTokens)) {\n currentVaulted = totalTokens\n }\n\n const newTradable = totalTokens.sub(currentVaulted)\n const claimable = newTradable.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n}\n\n/**\n * @deprecated Use calculateClaimableTokens instead. This function doesn't account for\n * the full position state and produces incorrect results when tokensTransferred\n * includes the initial tradable portion.\n */\nexport function calculateAccruedTokens(\n initialVaulted: BN,\n tokensTransferred: BN,\n entryTimestamp: BN,\n vestDuration: BN,\n currentTimestamp: BN,\n): BN {\n if (initialVaulted.isZero()) return ZERO\n const remaining = initialVaulted.sub(tokensTransferred)\n if (vestDuration.isZero()) return remaining\n const elapsed = currentTimestamp.sub(entryTimestamp)\n if (elapsed.isNeg()) return ZERO\n if (elapsed.gte(vestDuration)) return remaining\n const totalAccrued = initialVaulted.mul(elapsed).div(vestDuration)\n const claimable = totalAccrued.sub(tokensTransferred)\n return claimable.isNeg() ? ZERO : claimable\n}\n\n/**\n * Spot price: how much SOL (in lamports) one whole token costs at the current curve position.\n * Returns price scaled by 1e6 for precision (i.e. micro-lamports per base token unit).\n */\nexport function calculateSpotPrice(\n vammRealSol: BN,\n vammTokens: BN,\n): BN {\n if (vammTokens.isZero()) return ZERO\n return vammRealSol.add(VIRTUAL_SOL).mul(new BN(1_000_000)).div(vammTokens)\n}\n\n/**\n * Price impact of a buy, in basis points.\n * Compares the effective price of the trade to the current spot price.\n */\nexport function calculatePriceImpact(\n solIn: BN,\n tokensOut: BN,\n vammRealSol: BN,\n vammTokens: BN,\n): number {\n if (solIn.isZero() || tokensOut.isZero() || vammTokens.isZero()) return 0\n const solSide = vammRealSol.add(VIRTUAL_SOL)\n const numerator = solIn.mul(vammTokens).mul(BPS)\n const denominator = tokensOut.mul(solSide)\n if (denominator.isZero()) return 0\n const ratioBps = numerator.div(denominator)\n return ratioBps.sub(BPS).toNumber()\n}\n"]}
package/dist/pda.cjs CHANGED
@@ -21,6 +21,7 @@ var SEEDS = {
21
21
  PROTOCOL_FEES: Buffer.from("protocol_fees"),
22
22
  EVENT_AUTHORITY: Buffer.from("__event_authority")
23
23
  };
24
+ new BN__default.default("85000000000");
24
25
 
25
26
  // src/pda.ts
26
27
  function getPoolStatePDA(mint, programId) {
package/dist/pda.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/pda.ts"],"names":["PublicKey","BN"],"mappings":";;;;;;;;;;AAK0B,IAAIA,iBAAA,CAAU,6CAA6C;AACnD,IAAIA,iBAAA,CAAU,8CAA8C;AAEnE,IAAIC,mBAAA,CAAG,aAAa;AACnB,IAAIA,mBAAA,CAAG,kBAAkB;AACpB,IAAIA,mBAAA,CAAG,WAAW;AAG5C,IAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACxB,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC9C,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,EAClC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EAChC,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1C,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,mBAAmB;AAClD,CAAA;;;ACjBO,SAAS,eAAA,CAAgB,MAAiB,SAAA,EAA2C;AAC1F,EAAA,OAAOD,iBAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,MAAM,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClF;AAEO,SAAS,oBAAA,CAAqB,WAAsB,SAAA,EAA2C;AACpG,EAAA,OAAOA,iBAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,iBAAiB,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClG;AAEO,SAAS,cAAA,CAAe,WAAsB,SAAA,EAA2C;AAC9F,EAAA,OAAOA,iBAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,WAAW,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC5F;AAEO,SAAS,cAAA,CAAe,SAAA,EAAsB,KAAA,EAAkB,SAAA,EAA2C;AAChH,EAAA,OAAOA,iBAAAA,CAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,QAAA,EAAU,SAAA,CAAU,QAAA,EAAS,EAAG,KAAA,CAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC7G;AAEO,SAAS,mBAAmB,SAAA,EAA2C;AAC5E,EAAA,OAAOA,kBAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,aAAa,GAAG,SAAS,CAAA;AAC1E;AAEO,SAAS,qBAAqB,SAAA,EAA2C;AAC9E,EAAA,OAAOA,kBAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,eAAe,GAAG,SAAS,CAAA;AAC5E","file":"pda.cjs","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after vest_duration has passed. */\nexport const TRADE_FEE_BPS = 25\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n TEN_MINUTES: 600,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import { PublicKey } from '@solana/web3.js'\nimport { SEEDS } from './constants'\n\nexport function getPoolStatePDA(mint: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POOL, mint.toBuffer()], programId)\n}\n\nexport function getVaultAuthorityPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.VAULT_AUTHORITY, poolState.toBuffer()], programId)\n}\n\nexport function getSolVaultPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.SOL_VAULT, poolState.toBuffer()], programId)\n}\n\nexport function getPositionPDA(poolState: PublicKey, owner: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POSITION, poolState.toBuffer(), owner.toBuffer()], programId)\n}\n\nexport function getProtocolFeesPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.PROTOCOL_FEES], programId)\n}\n\nexport function getEventAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.EVENT_AUTHORITY], programId)\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/pda.ts"],"names":["PublicKey","BN"],"mappings":";;;;;;;;;;AAK0B,IAAIA,iBAAA,CAAU,6CAA6C;AACnD,IAAIA,iBAAA,CAAU,8CAA8C;AAEnE,IAAIC,mBAAA,CAAG,aAAa;AACnB,IAAIA,mBAAA,CAAG,kBAAkB;AACpB,IAAIA,mBAAA,CAAG,WAAW;AAG5C,IAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACxB,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC9C,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,EAClC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EAChC,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1C,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,mBAAmB;AAClD,CAAA;AAwBuC,IAAIA,mBAAA,CAAG,aAAa;;;ACzCpD,SAAS,eAAA,CAAgB,MAAiB,SAAA,EAA2C;AAC1F,EAAA,OAAOD,iBAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,MAAM,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClF;AAEO,SAAS,oBAAA,CAAqB,WAAsB,SAAA,EAA2C;AACpG,EAAA,OAAOA,iBAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,iBAAiB,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClG;AAEO,SAAS,cAAA,CAAe,WAAsB,SAAA,EAA2C;AAC9F,EAAA,OAAOA,iBAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,WAAW,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC5F;AAEO,SAAS,cAAA,CAAe,SAAA,EAAsB,KAAA,EAAkB,SAAA,EAA2C;AAChH,EAAA,OAAOA,iBAAAA,CAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,QAAA,EAAU,SAAA,CAAU,QAAA,EAAS,EAAG,KAAA,CAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC7G;AAEO,SAAS,mBAAmB,SAAA,EAA2C;AAC5E,EAAA,OAAOA,kBAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,aAAa,GAAG,SAAS,CAAA;AAC1E;AAEO,SAAS,qBAAqB,SAAA,EAA2C;AAC9E,EAAA,OAAOA,kBAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,eAAe,GAAG,SAAS,CAAA;AAC5E","file":"pda.cjs","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after migration threshold (85 SOL). */\nexport const TRADE_FEE_BPS = 25\n\n/** SOL threshold in lamports that triggers migration and fee activation (85 SOL). */\nexport const MIGRATION_SOL_THRESHOLD = new BN('85000000000')\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n THIRTY_MINUTES: 1800,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import { PublicKey } from '@solana/web3.js'\nimport { SEEDS } from './constants'\n\nexport function getPoolStatePDA(mint: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POOL, mint.toBuffer()], programId)\n}\n\nexport function getVaultAuthorityPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.VAULT_AUTHORITY, poolState.toBuffer()], programId)\n}\n\nexport function getSolVaultPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.SOL_VAULT, poolState.toBuffer()], programId)\n}\n\nexport function getPositionPDA(poolState: PublicKey, owner: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POSITION, poolState.toBuffer(), owner.toBuffer()], programId)\n}\n\nexport function getProtocolFeesPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.PROTOCOL_FEES], programId)\n}\n\nexport function getEventAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.EVENT_AUTHORITY], programId)\n}\n"]}
package/dist/pda.js CHANGED
@@ -15,6 +15,7 @@ var SEEDS = {
15
15
  PROTOCOL_FEES: Buffer.from("protocol_fees"),
16
16
  EVENT_AUTHORITY: Buffer.from("__event_authority")
17
17
  };
18
+ new BN("85000000000");
18
19
 
19
20
  // src/pda.ts
20
21
  function getPoolStatePDA(mint, programId) {
package/dist/pda.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/pda.ts"],"names":["PublicKey"],"mappings":";;;;AAK0B,IAAI,SAAA,CAAU,6CAA6C;AACnD,IAAI,SAAA,CAAU,8CAA8C;AAEnE,IAAI,EAAA,CAAG,aAAa;AACnB,IAAI,EAAA,CAAG,kBAAkB;AACpB,IAAI,EAAA,CAAG,WAAW;AAG5C,IAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACxB,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC9C,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,EAClC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EAChC,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1C,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,mBAAmB;AAClD,CAAA;;;ACjBO,SAAS,eAAA,CAAgB,MAAiB,SAAA,EAA2C;AAC1F,EAAA,OAAOA,SAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,MAAM,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClF;AAEO,SAAS,oBAAA,CAAqB,WAAsB,SAAA,EAA2C;AACpG,EAAA,OAAOA,SAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,iBAAiB,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClG;AAEO,SAAS,cAAA,CAAe,WAAsB,SAAA,EAA2C;AAC9F,EAAA,OAAOA,SAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,WAAW,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC5F;AAEO,SAAS,cAAA,CAAe,SAAA,EAAsB,KAAA,EAAkB,SAAA,EAA2C;AAChH,EAAA,OAAOA,SAAAA,CAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,QAAA,EAAU,SAAA,CAAU,QAAA,EAAS,EAAG,KAAA,CAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC7G;AAEO,SAAS,mBAAmB,SAAA,EAA2C;AAC5E,EAAA,OAAOA,UAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,aAAa,GAAG,SAAS,CAAA;AAC1E;AAEO,SAAS,qBAAqB,SAAA,EAA2C;AAC9E,EAAA,OAAOA,UAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,eAAe,GAAG,SAAS,CAAA;AAC5E","file":"pda.js","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after vest_duration has passed. */\nexport const TRADE_FEE_BPS = 25\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n TEN_MINUTES: 600,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import { PublicKey } from '@solana/web3.js'\nimport { SEEDS } from './constants'\n\nexport function getPoolStatePDA(mint: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POOL, mint.toBuffer()], programId)\n}\n\nexport function getVaultAuthorityPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.VAULT_AUTHORITY, poolState.toBuffer()], programId)\n}\n\nexport function getSolVaultPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.SOL_VAULT, poolState.toBuffer()], programId)\n}\n\nexport function getPositionPDA(poolState: PublicKey, owner: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POSITION, poolState.toBuffer(), owner.toBuffer()], programId)\n}\n\nexport function getProtocolFeesPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.PROTOCOL_FEES], programId)\n}\n\nexport function getEventAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.EVENT_AUTHORITY], programId)\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/pda.ts"],"names":["PublicKey"],"mappings":";;;;AAK0B,IAAI,SAAA,CAAU,6CAA6C;AACnD,IAAI,SAAA,CAAU,8CAA8C;AAEnE,IAAI,EAAA,CAAG,aAAa;AACnB,IAAI,EAAA,CAAG,kBAAkB;AACpB,IAAI,EAAA,CAAG,WAAW;AAG5C,IAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACxB,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA;AAAA,EAC9C,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,EAClC,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAAA,EAChC,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1C,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,mBAAmB;AAClD,CAAA;AAwBuC,IAAI,EAAA,CAAG,aAAa;;;ACzCpD,SAAS,eAAA,CAAgB,MAAiB,SAAA,EAA2C;AAC1F,EAAA,OAAOA,SAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,MAAM,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClF;AAEO,SAAS,oBAAA,CAAqB,WAAsB,SAAA,EAA2C;AACpG,EAAA,OAAOA,SAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,iBAAiB,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAClG;AAEO,SAAS,cAAA,CAAe,WAAsB,SAAA,EAA2C;AAC9F,EAAA,OAAOA,SAAAA,CAAU,uBAAuB,CAAC,KAAA,CAAM,WAAW,SAAA,CAAU,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC5F;AAEO,SAAS,cAAA,CAAe,SAAA,EAAsB,KAAA,EAAkB,SAAA,EAA2C;AAChH,EAAA,OAAOA,SAAAA,CAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,QAAA,EAAU,SAAA,CAAU,QAAA,EAAS,EAAG,KAAA,CAAM,QAAA,EAAU,CAAA,EAAG,SAAS,CAAA;AAC7G;AAEO,SAAS,mBAAmB,SAAA,EAA2C;AAC5E,EAAA,OAAOA,UAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,aAAa,GAAG,SAAS,CAAA;AAC1E;AAEO,SAAS,qBAAqB,SAAA,EAA2C;AAC9E,EAAA,OAAOA,UAAU,sBAAA,CAAuB,CAAC,KAAA,CAAM,eAAe,GAAG,SAAS,CAAA;AAC5E","file":"pda.js","sourcesContent":["import { PublicKey } from '@solana/web3.js'\nimport BN from 'bn.js'\n\nexport const BPS_DENOMINATOR = 10_000\n\nexport const PROGRAM_ID = new PublicKey('hodLrUfwyK3Z7Td5hdZhyojyznG1rqbHVex11y5s4yG')\nexport const PROTOCOL_AUTHORITY = new PublicKey('EFAquDGAHjkoPB6TGKVibD3BYhbFXNDjuXKpiBHdYzji')\n\nexport const VIRTUAL_SOL = new BN('30000000000')\nexport const TOTAL_SUPPLY = new BN('1000000000000000')\nexport const PROTOCOL_MINT_FEE = new BN('100000000')\nexport const DECIMALS = 6\n\nexport const SEEDS = {\n POOL: Buffer.from('pool'),\n VAULT_AUTHORITY: Buffer.from('vault_authority'),\n SOL_VAULT: Buffer.from('sol_vault'),\n POSITION: Buffer.from('position'),\n PROTOCOL_FEES: Buffer.from('protocol_fees'),\n EVENT_AUTHORITY: Buffer.from('__event_authority'),\n} as const\n\nexport const MAINNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\nexport const DEVNET_CONFIG = {\n programId: PROGRAM_ID,\n virtualSol: VIRTUAL_SOL,\n protocolAuthority: PROTOCOL_AUTHORITY,\n protocolMintFee: PROTOCOL_MINT_FEE,\n decimals: DECIMALS,\n totalSupply: TOTAL_SUPPLY,\n} as const\n\n/** Trade fee in basis points (25 bps = 0.25%). Only applies after migration threshold (85 SOL). */\nexport const TRADE_FEE_BPS = 25\n\n/** SOL threshold in lamports that triggers migration and fee activation (85 SOL). */\nexport const MIGRATION_SOL_THRESHOLD = new BN('85000000000')\n\n/** Allowed vest duration modes (in seconds). The program only accepts these values. */\nexport const VEST_DURATION = {\n ONE_MINUTE: 60,\n THIRTY_MINUTES: 1800,\n} as const\n\nexport type VestDuration = typeof VEST_DURATION[keyof typeof VEST_DURATION]\n\nexport const LIMITS = {\n NAME: { min: 1, max: 32 },\n SYMBOL: { min: 1, max: 16 },\n URI: { min: 10, max: 100 },\n DESCRIPTION: { min: 0, max: 200 },\n} as const\n","import { PublicKey } from '@solana/web3.js'\nimport { SEEDS } from './constants'\n\nexport function getPoolStatePDA(mint: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POOL, mint.toBuffer()], programId)\n}\n\nexport function getVaultAuthorityPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.VAULT_AUTHORITY, poolState.toBuffer()], programId)\n}\n\nexport function getSolVaultPDA(poolState: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.SOL_VAULT, poolState.toBuffer()], programId)\n}\n\nexport function getPositionPDA(poolState: PublicKey, owner: PublicKey, programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.POSITION, poolState.toBuffer(), owner.toBuffer()], programId)\n}\n\nexport function getProtocolFeesPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.PROTOCOL_FEES], programId)\n}\n\nexport function getEventAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync([SEEDS.EVENT_AUTHORITY], programId)\n}\n"]}
@@ -18,20 +18,7 @@ async function buildTransaction(connection, instructions, payer, opts = {}) {
18
18
  }).compileToV0Message();
19
19
  return new web3_js.VersionedTransaction(message);
20
20
  }
21
- async function sendTransaction(connection, tx, opts = {}) {
22
- const sig = await connection.sendTransaction(tx, {
23
- skipPreflight: opts.skipPreflight ?? false,
24
- maxRetries: 3
25
- });
26
- const latestBlockhash = await connection.getLatestBlockhash("confirmed");
27
- await connection.confirmTransaction({
28
- signature: sig,
29
- ...latestBlockhash
30
- }, "confirmed");
31
- return sig;
32
- }
33
21
 
34
22
  exports.buildTransaction = buildTransaction;
35
- exports.sendTransaction = sendTransaction;
36
23
  //# sourceMappingURL=transaction.cjs.map
37
24
  //# sourceMappingURL=transaction.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transaction.ts"],"names":["ComputeBudgetProgram","TransactionMessage","VersionedTransaction"],"mappings":";;;;;AAeA,eAAsB,iBACpB,UAAA,EACA,YAAA,EACA,KAAA,EACA,IAAA,GAAkB,EAAC,EACY;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAK,YAAA,IAAgB,GAAA;AACrC,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,GAAA;AAExC,EAAA,MAAM,UAAA,GAAuC;AAAA,IAC3CA,4BAAA,CAAqB,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3DA,4BAAA,CAAqB,mBAAA,CAAoB,EAAE,aAAA,EAAe,aAAa;AAAA,GACzE;AAEA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,UAAA,CAAW,mBAAmB,WAAW,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,IAAIC,0BAAA,CAAmB;AAAA,IACrC,QAAA,EAAU,KAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAC,GAAG,UAAA,EAAY,GAAG,YAAY;AAAA,GAC9C,EAAE,kBAAA,EAAmB;AAEtB,EAAA,OAAO,IAAIC,6BAAqB,OAAO,CAAA;AACzC;AAEA,eAAsB,eAAA,CACpB,UAAA,EACA,EAAA,EACA,IAAA,GAAkB,EAAC,EACF;AACjB,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,eAAA,CAAgB,EAAA,EAAI;AAAA,IAC/C,aAAA,EAAe,KAAK,aAAA,IAAiB,KAAA;AAAA,IACrC,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,MAAM,eAAA,GAAkB,MAAM,UAAA,CAAW,kBAAA,CAAmB,WAAW,CAAA;AACvE,EAAA,MAAM,WAAW,kBAAA,CAAmB;AAAA,IAClC,SAAA,EAAW,GAAA;AAAA,IACX,GAAG;AAAA,KACF,WAAW,CAAA;AACd,EAAA,OAAO,GAAA;AACT","file":"transaction.cjs","sourcesContent":["import {\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n} from '@solana/web3.js'\n\nexport interface TxOptions {\n priorityFee?: number // microlamports per CU\n computeUnits?: number\n skipPreflight?: boolean\n}\n\nexport async function buildTransaction(\n connection: Connection,\n instructions: TransactionInstruction[],\n payer: PublicKey,\n opts: TxOptions = {},\n): Promise<VersionedTransaction> {\n const cuLimit = opts.computeUnits ?? 200_000\n const priorityFee = opts.priorityFee ?? 1_000\n\n const computeIxs: TransactionInstruction[] = [\n ComputeBudgetProgram.setComputeUnitLimit({ units: cuLimit }),\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFee }),\n ]\n\n const { blockhash } = await connection.getLatestBlockhash('confirmed')\n\n const message = new TransactionMessage({\n payerKey: payer,\n recentBlockhash: blockhash,\n instructions: [...computeIxs, ...instructions],\n }).compileToV0Message()\n\n return new VersionedTransaction(message)\n}\n\nexport async function sendTransaction(\n connection: Connection,\n tx: VersionedTransaction,\n opts: TxOptions = {},\n): Promise<string> {\n const sig = await connection.sendTransaction(tx, {\n skipPreflight: opts.skipPreflight ?? false,\n maxRetries: 3,\n })\n const latestBlockhash = await connection.getLatestBlockhash('confirmed')\n await connection.confirmTransaction({\n signature: sig,\n ...latestBlockhash,\n }, 'confirmed')\n return sig\n}\n"]}
1
+ {"version":3,"sources":["../src/transaction.ts"],"names":["ComputeBudgetProgram","TransactionMessage","VersionedTransaction"],"mappings":";;;;;AAkBA,eAAsB,iBACpB,UAAA,EACA,YAAA,EACA,KAAA,EACA,IAAA,GAAkB,EAAC,EACY;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAK,YAAA,IAAgB,GAAA;AACrC,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,GAAA;AAExC,EAAA,MAAM,UAAA,GAAuC;AAAA,IAC3CA,4BAAA,CAAqB,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3DA,4BAAA,CAAqB,mBAAA,CAAoB,EAAE,aAAA,EAAe,aAAa;AAAA,GACzE;AAEA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,UAAA,CAAW,mBAAmB,WAAW,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,IAAIC,0BAAA,CAAmB;AAAA,IACrC,QAAA,EAAU,KAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAC,GAAG,UAAA,EAAY,GAAG,YAAY;AAAA,GAC9C,EAAE,kBAAA,EAAmB;AAEtB,EAAA,OAAO,IAAIC,6BAAqB,OAAO,CAAA;AACzC","file":"transaction.cjs","sourcesContent":["import {\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n} from '@solana/web3.js'\n\nexport interface TxOptions {\n priorityFee?: number // microlamports per CU\n computeUnits?: number\n}\n\n/**\n * Build a versioned transaction with a fresh blockhash.\n * Returns an unsigned VersionedTransaction — caller signs and sends.\n */\nexport async function buildTransaction(\n connection: Connection,\n instructions: TransactionInstruction[],\n payer: PublicKey,\n opts: TxOptions = {},\n): Promise<VersionedTransaction> {\n const cuLimit = opts.computeUnits ?? 200_000\n const priorityFee = opts.priorityFee ?? 1_000\n\n const computeIxs: TransactionInstruction[] = [\n ComputeBudgetProgram.setComputeUnitLimit({ units: cuLimit }),\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFee }),\n ]\n\n const { blockhash } = await connection.getLatestBlockhash('confirmed')\n\n const message = new TransactionMessage({\n payerKey: payer,\n recentBlockhash: blockhash,\n instructions: [...computeIxs, ...instructions],\n }).compileToV0Message()\n\n return new VersionedTransaction(message)\n}\n"]}
@@ -3,9 +3,11 @@ import { Connection, TransactionInstruction, PublicKey, VersionedTransaction } f
3
3
  interface TxOptions {
4
4
  priorityFee?: number;
5
5
  computeUnits?: number;
6
- skipPreflight?: boolean;
7
6
  }
7
+ /**
8
+ * Build a versioned transaction with a fresh blockhash.
9
+ * Returns an unsigned VersionedTransaction — caller signs and sends.
10
+ */
8
11
  declare function buildTransaction(connection: Connection, instructions: TransactionInstruction[], payer: PublicKey, opts?: TxOptions): Promise<VersionedTransaction>;
9
- declare function sendTransaction(connection: Connection, tx: VersionedTransaction, opts?: TxOptions): Promise<string>;
10
12
 
11
- export { type TxOptions, buildTransaction, sendTransaction };
13
+ export { type TxOptions, buildTransaction };
@@ -3,9 +3,11 @@ import { Connection, TransactionInstruction, PublicKey, VersionedTransaction } f
3
3
  interface TxOptions {
4
4
  priorityFee?: number;
5
5
  computeUnits?: number;
6
- skipPreflight?: boolean;
7
6
  }
7
+ /**
8
+ * Build a versioned transaction with a fresh blockhash.
9
+ * Returns an unsigned VersionedTransaction — caller signs and sends.
10
+ */
8
11
  declare function buildTransaction(connection: Connection, instructions: TransactionInstruction[], payer: PublicKey, opts?: TxOptions): Promise<VersionedTransaction>;
9
- declare function sendTransaction(connection: Connection, tx: VersionedTransaction, opts?: TxOptions): Promise<string>;
10
12
 
11
- export { type TxOptions, buildTransaction, sendTransaction };
13
+ export { type TxOptions, buildTransaction };
@@ -16,19 +16,7 @@ async function buildTransaction(connection, instructions, payer, opts = {}) {
16
16
  }).compileToV0Message();
17
17
  return new VersionedTransaction(message);
18
18
  }
19
- async function sendTransaction(connection, tx, opts = {}) {
20
- const sig = await connection.sendTransaction(tx, {
21
- skipPreflight: opts.skipPreflight ?? false,
22
- maxRetries: 3
23
- });
24
- const latestBlockhash = await connection.getLatestBlockhash("confirmed");
25
- await connection.confirmTransaction({
26
- signature: sig,
27
- ...latestBlockhash
28
- }, "confirmed");
29
- return sig;
30
- }
31
19
 
32
- export { buildTransaction, sendTransaction };
20
+ export { buildTransaction };
33
21
  //# sourceMappingURL=transaction.js.map
34
22
  //# sourceMappingURL=transaction.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transaction.ts"],"names":[],"mappings":";;;AAeA,eAAsB,iBACpB,UAAA,EACA,YAAA,EACA,KAAA,EACA,IAAA,GAAkB,EAAC,EACY;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAK,YAAA,IAAgB,GAAA;AACrC,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,GAAA;AAExC,EAAA,MAAM,UAAA,GAAuC;AAAA,IAC3C,oBAAA,CAAqB,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3D,oBAAA,CAAqB,mBAAA,CAAoB,EAAE,aAAA,EAAe,aAAa;AAAA,GACzE;AAEA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,UAAA,CAAW,mBAAmB,WAAW,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,IAAI,kBAAA,CAAmB;AAAA,IACrC,QAAA,EAAU,KAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAC,GAAG,UAAA,EAAY,GAAG,YAAY;AAAA,GAC9C,EAAE,kBAAA,EAAmB;AAEtB,EAAA,OAAO,IAAI,qBAAqB,OAAO,CAAA;AACzC;AAEA,eAAsB,eAAA,CACpB,UAAA,EACA,EAAA,EACA,IAAA,GAAkB,EAAC,EACF;AACjB,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,eAAA,CAAgB,EAAA,EAAI;AAAA,IAC/C,aAAA,EAAe,KAAK,aAAA,IAAiB,KAAA;AAAA,IACrC,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,MAAM,eAAA,GAAkB,MAAM,UAAA,CAAW,kBAAA,CAAmB,WAAW,CAAA;AACvE,EAAA,MAAM,WAAW,kBAAA,CAAmB;AAAA,IAClC,SAAA,EAAW,GAAA;AAAA,IACX,GAAG;AAAA,KACF,WAAW,CAAA;AACd,EAAA,OAAO,GAAA;AACT","file":"transaction.js","sourcesContent":["import {\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n} from '@solana/web3.js'\n\nexport interface TxOptions {\n priorityFee?: number // microlamports per CU\n computeUnits?: number\n skipPreflight?: boolean\n}\n\nexport async function buildTransaction(\n connection: Connection,\n instructions: TransactionInstruction[],\n payer: PublicKey,\n opts: TxOptions = {},\n): Promise<VersionedTransaction> {\n const cuLimit = opts.computeUnits ?? 200_000\n const priorityFee = opts.priorityFee ?? 1_000\n\n const computeIxs: TransactionInstruction[] = [\n ComputeBudgetProgram.setComputeUnitLimit({ units: cuLimit }),\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFee }),\n ]\n\n const { blockhash } = await connection.getLatestBlockhash('confirmed')\n\n const message = new TransactionMessage({\n payerKey: payer,\n recentBlockhash: blockhash,\n instructions: [...computeIxs, ...instructions],\n }).compileToV0Message()\n\n return new VersionedTransaction(message)\n}\n\nexport async function sendTransaction(\n connection: Connection,\n tx: VersionedTransaction,\n opts: TxOptions = {},\n): Promise<string> {\n const sig = await connection.sendTransaction(tx, {\n skipPreflight: opts.skipPreflight ?? false,\n maxRetries: 3,\n })\n const latestBlockhash = await connection.getLatestBlockhash('confirmed')\n await connection.confirmTransaction({\n signature: sig,\n ...latestBlockhash,\n }, 'confirmed')\n return sig\n}\n"]}
1
+ {"version":3,"sources":["../src/transaction.ts"],"names":[],"mappings":";;;AAkBA,eAAsB,iBACpB,UAAA,EACA,YAAA,EACA,KAAA,EACA,IAAA,GAAkB,EAAC,EACY;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAK,YAAA,IAAgB,GAAA;AACrC,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,GAAA;AAExC,EAAA,MAAM,UAAA,GAAuC;AAAA,IAC3C,oBAAA,CAAqB,mBAAA,CAAoB,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IAC3D,oBAAA,CAAqB,mBAAA,CAAoB,EAAE,aAAA,EAAe,aAAa;AAAA,GACzE;AAEA,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,UAAA,CAAW,mBAAmB,WAAW,CAAA;AAErE,EAAA,MAAM,OAAA,GAAU,IAAI,kBAAA,CAAmB;AAAA,IACrC,QAAA,EAAU,KAAA;AAAA,IACV,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,CAAC,GAAG,UAAA,EAAY,GAAG,YAAY;AAAA,GAC9C,EAAE,kBAAA,EAAmB;AAEtB,EAAA,OAAO,IAAI,qBAAqB,OAAO,CAAA;AACzC","file":"transaction.js","sourcesContent":["import {\n Connection,\n PublicKey,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n ComputeBudgetProgram,\n} from '@solana/web3.js'\n\nexport interface TxOptions {\n priorityFee?: number // microlamports per CU\n computeUnits?: number\n}\n\n/**\n * Build a versioned transaction with a fresh blockhash.\n * Returns an unsigned VersionedTransaction — caller signs and sends.\n */\nexport async function buildTransaction(\n connection: Connection,\n instructions: TransactionInstruction[],\n payer: PublicKey,\n opts: TxOptions = {},\n): Promise<VersionedTransaction> {\n const cuLimit = opts.computeUnits ?? 200_000\n const priorityFee = opts.priorityFee ?? 1_000\n\n const computeIxs: TransactionInstruction[] = [\n ComputeBudgetProgram.setComputeUnitLimit({ units: cuLimit }),\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: priorityFee }),\n ]\n\n const { blockhash } = await connection.getLatestBlockhash('confirmed')\n\n const message = new TransactionMessage({\n payerKey: payer,\n recentBlockhash: blockhash,\n instructions: [...computeIxs, ...instructions],\n }).compileToV0Message()\n\n return new VersionedTransaction(message)\n}\n"]}
package/dist/types.d.cts CHANGED
@@ -32,6 +32,9 @@ interface PoolState {
32
32
  vammK: BN;
33
33
  tokensSold: BN;
34
34
  tokensReservedForClaims: BN;
35
+ migrationComplete: boolean;
36
+ totalFeesSol: BN;
37
+ totalFeesTokens: BN;
35
38
  bumpVaultAuth: number;
36
39
  bumpPool: number;
37
40
  }
package/dist/types.d.ts CHANGED
@@ -32,6 +32,9 @@ interface PoolState {
32
32
  vammK: BN;
33
33
  tokensSold: BN;
34
34
  tokensReservedForClaims: BN;
35
+ migrationComplete: boolean;
36
+ totalFeesSol: BN;
37
+ totalFeesTokens: BN;
35
38
  bumpVaultAuth: number;
36
39
  bumpPool: number;
37
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hodlmarkets/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "Solana program SDK for the HODL token launchpad/trading platform",
6
6
  "types": "./dist/index.d.ts",
@@ -71,8 +71,9 @@
71
71
  "build": "tsup",
72
72
  "build:watch": "tsup --watch",
73
73
  "typecheck": "tsc --noEmit",
74
- "test": "vitest run",
75
- "test:watch": "vitest",
74
+ "test": "vitest run --config vitest.config.ts",
75
+ "test:watch": "vitest --config vitest.config.ts",
76
+ "test:integration": "node --env-file=.env.devnet node_modules/vitest/vitest.mjs run --config vitest.config.integration.ts",
76
77
  "prepublishOnly": "npm run build"
77
78
  },
78
79
  "peerDependencies": {
@@ -88,6 +89,7 @@
88
89
  "@types/bn.js": "^5.1.6",
89
90
  "@types/node": "^22.10.0",
90
91
  "bn.js": "^5.2.1",
92
+ "bs58": "^5.0.0",
91
93
  "fast-check": "^4.6.0",
92
94
  "tsup": "^8.3.0",
93
95
  "typescript": "^5.7.0",