@pooflabs/server 0.0.15 → 0.0.17

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.
@@ -16,5 +16,11 @@ export declare class OffchainAuthProvider implements AuthProvider {
16
16
  signMessage(message: string): Promise<string>;
17
17
  signMessageMock(message: string): Promise<string>;
18
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>;
19
25
  runTransaction(evmTransactionData?: any, solTransactionData?: any, options?: any): Promise<any>;
20
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/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
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, signMessage, signTransaction } 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
- if (transaction instanceof web3_js.Transaction) {
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 if (transaction instanceof web3_js.VersionedTransaction) {
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
- if (tx instanceof web3_js.Transaction) {
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 if (tx instanceof web3_js.VersionedTransaction) {
231
+ else {
131
232
  tx.sign([kp]);
132
233
  }
133
234
  return tx;
134
235
  },
135
236
  signAllTransactions: async (txs) => txs.map((t) => {
136
- if (t instanceof web3_js.Transaction) {
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 if (t instanceof web3_js.VersionedTransaction) {
241
+ else {
140
242
  t.sign([kp]);
141
243
  }
142
244
  return t;
@@ -182,19 +284,8 @@ class SolanaKeypairProvider {
182
284
  return toReturn;
183
285
  }
184
286
  async runTransactionInner(sol, opts, wallet, kp, deduped) {
185
- var _a, _b, _c, _d;
186
- let rpcUrl = this.networkUrl;
187
- if (this.networkUrl == null) {
188
- if (sol.network === 'solana_devnet') {
189
- rpcUrl = SOLANA_DEVNET_RPC_URL;
190
- }
191
- else if (sol.network === 'solana_mainnet') {
192
- rpcUrl = SOLANA_MAINNET_RPC_URL;
193
- }
194
- else {
195
- rpcUrl = SURFNET_RPC_URL;
196
- }
197
- }
287
+ var _a, _b, _c;
288
+ let rpcUrl = this.getRpcUrl(sol.network);
198
289
  const connection = new web3_js.Connection(rpcUrl, 'confirmed');
199
290
  const anchorProvider = new anchor__namespace.AnchorProvider(connection, wallet, anchor__namespace.AnchorProvider.defaultOptions());
200
291
  const app_id = sol.appId;
@@ -206,14 +297,19 @@ class SolanaKeypairProvider {
206
297
  delete_paths: sol.txArgs[0].deletePaths,
207
298
  txData: sol.txArgs[0].txData
208
299
  }, deduped, sol.lutKey, sol.preInstructions, false);
300
+ // Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction
301
+ const isLegacyTx = (t) => {
302
+ return 'recentBlockhash' in t && !('message' in t && 'staticAccountKeys' in t.message);
303
+ };
209
304
  // Refresh blockhash and lastValidBlockHeight
210
- if (tx instanceof web3_js.Transaction) {
305
+ // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
306
+ if (isLegacyTx(tx)) {
211
307
  tx.partialSign(kp);
212
308
  tx.recentBlockhash = blockhash;
213
309
  tx.lastValidBlockHeight = lastValidBlockHeight;
214
310
  tx.feePayer = kp.publicKey;
215
311
  }
216
- else if (tx instanceof web3_js.VersionedTransaction) {
312
+ else {
217
313
  tx.sign([kp]);
218
314
  tx.message.recentBlockhash = blockhash;
219
315
  }
@@ -221,11 +317,12 @@ class SolanaKeypairProvider {
221
317
  const rawUnsigned = tx.serialize({ requireAllSignatures: false });
222
318
  const microLamports = await fetchPriorityFee(connection.rpcEndpoint, rawUnsigned);
223
319
  if (microLamports != null) {
224
- if (tx instanceof web3_js.Transaction) {
320
+ // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
321
+ if (isLegacyTx(tx)) {
225
322
  tx.instructions.unshift(web3_js.ComputeBudgetProgram.setComputeUnitPrice({ microLamports }));
226
323
  tx.partialSign(kp);
227
324
  }
228
- else if (tx instanceof web3_js.VersionedTransaction) {
325
+ else {
229
326
  // Rebuild the transaction with the new priority fee
230
327
  const roundTwo = await core.buildSetDocumentsTransaction(connection, sol.txArgs[0].idl, anchorProvider, kp.publicKey, {
231
328
  app_id,
@@ -243,31 +340,13 @@ class SolanaKeypairProvider {
243
340
  if ((opts === null || opts === void 0 ? void 0 : opts.shouldSubmitTx) === false) {
244
341
  return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };
245
342
  }
246
- const sig = await connection.sendRawTransaction(tx.serialize(), {
247
- preflightCommitment: "confirmed",
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
- });
343
+ // Submit and confirm using shared helper
344
+ const { signature, txInfo } = await this.submitAndConfirmTransaction(tx, connection, { fetchTxInfo: true });
266
345
  return {
267
- transactionSignature: sig,
268
- blockNumber: (_b = info === null || info === void 0 ? void 0 : info.slot) !== null && _b !== void 0 ? _b : 0,
269
- gasUsed: (_d = (_c = info === null || info === void 0 ? void 0 : info.meta) === null || _c === void 0 ? void 0 : _c.fee.toString()) !== null && _d !== void 0 ? _d : '0',
270
- data: info === null || info === void 0 ? void 0 : info.meta,
346
+ transactionSignature: signature,
347
+ blockNumber: (_a = txInfo === null || txInfo === void 0 ? void 0 : txInfo.slot) !== null && _a !== void 0 ? _a : 0,
348
+ 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',
349
+ data: txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta,
271
350
  };
272
351
  }
273
352
  /* ----------------------------------------------------------- */
@@ -309,7 +388,15 @@ class OffchainAuthProvider {
309
388
  return hash;
310
389
  }
311
390
  async signTransaction(transaction) {
312
- return this.wrappedProvider.signTransaction(transaction);
391
+ throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');
392
+ }
393
+ /**
394
+ * Sign and submit transaction - not supported in poofnet environment.
395
+ * See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)
396
+ * for the full implementation with blockhash handling and feePayer support.
397
+ */
398
+ async signAndSubmitTransaction(_transaction, _feePayer) {
399
+ throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');
313
400
  }
314
401
  async runTransaction(evmTransactionData, solTransactionData, options) {
315
402
  return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);
@@ -397,6 +484,10 @@ Object.defineProperty(exports, "setMany", {
397
484
  enumerable: true,
398
485
  get: function () { return core.setMany; }
399
486
  });
487
+ Object.defineProperty(exports, "signAndSubmitTransaction", {
488
+ enumerable: true,
489
+ get: function () { return core.signAndSubmitTransaction; }
490
+ });
400
491
  Object.defineProperty(exports, "signMessage", {
401
492
  enumerable: true,
402
493
  get: function () { return core.signMessage; }
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 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 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","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.getRpcUrl(sol.network);\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 throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');\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, signMessage, signTransaction, 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 { Transaction, VersionedTransaction, Connection, ComputeBudgetProgram, Keypair } from '@solana/web3.js';
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
- if (transaction instanceof Transaction) {
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 if (transaction instanceof VersionedTransaction) {
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
- if (tx instanceof Transaction) {
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 if (tx instanceof VersionedTransaction) {
211
+ else {
111
212
  tx.sign([kp]);
112
213
  }
113
214
  return tx;
114
215
  },
115
216
  signAllTransactions: async (txs) => txs.map((t) => {
116
- if (t instanceof Transaction) {
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 if (t instanceof VersionedTransaction) {
221
+ else {
120
222
  t.sign([kp]);
121
223
  }
122
224
  return t;
@@ -162,19 +264,8 @@ class SolanaKeypairProvider {
162
264
  return toReturn;
163
265
  }
164
266
  async runTransactionInner(sol, opts, wallet, kp, deduped) {
165
- var _a, _b, _c, _d;
166
- let rpcUrl = this.networkUrl;
167
- if (this.networkUrl == null) {
168
- if (sol.network === 'solana_devnet') {
169
- rpcUrl = SOLANA_DEVNET_RPC_URL;
170
- }
171
- else if (sol.network === 'solana_mainnet') {
172
- rpcUrl = SOLANA_MAINNET_RPC_URL;
173
- }
174
- else {
175
- rpcUrl = SURFNET_RPC_URL;
176
- }
177
- }
267
+ var _a, _b, _c;
268
+ let rpcUrl = this.getRpcUrl(sol.network);
178
269
  const connection = new Connection(rpcUrl, 'confirmed');
179
270
  const anchorProvider = new anchor.AnchorProvider(connection, wallet, anchor.AnchorProvider.defaultOptions());
180
271
  const app_id = sol.appId;
@@ -186,14 +277,19 @@ class SolanaKeypairProvider {
186
277
  delete_paths: sol.txArgs[0].deletePaths,
187
278
  txData: sol.txArgs[0].txData
188
279
  }, deduped, sol.lutKey, sol.preInstructions, false);
280
+ // Helper for duck typing - checks if transaction is legacy Transaction vs VersionedTransaction
281
+ const isLegacyTx = (t) => {
282
+ return 'recentBlockhash' in t && !('message' in t && 'staticAccountKeys' in t.message);
283
+ };
189
284
  // Refresh blockhash and lastValidBlockHeight
190
- if (tx instanceof Transaction) {
285
+ // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
286
+ if (isLegacyTx(tx)) {
191
287
  tx.partialSign(kp);
192
288
  tx.recentBlockhash = blockhash;
193
289
  tx.lastValidBlockHeight = lastValidBlockHeight;
194
290
  tx.feePayer = kp.publicKey;
195
291
  }
196
- else if (tx instanceof VersionedTransaction) {
292
+ else {
197
293
  tx.sign([kp]);
198
294
  tx.message.recentBlockhash = blockhash;
199
295
  }
@@ -201,11 +297,12 @@ class SolanaKeypairProvider {
201
297
  const rawUnsigned = tx.serialize({ requireAllSignatures: false });
202
298
  const microLamports = await fetchPriorityFee(connection.rpcEndpoint, rawUnsigned);
203
299
  if (microLamports != null) {
204
- if (tx instanceof Transaction) {
300
+ // Use duck typing instead of instanceof to handle multiple @solana/web3.js versions
301
+ if (isLegacyTx(tx)) {
205
302
  tx.instructions.unshift(ComputeBudgetProgram.setComputeUnitPrice({ microLamports }));
206
303
  tx.partialSign(kp);
207
304
  }
208
- else if (tx instanceof VersionedTransaction) {
305
+ else {
209
306
  // Rebuild the transaction with the new priority fee
210
307
  const roundTwo = await buildSetDocumentsTransaction(connection, sol.txArgs[0].idl, anchorProvider, kp.publicKey, {
211
308
  app_id,
@@ -223,31 +320,13 @@ class SolanaKeypairProvider {
223
320
  if ((opts === null || opts === void 0 ? void 0 : opts.shouldSubmitTx) === false) {
224
321
  return { signedTransaction: tx, blockNumber: 0, gasUsed: '0', data: '' };
225
322
  }
226
- const sig = await connection.sendRawTransaction(tx.serialize(), {
227
- preflightCommitment: "confirmed",
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
- });
323
+ // Submit and confirm using shared helper
324
+ const { signature, txInfo } = await this.submitAndConfirmTransaction(tx, connection, { fetchTxInfo: true });
246
325
  return {
247
- transactionSignature: sig,
248
- blockNumber: (_b = info === null || info === void 0 ? void 0 : info.slot) !== null && _b !== void 0 ? _b : 0,
249
- gasUsed: (_d = (_c = info === null || info === void 0 ? void 0 : info.meta) === null || _c === void 0 ? void 0 : _c.fee.toString()) !== null && _d !== void 0 ? _d : '0',
250
- data: info === null || info === void 0 ? void 0 : info.meta,
326
+ transactionSignature: signature,
327
+ blockNumber: (_a = txInfo === null || txInfo === void 0 ? void 0 : txInfo.slot) !== null && _a !== void 0 ? _a : 0,
328
+ 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',
329
+ data: txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta,
251
330
  };
252
331
  }
253
332
  /* ----------------------------------------------------------- */
@@ -289,7 +368,15 @@ class OffchainAuthProvider {
289
368
  return hash;
290
369
  }
291
370
  async signTransaction(transaction) {
292
- return this.wrappedProvider.signTransaction(transaction);
371
+ throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');
372
+ }
373
+ /**
374
+ * Sign and submit transaction - not supported in poofnet environment.
375
+ * See the real providers (PhantomWalletProvider, PrivyWalletProvider, SolanaKeypairProvider)
376
+ * for the full implementation with blockhash handling and feePayer support.
377
+ */
378
+ async signAndSubmitTransaction(_transaction, _feePayer) {
379
+ throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');
293
380
  }
294
381
  async runTransaction(evmTransactionData, solTransactionData, options) {
295
382
  return this.wrappedProvider.runTransaction(evmTransactionData, solTransactionData, options);
@@ -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 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 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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"}
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.getRpcUrl(sol.network);\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 throw new Error('Poofnet does not support real Solana transactions. Deploy your project to mainnet to use this feature.');\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.15",
3
+ "version": "0.0.17",
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.20",
49
+ "@pooflabs/core": "0.0.23",
50
50
  "@solana/spl-token": "^0.4.12",
51
51
  "@solana/web3.js": "^1.69.0",
52
52
  "axios": "^1.9.0",