@oobe-protocol-labs/sap-mcp-server 0.9.38 → 0.9.50

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 (165) hide show
  1. package/dist/config/env.d.ts +19 -0
  2. package/dist/config/env.d.ts.map +1 -1
  3. package/dist/config/env.js +9 -2
  4. package/dist/config/env.js.map +1 -1
  5. package/dist/payments/monetization-gate.d.ts +5 -0
  6. package/dist/payments/monetization-gate.d.ts.map +1 -1
  7. package/dist/payments/monetization-gate.js +39 -2
  8. package/dist/payments/monetization-gate.js.map +1 -1
  9. package/dist/payments/prepaid-credit-store.d.ts +111 -0
  10. package/dist/payments/prepaid-credit-store.d.ts.map +1 -0
  11. package/dist/payments/prepaid-credit-store.js +230 -0
  12. package/dist/payments/prepaid-credit-store.js.map +1 -0
  13. package/dist/payments/pricing.d.ts.map +1 -1
  14. package/dist/payments/pricing.js +1 -0
  15. package/dist/payments/pricing.js.map +1 -1
  16. package/dist/payments/schema-validation.d.ts +52 -0
  17. package/dist/payments/schema-validation.d.ts.map +1 -0
  18. package/dist/payments/schema-validation.js +112 -0
  19. package/dist/payments/schema-validation.js.map +1 -0
  20. package/dist/payments/x402-paid-call.d.ts +21 -0
  21. package/dist/payments/x402-paid-call.d.ts.map +1 -1
  22. package/dist/payments/x402-paid-call.js +108 -3
  23. package/dist/payments/x402-paid-call.js.map +1 -1
  24. package/dist/perps/adrena/adrena-builder-commodity.d.ts +63 -0
  25. package/dist/perps/adrena/adrena-builder-commodity.d.ts.map +1 -0
  26. package/dist/perps/adrena/adrena-builder-commodity.js +200 -0
  27. package/dist/perps/adrena/adrena-builder-commodity.js.map +1 -0
  28. package/dist/perps/adrena/adrena-builder-core.d.ts +319 -0
  29. package/dist/perps/adrena/adrena-builder-core.d.ts.map +1 -0
  30. package/dist/perps/adrena/adrena-builder-core.js +517 -0
  31. package/dist/perps/adrena/adrena-builder-core.js.map +1 -0
  32. package/dist/perps/adrena/adrena-builder-liquidity.d.ts +50 -0
  33. package/dist/perps/adrena/adrena-builder-liquidity.d.ts.map +1 -0
  34. package/dist/perps/adrena/adrena-builder-liquidity.js +196 -0
  35. package/dist/perps/adrena/adrena-builder-liquidity.js.map +1 -0
  36. package/dist/perps/adrena/adrena-builder-staking.d.ts +57 -0
  37. package/dist/perps/adrena/adrena-builder-staking.d.ts.map +1 -0
  38. package/dist/perps/adrena/adrena-builder-staking.js +368 -0
  39. package/dist/perps/adrena/adrena-builder-staking.js.map +1 -0
  40. package/dist/perps/adrena/adrena-builder-trading.d.ts +160 -0
  41. package/dist/perps/adrena/adrena-builder-trading.d.ts.map +1 -0
  42. package/dist/perps/adrena/adrena-builder-trading.js +835 -0
  43. package/dist/perps/adrena/adrena-builder-trading.js.map +1 -0
  44. package/dist/perps/adrena/adrena-builder.d.ts +14 -293
  45. package/dist/perps/adrena/adrena-builder.d.ts.map +1 -1
  46. package/dist/perps/adrena/adrena-builder.js +14 -1140
  47. package/dist/perps/adrena/adrena-builder.js.map +1 -1
  48. package/dist/perps/adrena/adrena-constants.d.ts +33 -5
  49. package/dist/perps/adrena/adrena-constants.d.ts.map +1 -1
  50. package/dist/perps/adrena/adrena-constants.js +29 -7
  51. package/dist/perps/adrena/adrena-constants.js.map +1 -1
  52. package/dist/perps/adrena/adrena-idl.d.ts +15084 -0
  53. package/dist/perps/adrena/adrena-idl.d.ts.map +1 -0
  54. package/dist/perps/adrena/adrena-idl.js +29903 -0
  55. package/dist/perps/adrena/adrena-idl.js.map +1 -0
  56. package/dist/perps/adrena/adrena-pda.d.ts +5 -4
  57. package/dist/perps/adrena/adrena-pda.d.ts.map +1 -1
  58. package/dist/perps/adrena/adrena-pda.js +6 -10
  59. package/dist/perps/adrena/adrena-pda.js.map +1 -1
  60. package/dist/perps/adrena/index.d.ts +1 -0
  61. package/dist/perps/adrena/index.d.ts.map +1 -1
  62. package/dist/perps/adrena/index.js +1 -0
  63. package/dist/perps/adrena/index.js.map +1 -1
  64. package/dist/perps/chart-indicators.d.ts +27 -0
  65. package/dist/perps/chart-indicators.d.ts.map +1 -0
  66. package/dist/perps/chart-indicators.js +345 -0
  67. package/dist/perps/chart-indicators.js.map +1 -0
  68. package/dist/perps/chart-tools.d.ts +45 -0
  69. package/dist/perps/chart-tools.d.ts.map +1 -0
  70. package/dist/perps/chart-tools.js +341 -0
  71. package/dist/perps/chart-tools.js.map +1 -0
  72. package/dist/perps/perp-analytics-tools.d.ts +20 -0
  73. package/dist/perps/perp-analytics-tools.d.ts.map +1 -0
  74. package/dist/perps/perp-analytics-tools.js +868 -0
  75. package/dist/perps/perp-analytics-tools.js.map +1 -0
  76. package/dist/perps/perp-constants.d.ts +362 -0
  77. package/dist/perps/perp-constants.d.ts.map +1 -0
  78. package/dist/perps/perp-constants.js +210 -0
  79. package/dist/perps/perp-constants.js.map +1 -0
  80. package/dist/perps/perp-decoders.d.ts +47 -0
  81. package/dist/perps/perp-decoders.d.ts.map +1 -0
  82. package/dist/perps/perp-decoders.js +332 -0
  83. package/dist/perps/perp-decoders.js.map +1 -0
  84. package/dist/policy/policy-engine.d.ts +42 -0
  85. package/dist/policy/policy-engine.d.ts.map +1 -1
  86. package/dist/policy/policy-engine.js +43 -0
  87. package/dist/policy/policy-engine.js.map +1 -1
  88. package/dist/premium/activation-manager.d.ts.map +1 -1
  89. package/dist/premium/activation-manager.js +20 -2
  90. package/dist/premium/activation-manager.js.map +1 -1
  91. package/dist/prompts/context/sap-agent-context.prompt.js +15 -1
  92. package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
  93. package/dist/server/server-metadata.d.ts +13 -0
  94. package/dist/server/server-metadata.d.ts.map +1 -1
  95. package/dist/server/server-metadata.js +15 -2
  96. package/dist/server/server-metadata.js.map +1 -1
  97. package/dist/solana/ata-utils.d.ts +39 -0
  98. package/dist/solana/ata-utils.d.ts.map +1 -0
  99. package/dist/solana/ata-utils.js +49 -0
  100. package/dist/solana/ata-utils.js.map +1 -0
  101. package/dist/strategies/trade-journal.d.ts +78 -0
  102. package/dist/strategies/trade-journal.d.ts.map +1 -0
  103. package/dist/strategies/trade-journal.js +92 -0
  104. package/dist/strategies/trade-journal.js.map +1 -0
  105. package/dist/tools/adrena/adrena-commodity-tools.d.ts +15 -0
  106. package/dist/tools/adrena/adrena-commodity-tools.d.ts.map +1 -0
  107. package/dist/tools/adrena/adrena-commodity-tools.js +137 -0
  108. package/dist/tools/adrena/adrena-commodity-tools.js.map +1 -0
  109. package/dist/tools/adrena/adrena-data-tools.d.ts +23 -0
  110. package/dist/tools/adrena/adrena-data-tools.d.ts.map +1 -0
  111. package/dist/tools/adrena/adrena-data-tools.js +437 -0
  112. package/dist/tools/adrena/adrena-data-tools.js.map +1 -0
  113. package/dist/tools/adrena/adrena-helpers.d.ts +46 -0
  114. package/dist/tools/adrena/adrena-helpers.d.ts.map +1 -0
  115. package/dist/tools/adrena/adrena-helpers.js +41 -0
  116. package/dist/tools/adrena/adrena-helpers.js.map +1 -0
  117. package/dist/tools/adrena/adrena-index.d.ts +20 -0
  118. package/dist/tools/adrena/adrena-index.d.ts.map +1 -0
  119. package/dist/tools/adrena/adrena-index.js +75 -0
  120. package/dist/tools/adrena/adrena-index.js.map +1 -0
  121. package/dist/tools/adrena/adrena-limit-order-tools.d.ts +22 -0
  122. package/dist/tools/adrena/adrena-limit-order-tools.d.ts.map +1 -0
  123. package/dist/tools/adrena/adrena-limit-order-tools.js +91 -0
  124. package/dist/tools/adrena/adrena-limit-order-tools.js.map +1 -0
  125. package/dist/tools/adrena/adrena-liquidity-tools.d.ts +15 -0
  126. package/dist/tools/adrena/adrena-liquidity-tools.d.ts.map +1 -0
  127. package/dist/tools/adrena/adrena-liquidity-tools.js +108 -0
  128. package/dist/tools/adrena/adrena-liquidity-tools.js.map +1 -0
  129. package/dist/tools/adrena/adrena-snapshot-tools.d.ts +42 -0
  130. package/dist/tools/adrena/adrena-snapshot-tools.d.ts.map +1 -0
  131. package/dist/tools/adrena/adrena-snapshot-tools.js +124 -0
  132. package/dist/tools/adrena/adrena-snapshot-tools.js.map +1 -0
  133. package/dist/tools/adrena/adrena-staking-tools.d.ts +15 -0
  134. package/dist/tools/adrena/adrena-staking-tools.d.ts.map +1 -0
  135. package/dist/tools/adrena/adrena-staking-tools.js +139 -0
  136. package/dist/tools/adrena/adrena-staking-tools.js.map +1 -0
  137. package/dist/tools/adrena/adrena-trading-tools.d.ts +78 -0
  138. package/dist/tools/adrena/adrena-trading-tools.d.ts.map +1 -0
  139. package/dist/tools/adrena/adrena-trading-tools.js +556 -0
  140. package/dist/tools/adrena/adrena-trading-tools.js.map +1 -0
  141. package/dist/tools/adrena-tools.d.ts +1 -66
  142. package/dist/tools/adrena-tools.d.ts.map +1 -1
  143. package/dist/tools/adrena-tools.js +1 -1061
  144. package/dist/tools/adrena-tools.js.map +1 -1
  145. package/dist/tools/client-sdk-tools.js +1 -1
  146. package/dist/tools/client-sdk-tools.js.map +1 -1
  147. package/dist/tools/memory-tools.d.ts.map +1 -1
  148. package/dist/tools/memory-tools.js +170 -0
  149. package/dist/tools/memory-tools.js.map +1 -1
  150. package/dist/tools/perp-tools.d.ts +6 -174
  151. package/dist/tools/perp-tools.d.ts.map +1 -1
  152. package/dist/tools/perp-tools.js +6 -1716
  153. package/dist/tools/perp-tools.js.map +1 -1
  154. package/dist/tools/premium-tools.d.ts.map +1 -1
  155. package/dist/tools/premium-tools.js +123 -5
  156. package/dist/tools/premium-tools.js.map +1 -1
  157. package/dist/tools/transaction-tools.d.ts +21 -1
  158. package/dist/tools/transaction-tools.d.ts.map +1 -1
  159. package/dist/tools/transaction-tools.js +114 -30
  160. package/dist/tools/transaction-tools.js.map +1 -1
  161. package/dist/tools/x402-paid-call-tool.d.ts.map +1 -1
  162. package/dist/tools/x402-paid-call-tool.js +288 -0
  163. package/dist/tools/x402-paid-call-tool.js.map +1 -1
  164. package/package.json +3 -2
  165. package/server.json +3 -3
@@ -1,1148 +1,22 @@
1
1
  /**
2
2
  * @name perps/adrena/adrena-builder
3
- * @description Local unsigned transaction builder for the Adrena perps protocol.
3
+ * @description Barrel re-export for the Adrena perps builder modules.
4
4
  *
5
- * Uses the vendored Adrena Anchor IDL (release/39) to build real on-chain
6
- * instructions via `@coral-xyz/anchor`, then wraps them in unsigned
7
- * `@solana/web3.js` transactions for local signing via
8
- * `sap_payments_finalize_transaction`.
5
+ * The original monolithic builder has been split into focused modules:
6
+ * - adrena-builder-core.ts — types, IDL loading, helpers, utilities
7
+ * - adrena-builder-trading.ts — position open/close, SL/TP, limit orders
8
+ * - adrena-builder-liquidity.ts — add/remove liquidity, swap
9
+ * - adrena-builder-staking.ts — staking init, liquid/locked stake, claim
10
+ * - adrena-builder-commodity.ts — commodity (XAU/XAG/WTI) positions
9
11
  *
10
- * This module NEVER signs transactions. It only constructs unsigned
11
- * transactions and returns them as base64-serialized bytes.
12
+ * This barrel preserves the original public API `export * from './adrena-builder.js'`
13
+ * in index.ts continues to re-export everything.
12
14
  *
13
15
  * @module perps/adrena/adrena-builder
14
16
  */
15
- import { PublicKey, Transaction, } from '@solana/web3.js';
16
- import { AnchorProvider, Program } from '@coral-xyz/anchor';
17
- import { readFileSync } from 'fs';
18
- import { fileURLToPath } from 'url';
19
- import { dirname, join } from 'path';
20
- import { ADRENA_PROGRAM_ID, ADRENA_MAIN_POOL_ADDRESS, ADRENA_COMMODITIES_POOL_ADDRESS, ADRENA_CUSTODIES, ADRENA_TOKEN_MINTS, TOKEN_PROGRAM_ID, SYSTEM_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID, } from './adrena-constants.js';
21
- import { deriveCortexPda, deriveOraclePda, deriveTransferAuthorityPda, deriveUserProfilePda, derivePositionPda, deriveCustodyTokenAccountPda, deriveLimitOrderBookPda, deriveCollateralEscrowPda, deriveLpTokenMintPda, deriveStakingPda, deriveUserStakingPda, deriveGenesisLockPda, deriveLmTokenTreasuryPda, deriveLmTokenMintPda, deriveGovernanceTokenMintPda, deriveStakingStakedTokenVaultPda, deriveStakingRewardTokenVaultPda, deriveStakingLmRewardTokenVaultPda, deriveAta, } from './adrena-pda.js';
22
- // ─── IDL Loading ──────────────────────────────────────────────────────────────
23
- const __filename = fileURLToPath(import.meta.url);
24
- const __dirname = dirname(__filename);
25
- /** Path to the vendored Adrena IDL JSON. */
26
- const IDL_PATH = join(__dirname, 'adrena-idl.json');
27
- /** Cached parsed IDL object. */
28
- let cachedIdl = null;
29
- /**
30
- * Load the vendored Adrena IDL.
31
- * @returns Parsed Anchor IDL.
32
- */
33
- function loadAdrenaIdl() {
34
- if (cachedIdl)
35
- return cachedIdl;
36
- const raw = readFileSync(IDL_PATH, 'utf-8');
37
- cachedIdl = JSON.parse(raw);
38
- return cachedIdl;
39
- }
40
- // ─── Helpers ──────────────────────────────────────────────────────────────────
41
- /**
42
- * Get pool public key by name.
43
- * @param poolName — Pool identifier.
44
- * @returns Pool public key.
45
- */
46
- function getPoolPublicKey(poolName) {
47
- const addr = poolName === 'commodities-pool' ? ADRENA_COMMODITIES_POOL_ADDRESS : ADRENA_MAIN_POOL_ADDRESS;
48
- return new PublicKey(addr);
49
- }
50
- /**
51
- * Get custody public key by symbol.
52
- * @param symbol — Token symbol (e.g. "JITOSOL", "USDC").
53
- * @param poolName — Pool identifier.
54
- * @returns Custody public key.
55
- */
56
- function getCustodyPublicKey(symbol, poolName = 'main-pool') {
57
- const custody = ADRENA_CUSTODIES[symbol.toUpperCase()];
58
- if (!custody) {
59
- throw new Error(`Unknown custody symbol: ${symbol}. Supported: ${Object.keys(ADRENA_CUSTODIES).join(', ')}`);
60
- }
61
- if (poolName === 'commodities-pool' && custody.pool !== ADRENA_COMMODITIES_POOL_ADDRESS) {
62
- throw new Error(`Custody ${symbol} is not in the commodities pool`);
63
- }
64
- return new PublicKey(custody.address);
65
- }
66
- /**
67
- * Get token mint by symbol.
68
- * @param symbol — Token symbol.
69
- * @returns Mint public key.
70
- */
71
- function getMintPublicKey(symbol) {
72
- const mint = ADRENA_TOKEN_MINTS[symbol.toUpperCase()];
73
- if (!mint) {
74
- throw new Error(`Unknown token mint: ${symbol}. Supported: ${Object.keys(ADRENA_TOKEN_MINTS).join(', ')}`);
75
- }
76
- return new PublicKey(mint);
77
- }
78
- /**
79
- * Create an Anchor Program instance from the vendored IDL.
80
- * @param connection — Solana RPC connection.
81
- * @returns Anchor Program instance.
82
- */
83
- function createAdrenaProgram(connection) {
84
- const idl = loadAdrenaIdl();
85
- const provider = new AnchorProvider(connection, {}, { commitment: 'confirmed' });
86
- return new Program(idl, provider);
87
- }
88
- /**
89
- * Convert an Anchor instruction to a @solana/web3.js TransactionInstruction.
90
- * Anchor's `Instruction` namespace returns instructions with keys and data
91
- * that can be directly mapped to TransactionInstruction.
92
- * @param program — Anchor Program instance.
93
- * @param ixName — Instruction name (camelCase).
94
- * @param args — Instruction arguments.
95
- * @param accounts — Account public keys by name.
96
- * @returns web3.js TransactionInstruction.
97
- */
98
- function buildInstruction(program, ixName, args, accounts) {
99
- // Anchor v0.30 exposes methods via program.methods
100
- // We use the lower-level approach: program.instruction[ixName](args, { accounts })
101
- const methods = program.methods;
102
- const ixBuilder = methods[ixName];
103
- if (!ixBuilder) {
104
- throw new Error(`Adrena instruction not found in IDL: ${ixName}`);
105
- }
106
- const ixWithArgs = ixBuilder(...args);
107
- const ixWithAccounts = ixWithArgs.accounts(accounts);
108
- return ixWithAccounts.instruction();
109
- }
110
- /**
111
- * Serialize an unsigned transaction with latest blockhash.
112
- * @param connection — Solana RPC connection.
113
- * @param feePayer — Fee payer public key.
114
- * @param instructions — Transaction instructions.
115
- * @returns Base64-serialized unsigned transaction.
116
- */
117
- async function serializeUnsignedTx(connection, feePayer, instructions) {
118
- const blockhash = await connection.getLatestBlockhash();
119
- const tx = new Transaction({
120
- recentBlockhash: blockhash.blockhash,
121
- feePayer,
122
- });
123
- tx.add(...instructions);
124
- return tx.serialize({
125
- requireAllSignatures: false,
126
- verifySignatures: false,
127
- }).toString('base64');
128
- }
129
- /**
130
- * Build the result object for a builder function.
131
- * @param transactionBase64 — Serialized unsigned transaction.
132
- * @param feePayer — Fee payer public key.
133
- * @param instructionNames — List of instruction names.
134
- * @param positionAddress — Optional position PDA.
135
- * @returns Unsigned transaction result.
136
- */
137
- function buildResult(transactionBase64, feePayer, instructionNames, positionAddress) {
138
- return {
139
- transactionBase64,
140
- encoding: 'base64',
141
- feePayer: feePayer.toBase58(),
142
- instructions: instructionNames,
143
- ...(positionAddress ? { positionAddress: positionAddress.toBase58() } : {}),
144
- nextTool: 'sap_payments_finalize_transaction',
145
- finalizeArgs: {
146
- transactionBase64,
147
- submit: false,
148
- },
149
- };
150
- }
151
- // ─── Trading Builders ─────────────────────────────────────────────────────────
152
- /**
153
- * @name buildOpenPositionLong
154
- * @description Build an unsigned transaction to open a long position on Adrena.
155
- *
156
- * @param connection — Solana RPC connection.
157
- * @param owner — Position owner and fee payer.
158
- * @param principalToken — Asset to trade (e.g. "JITOSOL").
159
- * @param collateralToken — Collateral token (must match principal for longs).
160
- * @param collateralAmount — Collateral amount in human-readable units (e.g. 10 = 10 JITOSOL).
161
- * @param leverage — Leverage multiplier.
162
- * @param price — Price in USD (scaled by 10^10), or null for market order.
163
- * @returns Unsigned transaction result.
164
- */
165
- export async function buildOpenPositionLong(connection, owner, principalToken, collateralToken, collateralAmount, leverage, price) {
166
- const program = createAdrenaProgram(connection);
167
- const pool = getPoolPublicKey('main-pool');
168
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
169
- const collateralCustody = getCustodyPublicKey(collateralToken, 'main-pool');
170
- const cortex = deriveCortexPda();
171
- const oracle = deriveOraclePda();
172
- const transferAuthority = deriveTransferAuthorityPda();
173
- const userProfile = deriveUserProfilePda(owner);
174
- const position = derivePositionPda(owner, pool, custody, 'long');
175
- const collateralCustodyTokenAccount = deriveCustodyTokenAccountPda(collateralCustody);
176
- const fundingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
177
- const referrerProfile = PublicKey.default;
178
- const collateralRaw = BigInt(Math.floor(collateralAmount * Math.pow(10, ADRENA_CUSTODIES[collateralToken.toUpperCase()].decimals)));
179
- const priceRaw = price ?? BigInt(0);
180
- const ix = buildInstruction(program, 'openOrIncreasePositionLong', [
181
- {
182
- price: priceRaw,
183
- collateral: collateralRaw,
184
- leverage,
185
- oraclePrices: null,
186
- multiOraclePrices: null,
187
- },
188
- ], {
189
- owner,
190
- payer: owner,
191
- fundingAccount,
192
- oracle,
193
- custody,
194
- collateralCustody,
195
- collateralCustodyTokenAccount,
196
- transferAuthority,
197
- cortex,
198
- pool,
199
- position,
200
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
201
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
202
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
203
- userProfile,
204
- referrerProfile,
205
- });
206
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
207
- return buildResult(transactionBase64, owner, ['openOrIncreasePositionLong'], position);
208
- }
209
- /**
210
- * @name buildOpenPositionShort
211
- * @description Build an unsigned transaction to open a short position on Adrena.
212
- *
213
- * @param connection — Solana RPC connection.
214
- * @param owner — Position owner and fee payer.
215
- * @param principalToken — Asset to short (e.g. "JITOSOL").
216
- * @param collateralToken — Collateral token (must be USDC for shorts).
217
- * @param collateralAmount — Collateral amount in human-readable units.
218
- * @param leverage — Leverage multiplier.
219
- * @param price — Price in USD (scaled by 10^10), or null for market order.
220
- * @returns Unsigned transaction result.
221
- */
222
- export async function buildOpenPositionShort(connection, owner, principalToken, collateralToken, collateralAmount, leverage, price) {
223
- const program = createAdrenaProgram(connection);
224
- const pool = getPoolPublicKey('main-pool');
225
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
226
- const collateralCustody = getCustodyPublicKey(collateralToken, 'main-pool');
227
- const cortex = deriveCortexPda();
228
- const oracle = deriveOraclePda();
229
- const transferAuthority = deriveTransferAuthorityPda();
230
- const userProfile = deriveUserProfilePda(owner);
231
- const position = derivePositionPda(owner, pool, custody, 'short');
232
- const collateralCustodyTokenAccount = deriveCustodyTokenAccountPda(collateralCustody);
233
- const fundingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
234
- const referrerProfile = PublicKey.default;
235
- const collateralRaw = BigInt(Math.floor(collateralAmount * Math.pow(10, ADRENA_CUSTODIES[collateralToken.toUpperCase()].decimals)));
236
- const priceRaw = price ?? BigInt(0);
237
- const ix = buildInstruction(program, 'openOrIncreasePositionShort', [
238
- {
239
- price: priceRaw,
240
- collateral: collateralRaw,
241
- leverage,
242
- oraclePrices: null,
243
- multiOraclePrices: null,
244
- },
245
- ], {
246
- owner,
247
- payer: owner,
248
- fundingAccount,
249
- oracle,
250
- custody,
251
- collateralCustody,
252
- collateralCustodyTokenAccount,
253
- transferAuthority,
254
- cortex,
255
- pool,
256
- position,
257
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
258
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
259
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
260
- userProfile,
261
- referrerProfile,
262
- });
263
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
264
- return buildResult(transactionBase64, owner, ['openOrIncreasePositionShort'], position);
265
- }
266
- /**
267
- * @name buildClosePositionLong
268
- * @description Build an unsigned transaction to close a long position on Adrena.
269
- *
270
- * @param connection — Solana RPC connection.
271
- * @param owner — Position owner and fee payer.
272
- * @param principalToken — Asset of the position.
273
- * @param price — Optional close price (scaled by 10^10), null for market close.
274
- * @param percentage — Percentage to close (1_000_000 = 100%).
275
- * @returns Unsigned transaction result.
276
- */
277
- export async function buildClosePositionLong(connection, owner, principalToken, price, percentage = 1000000n) {
278
- const program = createAdrenaProgram(connection);
279
- const pool = getPoolPublicKey('main-pool');
280
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
281
- const collateralCustody = custody;
282
- const cortex = deriveCortexPda();
283
- const oracle = deriveOraclePda();
284
- const transferAuthority = deriveTransferAuthorityPda();
285
- const userProfile = deriveUserProfilePda(owner);
286
- const position = derivePositionPda(owner, pool, custody, 'long');
287
- const collateralCustodyTokenAccount = deriveCustodyTokenAccountPda(collateralCustody);
288
- const receivingAccount = deriveAta(owner, getMintPublicKey(principalToken));
289
- const referrerProfile = PublicKey.default;
290
- const ix = buildInstruction(program, 'closePositionLong', [
291
- {
292
- price: price ?? null,
293
- oraclePrices: null,
294
- multiOraclePrices: null,
295
- percentage,
296
- },
297
- ], {
298
- caller: owner,
299
- owner,
300
- receivingAccount,
301
- transferAuthority,
302
- cortex,
303
- pool,
304
- position,
305
- custody,
306
- oracle,
307
- collateralCustody,
308
- collateralCustodyTokenAccount,
309
- userProfile,
310
- referrerProfile,
311
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
312
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
313
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
314
- });
315
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
316
- return buildResult(transactionBase64, owner, ['closePositionLong'], position);
317
- }
318
- /**
319
- * @name buildClosePositionShort
320
- * @description Build an unsigned transaction to close a short position on Adrena.
321
- *
322
- * @param connection — Solana RPC connection.
323
- * @param owner — Position owner and fee payer.
324
- * @param principalToken — Asset of the position.
325
- * @param collateralToken — Collateral token (USDC for shorts).
326
- * @param price — Optional close price (scaled by 10^10), null for market close.
327
- * @param percentage — Percentage to close (1_000_000 = 100%).
328
- * @returns Unsigned transaction result.
329
- */
330
- export async function buildClosePositionShort(connection, owner, principalToken, collateralToken, price, percentage = 1000000n) {
331
- const program = createAdrenaProgram(connection);
332
- const pool = getPoolPublicKey('main-pool');
333
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
334
- const collateralCustody = getCustodyPublicKey(collateralToken, 'main-pool');
335
- const cortex = deriveCortexPda();
336
- const oracle = deriveOraclePda();
337
- const transferAuthority = deriveTransferAuthorityPda();
338
- const userProfile = deriveUserProfilePda(owner);
339
- const position = derivePositionPda(owner, pool, custody, 'short');
340
- const collateralCustodyTokenAccount = deriveCustodyTokenAccountPda(collateralCustody);
341
- const receivingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
342
- const referrerProfile = PublicKey.default;
343
- const ix = buildInstruction(program, 'closePositionShort', [
344
- {
345
- price: price ?? null,
346
- oraclePrices: null,
347
- multiOraclePrices: null,
348
- percentage,
349
- },
350
- ], {
351
- caller: owner,
352
- owner,
353
- receivingAccount,
354
- transferAuthority,
355
- cortex,
356
- pool,
357
- position,
358
- custody,
359
- oracle,
360
- collateralCustody,
361
- collateralCustodyTokenAccount,
362
- userProfile,
363
- referrerProfile,
364
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
365
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
366
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
367
- });
368
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
369
- return buildResult(transactionBase64, owner, ['closePositionShort'], position);
370
- }
371
- // ─── SL / TP Builders ──────────────────────────────────────────────────────────
372
- /**
373
- * @name buildSetStopLoss
374
- * @description Build an unsigned transaction to set stop loss on a position.
375
- *
376
- * @param connection — Solana RPC connection.
377
- * @param owner — Position owner and fee payer.
378
- * @param principalToken — Asset of the position.
379
- * @param side — Position side.
380
- * @param stopLossLimitPrice — Stop loss trigger price (scaled by 10^10).
381
- * @param closePositionPrice — Optional close position price (scaled by 10^10).
382
- * @returns Unsigned transaction result.
383
- */
384
- export async function buildSetStopLoss(connection, owner, principalToken, side, stopLossLimitPrice, closePositionPrice) {
385
- const program = createAdrenaProgram(connection);
386
- const pool = getPoolPublicKey('main-pool');
387
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
388
- const cortex = deriveCortexPda();
389
- const position = derivePositionPda(owner, pool, custody, side);
390
- const ixName = side === 'long' ? 'setStopLossLong' : 'setStopLossShort';
391
- const ix = buildInstruction(program, ixName, [
392
- {
393
- stopLossLimitPrice,
394
- closePositionPrice: closePositionPrice ?? null,
395
- },
396
- ], {
397
- owner,
398
- cortex,
399
- pool,
400
- position,
401
- custody,
402
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
403
- });
404
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
405
- return buildResult(transactionBase64, owner, [ixName], position);
406
- }
407
- /**
408
- * @name buildSetTakeProfit
409
- * @description Build an unsigned transaction to set take profit on a position.
410
- *
411
- * @param connection — Solana RPC connection.
412
- * @param owner — Position owner and fee payer.
413
- * @param principalToken — Asset of the position.
414
- * @param side — Position side.
415
- * @param takeProfitLimitPrice — Take profit trigger price (scaled by 10^10).
416
- * @returns Unsigned transaction result.
417
- */
418
- export async function buildSetTakeProfit(connection, owner, principalToken, side, takeProfitLimitPrice) {
419
- const program = createAdrenaProgram(connection);
420
- const pool = getPoolPublicKey('main-pool');
421
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
422
- const cortex = deriveCortexPda();
423
- const position = derivePositionPda(owner, pool, custody, side);
424
- const ixName = side === 'long' ? 'setTakeProfitLong' : 'setTakeProfitShort';
425
- const ix = buildInstruction(program, ixName, [
426
- {
427
- takeProfitLimitPrice,
428
- },
429
- ], {
430
- owner,
431
- cortex,
432
- pool,
433
- position,
434
- custody,
435
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
436
- });
437
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
438
- return buildResult(transactionBase64, owner, [ixName], position);
439
- }
440
- /**
441
- * @name buildCancelStopLoss
442
- * @description Build an unsigned transaction to cancel stop loss on a position.
443
- * @param connection — Solana RPC connection.
444
- * @param owner — Position owner and fee payer.
445
- * @param principalToken — Asset of the position.
446
- * @param side — Position side.
447
- * @returns Unsigned transaction result.
448
- */
449
- export async function buildCancelStopLoss(connection, owner, principalToken, side) {
450
- const program = createAdrenaProgram(connection);
451
- const pool = getPoolPublicKey('main-pool');
452
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
453
- const cortex = deriveCortexPda();
454
- const position = derivePositionPda(owner, pool, custody, side);
455
- const ix = buildInstruction(program, 'cancelStopLoss', [], {
456
- owner,
457
- cortex,
458
- pool,
459
- position,
460
- custody,
461
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
462
- });
463
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
464
- return buildResult(transactionBase64, owner, ['cancelStopLoss'], position);
465
- }
466
- /**
467
- * @name buildCancelTakeProfit
468
- * @description Build an unsigned transaction to cancel take profit on a position.
469
- * @param connection — Solana RPC connection.
470
- * @param owner — Position owner and fee payer.
471
- * @param principalToken — Asset of the position.
472
- * @param side — Position side.
473
- * @returns Unsigned transaction result.
474
- */
475
- export async function buildCancelTakeProfit(connection, owner, principalToken, side) {
476
- const program = createAdrenaProgram(connection);
477
- const pool = getPoolPublicKey('main-pool');
478
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
479
- const cortex = deriveCortexPda();
480
- const position = derivePositionPda(owner, pool, custody, side);
481
- const ix = buildInstruction(program, 'cancelTakeProfit', [], {
482
- owner,
483
- cortex,
484
- pool,
485
- position,
486
- custody,
487
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
488
- });
489
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
490
- return buildResult(transactionBase64, owner, ['cancelTakeProfit'], position);
491
- }
492
- // ─── Limit Order Builders ───────────────────────────────────────────────────────
493
- /**
494
- * @name buildAddLimitOrder
495
- * @description Build an unsigned transaction to place a limit order on Adrena.
496
- *
497
- * @param connection — Solana RPC connection.
498
- * @param owner — Order owner and fee payer.
499
- * @param principalToken — Asset to trade.
500
- * @param collateralToken — Collateral token.
501
- * @param collateralAmount — Collateral amount in human-readable units.
502
- * @param leverage — Leverage multiplier.
503
- * @param side — Order side: long or short.
504
- * @param triggerPrice — Trigger price (scaled by 10^10).
505
- * @param limitPrice — Optional limit price (scaled by 10^10), null for market at fill.
506
- * @returns Unsigned transaction result.
507
- */
508
- export async function buildAddLimitOrder(connection, owner, principalToken, collateralToken, collateralAmount, leverage, side, triggerPrice, limitPrice) {
509
- const program = createAdrenaProgram(connection);
510
- const pool = getPoolPublicKey('main-pool');
511
- const custody = getCustodyPublicKey(principalToken, 'main-pool');
512
- const collateralCustody = getCustodyPublicKey(collateralToken, 'main-pool');
513
- const cortex = deriveCortexPda();
514
- const transferAuthority = deriveTransferAuthorityPda();
515
- const limitOrderBook = deriveLimitOrderBookPda(owner, pool);
516
- const collateralEscrow = deriveCollateralEscrowPda(owner, pool, collateralCustody);
517
- const collateralCustodyMint = getMintPublicKey(collateralToken);
518
- const fundingAccount = deriveAta(owner, collateralCustodyMint);
519
- const amountRaw = BigInt(Math.floor(collateralAmount * Math.pow(10, ADRENA_CUSTODIES[collateralToken.toUpperCase()].decimals)));
520
- const ix = buildInstruction(program, 'addLimitOrder', [
521
- {
522
- triggerPrice,
523
- limitPrice: limitPrice ?? null,
524
- side: side === 'long' ? 0 : 1,
525
- amount: amountRaw,
526
- leverage,
527
- },
528
- ], {
529
- owner,
530
- fundingAccount,
531
- transferAuthority,
532
- cortex,
533
- pool,
534
- limitOrderBook,
535
- collateralEscrow,
536
- collateralCustodyMint,
537
- custody,
538
- collateralCustody,
539
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
540
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
541
- associatedTokenProgram: new PublicKey(ASSOCIATED_TOKEN_PROGRAM_ID),
542
- });
543
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
544
- return buildResult(transactionBase64, owner, ['addLimitOrder']);
545
- }
546
- /**
547
- * @name buildCancelLimitOrder
548
- * @description Build an unsigned transaction to cancel a limit order on Adrena.
549
- *
550
- * @param connection — Solana RPC connection.
551
- * @param owner — Order owner and fee payer.
552
- * @param collateralToken — Collateral token.
553
- * @param orderId — Limit order ID.
554
- * @returns Unsigned transaction result.
555
- */
556
- export async function buildCancelLimitOrder(connection, owner, collateralToken, orderId) {
557
- const program = createAdrenaProgram(connection);
558
- const pool = getPoolPublicKey('main-pool');
559
- const collateralCustody = getCustodyPublicKey(collateralToken, 'main-pool');
560
- const cortex = deriveCortexPda();
561
- const transferAuthority = deriveTransferAuthorityPda();
562
- const limitOrderBook = deriveLimitOrderBookPda(owner, pool);
563
- const collateralEscrow = deriveCollateralEscrowPda(owner, pool, collateralCustody);
564
- const collateralCustodyMint = getMintPublicKey(collateralToken);
565
- const receivingAccount = deriveAta(owner, collateralCustodyMint);
566
- const ix = buildInstruction(program, 'cancelLimitOrder', [
567
- {
568
- id: orderId,
569
- },
570
- ], {
571
- owner,
572
- receivingAccount,
573
- transferAuthority,
574
- cortex,
575
- pool,
576
- limitOrderBook,
577
- collateralEscrow,
578
- collateralCustodyMint,
579
- collateralCustody,
580
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
581
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
582
- associatedTokenProgram: new PublicKey(ASSOCIATED_TOKEN_PROGRAM_ID),
583
- });
584
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
585
- return buildResult(transactionBase64, owner, ['cancelLimitOrder']);
586
- }
587
- // ─── Liquidity & Swap Builders ──────────────────────────────────────────────────
588
- /**
589
- * @name buildAddLiquidity
590
- * @description Build an unsigned transaction to add liquidity to an Adrena pool.
591
- *
592
- * @param connection — Solana RPC connection.
593
- * @param owner — Liquidity provider and fee payer.
594
- * @param collateralToken — Collateral token to deposit.
595
- * @param amountIn — Amount in human-readable units.
596
- * @param minLpAmountOut — Minimum LP tokens to receive (0 for no slippage protection).
597
- * @param poolName — Pool to add liquidity to.
598
- * @returns Unsigned transaction result.
599
- */
600
- export async function buildAddLiquidity(connection, owner, collateralToken, amountIn, minLpAmountOut = 0n, poolName = 'main-pool') {
601
- const program = createAdrenaProgram(connection);
602
- const pool = getPoolPublicKey(poolName);
603
- const custody = getCustodyPublicKey(collateralToken, poolName);
604
- const cortex = deriveCortexPda();
605
- const oracle = deriveOraclePda();
606
- const transferAuthority = deriveTransferAuthorityPda();
607
- const lpTokenMint = deriveLpTokenMintPda(pool);
608
- const lpStaking = deriveStakingPda(lpTokenMint);
609
- const custodyTokenAccount = deriveCustodyTokenAccountPda(custody);
610
- const lpTokenAccount = deriveAta(owner, lpTokenMint);
611
- const fundingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
612
- const amountRaw = BigInt(Math.floor(amountIn * Math.pow(10, ADRENA_CUSTODIES[collateralToken.toUpperCase()].decimals)));
613
- const ix = buildInstruction(program, 'addLiquidity', [
614
- {
615
- amountIn: amountRaw,
616
- minLpAmountOut,
617
- oraclePrices: null,
618
- multiOraclePrices: null,
619
- },
620
- ], {
621
- owner,
622
- fundingAccount,
623
- lpTokenAccount,
624
- transferAuthority,
625
- lpStaking,
626
- cortex,
627
- pool,
628
- custody,
629
- oracle,
630
- custodyTokenAccount,
631
- lpTokenMint,
632
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
633
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
634
- });
635
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
636
- return buildResult(transactionBase64, owner, ['addLiquidity']);
637
- }
638
- /**
639
- * @name buildRemoveLiquidity
640
- * @description Build an unsigned transaction to remove liquidity from an Adrena pool.
641
- *
642
- * @param connection — Solana RPC connection.
643
- * @param owner — Liquidity provider and fee payer.
644
- * @param collateralToken — Collateral token to receive.
645
- * @param lpAmountIn — LP tokens to burn (raw, 6 decimals).
646
- * @param minAmountOut — Minimum collateral to receive (raw, 0 for no slippage protection).
647
- * @param poolName — Pool to remove liquidity from.
648
- * @returns Unsigned transaction result.
649
- */
650
- export async function buildRemoveLiquidity(connection, owner, collateralToken, lpAmountIn, minAmountOut = 0n, poolName = 'main-pool') {
651
- const program = createAdrenaProgram(connection);
652
- const pool = getPoolPublicKey(poolName);
653
- const custody = getCustodyPublicKey(collateralToken, poolName);
654
- const cortex = deriveCortexPda();
655
- const oracle = deriveOraclePda();
656
- const transferAuthority = deriveTransferAuthorityPda();
657
- const lpTokenMint = deriveLpTokenMintPda(pool);
658
- const custodyTokenAccount = deriveCustodyTokenAccountPda(custody);
659
- const lpTokenAccount = deriveAta(owner, lpTokenMint);
660
- const receivingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
661
- const ix = buildInstruction(program, 'removeLiquidity', [
662
- {
663
- lpAmountIn,
664
- minAmountOut,
665
- oraclePrices: null,
666
- multiOraclePrices: null,
667
- },
668
- ], {
669
- owner,
670
- receivingAccount,
671
- lpTokenAccount,
672
- transferAuthority,
673
- cortex,
674
- pool,
675
- custody,
676
- oracle,
677
- custodyTokenAccount,
678
- lpTokenMint,
679
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
680
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
681
- });
682
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
683
- return buildResult(transactionBase64, owner, ['removeLiquidity']);
684
- }
685
- /**
686
- * @name buildSwap
687
- * @description Build an unsigned transaction to swap tokens through an Adrena pool.
688
- *
689
- * @param connection — Solana RPC connection.
690
- * @param owner — Swapper and fee payer.
691
- * @param fromToken — Token to swap from.
692
- * @param toToken — Token to swap to.
693
- * @param amountIn — Amount in human-readable units.
694
- * @param minAmountOut — Minimum amount to receive (raw, 0 for no slippage protection).
695
- * @returns Unsigned transaction result.
696
- */
697
- export async function buildSwap(connection, owner, fromToken, toToken, amountIn, minAmountOut = 0n) {
698
- const program = createAdrenaProgram(connection);
699
- const pool = getPoolPublicKey('main-pool');
700
- const dispensingCustody = getCustodyPublicKey(fromToken, 'main-pool');
701
- const receivingCustody = getCustodyPublicKey(toToken, 'main-pool');
702
- const cortex = deriveCortexPda();
703
- const oracle = deriveOraclePda();
704
- const transferAuthority = deriveTransferAuthorityPda();
705
- const receivingCustodyTokenAccount = deriveCustodyTokenAccountPda(receivingCustody);
706
- const dispensingCustodyTokenAccount = deriveCustodyTokenAccountPda(dispensingCustody);
707
- const fundingAccount = deriveAta(owner, getMintPublicKey(fromToken));
708
- const receivingAccount = deriveAta(owner, getMintPublicKey(toToken));
709
- const amountRaw = BigInt(Math.floor(amountIn * Math.pow(10, ADRENA_CUSTODIES[fromToken.toUpperCase()].decimals)));
710
- const ix = buildInstruction(program, 'swap', [
711
- {
712
- amountIn: amountRaw,
713
- minAmountOut,
714
- oraclePrices: null,
715
- multiOraclePrices: null,
716
- },
717
- ], {
718
- caller: owner,
719
- owner,
720
- fundingAccount,
721
- receivingAccount,
722
- transferAuthority,
723
- cortex,
724
- pool,
725
- receivingCustody,
726
- oracle,
727
- receivingCustodyTokenAccount,
728
- dispensingCustody,
729
- dispensingCustodyTokenAccount,
730
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
731
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
732
- });
733
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
734
- return buildResult(transactionBase64, owner, ['swap']);
735
- }
736
- // ─── Staking Builders ──────────────────────────────────────────────────────────
737
- /**
738
- * @name buildInitUserStaking
739
- * @description Build an unsigned transaction to initialize user staking account.
740
- * @param connection — Solana RPC connection.
741
- * @param owner — Staker and fee payer.
742
- * @returns Unsigned transaction result.
743
- */
744
- export async function buildInitUserStaking(connection, owner) {
745
- const program = createAdrenaProgram(connection);
746
- const pool = getPoolPublicKey('main-pool');
747
- const cortex = deriveCortexPda();
748
- const lpTokenMint = deriveLpTokenMintPda(pool);
749
- const staking = deriveStakingPda(lpTokenMint);
750
- const userStaking = deriveUserStakingPda(owner, staking);
751
- const lmTokenMint = deriveLmTokenMintPda();
752
- const feeRedistributionMint = new PublicKey('2zqtcQy7oc9Wf7TncsKQw1vq5gk6kG6r6wG6r6wG6r6');
753
- const rewardTokenAccount = deriveAta(owner, feeRedistributionMint);
754
- const lmTokenAccount = deriveAta(owner, lmTokenMint);
755
- const stakingRewardTokenVault = deriveStakingRewardTokenVaultPda(staking);
756
- const stakingLmRewardTokenVault = deriveStakingLmRewardTokenVaultPda(staking);
757
- const transferAuthority = deriveTransferAuthorityPda();
758
- const ix = buildInstruction(program, 'initUserStaking', [], {
759
- caller: owner,
760
- payer: owner,
761
- owner,
762
- rewardTokenAccount,
763
- lmTokenAccount,
764
- stakingRewardTokenVault,
765
- stakingLmRewardTokenVault,
766
- userStaking,
767
- transferAuthority,
768
- staking,
769
- cortex,
770
- pool,
771
- lmTokenMint,
772
- feeRedistributionMint,
773
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
774
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
775
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
776
- });
777
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
778
- return buildResult(transactionBase64, owner, ['initUserStaking']);
779
- }
780
- /**
781
- * @name buildAddLiquidStake
782
- * @description Build an unsigned transaction to add a liquid stake (LP tokens).
783
- * @param connection — Solana RPC connection.
784
- * @param owner — Staker and fee payer.
785
- * @param amount — Amount of LP tokens to stake (raw, 6 decimals).
786
- * @returns Unsigned transaction result.
787
- */
788
- export async function buildAddLiquidStake(connection, owner, amount) {
789
- const program = createAdrenaProgram(connection);
790
- const pool = getPoolPublicKey('main-pool');
791
- const cortex = deriveCortexPda();
792
- const lpTokenMint = deriveLpTokenMintPda(pool);
793
- const staking = deriveStakingPda(lpTokenMint);
794
- const userStaking = deriveUserStakingPda(owner, staking);
795
- const genesisLock = deriveGenesisLockPda(pool);
796
- const lmTokenTreasury = deriveLmTokenTreasuryPda(cortex);
797
- const lmTokenMint = deriveLmTokenMintPda();
798
- const governanceTokenMint = deriveGovernanceTokenMintPda();
799
- const feeRedistributionMint = new PublicKey('2zqtcQy7oc9Wf7TncsKQw1vq5gk6kG6r6wG6r6wG6r6');
800
- const transferAuthority = deriveTransferAuthorityPda();
801
- const fundingAccount = deriveAta(owner, lpTokenMint);
802
- const rewardTokenAccount = deriveAta(owner, feeRedistributionMint);
803
- const lmTokenAccount = deriveAta(owner, lmTokenMint);
804
- const stakingStakedTokenVault = deriveStakingStakedTokenVaultPda(staking);
805
- const stakingRewardTokenVault = deriveStakingRewardTokenVaultPda(staking);
806
- const stakingLmRewardTokenVault = deriveStakingLmRewardTokenVaultPda(staking);
807
- const ix = buildInstruction(program, 'addLiquidStake', [
808
- { amount },
809
- ], {
810
- owner,
811
- fundingAccount,
812
- rewardTokenAccount,
813
- lmTokenAccount,
814
- stakingStakedTokenVault,
815
- stakingRewardTokenVault,
816
- stakingLmRewardTokenVault,
817
- transferAuthority,
818
- userStaking,
819
- staking,
820
- cortex,
821
- pool,
822
- genesisLock,
823
- lmTokenTreasury,
824
- governanceTokenMint,
825
- feeRedistributionMint,
826
- governanceRealm: PublicKey.default,
827
- governanceRealmConfig: PublicKey.default,
828
- governanceGoverningTokenHolding: PublicKey.default,
829
- governanceGoverningTokenOwnerRecord: PublicKey.default,
830
- governanceProgram: new PublicKey('GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw'),
831
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
832
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
833
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
834
- });
835
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
836
- return buildResult(transactionBase64, owner, ['addLiquidStake']);
837
- }
838
- /**
839
- * @name buildRemoveLiquidStake
840
- * @description Build an unsigned transaction to remove a liquid stake.
841
- * @param connection — Solana RPC connection.
842
- * @param owner — Staker and fee payer.
843
- * @param amount — Amount of staked LP tokens to withdraw (raw, 6 decimals).
844
- * @returns Unsigned transaction result.
845
- */
846
- export async function buildRemoveLiquidStake(connection, owner, amount) {
847
- const program = createAdrenaProgram(connection);
848
- const pool = getPoolPublicKey('main-pool');
849
- const cortex = deriveCortexPda();
850
- const lpTokenMint = deriveLpTokenMintPda(pool);
851
- const staking = deriveStakingPda(lpTokenMint);
852
- const userStaking = deriveUserStakingPda(owner, staking);
853
- const genesisLock = deriveGenesisLockPda(pool);
854
- const lmTokenTreasury = deriveLmTokenTreasuryPda(cortex);
855
- const lmTokenMint = deriveLmTokenMintPda();
856
- const governanceTokenMint = deriveGovernanceTokenMintPda();
857
- const feeRedistributionMint = new PublicKey('2zqtcQy7oc9Wf7TncsKQw1vq5gk6kG6r6wG6r6wG6r6');
858
- const transferAuthority = deriveTransferAuthorityPda();
859
- const stakedTokenAccount = deriveAta(owner, lpTokenMint);
860
- const lmTokenAccount = deriveAta(owner, lmTokenMint);
861
- const rewardTokenAccount = deriveAta(owner, feeRedistributionMint);
862
- const stakingStakedTokenVault = deriveStakingStakedTokenVaultPda(staking);
863
- const stakingRewardTokenVault = deriveStakingRewardTokenVaultPda(staking);
864
- const stakingLmRewardTokenVault = deriveStakingLmRewardTokenVaultPda(staking);
865
- const ix = buildInstruction(program, 'removeLiquidStake', [
866
- { amount },
867
- ], {
868
- owner,
869
- stakedTokenAccount,
870
- lmTokenAccount,
871
- rewardTokenAccount,
872
- stakingStakedTokenVault,
873
- stakingRewardTokenVault,
874
- stakingLmRewardTokenVault,
875
- transferAuthority,
876
- userStaking,
877
- staking,
878
- cortex,
879
- pool,
880
- genesisLock,
881
- lmTokenTreasury,
882
- governanceTokenMint,
883
- feeRedistributionMint,
884
- governanceRealm: PublicKey.default,
885
- governanceRealmConfig: PublicKey.default,
886
- governanceGoverningTokenHolding: PublicKey.default,
887
- governanceGoverningTokenOwnerRecord: PublicKey.default,
888
- governanceProgram: new PublicKey('GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw'),
889
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
890
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
891
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
892
- });
893
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
894
- return buildResult(transactionBase64, owner, ['removeLiquidStake']);
895
- }
896
- /**
897
- * @name buildAddLockedStake
898
- * @description Build an unsigned transaction to add a locked stake.
899
- * @param connection — Solana RPC connection.
900
- * @param owner — Staker and fee payer.
901
- * @param amount — Amount of LP tokens to lock (raw, 6 decimals).
902
- * @param lockedDays — Lock duration in days.
903
- * @returns Unsigned transaction result.
904
- */
905
- export async function buildAddLockedStake(connection, owner, amount, lockedDays) {
906
- const program = createAdrenaProgram(connection);
907
- const pool = getPoolPublicKey('main-pool');
908
- const cortex = deriveCortexPda();
909
- const lpTokenMint = deriveLpTokenMintPda(pool);
910
- const staking = deriveStakingPda(lpTokenMint);
911
- const userStaking = deriveUserStakingPda(owner, staking);
912
- const lmTokenMint = deriveLmTokenMintPda();
913
- const governanceTokenMint = deriveGovernanceTokenMintPda();
914
- const feeRedistributionMint = new PublicKey('2zqtcQy7oc9Wf7TncsKQw1vq5gk6kG6r6wG6r6wG6r6');
915
- const transferAuthority = deriveTransferAuthorityPda();
916
- const fundingAccount = deriveAta(owner, lpTokenMint);
917
- const rewardTokenAccount = deriveAta(owner, feeRedistributionMint);
918
- const stakingStakedTokenVault = deriveStakingStakedTokenVaultPda(staking);
919
- const stakingRewardTokenVault = deriveStakingRewardTokenVaultPda(staking);
920
- const ix = buildInstruction(program, 'addLockedStake', [
921
- { amount, lockedDays },
922
- ], {
923
- owner,
924
- fundingAccount,
925
- rewardTokenAccount,
926
- stakingStakedTokenVault,
927
- stakingRewardTokenVault,
928
- transferAuthority,
929
- userStaking,
930
- staking,
931
- cortex,
932
- lmTokenMint,
933
- governanceTokenMint,
934
- feeRedistributionMint,
935
- governanceRealm: PublicKey.default,
936
- governanceRealmConfig: PublicKey.default,
937
- governanceGoverningTokenHolding: PublicKey.default,
938
- governanceGoverningTokenOwnerRecord: PublicKey.default,
939
- governanceProgram: new PublicKey('GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw'),
940
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
941
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
942
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
943
- });
944
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
945
- return buildResult(transactionBase64, owner, ['addLockedStake']);
946
- }
947
- /**
948
- * @name buildClaimStakes
949
- * @description Build an unsigned transaction to claim staking rewards.
950
- * @param connection — Solana RPC connection.
951
- * @param owner — Staker and fee payer.
952
- * @param lockedStakeIndexes — Optional array of locked stake indexes to claim.
953
- * @returns Unsigned transaction result.
954
- */
955
- export async function buildClaimStakes(connection, owner, lockedStakeIndexes) {
956
- const program = createAdrenaProgram(connection);
957
- const pool = getPoolPublicKey('main-pool');
958
- const cortex = deriveCortexPda();
959
- const lpTokenMint = deriveLpTokenMintPda(pool);
960
- const staking = deriveStakingPda(lpTokenMint);
961
- const userStaking = deriveUserStakingPda(owner, staking);
962
- const genesisLock = deriveGenesisLockPda(pool);
963
- const lmTokenTreasury = deriveLmTokenTreasuryPda(cortex);
964
- const lmTokenMint = deriveLmTokenMintPda();
965
- const feeRedistributionMint = new PublicKey('2zqtcQy7oc9Wf7TncsKQw1vq5gk6kG6r6wG6r6wG6r6');
966
- const transferAuthority = deriveTransferAuthorityPda();
967
- const rewardTokenAccount = deriveAta(owner, feeRedistributionMint);
968
- const lmTokenAccount = deriveAta(owner, lmTokenMint);
969
- const stakingRewardTokenVault = deriveStakingRewardTokenVaultPda(staking);
970
- const stakingLmRewardTokenVault = deriveStakingLmRewardTokenVaultPda(staking);
971
- const ix = buildInstruction(program, 'claimStakes', [
972
- {
973
- lockedStakeIndexes: lockedStakeIndexes
974
- ? Buffer.from(lockedStakeIndexes.flatMap((i) => [i & 0xff, (i >> 8) & 0xff, (i >> 16) & 0xff, (i >> 24) & 0xff]))
975
- : null,
976
- },
977
- ], {
978
- caller: owner,
979
- payer: owner,
980
- owner,
981
- rewardTokenAccount,
982
- lmTokenAccount,
983
- stakingRewardTokenVault,
984
- stakingLmRewardTokenVault,
985
- transferAuthority,
986
- userStaking,
987
- staking,
988
- cortex,
989
- pool,
990
- genesisLock,
991
- lmTokenTreasury,
992
- feeRedistributionMint,
993
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
994
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
995
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
996
- });
997
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
998
- return buildResult(transactionBase64, owner, ['claimStakes']);
999
- }
1000
- // ─── Commodity Builders (synthetic perps) ──────────────────────────────────────
1001
- /**
1002
- * @name buildOpenCommodityLong
1003
- * @description Build an unsigned transaction to open a long position on a commodity (XAU, XAG, WTI).
1004
- * Uses the commodities pool.
1005
- *
1006
- * @param connection — Solana RPC connection.
1007
- * @param owner — Position owner and fee payer.
1008
- * @param principalToken — Commodity symbol (XAU, XAG, WTI).
1009
- * @param collateralAmount — USDC collateral amount in human-readable units.
1010
- * @param leverage — Leverage multiplier.
1011
- * @param price — Price in USD (scaled by 10^10), or null for market order.
1012
- * @returns Unsigned transaction result.
1013
- */
1014
- export async function buildOpenCommodityLong(connection, owner, principalToken, collateralAmount, leverage, price) {
1015
- return buildOpenPositionLongInternal(connection, owner, principalToken, 'USDC', collateralAmount, leverage, price, 'commodities-pool', 'openOrIncreasePositionLong', 'long');
1016
- }
1017
- /**
1018
- * @name buildOpenCommodityShort
1019
- * @description Build an unsigned transaction to open a short position on a commodity.
1020
- * Uses the commodities pool.
1021
- *
1022
- * @param connection — Solana RPC connection.
1023
- * @param owner — Position owner and fee payer.
1024
- * @param principalToken — Commodity symbol (XAU, XAG, WTI).
1025
- * @param collateralAmount — USDC collateral amount in human-readable units.
1026
- * @param leverage — Leverage multiplier.
1027
- * @param price — Price in USD (scaled by 10^10), or null for market order.
1028
- * @returns Unsigned transaction result.
1029
- */
1030
- export async function buildOpenCommodityShort(connection, owner, principalToken, collateralAmount, leverage, price) {
1031
- return buildOpenPositionLongInternal(connection, owner, principalToken, 'USDC', collateralAmount, leverage, price, 'commodities-pool', 'openOrIncreasePositionShort', 'short');
1032
- }
1033
- /**
1034
- * @name buildCloseCommodityLong
1035
- * @description Build an unsigned transaction to close a long commodity position.
1036
- * @param connection — Solana RPC connection.
1037
- * @param owner — Position owner and fee payer.
1038
- * @param principalToken — Commodity symbol.
1039
- * @param price — Optional close price.
1040
- * @param percentage — Percentage to close.
1041
- * @returns Unsigned transaction result.
1042
- */
1043
- export async function buildCloseCommodityLong(connection, owner, principalToken, price, percentage = 1000000n) {
1044
- return buildClosePositionLongInternal(connection, owner, principalToken, 'USDC', price, percentage, 'commodities-pool', 'closePositionLong', 'long');
1045
- }
1046
- /**
1047
- * @name buildCloseCommodityShort
1048
- * @description Build an unsigned transaction to close a short commodity position.
1049
- * @param connection — Solana RPC connection.
1050
- * @param owner — Position owner and fee payer.
1051
- * @param principalToken — Commodity symbol.
1052
- * @param price — Optional close price.
1053
- * @param percentage — Percentage to close.
1054
- * @returns Unsigned transaction result.
1055
- */
1056
- export async function buildCloseCommodityShort(connection, owner, principalToken, price, percentage = 1000000n) {
1057
- return buildClosePositionLongInternal(connection, owner, principalToken, 'USDC', price, percentage, 'commodities-pool', 'closePositionShort', 'short');
1058
- }
1059
- // ─── Internal shared builders for pool-agnostic operations ──────────────────────
1060
- async function buildOpenPositionLongInternal(connection, owner, principalToken, collateralToken, collateralAmount, leverage, price, poolName, ixName, side) {
1061
- const program = createAdrenaProgram(connection);
1062
- const pool = getPoolPublicKey(poolName);
1063
- const custody = getCustodyPublicKey(principalToken, poolName);
1064
- const collateralCustody = getCustodyPublicKey(collateralToken, poolName);
1065
- const cortex = deriveCortexPda();
1066
- const oracle = deriveOraclePda();
1067
- const transferAuthority = deriveTransferAuthorityPda();
1068
- const userProfile = deriveUserProfilePda(owner);
1069
- const position = derivePositionPda(owner, pool, custody, side);
1070
- const collateralCustodyTokenAccount = deriveCustodyTokenAccountPda(collateralCustody);
1071
- const fundingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
1072
- const referrerProfile = PublicKey.default;
1073
- const collateralRaw = BigInt(Math.floor(collateralAmount * Math.pow(10, ADRENA_CUSTODIES[collateralToken.toUpperCase()].decimals)));
1074
- const priceRaw = price ?? BigInt(0);
1075
- const ix = buildInstruction(program, ixName, [
1076
- {
1077
- price: priceRaw,
1078
- collateral: collateralRaw,
1079
- leverage,
1080
- oraclePrices: null,
1081
- multiOraclePrices: null,
1082
- },
1083
- ], {
1084
- owner,
1085
- payer: owner,
1086
- fundingAccount,
1087
- oracle,
1088
- custody,
1089
- collateralCustody,
1090
- collateralCustodyTokenAccount,
1091
- transferAuthority,
1092
- cortex,
1093
- pool,
1094
- position,
1095
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
1096
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
1097
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
1098
- userProfile,
1099
- referrerProfile,
1100
- });
1101
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
1102
- return buildResult(transactionBase64, owner, [ixName], position);
1103
- }
1104
- async function buildClosePositionLongInternal(connection, owner, principalToken, collateralToken, price, percentage, poolName, ixName, side) {
1105
- const program = createAdrenaProgram(connection);
1106
- const pool = getPoolPublicKey(poolName);
1107
- const custody = getCustodyPublicKey(principalToken, poolName);
1108
- const collateralCustody = getCustodyPublicKey(collateralToken, poolName);
1109
- const cortex = deriveCortexPda();
1110
- const oracle = deriveOraclePda();
1111
- const transferAuthority = deriveTransferAuthorityPda();
1112
- const userProfile = deriveUserProfilePda(owner);
1113
- const position = derivePositionPda(owner, pool, custody, side);
1114
- const collateralCustodyTokenAccount = deriveCustodyTokenAccountPda(collateralCustody);
1115
- const receivingAccount = deriveAta(owner, getMintPublicKey(collateralToken));
1116
- const referrerProfile = PublicKey.default;
1117
- const ix = buildInstruction(program, ixName, [
1118
- {
1119
- price: price ?? null,
1120
- oraclePrices: null,
1121
- multiOraclePrices: null,
1122
- percentage,
1123
- },
1124
- ], {
1125
- caller: owner,
1126
- owner,
1127
- receivingAccount,
1128
- transferAuthority,
1129
- cortex,
1130
- pool,
1131
- position,
1132
- custody,
1133
- oracle,
1134
- collateralCustody,
1135
- collateralCustodyTokenAccount,
1136
- userProfile,
1137
- referrerProfile,
1138
- tokenProgram: new PublicKey(TOKEN_PROGRAM_ID),
1139
- adrenaProgram: new PublicKey(ADRENA_PROGRAM_ID),
1140
- systemProgram: new PublicKey(SYSTEM_PROGRAM_ID),
1141
- });
1142
- const transactionBase64 = await serializeUnsignedTx(connection, owner, [ix]);
1143
- return buildResult(transactionBase64, owner, [ixName], position);
1144
- }
1145
- // ─── Re-exports ─────────────────────────────────────────────────────────────────
1146
- export { ADRENA_CUSTODIES, ADRENA_TOKEN_MINTS, ADRENA_PROGRAM_ID, ADRENA_MAIN_POOL_ADDRESS, ADRENA_COMMODITIES_POOL_ADDRESS, } from './adrena-constants.js';
1147
- export { deriveCortexPda, deriveOraclePda, deriveTransferAuthorityPda, deriveUserProfilePda, derivePositionPda, deriveCustodyTokenAccountPda, deriveLimitOrderBookPda, deriveCollateralEscrowPda, deriveLpTokenMintPda, deriveStakingPda, deriveUserStakingPda, deriveGenesisLockPda, deriveLmTokenTreasuryPda, deriveLmTokenMintPda, deriveGovernanceTokenMintPda, deriveStakingStakedTokenVaultPda, deriveStakingRewardTokenVaultPda, deriveStakingLmRewardTokenVaultPda, deriveAta, } from './adrena-pda.js';
17
+ export * from './adrena-builder-core.js';
18
+ export * from './adrena-builder-trading.js';
19
+ export * from './adrena-builder-liquidity.js';
20
+ export * from './adrena-builder-staking.js';
21
+ export * from './adrena-builder-commodity.js';
1148
22
  //# sourceMappingURL=adrena-builder.js.map