@sentinelysolana/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +432 -0
- package/dist/__tests__/integration.test.d.ts +32 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +225 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/clients/compliance.d.ts +126 -0
- package/dist/clients/compliance.d.ts.map +1 -0
- package/dist/clients/compliance.js +269 -0
- package/dist/clients/compliance.js.map +1 -0
- package/dist/clients/oracle.d.ts +113 -0
- package/dist/clients/oracle.d.ts.map +1 -0
- package/dist/clients/oracle.js +285 -0
- package/dist/clients/oracle.js.map +1 -0
- package/dist/clients/vault.d.ts +173 -0
- package/dist/clients/vault.d.ts.map +1 -0
- package/dist/clients/vault.js +529 -0
- package/dist/clients/vault.js.map +1 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +234 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ============ VAULTCLIENT: ANCHOR ABSTRACTION ============
|
|
4
|
+
*
|
|
5
|
+
* Handles all NeuralVault operations without requiring
|
|
6
|
+
* developers to understand Anchor PDAs or cryptography.
|
|
7
|
+
*
|
|
8
|
+
* Simple API:
|
|
9
|
+
* - vault.initializeVault()
|
|
10
|
+
* - vault.deposit(amountUsdc)
|
|
11
|
+
* - vault.setRiskLimits({ maxPositionBps })
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.VaultClient = void 0;
|
|
15
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
16
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
17
|
+
/**
|
|
18
|
+
* VaultClient: Institutional vault management without Anchor complexity
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const vault = new VaultClient(config);
|
|
23
|
+
* await vault.initializeVault({ maxPositionBps: 500 });
|
|
24
|
+
* await vault.deposit({ amountUsdc: 10000 });
|
|
25
|
+
* await vault.setRiskLimits({ maxPositionBps: 300 });
|
|
26
|
+
* const state = await vault.getVaultState();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
class VaultClient {
|
|
30
|
+
/**
|
|
31
|
+
* Initialize VaultClient
|
|
32
|
+
*
|
|
33
|
+
* Supports two modes:
|
|
34
|
+
* 1. Backend mode: Pass keypair for server-side signing
|
|
35
|
+
* 2. Frontend mode: Pass signTransaction + publicKey for wallet adapter (non-custodial)
|
|
36
|
+
*
|
|
37
|
+
* @param config - SDK configuration
|
|
38
|
+
*/
|
|
39
|
+
constructor(config) {
|
|
40
|
+
/** USDC Devnet mint */
|
|
41
|
+
this.USDC_MINT = new web3_js_1.PublicKey('EPjFWdd5Au17y2edWjNx5mKnvUcghLgMLKXZKL7xS1d');
|
|
42
|
+
this.connection = new web3_js_1.Connection(config.rpcUrl, config.commitment || 'confirmed');
|
|
43
|
+
// Determine signing mode
|
|
44
|
+
if (config.keypair) {
|
|
45
|
+
// Backend mode: keypair-based signing
|
|
46
|
+
this.keypair = web3_js_1.Keypair.fromSecretKey(config.keypair.secretKey);
|
|
47
|
+
this.userPublicKey = this.keypair.publicKey;
|
|
48
|
+
}
|
|
49
|
+
else if (config.signTransaction && config.publicKey) {
|
|
50
|
+
// Frontend mode: wallet adapter signing (non-custodial)
|
|
51
|
+
this.signTransaction = config.signTransaction;
|
|
52
|
+
this.userPublicKey = new web3_js_1.PublicKey(config.publicKey);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
throw new Error('VaultClient requires either (keypair) or (signTransaction + publicKey)');
|
|
56
|
+
}
|
|
57
|
+
this.programId = new web3_js_1.PublicKey(config.programId || 'A7FnyNVtkcRMEkhaBjgtKZ1Z7Mh4N9XLBN8AGneXNK2F');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Initialize a new NeuralVault PDA
|
|
61
|
+
*
|
|
62
|
+
* Abstracts away:
|
|
63
|
+
* - PDA derivation
|
|
64
|
+
* - Associated token account creation
|
|
65
|
+
* - Anchor instruction building
|
|
66
|
+
* - Rent funding
|
|
67
|
+
*
|
|
68
|
+
* @param params - Vault initialization parameters
|
|
69
|
+
* @returns Vault public key and transaction hash
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const response = await vault.initializeVault({
|
|
74
|
+
* maxPositionBps: 500, // 5% max position
|
|
75
|
+
* riskLevel: 60,
|
|
76
|
+
* });
|
|
77
|
+
* console.log('Vault created:', response.vaultPubkey);
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
async initializeVault(params) {
|
|
81
|
+
try {
|
|
82
|
+
this.log('Initializing vault with params:', params);
|
|
83
|
+
// Step 1: Derive vault PDA (seed: "vault" + user pubkey + vault_id)
|
|
84
|
+
const vaultId = BigInt(Date.now()); // Use timestamp as vault_id for uniqueness
|
|
85
|
+
const [vaultPda, bump] = await web3_js_1.PublicKey.findProgramAddress([Buffer.from('vault'), this.userPublicKey.toBuffer(), Buffer.from(vaultId.toString())], this.programId);
|
|
86
|
+
this.log(`Vault PDA: ${vaultPda.toString()}`);
|
|
87
|
+
// Step 2: Derive vault token account (ATA)
|
|
88
|
+
const vaultTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(this.USDC_MINT, vaultPda, true // allowOwnerOffCurve
|
|
89
|
+
);
|
|
90
|
+
// Step 3: Get user's USDC token account
|
|
91
|
+
const userTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(this.USDC_MINT, this.userPublicKey);
|
|
92
|
+
// Step 4: Build initialize_vault instruction
|
|
93
|
+
const transaction = new web3_js_1.Transaction();
|
|
94
|
+
// Build the instruction data for initialize_vault
|
|
95
|
+
// Args: vault_id (u64), max_position_size_bps (u16), risk_level (u8), usdc_mint (Pubkey)
|
|
96
|
+
const instructionData = this.buildInitializeVaultIx(vaultId, params.maxPositionBps, params.riskLevel || 50, this.USDC_MINT);
|
|
97
|
+
const initVaultIx = new web3_js_1.TransactionInstruction({
|
|
98
|
+
programId: this.programId,
|
|
99
|
+
keys: [
|
|
100
|
+
{ pubkey: vaultPda, isSigner: false, isWritable: true },
|
|
101
|
+
{ pubkey: vaultTokenAccount, isSigner: false, isWritable: true },
|
|
102
|
+
{ pubkey: userTokenAccount, isSigner: false, isWritable: false },
|
|
103
|
+
{ pubkey: this.USDC_MINT, isSigner: false, isWritable: false },
|
|
104
|
+
{ pubkey: this.userPublicKey, isSigner: true, isWritable: true },
|
|
105
|
+
{ pubkey: spl_token_1.TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
|
106
|
+
{ pubkey: web3_js_1.SystemProgram.programId, isSigner: false, isWritable: false },
|
|
107
|
+
{ pubkey: this.getSysvarRent(), isSigner: false, isWritable: false },
|
|
108
|
+
],
|
|
109
|
+
data: instructionData,
|
|
110
|
+
});
|
|
111
|
+
transaction.add(initVaultIx);
|
|
112
|
+
// Step 5: Sign and send transaction
|
|
113
|
+
this.log('Sending initialize_vault transaction...');
|
|
114
|
+
const txHash = await this.sendAndConfirmTx(transaction);
|
|
115
|
+
this.log(`Vault initialized: ${txHash}`);
|
|
116
|
+
return {
|
|
117
|
+
vaultPubkey: vaultPda.toString(),
|
|
118
|
+
vaultTokenAccount: vaultTokenAccount.toString(),
|
|
119
|
+
txHash,
|
|
120
|
+
timestamp: Date.now(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw this.formatError('VAULT_INIT_FAILED', error);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Deposit USDC into vault
|
|
129
|
+
*
|
|
130
|
+
* Abstracts away:
|
|
131
|
+
* - SPL token transfer
|
|
132
|
+
* - Anchor instruction encoding
|
|
133
|
+
* - Transaction signing
|
|
134
|
+
*
|
|
135
|
+
* @param params - Deposit parameters (amount in USDC)
|
|
136
|
+
* @returns Deposit confirmation and new balance
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const response = await vault.deposit({ amountUsdc: 5000 });
|
|
141
|
+
* console.log('Deposited:', response.amountUsdc);
|
|
142
|
+
* console.log('New balance:', response.newBalanceUsdc);
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
async deposit(params) {
|
|
146
|
+
try {
|
|
147
|
+
this.log(`Depositing ${params.amountUsdc} USDC into vault`);
|
|
148
|
+
// Step 1: Derive vault PDA (need to know the vault_id, we'll use the first vault)
|
|
149
|
+
// In production, this should be passed as a parameter
|
|
150
|
+
const vaultId = BigInt(0); // Use vault_id 0 for first vault
|
|
151
|
+
const [vaultPda] = await web3_js_1.PublicKey.findProgramAddress([Buffer.from('vault'), this.userPublicKey.toBuffer(), Buffer.from(vaultId.toString())], this.programId);
|
|
152
|
+
// Step 2: Get user's USDC token account
|
|
153
|
+
const userTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(this.USDC_MINT, this.userPublicKey);
|
|
154
|
+
// Step 3: Get vault's token account
|
|
155
|
+
const vaultTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(this.USDC_MINT, vaultPda, true);
|
|
156
|
+
// Step 4: Convert USDC to cents (fixed-point math)
|
|
157
|
+
const amountCents = BigInt(Math.round(params.amountUsdc * 100));
|
|
158
|
+
// Step 5: Build transaction with deposit_usdc instruction
|
|
159
|
+
const transaction = new web3_js_1.Transaction();
|
|
160
|
+
// Build instruction data for deposit_usdc
|
|
161
|
+
// Args: amount (u64)
|
|
162
|
+
const discriminator = Buffer.from([
|
|
163
|
+
205, 226, 44, 209, 227, 209, 24, 213, // deposit_usdc discriminator
|
|
164
|
+
]);
|
|
165
|
+
const argsBuffer = Buffer.alloc(8);
|
|
166
|
+
argsBuffer.writeBigUInt64LE(amountCents, 0);
|
|
167
|
+
const instructionData = Buffer.concat([discriminator, argsBuffer]);
|
|
168
|
+
const depositIx = new web3_js_1.TransactionInstruction({
|
|
169
|
+
programId: this.programId,
|
|
170
|
+
keys: [
|
|
171
|
+
{ pubkey: vaultPda, isSigner: false, isWritable: true },
|
|
172
|
+
{ pubkey: vaultTokenAccount, isSigner: false, isWritable: true },
|
|
173
|
+
{ pubkey: userTokenAccount, isSigner: false, isWritable: true },
|
|
174
|
+
{ pubkey: this.userPublicKey, isSigner: true, isWritable: false },
|
|
175
|
+
{ pubkey: spl_token_1.TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
|
176
|
+
],
|
|
177
|
+
data: instructionData,
|
|
178
|
+
});
|
|
179
|
+
transaction.add(depositIx);
|
|
180
|
+
// Step 6: Sign and send
|
|
181
|
+
this.log('Sending deposit_usdc transaction...');
|
|
182
|
+
const txHash = await this.sendAndConfirmTx(transaction);
|
|
183
|
+
this.log(`Deposit confirmed: ${txHash}`);
|
|
184
|
+
// Step 7: Fetch new balance
|
|
185
|
+
const newState = await this.getVaultState();
|
|
186
|
+
return {
|
|
187
|
+
txHash,
|
|
188
|
+
amountUsdc: params.amountUsdc,
|
|
189
|
+
newBalanceUsdc: newState.balanceCents / 100,
|
|
190
|
+
timestamp: Date.now(),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
throw this.formatError('DEPOSIT_FAILED', error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Update vault risk parameters
|
|
199
|
+
*
|
|
200
|
+
* Allows programmatic adjustment of:
|
|
201
|
+
* - Max position size (in basis points)
|
|
202
|
+
* - Risk tolerance level
|
|
203
|
+
*
|
|
204
|
+
* Abstracts away:
|
|
205
|
+
* - Anchor instruction building
|
|
206
|
+
* - Fixed-point BPS math
|
|
207
|
+
* - Transaction signing
|
|
208
|
+
*
|
|
209
|
+
* @param limits - New risk limits
|
|
210
|
+
* @returns Confirmation and updated parameters
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* const response = await vault.setRiskLimits({
|
|
215
|
+
* maxPositionBps: 300, // Reduce to 3%
|
|
216
|
+
* riskLevel: 40,
|
|
217
|
+
* });
|
|
218
|
+
* console.log('Updated risk limit to:', response.maxPositionBps / 100, '%');
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
async setRiskLimits(limits) {
|
|
222
|
+
try {
|
|
223
|
+
this.log('Updating risk limits:', limits);
|
|
224
|
+
// Step 1: Validate BPS (0-10000)
|
|
225
|
+
if (limits.maxPositionBps < 0 || limits.maxPositionBps > 10000) {
|
|
226
|
+
throw new Error('maxPositionBps must be between 0 and 10000');
|
|
227
|
+
}
|
|
228
|
+
// Step 2: Validate risk level (0-100)
|
|
229
|
+
const riskLevel = limits.riskLevel || 50;
|
|
230
|
+
if (riskLevel < 0 || riskLevel > 100) {
|
|
231
|
+
throw new Error('riskLevel must be between 0 and 100');
|
|
232
|
+
}
|
|
233
|
+
// Step 3: Derive vault PDA
|
|
234
|
+
const vaultId = BigInt(0); // Use vault_id 0 (first vault)
|
|
235
|
+
const [vaultPda] = await web3_js_1.PublicKey.findProgramAddress([Buffer.from('vault'), this.userPublicKey.toBuffer(), Buffer.from(vaultId.toString())], this.programId);
|
|
236
|
+
// Step 4: Build transaction with update_risk_params instruction
|
|
237
|
+
const transaction = new web3_js_1.Transaction();
|
|
238
|
+
// Build instruction data for update_risk_params
|
|
239
|
+
// Args: max_position_size_bps (u16), risk_level (u8)
|
|
240
|
+
const discriminator = Buffer.from([
|
|
241
|
+
78, 169, 142, 234, 48, 181, 181, 142, // update_risk_params discriminator
|
|
242
|
+
]);
|
|
243
|
+
const argsBuffer = Buffer.alloc(3);
|
|
244
|
+
argsBuffer.writeUInt16LE(limits.maxPositionBps, 0);
|
|
245
|
+
argsBuffer.writeUInt8(riskLevel, 2);
|
|
246
|
+
const instructionData = Buffer.concat([discriminator, argsBuffer]);
|
|
247
|
+
const updateRiskIx = new web3_js_1.TransactionInstruction({
|
|
248
|
+
programId: this.programId,
|
|
249
|
+
keys: [
|
|
250
|
+
{ pubkey: vaultPda, isSigner: false, isWritable: true },
|
|
251
|
+
{ pubkey: this.userPublicKey, isSigner: true, isWritable: true },
|
|
252
|
+
],
|
|
253
|
+
data: instructionData,
|
|
254
|
+
});
|
|
255
|
+
transaction.add(updateRiskIx);
|
|
256
|
+
// Step 5: Sign and send
|
|
257
|
+
this.log('Sending update_risk_params transaction...');
|
|
258
|
+
const txHash = await this.sendAndConfirmTx(transaction);
|
|
259
|
+
this.log(`Risk limits updated: ${txHash}`);
|
|
260
|
+
return {
|
|
261
|
+
txHash,
|
|
262
|
+
maxPositionBps: limits.maxPositionBps,
|
|
263
|
+
riskLevel,
|
|
264
|
+
timestamp: Date.now(),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
throw this.formatError('RISK_UPDATE_FAILED', error);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Fetch current vault state from chain
|
|
273
|
+
*
|
|
274
|
+
* Returns:
|
|
275
|
+
* - Balance
|
|
276
|
+
* - Risk parameters
|
|
277
|
+
* - Activity status
|
|
278
|
+
* - Fee metrics
|
|
279
|
+
*
|
|
280
|
+
* @returns Current vault state
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```typescript
|
|
284
|
+
* const state = await vault.getVaultState();
|
|
285
|
+
* console.log('Balance:', state.balanceCents / 100, 'USDC');
|
|
286
|
+
* console.log('Max position:', state.maxPositionBps / 100, '%');
|
|
287
|
+
* ```
|
|
288
|
+
*/
|
|
289
|
+
async getVaultState() {
|
|
290
|
+
try {
|
|
291
|
+
this.log('Fetching vault state from chain');
|
|
292
|
+
// Derive vault PDA
|
|
293
|
+
const vaultId = BigInt(0); // Use vault_id 0 (first vault)
|
|
294
|
+
const [vaultPda] = await web3_js_1.PublicKey.findProgramAddress([Buffer.from('vault'), this.userPublicKey.toBuffer(), Buffer.from(vaultId.toString())], this.programId);
|
|
295
|
+
// Fetch vault account from chain
|
|
296
|
+
const accountInfo = await this.connection.getAccountInfo(vaultPda);
|
|
297
|
+
if (!accountInfo) {
|
|
298
|
+
throw new Error(`Vault not found at ${vaultPda.toString()}`);
|
|
299
|
+
}
|
|
300
|
+
// Parse account data
|
|
301
|
+
// NeuralVault struct layout:
|
|
302
|
+
// bump (u8) = 1 byte
|
|
303
|
+
// owner (Pubkey) = 32 bytes
|
|
304
|
+
// vault_id (u64) = 8 bytes
|
|
305
|
+
// usdc_mint (Pubkey) = 32 bytes
|
|
306
|
+
// token_account (Pubkey) = 32 bytes
|
|
307
|
+
// balance (u64) = 8 bytes
|
|
308
|
+
// total_delegated_volume (u64) = 8 bytes
|
|
309
|
+
// max_position_size_bps (u16) = 2 bytes
|
|
310
|
+
// risk_level (u8) = 1 byte
|
|
311
|
+
// status (u8) = 1 byte
|
|
312
|
+
// created_at (i64) = 8 bytes
|
|
313
|
+
// last_execution (i64) = 8 bytes
|
|
314
|
+
// protocol_fee_earned (u64) = 8 bytes
|
|
315
|
+
const data = accountInfo.data;
|
|
316
|
+
let offset = 8; // Skip discriminator (8 bytes)
|
|
317
|
+
const bump = data[offset];
|
|
318
|
+
offset += 1;
|
|
319
|
+
// Skip owner (32 bytes)
|
|
320
|
+
offset += 32;
|
|
321
|
+
// Skip vault_id (8 bytes)
|
|
322
|
+
offset += 8;
|
|
323
|
+
// Skip usdc_mint (32 bytes)
|
|
324
|
+
offset += 32;
|
|
325
|
+
// Skip token_account (32 bytes)
|
|
326
|
+
offset += 32;
|
|
327
|
+
// balance (u64)
|
|
328
|
+
const balanceCents = Number(this.readBigUInt64LE(data, offset));
|
|
329
|
+
offset += 8;
|
|
330
|
+
// Skip total_delegated_volume (8 bytes)
|
|
331
|
+
offset += 8;
|
|
332
|
+
// max_position_size_bps (u16)
|
|
333
|
+
const maxPositionBps = data.readUInt16LE(offset);
|
|
334
|
+
offset += 2;
|
|
335
|
+
// risk_level (u8)
|
|
336
|
+
const riskLevel = data[offset];
|
|
337
|
+
offset += 1;
|
|
338
|
+
// status (u8)
|
|
339
|
+
const status = data[offset];
|
|
340
|
+
const isActive = status === 1;
|
|
341
|
+
offset += 1;
|
|
342
|
+
// Skip created_at (8 bytes)
|
|
343
|
+
offset += 8;
|
|
344
|
+
// Skip last_execution (8 bytes)
|
|
345
|
+
offset += 8;
|
|
346
|
+
// protocol_fee_earned (u64)
|
|
347
|
+
const totalFeesCents = Number(this.readBigUInt64LE(data, offset));
|
|
348
|
+
this.log('Vault state fetched successfully');
|
|
349
|
+
return {
|
|
350
|
+
pubkey: vaultPda.toString(),
|
|
351
|
+
balanceCents,
|
|
352
|
+
maxPositionBps,
|
|
353
|
+
riskLevel,
|
|
354
|
+
isActive,
|
|
355
|
+
totalFeesCents,
|
|
356
|
+
lastUpdated: Date.now(),
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
throw this.formatError('FETCH_STATE_FAILED', error);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Withdraw USDC from vault
|
|
365
|
+
*
|
|
366
|
+
* @param amountUsdc - Amount to withdraw
|
|
367
|
+
* @returns Withdrawal confirmation
|
|
368
|
+
*/
|
|
369
|
+
async withdraw(amountUsdc) {
|
|
370
|
+
try {
|
|
371
|
+
this.log(`Withdrawing ${amountUsdc} USDC from vault`);
|
|
372
|
+
// Step 1: Validate amount
|
|
373
|
+
const vaultState = await this.getVaultState();
|
|
374
|
+
if (amountUsdc > vaultState.balanceCents / 100) {
|
|
375
|
+
throw new Error('Insufficient vault balance');
|
|
376
|
+
}
|
|
377
|
+
// Step 2: Derive PDAs
|
|
378
|
+
const vaultId = BigInt(0); // Use vault_id 0 (first vault)
|
|
379
|
+
const [vaultPda] = await web3_js_1.PublicKey.findProgramAddress([Buffer.from('vault'), this.userPublicKey.toBuffer(), Buffer.from(vaultId.toString())], this.programId);
|
|
380
|
+
const vaultTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(this.USDC_MINT, vaultPda, true);
|
|
381
|
+
const userTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(this.USDC_MINT, this.userPublicKey);
|
|
382
|
+
// Step 3: Build transaction
|
|
383
|
+
const amountCents = BigInt(Math.round(amountUsdc * 100));
|
|
384
|
+
const transaction = new web3_js_1.Transaction();
|
|
385
|
+
// Build instruction data for withdraw_usdc
|
|
386
|
+
// Args: amount (u64)
|
|
387
|
+
const discriminator = Buffer.from([
|
|
388
|
+
144, 156, 121, 240, 155, 115, 184, 189, // withdraw_usdc discriminator
|
|
389
|
+
]);
|
|
390
|
+
const argsBuffer = Buffer.alloc(8);
|
|
391
|
+
argsBuffer.writeBigUInt64LE(amountCents, 0);
|
|
392
|
+
const instructionData = Buffer.concat([discriminator, argsBuffer]);
|
|
393
|
+
const withdrawIx = new web3_js_1.TransactionInstruction({
|
|
394
|
+
programId: this.programId,
|
|
395
|
+
keys: [
|
|
396
|
+
{ pubkey: vaultPda, isSigner: false, isWritable: true },
|
|
397
|
+
{ pubkey: vaultTokenAccount, isSigner: false, isWritable: true },
|
|
398
|
+
{ pubkey: userTokenAccount, isSigner: false, isWritable: true },
|
|
399
|
+
{ pubkey: this.userPublicKey, isSigner: true, isWritable: false },
|
|
400
|
+
{ pubkey: spl_token_1.TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
|
401
|
+
],
|
|
402
|
+
data: instructionData,
|
|
403
|
+
});
|
|
404
|
+
transaction.add(withdrawIx);
|
|
405
|
+
// Step 4: Sign and send
|
|
406
|
+
this.log('Sending withdraw_usdc transaction...');
|
|
407
|
+
const txHash = await this.sendAndConfirmTx(transaction);
|
|
408
|
+
this.log(`Withdrawal confirmed: ${txHash}`);
|
|
409
|
+
// Step 5: Fetch updated balance
|
|
410
|
+
const newState = await this.getVaultState();
|
|
411
|
+
return {
|
|
412
|
+
txHash,
|
|
413
|
+
amountUsdc,
|
|
414
|
+
newBalanceUsdc: newState.balanceCents / 100,
|
|
415
|
+
timestamp: Date.now(),
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
throw this.formatError('WITHDRAW_FAILED', error);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Send and confirm transaction (supports both keypair and wallet adapter)
|
|
424
|
+
*
|
|
425
|
+
* @private
|
|
426
|
+
*/
|
|
427
|
+
async sendAndConfirmTx(transaction) {
|
|
428
|
+
if (this.keypair) {
|
|
429
|
+
// Backend mode: Use keypair signing
|
|
430
|
+
const txHash = await this.sendAndConfirmTx(transaction);
|
|
431
|
+
return txHash;
|
|
432
|
+
}
|
|
433
|
+
else if (this.signTransaction) {
|
|
434
|
+
// Frontend mode: Use wallet adapter signing (non-custodial)
|
|
435
|
+
try {
|
|
436
|
+
// Sign transaction with wallet adapter
|
|
437
|
+
const signedTx = await this.signTransaction(transaction);
|
|
438
|
+
// Serialize and send
|
|
439
|
+
const serialized = signedTx.serialize();
|
|
440
|
+
const txHash = await this.connection.sendRawTransaction(serialized, {
|
|
441
|
+
skipPreflight: false,
|
|
442
|
+
maxRetries: 5,
|
|
443
|
+
});
|
|
444
|
+
// Wait for confirmation
|
|
445
|
+
await this.connection.confirmTransaction(txHash, 'confirmed');
|
|
446
|
+
return txHash;
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
throw new Error(`Transaction signing failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
throw new Error('No signer available');
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Read BigUInt64LE from buffer (for u64 fields)
|
|
458
|
+
*
|
|
459
|
+
* @private
|
|
460
|
+
*/
|
|
461
|
+
readBigUInt64LE(buffer, offset) {
|
|
462
|
+
const lo = buffer.readUInt32LE(offset);
|
|
463
|
+
const hi = buffer.readUInt32LE(offset + 4);
|
|
464
|
+
return (BigInt(hi) << BigInt(32)) | BigInt(lo);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Build instruction data for initialize_vault
|
|
468
|
+
*
|
|
469
|
+
* @private
|
|
470
|
+
*/
|
|
471
|
+
buildInitializeVaultIx(vaultId, maxPositionBps, riskLevel, usdcMint) {
|
|
472
|
+
// Discriminator for initialize_vault (first 8 bytes)
|
|
473
|
+
// This matches the Anchor IDL discriminator
|
|
474
|
+
const discriminator = Buffer.from([
|
|
475
|
+
111, 17, 185, 250, 60, 122, 38, 254, // initialize_vault discriminator
|
|
476
|
+
]);
|
|
477
|
+
// Build argument buffer
|
|
478
|
+
const args = Buffer.alloc(40); // 8 (vault_id u64) + 2 (maxPositionBps u16) + 1 (riskLevel u8) + 32 (Pubkey)
|
|
479
|
+
let offset = 0;
|
|
480
|
+
// vault_id (u64 little-endian)
|
|
481
|
+
args.writeBigUInt64LE(vaultId, offset);
|
|
482
|
+
offset += 8;
|
|
483
|
+
// max_position_size_bps (u16 little-endian)
|
|
484
|
+
args.writeUInt16LE(maxPositionBps, offset);
|
|
485
|
+
offset += 2;
|
|
486
|
+
// risk_level (u8)
|
|
487
|
+
args.writeUInt8(riskLevel, offset);
|
|
488
|
+
offset += 1;
|
|
489
|
+
// usdc_mint (Pubkey 32 bytes)
|
|
490
|
+
usdcMint.toBuffer().copy(args, offset);
|
|
491
|
+
// Combine discriminator + args
|
|
492
|
+
return Buffer.concat([discriminator, args]);
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Get sysvar rent address
|
|
496
|
+
*
|
|
497
|
+
* @private
|
|
498
|
+
*/
|
|
499
|
+
getSysvarRent() {
|
|
500
|
+
return new web3_js_1.PublicKey('SysvarRent111111111111111111111111111111111');
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Format errors with context and consistency
|
|
504
|
+
*
|
|
505
|
+
* @private
|
|
506
|
+
*/
|
|
507
|
+
formatError(code, error) {
|
|
508
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
509
|
+
return new Error(`[VaultClient] ${code}: ${message}`);
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Logging utility
|
|
513
|
+
*
|
|
514
|
+
* @private
|
|
515
|
+
*/
|
|
516
|
+
log(message, data) {
|
|
517
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
518
|
+
if (data) {
|
|
519
|
+
console.log(`[VaultClient] ${message}`, data);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
console.log(`[VaultClient] ${message}`);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
exports.VaultClient = VaultClient;
|
|
528
|
+
exports.default = VaultClient;
|
|
529
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/clients/vault.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ============ ORACULO_V2_MARKET SDK: MAIN ENTRY POINT ============
|
|
3
|
+
*
|
|
4
|
+
* Official TypeScript SDK for Sentinely V2
|
|
5
|
+
* Abstracts complex Solana/Anchor/MPP details behind clean DX
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { SentinelySDK } from '@sentinely/sdk';
|
|
10
|
+
*
|
|
11
|
+
* const sdk = new SentinelySDK({
|
|
12
|
+
* rpcUrl: 'https://devnet.helius-rpc.com/?api-key=YOUR_KEY',
|
|
13
|
+
* keypair: { publicKey: Uint8Array, secretKey: Uint8Array },
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* // Institutional vault
|
|
17
|
+
* await sdk.vault.initializeVault({ maxPositionBps: 500 });
|
|
18
|
+
* await sdk.vault.deposit({ amountUsdc: 10000 });
|
|
19
|
+
* const state = await sdk.vault.getVaultState();
|
|
20
|
+
*
|
|
21
|
+
* // AI predictions with invisible MPP payments
|
|
22
|
+
* const signal = await sdk.oracle.queryKalshiSignal({
|
|
23
|
+
* marketTicker: 'FED_RATES_MAR26',
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* // Immutable audit trails
|
|
27
|
+
* const reasoning = await sdk.compliance.getTradeReasoning(txHash);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
import VaultClient from './clients/vault';
|
|
31
|
+
import OracleClient from './clients/oracle';
|
|
32
|
+
import ComplianceClient from './clients/compliance';
|
|
33
|
+
import type { SentinelyConfig } from './types';
|
|
34
|
+
export { VaultClient, OracleClient, ComplianceClient, };
|
|
35
|
+
export type { SentinelyConfig, VaultInitParams, RiskLimits, DepositParams, KalshiSignalQuery, KalshiSignal, TradeReasoning, VaultState, PaymentStatus, SentinelyError, DepositResponse, RiskUpdateResponse, VaultInitResponse, } from './types';
|
|
36
|
+
/**
|
|
37
|
+
* Main SDK class combining all three clients
|
|
38
|
+
*
|
|
39
|
+
* Provides unified interface for:
|
|
40
|
+
* 1. Vault management (deposits, risk limits)
|
|
41
|
+
* 2. Oracle queries (Kalshi predictions)
|
|
42
|
+
* 3. Compliance audits (Irys reasoning)
|
|
43
|
+
*/
|
|
44
|
+
export declare class SentinelySDK {
|
|
45
|
+
/** Vault operations (deposits, risk management) */
|
|
46
|
+
vault: VaultClient;
|
|
47
|
+
/** Oracle operations (Kalshi signals with MPP payments) */
|
|
48
|
+
oracle: OracleClient;
|
|
49
|
+
/** Compliance operations (immutable audit trails) */
|
|
50
|
+
compliance: ComplianceClient;
|
|
51
|
+
/**
|
|
52
|
+
* Initialize the Sentinely SDK
|
|
53
|
+
*
|
|
54
|
+
* @param config - Configuration with RPC, keypair, and program ID
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```typescript
|
|
58
|
+
* const sdk = new SentinelySDK({
|
|
59
|
+
* rpcUrl: 'https://devnet.helius-rpc.com',
|
|
60
|
+
* keypair: {
|
|
61
|
+
* publicKey: new Uint8Array([...]),
|
|
62
|
+
* secretKey: new Uint8Array([...]),
|
|
63
|
+
* },
|
|
64
|
+
* programId: 'A7FnyNVtkcRMEkhaBjgtKZ1Z7Mh4N9XLBN8AGneXNK2F',
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
constructor(config: SentinelyConfig);
|
|
69
|
+
/**
|
|
70
|
+
* Health check: Verify all clients are properly initialized
|
|
71
|
+
*
|
|
72
|
+
* @returns Whether SDK is ready
|
|
73
|
+
*/
|
|
74
|
+
isHealthy(): Promise<boolean>;
|
|
75
|
+
/**
|
|
76
|
+
* Get SDK version
|
|
77
|
+
*/
|
|
78
|
+
static get version(): string;
|
|
79
|
+
}
|
|
80
|
+
export default SentinelySDK;
|
|
81
|
+
/**
|
|
82
|
+
* Create SDK instance with minimal config
|
|
83
|
+
* (utility function for quick initialization)
|
|
84
|
+
*/
|
|
85
|
+
export declare function createSDK(config: SentinelyConfig): SentinelySDK;
|
|
86
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,CAAC;AAEF,YAAY,EACV,eAAe,EACf,eAAe,EACf,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,mDAAmD;IAC5C,KAAK,EAAE,WAAW,CAAC;IAE1B,2DAA2D;IACpD,MAAM,EAAE,YAAY,CAAC;IAE5B,qDAAqD;IAC9C,UAAU,EAAE,gBAAgB,CAAC;IAEpC;;;;;;;;;;;;;;;;OAgBG;gBACS,MAAM,EAAE,eAAe;IAMnC;;;;OAIG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAUnC;;OAEG;IACH,MAAM,KAAK,OAAO,IAAI,MAAM,CAE3B;CACF;AAGD,eAAe,YAAY,CAAC;AAE5B;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CAE/D"}
|