@fased/fased 0.1.62 → 0.1.65

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.
Files changed (342) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +44 -29
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +58 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +78 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/agents/auth-profiles/store.js +267 -31
  12. package/dist/agents/bash-tools.exec.js +10 -4
  13. package/dist/agents/current-model-catalog.js +3 -3
  14. package/dist/agents/memory-search.js +7 -1
  15. package/dist/agents/model-catalog-access.js +1 -2
  16. package/dist/agents/model-catalog-snapshot.js +1 -1
  17. package/dist/agents/model-catalog-source.js +1 -1
  18. package/dist/agents/model-metadata.js +1 -1
  19. package/dist/agents/model-selection.js +2 -28
  20. package/dist/agents/models-config.providers.js +6 -6
  21. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  22. package/dist/agents/pi-embedded-runner/model.js +1 -1
  23. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  24. package/dist/agents/pi-embedded-runner/run.js +2 -0
  25. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  26. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  27. package/dist/agents/pi-tools.js +2 -1
  28. package/dist/agents/sandbox/config.js +1 -1
  29. package/dist/agents/sandbox/context.js +27 -2
  30. package/dist/agents/skills/env-overrides.js +38 -28
  31. package/dist/agents/skills/trust.js +93 -0
  32. package/dist/agents/skills/workspace.js +128 -0
  33. package/dist/agents/skills-clawhub.js +36 -11
  34. package/dist/agents/skills-marketplace-scan.js +49 -0
  35. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  36. package/dist/agents/tools/mining-tool.js +1 -1
  37. package/dist/agents/tools/session-status-tool.js +1 -1
  38. package/dist/agents/tools/wallet-action-tool.js +172 -36
  39. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  40. package/dist/agents/tools/wallet-tool.js +7 -11
  41. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  42. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  43. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  44. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  45. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  46. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  47. package/dist/auto-reply/reply/model-selection.js +7 -4
  48. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  49. package/dist/brand.js +1 -1
  50. package/dist/build-info.json +3 -3
  51. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  52. package/dist/channel-web.js +2 -2
  53. package/dist/cli/gateway-cli/run.js +8 -0
  54. package/dist/cli/program/command-registry.js +1 -1
  55. package/dist/cli/program/register.onboard.js +2 -3
  56. package/dist/cli/program/register.wallet.js +16 -123
  57. package/dist/cli/providers-cli.js +1 -1
  58. package/dist/cli/sat-cli.js +129 -2
  59. package/dist/cli/update-cli/update-command.js +260 -11
  60. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  61. package/dist/commands/doctor-config-flow.js +1 -1
  62. package/dist/commands/doctor-legacy-config.js +2 -13
  63. package/dist/commands/model-picker.js +6 -6
  64. package/dist/commands/models/auth.js +1 -1
  65. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  66. package/dist/commands/onboard-auth.credentials.js +32 -8
  67. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  68. package/dist/commands/onboard-non-interactive/local.js +5 -1
  69. package/dist/commands/wallet.js +568 -1911
  70. package/dist/config/config.js +2 -2
  71. package/dist/config/io.js +64 -2
  72. package/dist/config/schema.help.js +8 -7
  73. package/dist/config/schema.labels.js +5 -4
  74. package/dist/config/zod-schema.agent-runtime.js +1 -0
  75. package/dist/config/zod-schema.js +5 -0
  76. package/dist/control-ui/assets/{app-DLil9VO1.js → app-MaQnPa5G.js} +1511 -1555
  77. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  78. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  79. package/dist/control-ui/assets/{index-DdE_NIXo.js → index-D4YMr1fA.js} +3 -3
  80. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  81. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
  82. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  83. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  84. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/control-ui/version.json +1 -1
  87. package/dist/daemon/systemd-system.js +56 -50
  88. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  89. package/dist/extensions/sat-mining/src/rpc-read.js +291 -84
  90. package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
  91. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  92. package/dist/extensions/sat-mining/src/solana-submit.js +1274 -390
  93. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  94. package/dist/federation/auto-connect.js +98 -8
  95. package/dist/federation/marketplace-capability-adapter.js +33 -7
  96. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  97. package/dist/federation/marketplace-delivery.js +351 -215
  98. package/dist/federation/marketplace-direct-payment.js +272 -141
  99. package/dist/federation/marketplace-escrow.js +607 -249
  100. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  101. package/dist/federation/offers.js +9 -7
  102. package/dist/federation/peer-auth-v2.js +529 -0
  103. package/dist/gateway/a2a-http.js +425 -96
  104. package/dist/gateway/a2a-settlement.js +259 -153
  105. package/dist/gateway/a2a-task-store.js +524 -0
  106. package/dist/gateway/auth.js +38 -2
  107. package/dist/gateway/config-reload.js +46 -33
  108. package/dist/gateway/durable-capacity.js +31 -0
  109. package/dist/gateway/federation-http.js +540 -135
  110. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  111. package/dist/gateway/federation-marketplace.js +535 -230
  112. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  113. package/dist/gateway/security-path.js +1 -1
  114. package/dist/gateway/server-http.js +1084 -1205
  115. package/dist/gateway/server-methods/models.js +1 -1
  116. package/dist/gateway/server-methods/secrets.js +40 -0
  117. package/dist/gateway/server-methods.js +1 -2
  118. package/dist/gateway/server-reload-handlers.js +196 -66
  119. package/dist/gateway/server-runtime-config.js +1 -1
  120. package/dist/gateway/server-secrets-runtime.js +288 -0
  121. package/dist/gateway/server.impl.js +73 -42
  122. package/dist/gateway/sessions-patch.js +3 -5
  123. package/dist/index.js +4 -2
  124. package/dist/infra/fasedhub.js +64 -1
  125. package/dist/infra/local-source-paired-update.js +538 -0
  126. package/dist/infra/restart.js +41 -10
  127. package/dist/infra/update-runner.js +96 -0
  128. package/dist/light-update-status.js +11 -11
  129. package/dist/memory/backend-config.js +2 -1
  130. package/dist/memory/session-files.js +16 -2
  131. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  132. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  133. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  134. package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-I4IngVlJ.js} +27 -27
  135. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  136. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  137. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  138. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  139. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  140. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  141. package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DLQ6_lLK.js} +1 -1
  142. package/dist/plugin-sdk/command-status.d.ts +2 -2
  143. package/dist/plugin-sdk/command-status.js +27 -27
  144. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  145. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  146. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  147. package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-D_8FVI1C.js} +6798 -3695
  148. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  149. package/dist/plugin-sdk/discord.d.ts +6 -6
  150. package/dist/plugin-sdk/discord.js +19 -19
  151. package/dist/plugin-sdk/file-lock.js +35 -4
  152. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  153. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  154. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  155. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  156. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  157. package/dist/plugin-sdk/index.d.ts +21 -39
  158. package/dist/plugin-sdk/index.js +29 -29
  159. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  160. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  161. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  162. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  163. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  164. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  165. package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-B4KF4Kpo.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.js} +27 -27
  168. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  169. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  170. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  171. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  172. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
  173. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  174. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  175. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  176. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  177. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  178. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  179. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  180. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  181. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  182. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  183. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  184. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  185. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  186. package/dist/plugin-sdk/sat-runtime.d.ts +565 -309
  187. package/dist/plugin-sdk/sat-runtime.js +29 -29
  188. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  189. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  190. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  191. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  192. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  193. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  194. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  195. package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BHmvqgjH.js} +39 -39
  196. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  197. package/dist/plugin-sdk/slack.d.ts +6 -6
  198. package/dist/plugin-sdk/slack.js +9 -9
  199. package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-By5AcorL.js} +3 -3
  200. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  201. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  202. package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-DGnBz1YT.js} +30 -30
  203. package/dist/plugin-sdk/telegram.d.ts +6 -6
  204. package/dist/plugin-sdk/telegram.js +8 -8
  205. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  206. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  207. package/dist/plugin-sdk/tmp-fased-dir-EJGTmL1Q.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
  209. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
  210. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  211. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  212. package/dist/plugin-sdk/{web-CInY-lCv.js → web-DUJwrTYs.js} +32 -32
  213. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  214. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  215. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  216. package/dist/plugin-sdk/whatsapp.js +12 -12
  217. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  218. package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  219. package/dist/providers/refresh.js +1 -1
  220. package/dist/providers/registry.js +1 -1
  221. package/dist/secrets/apply.js +1 -1
  222. package/dist/secrets/runtime.js +1 -1
  223. package/dist/wallet/external-submission-ledger.js +376 -0
  224. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  225. package/dist/wallet/local-socket-signer-archive.js +30 -0
  226. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  227. package/dist/wallet/local-socket-signer-policy.js +166 -0
  228. package/dist/wallet/local-socket-signer-protocol.js +578 -117
  229. package/dist/wallet/native-signer-wallet-id.js +25 -0
  230. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  231. package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
  232. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  233. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  234. package/dist/wallet/signer-network-admin.js +184 -0
  235. package/dist/wallet/signer-protocol-v2.generated.js +92 -0
  236. package/dist/wallet/solana-bond-signing.js +157 -69
  237. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  238. package/dist/wallet/solana-swap.js +520 -64
  239. package/dist/wallet/solana-transaction-inspection.js +106 -4
  240. package/dist/wallet/solana-trigger.js +658 -320
  241. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  242. package/dist/wallet/wallet-approval-auth.js +17 -28
  243. package/dist/wallet/wallet-atomic-state.js +53 -0
  244. package/dist/wallet/wallet-canary.js +0 -1
  245. package/dist/wallet/wallet-inbound-events.js +16 -11
  246. package/dist/wallet/wallet-policy-simulation.js +1 -1
  247. package/dist/wallet/wallet-policy.js +93 -37
  248. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  249. package/dist/wallet/wallet-provider-registry.js +57 -44
  250. package/dist/wallet/wallet-provider-resolver.js +62 -63
  251. package/dist/wallet/wallet-runtime-config.js +28 -41
  252. package/dist/wallet/wallet-secrets-store.js +22 -0
  253. package/dist/wallet/wallet-send-approvals.js +1891 -589
  254. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  255. package/dist/wallet/wallet-settlement-links.js +14 -13
  256. package/dist/wallet/wallet-standard-review.js +353 -0
  257. package/dist/wallet/wallet-status.js +0 -9
  258. package/dist/wallet/wallet-task-ledger.js +16 -2
  259. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  260. package/dist/web/auto-reply/monitor.js +2 -2
  261. package/dist/wizard/host-security-capability.js +14 -23
  262. package/dist/wizard/onboarding.finalize.js +63 -184
  263. package/dist/wizard/onboarding.host-security.js +117 -1367
  264. package/dist/wizard/onboarding.js +172 -217
  265. package/dist/wizard/onboarding.wallet.js +232 -785
  266. package/extensions/acpx/package.json +1 -1
  267. package/extensions/bluebubbles/package.json +1 -1
  268. package/extensions/copilot-proxy/package.json +1 -1
  269. package/extensions/diagnostics-otel/package.json +1 -1
  270. package/extensions/fased-federation/package.json +1 -1
  271. package/extensions/google-gemini-cli-auth/package.json +1 -1
  272. package/extensions/imessage/package.json +1 -1
  273. package/extensions/irc/package.json +1 -1
  274. package/extensions/line/package.json +1 -1
  275. package/extensions/llm-task/package.json +1 -1
  276. package/extensions/lobster/package.json +1 -1
  277. package/extensions/matrix/CHANGELOG.md +18 -0
  278. package/extensions/matrix/package.json +1 -1
  279. package/extensions/mattermost/package.json +1 -1
  280. package/extensions/memory-core/package.json +2 -2
  281. package/extensions/memory-lancedb/package.json +1 -1
  282. package/extensions/minimax-portal-auth/package.json +1 -1
  283. package/extensions/msteams/CHANGELOG.md +18 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +18 -0
  287. package/extensions/nostr/package.json +1 -1
  288. package/extensions/open-prose/package.json +1 -1
  289. package/extensions/sat-mining/index.ts +587 -154
  290. package/extensions/sat-mining/package.json +1 -1
  291. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  292. package/extensions/sat-mining/src/audit-store.ts +91 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/client.ts +13 -0
  295. package/extensions/sat-mining/src/config.ts +9 -0
  296. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  297. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  298. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  299. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  300. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  301. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  302. package/extensions/sat-mining/src/rpc-read.ts +431 -106
  303. package/extensions/sat-mining/src/runtime.ts +16 -0
  304. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  305. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  306. package/extensions/sat-mining/src/solana-submit.ts +1544 -436
  307. package/extensions/sat-mining/src/submission-ledger.ts +434 -0
  308. package/extensions/signal/package.json +1 -1
  309. package/extensions/synology-chat/package.json +1 -1
  310. package/extensions/tlon/package.json +1 -1
  311. package/extensions/twitch/CHANGELOG.md +18 -0
  312. package/extensions/twitch/package.json +1 -1
  313. package/extensions/voice-call/CHANGELOG.md +18 -0
  314. package/extensions/voice-call/package.json +1 -1
  315. package/extensions/zalo/CHANGELOG.md +18 -0
  316. package/extensions/zalo/package.json +1 -1
  317. package/extensions/zalouser/CHANGELOG.md +18 -0
  318. package/extensions/zalouser/package.json +1 -1
  319. package/install.sh +4951 -0
  320. package/package.json +23 -5
  321. package/scripts/fased-host-updater.mjs +1421 -0
  322. package/scripts/fased-host-updaterctl.mjs +186 -0
  323. package/scripts/fased-managed-service.sh +36 -0
  324. package/scripts/fased-managed-updater.mjs +3065 -156
  325. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  326. package/scripts/fased-signer-network-hosting.sh +143 -0
  327. package/scripts/fased-signer-owner-policy.mjs +1442 -0
  328. package/scripts/fased-signer-policy-hosting.sh +50 -0
  329. package/scripts/fased-signer-policy-local.sh +26 -0
  330. package/scripts/hosted-release-manifest.mjs +185 -0
  331. package/scripts/install-fased-signerd.sh +183 -108
  332. package/scripts/install-managed-runtime.mjs +212 -10
  333. package/scripts/managed-runtime-layout.mjs +75 -3
  334. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  335. package/scripts/start-managed.sh +173 -360
  336. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  337. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  338. package/dist/wallet/local-socket-signer-broker.js +0 -224
  339. package/dist/wallet/local-socket-signer-custody.js +0 -42
  340. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  341. package/dist/wallet/providers/privy-adapter.js +0 -80
  342. package/dist/wallet/wallet-custody.js +0 -1836
@@ -1,4 +1,5 @@
1
1
  import { loadConfig } from "../../../config/io.js";
2
+ import { fetchWithSsrFGuard } from "../../../infra/net/fetch-guard.js";
2
3
  import { redactSensitiveUrlLikeString } from "../../../shared/net/redact-sensitive-url.js";
3
4
  import { readWalletProviderRegistry } from "../../../wallet/wallet-provider-registry.js";
4
5
  import { resolveSatBondProgramIdFromEnv, resolveSatMintAddressFromEnv, resolveSatProgramIdFromEnv } from "../../../config/sat-runtime-ids.js";
@@ -6,6 +7,7 @@ import { loadWalletProviderSecret } from "../../../wallet/wallet-secrets-store.j
6
7
  import { resolveWalletProviderId } from "../../../wallet/wallet-provider-resolver.js";
7
8
  import "../../../plugin-sdk/index.js";
8
9
  import "../../../plugin-sdk/sat-runtime.js";
10
+ import { SAT_PROTOCOL_CONSTANTS, resolveSatGenesisProfileContract } from "./protocol-contract.js";
9
11
  import { loadSatBondLayout, loadSatBondPolicyLayout, loadSatBondStakingDistributorLayout, loadSatBondStakingPositionLayout } from "./sat-bond-layout.js";
10
12
  import { createRequire } from "node:module";
11
13
  import { createHash } from "node:crypto";
@@ -23,6 +25,7 @@ const SAT_DISPUTE_SEED = "sat_dispute";
23
25
  const MINING_STAKE_SEED = "mining_stake";
24
26
  const TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
25
27
  const ASSOCIATED_TOKEN_PROGRAM_ID = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL";
28
+ const ADDRESS_LOOKUP_TABLE_PROGRAM_ID = "AddressLookupTab1e1111111111111111111111111";
26
29
  function assertDedicatedBondProgramConfigured(env = process.env) {
27
30
  const resolved = resolveSatBondProgramIdFromEnv(env);
28
31
  if (!resolved.trim()) {
@@ -311,15 +314,19 @@ function decodeSatGlobalState(data, address) {
311
314
  }
312
315
  function decodeSatCycle(data, address) {
313
316
  const body = expectAccountData(data, ACCOUNT_DISCRIMINATOR.satCycleState, "SAT cycle state");
317
+ const validMinerCount = readU64String(body, 192);
318
+ const cycleSeed = readHash32(body, 40);
314
319
  return {
315
320
  address,
316
321
  cycleId: readU64Number(body, 0),
317
322
  openTs: readI64Number(body, 8),
318
323
  closeTs: readI64Number(body, 16),
319
324
  status: body.readUInt8(24),
325
+ cycleSeed,
326
+ entropyUnavailable: cycleSeed === SAT_PROTOCOL_CONSTANTS.entropyUnavailableSeedHex,
320
327
  unlockTargetLamports: readU64String(body, 176),
321
328
  totalCommittedLamports: readU64String(body, 184),
322
- validMinerCount: readU64String(body, 192),
329
+ validMinerCount,
323
330
  unlockRatioFp: readU64String(body, 200),
324
331
  issuedCycleMinerSatRaw: readU64String(body, 208),
325
332
  unissuedCycleMinerSatRaw: readU64String(body, 216),
@@ -328,7 +335,22 @@ function decodeSatCycle(data, address) {
328
335
  performanceRebatePoolLamports: readU64String(body, 240),
329
336
  treasurySolLamports: readU64String(body, 248),
330
337
  submittedSolErosionPoolLamports: readU64String(body, 256),
331
- keeperBountyPaidLamports: readU64String(body, 264)
338
+ keeperBountyPaidLamports: readU64String(body, 264),
339
+ commitDeadlineTs: readI64Number(body, 272),
340
+ revealDeadlineTs: readI64Number(body, 280),
341
+ entropyTargetSlot: readU64Number(body, 288),
342
+ committedMinerCount: readU64String(body, 296),
343
+ revealedMinerCount: validMinerCount,
344
+ resolvedCommitCount: readU64String(body, 304),
345
+ entropySealedSlot: readU64Number(body, 312),
346
+ ...body.length >= 368 ? {
347
+ openSlot: readU64Number(body, 320),
348
+ commitDeadlineSlot: readU64Number(body, 328),
349
+ revealDeadlineSlot: readU64Number(body, 336),
350
+ entropyHashCount: readU64Number(body, 344),
351
+ unlockIntervalStartCycleId: readU64Number(body, 352),
352
+ releasedCommitCount: readU64String(body, 360)
353
+ } : {}
332
354
  };
333
355
  }
334
356
  function decodeSatMinerCycle(data, address) {
@@ -351,7 +373,13 @@ function decodeSatMinerCycle(data, address) {
351
373
  claimedDetRebateLamports: readU64String(body, 160),
352
374
  claimedPerfRebateLamports: readU64String(body, 168),
353
375
  validParticipation: body.readUInt8(176) === 1,
354
- capitalLockReleased: body.readUInt8(177) === 1
376
+ capitalLockReleased: body.readUInt8(177) === 1,
377
+ ...body.length >= 336 ? {
378
+ commitment: readHash32(body, 184),
379
+ commitSlot: readU64Number(body, 216),
380
+ revealSlot: readU64Number(body, 224)
381
+ } : {},
382
+ ...body.length >= 344 ? { lockedCollateralLamports: readU64String(body, 232) } : {}
355
383
  };
356
384
  }
357
385
  function decodeSatMinerCapital(data, address) {
@@ -476,6 +504,8 @@ function decodeSatBondStakingDistributor(data, address) {
476
504
  totalActiveStakeRaw: readU64String(body, layout.offsets.totalActiveStakeRaw),
477
505
  rewardIndexFp: readU128String(body, layout.offsets.rewardIndexFp),
478
506
  observedRewardVaultRaw: readU64String(body, layout.offsets.observedRewardVaultRaw),
507
+ unallocatedRewardRaw: readU64String(body, layout.offsets.unallocatedRewardRaw),
508
+ fractionalRemainderFp: readU64String(body, layout.offsets.fractionalRemainderFp),
479
509
  lastSyncedSlot: readU64Number(body, layout.offsets.lastSyncedSlot),
480
510
  mintMatchesRuntime: rewardMint === SAT_MINT_ADDRESS(),
481
511
  vaultMatchesExpected: rewardVault === expectedRewardVault
@@ -497,6 +527,7 @@ function decodeSatBondStakingPosition(data, address) {
497
527
  activeStakeRaw: readU64String(body, layout.offsets.activeStakeRaw),
498
528
  claimableRewardRaw: readU64String(body, layout.offsets.claimableRewardRaw),
499
529
  rewardDebtFp: readU128String(body, layout.offsets.rewardDebtFp),
530
+ fractionalRemainderFp: readU64String(body, layout.offsets.fractionalRemainderFp),
500
531
  lastSyncedSlot: readU64Number(body, layout.offsets.lastSyncedSlot)
501
532
  };
502
533
  }
@@ -548,7 +579,8 @@ function decodeSatCycleSettlementProgressV2(data, address) {
548
579
  finalizeExclusiveUntilSlot: readU64Number(body, 984),
549
580
  scoreExclusiveUntilSlot: readU64Number(body, 992),
550
581
  distributeExclusiveUntilSlot: readU64Number(body, 1e3),
551
- keeperBountyPaidLamports: readU64String(body, 1008)
582
+ keeperBountyPaidLamports: readU64String(body, 1008),
583
+ keeperBountyUnpaidLamports: readU64String(body, 1016)
552
584
  };
553
585
  }
554
586
  function decodeSatTreasuryState(data, address) {
@@ -723,6 +755,7 @@ const satReadRpcRuntimeState = {
723
755
  lastRpcUrl: null,
724
756
  quotaLikely: false
725
757
  };
758
+ const satReadRpcEndpointStates = new Map();
726
759
  function readPositiveIntEnv(name, fallback) {
727
760
  const value = Number.parseInt(String(process.env[name] ?? ""), 10);
728
761
  return Number.isFinite(value) && value > 0 ? value : fallback;
@@ -736,6 +769,13 @@ const SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS = 5 * 6e4;
736
769
  const SAT_RPC_METHOD_METRIC_BUCKET_MS = 60 * 6e4;
737
770
  const SAT_RPC_METHOD_METRIC_RETENTION_MS = 24 * 60 * 6e4;
738
771
  const SAT_RPC_QUOTA_BACKOFF_MS = 3e4;
772
+ const SAT_RPC_FAILURE_BACKOFF_THRESHOLD = 2;
773
+ const SAT_RPC_FAILURE_BACKOFF_BASE_MS = 5e3;
774
+ const SAT_RPC_FAILURE_BACKOFF_MAX_MS = 3e4;
775
+ const SAT_RPC_MAX_RESPONSE_BYTES = 16 * 1024 * 1024;
776
+ function satRpcRequestTimeoutMs() {
777
+ return readPositiveIntEnv("FASED_SAT_RPC_REQUEST_TIMEOUT_MS", 1e4);
778
+ }
739
779
  const satRpcReadCache = new Map();
740
780
  const satRpcReadInFlight = new Map();
741
781
  const satRpcMethodMetrics = new Map();
@@ -894,36 +934,75 @@ function looksLikeRpcQuotaFailure(value) {
894
934
  }
895
935
  return message.includes("429") || message.includes("rate limit") || message.includes("too many requests") || message.includes("quota") || message.includes("credit") || message.includes("credits exhausted") || message.includes("resource exhausted");
896
936
  }
897
- function currentReadRpcQuotaBackoffMs(nowMs = Date.now()) {
898
- if (!satReadRpcRuntimeState.quotaLikely || !satReadRpcRuntimeState.lastFailureAt) {
899
- return 0;
937
+ function getOrCreateReadRpcEndpointState(rpcUrl) {
938
+ const key = normalizeRpcUrlForComparison(rpcUrl);
939
+ const existing = satReadRpcEndpointStates.get(key);
940
+ if (existing) {
941
+ return existing;
900
942
  }
901
- const failedAtMs = Date.parse(satReadRpcRuntimeState.lastFailureAt);
902
- if (!Number.isFinite(failedAtMs)) {
943
+ const created = {
944
+ consecutiveFailures: 0,
945
+ backoffUntilMs: 0,
946
+ quotaLikely: false,
947
+ lastError: null,
948
+ lastFailureAt: null,
949
+ lastSuccessAt: null
950
+ };
951
+ satReadRpcEndpointStates.set(key, created);
952
+ return created;
953
+ }
954
+ function currentReadRpcBackoffMs(rpcUrl, nowMs = Date.now()) {
955
+ const state = satReadRpcEndpointStates.get(normalizeRpcUrlForComparison(rpcUrl));
956
+ if (!state) {
903
957
  return 0;
904
958
  }
905
- const remainingMs = SAT_RPC_QUOTA_BACKOFF_MS - (nowMs - failedAtMs);
906
- return remainingMs > 0 ? remainingMs : 0;
959
+ return Math.max(0, state.backoffUntilMs - nowMs);
960
+ }
961
+ function makeReadRpcBackoffError(method, remainingMs) {
962
+ return new Error(`rpc ${method} skipped during endpoint circuit backoff; retry in ${Math.ceil(remainingMs / 1e3)}s`);
907
963
  }
908
- function makeReadRpcQuotaBackoffError(method, remainingMs) {
909
- return new Error(`rpc ${method} skipped during provider quota backoff; retry in ${Math.ceil(remainingMs / 1e3)}s`);
964
+ function markReadRpcEndpointSuccess(rpcUrl) {
965
+ const state = getOrCreateReadRpcEndpointState(rpcUrl);
966
+ state.consecutiveFailures = 0;
967
+ state.backoffUntilMs = 0;
968
+ state.quotaLikely = false;
969
+ state.lastError = null;
970
+ state.lastSuccessAt = new Date().toISOString();
971
+ }
972
+ function markReadRpcEndpointFailure(rpcUrl, error) {
973
+ const state = getOrCreateReadRpcEndpointState(rpcUrl);
974
+ const message = error instanceof Error ? error.message : String(error);
975
+ const quotaLikely = looksLikeRpcQuotaFailure(message);
976
+ state.consecutiveFailures += 1;
977
+ state.quotaLikely = quotaLikely;
978
+ state.lastError = message;
979
+ state.lastFailureAt = new Date().toISOString();
980
+ if (quotaLikely) {
981
+ state.backoffUntilMs = Date.now() + SAT_RPC_QUOTA_BACKOFF_MS;
982
+ } else if (state.consecutiveFailures >= SAT_RPC_FAILURE_BACKOFF_THRESHOLD) {
983
+ const exponent = state.consecutiveFailures - SAT_RPC_FAILURE_BACKOFF_THRESHOLD;
984
+ state.backoffUntilMs = Date.now() + Math.min(SAT_RPC_FAILURE_BACKOFF_MAX_MS, SAT_RPC_FAILURE_BACKOFF_BASE_MS * 2 ** exponent);
985
+ }
910
986
  }
911
987
  function markReadRpcSuccess(mode, rpcUrl) {
988
+ markReadRpcEndpointSuccess(rpcUrl);
912
989
  satReadRpcRuntimeState.lastMode = mode;
913
990
  satReadRpcRuntimeState.lastRpcUrl = rpcUrl;
914
- satReadRpcRuntimeState.lastError = null;
915
991
  satReadRpcRuntimeState.lastSuccessAt = new Date().toISOString();
916
- satReadRpcRuntimeState.quotaLikely = false;
917
- if (mode === "fallback") {
992
+ if (mode === "primary") {
993
+ satReadRpcRuntimeState.lastError = null;
994
+ satReadRpcRuntimeState.quotaLikely = false;
995
+ } else {
918
996
  satReadRpcRuntimeState.fallbackCount += 1;
919
997
  }
920
998
  }
921
- function markReadRpcFailure(error) {
999
+ function markReadRpcFailure(error, rpcUrl) {
922
1000
  const message = error instanceof Error ? error.message : String(error);
1001
+ markReadRpcEndpointFailure(rpcUrl, error);
923
1002
  satReadRpcRuntimeState.lastMode = "unavailable";
924
1003
  satReadRpcRuntimeState.lastError = message;
925
1004
  satReadRpcRuntimeState.lastFailureAt = new Date().toISOString();
926
- satReadRpcRuntimeState.quotaLikely = looksLikeRpcQuotaFailure(message);
1005
+ satReadRpcRuntimeState.quotaLikely = satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(message);
927
1006
  }
928
1007
  function firstNonEmpty(...values) {
929
1008
  for (const value of values) {
@@ -1044,9 +1123,9 @@ function resolveReadRpcConfig(cfg, env) {
1044
1123
  const walletId = typeof satMiningConfig.walletId === "string" ? String(satMiningConfig.walletId).trim() : undefined;
1045
1124
  const registryProviderId = walletId ? readWalletProviderRegistry(env).wallets.find((wallet) => wallet.id === walletId)?.providerId : undefined;
1046
1125
  const providerId = registryProviderId || resolveWalletProviderId(cfg, env);
1047
- const walletReadRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_READ_RPC_URL", walletId);
1048
- const walletRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_RPC_URL", walletId);
1049
- const walletReadRpcFallbackUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_EMBEDDED_KEYSTORE_RPC_FALLBACK_URL", walletId);
1126
+ const walletReadRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_URL", walletId);
1127
+ const walletRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_URL", walletId);
1128
+ const walletReadRpcFallbackUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_FALLBACK_URL", walletId);
1050
1129
  if (providerId === "local-socket-signer") {
1051
1130
  const primaryUrl = firstNonEmpty(walletReadRpcUrl, walletRpcUrl);
1052
1131
  if (!primaryUrl) {
@@ -1101,50 +1180,98 @@ function resolveEffectiveReadRpcConfig() {
1101
1180
  };
1102
1181
  return resolveReadRpcConfig(cfg, mergedEnv);
1103
1182
  }
1183
+ function createAbortableReadRpcFetch() {
1184
+ return (async (input, init) => {
1185
+ const timeoutMs = satRpcRequestTimeoutMs();
1186
+ const requestUrl = typeof input === "string" || input instanceof URL ? input.toString() : input.url;
1187
+ let guardedFetch;
1188
+ try {
1189
+ guardedFetch = await fetchWithSsrFGuard({
1190
+ url: requestUrl,
1191
+ init,
1192
+ timeoutMs,
1193
+ signal: init?.signal ?? (input instanceof Request ? input.signal : undefined),
1194
+ policy: { allowPrivateNetwork: true },
1195
+ auditContext: "sat-mining-read-rpc"
1196
+ });
1197
+ } catch (error) {
1198
+ const reason = redactSensitiveUrlLikeString(error instanceof Error ? `${error.name}: ${error.message}` : String(error));
1199
+ throw new Error(`rpc fetch failed after at most ${timeoutMs}ms (${redactSensitiveUrlLikeString(requestUrl)}): ${reason}`);
1200
+ }
1201
+ const { response, release } = guardedFetch;
1202
+ try {
1203
+ const body = await response.arrayBuffer();
1204
+ return new Response(body, {
1205
+ headers: response.headers,
1206
+ status: response.status,
1207
+ statusText: response.statusText
1208
+ });
1209
+ } finally {
1210
+ await release();
1211
+ }
1212
+ });
1213
+ }
1214
+ async function withReadRpcTimeout(task, method, rpcUrl) {
1215
+ const timeoutMs = satRpcRequestTimeoutMs();
1216
+ let timer;
1217
+ try {
1218
+ return await Promise.race([task, new Promise((_resolve, reject) => {
1219
+ timer = setTimeout(() => reject(new Error(`rpc ${method} timed out after ${timeoutMs}ms (${redactSensitiveUrlLikeString(rpcUrl)})`)), timeoutMs);
1220
+ timer.unref?.();
1221
+ })]);
1222
+ } finally {
1223
+ if (timer) {
1224
+ clearTimeout(timer);
1225
+ }
1226
+ }
1227
+ }
1104
1228
  function createReadConnection(solana, rpc) {
1105
- const primary = new solana.Connection(rpc.primaryUrl);
1106
- const secondary = rpc.secondaryUrl ? new solana.Connection(rpc.secondaryUrl) : null;
1229
+ const primary = new solana.Connection(rpc.primaryUrl, {
1230
+ disableRetryOnRateLimit: true,
1231
+ fetch: createAbortableReadRpcFetch()
1232
+ });
1233
+ const secondary = rpc.secondaryUrl ? new solana.Connection(rpc.secondaryUrl, {
1234
+ disableRetryOnRateLimit: true,
1235
+ fetch: createAbortableReadRpcFetch()
1236
+ }) : null;
1107
1237
  const withFallback = (method) => {
1108
1238
  return (async (...args) => {
1109
- const quotaBackoffMs = currentReadRpcQuotaBackoffMs();
1110
- if (quotaBackoffMs > 0) {
1111
- if (!secondary) {
1112
- throw makeReadRpcQuotaBackoffError(method, quotaBackoffMs);
1113
- }
1239
+ const primaryBackoffMs = currentReadRpcBackoffMs(rpc.primaryUrl);
1240
+ const secondaryBackoffMs = rpc.secondaryUrl ? currentReadRpcBackoffMs(rpc.secondaryUrl) : 0;
1241
+ const callEndpoint = async (connection, mode, rpcUrl) => {
1242
+ updateSatRpcMethodMetric(method, "request");
1114
1243
  try {
1115
- updateSatRpcMethodMetric(method, "request");
1116
- const result = await secondary[method](...args);
1244
+ const task = connection[method](...args);
1245
+ const result = await withReadRpcTimeout(task, method, rpcUrl);
1117
1246
  updateSatRpcMethodMetric(method, "success");
1118
- markReadRpcSuccess("fallback", rpc.secondaryUrl ?? rpc.primaryUrl);
1247
+ markReadRpcSuccess(mode, rpcUrl);
1119
1248
  return result;
1120
- } catch (secondaryError) {
1249
+ } catch (error) {
1121
1250
  updateSatRpcMethodMetric(method, "failure");
1122
- markReadRpcFailure(secondaryError);
1123
- throw secondaryError;
1251
+ markReadRpcFailure(error, rpcUrl);
1252
+ throw error;
1124
1253
  }
1254
+ };
1255
+ if (primaryBackoffMs > 0) {
1256
+ if (!secondary || !rpc.secondaryUrl || secondaryBackoffMs > 0) {
1257
+ throw makeReadRpcBackoffError(method, Math.min(primaryBackoffMs, secondaryBackoffMs > 0 ? secondaryBackoffMs : primaryBackoffMs));
1258
+ }
1259
+ return await callEndpoint(secondary, "fallback", rpc.secondaryUrl);
1125
1260
  }
1126
1261
  try {
1127
- updateSatRpcMethodMetric(method, "request");
1128
- const result = await primary[method](...args);
1129
- updateSatRpcMethodMetric(method, "success");
1130
- markReadRpcSuccess("primary", rpc.primaryUrl);
1131
- return result;
1262
+ return await callEndpoint(primary, "primary", rpc.primaryUrl);
1132
1263
  } catch (primaryError) {
1133
- updateSatRpcMethodMetric(method, "failure");
1134
- if (!secondary) {
1135
- markReadRpcFailure(primaryError);
1264
+ if (!secondary || !rpc.secondaryUrl) {
1136
1265
  throw primaryError;
1137
1266
  }
1267
+ const fallbackBackoffMs = currentReadRpcBackoffMs(rpc.secondaryUrl);
1268
+ if (fallbackBackoffMs > 0) {
1269
+ throw makeReadRpcBackoffError(method, fallbackBackoffMs);
1270
+ }
1138
1271
  try {
1139
- updateSatRpcMethodMetric(method, "request");
1140
- const result = await secondary[method](...args);
1141
- updateSatRpcMethodMetric(method, "success");
1142
- markReadRpcSuccess("fallback", rpc.secondaryUrl ?? rpc.primaryUrl);
1143
- return result;
1272
+ return await callEndpoint(secondary, "fallback", rpc.secondaryUrl);
1144
1273
  } catch (secondaryError) {
1145
- updateSatRpcMethodMetric(method, "failure");
1146
- markReadRpcFailure(new Error(`${String(primaryError instanceof Error ? primaryError.message : primaryError)}; ${String(secondaryError instanceof Error ? secondaryError.message : secondaryError)}`));
1147
- throw secondaryError;
1274
+ throw new Error(`rpc ${method} failed on primary (${String(redactSensitiveUrlLikeString(primaryError instanceof Error ? primaryError.message : String(primaryError)))}) and fallback (${String(redactSensitiveUrlLikeString(secondaryError instanceof Error ? secondaryError.message : String(secondaryError)))})`);
1148
1275
  }
1149
1276
  }
1150
1277
  });
@@ -1187,13 +1314,18 @@ async function resolveBondProgramContext(env) {
1187
1314
  programId: new solana.PublicKey(SAT_BOND_PROGRAM_ID())
1188
1315
  };
1189
1316
  }
1190
- const SAT_REGISTRY_RESERVE_TARGET_LAMPORTS = 2e8;
1191
- const SAT_PROTOCOL_VAULT_ACCOUNT_SPACE = 0;
1192
- const SAT_CYCLE_STATE_ACCOUNT_SPACE = 336;
1193
- const SAT_CYCLE_REGISTRY_META_ACCOUNT_SPACE = 88;
1194
- const SAT_CYCLE_REGISTRY_PAGE_ACCOUNT_SPACE = 2072;
1195
- const SAT_CYCLE_SETTLEMENT_PROGRESS_V2_ACCOUNT_SPACE = 1048;
1196
- const SAT_MINER_CYCLE_ACCOUNT_SPACE = 296;
1317
+ const SAT_RENT_ACCOUNT_SPACES = {
1318
+ protocolVault: 0,
1319
+ cycleState: 376,
1320
+ cycleRegistryMeta: 88,
1321
+ cycleRegistryPage: 2072,
1322
+ cycleSettlementProgressV2: 1048,
1323
+ minerCycle: 352,
1324
+ unlockInterval: 80
1325
+ };
1326
+ function calculateSatRevealSharedRentLamports(params) {
1327
+ return params.cycleSettlementProgressLamports + params.cycleRegistryPageLamports + params.unlockIntervalLamports;
1328
+ }
1197
1329
  function normalizeReadRpcConfig(rpc) {
1198
1330
  return typeof rpc === "string" ? {
1199
1331
  primaryUrl: rpc,
@@ -1212,6 +1344,14 @@ async function rpcRequestOnce(rpcUrl, method, params) {
1212
1344
  const target = new URL(rpcUrl);
1213
1345
  const transport = target.protocol === "https:" ? https : http;
1214
1346
  const payload = await new Promise((resolve, reject) => {
1347
+ let settled = false;
1348
+ const finishReject = (error) => {
1349
+ if (settled) {
1350
+ return;
1351
+ }
1352
+ settled = true;
1353
+ reject(error);
1354
+ };
1215
1355
  const req = transport.request(target, {
1216
1356
  method: "POST",
1217
1357
  headers: {
@@ -1220,17 +1360,33 @@ async function rpcRequestOnce(rpcUrl, method, params) {
1220
1360
  }
1221
1361
  }, (res) => {
1222
1362
  const chunks = [];
1223
- res.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
1363
+ let responseBytes = 0;
1364
+ res.on("data", (chunk) => {
1365
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
1366
+ responseBytes += buffer.length;
1367
+ if (responseBytes > SAT_RPC_MAX_RESPONSE_BYTES) {
1368
+ req.destroy(new Error(`rpc ${method} response exceeded size limit`));
1369
+ return;
1370
+ }
1371
+ chunks.push(buffer);
1372
+ });
1224
1373
  res.on("end", () => {
1374
+ if (settled) {
1375
+ return;
1376
+ }
1225
1377
  const text = Buffer.concat(chunks).toString("utf8");
1226
1378
  if ((res.statusCode ?? 500) >= 400) {
1227
- reject(new Error(text || `rpc ${method} failed`));
1379
+ finishReject(new Error(text || `rpc ${method} failed`));
1228
1380
  return;
1229
1381
  }
1382
+ settled = true;
1230
1383
  resolve(text);
1231
1384
  });
1232
1385
  });
1233
- req.on("error", reject);
1386
+ req.setTimeout(satRpcRequestTimeoutMs(), () => {
1387
+ req.destroy(new Error(`rpc ${method} timed out after ${satRpcRequestTimeoutMs()}ms (${redactSensitiveUrlLikeString(rpcUrl)})`));
1388
+ });
1389
+ req.on("error", (error) => finishReject(error));
1234
1390
  req.write(body);
1235
1391
  req.end();
1236
1392
  });
@@ -1247,29 +1403,35 @@ async function rpcRequestOnce(rpcUrl, method, params) {
1247
1403
  }
1248
1404
  async function rpcRequest(rpc, method, params) {
1249
1405
  const normalized = normalizeReadRpcConfig(rpc);
1250
- const quotaBackoffMs = currentReadRpcQuotaBackoffMs();
1251
- if (quotaBackoffMs > 0 && !normalized.secondaryUrl) {
1252
- throw makeReadRpcQuotaBackoffError(method, quotaBackoffMs);
1406
+ const primaryBackoffMs = currentReadRpcBackoffMs(normalized.primaryUrl);
1407
+ const secondaryBackoffMs = normalized.secondaryUrl ? currentReadRpcBackoffMs(normalized.secondaryUrl) : 0;
1408
+ if (primaryBackoffMs > 0 && (!normalized.secondaryUrl || secondaryBackoffMs > 0)) {
1409
+ throw makeReadRpcBackoffError(method, Math.min(primaryBackoffMs, secondaryBackoffMs > 0 ? secondaryBackoffMs : primaryBackoffMs));
1253
1410
  }
1254
- const useFallbackDueToQuota = quotaBackoffMs > 0 && Boolean(normalized.secondaryUrl);
1411
+ const useFallbackDueToBackoff = primaryBackoffMs > 0 && Boolean(normalized.secondaryUrl);
1255
1412
  try {
1256
- const rpcUrl = useFallbackDueToQuota && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
1413
+ const rpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
1257
1414
  const result = await rpcRequestOnce(rpcUrl, method, params);
1258
- markReadRpcSuccess(useFallbackDueToQuota && normalized.secondaryUrl ? "fallback" : "primary", rpcUrl);
1415
+ markReadRpcSuccess(useFallbackDueToBackoff && normalized.secondaryUrl ? "fallback" : "primary", rpcUrl);
1259
1416
  return result;
1260
1417
  } catch (primaryError) {
1261
- if (!normalized.secondaryUrl || useFallbackDueToQuota) {
1262
- markReadRpcFailure(primaryError);
1418
+ const failedRpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
1419
+ markReadRpcFailure(primaryError, failedRpcUrl);
1420
+ if (!normalized.secondaryUrl || useFallbackDueToBackoff) {
1263
1421
  throw primaryError;
1264
1422
  }
1423
+ const fallbackBackoffMs = currentReadRpcBackoffMs(normalized.secondaryUrl);
1424
+ if (fallbackBackoffMs > 0) {
1425
+ throw makeReadRpcBackoffError(method, fallbackBackoffMs);
1426
+ }
1265
1427
  try {
1266
1428
  const result = await rpcRequestOnce(normalized.secondaryUrl, method, params);
1267
1429
  markReadRpcSuccess("fallback", normalized.secondaryUrl);
1268
1430
  return result;
1269
1431
  } catch (secondaryError) {
1270
- const primaryMessage = primaryError instanceof Error ? primaryError.message : String(primaryError);
1271
- const secondaryMessage = secondaryError instanceof Error ? secondaryError.message : String(secondaryError);
1272
- markReadRpcFailure(new Error(`rpc ${method} failed on primary (${primaryMessage}) and fallback (${secondaryMessage})`));
1432
+ markReadRpcFailure(secondaryError, normalized.secondaryUrl);
1433
+ const primaryMessage = redactSensitiveUrlLikeString(primaryError instanceof Error ? primaryError.message : String(primaryError));
1434
+ const secondaryMessage = redactSensitiveUrlLikeString(secondaryError instanceof Error ? secondaryError.message : String(secondaryError));
1273
1435
  throw new Error(`rpc ${method} failed on primary (${primaryMessage}) and fallback (${secondaryMessage})`);
1274
1436
  }
1275
1437
  }
@@ -1415,6 +1577,25 @@ async function inspectSatChainSlot(_config) {
1415
1577
  const rpc = resolveEffectiveReadRpcConfig();
1416
1578
  return await rpcRequest(rpc, "getSlot", []);
1417
1579
  }
1580
+ async function inspectSatAddressLookupTable(_config, params) {
1581
+ const { solana, connection } = await resolveConnection(process.env);
1582
+ const address = new solana.PublicKey(params.address);
1583
+ const account = await connection.getAccountInfo(address, "confirmed");
1584
+ if (!account) {
1585
+ return null;
1586
+ }
1587
+ if (!account.owner.equals(new solana.PublicKey(ADDRESS_LOOKUP_TABLE_PROGRAM_ID))) {
1588
+ throw new Error("SAT distribution lookup table has the wrong program owner");
1589
+ }
1590
+ const state = solana.AddressLookupTableAccount.deserialize(account.data);
1591
+ return {
1592
+ address: address.toBase58(),
1593
+ authority: state.authority?.toBase58() ?? null,
1594
+ addresses: state.addresses.map((entry) => entry.toBase58()),
1595
+ active: state.deactivationSlot === 18446744073709551615n,
1596
+ lastExtendedSlot: state.lastExtendedSlot
1597
+ };
1598
+ }
1418
1599
  async function inspectSatLamportBalance(_config, params) {
1419
1600
  const rpc = resolveEffectiveReadRpcConfig();
1420
1601
  return await fetchLamportBalanceRaw(rpc, params.address);
@@ -1574,6 +1755,7 @@ async function inspectSatMiningStatusAccounts(_config, params) {
1574
1755
  const mint = new solana.PublicKey(SAT_MINT_ADDRESS());
1575
1756
  const [globalAddress] = solana.PublicKey.findProgramAddressSync([Buffer.from("sat_global_state")], programId);
1576
1757
  const [currentCycleAddress] = solana.PublicKey.findProgramAddressSync([Buffer.from("sat_cycle_state"), encodeU64(currentCycleId)], programId);
1758
+ const [currentSettlementProgressAddress] = solana.PublicKey.findProgramAddressSync([Buffer.from("sat_cycle_settlement_progress_v2"), encodeU64(currentCycleId)], programId);
1577
1759
  const [treasuryStateAddress] = solana.PublicKey.findProgramAddressSync([Buffer.from("sat_treasury_state")], programId);
1578
1760
  const [treasury] = solana.PublicKey.findProgramAddressSync([Buffer.from("treasury")], programId);
1579
1761
  const currentMinerCycleAddress = owner ? solana.PublicKey.findProgramAddressSync([
@@ -1591,6 +1773,7 @@ async function inspectSatMiningStatusAccounts(_config, params) {
1591
1773
  const treasuryAta = deriveAssociatedTokenAddress(solana, treasury, mint);
1592
1774
  const coreEntries = [
1593
1775
  ["currentCycle", currentCycleAddress],
1776
+ ["currentSettlementProgress", currentSettlementProgressAddress],
1594
1777
  ["currentMinerCycle", currentMinerCycleAddress],
1595
1778
  ["claimMinerCycle", claimMinerCycleAddress],
1596
1779
  ["minerCapital", minerCapitalAddress],
@@ -1614,6 +1797,7 @@ async function inspectSatMiningStatusAccounts(_config, params) {
1614
1797
  const recordFor = (address) => address ? byAddress.get(address.toBase58()) ?? null : null;
1615
1798
  const globalRecord = recordFor(globalAddress);
1616
1799
  const currentCycleRecord = recordFor(currentCycleAddress);
1800
+ const currentSettlementProgressRecord = recordFor(currentSettlementProgressAddress);
1617
1801
  const currentMinerCycleRecord = recordFor(currentMinerCycleAddress);
1618
1802
  const claimMinerCycleRecord = recordFor(claimMinerCycleAddress);
1619
1803
  const minerCapitalRecord = recordFor(minerCapitalAddress);
@@ -1622,6 +1806,7 @@ async function inspectSatMiningStatusAccounts(_config, params) {
1622
1806
  const treasuryAtaRecord = recordFor(treasuryAta);
1623
1807
  const globalState = globalRecord?.data ? decodeSatGlobalState(globalRecord.data, globalAddress.toBase58()) : null;
1624
1808
  const currentCycle = currentCycleRecord?.data ? decodeSatCycle(currentCycleRecord.data, currentCycleAddress.toBase58()) : null;
1809
+ const currentSettlementProgress = currentSettlementProgressRecord?.data ? decodeSatCycleSettlementProgressV2(currentSettlementProgressRecord.data, currentSettlementProgressAddress.toBase58()) : null;
1625
1810
  const currentMinerCycle = currentMinerCycleRecord?.data ? decodeSatMinerCycle(currentMinerCycleRecord.data, currentMinerCycleAddress?.toBase58() ?? "") : null;
1626
1811
  const claimMinerCycle = claimMinerCycleRecord?.data ? decodeSatMinerCycle(claimMinerCycleRecord.data, claimMinerCycleAddress?.toBase58() ?? "") : null;
1627
1812
  const minerCapital = minerCapitalRecord?.data ? decodeSatMinerCapital(minerCapitalRecord.data, minerCapitalAddress?.toBase58() ?? "") : null;
@@ -1637,6 +1822,7 @@ async function inspectSatMiningStatusAccounts(_config, params) {
1637
1822
  } : null;
1638
1823
  writeRpcCacheValue(`view:global-state:${rpcCacheScope(rpc)}:${globalAddress.toBase58()}`, SAT_RPC_STABLE_VIEW_CACHE_TTL_MS, globalState);
1639
1824
  writeRpcCacheValue(`view:cycle:${rpcCacheScope(rpc)}:${currentCycleId}`, SAT_RPC_LIVE_VIEW_CACHE_TTL_MS, currentCycle);
1825
+ writeRpcCacheValue(`view:settlement-progress:${rpcCacheScope(rpc)}:${currentCycleId}`, SAT_RPC_LIVE_VIEW_CACHE_TTL_MS, currentSettlementProgress);
1640
1826
  if (owner && currentMinerCycleAddress) {
1641
1827
  writeRpcCacheValue(`view:miner-cycle:${rpcCacheScope(rpc)}:${authority}:${currentCycleId}`, SAT_RPC_LIVE_VIEW_CACHE_TTL_MS, currentMinerCycle);
1642
1828
  }
@@ -1653,6 +1839,7 @@ async function inspectSatMiningStatusAccounts(_config, params) {
1653
1839
  return {
1654
1840
  globalState,
1655
1841
  currentCycle,
1842
+ currentSettlementProgress,
1656
1843
  currentMinerCycle,
1657
1844
  claimMinerCycle,
1658
1845
  minerCapital,
@@ -2013,28 +2200,35 @@ async function inspectSatTreasuryVaultLamports(_config) {
2013
2200
  lamports: await fetchLamportBalanceRaw(rpc, address.toBase58())
2014
2201
  };
2015
2202
  }
2016
- async function inspectSatRentExemptionLamports(_config) {
2203
+ async function inspectSatRentExemptionLamports(config) {
2017
2204
  const { connection } = await resolveConnection(process.env);
2018
2205
  const rpc = resolveEffectiveReadRpcConfig();
2019
- return await getOrLoadRpcCacheValue(`view:rent-exemption:${rpcCacheScope(rpc)}`, SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS, async () => {
2020
- const [protocolVaultLamports, cycleStateLamports, cycleRegistryMetaLamports, cycleRegistryPageLamports, cycleSettlementProgressLamports, minerCycleLamports] = await Promise.all([
2021
- connection.getMinimumBalanceForRentExemption(SAT_PROTOCOL_VAULT_ACCOUNT_SPACE),
2022
- connection.getMinimumBalanceForRentExemption(SAT_CYCLE_STATE_ACCOUNT_SPACE),
2023
- connection.getMinimumBalanceForRentExemption(SAT_CYCLE_REGISTRY_META_ACCOUNT_SPACE),
2024
- connection.getMinimumBalanceForRentExemption(SAT_CYCLE_REGISTRY_PAGE_ACCOUNT_SPACE),
2025
- connection.getMinimumBalanceForRentExemption(SAT_CYCLE_SETTLEMENT_PROGRESS_V2_ACCOUNT_SPACE),
2026
- connection.getMinimumBalanceForRentExemption(SAT_MINER_CYCLE_ACCOUNT_SPACE)
2206
+ const registryReserveTargetLamports = resolveSatGenesisProfileContract(config.network).registryReserveTargetLamports;
2207
+ return await getOrLoadRpcCacheValue(`view:rent-exemption:${rpcCacheScope(rpc)}:${registryReserveTargetLamports}`, SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS, async () => {
2208
+ const [protocolVaultLamports, cycleStateLamports, cycleRegistryMetaLamports, cycleRegistryPageLamports, cycleSettlementProgressLamports, minerCycleLamports, unlockIntervalLamports] = await Promise.all([
2209
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.protocolVault),
2210
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.cycleState),
2211
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.cycleRegistryMeta),
2212
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.cycleRegistryPage),
2213
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.cycleSettlementProgressV2),
2214
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.minerCycle),
2215
+ connection.getMinimumBalanceForRentExemption(SAT_RENT_ACCOUNT_SPACES.unlockInterval)
2027
2216
  ]);
2028
2217
  const openCycleLamports = cycleStateLamports + cycleRegistryMetaLamports;
2029
- const submitCycleSharedLamports = cycleSettlementProgressLamports + cycleRegistryPageLamports;
2218
+ const submitCycleSharedLamports = calculateSatRevealSharedRentLamports({
2219
+ cycleSettlementProgressLamports,
2220
+ cycleRegistryPageLamports,
2221
+ unlockIntervalLamports
2222
+ });
2030
2223
  return {
2031
- registryReserveTargetLamports: String(SAT_REGISTRY_RESERVE_TARGET_LAMPORTS),
2224
+ registryReserveTargetLamports: String(registryReserveTargetLamports),
2032
2225
  protocolVaultLamports: String(protocolVaultLamports),
2033
2226
  cycleStateLamports: String(cycleStateLamports),
2034
2227
  cycleRegistryMetaLamports: String(cycleRegistryMetaLamports),
2035
2228
  cycleRegistryPageLamports: String(cycleRegistryPageLamports),
2036
2229
  cycleSettlementProgressLamports: String(cycleSettlementProgressLamports),
2037
2230
  minerCycleLamports: String(minerCycleLamports),
2231
+ unlockIntervalLamports: String(unlockIntervalLamports),
2038
2232
  openCycleLamports: String(openCycleLamports),
2039
2233
  submitCycleSharedLamports: String(submitCycleSharedLamports),
2040
2234
  submitCycleSignerLamports: String(minerCycleLamports)
@@ -2158,6 +2352,18 @@ async function inspectSatRoundState(_config, params) {
2158
2352
  }
2159
2353
  function inspectSatConnectionDetails() {
2160
2354
  const rpc = resolveEffectiveReadRpcConfig();
2355
+ const endpointStates = [rpc.primaryUrl, rpc.secondaryUrl].filter((rpcUrl) => Boolean(rpcUrl)).map((rpcUrl) => {
2356
+ const state = satReadRpcEndpointStates.get(normalizeRpcUrlForComparison(rpcUrl));
2357
+ return {
2358
+ rpcUrl: redactSensitiveUrlLikeString(rpcUrl),
2359
+ consecutiveFailures: state?.consecutiveFailures ?? 0,
2360
+ backoffRemainingMs: currentReadRpcBackoffMs(rpcUrl),
2361
+ quotaLikely: state?.quotaLikely ?? false,
2362
+ lastError: state?.lastError ? redactSensitiveUrlLikeString(state.lastError) : null,
2363
+ lastFailureAt: state?.lastFailureAt ?? null,
2364
+ lastSuccessAt: state?.lastSuccessAt ?? null
2365
+ };
2366
+ });
2161
2367
  return {
2162
2368
  programId: SAT_PROGRAM_ID(),
2163
2369
  bondProgramId: SAT_BOND_PROGRAM_ID(),
@@ -2167,7 +2373,8 @@ function inspectSatConnectionDetails() {
2167
2373
  ...satReadRpcRuntimeState,
2168
2374
  lastError: satReadRpcRuntimeState.lastError ? redactSensitiveUrlLikeString(satReadRpcRuntimeState.lastError) : null,
2169
2375
  lastRpcUrl: satReadRpcRuntimeState.lastRpcUrl ? redactSensitiveUrlLikeString(satReadRpcRuntimeState.lastRpcUrl) : null,
2170
- quotaLikely: satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(satReadRpcRuntimeState.lastError)
2376
+ quotaLikely: satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(satReadRpcRuntimeState.lastError),
2377
+ endpoints: endpointStates
2171
2378
  },
2172
2379
  rpcMetrics: summarizeSatRpcMethodMetrics()
2173
2380
  };
@@ -2286,4 +2493,4 @@ function sortableValue(row, sortBy) {
2286
2493
  }
2287
2494
 
2288
2495
  //#endregion
2289
- export { inspectSatBondPosition, inspectSatBondStakingDistributor, inspectSatBondStakingPosition, inspectSatBondTierPolicy, inspectSatChainSlot, inspectSatCycleRegistryMeta, inspectSatMinerCyclesByAddress, invalidateSatReadCaches };
2496
+ export { inspectSatAddressLookupTable, inspectSatBondPosition, inspectSatBondStakingDistributor, inspectSatBondStakingPosition, inspectSatChainSlot, inspectSatCycle, inspectSatCycleRegistryMeta, inspectSatMinerCyclesByAddress, invalidateSatReadCaches };
@@ -122,7 +122,9 @@ const DEDICATED_FALLBACK_STAKING_DISTRIBUTOR_LAYOUT = {
122
122
  totalActiveStakeRaw: 120,
123
123
  rewardIndexFp: 128,
124
124
  observedRewardVaultRaw: 144,
125
- lastSyncedSlot: 152
125
+ lastSyncedSlot: 152,
126
+ unallocatedRewardRaw: 160,
127
+ fractionalRemainderFp: 168
126
128
  }
127
129
  };
128
130
  const DEDICATED_FALLBACK_STAKING_POSITION_LAYOUT = {
@@ -142,7 +144,8 @@ const DEDICATED_FALLBACK_STAKING_POSITION_LAYOUT = {
142
144
  activeStakeRaw: 80,
143
145
  claimableRewardRaw: 88,
144
146
  rewardDebtFp: 96,
145
- lastSyncedSlot: 112
147
+ lastSyncedSlot: 112,
148
+ fractionalRemainderFp: 120
146
149
  }
147
150
  };
148
151
  function hasDedicatedBondProgram(env = process.env) {