@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.
- package/CHANGELOG.md +48 -0
- package/README.md +44 -29
- package/config/dependency-ownership.json +1 -1
- package/config/signer-policies/README.md +58 -0
- package/config/signer-policies/agent.json.template +32 -0
- package/config/signer-policies/mining.json.template +69 -0
- package/config/signer-policies/network.json.template +5 -0
- package/config/signer-policies/vault.json.template +70 -0
- package/config/signer-protocol-v2.json +78 -0
- package/config/typescript-noemit-baseline.json +680 -0
- package/dist/agents/auth-profiles/store.js +267 -31
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/memory-search.js +7 -1
- package/dist/agents/model-catalog-access.js +1 -2
- package/dist/agents/model-catalog-snapshot.js +1 -1
- package/dist/agents/model-catalog-source.js +1 -1
- package/dist/agents/model-metadata.js +1 -1
- package/dist/agents/model-selection.js +2 -28
- package/dist/agents/models-config.providers.js +6 -6
- package/dist/agents/pi-embedded-runner/compact.js +15 -7
- package/dist/agents/pi-embedded-runner/model.js +1 -1
- package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
- package/dist/agents/pi-embedded-runner/run.js +2 -0
- package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
- package/dist/agents/pi-tool-definition-adapter.js +16 -1
- package/dist/agents/pi-tools.js +2 -1
- package/dist/agents/sandbox/config.js +1 -1
- package/dist/agents/sandbox/context.js +27 -2
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +128 -0
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
- package/dist/agents/tools/mining-tool.js +1 -1
- package/dist/agents/tools/session-status-tool.js +1 -1
- package/dist/agents/tools/wallet-action-tool.js +172 -36
- package/dist/agents/tools/wallet-skill-policy.js +65 -23
- package/dist/agents/tools/wallet-tool.js +7 -11
- package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
- package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
- package/dist/auto-reply/reply/directive-handling.model.js +2 -1
- package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
- package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
- package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
- package/dist/auto-reply/reply/model-selection.js +7 -4
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/brand.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/channel-web.js +2 -2
- package/dist/cli/gateway-cli/run.js +8 -0
- package/dist/cli/program/command-registry.js +1 -1
- package/dist/cli/program/register.onboard.js +2 -3
- package/dist/cli/program/register.wallet.js +16 -123
- package/dist/cli/providers-cli.js +1 -1
- package/dist/cli/sat-cli.js +129 -2
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/model-picker.js +6 -6
- package/dist/commands/models/auth.js +1 -1
- package/dist/commands/onboard-auth.config-gateways.js +1 -1
- package/dist/commands/onboard-auth.credentials.js +32 -8
- package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
- package/dist/commands/onboard-non-interactive/local.js +5 -1
- package/dist/commands/wallet.js +568 -1911
- package/dist/config/config.js +2 -2
- package/dist/config/io.js +64 -2
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-DLil9VO1.js → app-MaQnPa5G.js} +1511 -1555
- package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
- package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
- package/dist/control-ui/assets/{index-DdE_NIXo.js → index-D4YMr1fA.js} +3 -3
- package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
- package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
- package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
- package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
- package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/version.json +1 -1
- package/dist/daemon/systemd-system.js +56 -50
- package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
- package/dist/extensions/sat-mining/src/rpc-read.js +291 -84
- package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
- package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
- package/dist/extensions/sat-mining/src/solana-submit.js +1274 -390
- package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
- package/dist/federation/auto-connect.js +98 -8
- package/dist/federation/marketplace-capability-adapter.js +33 -7
- package/dist/federation/marketplace-delivery-outbox.js +196 -0
- package/dist/federation/marketplace-delivery.js +351 -215
- package/dist/federation/marketplace-direct-payment.js +272 -141
- package/dist/federation/marketplace-escrow.js +607 -249
- package/dist/federation/marketplace-settlement-ledger.js +352 -0
- package/dist/federation/offers.js +9 -7
- package/dist/federation/peer-auth-v2.js +529 -0
- package/dist/gateway/a2a-http.js +425 -96
- package/dist/gateway/a2a-settlement.js +259 -153
- package/dist/gateway/a2a-task-store.js +524 -0
- package/dist/gateway/auth.js +38 -2
- package/dist/gateway/config-reload.js +46 -33
- package/dist/gateway/durable-capacity.js +31 -0
- package/dist/gateway/federation-http.js +540 -135
- package/dist/gateway/federation-marketplace-run-store.js +397 -0
- package/dist/gateway/federation-marketplace.js +535 -230
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-http.js +1084 -1205
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods.js +1 -2
- package/dist/gateway/server-reload-handlers.js +196 -66
- package/dist/gateway/server-runtime-config.js +1 -1
- package/dist/gateway/server-secrets-runtime.js +288 -0
- package/dist/gateway/server.impl.js +73 -42
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/index.js +4 -2
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/restart.js +41 -10
- package/dist/infra/update-runner.js +96 -0
- package/dist/light-update-status.js +11 -11
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/session-files.js +16 -2
- package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
- package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
- package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-I4IngVlJ.js} +27 -27
- package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
- package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
- package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
- package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
- package/dist/plugin-sdk/channel-plugin-common.js +4 -4
- package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
- package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DLQ6_lLK.js} +1 -1
- package/dist/plugin-sdk/command-status.d.ts +2 -2
- package/dist/plugin-sdk/command-status.js +27 -27
- package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
- package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
- package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
- package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-D_8FVI1C.js} +6798 -3695
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +6 -6
- package/dist/plugin-sdk/discord.js +19 -19
- package/dist/plugin-sdk/file-lock.js +35 -4
- package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
- package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
- package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
- package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
- package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
- package/dist/plugin-sdk/index.d.ts +21 -39
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
- package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
- package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
- package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
- package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
- package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
- package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-B4KF4Kpo.js} +31 -31
- package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.js} +27 -27
- package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
- package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
- package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
- package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
- package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
- package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
- package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
- package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
- package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
- package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
- package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
- package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
- package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
- package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
- package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
- package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
- package/dist/plugin-sdk/sat-runtime.d.ts +565 -309
- package/dist/plugin-sdk/sat-runtime.js +29 -29
- package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
- package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
- package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
- package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
- package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
- package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
- package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
- package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BHmvqgjH.js} +39 -39
- package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
- package/dist/plugin-sdk/slack.d.ts +6 -6
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-By5AcorL.js} +3 -3
- package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
- package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
- package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-DGnBz1YT.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +6 -6
- package/dist/plugin-sdk/telegram.js +8 -8
- package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
- package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
- package/dist/plugin-sdk/tmp-fased-dir-EJGTmL1Q.d.ts +486 -0
- package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
- package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
- package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
- package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
- package/dist/plugin-sdk/{web-CInY-lCv.js → web-DUJwrTYs.js} +32 -32
- package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
- package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
- package/dist/plugin-sdk/whatsapp.d.ts +13 -13
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +1 -1
- package/dist/secrets/runtime.js +1 -1
- package/dist/wallet/external-submission-ledger.js +376 -0
- package/dist/wallet/legacy-embedded-keystore.js +40 -0
- package/dist/wallet/local-socket-signer-archive.js +30 -0
- package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
- package/dist/wallet/local-socket-signer-policy.js +166 -0
- package/dist/wallet/local-socket-signer-protocol.js +578 -117
- package/dist/wallet/native-signer-wallet-id.js +25 -0
- package/dist/wallet/providers/alchemy-adapter.js +3 -0
- package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
- package/dist/wallet/providers/turnkey-adapter.js +292 -34
- package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
- package/dist/wallet/signer-network-admin.js +184 -0
- package/dist/wallet/signer-protocol-v2.generated.js +92 -0
- package/dist/wallet/solana-bond-signing.js +157 -69
- package/dist/wallet/solana-reviewed-transaction.js +375 -0
- package/dist/wallet/solana-swap.js +520 -64
- package/dist/wallet/solana-transaction-inspection.js +106 -4
- package/dist/wallet/solana-trigger.js +658 -320
- package/dist/wallet/turnkey-reviewed-state.js +370 -0
- package/dist/wallet/wallet-approval-auth.js +17 -28
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +16 -11
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +93 -37
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +57 -44
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +28 -41
- package/dist/wallet/wallet-secrets-store.js +22 -0
- package/dist/wallet/wallet-send-approvals.js +1891 -589
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +14 -13
- package/dist/wallet/wallet-standard-review.js +353 -0
- package/dist/wallet/wallet-status.js +0 -9
- package/dist/wallet/wallet-task-ledger.js +16 -2
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/wizard/host-security-capability.js +14 -23
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +117 -1367
- package/dist/wizard/onboarding.js +172 -217
- package/dist/wizard/onboarding.wallet.js +232 -785
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +18 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +2 -2
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +18 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +18 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/index.ts +587 -154
- package/extensions/sat-mining/package.json +1 -1
- package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
- package/extensions/sat-mining/src/audit-store.ts +91 -5
- package/extensions/sat-mining/src/claim-service.ts +85 -14
- package/extensions/sat-mining/src/client.ts +13 -0
- package/extensions/sat-mining/src/config.ts +9 -0
- package/extensions/sat-mining/src/cycle-progress.ts +16 -8
- package/extensions/sat-mining/src/epoch-service.ts +9 -5
- package/extensions/sat-mining/src/gateway-runner.ts +21 -1
- package/extensions/sat-mining/src/protocol-contract.ts +45 -1
- package/extensions/sat-mining/src/recovery-service.ts +312 -0
- package/extensions/sat-mining/src/round-watcher.ts +391 -81
- package/extensions/sat-mining/src/rpc-read.ts +431 -106
- package/extensions/sat-mining/src/runtime.ts +16 -0
- package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
- package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
- package/extensions/sat-mining/src/solana-submit.ts +1544 -436
- package/extensions/sat-mining/src/submission-ledger.ts +434 -0
- package/extensions/signal/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +18 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +18 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +18 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +18 -0
- package/extensions/zalouser/package.json +1 -1
- package/install.sh +4951 -0
- package/package.json +23 -5
- package/scripts/fased-host-updater.mjs +1421 -0
- package/scripts/fased-host-updaterctl.mjs +186 -0
- package/scripts/fased-managed-service.sh +36 -0
- package/scripts/fased-managed-updater.mjs +3065 -156
- package/scripts/fased-signer-enroll-hosting.sh +275 -0
- package/scripts/fased-signer-network-hosting.sh +143 -0
- package/scripts/fased-signer-owner-policy.mjs +1442 -0
- package/scripts/fased-signer-policy-hosting.sh +50 -0
- package/scripts/fased-signer-policy-local.sh +26 -0
- package/scripts/hosted-release-manifest.mjs +185 -0
- package/scripts/install-fased-signerd.sh +183 -108
- package/scripts/install-managed-runtime.mjs +212 -10
- package/scripts/managed-runtime-layout.mjs +75 -3
- package/scripts/migrate-hosted-signer-v2.mjs +58 -0
- package/scripts/start-managed.sh +173 -360
- package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
- package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
- package/dist/wallet/local-socket-signer-broker.js +0 -224
- package/dist/wallet/local-socket-signer-custody.js +0 -42
- package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
- package/dist/wallet/providers/privy-adapter.js +0 -80
- 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
|
|
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
|
|
898
|
-
|
|
899
|
-
|
|
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
|
|
902
|
-
|
|
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
|
-
|
|
906
|
-
|
|
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
|
|
909
|
-
|
|
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
|
-
|
|
917
|
-
|
|
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)
|
|
1048
|
-
const walletRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_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)
|
|
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
|
-
|
|
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
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
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
|
-
|
|
1116
|
-
const result = await
|
|
1244
|
+
const task = connection[method](...args);
|
|
1245
|
+
const result = await withReadRpcTimeout(task, method, rpcUrl);
|
|
1117
1246
|
updateSatRpcMethodMetric(method, "success");
|
|
1118
|
-
markReadRpcSuccess(
|
|
1247
|
+
markReadRpcSuccess(mode, rpcUrl);
|
|
1119
1248
|
return result;
|
|
1120
|
-
} catch (
|
|
1249
|
+
} catch (error) {
|
|
1121
1250
|
updateSatRpcMethodMetric(method, "failure");
|
|
1122
|
-
markReadRpcFailure(
|
|
1123
|
-
throw
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
1251
|
-
|
|
1252
|
-
|
|
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
|
|
1411
|
+
const useFallbackDueToBackoff = primaryBackoffMs > 0 && Boolean(normalized.secondaryUrl);
|
|
1255
1412
|
try {
|
|
1256
|
-
const rpcUrl =
|
|
1413
|
+
const rpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
|
|
1257
1414
|
const result = await rpcRequestOnce(rpcUrl, method, params);
|
|
1258
|
-
markReadRpcSuccess(
|
|
1415
|
+
markReadRpcSuccess(useFallbackDueToBackoff && normalized.secondaryUrl ? "fallback" : "primary", rpcUrl);
|
|
1259
1416
|
return result;
|
|
1260
1417
|
} catch (primaryError) {
|
|
1261
|
-
|
|
1262
|
-
|
|
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
|
-
|
|
1271
|
-
const
|
|
1272
|
-
|
|
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(
|
|
2203
|
+
async function inspectSatRentExemptionLamports(config) {
|
|
2017
2204
|
const { connection } = await resolveConnection(process.env);
|
|
2018
2205
|
const rpc = resolveEffectiveReadRpcConfig();
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
connection.getMinimumBalanceForRentExemption(
|
|
2023
|
-
connection.getMinimumBalanceForRentExemption(
|
|
2024
|
-
connection.getMinimumBalanceForRentExemption(
|
|
2025
|
-
connection.getMinimumBalanceForRentExemption(
|
|
2026
|
-
connection.getMinimumBalanceForRentExemption(
|
|
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 =
|
|
2218
|
+
const submitCycleSharedLamports = calculateSatRevealSharedRentLamports({
|
|
2219
|
+
cycleSettlementProgressLamports,
|
|
2220
|
+
cycleRegistryPageLamports,
|
|
2221
|
+
unlockIntervalLamports
|
|
2222
|
+
});
|
|
2030
2223
|
return {
|
|
2031
|
-
registryReserveTargetLamports: String(
|
|
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,
|
|
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) {
|