shinjuku-shielded 0.3.34 → 0.3.35

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/manifest.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema": "carbon-shielded-wallet/bundle-manifest/v1",
3
3
  "file": "shinjuku-wallet.mjs",
4
- "sha256": "b22ae0f772097b698eba694cfec8b31061921a38948c11702df3653881361e9f",
5
- "bytes": 11185132,
6
- "sourceCommit": "164420d7b29522db79b23d11ae14bc10ec26ce8f",
4
+ "sha256": "fc7329d0267d82e7f06546009c64924d0ec713165c3bfe270512ba0672b94cbd",
5
+ "bytes": 11187416,
6
+ "sourceCommit": "dcbbb1497a0fcf92d4e0ff9bd78fb81b72075631",
7
7
  "sourceDirty": false,
8
8
  "installRecordMatchesLockfile": true,
9
9
  "releaseRule": "valid only when two fresh npm ci --ignore-scripts builds on different OSes give the same sha256; installRecordMatchesLockfile true means every entry npm installed equals its package-lock.json entry and every entry not marked optional, devOptional included, is installed: an optional entry (a package for another platform) may be absent",
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "shinjuku-shielded",
3
- "version": "0.3.34",
3
+ "version": "0.3.35",
4
4
  "mcpName": "io.github.ShinjukuStaition/shinjuku-mcp",
5
5
  "description": "Shinjuku Shielded, the private x402 facilitator on Solana: the self-custody wallet CLI and its MCP server. Shield, pay, and unshield USDC from any MCP agent, under caps you set.",
6
- "shinjukuRelease": "b22ae0f7",
7
- "shinjukuSha256": "b22ae0f772097b698eba694cfec8b31061921a38948c11702df3653881361e9f",
6
+ "shinjukuRelease": "fc7329d0",
7
+ "shinjukuSha256": "fc7329d0267d82e7f06546009c64924d0ec713165c3bfe270512ba0672b94cbd",
8
8
  "license": "SEE LICENSE IN LICENSE.txt",
9
9
  "author": "Shinjuku Shielded",
10
10
  "homepage": "https://github.com/ShinjukuStaition/shinjuku-mcp#readme",
@@ -53257,6 +53257,7 @@ async function retryTransientRpc(operation, {
53257
53257
  } catch (error) {
53258
53258
  if (!isTransientRpcError(error)) throw error;
53259
53259
  lastError = error;
53260
+ markPhase(`rpc-retry-${transientCause(error)}`);
53260
53261
  if (attempt + 1 < attempts) {
53261
53262
  await new Promise((resolve38) => setTimeout(resolve38, baseDelayMs * 2 ** attempt));
53262
53263
  }
@@ -53274,6 +53275,10 @@ function reuseRefusalCause(error) {
53274
53275
  if (status) return `http_${status}`;
53275
53276
  return error instanceof import_web396.SolanaJSONRPCError ? "rpc_error" : "read_failed";
53276
53277
  }
53278
+ function transientCause(error) {
53279
+ if (error instanceof import_web396.SolanaJSONRPCError) return String(-error.code);
53280
+ return reuseRefusalCause(error);
53281
+ }
53277
53282
  function isTransientRpcError(error) {
53278
53283
  if (error?.transientRpcError === true) return true;
53279
53284
  if (error instanceof import_web396.SolanaJSONRPCError) return LAGGING_NODE_RPC_CODES.has(error.code);
@@ -54216,6 +54221,7 @@ var init_walk = __esm({
54216
54221
  init_esm2();
54217
54222
  init_chain2();
54218
54223
  init_proxy();
54224
+ init_phaseTiming();
54219
54225
  init_quote2();
54220
54226
  init_compressedReplay();
54221
54227
  init_p03E1Tree();
@@ -56366,6 +56372,7 @@ async function loadWalletP03HistoryNow({ store, connection: given, programId, po
56366
56372
  const earlier = remembered !== void 0 && Date.now() - remembered.at <= HISTORY_WARM_FRESH_MS ? remembered.report : void 0;
56367
56373
  let movedSnapshot;
56368
56374
  if (earlier !== void 0) {
56375
+ markPhase("refresh-start");
56369
56376
  try {
56370
56377
  const refreshed = await refreshFinalizedP03HistorySnapshot({ connection, programId, pool: pool2, history: earlier });
56371
56378
  markPhase("walk-refreshed");
@@ -61136,6 +61143,7 @@ var init_errorCodes = __esm({
61136
61143
  "p03_merchant_respend_evidence_account_file_invalid_json",
61137
61144
  "p03_merchant_respend_evidence_digests_invalid_json",
61138
61145
  "p03_merchant_respend_accounts_split_merge_first",
61146
+ "walk_history_required",
61139
61147
  "merge_id_invalid",
61140
61148
  "merge_id_reserved",
61141
61149
  "p03_merchant_respend_insufficient_recovered_value",
@@ -62916,6 +62924,7 @@ var init_errorCodes = __esm({
62916
62924
  "absorb_note_ambiguous",
62917
62925
  "p03_payer_float_absorb_pocket_mismatch",
62918
62926
  "p03_payer_float_absorb_exit_failed",
62927
+ "p03_payer_float_absorb_merge_failed",
62919
62928
  "reverted_payment",
62920
62929
  "config_invalid",
62921
62930
  "p03_payer_float_journal_unwritable",
@@ -71958,6 +71967,26 @@ function startFinalizedChainTime(connection) {
71958
71967
  return time + Math.floor(age / 1e3);
71959
71968
  };
71960
71969
  }
71970
+ async function everyAccountHeld({ store, connection, programId, serviceUrl: serviceUrl2, reservedReplayValues, deps = {} }) {
71971
+ if (typeof deps.walkHistory !== "function") fail15("walk_history_required");
71972
+ const viewing = deriveWalletViewingAuthority2({ seedBytes: seedBytes5(store.state), generator: pinnedGenerator4() });
71973
+ const history = assertAuthenticatedFinalizedP03History(await withRecentWalletHistory(() => deps.walkHistory()));
71974
+ const recovery = await (deps.recover ?? runRecover)({
71975
+ store,
71976
+ connection,
71977
+ programId: new import_web3106.PublicKey(programId),
71978
+ serviceUrl: serviceUrl2,
71979
+ deps: { fetchImpl: deps.fetchImpl, finalizedHistory: history, transitionContextFor: history.transitionContextFor }
71980
+ });
71981
+ return recovery.recovered.filter((entry) => entry.kind === "account" && entry.spendStatus === "unspent").every((entry) => {
71982
+ if (entry.leafIndex === void 0 || entry.leafIndex === null) return true;
71983
+ try {
71984
+ return reservedReplayValues.has(accountNullifier(entry.commitment, viewing.eta, entry.leafIndex).toString());
71985
+ } catch {
71986
+ return true;
71987
+ }
71988
+ });
71989
+ }
71961
71990
  async function prepareRecoveredPayment({
71962
71991
  store,
71963
71992
  connection,
@@ -91557,7 +91586,8 @@ async function payViaFloat({
91557
91586
  method: "POST",
91558
91587
  body: Buffer.from(record.bodyBase64, "base64"),
91559
91588
  headers: { "content-type": "application/json" },
91560
- deps: { ...withoutCallerBody(deps), fetchImpl: floatFetch(fetchImpl, seen) }
91589
+ // settlePriorBeforeQuote: a prior answer that holds every input is settled before the leg-1 402 (one quote, one row).
91590
+ deps: { ...withoutCallerBody(deps), fetchImpl: floatFetch(fetchImpl, seen), settlePriorBeforeQuote: true }
91561
91591
  });
91562
91592
  } catch (error) {
91563
91593
  if (seen.refusal) {
@@ -92498,6 +92528,31 @@ async function payResourceOnce({
92498
92528
  }
92499
92529
  await settlePrior(name);
92500
92530
  }
92531
+ const settleDeferred = async () => {
92532
+ const answeredAt = (name) => store.readWal(name)?.answeredAtMs ?? 0;
92533
+ const shared2 = {};
92534
+ for (const name of deferred.splice(0).sort((a, b) => answeredAt(b) - answeredAt(a))) await settlePrior(name, shared2);
92535
+ held.clear();
92536
+ };
92537
+ if (deps.settlePriorBeforeQuote === true && deferred.length > 0 && !record) {
92538
+ let first = false;
92539
+ try {
92540
+ first = await withPhaseScope(mark, "held", () => (deps.everyAccountHeld ?? everyAccountHeld)({
92541
+ store,
92542
+ connection,
92543
+ programId,
92544
+ serviceUrl: serviceUrl2,
92545
+ reservedReplayValues: held,
92546
+ deps: { fetchImpl: deps.fetchImpl, walkHistory: finality.walkHistory }
92547
+ }));
92548
+ } catch {
92549
+ first = false;
92550
+ }
92551
+ if (first === true) {
92552
+ mark("prior-finality-first");
92553
+ await settleDeferred();
92554
+ }
92555
+ }
92501
92556
  if (!record?.paymentHeader && typeof deps.warmHistory === "function") {
92502
92557
  if (walkedThisRun && deps.warmHistory === deps.walkHistory) {
92503
92558
  mark("history-warm-reused");
@@ -92635,10 +92690,7 @@ async function payResourceOnce({
92635
92690
  const noProof = store.readWal(`resource-proof-${requestKey}`)?.proved === void 0;
92636
92691
  if (noProof && deferred.length > 0 && /^p03_merchant_respend_inputs_held_by_pending_payment/.test(message)) {
92637
92692
  mark("prior-finality-fallback");
92638
- const answeredAt = (name) => store.readWal(name)?.answeredAtMs ?? 0;
92639
- const shared2 = {};
92640
- for (const name of deferred.splice(0).sort((a, b) => answeredAt(b) - answeredAt(a))) await settlePrior(name, shared2);
92641
- held.clear();
92693
+ await settleDeferred();
92642
92694
  continue;
92643
92695
  }
92644
92696
  if (!requoted && noProof && (/^p03_merchant_respend_quote_life_short_requote/.test(message) || /^p03_merchant_respend_quote_expired/.test(message))) {