@bounded-sh/core 0.0.64 → 0.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/decline.d.ts +2 -0
- package/dist/client/functions.d.ts +8 -0
- package/dist/client/live-effects.d.ts +4 -2
- package/dist/client/operations.d.ts +90 -5
- package/dist/client/reconcile.d.ts +51 -0
- package/dist/client/solana-operations.d.ts +13 -3
- package/dist/{index-BIdD2yUB.js → index-DNZifL5j.js} +4015 -3326
- package/dist/index-DNZifL5j.js.map +1 -0
- package/dist/{index-BQ6e4MeP.mjs → index-TyXiW4Uf.mjs} +4014 -3325
- package/dist/index-TyXiW4Uf.mjs.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/dist/{realtime-store-Bz4Ob6K6.js → realtime-store-CINyAkPw.js} +2 -3
- package/dist/{realtime-store-Bz4Ob6K6.js.map → realtime-store-CINyAkPw.js.map} +1 -1
- package/dist/{realtime-store-DKngqviG.mjs → realtime-store-CpbnXM7q.mjs} +2 -3
- package/dist/{realtime-store-DKngqviG.mjs.map → realtime-store-CpbnXM7q.mjs.map} +1 -1
- package/dist/{solana-message-B0NoE4nC.js → solana-message-Bycv-L5n.js} +10 -8
- package/dist/solana-message-Bycv-L5n.js.map +1 -0
- package/dist/{solana-message-QUfJi1Qm.mjs → solana-message-DXXwC95Z.mjs} +10 -8
- package/dist/solana-message-DXXwC95Z.mjs.map +1 -0
- package/dist/{solana-operations-B2Oy9T7D.mjs → solana-operations-ChHG25O0.mjs} +161 -88
- package/dist/solana-operations-ChHG25O0.mjs.map +1 -0
- package/dist/{solana-operations-ngqIkN9W.js → solana-operations-Dm_4VnlB.js} +162 -88
- package/dist/solana-operations-Dm_4VnlB.js.map +1 -0
- package/dist/types.d.ts +370 -4
- package/dist/utils/auth-api.d.ts +15 -2
- package/dist/utils/core-platform.d.ts +7 -0
- package/dist/utils/rn-session-manager.d.ts +57 -7
- package/dist/utils/server-session-manager.d.ts +6 -1
- package/dist/utils/sol/sol-accessors.d.ts +0 -27
- package/dist/utils/sol/solana-message.d.ts +1 -1
- package/package.json +2 -2
- package/dist/index-BIdD2yUB.js.map +0 -1
- package/dist/index-BQ6e4MeP.mjs.map +0 -1
- package/dist/sol-utils-Cwxyl2h6.js +0 -232
- package/dist/sol-utils-Cwxyl2h6.js.map +0 -1
- package/dist/sol-utils-DVjPeoMy.mjs +0 -229
- package/dist/sol-utils-DVjPeoMy.mjs.map +0 -1
- package/dist/solana-message-B0NoE4nC.js.map +0 -1
- package/dist/solana-message-QUfJi1Qm.mjs.map +0 -1
- package/dist/solana-operations-B2Oy9T7D.mjs.map +0 -1
- package/dist/solana-operations-ngqIkN9W.js.map +0 -1
- package/dist/utils/sol/openTv7fbpYSseNHYmCZFZ1CZgj4r8D9fKNgEz1qo6FDevnet-program.d.ts +0 -2906
- package/dist/utils/sol/openTv7fbpYSseNHYmCZFZ1CZgj4r8D9fKNgEz1qo6FMainnet-program.d.ts +0 -2906
- package/dist/utils/sol/sol-utils.d.ts +0 -34
|
@@ -1,22 +1,24 @@
|
|
|
1
|
-
import { g as getConfig } from './index-
|
|
1
|
+
import { g as getConfig } from './index-TyXiW4Uf.mjs';
|
|
2
2
|
import 'axios';
|
|
3
3
|
import 'tweetnacl';
|
|
4
4
|
import 'reconnecting-websocket';
|
|
5
|
-
import 'bn.js';
|
|
6
5
|
|
|
7
6
|
// NOTE: this message text must stay BYTE-IDENTICAL to what the wallet-auth
|
|
8
7
|
// verifier reconstructs — any drift breaks every SIWS login.
|
|
9
|
-
async function genSolanaMessage(address, nonce) {
|
|
8
|
+
async function genSolanaMessage(address, nonce, appIdOverride) {
|
|
10
9
|
var _a, _b;
|
|
11
10
|
/* Domain / origin aren't available server-side – fall back to envs
|
|
12
11
|
or simple placeholders. */
|
|
13
12
|
const domain = (typeof process !== 'undefined' && ((_a = process.env) === null || _a === void 0 ? void 0 : _a.SESSION_DOMAIN)) || "server";
|
|
14
13
|
const origin = (typeof process !== 'undefined' && ((_b = process.env) === null || _b === void 0 ? void 0 : _b.SESSION_ORIGIN)) || "server";
|
|
15
14
|
// SECURITY (audit-4 CRITICAL-1): bind the signed prompt to the target app.
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
|
|
15
|
+
// A server wallet client passes its snapshotted appId (appIdOverride) so the
|
|
16
|
+
// signed "App ID" stays bound to the app the wallet client was created against
|
|
17
|
+
// even after a later global init() (CTA-05); the default path reads the SAME
|
|
18
|
+
// global config that genAuthNonce + /session use, so the signed "App ID" is
|
|
19
|
+
// guaranteed to equal the app the session is minted for; the server verifier
|
|
20
|
+
// rejects any mismatch.
|
|
21
|
+
const appId = appIdOverride !== null && appIdOverride !== void 0 ? appIdOverride : (await getConfig()).appId;
|
|
20
22
|
const statement = "Sign this message to authenticate with our application.";
|
|
21
23
|
const currentDate = new Date();
|
|
22
24
|
const issuedAt = currentDate.toISOString();
|
|
@@ -32,4 +34,4 @@ async function genSolanaMessage(address, nonce) {
|
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
export { genSolanaMessage };
|
|
35
|
-
//# sourceMappingURL=solana-message-
|
|
37
|
+
//# sourceMappingURL=solana-message-DXXwC95Z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-message-DXXwC95Z.mjs","sources":["../.rollup-tmp/utils/sol/solana-message.js"],"sourcesContent":["import { getConfig } from \"../../client/config\";\n// NOTE: this message text must stay BYTE-IDENTICAL to what the wallet-auth\n// verifier reconstructs — any drift breaks every SIWS login.\nexport async function genSolanaMessage(address, nonce, appIdOverride) {\n var _a, _b;\n /* Domain / origin aren't available server-side – fall back to envs\n or simple placeholders. */\n const domain = (typeof process !== 'undefined' && ((_a = process.env) === null || _a === void 0 ? void 0 : _a.SESSION_DOMAIN)) || \"server\";\n const origin = (typeof process !== 'undefined' && ((_b = process.env) === null || _b === void 0 ? void 0 : _b.SESSION_ORIGIN)) || \"server\";\n // SECURITY (audit-4 CRITICAL-1): bind the signed prompt to the target app.\n // A server wallet client passes its snapshotted appId (appIdOverride) so the\n // signed \"App ID\" stays bound to the app the wallet client was created against\n // even after a later global init() (CTA-05); the default path reads the SAME\n // global config that genAuthNonce + /session use, so the signed \"App ID\" is\n // guaranteed to equal the app the session is minted for; the server verifier\n // rejects any mismatch.\n const appId = appIdOverride !== null && appIdOverride !== void 0 ? appIdOverride : (await getConfig()).appId;\n const statement = \"Sign this message to authenticate with our application.\";\n const currentDate = new Date();\n const issuedAt = currentDate.toISOString();\n const expirationTime = new Date(currentDate.getTime() + 5 * 60 * 1000).toISOString();\n return `${statement}\\n\\n` +\n `Wallet address:\\n${address}\\n\\n` +\n `App ID: ${appId}\\n` +\n `Domain: ${domain}\\n` +\n `Origin: ${origin}\\n` +\n `Nonce: ${nonce}\\n` +\n `Issued At: ${issuedAt}\\n` +\n `Expiration Time: ${expirationTime}`;\n}\n"],"names":[],"mappings":";;;;;AACA;AACA;AACO,eAAe,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE;AACtE,IAAI,IAAI,EAAE,EAAE,EAAE;AACd;AACA;AACA,IAAI,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,KAAK,WAAW,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,QAAQ;AAC9I,IAAI,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,KAAK,WAAW,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,QAAQ;AAC9I;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,MAAM,KAAK,GAAG,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,MAAM,GAAG,aAAa,GAAG,CAAC,MAAM,SAAS,EAAE,EAAE,KAAK;AAChH,IAAI,MAAM,SAAS,GAAG,yDAAyD;AAC/E,IAAI,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE;AAClC,IAAI,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE;AAC9C,IAAI,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;AACxF,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;AAC7B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC;AACzC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;AAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;AAC3B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC;AAClC,QAAQ,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAC5C;;;;"}
|
|
@@ -1,9 +1,94 @@
|
|
|
1
|
-
import { g as getConfig, b as bufferExports } from './index-
|
|
1
|
+
import { g as getConfig, b as bufferExports } from './index-TyXiW4Uf.mjs';
|
|
2
2
|
import 'axios';
|
|
3
3
|
import 'tweetnacl';
|
|
4
4
|
import 'reconnecting-websocket';
|
|
5
|
-
import 'bn.js';
|
|
6
5
|
|
|
6
|
+
const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
7
|
+
/**
|
|
8
|
+
* Minimal base58 encoder, used ONLY to derive a Solana transaction signature
|
|
9
|
+
* from already-signed bytes. Core deliberately does not take a `bs58`
|
|
10
|
+
* dependency for eighteen lines of arithmetic.
|
|
11
|
+
*/
|
|
12
|
+
function encodeBase58(bytes) {
|
|
13
|
+
if (bytes.length === 0)
|
|
14
|
+
return '';
|
|
15
|
+
const digits = [0];
|
|
16
|
+
for (const byte of bytes) {
|
|
17
|
+
let carry = byte;
|
|
18
|
+
for (let i = 0; i < digits.length; i++) {
|
|
19
|
+
carry += digits[i] << 8;
|
|
20
|
+
digits[i] = carry % 58;
|
|
21
|
+
carry = (carry / 58) | 0;
|
|
22
|
+
}
|
|
23
|
+
while (carry > 0) {
|
|
24
|
+
digits.push(carry % 58);
|
|
25
|
+
carry = (carry / 58) | 0;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
let out = '';
|
|
29
|
+
for (let i = 0; i < bytes.length && bytes[i] === 0; i++)
|
|
30
|
+
out += BASE58_ALPHABET[0];
|
|
31
|
+
for (let i = digits.length - 1; i >= 0; i--)
|
|
32
|
+
out += BASE58_ALPHABET[digits[i]];
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Derive the transaction signature from the SIGNED bytes, before broadcasting.
|
|
37
|
+
*
|
|
38
|
+
* Without this the signature is only learned when `sendRawTransaction` resolves,
|
|
39
|
+
* so an RPC that accepted the bytes but whose response was lost throws with
|
|
40
|
+
* nothing recorded — and a retry builds a DIFFERENT transaction that can land
|
|
41
|
+
* beside the first.
|
|
42
|
+
*/
|
|
43
|
+
function deriveTransactionSignature(signedTransaction) {
|
|
44
|
+
var _a;
|
|
45
|
+
const signature = (_a = signedTransaction.signatures) === null || _a === void 0 ? void 0 : _a[0];
|
|
46
|
+
if (!signature || signature.length === 0) {
|
|
47
|
+
throw new Error('Signed Solana transaction carries no signature to broadcast');
|
|
48
|
+
}
|
|
49
|
+
if (signature.every(byte => byte === 0)) {
|
|
50
|
+
throw new Error('Signed Solana transaction carries an empty fee-payer signature');
|
|
51
|
+
}
|
|
52
|
+
return encodeBase58(Uint8Array.from(signature));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Whether a send failure PROVES the transaction was never accepted. A preflight
|
|
56
|
+
* rejection, a signature-verification failure, or an oversized/invalid
|
|
57
|
+
* transaction is definitive and keeps throwing. A transport failure (timeout,
|
|
58
|
+
* socket reset, aborted fetch) is ambiguous — the node may hold the bytes — and
|
|
59
|
+
* must resolve as `submitted` carrying the pre-derived signature.
|
|
60
|
+
*
|
|
61
|
+
* "already processed" is deliberately NOT definitive: it means the signature
|
|
62
|
+
* landed, which is the opposite of a failure.
|
|
63
|
+
*/
|
|
64
|
+
const DEFINITIVE_SEND_FAILURE_MARKERS = [
|
|
65
|
+
'simulation failed',
|
|
66
|
+
'preflight',
|
|
67
|
+
'blockhash not found',
|
|
68
|
+
'signature verification failure',
|
|
69
|
+
'transaction too large',
|
|
70
|
+
'invalid transaction',
|
|
71
|
+
'insufficient funds for rent',
|
|
72
|
+
'attempt to debit an account but found no record of a prior credit',
|
|
73
|
+
];
|
|
74
|
+
function isDefinitiveSolanaSendFailure(error) {
|
|
75
|
+
var _a, _b, _c;
|
|
76
|
+
const err = error;
|
|
77
|
+
if (err && Array.isArray(err.logs))
|
|
78
|
+
return true;
|
|
79
|
+
if (err && String((_a = err.name) !== null && _a !== void 0 ? _a : '') === 'SendTransactionError')
|
|
80
|
+
return true;
|
|
81
|
+
const message = String((_c = (_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err) !== null && _c !== void 0 ? _c : '').toLowerCase();
|
|
82
|
+
if (!message)
|
|
83
|
+
return false;
|
|
84
|
+
if (message.includes('already been processed') || message.includes('already processed'))
|
|
85
|
+
return false;
|
|
86
|
+
return DEFINITIVE_SEND_FAILURE_MARKERS.some(marker => message.includes(marker));
|
|
87
|
+
}
|
|
88
|
+
function errorText(error) {
|
|
89
|
+
const message = error === null || error === void 0 ? void 0 : error.message;
|
|
90
|
+
return typeof message === 'string' && message.length > 0 ? message : String(error);
|
|
91
|
+
}
|
|
7
92
|
const BOUNDED_PROGRAM_MAINNET = ['open', 'Tv7fbpYSseNHYmCZFZ1CZgj4r8D9fKNgEz1qo6F'].join('');
|
|
8
93
|
const BOUNDED_PROGRAM_DEVNET = ['open', 'Tv7fbpYSseNHYmCZFZ1CZgj4r8D9fKNgEz1qo6F'].join('');
|
|
9
94
|
const COMPUTE_BUDGET_PROGRAM = 'ComputeBudget111111111111111111111111111111';
|
|
@@ -152,111 +237,99 @@ function deserializeAndValidateServerTransaction(serializedTransaction, Versione
|
|
|
152
237
|
assertSamePathSet(label, expectedWritePaths, actualWritePaths);
|
|
153
238
|
return transaction;
|
|
154
239
|
}
|
|
155
|
-
function isHexString(value) {
|
|
156
|
-
if (typeof value !== 'string')
|
|
157
|
-
return false;
|
|
158
|
-
const testValue = value.startsWith('-') ? value.slice(1) : value;
|
|
159
|
-
return /^(0x)?[0-9a-fA-F]+$/.test(testValue);
|
|
160
|
-
}
|
|
161
|
-
async function handleSolanaTransaction(tx, authProvider, options, expectedWritePaths) {
|
|
162
|
-
var _a, _b, _c, _d, _e;
|
|
163
|
-
const chainSdk = await import('@solana/web3.js');
|
|
164
|
-
const { PublicKey, SystemProgram, TransactionInstruction, VersionedTransaction } = chainSdk;
|
|
165
|
-
const solTransactionData = {
|
|
166
|
-
remainingAccounts: tx.remainingAccounts,
|
|
167
|
-
setDocumentData: tx.transactionArgs.setDocumentData,
|
|
168
|
-
deletePaths: tx.transactionArgs.deletePaths,
|
|
169
|
-
idl: tx.idl,
|
|
170
|
-
txData: (_b = (_a = tx.txData) === null || _a === void 0 ? void 0 : _a.map((txData) => ({
|
|
171
|
-
pluginFunctionKey: txData.pluginFunctionKey,
|
|
172
|
-
txData: bufferExports.Buffer.from(txData.txData),
|
|
173
|
-
raIndices: (() => {
|
|
174
|
-
const raw = txData.raIndices;
|
|
175
|
-
if (raw == null)
|
|
176
|
-
return bufferExports.Buffer.alloc(0);
|
|
177
|
-
if (bufferExports.Buffer.isBuffer(raw))
|
|
178
|
-
return raw;
|
|
179
|
-
if (raw instanceof Uint8Array)
|
|
180
|
-
return bufferExports.Buffer.from(raw);
|
|
181
|
-
const arrayLike = Array.isArray(raw) ? raw :
|
|
182
|
-
raw && typeof raw === 'object' && Array.isArray(raw.data) ? raw.data :
|
|
183
|
-
(() => { throw new Error(`raIndices has unexpected shape: ${typeof raw}`); })();
|
|
184
|
-
return bufferExports.Buffer.from(arrayLike.map((raIndex) => {
|
|
185
|
-
const value = isHexString(raIndex) ? parseInt(raIndex, 16) : Number(raIndex);
|
|
186
|
-
if (!Number.isInteger(value) || value < 0 || value > 255) {
|
|
187
|
-
throw new Error(`raIndex ${raIndex} is not a valid u8 (must be integer in 0..255)`);
|
|
188
|
-
}
|
|
189
|
-
return value;
|
|
190
|
-
}));
|
|
191
|
-
})(),
|
|
192
|
-
}))) !== null && _b !== void 0 ? _b : [],
|
|
193
|
-
};
|
|
194
|
-
const config = await getConfig();
|
|
195
|
-
if (tx.signedTransaction) {
|
|
196
|
-
deserializeAndValidateServerTransaction(tx.signedTransaction, VersionedTransaction, {
|
|
197
|
-
label: 'Server signedTransaction', expectedAppId: config.appId, expectedWritePaths,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
const solTransaction = {
|
|
201
|
-
appId: config.appId,
|
|
202
|
-
txArgs: [solTransactionData],
|
|
203
|
-
lutKey: (_c = tx.lutAddress) !== null && _c !== void 0 ? _c : null,
|
|
204
|
-
additionalLutAddresses: tx.additionalLutAddresses,
|
|
205
|
-
network: tx.network,
|
|
206
|
-
preInstructions: (_e = (_d = tx.preInstructions) === null || _d === void 0 ? void 0 : _d.map((ix, index) => {
|
|
207
|
-
var _a;
|
|
208
|
-
const keys = (_a = ix.keys) === null || _a === void 0 ? void 0 : _a.map((key) => ({ pubkey: new PublicKey(key.pubkey), isSigner: key.isSigner, isWritable: key.isWritable }));
|
|
209
|
-
const programId = ix.programId === SYSTEM_PROGRAM_ID ? SystemProgram.programId : new PublicKey(ix.programId);
|
|
210
|
-
const instruction = new TransactionInstruction({ keys, programId, data: bufferExports.Buffer.from(ix.data) });
|
|
211
|
-
if (instruction.programId.equals(SystemProgram.programId)) {
|
|
212
|
-
throw new Error(`Server preInstruction[${index}] contains unauthorized System Program preInstruction`);
|
|
213
|
-
}
|
|
214
|
-
return instruction;
|
|
215
|
-
})) !== null && _e !== void 0 ? _e : [],
|
|
216
|
-
signedTransaction: tx.signedTransaction,
|
|
217
|
-
};
|
|
218
|
-
return authProvider.runTransaction(undefined, solTransaction, options);
|
|
219
|
-
}
|
|
220
240
|
async function handlePreBuiltTransaction(tx, authProvider, options, expectedWritePaths) {
|
|
221
|
-
var _a, _b, _c, _d, _e;
|
|
241
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
222
242
|
const { Connection, VersionedTransaction } = await import('@solana/web3.js');
|
|
223
|
-
|
|
243
|
+
// Honor a wallet client's immutable config snapshot for the expected app-id
|
|
244
|
+
// binding and RPC endpoint (CTA-05); otherwise read the global init() config.
|
|
245
|
+
const config = (_b = (_a = options === null || options === void 0 ? void 0 : options._overrides) === null || _a === void 0 ? void 0 : _a._config) !== null && _b !== void 0 ? _b : await getConfig();
|
|
224
246
|
const transaction = deserializeAndValidateServerTransaction(tx.serializedTransaction, VersionedTransaction, {
|
|
225
247
|
label: 'Pre-built transaction', expectedAppId: config.appId, expectedWritePaths,
|
|
226
248
|
});
|
|
227
249
|
const shouldSubmit = (options === null || options === void 0 ? void 0 : options.shouldSubmitTx) !== false;
|
|
228
|
-
const rpcUrl = (
|
|
229
|
-
|
|
250
|
+
const rpcUrl = (_c = config.rpcUrl) === null || _c === void 0 ? void 0 : _c.trim();
|
|
251
|
+
const injectedRpc = (_d = options === null || options === void 0 ? void 0 : options._overrides) === null || _d === void 0 ? void 0 : _d._solanaRpc;
|
|
252
|
+
if (shouldSubmit && !rpcUrl && !injectedRpc) {
|
|
230
253
|
throw new Error(`Pre-built Solana transaction submission requires init({ rpcUrl }) for ${tx.network}`);
|
|
254
|
+
}
|
|
231
255
|
const signedTx = await authProvider.signTransaction(transaction);
|
|
232
256
|
const rawTx = signedTx.serialize();
|
|
257
|
+
const signedTransaction = bufferExports.Buffer.from(rawTx).toString('base64');
|
|
258
|
+
// Keep the worker's expiry fence instead of discarding it: it is what makes
|
|
259
|
+
// bounded same-signature reconciliation (and therefore the retry-safe
|
|
260
|
+
// `expired_not_landed` exit) possible at all.
|
|
261
|
+
const fence = { blockhash: tx.blockhash, lastValidBlockHeight: tx.lastValidBlockHeight };
|
|
233
262
|
if (!shouldSubmit) {
|
|
234
|
-
|
|
263
|
+
// Signed and NOT sent. There is no signature and nothing to mirror.
|
|
264
|
+
return { outcome: 'signed', lane: 'solana', transactionSignature: null, signedTransaction, fence };
|
|
265
|
+
}
|
|
266
|
+
// Derive the signature from the signed bytes BEFORE broadcasting, so a send
|
|
267
|
+
// whose response is lost still yields a reconcilable identifier.
|
|
268
|
+
const signature = deriveTransactionSignature(signedTx);
|
|
269
|
+
const connection = injectedRpc !== null && injectedRpc !== void 0 ? injectedRpc : new Connection(rpcUrl, 'confirmed');
|
|
270
|
+
try {
|
|
271
|
+
await connection.sendRawTransaction(rawTx, { skipPreflight: false, maxRetries: 3 });
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
// A definitive rejection never entered the network — keep throwing.
|
|
275
|
+
if (isDefinitiveSolanaSendFailure(error))
|
|
276
|
+
throw error;
|
|
277
|
+
// Ambiguous transport outcome: the node may hold these exact bytes. Report
|
|
278
|
+
// the pre-derived signature so the caller reconciles it instead of building
|
|
279
|
+
// a second transaction that could land beside the first.
|
|
280
|
+
return {
|
|
281
|
+
outcome: 'submitted',
|
|
282
|
+
lane: 'solana',
|
|
283
|
+
transactionSignature: signature,
|
|
284
|
+
signedTransaction,
|
|
285
|
+
fence,
|
|
286
|
+
reason: `Broadcast response was lost or inconclusive: ${errorText(error)}`,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
let confirmation;
|
|
290
|
+
try {
|
|
291
|
+
confirmation = await connection.confirmTransaction({
|
|
292
|
+
signature, blockhash: tx.blockhash, lastValidBlockHeight: tx.lastValidBlockHeight,
|
|
293
|
+
}, 'confirmed');
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
// The bytes were accepted; only the confirmation outcome is unknown.
|
|
297
|
+
return {
|
|
298
|
+
outcome: 'submitted',
|
|
299
|
+
lane: 'solana',
|
|
300
|
+
transactionSignature: signature,
|
|
301
|
+
signedTransaction,
|
|
302
|
+
fence,
|
|
303
|
+
reason: `Confirmation outcome unknown: ${errorText(error)}`,
|
|
304
|
+
};
|
|
235
305
|
}
|
|
236
|
-
const connection = new Connection(rpcUrl, 'confirmed');
|
|
237
|
-
const signature = await connection.sendRawTransaction(rawTx, { skipPreflight: false, maxRetries: 3 });
|
|
238
|
-
const confirmation = await connection.confirmTransaction({
|
|
239
|
-
signature, blockhash: tx.blockhash, lastValidBlockHeight: tx.lastValidBlockHeight,
|
|
240
|
-
}, 'confirmed');
|
|
241
306
|
// #310: "confirmed" only means the network recorded the transaction, not that it
|
|
242
307
|
// succeeded - a landed-but-failed transaction carries an err. Report it as a failure
|
|
243
308
|
// (with on-chain logs) instead of a fake success, mirroring the server keypair provider.
|
|
244
|
-
if ((
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
309
|
+
if ((_e = confirmation.value) === null || _e === void 0 ? void 0 : _e.err) {
|
|
310
|
+
let logMessages;
|
|
311
|
+
try {
|
|
312
|
+
const txInfo = await connection.getTransaction(signature, {
|
|
313
|
+
maxSupportedTransactionVersion: 0,
|
|
314
|
+
commitment: 'confirmed',
|
|
315
|
+
});
|
|
316
|
+
logMessages = (_f = txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta) === null || _f === void 0 ? void 0 : _f.logMessages;
|
|
317
|
+
}
|
|
318
|
+
catch (_j) {
|
|
319
|
+
// Log retrieval is diagnostic only; the on-chain error is the verdict.
|
|
320
|
+
}
|
|
250
321
|
const errorMessage = logMessages ? JSON.stringify(logMessages) : JSON.stringify(confirmation.value.err);
|
|
251
322
|
throw new Error(`Transaction failed: ${errorMessage}`);
|
|
252
323
|
}
|
|
253
324
|
return {
|
|
325
|
+
outcome: 'confirmed',
|
|
326
|
+
lane: 'solana',
|
|
254
327
|
transactionSignature: signature,
|
|
255
|
-
signedTransaction
|
|
256
|
-
|
|
257
|
-
|
|
328
|
+
signedTransaction,
|
|
329
|
+
fence,
|
|
330
|
+
confirmationContextSlot: (_h = (_g = confirmation.context) === null || _g === void 0 ? void 0 : _g.slot) !== null && _h !== void 0 ? _h : 0,
|
|
258
331
|
};
|
|
259
332
|
}
|
|
260
333
|
|
|
261
|
-
export { handlePreBuiltTransaction,
|
|
262
|
-
//# sourceMappingURL=solana-operations-
|
|
334
|
+
export { deriveTransactionSignature, handlePreBuiltTransaction, isDefinitiveSolanaSendFailure };
|
|
335
|
+
//# sourceMappingURL=solana-operations-ChHG25O0.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-operations-ChHG25O0.mjs","sources":["../.rollup-tmp/client/solana-operations.js"],"sourcesContent":["import { Buffer } from 'buffer';\nimport { getConfig } from './config';\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n/**\n * Minimal base58 encoder, used ONLY to derive a Solana transaction signature\n * from already-signed bytes. Core deliberately does not take a `bs58`\n * dependency for eighteen lines of arithmetic.\n */\nfunction encodeBase58(bytes) {\n if (bytes.length === 0)\n return '';\n const digits = [0];\n for (const byte of bytes) {\n let carry = byte;\n for (let i = 0; i < digits.length; i++) {\n carry += digits[i] << 8;\n digits[i] = carry % 58;\n carry = (carry / 58) | 0;\n }\n while (carry > 0) {\n digits.push(carry % 58);\n carry = (carry / 58) | 0;\n }\n }\n let out = '';\n for (let i = 0; i < bytes.length && bytes[i] === 0; i++)\n out += BASE58_ALPHABET[0];\n for (let i = digits.length - 1; i >= 0; i--)\n out += BASE58_ALPHABET[digits[i]];\n return out;\n}\n/**\n * Derive the transaction signature from the SIGNED bytes, before broadcasting.\n *\n * Without this the signature is only learned when `sendRawTransaction` resolves,\n * so an RPC that accepted the bytes but whose response was lost throws with\n * nothing recorded — and a retry builds a DIFFERENT transaction that can land\n * beside the first.\n */\nexport function deriveTransactionSignature(signedTransaction) {\n var _a;\n const signature = (_a = signedTransaction.signatures) === null || _a === void 0 ? void 0 : _a[0];\n if (!signature || signature.length === 0) {\n throw new Error('Signed Solana transaction carries no signature to broadcast');\n }\n if (signature.every(byte => byte === 0)) {\n throw new Error('Signed Solana transaction carries an empty fee-payer signature');\n }\n return encodeBase58(Uint8Array.from(signature));\n}\n/**\n * Whether a send failure PROVES the transaction was never accepted. A preflight\n * rejection, a signature-verification failure, or an oversized/invalid\n * transaction is definitive and keeps throwing. A transport failure (timeout,\n * socket reset, aborted fetch) is ambiguous — the node may hold the bytes — and\n * must resolve as `submitted` carrying the pre-derived signature.\n *\n * \"already processed\" is deliberately NOT definitive: it means the signature\n * landed, which is the opposite of a failure.\n */\nconst DEFINITIVE_SEND_FAILURE_MARKERS = [\n 'simulation failed',\n 'preflight',\n 'blockhash not found',\n 'signature verification failure',\n 'transaction too large',\n 'invalid transaction',\n 'insufficient funds for rent',\n 'attempt to debit an account but found no record of a prior credit',\n];\nexport function isDefinitiveSolanaSendFailure(error) {\n var _a, _b, _c;\n const err = error;\n if (err && Array.isArray(err.logs))\n return true;\n if (err && String((_a = err.name) !== null && _a !== void 0 ? _a : '') === 'SendTransactionError')\n return true;\n const message = String((_c = (_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err) !== null && _c !== void 0 ? _c : '').toLowerCase();\n if (!message)\n return false;\n if (message.includes('already been processed') || message.includes('already processed'))\n return false;\n return DEFINITIVE_SEND_FAILURE_MARKERS.some(marker => message.includes(marker));\n}\nfunction errorText(error) {\n const message = error === null || error === void 0 ? void 0 : error.message;\n return typeof message === 'string' && message.length > 0 ? message : String(error);\n}\nconst BOUNDED_PROGRAM_MAINNET = ['open', 'Tv7fbpYSseNHYmCZFZ1CZgj4r8D9fKNgEz1qo6F'].join('');\nconst BOUNDED_PROGRAM_DEVNET = ['open', 'Tv7fbpYSseNHYmCZFZ1CZgj4r8D9fKNgEz1qo6F'].join('');\nconst COMPUTE_BUDGET_PROGRAM = 'ComputeBudget111111111111111111111111111111';\nconst SYSTEM_PROGRAM_ID = '11111111111111111111111111111111';\nconst ALLOWED_SERVER_TX_PROGRAMS = new Set([\n BOUNDED_PROGRAM_MAINNET,\n BOUNDED_PROGRAM_DEVNET,\n COMPUTE_BUDGET_PROGRAM,\n SYSTEM_PROGRAM_ID,\n]);\n// Canonical set_documents discriminator (single wire format: ra_indices Vec<u8>).\nconst SET_DOCUMENTS_DISCRIMINATOR = '79,46,72,73,24,79,66,245';\nconst ALLOWED_BOUNDED_SET_DISCRIMINATORS = new Set([\n SET_DOCUMENTS_DISCRIMINATOR,\n]);\nclass BorshCursor {\n constructor(data, offset, label) {\n this.data = data;\n this.offset = offset;\n this.label = label;\n }\n requireBytes(length, field) {\n if (this.offset + length > this.data.length) {\n throw new Error(`${this.label} has malformed Bounded instruction data while reading ${field}`);\n }\n }\n readU8(field) { this.requireBytes(1, field); return this.data[this.offset++]; }\n readU32(field) {\n this.requireBytes(4, field);\n const value = this.data[this.offset] | (this.data[this.offset + 1] << 8) |\n (this.data[this.offset + 2] << 16) | (this.data[this.offset + 3] << 24);\n this.offset += 4;\n return value >>> 0;\n }\n skip(length, field) { this.requireBytes(length, field); this.offset += length; }\n readString(field) {\n const length = this.readU32(`${field} length`);\n this.requireBytes(length, field);\n const raw = this.data.slice(this.offset, this.offset + length);\n this.offset += length;\n return Buffer.from(raw).toString('utf8');\n }\n skipBytes(field) { this.skip(this.readU32(`${field} length`), field); }\n isAtEnd() { return this.offset === this.data.length; }\n}\nfunction skipBoundedFieldValue(cursor) {\n const option = cursor.readU8('operation value option');\n if (option === 0)\n return;\n if (option !== 1)\n throw new Error('Server transaction has malformed Bounded field value option');\n const variant = cursor.readU8('operation value variant');\n if (variant === 0 || variant === 1)\n cursor.skip(8, 'operation numeric value');\n else if (variant === 2)\n cursor.skip(1, 'operation bool value');\n else if (variant === 3)\n cursor.readString('operation string value');\n else if (variant === 4)\n cursor.skip(32, 'operation address value');\n else\n throw new Error(`Server transaction has unsupported Bounded field value variant: ${variant}`);\n}\nfunction normalizeOnchainPath(path) {\n let normalized = path.startsWith('/') ? path.slice(1) : path;\n if (normalized.endsWith('*') && normalized.length > 1)\n normalized = normalized.slice(0, -1);\n if (normalized.endsWith('/'))\n normalized = normalized.slice(0, -1);\n return normalized;\n}\nfunction parseBoundedSetDocumentsInstruction(data, label) {\n if (data.length < 8)\n throw new Error(`${label} has malformed Bounded instruction data`);\n const discriminator = Array.from(data.slice(0, 8)).join(',');\n if (!ALLOWED_BOUNDED_SET_DISCRIMINATORS.has(discriminator)) {\n throw new Error(`${label} contains unsupported Bounded instruction`);\n }\n const cursor = new BorshCursor(data, 8, label);\n const appId = cursor.readString('appId');\n const documentPaths = [];\n const documentCount = cursor.readU32('documents length');\n for (let i = 0; i < documentCount; i++) {\n documentPaths.push(normalizeOnchainPath(cursor.readString('document path')));\n const operationCount = cursor.readU32('operations length');\n for (let j = 0; j < operationCount; j++) {\n cursor.readString('operation key');\n skipBoundedFieldValue(cursor);\n cursor.skip(1, 'operation kind');\n }\n }\n const deletePaths = [];\n const deleteCount = cursor.readU32('delete paths length');\n for (let i = 0; i < deleteCount; i++)\n deletePaths.push(normalizeOnchainPath(cursor.readString('delete path')));\n const txDataCount = cursor.readU32('txData length');\n for (let i = 0; i < txDataCount; i++) {\n cursor.readString('txData plugin function key');\n cursor.skipBytes('txData bytes');\n cursor.skipBytes('txData raIndices');\n }\n const simulate = cursor.readU8('simulate');\n if (simulate !== 0 && simulate !== 1)\n throw new Error(`${label} has malformed Bounded simulate flag`);\n if (!cursor.isAtEnd())\n throw new Error(`${label} has trailing Bounded instruction data`);\n return { appId, documentPaths, deletePaths };\n}\nfunction assertSamePathSet(label, expectedPaths, actualPaths) {\n const expected = new Set(expectedPaths.map(normalizeOnchainPath).filter(Boolean));\n const actual = new Set(actualPaths.map(normalizeOnchainPath).filter(Boolean));\n const missing = [...expected].filter(path => !actual.has(path));\n const extra = [...actual].filter(path => !expected.has(path));\n if (missing.length || extra.length) {\n const details = [missing.length ? `missing paths: ${missing.join(', ')}` : '', extra.length ? `unexpected paths: ${extra.join(', ')}` : '']\n .filter(Boolean).join('; ');\n throw new Error(`${label} Bounded instruction paths do not match requested write paths (${details})`);\n }\n}\nfunction deserializeAndValidateServerTransaction(serializedTransaction, VersionedTransactionClass, options) {\n var _a;\n const transaction = VersionedTransactionClass.deserialize(Buffer.from(serializedTransaction, 'base64'));\n const { label, expectedAppId, expectedWritePaths } = options;\n const accountKeys = transaction.message.staticAccountKeys;\n let boundedInstructionCount = 0;\n const actualWritePaths = [];\n for (const ix of transaction.message.compiledInstructions) {\n if (ix.programIdIndex >= accountKeys.length)\n throw new Error(`${label} has program ID in lookup table (not allowed)`);\n const programId = accountKeys[ix.programIdIndex].toBase58();\n if (!ALLOWED_SERVER_TX_PROGRAMS.has(programId))\n throw new Error(`${label} contains unauthorized program: ${programId}`);\n const data = ix.data instanceof Uint8Array ? ix.data : Buffer.from((_a = ix.data) !== null && _a !== void 0 ? _a : []);\n if (programId === SYSTEM_PROGRAM_ID)\n throw new Error(`${label} contains unauthorized System Program instruction`);\n if (programId === BOUNDED_PROGRAM_MAINNET || programId === BOUNDED_PROGRAM_DEVNET) {\n boundedInstructionCount++;\n const parsed = parseBoundedSetDocumentsInstruction(data, label);\n if (parsed.appId !== expectedAppId)\n throw new Error(`${label} Bounded instruction appId does not match configured appId`);\n actualWritePaths.push(...parsed.documentPaths, ...parsed.deletePaths);\n }\n }\n if (boundedInstructionCount !== 1)\n throw new Error(`${label} must contain exactly one Bounded set-documents instruction`);\n assertSamePathSet(label, expectedWritePaths, actualWritePaths);\n return transaction;\n}\nexport async function handlePreBuiltTransaction(tx, authProvider, options, expectedWritePaths) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const { Connection, VersionedTransaction } = await import(\"@solana/web3.js\");\n // Honor a wallet client's immutable config snapshot for the expected app-id\n // binding and RPC endpoint (CTA-05); otherwise read the global init() config.\n const config = (_b = (_a = options === null || options === void 0 ? void 0 : options._overrides) === null || _a === void 0 ? void 0 : _a._config) !== null && _b !== void 0 ? _b : await getConfig();\n const transaction = deserializeAndValidateServerTransaction(tx.serializedTransaction, VersionedTransaction, {\n label: 'Pre-built transaction', expectedAppId: config.appId, expectedWritePaths,\n });\n const shouldSubmit = (options === null || options === void 0 ? void 0 : options.shouldSubmitTx) !== false;\n const rpcUrl = (_c = config.rpcUrl) === null || _c === void 0 ? void 0 : _c.trim();\n const injectedRpc = (_d = options === null || options === void 0 ? void 0 : options._overrides) === null || _d === void 0 ? void 0 : _d._solanaRpc;\n if (shouldSubmit && !rpcUrl && !injectedRpc) {\n throw new Error(`Pre-built Solana transaction submission requires init({ rpcUrl }) for ${tx.network}`);\n }\n const signedTx = await authProvider.signTransaction(transaction);\n const rawTx = signedTx.serialize();\n const signedTransaction = Buffer.from(rawTx).toString('base64');\n // Keep the worker's expiry fence instead of discarding it: it is what makes\n // bounded same-signature reconciliation (and therefore the retry-safe\n // `expired_not_landed` exit) possible at all.\n const fence = { blockhash: tx.blockhash, lastValidBlockHeight: tx.lastValidBlockHeight };\n if (!shouldSubmit) {\n // Signed and NOT sent. There is no signature and nothing to mirror.\n return { outcome: 'signed', lane: 'solana', transactionSignature: null, signedTransaction, fence };\n }\n // Derive the signature from the signed bytes BEFORE broadcasting, so a send\n // whose response is lost still yields a reconcilable identifier.\n const signature = deriveTransactionSignature(signedTx);\n const connection = injectedRpc !== null && injectedRpc !== void 0 ? injectedRpc : new Connection(rpcUrl, 'confirmed');\n try {\n await connection.sendRawTransaction(rawTx, { skipPreflight: false, maxRetries: 3 });\n }\n catch (error) {\n // A definitive rejection never entered the network — keep throwing.\n if (isDefinitiveSolanaSendFailure(error))\n throw error;\n // Ambiguous transport outcome: the node may hold these exact bytes. Report\n // the pre-derived signature so the caller reconciles it instead of building\n // a second transaction that could land beside the first.\n return {\n outcome: 'submitted',\n lane: 'solana',\n transactionSignature: signature,\n signedTransaction,\n fence,\n reason: `Broadcast response was lost or inconclusive: ${errorText(error)}`,\n };\n }\n let confirmation;\n try {\n confirmation = await connection.confirmTransaction({\n signature, blockhash: tx.blockhash, lastValidBlockHeight: tx.lastValidBlockHeight,\n }, 'confirmed');\n }\n catch (error) {\n // The bytes were accepted; only the confirmation outcome is unknown.\n return {\n outcome: 'submitted',\n lane: 'solana',\n transactionSignature: signature,\n signedTransaction,\n fence,\n reason: `Confirmation outcome unknown: ${errorText(error)}`,\n };\n }\n // #310: \"confirmed\" only means the network recorded the transaction, not that it\n // succeeded - a landed-but-failed transaction carries an err. Report it as a failure\n // (with on-chain logs) instead of a fake success, mirroring the server keypair provider.\n if ((_e = confirmation.value) === null || _e === void 0 ? void 0 : _e.err) {\n let logMessages;\n try {\n const txInfo = await connection.getTransaction(signature, {\n maxSupportedTransactionVersion: 0,\n commitment: 'confirmed',\n });\n logMessages = (_f = txInfo === null || txInfo === void 0 ? void 0 : txInfo.meta) === null || _f === void 0 ? void 0 : _f.logMessages;\n }\n catch (_j) {\n // Log retrieval is diagnostic only; the on-chain error is the verdict.\n }\n const errorMessage = logMessages ? JSON.stringify(logMessages) : JSON.stringify(confirmation.value.err);\n throw new Error(`Transaction failed: ${errorMessage}`);\n }\n return {\n outcome: 'confirmed',\n lane: 'solana',\n transactionSignature: signature,\n signedTransaction,\n fence,\n confirmationContextSlot: (_h = (_g = confirmation.context) === null || _g === void 0 ? void 0 : _g.slot) !== null && _h !== void 0 ? _h : 0,\n };\n}\n"],"names":["Buffer"],"mappings":"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"}
|