@pooflabs/server 0.0.14 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/providers/offchain-auth-provider.d.ts +11 -3
- package/dist/auth/providers/solana-keypair-provider.d.ts +21 -0
- package/dist/global.d.ts +0 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +154 -47
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +145 -49
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { AuthProvider } from '@pooflabs/core';
|
|
2
2
|
import { Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
3
3
|
/**
|
|
4
|
-
* Server-side OffchainAuthProvider wrapper
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Server-side OffchainAuthProvider wrapper for the poofnet environment.
|
|
5
|
+
*
|
|
6
|
+
* For signMessage, this generates a mock signature using SHA-256 hashing.
|
|
7
|
+
* This is used for offchain transaction signing.
|
|
7
8
|
*/
|
|
8
9
|
export declare class OffchainAuthProvider implements AuthProvider {
|
|
9
10
|
private wrappedProvider;
|
|
@@ -13,6 +14,13 @@ export declare class OffchainAuthProvider implements AuthProvider {
|
|
|
13
14
|
restoreSession(): Promise<any>;
|
|
14
15
|
getNativeMethods(): Promise<any>;
|
|
15
16
|
signMessage(message: string): Promise<string>;
|
|
17
|
+
signMessageMock(message: string): Promise<string>;
|
|
16
18
|
signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction>;
|
|
19
|
+
/**
|
|
20
|
+
* Sign and submit transaction - not supported in poofnet environment.
|
|
21
|
+
* See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)
|
|
22
|
+
* for the full implementation with blockhash handling and feePayer support.
|
|
23
|
+
*/
|
|
24
|
+
signAndSubmitTransaction(_transaction: Transaction | VersionedTransaction, _feePayer?: any): Promise<string>;
|
|
17
25
|
runTransaction(evmTransactionData?: any, solTransactionData?: any, options?: any): Promise<any>;
|
|
18
26
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Keypair, Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
2
|
+
import * as anchor from '@coral-xyz/anchor';
|
|
2
3
|
import type { AuthProvider, EVMTransaction, SolTransaction, TransactionResult, User, SetOptions } from '@pooflabs/core';
|
|
3
4
|
export declare class SolanaKeypairProvider implements AuthProvider {
|
|
4
5
|
private readonly networkUrl;
|
|
@@ -9,6 +10,26 @@ export declare class SolanaKeypairProvider implements AuthProvider {
|
|
|
9
10
|
logout(): Promise<void>;
|
|
10
11
|
signMessage(message: string): Promise<string>;
|
|
11
12
|
signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction>;
|
|
13
|
+
/**
|
|
14
|
+
* Signs and submits a Solana transaction to the network.
|
|
15
|
+
*
|
|
16
|
+
* This method handles blockhash and transaction confirmation automatically - you do NOT need to
|
|
17
|
+
* set recentBlockhash or lastValidBlockHeight on the transaction before calling this method.
|
|
18
|
+
* The network/RPC URL is derived from the provider's configuration (set during initialization).
|
|
19
|
+
*
|
|
20
|
+
* @param transaction - The transaction to sign and submit (Transaction or VersionedTransaction)
|
|
21
|
+
* @param feePayer - Optional fee payer public key. If not provided and the transaction doesn't
|
|
22
|
+
* already have a feePayer set, the keypair's public key will be used.
|
|
23
|
+
* Useful for co-signing scenarios where a different account pays the fees.
|
|
24
|
+
* @returns The transaction signature
|
|
25
|
+
*/
|
|
26
|
+
signAndSubmitTransaction(transaction: Transaction | VersionedTransaction, feePayer?: anchor.web3.PublicKey): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Submits a signed transaction and waits for confirmation using polling.
|
|
29
|
+
* Shared by both signAndSubmitTransaction and runTransactionInner.
|
|
30
|
+
*/
|
|
31
|
+
private submitAndConfirmTransaction;
|
|
32
|
+
private getRpcUrl;
|
|
12
33
|
runTransaction(_evm?: EVMTransaction, sol?: SolTransaction, opts?: SetOptions): Promise<TransactionResult>;
|
|
13
34
|
private runTransactionInner;
|
|
14
35
|
getNativeMethods(): Promise<{
|
package/dist/global.d.ts
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
1
|
import { ClientConfig } from '@pooflabs/core';
|
|
2
|
-
import { Transaction, VersionedTransaction } from '@solana/web3.js';
|
|
3
2
|
export declare function init(newConfig: Partial<ClientConfig>): Promise<void>;
|
|
4
|
-
export declare function signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { init
|
|
1
|
+
export { init } from "./global";
|
|
2
2
|
export { getConfig } from '@pooflabs/core';
|
|
3
3
|
export { getAuthProvider } from './auth';
|
|
4
|
-
export { get, set, setMany, setFile, getFiles, runQuery, runQueryMany, runExpression, runExpressionMany } from '@pooflabs/core';
|
|
4
|
+
export { get, set, setMany, setFile, getFiles, runQuery, runQueryMany, runExpression, runExpressionMany, signMessage, signTransaction, signAndSubmitTransaction } from '@pooflabs/core';
|
|
5
5
|
export { subscribe } from '@pooflabs/core';
|
|
6
6
|
export * from '@pooflabs/core';
|
|
7
7
|
export { getIdToken } from './utils';
|
package/dist/index.js
CHANGED
|
@@ -106,14 +106,110 @@ class SolanaKeypairProvider {
|
|
|
106
106
|
* Sign transaction
|
|
107
107
|
* ----------------------------------------------------------- */
|
|
108
108
|
async signTransaction(transaction) {
|
|
109
|
-
|
|
109
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
110
|
+
const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in transaction.message);
|
|
111
|
+
if (isLegacyTransaction) {
|
|
110
112
|
transaction.partialSign(this.keypair);
|
|
111
113
|
}
|
|
112
|
-
else
|
|
114
|
+
else {
|
|
113
115
|
transaction.sign([this.keypair]);
|
|
114
116
|
}
|
|
115
117
|
return transaction;
|
|
116
118
|
}
|
|
119
|
+
/**
|
|
120
|
+
* Signs and submits a Solana transaction to the network.
|
|
121
|
+
*
|
|
122
|
+
* This method handles blockhash and transaction confirmation automatically - you do NOT need to
|
|
123
|
+
* set recentBlockhash or lastValidBlockHeight on the transaction before calling this method.
|
|
124
|
+
* The network/RPC URL is derived from the provider's configuration (set during initialization).
|
|
125
|
+
*
|
|
126
|
+
* @param transaction - The transaction to sign and submit (Transaction or VersionedTransaction)
|
|
127
|
+
* @param feePayer - Optional fee payer public key. If not provided and the transaction doesn't
|
|
128
|
+
* already have a feePayer set, the keypair's public key will be used.
|
|
129
|
+
* Useful for co-signing scenarios where a different account pays the fees.
|
|
130
|
+
* @returns The transaction signature
|
|
131
|
+
*/
|
|
132
|
+
async signAndSubmitTransaction(transaction, feePayer) {
|
|
133
|
+
// 1. Get RPC URL and create connection
|
|
134
|
+
const rpcUrl = this.getRpcUrl();
|
|
135
|
+
const connection = new web3_js.Connection(rpcUrl, 'confirmed');
|
|
136
|
+
// 2. Get fresh blockhash and set it on the transaction before signing
|
|
137
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed');
|
|
138
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
139
|
+
const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in transaction.message);
|
|
140
|
+
if (isLegacyTransaction) {
|
|
141
|
+
const legacyTx = transaction;
|
|
142
|
+
legacyTx.recentBlockhash = blockhash;
|
|
143
|
+
legacyTx.lastValidBlockHeight = lastValidBlockHeight;
|
|
144
|
+
// Set feePayer if not already set
|
|
145
|
+
if (!legacyTx.feePayer) {
|
|
146
|
+
legacyTx.feePayer = feePayer !== null && feePayer !== void 0 ? feePayer : this.keypair.publicKey;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// VersionedTransaction
|
|
151
|
+
const versionedTx = transaction;
|
|
152
|
+
versionedTx.message.recentBlockhash = blockhash;
|
|
153
|
+
// Note: VersionedTransaction feePayer is set in the message at creation time
|
|
154
|
+
// and cannot be modified after creation
|
|
155
|
+
}
|
|
156
|
+
// 3. Sign the transaction
|
|
157
|
+
const signedTx = await this.signTransaction(transaction);
|
|
158
|
+
// 4. Submit and confirm using shared helper
|
|
159
|
+
const { signature } = await this.submitAndConfirmTransaction(signedTx, connection);
|
|
160
|
+
return signature;
|
|
161
|
+
}
|
|
162
|
+
/* ----------------------------------------------------------- *
|
|
163
|
+
* Private Helpers
|
|
164
|
+
* ----------------------------------------------------------- */
|
|
165
|
+
/**
|
|
166
|
+
* Submits a signed transaction and waits for confirmation using polling.
|
|
167
|
+
* Shared by both signAndSubmitTransaction and runTransactionInner.
|
|
168
|
+
*/
|
|
169
|
+
async submitAndConfirmTransaction(signedTx, connection, options) {
|
|
170
|
+
var _a;
|
|
171
|
+
const sig = await connection.sendRawTransaction(signedTx.serialize(), {
|
|
172
|
+
preflightCommitment: 'confirmed'
|
|
173
|
+
});
|
|
174
|
+
// Wait for confirmation using polling
|
|
175
|
+
const startTime = Date.now();
|
|
176
|
+
const timeoutMs = 10 * 1000; // 10 seconds
|
|
177
|
+
while (true) {
|
|
178
|
+
const st = await connection.getSignatureStatus(sig);
|
|
179
|
+
if (((_a = st === null || st === void 0 ? void 0 : st.value) === null || _a === void 0 ? void 0 : _a.confirmationStatus) === 'confirmed') {
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
// Check if we've exceeded the timeout
|
|
183
|
+
if (Date.now() - startTime > timeoutMs) {
|
|
184
|
+
throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);
|
|
185
|
+
}
|
|
186
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
187
|
+
}
|
|
188
|
+
// Optionally fetch transaction info
|
|
189
|
+
let txInfo = null;
|
|
190
|
+
if (options === null || options === void 0 ? void 0 : options.fetchTxInfo) {
|
|
191
|
+
txInfo = await connection.getTransaction(sig, {
|
|
192
|
+
maxSupportedTransactionVersion: 0,
|
|
193
|
+
commitment: 'confirmed'
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return { signature: sig, txInfo };
|
|
197
|
+
}
|
|
198
|
+
getRpcUrl(network) {
|
|
199
|
+
if (this.networkUrl) {
|
|
200
|
+
return this.networkUrl;
|
|
201
|
+
}
|
|
202
|
+
if (network === 'solana_devnet') {
|
|
203
|
+
return SOLANA_DEVNET_RPC_URL;
|
|
204
|
+
}
|
|
205
|
+
else if (network === 'solana_mainnet') {
|
|
206
|
+
return SOLANA_MAINNET_RPC_URL;
|
|
207
|
+
}
|
|
208
|
+
else if (network === 'surfnet') {
|
|
209
|
+
return SURFNET_RPC_URL;
|
|
210
|
+
}
|
|
211
|
+
return SOLANA_MAINNET_RPC_URL; // default to mainnet
|
|
212
|
+
}
|
|
117
213
|
/* ----------------------------------------------------------- *
|
|
118
214
|
* Transaction runner
|
|
119
215
|
* ----------------------------------------------------------- */
|
|
@@ -121,22 +217,28 @@ class SolanaKeypairProvider {
|
|
|
121
217
|
if (!sol)
|
|
122
218
|
throw new Error('Solana transaction data required');
|
|
123
219
|
const kp = this.keypair;
|
|
220
|
+
// Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction
|
|
221
|
+
const isLegacyTx = (tx) => {
|
|
222
|
+
return 'recentBlockhash' in tx && !('message' in tx && 'staticAccountKeys' in tx.message);
|
|
223
|
+
};
|
|
124
224
|
const wallet = {
|
|
125
225
|
publicKey: kp.publicKey,
|
|
126
226
|
signTransaction: async (tx) => {
|
|
127
|
-
|
|
227
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
228
|
+
if (isLegacyTx(tx)) {
|
|
128
229
|
tx.partialSign(kp);
|
|
129
230
|
}
|
|
130
|
-
else
|
|
231
|
+
else {
|
|
131
232
|
tx.sign([kp]);
|
|
132
233
|
}
|
|
133
234
|
return tx;
|
|
134
235
|
},
|
|
135
236
|
signAllTransactions: async (txs) => txs.map((t) => {
|
|
136
|
-
|
|
237
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
238
|
+
if (isLegacyTx(t)) {
|
|
137
239
|
t.partialSign(kp);
|
|
138
240
|
}
|
|
139
|
-
else
|
|
241
|
+
else {
|
|
140
242
|
t.sign([kp]);
|
|
141
243
|
}
|
|
142
244
|
return t;
|
|
@@ -182,7 +284,7 @@ class SolanaKeypairProvider {
|
|
|
182
284
|
return toReturn;
|
|
183
285
|
}
|
|
184
286
|
async runTransactionInner(sol, opts, wallet, kp, deduped) {
|
|
185
|
-
var _a, _b, _c
|
|
287
|
+
var _a, _b, _c;
|
|
186
288
|
let rpcUrl = this.networkUrl;
|
|
187
289
|
if (this.networkUrl == null) {
|
|
188
290
|
if (sol.network === 'solana_devnet') {
|
|
@@ -206,14 +308,19 @@ class SolanaKeypairProvider {
|
|
|
206
308
|
delete_paths: sol.txArgs[0].deletePaths,
|
|
207
309
|
txData: sol.txArgs[0].txData
|
|
208
310
|
}, deduped, sol.lutKey, sol.preInstructions, false);
|
|
311
|
+
// Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction
|
|
312
|
+
const isLegacyTx = (t) => {
|
|
313
|
+
return 'recentBlockhash' in t && !('message' in t && 'staticAccountKeys' in t.message);
|
|
314
|
+
};
|
|
209
315
|
// Refresh blockhash and lastValidBlockHeight
|
|
210
|
-
|
|
316
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
317
|
+
if (isLegacyTx(tx)) {
|
|
211
318
|
tx.partialSign(kp);
|
|
212
319
|
tx.recentBlockhash = blockhash;
|
|
213
320
|
tx.lastValidBlockHeight = lastValidBlockHeight;
|
|
214
321
|
tx.feePayer = kp.publicKey;
|
|
215
322
|
}
|
|
216
|
-
else
|
|
323
|
+
else {
|
|
217
324
|
tx.sign([kp]);
|
|
218
325
|
tx.message.recentBlockhash = blockhash;
|
|
219
326
|
}
|
|
@@ -221,11 +328,12 @@ class SolanaKeypairProvider {
|
|
|
221
328
|
const rawUnsigned = tx.serialize({ requireAllSignatures: false });
|
|
222
329
|
const microLamports = await fetchPriorityFee(connection.rpcEndpoint, rawUnsigned);
|
|
223
330
|
if (microLamports != null) {
|
|
224
|
-
|
|
331
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
332
|
+
if (isLegacyTx(tx)) {
|
|
225
333
|
tx.instructions.unshift(web3_js.ComputeBudgetProgram.setComputeUnitPrice({ microLamports }));
|
|
226
334
|
tx.partialSign(kp);
|
|
227
335
|
}
|
|
228
|
-
else
|
|
336
|
+
else {
|
|
229
337
|
// Rebuild the transaction with the new priority fee
|
|
230
338
|
const roundTwo = await core.buildSetDocumentsTransaction(connection, sol.txArgs[0].idl, anchorProvider, kp.publicKey, {
|
|
231
339
|
app_id,
|
|
@@ -243,31 +351,13 @@ class SolanaKeypairProvider {
|
|
|
243
351
|
if ((opts === null || opts === void 0 ? void 0 : opts.shouldSubmitTx) === false) {
|
|
244
352
|
return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };
|
|
245
353
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
});
|
|
249
|
-
const startTime = Date.now();
|
|
250
|
-
const timeoutMs = 10 * 1000; // 10 seconds
|
|
251
|
-
while (true) {
|
|
252
|
-
const st = await connection.getSignatureStatus(sig);
|
|
253
|
-
if (((_a = st === null || st === void 0 ? void 0 : st.value) === null || _a === void 0 ? void 0 : _a.confirmationStatus) === 'confirmed') {
|
|
254
|
-
break;
|
|
255
|
-
}
|
|
256
|
-
// Check if we've exceeded the timeout
|
|
257
|
-
if (Date.now() - startTime > timeoutMs) {
|
|
258
|
-
throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);
|
|
259
|
-
}
|
|
260
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
261
|
-
}
|
|
262
|
-
const info = await connection.getTransaction(sig, {
|
|
263
|
-
maxSupportedTransactionVersion: 0,
|
|
264
|
-
commitment: 'confirmed'
|
|
265
|
-
});
|
|
354
|
+
// Submit and confirm using shared helper
|
|
355
|
+
const { signature, txInfo } = await this.submitAndConfirmTransaction(tx, connection, { fetchTxInfo: true });
|
|
266
356
|
return {
|
|
267
|
-
transactionSignature:
|
|
268
|
-
blockNumber: (
|
|
269
|
-
gasUsed: (
|
|
270
|
-
data:
|
|
357
|
+
transactionSignature: signature,
|
|
358
|
+
blockNumber: (_a = txInfo === null || txInfo === void 0 ? void 0 : txInfo.slot) !== null && _a !== void 0 ? _a : 0,
|
|
359
|
+
gasUsed: (_c = (_b = txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta) === null || _b === void 0 ? void 0 : _b.fee.toString()) !== null && _c !== void 0 ? _c : '0',
|
|
360
|
+
data: txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta,
|
|
271
361
|
};
|
|
272
362
|
}
|
|
273
363
|
/* ----------------------------------------------------------- */
|
|
@@ -277,9 +367,10 @@ class SolanaKeypairProvider {
|
|
|
277
367
|
}
|
|
278
368
|
|
|
279
369
|
/**
|
|
280
|
-
* Server-side OffchainAuthProvider wrapper
|
|
281
|
-
*
|
|
282
|
-
*
|
|
370
|
+
* Server-side OffchainAuthProvider wrapper for the poofnet environment.
|
|
371
|
+
*
|
|
372
|
+
* For signMessage, this generates a mock signature using SHA-256 hashing.
|
|
373
|
+
* This is used for offchain transaction signing.
|
|
283
374
|
*/
|
|
284
375
|
class OffchainAuthProvider {
|
|
285
376
|
constructor(wrappedProvider) {
|
|
@@ -298,15 +389,26 @@ class OffchainAuthProvider {
|
|
|
298
389
|
return this.wrappedProvider.getNativeMethods();
|
|
299
390
|
}
|
|
300
391
|
async signMessage(message) {
|
|
392
|
+
// Delegate to wrapped provider for real signing
|
|
393
|
+
return this.wrappedProvider.signMessage(message);
|
|
394
|
+
}
|
|
395
|
+
async signMessageMock(message) {
|
|
301
396
|
// Generate mock signature (SHA-256 hash of message, base64 encoded)
|
|
302
|
-
// This
|
|
303
|
-
// Server-side uses Node.js crypto module
|
|
397
|
+
// This is used for offchain transaction signing
|
|
304
398
|
const hash = crypto__namespace.createHash('sha256').update(message).digest('base64');
|
|
305
399
|
return hash;
|
|
306
400
|
}
|
|
307
401
|
async signTransaction(transaction) {
|
|
308
402
|
return this.wrappedProvider.signTransaction(transaction);
|
|
309
403
|
}
|
|
404
|
+
/**
|
|
405
|
+
* Sign and submit transaction - not supported in poofnet environment.
|
|
406
|
+
* See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)
|
|
407
|
+
* for the full implementation with blockhash handling and feePayer support.
|
|
408
|
+
*/
|
|
409
|
+
async signAndSubmitTransaction(_transaction, _feePayer) {
|
|
410
|
+
throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');
|
|
411
|
+
}
|
|
310
412
|
async runTransaction(evmTransactionData, solTransactionData, options) {
|
|
311
413
|
return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);
|
|
312
414
|
}
|
|
@@ -347,12 +449,6 @@ async function init(newConfig) {
|
|
|
347
449
|
// Update config with the wrapped provider
|
|
348
450
|
await core.init(Object.assign(Object.assign({}, newConfig), { authProvider: authProviderInstance, isServer: true, skipBackendInit: true }));
|
|
349
451
|
}
|
|
350
|
-
async function signTransaction(transaction) {
|
|
351
|
-
if (!authProviderInstance) {
|
|
352
|
-
throw new Error('Auth provider not initialized. Please call init() first.');
|
|
353
|
-
}
|
|
354
|
-
return await authProviderInstance.signTransaction(transaction);
|
|
355
|
-
}
|
|
356
452
|
|
|
357
453
|
// Wrapper for getIdToken - passes isServer=true for server-side usage
|
|
358
454
|
async function getIdToken() {
|
|
@@ -399,6 +495,18 @@ Object.defineProperty(exports, "setMany", {
|
|
|
399
495
|
enumerable: true,
|
|
400
496
|
get: function () { return core.setMany; }
|
|
401
497
|
});
|
|
498
|
+
Object.defineProperty(exports, "signAndSubmitTransaction", {
|
|
499
|
+
enumerable: true,
|
|
500
|
+
get: function () { return core.signAndSubmitTransaction; }
|
|
501
|
+
});
|
|
502
|
+
Object.defineProperty(exports, "signMessage", {
|
|
503
|
+
enumerable: true,
|
|
504
|
+
get: function () { return core.signMessage; }
|
|
505
|
+
});
|
|
506
|
+
Object.defineProperty(exports, "signTransaction", {
|
|
507
|
+
enumerable: true,
|
|
508
|
+
get: function () { return core.signTransaction; }
|
|
509
|
+
});
|
|
402
510
|
Object.defineProperty(exports, "subscribe", {
|
|
403
511
|
enumerable: true,
|
|
404
512
|
get: function () { return core.subscribe; }
|
|
@@ -406,7 +514,6 @@ Object.defineProperty(exports, "subscribe", {
|
|
|
406
514
|
exports.getAuthProvider = getAuthProvider;
|
|
407
515
|
exports.getIdToken = getIdToken;
|
|
408
516
|
exports.init = init;
|
|
409
|
-
exports.signTransaction = signTransaction;
|
|
410
517
|
Object.keys(core).forEach(function (k) {
|
|
411
518
|
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
412
519
|
enumerable: true,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/auth/providers/solana-keypair-provider.ts","../src/auth/providers/offchain-auth-provider.ts","../src/auth/index.ts","../src/global.ts","../src/utils.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport {\n ComputeBudgetProgram,\n Connection,\n Keypair,\n Transaction,\n VersionedTransaction\n} from '@solana/web3.js';\nimport * as anchor from '@coral-xyz/anchor';\nimport nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nimport type {\n AuthProvider,\n EVMTransaction,\n SolTransaction,\n TransactionResult,\n User,\n SetOptions,\n} from '@pooflabs/core';\n\nimport {\n convertRemainingAccounts,\n buildSetDocumentsTransaction,\n} from '@pooflabs/core';\nimport { SOLANA_DEVNET_RPC_URL, SOLANA_MAINNET_RPC_URL, SURFNET_RPC_URL } from '..';\n\n/* ------------------------------------------------------------- *\n * REQUIRED ENV-VAR\n * ------------------------------------------------------------- */\nconst ENV_VAR = 'TAROBASE_SOLANA_KEYPAIR'; // base-58 or JSON array\n\nfunction loadKeypairFromEnv(): Keypair {\n const secret = process?.env?.[ENV_VAR];\n if (!secret) {\n throw new Error(\n `Missing ${ENV_VAR}. Set it to a base58 secret key or JSON array.`,\n );\n }\n\n try {\n const secretKey = secret.trim().startsWith('[')\n ? Uint8Array.from(JSON.parse(secret))\n : bs58.decode(secret.trim());\n\n return Keypair.fromSecretKey(secretKey);\n } catch (err) {\n throw new Error(\n `Unable to parse ${ENV_VAR}. Ensure it is valid base58 or a JSON array.`,\n );\n }\n}\n\n/* ──────────────────────────────────────────────────────────\n * Helper – fetch getPriorityFeeEstimate\n * ──────────────────────────────────────────────────────── */\nasync function fetchPriorityFee(rpcEndpoint: string, rawUnsignedTxBuffer: Uint8Array) {\n try {\n const res = await fetch(rpcEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: \"1\",\n method: \"getPriorityFeeEstimate\",\n params: [{\n transaction: bs58.encode(rawUnsignedTxBuffer), options: {\n recommended: true\n }\n }]\n })\n });\n const data = await res.json() as { result: { priorityFeeEstimate: number } };\n const fee = data?.result?.priorityFeeEstimate ?? null;\n console.log(\"Got fee from Helius\", fee);\n if (fee != null && fee > 0) {\n return Math.ceil(Number(fee) * 1.2);\n } else {\n console.log(\"No fee from Helius, using default 10000\");\n return Math.ceil(10000 * 1.2);\n }\n } catch (err) {\n console.warn(\"Priority‑fee estimate failed:\", err);\n return Math.ceil(10000 * 1.2);\n }\n}\n\nexport class SolanaKeypairProvider implements AuthProvider {\n private readonly keypair: Keypair;\n\n constructor(\n private readonly networkUrl: string | null = null,\n ) {\n this.keypair = loadKeypairFromEnv();\n }\n\n /* ----------------------------------------------------------- *\n * (Auth stubs – fill in later if needed)\n * ----------------------------------------------------------- */\n async login(): Promise<User | null> { throw new Error('Not implemented'); }\n async restoreSession(): Promise<User | null> { throw new Error('Not implemented'); }\n async logout(): Promise<void> { throw new Error('Not implemented'); }\n\n /* ----------------------------------------------------------- *\n * Sign arbitrary message\n * ----------------------------------------------------------- */\n async signMessage(message: string): Promise<string> {\n const sig = nacl.sign.detached(\n new TextEncoder().encode(message),\n this.keypair.secretKey,\n );\n return Buffer.from(sig).toString('base64');\n }\n\n /* ----------------------------------------------------------- *\n * Sign transaction\n * ----------------------------------------------------------- */\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n if (transaction instanceof Transaction) {\n transaction.partialSign(this.keypair);\n } else if (transaction instanceof VersionedTransaction) {\n transaction.sign([this.keypair]);\n }\n return transaction;\n }\n\n /* ----------------------------------------------------------- *\n * Transaction runner\n * ----------------------------------------------------------- */\n async runTransaction(\n _evm?: EVMTransaction,\n sol?: SolTransaction,\n opts?: SetOptions,\n ): Promise<TransactionResult> {\n if (!sol) throw new Error('Solana transaction data required');\n\n const kp = this.keypair;\n\n const wallet: anchor.Wallet = {\n publicKey: kp.publicKey,\n signTransaction: async (tx: Transaction | VersionedTransaction) => {\n if (tx instanceof Transaction) {\n tx.partialSign(kp);\n } else if (tx instanceof VersionedTransaction) {\n tx.sign([kp]);\n }\n return tx;\n },\n signAllTransactions: async (txs: (Transaction | VersionedTransaction)[]) =>\n txs.map((t) => {\n if (t instanceof Transaction) {\n t.partialSign(kp);\n } else if (t instanceof VersionedTransaction) {\n t.sign([kp]);\n }\n return t;\n }),\n } as unknown as anchor.Wallet;\n\n /* de-dupe remaining accounts */\n const deduped = (() => {\n const fin: ReturnType<typeof convertRemainingAccounts> = [];\n for (const acc of convertRemainingAccounts(\n sol.txArgs[0].remainingAccounts,\n )) {\n const ex = fin.find((x) => x.pubkey.equals(acc.pubkey));\n if (ex) {\n ex.isSigner ||= acc.isSigner;\n ex.isWritable ||= acc.isWritable;\n } else fin.push(acc);\n }\n return fin;\n })();\n\n let retries = 0;\n let didPass = false;\n let delay = 1000;\n let toReturn: TransactionResult | null = null;\n let errorMessage = \"\";\n while (retries < 5) {\n try {\n toReturn = await this.runTransactionInner(sol, opts, wallet, kp, deduped);\n didPass = true;\n break;\n } catch (error: any) {\n console.log(\"Error building and sending transaction on retry:\", retries, error);\n await new Promise(resolve => setTimeout(resolve, delay));\n // Exponential backoff\n delay *= 1.5;\n retries++;\n errorMessage = error.message || JSON.stringify(error, null, 2);\n }\n }\n if (!didPass) {\n throw new Error(`Failed to send transaction after 5 retries: ${errorMessage}`);\n }\n return toReturn as TransactionResult;\n }\n\n private async runTransactionInner(sol: SolTransaction, opts: SetOptions | undefined, wallet: anchor.Wallet, kp: Keypair, deduped: ReturnType<typeof convertRemainingAccounts>): Promise<TransactionResult> {\n\n let rpcUrl = this.networkUrl;\n if(this.networkUrl == null) {\n if(sol.network === 'solana_devnet') {\n rpcUrl = SOLANA_DEVNET_RPC_URL;\n } else if(sol.network === 'solana_mainnet') {\n rpcUrl = SOLANA_MAINNET_RPC_URL;\n } else {\n rpcUrl = SURFNET_RPC_URL;\n }\n }\n const connection = new Connection(rpcUrl!, 'confirmed');\n \n const anchorProvider = new anchor.AnchorProvider(\n connection,\n wallet,\n anchor.AnchorProvider.defaultOptions(),\n );\n\n const app_id = sol.appId;\n if (!app_id) throw new Error('app_id missing');\n\n let { tx, blockhash, lastValidBlockHeight } = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n sol.preInstructions,\n false,\n );\n\n // Refresh blockhash and lastValidBlockHeight\n if (tx instanceof Transaction) {\n tx.partialSign(kp);\n tx.recentBlockhash = blockhash;\n tx.lastValidBlockHeight = lastValidBlockHeight;\n tx.feePayer = kp.publicKey;\n } else if (tx instanceof VersionedTransaction) {\n tx.sign([kp]);\n tx.message.recentBlockhash = blockhash;\n }\n\n // 3️⃣ Optional priority‑fee instruction\n\n const rawUnsigned = tx.serialize({ requireAllSignatures: false });\n const microLamports = await fetchPriorityFee(\n connection.rpcEndpoint,\n rawUnsigned\n );\n\n if (microLamports != null) {\n if (tx instanceof Transaction) {\n tx.instructions.unshift(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports })\n );\n tx.partialSign(kp);\n } else if (tx instanceof VersionedTransaction) {\n // Rebuild the transaction with the new priority fee\n const roundTwo = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n [ComputeBudgetProgram.setComputeUnitPrice({ microLamports }), ...sol.preInstructions],\n false,\n );\n tx = roundTwo.tx as VersionedTransaction;\n blockhash = roundTwo.blockhash;\n lastValidBlockHeight = roundTwo.lastValidBlockHeight;\n tx.sign([kp]);\n tx.message.recentBlockhash = blockhash;\n }\n }\n\n if (opts?.shouldSubmitTx === false) {\n return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };\n }\n\n const sig = await connection.sendRawTransaction(tx.serialize(), {\n preflightCommitment: \"confirmed\",\n });\n\n const startTime = Date.now();\n const timeoutMs = 10 * 1000; // 10 seconds\n\n while (true) {\n const st = await connection.getSignatureStatus(sig);\n if (st?.value?.confirmationStatus === 'confirmed') {\n break;\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);\n }\n\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n\n const info = await connection.getTransaction(sig, {\n maxSupportedTransactionVersion: 0,\n commitment: 'confirmed'\n });\n\n return {\n transactionSignature: sig,\n blockNumber: info?.slot ?? 0,\n gasUsed: info?.meta?.fee.toString() ?? '0',\n data: info?.meta,\n };\n }\n\n /* ----------------------------------------------------------- */\n async getNativeMethods() {\n return { keypair: this.keypair };\n }\n}\n","import { AuthProvider } from '@pooflabs/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport * as crypto from 'crypto';\n\n/**\n * Server-side OffchainAuthProvider wrapper that generates mock signatures\n * for offchain transactions using SHA-256 hashing\n * Uses Node.js crypto module for server-side execution\n */\nexport class OffchainAuthProvider implements AuthProvider {\n private wrappedProvider: AuthProvider;\n\n constructor(wrappedProvider: AuthProvider) {\n this.wrappedProvider = wrappedProvider;\n }\n\n async login(): Promise<any> {\n return this.wrappedProvider.login();\n }\n\n async logout(): Promise<void> {\n return this.wrappedProvider.logout();\n }\n\n async restoreSession(): Promise<any> {\n return this.wrappedProvider.restoreSession();\n }\n\n async getNativeMethods(): Promise<any> {\n return this.wrappedProvider.getNativeMethods();\n }\n\n async signMessage(message: string): Promise<string> {\n // Generate mock signature (SHA-256 hash of message, base64 encoded)\n // This matches the client-side OffchainAuthProvider behavior\n // Server-side uses Node.js crypto module\n const hash = crypto.createHash('sha256').update(message).digest('base64');\n return hash;\n }\n\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n return (this.wrappedProvider as any).signTransaction(transaction);\n }\n\n async runTransaction(evmTransactionData?: any, solTransactionData?: any, options?: any): Promise<any> {\n return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);\n }\n}\n\n","import { getConfig } from '@pooflabs/core';\nimport { AuthProvider } from '@pooflabs/core';\nimport { SolanaKeypairProvider } from './providers/solana-keypair-provider';\nimport { OffchainAuthProvider } from './providers/offchain-auth-provider';\n\nlet currentAuthProvider: AuthProvider | null = null;\n\nexport const SOLANA_DEVNET_RPC_URL = \"https://idelle-8nxsep-fast-devnet.helius-rpc.com\";\nexport const SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nexport const SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function getAuthProvider(): Promise<AuthProvider> {\n const config = await getConfig();\n\n if (currentAuthProvider) {\n // If provider exists but chain is \"offchain\" and it's not already wrapped, rewrap it\n if (config.chain === \"offchain\" && !(currentAuthProvider instanceof OffchainAuthProvider)) {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n return currentAuthProvider;\n }\n\n currentAuthProvider = await matchAuthProvider(config.rpcUrl ?? null);\n \n // Wrap with OffchainAuthProvider for offchain chain\n if (config.chain === \"offchain\") {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n\n return currentAuthProvider;\n}\n\nexport async function matchAuthProvider(rpcUrl: string | null): Promise<AuthProvider> {\n return new SolanaKeypairProvider(rpcUrl);\n}","import { AuthProvider } from '@pooflabs/core';\nimport { getAuthProvider } from './auth';\nimport { init as configInit, ClientConfig } from '@pooflabs/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\n\nlet authProviderInstance: AuthProvider | null = null;\n\nconst SOLANA_DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nconst SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nconst SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function init(newConfig: Partial<ClientConfig>): Promise<void> {\n // Initialize config first so getAuthProvider can access it\n // Server-side skips backend init since it already has all needed config\n await configInit({ ...newConfig, isServer: true, skipBackendInit: true });\n\n // Get the auth provider (which will wrap it if chain is \"offchain\")\n authProviderInstance = await getAuthProvider();\n\n // Update config with the wrapped provider\n await configInit({ ...newConfig, authProvider: authProviderInstance, isServer: true, skipBackendInit: true });\n}\n\nexport async function signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n if (!authProviderInstance) {\n throw new Error('Auth provider not initialized. Please call init() first.');\n }\n return await (authProviderInstance as any).signTransaction(transaction);\n}","import { getIdToken as getIdTokenCore } from '@pooflabs/core';\n\n// Wrapper for getIdToken - passes isServer=true for server-side usage\nexport async function getIdToken(): Promise<string | null> {\n return getIdTokenCore(true);\n}\n"],"names":["Keypair","Buffer","Transaction","VersionedTransaction","convertRemainingAccounts","Connection","anchor","buildSetDocumentsTransaction","ComputeBudgetProgram","crypto","getConfig","configInit","getIdTokenCore"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/auth/providers/solana-keypair-provider.ts","../src/auth/providers/offchain-auth-provider.ts","../src/auth/index.ts","../src/global.ts","../src/utils.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport {\n ComputeBudgetProgram,\n Connection,\n Keypair,\n Transaction,\n VersionedTransaction,\n VersionedTransactionResponse\n} from '@solana/web3.js';\nimport * as anchor from '@coral-xyz/anchor';\nimport nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nimport type {\n AuthProvider,\n EVMTransaction,\n SolTransaction,\n TransactionResult,\n User,\n SetOptions,\n} from '@pooflabs/core';\n\nimport {\n convertRemainingAccounts,\n buildSetDocumentsTransaction,\n} from '@pooflabs/core';\nimport { SOLANA_DEVNET_RPC_URL, SOLANA_MAINNET_RPC_URL, SURFNET_RPC_URL } from '..';\n\n/* ------------------------------------------------------------- *\n * REQUIRED ENV-VAR\n * ------------------------------------------------------------- */\nconst ENV_VAR = 'TAROBASE_SOLANA_KEYPAIR'; // base-58 or JSON array\n\nfunction loadKeypairFromEnv(): Keypair {\n const secret = process?.env?.[ENV_VAR];\n if (!secret) {\n throw new Error(\n `Missing ${ENV_VAR}. Set it to a base58 secret key or JSON array.`,\n );\n }\n\n try {\n const secretKey = secret.trim().startsWith('[')\n ? Uint8Array.from(JSON.parse(secret))\n : bs58.decode(secret.trim());\n\n return Keypair.fromSecretKey(secretKey);\n } catch (err) {\n throw new Error(\n `Unable to parse ${ENV_VAR}. Ensure it is valid base58 or a JSON array.`,\n );\n }\n}\n\n/* ──────────────────────────────────────────────────────────\n * Helper – fetch getPriorityFeeEstimate\n * ──────────────────────────────────────────────────────── */\nasync function fetchPriorityFee(rpcEndpoint: string, rawUnsignedTxBuffer: Uint8Array) {\n try {\n const res = await fetch(rpcEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: \"1\",\n method: \"getPriorityFeeEstimate\",\n params: [{\n transaction: bs58.encode(rawUnsignedTxBuffer), options: {\n recommended: true\n }\n }]\n })\n });\n const data = await res.json() as { result: { priorityFeeEstimate: number } };\n const fee = data?.result?.priorityFeeEstimate ?? null;\n console.log(\"Got fee from Helius\", fee);\n if (fee != null && fee > 0) {\n return Math.ceil(Number(fee) * 1.2);\n } else {\n console.log(\"No fee from Helius, using default 10000\");\n return Math.ceil(10000 * 1.2);\n }\n } catch (err) {\n console.warn(\"Priority‑fee estimate failed:\", err);\n return Math.ceil(10000 * 1.2);\n }\n}\n\nexport class SolanaKeypairProvider implements AuthProvider {\n private readonly keypair: Keypair;\n\n constructor(\n private readonly networkUrl: string | null = null,\n ) {\n this.keypair = loadKeypairFromEnv();\n }\n\n /* ----------------------------------------------------------- *\n * (Auth stubs – fill in later if needed)\n * ----------------------------------------------------------- */\n async login(): Promise<User | null> { throw new Error('Not implemented'); }\n async restoreSession(): Promise<User | null> { throw new Error('Not implemented'); }\n async logout(): Promise<void> { throw new Error('Not implemented'); }\n\n /* ----------------------------------------------------------- *\n * Sign arbitrary message\n * ----------------------------------------------------------- */\n async signMessage(message: string): Promise<string> {\n const sig = nacl.sign.detached(\n new TextEncoder().encode(message),\n this.keypair.secretKey,\n );\n return Buffer.from(sig).toString('base64');\n }\n\n /* ----------------------------------------------------------- *\n * Sign transaction\n * ----------------------------------------------------------- */\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in (transaction as any).message);\n\n if (isLegacyTransaction) {\n (transaction as Transaction).partialSign(this.keypair);\n } else {\n (transaction as VersionedTransaction).sign([this.keypair]);\n }\n return transaction;\n }\n\n /**\n * Signs and submits a Solana transaction to the network.\n *\n * This method handles blockhash and transaction confirmation automatically - you do NOT need to\n * set recentBlockhash or lastValidBlockHeight on the transaction before calling this method.\n * The network/RPC URL is derived from the provider's configuration (set during initialization).\n *\n * @param transaction - The transaction to sign and submit (Transaction or VersionedTransaction)\n * @param feePayer - Optional fee payer public key. If not provided and the transaction doesn't\n * already have a feePayer set, the keypair's public key will be used.\n * Useful for co-signing scenarios where a different account pays the fees.\n * @returns The transaction signature\n */\n async signAndSubmitTransaction(\n transaction: Transaction | VersionedTransaction,\n feePayer?: anchor.web3.PublicKey\n ): Promise<string> {\n // 1. Get RPC URL and create connection\n const rpcUrl = this.getRpcUrl();\n const connection = new Connection(rpcUrl, 'confirmed');\n\n // 2. Get fresh blockhash and set it on the transaction before signing\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed');\n\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in (transaction as any).message);\n\n if (isLegacyTransaction) {\n const legacyTx = transaction as Transaction;\n legacyTx.recentBlockhash = blockhash;\n legacyTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Set feePayer if not already set\n if (!legacyTx.feePayer) {\n legacyTx.feePayer = feePayer ?? this.keypair.publicKey;\n }\n } else {\n // VersionedTransaction\n const versionedTx = transaction as VersionedTransaction;\n versionedTx.message.recentBlockhash = blockhash;\n // Note: VersionedTransaction feePayer is set in the message at creation time\n // and cannot be modified after creation\n }\n\n // 3. Sign the transaction\n const signedTx = await this.signTransaction(transaction);\n\n // 4. Submit and confirm using shared helper\n const { signature } = await this.submitAndConfirmTransaction(signedTx, connection);\n return signature;\n }\n\n /* ----------------------------------------------------------- *\n * Private Helpers\n * ----------------------------------------------------------- */\n\n /**\n * Submits a signed transaction and waits for confirmation using polling.\n * Shared by both signAndSubmitTransaction and runTransactionInner.\n */\n private async submitAndConfirmTransaction(\n signedTx: Transaction | VersionedTransaction,\n connection: Connection,\n options?: { fetchTxInfo?: boolean }\n ): Promise<{ signature: string; txInfo: any }> {\n const sig = await connection.sendRawTransaction(signedTx.serialize(), {\n preflightCommitment: 'confirmed'\n });\n\n // Wait for confirmation using polling\n const startTime = Date.now();\n const timeoutMs = 10 * 1000; // 10 seconds\n\n while (true) {\n const st = await connection.getSignatureStatus(sig);\n if (st?.value?.confirmationStatus === 'confirmed') {\n break;\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);\n }\n\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n\n // Optionally fetch transaction info\n let txInfo : VersionedTransactionResponse | null = null;\n if (options?.fetchTxInfo) {\n txInfo = await connection.getTransaction(sig, {\n maxSupportedTransactionVersion: 0,\n commitment: 'confirmed'\n });\n }\n\n return { signature: sig, txInfo };\n }\n\n private getRpcUrl(network?: string): string {\n if (this.networkUrl) {\n return this.networkUrl;\n }\n if (network === 'solana_devnet') {\n return SOLANA_DEVNET_RPC_URL;\n } else if (network === 'solana_mainnet') {\n return SOLANA_MAINNET_RPC_URL;\n } else if (network === 'surfnet') {\n return SURFNET_RPC_URL;\n }\n return SOLANA_MAINNET_RPC_URL; // default to mainnet\n }\n\n /* ----------------------------------------------------------- *\n * Transaction runner\n * ----------------------------------------------------------- */\n async runTransaction(\n _evm?: EVMTransaction,\n sol?: SolTransaction,\n opts?: SetOptions,\n ): Promise<TransactionResult> {\n if (!sol) throw new Error('Solana transaction data required');\n\n const kp = this.keypair;\n\n // Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction\n const isLegacyTx = (tx: Transaction | VersionedTransaction): boolean => {\n return 'recentBlockhash' in tx && !('message' in tx && 'staticAccountKeys' in (tx as any).message);\n };\n\n const wallet: anchor.Wallet = {\n publicKey: kp.publicKey,\n signTransaction: async (tx: Transaction | VersionedTransaction) => {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(tx)) {\n (tx as Transaction).partialSign(kp);\n } else {\n (tx as VersionedTransaction).sign([kp]);\n }\n return tx;\n },\n signAllTransactions: async (txs: (Transaction | VersionedTransaction)[]) =>\n txs.map((t) => {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(t)) {\n (t as Transaction).partialSign(kp);\n } else {\n (t as VersionedTransaction).sign([kp]);\n }\n return t;\n }),\n } as unknown as anchor.Wallet;\n\n /* de-dupe remaining accounts */\n const deduped = (() => {\n const fin: ReturnType<typeof convertRemainingAccounts> = [];\n for (const acc of convertRemainingAccounts(\n sol.txArgs[0].remainingAccounts,\n )) {\n const ex = fin.find((x) => x.pubkey.equals(acc.pubkey));\n if (ex) {\n ex.isSigner ||= acc.isSigner;\n ex.isWritable ||= acc.isWritable;\n } else fin.push(acc);\n }\n return fin;\n })();\n\n let retries = 0;\n let didPass = false;\n let delay = 1000;\n let toReturn: TransactionResult | null = null;\n let errorMessage = \"\";\n while (retries < 5) {\n try {\n toReturn = await this.runTransactionInner(sol, opts, wallet, kp, deduped);\n didPass = true;\n break;\n } catch (error: any) {\n console.log(\"Error building and sending transaction on retry:\", retries, error);\n await new Promise(resolve => setTimeout(resolve, delay));\n // Exponential backoff\n delay *= 1.5;\n retries++;\n errorMessage = error.message || JSON.stringify(error, null, 2);\n }\n }\n if (!didPass) {\n throw new Error(`Failed to send transaction after 5 retries: ${errorMessage}`);\n }\n return toReturn as TransactionResult;\n }\n\n private async runTransactionInner(sol: SolTransaction, opts: SetOptions | undefined, wallet: anchor.Wallet, kp: Keypair, deduped: ReturnType<typeof convertRemainingAccounts>): Promise<TransactionResult> {\n\n let rpcUrl = this.networkUrl;\n if (this.networkUrl == null) {\n if (sol.network === 'solana_devnet') {\n rpcUrl = SOLANA_DEVNET_RPC_URL;\n } else if (sol.network === 'solana_mainnet') {\n rpcUrl = SOLANA_MAINNET_RPC_URL;\n } else {\n rpcUrl = SURFNET_RPC_URL;\n }\n }\n const connection = new Connection(rpcUrl!, 'confirmed');\n\n const anchorProvider = new anchor.AnchorProvider(\n connection,\n wallet,\n anchor.AnchorProvider.defaultOptions(),\n );\n\n const app_id = sol.appId;\n if (!app_id) throw new Error('app_id missing');\n\n let { tx, blockhash, lastValidBlockHeight } = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n sol.preInstructions,\n false,\n );\n\n // Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction\n const isLegacyTx = (t: Transaction | VersionedTransaction): boolean => {\n return 'recentBlockhash' in t && !('message' in t && 'staticAccountKeys' in (t as any).message);\n };\n\n // Refresh blockhash and lastValidBlockHeight\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(tx)) {\n (tx as Transaction).partialSign(kp);\n (tx as Transaction).recentBlockhash = blockhash;\n (tx as Transaction).lastValidBlockHeight = lastValidBlockHeight;\n (tx as Transaction).feePayer = kp.publicKey;\n } else {\n (tx as VersionedTransaction).sign([kp]);\n (tx as VersionedTransaction).message.recentBlockhash = blockhash;\n }\n\n // 3️⃣ Optional priority‑fee instruction\n\n const rawUnsigned = tx.serialize({ requireAllSignatures: false });\n const microLamports = await fetchPriorityFee(\n connection.rpcEndpoint,\n rawUnsigned\n );\n\n if (microLamports != null) {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(tx)) {\n (tx as Transaction).instructions.unshift(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports })\n );\n (tx as Transaction).partialSign(kp);\n } else {\n // Rebuild the transaction with the new priority fee\n const roundTwo = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n [ComputeBudgetProgram.setComputeUnitPrice({ microLamports }), ...sol.preInstructions],\n false,\n );\n tx = roundTwo.tx as VersionedTransaction;\n blockhash = roundTwo.blockhash;\n lastValidBlockHeight = roundTwo.lastValidBlockHeight;\n (tx as VersionedTransaction).sign([kp]);\n (tx as VersionedTransaction).message.recentBlockhash = blockhash;\n }\n }\n\n if (opts?.shouldSubmitTx === false) {\n return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };\n }\n\n // Submit and confirm using shared helper\n const { signature, txInfo } = await this.submitAndConfirmTransaction(tx, connection, { fetchTxInfo: true });\n\n return {\n transactionSignature: signature,\n blockNumber: txInfo?.slot ?? 0,\n gasUsed: txInfo?.meta?.fee.toString() ?? '0',\n data: txInfo?.meta,\n };\n }\n\n /* ----------------------------------------------------------- */\n async getNativeMethods() {\n return { keypair: this.keypair };\n }\n}\n","import { AuthProvider } from '@pooflabs/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport * as crypto from 'crypto';\n\n/**\n * Server-side OffchainAuthProvider wrapper for the poofnet environment.\n *\n * For signMessage, this generates a mock signature using SHA-256 hashing.\n * This is used for offchain transaction signing.\n */\nexport class OffchainAuthProvider implements AuthProvider {\n private wrappedProvider: AuthProvider;\n\n constructor(wrappedProvider: AuthProvider) {\n this.wrappedProvider = wrappedProvider;\n }\n\n async login(): Promise<any> {\n return this.wrappedProvider.login();\n }\n\n async logout(): Promise<void> {\n return this.wrappedProvider.logout();\n }\n\n async restoreSession(): Promise<any> {\n return this.wrappedProvider.restoreSession();\n }\n\n async getNativeMethods(): Promise<any> {\n return this.wrappedProvider.getNativeMethods();\n }\n\n async signMessage(message: string): Promise<string> {\n // Delegate to wrapped provider for real signing\n return this.wrappedProvider.signMessage(message);\n }\n\n async signMessageMock(message: string): Promise<string> {\n // Generate mock signature (SHA-256 hash of message, base64 encoded)\n // This is used for offchain transaction signing\n const hash = crypto.createHash('sha256').update(message).digest('base64');\n return hash;\n }\n\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n return (this.wrappedProvider as any).signTransaction(transaction);\n }\n\n /**\n * Sign and submit transaction - not supported in poofnet environment.\n * See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)\n * for the full implementation with blockhash handling and feePayer support.\n */\n async signAndSubmitTransaction(\n _transaction: Transaction | VersionedTransaction,\n _feePayer?: any\n ): Promise<string> {\n throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');\n }\n\n async runTransaction(evmTransactionData?: any, solTransactionData?: any, options?: any): Promise<any> {\n return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);\n }\n}\n","import { getConfig } from '@pooflabs/core';\nimport { AuthProvider } from '@pooflabs/core';\nimport { SolanaKeypairProvider } from './providers/solana-keypair-provider';\nimport { OffchainAuthProvider } from './providers/offchain-auth-provider';\n\nlet currentAuthProvider: AuthProvider | null = null;\n\nexport const SOLANA_DEVNET_RPC_URL = \"https://idelle-8nxsep-fast-devnet.helius-rpc.com\";\nexport const SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nexport const SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function getAuthProvider(): Promise<AuthProvider> {\n const config = await getConfig();\n\n if (currentAuthProvider) {\n // If provider exists but chain is \"offchain\" and it's not already wrapped, rewrap it\n if (config.chain === \"offchain\" && !(currentAuthProvider instanceof OffchainAuthProvider)) {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n return currentAuthProvider;\n }\n\n currentAuthProvider = await matchAuthProvider(config.rpcUrl ?? null);\n \n // Wrap with OffchainAuthProvider for offchain chain\n if (config.chain === \"offchain\") {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n\n return currentAuthProvider;\n}\n\nexport async function matchAuthProvider(rpcUrl: string | null): Promise<AuthProvider> {\n return new SolanaKeypairProvider(rpcUrl);\n}","import { AuthProvider } from '@pooflabs/core';\nimport { getAuthProvider } from './auth';\nimport { init as configInit, ClientConfig } from '@pooflabs/core';\n\nlet authProviderInstance: AuthProvider | null = null;\n\nconst SOLANA_DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nconst SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nconst SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function init(newConfig: Partial<ClientConfig>): Promise<void> {\n // Initialize config first so getAuthProvider can access it\n // Server-side skips backend init since it already has all needed config\n await configInit({ ...newConfig, isServer: true, skipBackendInit: true });\n\n // Get the auth provider (which will wrap it if chain is \"offchain\")\n authProviderInstance = await getAuthProvider();\n\n // Update config with the wrapped provider\n await configInit({ ...newConfig, authProvider: authProviderInstance, isServer: true, skipBackendInit: true });\n}","import { getIdToken as getIdTokenCore } from '@pooflabs/core';\n\n// Wrapper for getIdToken - passes isServer=true for server-side usage\nexport async function getIdToken(): Promise<string | null> {\n return getIdTokenCore(true);\n}\n"],"names":["Keypair","Buffer","Connection","convertRemainingAccounts","anchor","buildSetDocumentsTransaction","ComputeBudgetProgram","crypto","getConfig","configInit","getIdTokenCore"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { convertRemainingAccounts, buildSetDocumentsTransaction, getConfig, init as init$1, getIdToken as getIdToken$1 } from '@pooflabs/core';
|
|
2
2
|
export * from '@pooflabs/core';
|
|
3
|
-
export { get, getConfig, getFiles, runExpression, runExpressionMany, runQuery, runQueryMany, set, setFile, setMany, subscribe } from '@pooflabs/core';
|
|
3
|
+
export { get, getConfig, getFiles, runExpression, runExpressionMany, runQuery, runQueryMany, set, setFile, setMany, signAndSubmitTransaction, signMessage, signTransaction, subscribe } from '@pooflabs/core';
|
|
4
4
|
import { Buffer } from 'buffer';
|
|
5
|
-
import {
|
|
5
|
+
import { Connection, ComputeBudgetProgram, Keypair } from '@solana/web3.js';
|
|
6
6
|
import * as anchor from '@coral-xyz/anchor';
|
|
7
7
|
import nacl from 'tweetnacl';
|
|
8
8
|
import bs58 from 'bs58';
|
|
@@ -86,14 +86,110 @@ class SolanaKeypairProvider {
|
|
|
86
86
|
* Sign transaction
|
|
87
87
|
* ----------------------------------------------------------- */
|
|
88
88
|
async signTransaction(transaction) {
|
|
89
|
-
|
|
89
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
90
|
+
const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in transaction.message);
|
|
91
|
+
if (isLegacyTransaction) {
|
|
90
92
|
transaction.partialSign(this.keypair);
|
|
91
93
|
}
|
|
92
|
-
else
|
|
94
|
+
else {
|
|
93
95
|
transaction.sign([this.keypair]);
|
|
94
96
|
}
|
|
95
97
|
return transaction;
|
|
96
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Signs and submits a Solana transaction to the network.
|
|
101
|
+
*
|
|
102
|
+
* This method handles blockhash and transaction confirmation automatically - you do NOT need to
|
|
103
|
+
* set recentBlockhash or lastValidBlockHeight on the transaction before calling this method.
|
|
104
|
+
* The network/RPC URL is derived from the provider's configuration (set during initialization).
|
|
105
|
+
*
|
|
106
|
+
* @param transaction - The transaction to sign and submit (Transaction or VersionedTransaction)
|
|
107
|
+
* @param feePayer - Optional fee payer public key. If not provided and the transaction doesn't
|
|
108
|
+
* already have a feePayer set, the keypair's public key will be used.
|
|
109
|
+
* Useful for co-signing scenarios where a different account pays the fees.
|
|
110
|
+
* @returns The transaction signature
|
|
111
|
+
*/
|
|
112
|
+
async signAndSubmitTransaction(transaction, feePayer) {
|
|
113
|
+
// 1. Get RPC URL and create connection
|
|
114
|
+
const rpcUrl = this.getRpcUrl();
|
|
115
|
+
const connection = new Connection(rpcUrl, 'confirmed');
|
|
116
|
+
// 2. Get fresh blockhash and set it on the transaction before signing
|
|
117
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed');
|
|
118
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
119
|
+
const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in transaction.message);
|
|
120
|
+
if (isLegacyTransaction) {
|
|
121
|
+
const legacyTx = transaction;
|
|
122
|
+
legacyTx.recentBlockhash = blockhash;
|
|
123
|
+
legacyTx.lastValidBlockHeight = lastValidBlockHeight;
|
|
124
|
+
// Set feePayer if not already set
|
|
125
|
+
if (!legacyTx.feePayer) {
|
|
126
|
+
legacyTx.feePayer = feePayer !== null && feePayer !== void 0 ? feePayer : this.keypair.publicKey;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// VersionedTransaction
|
|
131
|
+
const versionedTx = transaction;
|
|
132
|
+
versionedTx.message.recentBlockhash = blockhash;
|
|
133
|
+
// Note: VersionedTransaction feePayer is set in the message at creation time
|
|
134
|
+
// and cannot be modified after creation
|
|
135
|
+
}
|
|
136
|
+
// 3. Sign the transaction
|
|
137
|
+
const signedTx = await this.signTransaction(transaction);
|
|
138
|
+
// 4. Submit and confirm using shared helper
|
|
139
|
+
const { signature } = await this.submitAndConfirmTransaction(signedTx, connection);
|
|
140
|
+
return signature;
|
|
141
|
+
}
|
|
142
|
+
/* ----------------------------------------------------------- *
|
|
143
|
+
* Private Helpers
|
|
144
|
+
* ----------------------------------------------------------- */
|
|
145
|
+
/**
|
|
146
|
+
* Submits a signed transaction and waits for confirmation using polling.
|
|
147
|
+
* Shared by both signAndSubmitTransaction and runTransactionInner.
|
|
148
|
+
*/
|
|
149
|
+
async submitAndConfirmTransaction(signedTx, connection, options) {
|
|
150
|
+
var _a;
|
|
151
|
+
const sig = await connection.sendRawTransaction(signedTx.serialize(), {
|
|
152
|
+
preflightCommitment: 'confirmed'
|
|
153
|
+
});
|
|
154
|
+
// Wait for confirmation using polling
|
|
155
|
+
const startTime = Date.now();
|
|
156
|
+
const timeoutMs = 10 * 1000; // 10 seconds
|
|
157
|
+
while (true) {
|
|
158
|
+
const st = await connection.getSignatureStatus(sig);
|
|
159
|
+
if (((_a = st === null || st === void 0 ? void 0 : st.value) === null || _a === void 0 ? void 0 : _a.confirmationStatus) === 'confirmed') {
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
// Check if we've exceeded the timeout
|
|
163
|
+
if (Date.now() - startTime > timeoutMs) {
|
|
164
|
+
throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);
|
|
165
|
+
}
|
|
166
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
167
|
+
}
|
|
168
|
+
// Optionally fetch transaction info
|
|
169
|
+
let txInfo = null;
|
|
170
|
+
if (options === null || options === void 0 ? void 0 : options.fetchTxInfo) {
|
|
171
|
+
txInfo = await connection.getTransaction(sig, {
|
|
172
|
+
maxSupportedTransactionVersion: 0,
|
|
173
|
+
commitment: 'confirmed'
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return { signature: sig, txInfo };
|
|
177
|
+
}
|
|
178
|
+
getRpcUrl(network) {
|
|
179
|
+
if (this.networkUrl) {
|
|
180
|
+
return this.networkUrl;
|
|
181
|
+
}
|
|
182
|
+
if (network === 'solana_devnet') {
|
|
183
|
+
return SOLANA_DEVNET_RPC_URL;
|
|
184
|
+
}
|
|
185
|
+
else if (network === 'solana_mainnet') {
|
|
186
|
+
return SOLANA_MAINNET_RPC_URL;
|
|
187
|
+
}
|
|
188
|
+
else if (network === 'surfnet') {
|
|
189
|
+
return SURFNET_RPC_URL;
|
|
190
|
+
}
|
|
191
|
+
return SOLANA_MAINNET_RPC_URL; // default to mainnet
|
|
192
|
+
}
|
|
97
193
|
/* ----------------------------------------------------------- *
|
|
98
194
|
* Transaction runner
|
|
99
195
|
* ----------------------------------------------------------- */
|
|
@@ -101,22 +197,28 @@ class SolanaKeypairProvider {
|
|
|
101
197
|
if (!sol)
|
|
102
198
|
throw new Error('Solana transaction data required');
|
|
103
199
|
const kp = this.keypair;
|
|
200
|
+
// Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction
|
|
201
|
+
const isLegacyTx = (tx) => {
|
|
202
|
+
return 'recentBlockhash' in tx && !('message' in tx && 'staticAccountKeys' in tx.message);
|
|
203
|
+
};
|
|
104
204
|
const wallet = {
|
|
105
205
|
publicKey: kp.publicKey,
|
|
106
206
|
signTransaction: async (tx) => {
|
|
107
|
-
|
|
207
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
208
|
+
if (isLegacyTx(tx)) {
|
|
108
209
|
tx.partialSign(kp);
|
|
109
210
|
}
|
|
110
|
-
else
|
|
211
|
+
else {
|
|
111
212
|
tx.sign([kp]);
|
|
112
213
|
}
|
|
113
214
|
return tx;
|
|
114
215
|
},
|
|
115
216
|
signAllTransactions: async (txs) => txs.map((t) => {
|
|
116
|
-
|
|
217
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
218
|
+
if (isLegacyTx(t)) {
|
|
117
219
|
t.partialSign(kp);
|
|
118
220
|
}
|
|
119
|
-
else
|
|
221
|
+
else {
|
|
120
222
|
t.sign([kp]);
|
|
121
223
|
}
|
|
122
224
|
return t;
|
|
@@ -162,7 +264,7 @@ class SolanaKeypairProvider {
|
|
|
162
264
|
return toReturn;
|
|
163
265
|
}
|
|
164
266
|
async runTransactionInner(sol, opts, wallet, kp, deduped) {
|
|
165
|
-
var _a, _b, _c
|
|
267
|
+
var _a, _b, _c;
|
|
166
268
|
let rpcUrl = this.networkUrl;
|
|
167
269
|
if (this.networkUrl == null) {
|
|
168
270
|
if (sol.network === 'solana_devnet') {
|
|
@@ -186,14 +288,19 @@ class SolanaKeypairProvider {
|
|
|
186
288
|
delete_paths: sol.txArgs[0].deletePaths,
|
|
187
289
|
txData: sol.txArgs[0].txData
|
|
188
290
|
}, deduped, sol.lutKey, sol.preInstructions, false);
|
|
291
|
+
// Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction
|
|
292
|
+
const isLegacyTx = (t) => {
|
|
293
|
+
return 'recentBlockhash' in t && !('message' in t && 'staticAccountKeys' in t.message);
|
|
294
|
+
};
|
|
189
295
|
// Refresh blockhash and lastValidBlockHeight
|
|
190
|
-
|
|
296
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
297
|
+
if (isLegacyTx(tx)) {
|
|
191
298
|
tx.partialSign(kp);
|
|
192
299
|
tx.recentBlockhash = blockhash;
|
|
193
300
|
tx.lastValidBlockHeight = lastValidBlockHeight;
|
|
194
301
|
tx.feePayer = kp.publicKey;
|
|
195
302
|
}
|
|
196
|
-
else
|
|
303
|
+
else {
|
|
197
304
|
tx.sign([kp]);
|
|
198
305
|
tx.message.recentBlockhash = blockhash;
|
|
199
306
|
}
|
|
@@ -201,11 +308,12 @@ class SolanaKeypairProvider {
|
|
|
201
308
|
const rawUnsigned = tx.serialize({ requireAllSignatures: false });
|
|
202
309
|
const microLamports = await fetchPriorityFee(connection.rpcEndpoint, rawUnsigned);
|
|
203
310
|
if (microLamports != null) {
|
|
204
|
-
|
|
311
|
+
// Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
|
|
312
|
+
if (isLegacyTx(tx)) {
|
|
205
313
|
tx.instructions.unshift(ComputeBudgetProgram.setComputeUnitPrice({ microLamports }));
|
|
206
314
|
tx.partialSign(kp);
|
|
207
315
|
}
|
|
208
|
-
else
|
|
316
|
+
else {
|
|
209
317
|
// Rebuild the transaction with the new priority fee
|
|
210
318
|
const roundTwo = await buildSetDocumentsTransaction(connection, sol.txArgs[0].idl, anchorProvider, kp.publicKey, {
|
|
211
319
|
app_id,
|
|
@@ -223,31 +331,13 @@ class SolanaKeypairProvider {
|
|
|
223
331
|
if ((opts === null || opts === void 0 ? void 0 : opts.shouldSubmitTx) === false) {
|
|
224
332
|
return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };
|
|
225
333
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
});
|
|
229
|
-
const startTime = Date.now();
|
|
230
|
-
const timeoutMs = 10 * 1000; // 10 seconds
|
|
231
|
-
while (true) {
|
|
232
|
-
const st = await connection.getSignatureStatus(sig);
|
|
233
|
-
if (((_a = st === null || st === void 0 ? void 0 : st.value) === null || _a === void 0 ? void 0 : _a.confirmationStatus) === 'confirmed') {
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
// Check if we've exceeded the timeout
|
|
237
|
-
if (Date.now() - startTime > timeoutMs) {
|
|
238
|
-
throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);
|
|
239
|
-
}
|
|
240
|
-
await new Promise(resolve => setTimeout(resolve, 500));
|
|
241
|
-
}
|
|
242
|
-
const info = await connection.getTransaction(sig, {
|
|
243
|
-
maxSupportedTransactionVersion: 0,
|
|
244
|
-
commitment: 'confirmed'
|
|
245
|
-
});
|
|
334
|
+
// Submit and confirm using shared helper
|
|
335
|
+
const { signature, txInfo } = await this.submitAndConfirmTransaction(tx, connection, { fetchTxInfo: true });
|
|
246
336
|
return {
|
|
247
|
-
transactionSignature:
|
|
248
|
-
blockNumber: (
|
|
249
|
-
gasUsed: (
|
|
250
|
-
data:
|
|
337
|
+
transactionSignature: signature,
|
|
338
|
+
blockNumber: (_a = txInfo === null || txInfo === void 0 ? void 0 : txInfo.slot) !== null && _a !== void 0 ? _a : 0,
|
|
339
|
+
gasUsed: (_c = (_b = txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta) === null || _b === void 0 ? void 0 : _b.fee.toString()) !== null && _c !== void 0 ? _c : '0',
|
|
340
|
+
data: txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta,
|
|
251
341
|
};
|
|
252
342
|
}
|
|
253
343
|
/* ----------------------------------------------------------- */
|
|
@@ -257,9 +347,10 @@ class SolanaKeypairProvider {
|
|
|
257
347
|
}
|
|
258
348
|
|
|
259
349
|
/**
|
|
260
|
-
* Server-side OffchainAuthProvider wrapper
|
|
261
|
-
*
|
|
262
|
-
*
|
|
350
|
+
* Server-side OffchainAuthProvider wrapper for the poofnet environment.
|
|
351
|
+
*
|
|
352
|
+
* For signMessage, this generates a mock signature using SHA-256 hashing.
|
|
353
|
+
* This is used for offchain transaction signing.
|
|
263
354
|
*/
|
|
264
355
|
class OffchainAuthProvider {
|
|
265
356
|
constructor(wrappedProvider) {
|
|
@@ -278,15 +369,26 @@ class OffchainAuthProvider {
|
|
|
278
369
|
return this.wrappedProvider.getNativeMethods();
|
|
279
370
|
}
|
|
280
371
|
async signMessage(message) {
|
|
372
|
+
// Delegate to wrapped provider for real signing
|
|
373
|
+
return this.wrappedProvider.signMessage(message);
|
|
374
|
+
}
|
|
375
|
+
async signMessageMock(message) {
|
|
281
376
|
// Generate mock signature (SHA-256 hash of message, base64 encoded)
|
|
282
|
-
// This
|
|
283
|
-
// Server-side uses Node.js crypto module
|
|
377
|
+
// This is used for offchain transaction signing
|
|
284
378
|
const hash = crypto.createHash('sha256').update(message).digest('base64');
|
|
285
379
|
return hash;
|
|
286
380
|
}
|
|
287
381
|
async signTransaction(transaction) {
|
|
288
382
|
return this.wrappedProvider.signTransaction(transaction);
|
|
289
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* Sign and submit transaction - not supported in poofnet environment.
|
|
386
|
+
* See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)
|
|
387
|
+
* for the full implementation with blockhash handling and feePayer support.
|
|
388
|
+
*/
|
|
389
|
+
async signAndSubmitTransaction(_transaction, _feePayer) {
|
|
390
|
+
throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');
|
|
391
|
+
}
|
|
290
392
|
async runTransaction(evmTransactionData, solTransactionData, options) {
|
|
291
393
|
return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);
|
|
292
394
|
}
|
|
@@ -327,17 +429,11 @@ async function init(newConfig) {
|
|
|
327
429
|
// Update config with the wrapped provider
|
|
328
430
|
await init$1(Object.assign(Object.assign({}, newConfig), { authProvider: authProviderInstance, isServer: true, skipBackendInit: true }));
|
|
329
431
|
}
|
|
330
|
-
async function signTransaction(transaction) {
|
|
331
|
-
if (!authProviderInstance) {
|
|
332
|
-
throw new Error('Auth provider not initialized. Please call init() first.');
|
|
333
|
-
}
|
|
334
|
-
return await authProviderInstance.signTransaction(transaction);
|
|
335
|
-
}
|
|
336
432
|
|
|
337
433
|
// Wrapper for getIdToken - passes isServer=true for server-side usage
|
|
338
434
|
async function getIdToken() {
|
|
339
435
|
return getIdToken$1(true);
|
|
340
436
|
}
|
|
341
437
|
|
|
342
|
-
export { getAuthProvider, getIdToken, init
|
|
438
|
+
export { getAuthProvider, getIdToken, init };
|
|
343
439
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/auth/providers/solana-keypair-provider.ts","../src/auth/providers/offchain-auth-provider.ts","../src/auth/index.ts","../src/global.ts","../src/utils.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport {\n ComputeBudgetProgram,\n Connection,\n Keypair,\n Transaction,\n VersionedTransaction\n} from '@solana/web3.js';\nimport * as anchor from '@coral-xyz/anchor';\nimport nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nimport type {\n AuthProvider,\n EVMTransaction,\n SolTransaction,\n TransactionResult,\n User,\n SetOptions,\n} from '@pooflabs/core';\n\nimport {\n convertRemainingAccounts,\n buildSetDocumentsTransaction,\n} from '@pooflabs/core';\nimport { SOLANA_DEVNET_RPC_URL, SOLANA_MAINNET_RPC_URL, SURFNET_RPC_URL } from '..';\n\n/* ------------------------------------------------------------- *\n * REQUIRED ENV-VAR\n * ------------------------------------------------------------- */\nconst ENV_VAR = 'TAROBASE_SOLANA_KEYPAIR'; // base-58 or JSON array\n\nfunction loadKeypairFromEnv(): Keypair {\n const secret = process?.env?.[ENV_VAR];\n if (!secret) {\n throw new Error(\n `Missing ${ENV_VAR}. Set it to a base58 secret key or JSON array.`,\n );\n }\n\n try {\n const secretKey = secret.trim().startsWith('[')\n ? Uint8Array.from(JSON.parse(secret))\n : bs58.decode(secret.trim());\n\n return Keypair.fromSecretKey(secretKey);\n } catch (err) {\n throw new Error(\n `Unable to parse ${ENV_VAR}. Ensure it is valid base58 or a JSON array.`,\n );\n }\n}\n\n/* ──────────────────────────────────────────────────────────\n * Helper – fetch getPriorityFeeEstimate\n * ──────────────────────────────────────────────────────── */\nasync function fetchPriorityFee(rpcEndpoint: string, rawUnsignedTxBuffer: Uint8Array) {\n try {\n const res = await fetch(rpcEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: \"1\",\n method: \"getPriorityFeeEstimate\",\n params: [{\n transaction: bs58.encode(rawUnsignedTxBuffer), options: {\n recommended: true\n }\n }]\n })\n });\n const data = await res.json() as { result: { priorityFeeEstimate: number } };\n const fee = data?.result?.priorityFeeEstimate ?? null;\n console.log(\"Got fee from Helius\", fee);\n if (fee != null && fee > 0) {\n return Math.ceil(Number(fee) * 1.2);\n } else {\n console.log(\"No fee from Helius, using default 10000\");\n return Math.ceil(10000 * 1.2);\n }\n } catch (err) {\n console.warn(\"Priority‑fee estimate failed:\", err);\n return Math.ceil(10000 * 1.2);\n }\n}\n\nexport class SolanaKeypairProvider implements AuthProvider {\n private readonly keypair: Keypair;\n\n constructor(\n private readonly networkUrl: string | null = null,\n ) {\n this.keypair = loadKeypairFromEnv();\n }\n\n /* ----------------------------------------------------------- *\n * (Auth stubs – fill in later if needed)\n * ----------------------------------------------------------- */\n async login(): Promise<User | null> { throw new Error('Not implemented'); }\n async restoreSession(): Promise<User | null> { throw new Error('Not implemented'); }\n async logout(): Promise<void> { throw new Error('Not implemented'); }\n\n /* ----------------------------------------------------------- *\n * Sign arbitrary message\n * ----------------------------------------------------------- */\n async signMessage(message: string): Promise<string> {\n const sig = nacl.sign.detached(\n new TextEncoder().encode(message),\n this.keypair.secretKey,\n );\n return Buffer.from(sig).toString('base64');\n }\n\n /* ----------------------------------------------------------- *\n * Sign transaction\n * ----------------------------------------------------------- */\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n if (transaction instanceof Transaction) {\n transaction.partialSign(this.keypair);\n } else if (transaction instanceof VersionedTransaction) {\n transaction.sign([this.keypair]);\n }\n return transaction;\n }\n\n /* ----------------------------------------------------------- *\n * Transaction runner\n * ----------------------------------------------------------- */\n async runTransaction(\n _evm?: EVMTransaction,\n sol?: SolTransaction,\n opts?: SetOptions,\n ): Promise<TransactionResult> {\n if (!sol) throw new Error('Solana transaction data required');\n\n const kp = this.keypair;\n\n const wallet: anchor.Wallet = {\n publicKey: kp.publicKey,\n signTransaction: async (tx: Transaction | VersionedTransaction) => {\n if (tx instanceof Transaction) {\n tx.partialSign(kp);\n } else if (tx instanceof VersionedTransaction) {\n tx.sign([kp]);\n }\n return tx;\n },\n signAllTransactions: async (txs: (Transaction | VersionedTransaction)[]) =>\n txs.map((t) => {\n if (t instanceof Transaction) {\n t.partialSign(kp);\n } else if (t instanceof VersionedTransaction) {\n t.sign([kp]);\n }\n return t;\n }),\n } as unknown as anchor.Wallet;\n\n /* de-dupe remaining accounts */\n const deduped = (() => {\n const fin: ReturnType<typeof convertRemainingAccounts> = [];\n for (const acc of convertRemainingAccounts(\n sol.txArgs[0].remainingAccounts,\n )) {\n const ex = fin.find((x) => x.pubkey.equals(acc.pubkey));\n if (ex) {\n ex.isSigner ||= acc.isSigner;\n ex.isWritable ||= acc.isWritable;\n } else fin.push(acc);\n }\n return fin;\n })();\n\n let retries = 0;\n let didPass = false;\n let delay = 1000;\n let toReturn: TransactionResult | null = null;\n let errorMessage = \"\";\n while (retries < 5) {\n try {\n toReturn = await this.runTransactionInner(sol, opts, wallet, kp, deduped);\n didPass = true;\n break;\n } catch (error: any) {\n console.log(\"Error building and sending transaction on retry:\", retries, error);\n await new Promise(resolve => setTimeout(resolve, delay));\n // Exponential backoff\n delay *= 1.5;\n retries++;\n errorMessage = error.message || JSON.stringify(error, null, 2);\n }\n }\n if (!didPass) {\n throw new Error(`Failed to send transaction after 5 retries: ${errorMessage}`);\n }\n return toReturn as TransactionResult;\n }\n\n private async runTransactionInner(sol: SolTransaction, opts: SetOptions | undefined, wallet: anchor.Wallet, kp: Keypair, deduped: ReturnType<typeof convertRemainingAccounts>): Promise<TransactionResult> {\n\n let rpcUrl = this.networkUrl;\n if(this.networkUrl == null) {\n if(sol.network === 'solana_devnet') {\n rpcUrl = SOLANA_DEVNET_RPC_URL;\n } else if(sol.network === 'solana_mainnet') {\n rpcUrl = SOLANA_MAINNET_RPC_URL;\n } else {\n rpcUrl = SURFNET_RPC_URL;\n }\n }\n const connection = new Connection(rpcUrl!, 'confirmed');\n \n const anchorProvider = new anchor.AnchorProvider(\n connection,\n wallet,\n anchor.AnchorProvider.defaultOptions(),\n );\n\n const app_id = sol.appId;\n if (!app_id) throw new Error('app_id missing');\n\n let { tx, blockhash, lastValidBlockHeight } = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n sol.preInstructions,\n false,\n );\n\n // Refresh blockhash and lastValidBlockHeight\n if (tx instanceof Transaction) {\n tx.partialSign(kp);\n tx.recentBlockhash = blockhash;\n tx.lastValidBlockHeight = lastValidBlockHeight;\n tx.feePayer = kp.publicKey;\n } else if (tx instanceof VersionedTransaction) {\n tx.sign([kp]);\n tx.message.recentBlockhash = blockhash;\n }\n\n // 3️⃣ Optional priority‑fee instruction\n\n const rawUnsigned = tx.serialize({ requireAllSignatures: false });\n const microLamports = await fetchPriorityFee(\n connection.rpcEndpoint,\n rawUnsigned\n );\n\n if (microLamports != null) {\n if (tx instanceof Transaction) {\n tx.instructions.unshift(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports })\n );\n tx.partialSign(kp);\n } else if (tx instanceof VersionedTransaction) {\n // Rebuild the transaction with the new priority fee\n const roundTwo = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n [ComputeBudgetProgram.setComputeUnitPrice({ microLamports }), ...sol.preInstructions],\n false,\n );\n tx = roundTwo.tx as VersionedTransaction;\n blockhash = roundTwo.blockhash;\n lastValidBlockHeight = roundTwo.lastValidBlockHeight;\n tx.sign([kp]);\n tx.message.recentBlockhash = blockhash;\n }\n }\n\n if (opts?.shouldSubmitTx === false) {\n return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };\n }\n\n const sig = await connection.sendRawTransaction(tx.serialize(), {\n preflightCommitment: \"confirmed\",\n });\n\n const startTime = Date.now();\n const timeoutMs = 10 * 1000; // 10 seconds\n\n while (true) {\n const st = await connection.getSignatureStatus(sig);\n if (st?.value?.confirmationStatus === 'confirmed') {\n break;\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);\n }\n\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n\n const info = await connection.getTransaction(sig, {\n maxSupportedTransactionVersion: 0,\n commitment: 'confirmed'\n });\n\n return {\n transactionSignature: sig,\n blockNumber: info?.slot ?? 0,\n gasUsed: info?.meta?.fee.toString() ?? '0',\n data: info?.meta,\n };\n }\n\n /* ----------------------------------------------------------- */\n async getNativeMethods() {\n return { keypair: this.keypair };\n }\n}\n","import { AuthProvider } from '@pooflabs/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport * as crypto from 'crypto';\n\n/**\n * Server-side OffchainAuthProvider wrapper that generates mock signatures\n * for offchain transactions using SHA-256 hashing\n * Uses Node.js crypto module for server-side execution\n */\nexport class OffchainAuthProvider implements AuthProvider {\n private wrappedProvider: AuthProvider;\n\n constructor(wrappedProvider: AuthProvider) {\n this.wrappedProvider = wrappedProvider;\n }\n\n async login(): Promise<any> {\n return this.wrappedProvider.login();\n }\n\n async logout(): Promise<void> {\n return this.wrappedProvider.logout();\n }\n\n async restoreSession(): Promise<any> {\n return this.wrappedProvider.restoreSession();\n }\n\n async getNativeMethods(): Promise<any> {\n return this.wrappedProvider.getNativeMethods();\n }\n\n async signMessage(message: string): Promise<string> {\n // Generate mock signature (SHA-256 hash of message, base64 encoded)\n // This matches the client-side OffchainAuthProvider behavior\n // Server-side uses Node.js crypto module\n const hash = crypto.createHash('sha256').update(message).digest('base64');\n return hash;\n }\n\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n return (this.wrappedProvider as any).signTransaction(transaction);\n }\n\n async runTransaction(evmTransactionData?: any, solTransactionData?: any, options?: any): Promise<any> {\n return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);\n }\n}\n\n","import { getConfig } from '@pooflabs/core';\nimport { AuthProvider } from '@pooflabs/core';\nimport { SolanaKeypairProvider } from './providers/solana-keypair-provider';\nimport { OffchainAuthProvider } from './providers/offchain-auth-provider';\n\nlet currentAuthProvider: AuthProvider | null = null;\n\nexport const SOLANA_DEVNET_RPC_URL = \"https://idelle-8nxsep-fast-devnet.helius-rpc.com\";\nexport const SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nexport const SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function getAuthProvider(): Promise<AuthProvider> {\n const config = await getConfig();\n\n if (currentAuthProvider) {\n // If provider exists but chain is \"offchain\" and it's not already wrapped, rewrap it\n if (config.chain === \"offchain\" && !(currentAuthProvider instanceof OffchainAuthProvider)) {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n return currentAuthProvider;\n }\n\n currentAuthProvider = await matchAuthProvider(config.rpcUrl ?? null);\n \n // Wrap with OffchainAuthProvider for offchain chain\n if (config.chain === \"offchain\") {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n\n return currentAuthProvider;\n}\n\nexport async function matchAuthProvider(rpcUrl: string | null): Promise<AuthProvider> {\n return new SolanaKeypairProvider(rpcUrl);\n}","import { AuthProvider } from '@pooflabs/core';\nimport { getAuthProvider } from './auth';\nimport { init as configInit, ClientConfig } from '@pooflabs/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\n\nlet authProviderInstance: AuthProvider | null = null;\n\nconst SOLANA_DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nconst SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nconst SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function init(newConfig: Partial<ClientConfig>): Promise<void> {\n // Initialize config first so getAuthProvider can access it\n // Server-side skips backend init since it already has all needed config\n await configInit({ ...newConfig, isServer: true, skipBackendInit: true });\n\n // Get the auth provider (which will wrap it if chain is \"offchain\")\n authProviderInstance = await getAuthProvider();\n\n // Update config with the wrapped provider\n await configInit({ ...newConfig, authProvider: authProviderInstance, isServer: true, skipBackendInit: true });\n}\n\nexport async function signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n if (!authProviderInstance) {\n throw new Error('Auth provider not initialized. Please call init() first.');\n }\n return await (authProviderInstance as any).signTransaction(transaction);\n}","import { getIdToken as getIdTokenCore } from '@pooflabs/core';\n\n// Wrapper for getIdToken - passes isServer=true for server-side usage\nexport async function getIdToken(): Promise<string | null> {\n return getIdTokenCore(true);\n}\n"],"names":["configInit","getIdTokenCore"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/auth/providers/solana-keypair-provider.ts","../src/auth/providers/offchain-auth-provider.ts","../src/auth/index.ts","../src/global.ts","../src/utils.ts"],"sourcesContent":["import { Buffer } from 'buffer';\nimport {\n ComputeBudgetProgram,\n Connection,\n Keypair,\n Transaction,\n VersionedTransaction,\n VersionedTransactionResponse\n} from '@solana/web3.js';\nimport * as anchor from '@coral-xyz/anchor';\nimport nacl from 'tweetnacl';\nimport bs58 from 'bs58';\n\nimport type {\n AuthProvider,\n EVMTransaction,\n SolTransaction,\n TransactionResult,\n User,\n SetOptions,\n} from '@pooflabs/core';\n\nimport {\n convertRemainingAccounts,\n buildSetDocumentsTransaction,\n} from '@pooflabs/core';\nimport { SOLANA_DEVNET_RPC_URL, SOLANA_MAINNET_RPC_URL, SURFNET_RPC_URL } from '..';\n\n/* ------------------------------------------------------------- *\n * REQUIRED ENV-VAR\n * ------------------------------------------------------------- */\nconst ENV_VAR = 'TAROBASE_SOLANA_KEYPAIR'; // base-58 or JSON array\n\nfunction loadKeypairFromEnv(): Keypair {\n const secret = process?.env?.[ENV_VAR];\n if (!secret) {\n throw new Error(\n `Missing ${ENV_VAR}. Set it to a base58 secret key or JSON array.`,\n );\n }\n\n try {\n const secretKey = secret.trim().startsWith('[')\n ? Uint8Array.from(JSON.parse(secret))\n : bs58.decode(secret.trim());\n\n return Keypair.fromSecretKey(secretKey);\n } catch (err) {\n throw new Error(\n `Unable to parse ${ENV_VAR}. Ensure it is valid base58 or a JSON array.`,\n );\n }\n}\n\n/* ──────────────────────────────────────────────────────────\n * Helper – fetch getPriorityFeeEstimate\n * ──────────────────────────────────────────────────────── */\nasync function fetchPriorityFee(rpcEndpoint: string, rawUnsignedTxBuffer: Uint8Array) {\n try {\n const res = await fetch(rpcEndpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: \"1\",\n method: \"getPriorityFeeEstimate\",\n params: [{\n transaction: bs58.encode(rawUnsignedTxBuffer), options: {\n recommended: true\n }\n }]\n })\n });\n const data = await res.json() as { result: { priorityFeeEstimate: number } };\n const fee = data?.result?.priorityFeeEstimate ?? null;\n console.log(\"Got fee from Helius\", fee);\n if (fee != null && fee > 0) {\n return Math.ceil(Number(fee) * 1.2);\n } else {\n console.log(\"No fee from Helius, using default 10000\");\n return Math.ceil(10000 * 1.2);\n }\n } catch (err) {\n console.warn(\"Priority‑fee estimate failed:\", err);\n return Math.ceil(10000 * 1.2);\n }\n}\n\nexport class SolanaKeypairProvider implements AuthProvider {\n private readonly keypair: Keypair;\n\n constructor(\n private readonly networkUrl: string | null = null,\n ) {\n this.keypair = loadKeypairFromEnv();\n }\n\n /* ----------------------------------------------------------- *\n * (Auth stubs – fill in later if needed)\n * ----------------------------------------------------------- */\n async login(): Promise<User | null> { throw new Error('Not implemented'); }\n async restoreSession(): Promise<User | null> { throw new Error('Not implemented'); }\n async logout(): Promise<void> { throw new Error('Not implemented'); }\n\n /* ----------------------------------------------------------- *\n * Sign arbitrary message\n * ----------------------------------------------------------- */\n async signMessage(message: string): Promise<string> {\n const sig = nacl.sign.detached(\n new TextEncoder().encode(message),\n this.keypair.secretKey,\n );\n return Buffer.from(sig).toString('base64');\n }\n\n /* ----------------------------------------------------------- *\n * Sign transaction\n * ----------------------------------------------------------- */\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in (transaction as any).message);\n\n if (isLegacyTransaction) {\n (transaction as Transaction).partialSign(this.keypair);\n } else {\n (transaction as VersionedTransaction).sign([this.keypair]);\n }\n return transaction;\n }\n\n /**\n * Signs and submits a Solana transaction to the network.\n *\n * This method handles blockhash and transaction confirmation automatically - you do NOT need to\n * set recentBlockhash or lastValidBlockHeight on the transaction before calling this method.\n * The network/RPC URL is derived from the provider's configuration (set during initialization).\n *\n * @param transaction - The transaction to sign and submit (Transaction or VersionedTransaction)\n * @param feePayer - Optional fee payer public key. If not provided and the transaction doesn't\n * already have a feePayer set, the keypair's public key will be used.\n * Useful for co-signing scenarios where a different account pays the fees.\n * @returns The transaction signature\n */\n async signAndSubmitTransaction(\n transaction: Transaction | VersionedTransaction,\n feePayer?: anchor.web3.PublicKey\n ): Promise<string> {\n // 1. Get RPC URL and create connection\n const rpcUrl = this.getRpcUrl();\n const connection = new Connection(rpcUrl, 'confirmed');\n\n // 2. Get fresh blockhash and set it on the transaction before signing\n const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed');\n\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n const isLegacyTransaction = 'recentBlockhash' in transaction && !('message' in transaction && 'staticAccountKeys' in (transaction as any).message);\n\n if (isLegacyTransaction) {\n const legacyTx = transaction as Transaction;\n legacyTx.recentBlockhash = blockhash;\n legacyTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Set feePayer if not already set\n if (!legacyTx.feePayer) {\n legacyTx.feePayer = feePayer ?? this.keypair.publicKey;\n }\n } else {\n // VersionedTransaction\n const versionedTx = transaction as VersionedTransaction;\n versionedTx.message.recentBlockhash = blockhash;\n // Note: VersionedTransaction feePayer is set in the message at creation time\n // and cannot be modified after creation\n }\n\n // 3. Sign the transaction\n const signedTx = await this.signTransaction(transaction);\n\n // 4. Submit and confirm using shared helper\n const { signature } = await this.submitAndConfirmTransaction(signedTx, connection);\n return signature;\n }\n\n /* ----------------------------------------------------------- *\n * Private Helpers\n * ----------------------------------------------------------- */\n\n /**\n * Submits a signed transaction and waits for confirmation using polling.\n * Shared by both signAndSubmitTransaction and runTransactionInner.\n */\n private async submitAndConfirmTransaction(\n signedTx: Transaction | VersionedTransaction,\n connection: Connection,\n options?: { fetchTxInfo?: boolean }\n ): Promise<{ signature: string; txInfo: any }> {\n const sig = await connection.sendRawTransaction(signedTx.serialize(), {\n preflightCommitment: 'confirmed'\n });\n\n // Wait for confirmation using polling\n const startTime = Date.now();\n const timeoutMs = 10 * 1000; // 10 seconds\n\n while (true) {\n const st = await connection.getSignatureStatus(sig);\n if (st?.value?.confirmationStatus === 'confirmed') {\n break;\n }\n\n // Check if we've exceeded the timeout\n if (Date.now() - startTime > timeoutMs) {\n throw new Error(`Transaction confirmation timeout after ${timeoutMs / 1000} seconds`);\n }\n\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n\n // Optionally fetch transaction info\n let txInfo : VersionedTransactionResponse | null = null;\n if (options?.fetchTxInfo) {\n txInfo = await connection.getTransaction(sig, {\n maxSupportedTransactionVersion: 0,\n commitment: 'confirmed'\n });\n }\n\n return { signature: sig, txInfo };\n }\n\n private getRpcUrl(network?: string): string {\n if (this.networkUrl) {\n return this.networkUrl;\n }\n if (network === 'solana_devnet') {\n return SOLANA_DEVNET_RPC_URL;\n } else if (network === 'solana_mainnet') {\n return SOLANA_MAINNET_RPC_URL;\n } else if (network === 'surfnet') {\n return SURFNET_RPC_URL;\n }\n return SOLANA_MAINNET_RPC_URL; // default to mainnet\n }\n\n /* ----------------------------------------------------------- *\n * Transaction runner\n * ----------------------------------------------------------- */\n async runTransaction(\n _evm?: EVMTransaction,\n sol?: SolTransaction,\n opts?: SetOptions,\n ): Promise<TransactionResult> {\n if (!sol) throw new Error('Solana transaction data required');\n\n const kp = this.keypair;\n\n // Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction\n const isLegacyTx = (tx: Transaction | VersionedTransaction): boolean => {\n return 'recentBlockhash' in tx && !('message' in tx && 'staticAccountKeys' in (tx as any).message);\n };\n\n const wallet: anchor.Wallet = {\n publicKey: kp.publicKey,\n signTransaction: async (tx: Transaction | VersionedTransaction) => {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(tx)) {\n (tx as Transaction).partialSign(kp);\n } else {\n (tx as VersionedTransaction).sign([kp]);\n }\n return tx;\n },\n signAllTransactions: async (txs: (Transaction | VersionedTransaction)[]) =>\n txs.map((t) => {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(t)) {\n (t as Transaction).partialSign(kp);\n } else {\n (t as VersionedTransaction).sign([kp]);\n }\n return t;\n }),\n } as unknown as anchor.Wallet;\n\n /* de-dupe remaining accounts */\n const deduped = (() => {\n const fin: ReturnType<typeof convertRemainingAccounts> = [];\n for (const acc of convertRemainingAccounts(\n sol.txArgs[0].remainingAccounts,\n )) {\n const ex = fin.find((x) => x.pubkey.equals(acc.pubkey));\n if (ex) {\n ex.isSigner ||= acc.isSigner;\n ex.isWritable ||= acc.isWritable;\n } else fin.push(acc);\n }\n return fin;\n })();\n\n let retries = 0;\n let didPass = false;\n let delay = 1000;\n let toReturn: TransactionResult | null = null;\n let errorMessage = \"\";\n while (retries < 5) {\n try {\n toReturn = await this.runTransactionInner(sol, opts, wallet, kp, deduped);\n didPass = true;\n break;\n } catch (error: any) {\n console.log(\"Error building and sending transaction on retry:\", retries, error);\n await new Promise(resolve => setTimeout(resolve, delay));\n // Exponential backoff\n delay *= 1.5;\n retries++;\n errorMessage = error.message || JSON.stringify(error, null, 2);\n }\n }\n if (!didPass) {\n throw new Error(`Failed to send transaction after 5 retries: ${errorMessage}`);\n }\n return toReturn as TransactionResult;\n }\n\n private async runTransactionInner(sol: SolTransaction, opts: SetOptions | undefined, wallet: anchor.Wallet, kp: Keypair, deduped: ReturnType<typeof convertRemainingAccounts>): Promise<TransactionResult> {\n\n let rpcUrl = this.networkUrl;\n if (this.networkUrl == null) {\n if (sol.network === 'solana_devnet') {\n rpcUrl = SOLANA_DEVNET_RPC_URL;\n } else if (sol.network === 'solana_mainnet') {\n rpcUrl = SOLANA_MAINNET_RPC_URL;\n } else {\n rpcUrl = SURFNET_RPC_URL;\n }\n }\n const connection = new Connection(rpcUrl!, 'confirmed');\n\n const anchorProvider = new anchor.AnchorProvider(\n connection,\n wallet,\n anchor.AnchorProvider.defaultOptions(),\n );\n\n const app_id = sol.appId;\n if (!app_id) throw new Error('app_id missing');\n\n let { tx, blockhash, lastValidBlockHeight } = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n sol.preInstructions,\n false,\n );\n\n // Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction\n const isLegacyTx = (t: Transaction | VersionedTransaction): boolean => {\n return 'recentBlockhash' in t && !('message' in t && 'staticAccountKeys' in (t as any).message);\n };\n\n // Refresh blockhash and lastValidBlockHeight\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(tx)) {\n (tx as Transaction).partialSign(kp);\n (tx as Transaction).recentBlockhash = blockhash;\n (tx as Transaction).lastValidBlockHeight = lastValidBlockHeight;\n (tx as Transaction).feePayer = kp.publicKey;\n } else {\n (tx as VersionedTransaction).sign([kp]);\n (tx as VersionedTransaction).message.recentBlockhash = blockhash;\n }\n\n // 3️⃣ Optional priority‑fee instruction\n\n const rawUnsigned = tx.serialize({ requireAllSignatures: false });\n const microLamports = await fetchPriorityFee(\n connection.rpcEndpoint,\n rawUnsigned\n );\n\n if (microLamports != null) {\n // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions\n if (isLegacyTx(tx)) {\n (tx as Transaction).instructions.unshift(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports })\n );\n (tx as Transaction).partialSign(kp);\n } else {\n // Rebuild the transaction with the new priority fee\n const roundTwo = await buildSetDocumentsTransaction(\n connection,\n sol.txArgs[0].idl,\n anchorProvider,\n kp.publicKey,\n {\n app_id,\n documents: sol.txArgs[0].setDocumentData,\n delete_paths: sol.txArgs[0].deletePaths,\n txData: sol.txArgs[0].txData\n },\n deduped,\n sol.lutKey,\n [ComputeBudgetProgram.setComputeUnitPrice({ microLamports }), ...sol.preInstructions],\n false,\n );\n tx = roundTwo.tx as VersionedTransaction;\n blockhash = roundTwo.blockhash;\n lastValidBlockHeight = roundTwo.lastValidBlockHeight;\n (tx as VersionedTransaction).sign([kp]);\n (tx as VersionedTransaction).message.recentBlockhash = blockhash;\n }\n }\n\n if (opts?.shouldSubmitTx === false) {\n return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };\n }\n\n // Submit and confirm using shared helper\n const { signature, txInfo } = await this.submitAndConfirmTransaction(tx, connection, { fetchTxInfo: true });\n\n return {\n transactionSignature: signature,\n blockNumber: txInfo?.slot ?? 0,\n gasUsed: txInfo?.meta?.fee.toString() ?? '0',\n data: txInfo?.meta,\n };\n }\n\n /* ----------------------------------------------------------- */\n async getNativeMethods() {\n return { keypair: this.keypair };\n }\n}\n","import { AuthProvider } from '@pooflabs/core';\nimport { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport * as crypto from 'crypto';\n\n/**\n * Server-side OffchainAuthProvider wrapper for the poofnet environment.\n *\n * For signMessage, this generates a mock signature using SHA-256 hashing.\n * This is used for offchain transaction signing.\n */\nexport class OffchainAuthProvider implements AuthProvider {\n private wrappedProvider: AuthProvider;\n\n constructor(wrappedProvider: AuthProvider) {\n this.wrappedProvider = wrappedProvider;\n }\n\n async login(): Promise<any> {\n return this.wrappedProvider.login();\n }\n\n async logout(): Promise<void> {\n return this.wrappedProvider.logout();\n }\n\n async restoreSession(): Promise<any> {\n return this.wrappedProvider.restoreSession();\n }\n\n async getNativeMethods(): Promise<any> {\n return this.wrappedProvider.getNativeMethods();\n }\n\n async signMessage(message: string): Promise<string> {\n // Delegate to wrapped provider for real signing\n return this.wrappedProvider.signMessage(message);\n }\n\n async signMessageMock(message: string): Promise<string> {\n // Generate mock signature (SHA-256 hash of message, base64 encoded)\n // This is used for offchain transaction signing\n const hash = crypto.createHash('sha256').update(message).digest('base64');\n return hash;\n }\n\n async signTransaction(transaction: Transaction | VersionedTransaction): Promise<Transaction | VersionedTransaction> {\n return (this.wrappedProvider as any).signTransaction(transaction);\n }\n\n /**\n * Sign and submit transaction - not supported in poofnet environment.\n * See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)\n * for the full implementation with blockhash handling and feePayer support.\n */\n async signAndSubmitTransaction(\n _transaction: Transaction | VersionedTransaction,\n _feePayer?: any\n ): Promise<string> {\n throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');\n }\n\n async runTransaction(evmTransactionData?: any, solTransactionData?: any, options?: any): Promise<any> {\n return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);\n }\n}\n","import { getConfig } from '@pooflabs/core';\nimport { AuthProvider } from '@pooflabs/core';\nimport { SolanaKeypairProvider } from './providers/solana-keypair-provider';\nimport { OffchainAuthProvider } from './providers/offchain-auth-provider';\n\nlet currentAuthProvider: AuthProvider | null = null;\n\nexport const SOLANA_DEVNET_RPC_URL = \"https://idelle-8nxsep-fast-devnet.helius-rpc.com\";\nexport const SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nexport const SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function getAuthProvider(): Promise<AuthProvider> {\n const config = await getConfig();\n\n if (currentAuthProvider) {\n // If provider exists but chain is \"offchain\" and it's not already wrapped, rewrap it\n if (config.chain === \"offchain\" && !(currentAuthProvider instanceof OffchainAuthProvider)) {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n return currentAuthProvider;\n }\n\n currentAuthProvider = await matchAuthProvider(config.rpcUrl ?? null);\n \n // Wrap with OffchainAuthProvider for offchain chain\n if (config.chain === \"offchain\") {\n currentAuthProvider = new OffchainAuthProvider(currentAuthProvider);\n }\n\n return currentAuthProvider;\n}\n\nexport async function matchAuthProvider(rpcUrl: string | null): Promise<AuthProvider> {\n return new SolanaKeypairProvider(rpcUrl);\n}","import { AuthProvider } from '@pooflabs/core';\nimport { getAuthProvider } from './auth';\nimport { init as configInit, ClientConfig } from '@pooflabs/core';\n\nlet authProviderInstance: AuthProvider | null = null;\n\nconst SOLANA_DEVNET_RPC_URL = \"https://api.devnet.solana.com\";\nconst SOLANA_MAINNET_RPC_URL = \"https://celestia-cegncv-fast-mainnet.helius-rpc.com\";\nconst SURFNET_RPC_URL = \"https://surfpool.fly.dev\";\n\nexport async function init(newConfig: Partial<ClientConfig>): Promise<void> {\n // Initialize config first so getAuthProvider can access it\n // Server-side skips backend init since it already has all needed config\n await configInit({ ...newConfig, isServer: true, skipBackendInit: true });\n\n // Get the auth provider (which will wrap it if chain is \"offchain\")\n authProviderInstance = await getAuthProvider();\n\n // Update config with the wrapped provider\n await configInit({ ...newConfig, authProvider: authProviderInstance, isServer: true, skipBackendInit: true });\n}","import { getIdToken as getIdTokenCore } from '@pooflabs/core';\n\n// Wrapper for getIdToken - passes isServer=true for server-side usage\nexport async function getIdToken(): Promise<string | null> {\n return getIdTokenCore(true);\n}\n"],"names":["configInit","getIdTokenCore"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pooflabs/server",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.16",
|
|
4
4
|
"description": "Server SDK for Poof API - Node.js/Backend implementation",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@coral-xyz/anchor": "^0.31.1",
|
|
49
|
-
"@pooflabs/core": "0.0.
|
|
49
|
+
"@pooflabs/core": "0.0.21",
|
|
50
50
|
"@solana/spl-token": "^0.4.12",
|
|
51
51
|
"@solana/web3.js": "^1.69.0",
|
|
52
52
|
"axios": "^1.9.0",
|