@fased/fased 0.1.62 → 0.1.64
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 +32 -0
- package/README.md +38 -30
- package/config/dependency-ownership.json +1 -1
- package/config/signer-policies/README.md +49 -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 +76 -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-bR-fO5ty.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-ckCxHwjy.js} +3 -3
- package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-BgHFh0ei.js} +134 -114
- package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
- 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 +235 -67
- 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 +1038 -397
- 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-BYxAt775.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-DIRHG2gJ.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-BOT7kHb6.js} +6779 -3696
- 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-BCFDaqJ-.js} +31 -31
- package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-BgbjRiPM.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DFf87SMM.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-B3bHYGaw.d.ts → pairing-message-CS-9BHug.d.ts} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
- 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 +549 -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-BUTt8cxK.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-D0wHVqjt.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-CC_qN4v0.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-xOTGlzBE.d.ts +486 -0
- package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-C3avNytw.d.ts} +3 -4
- package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
- package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-DWfbSAaM.d.ts} +2 -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-BXsJ1vqe.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 +561 -118
- 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 +90 -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 +90 -36
- 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 +12 -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 +12 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +12 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/index.ts +498 -153
- 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 +50 -5
- package/extensions/sat-mining/src/claim-service.ts +85 -14
- 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 +330 -89
- package/extensions/sat-mining/src/runtime.ts +14 -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 +1199 -428
- package/extensions/sat-mining/src/submission-ledger.ts +433 -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 +12 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +12 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +12 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +12 -0
- package/extensions/zalouser/package.json +1 -1
- package/install.sh +4955 -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 +1430 -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 +169 -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";
|
|
@@ -311,15 +313,19 @@ function decodeSatGlobalState(data, address) {
|
|
|
311
313
|
}
|
|
312
314
|
function decodeSatCycle(data, address) {
|
|
313
315
|
const body = expectAccountData(data, ACCOUNT_DISCRIMINATOR.satCycleState, "SAT cycle state");
|
|
316
|
+
const validMinerCount = readU64String(body, 192);
|
|
317
|
+
const cycleSeed = readHash32(body, 40);
|
|
314
318
|
return {
|
|
315
319
|
address,
|
|
316
320
|
cycleId: readU64Number(body, 0),
|
|
317
321
|
openTs: readI64Number(body, 8),
|
|
318
322
|
closeTs: readI64Number(body, 16),
|
|
319
323
|
status: body.readUInt8(24),
|
|
324
|
+
cycleSeed,
|
|
325
|
+
entropyUnavailable: cycleSeed === SAT_PROTOCOL_CONSTANTS.entropyUnavailableSeedHex,
|
|
320
326
|
unlockTargetLamports: readU64String(body, 176),
|
|
321
327
|
totalCommittedLamports: readU64String(body, 184),
|
|
322
|
-
validMinerCount
|
|
328
|
+
validMinerCount,
|
|
323
329
|
unlockRatioFp: readU64String(body, 200),
|
|
324
330
|
issuedCycleMinerSatRaw: readU64String(body, 208),
|
|
325
331
|
unissuedCycleMinerSatRaw: readU64String(body, 216),
|
|
@@ -328,7 +334,22 @@ function decodeSatCycle(data, address) {
|
|
|
328
334
|
performanceRebatePoolLamports: readU64String(body, 240),
|
|
329
335
|
treasurySolLamports: readU64String(body, 248),
|
|
330
336
|
submittedSolErosionPoolLamports: readU64String(body, 256),
|
|
331
|
-
keeperBountyPaidLamports: readU64String(body, 264)
|
|
337
|
+
keeperBountyPaidLamports: readU64String(body, 264),
|
|
338
|
+
commitDeadlineTs: readI64Number(body, 272),
|
|
339
|
+
revealDeadlineTs: readI64Number(body, 280),
|
|
340
|
+
entropyTargetSlot: readU64Number(body, 288),
|
|
341
|
+
committedMinerCount: readU64String(body, 296),
|
|
342
|
+
revealedMinerCount: validMinerCount,
|
|
343
|
+
resolvedCommitCount: readU64String(body, 304),
|
|
344
|
+
entropySealedSlot: readU64Number(body, 312),
|
|
345
|
+
...body.length >= 368 ? {
|
|
346
|
+
openSlot: readU64Number(body, 320),
|
|
347
|
+
commitDeadlineSlot: readU64Number(body, 328),
|
|
348
|
+
revealDeadlineSlot: readU64Number(body, 336),
|
|
349
|
+
entropyHashCount: readU64Number(body, 344),
|
|
350
|
+
unlockIntervalStartCycleId: readU64Number(body, 352),
|
|
351
|
+
releasedCommitCount: readU64String(body, 360)
|
|
352
|
+
} : {}
|
|
332
353
|
};
|
|
333
354
|
}
|
|
334
355
|
function decodeSatMinerCycle(data, address) {
|
|
@@ -351,7 +372,13 @@ function decodeSatMinerCycle(data, address) {
|
|
|
351
372
|
claimedDetRebateLamports: readU64String(body, 160),
|
|
352
373
|
claimedPerfRebateLamports: readU64String(body, 168),
|
|
353
374
|
validParticipation: body.readUInt8(176) === 1,
|
|
354
|
-
capitalLockReleased: body.readUInt8(177) === 1
|
|
375
|
+
capitalLockReleased: body.readUInt8(177) === 1,
|
|
376
|
+
...body.length >= 336 ? {
|
|
377
|
+
commitment: readHash32(body, 184),
|
|
378
|
+
commitSlot: readU64Number(body, 216),
|
|
379
|
+
revealSlot: readU64Number(body, 224)
|
|
380
|
+
} : {},
|
|
381
|
+
...body.length >= 344 ? { lockedCollateralLamports: readU64String(body, 232) } : {}
|
|
355
382
|
};
|
|
356
383
|
}
|
|
357
384
|
function decodeSatMinerCapital(data, address) {
|
|
@@ -476,6 +503,8 @@ function decodeSatBondStakingDistributor(data, address) {
|
|
|
476
503
|
totalActiveStakeRaw: readU64String(body, layout.offsets.totalActiveStakeRaw),
|
|
477
504
|
rewardIndexFp: readU128String(body, layout.offsets.rewardIndexFp),
|
|
478
505
|
observedRewardVaultRaw: readU64String(body, layout.offsets.observedRewardVaultRaw),
|
|
506
|
+
unallocatedRewardRaw: readU64String(body, layout.offsets.unallocatedRewardRaw),
|
|
507
|
+
fractionalRemainderFp: readU64String(body, layout.offsets.fractionalRemainderFp),
|
|
479
508
|
lastSyncedSlot: readU64Number(body, layout.offsets.lastSyncedSlot),
|
|
480
509
|
mintMatchesRuntime: rewardMint === SAT_MINT_ADDRESS(),
|
|
481
510
|
vaultMatchesExpected: rewardVault === expectedRewardVault
|
|
@@ -497,6 +526,7 @@ function decodeSatBondStakingPosition(data, address) {
|
|
|
497
526
|
activeStakeRaw: readU64String(body, layout.offsets.activeStakeRaw),
|
|
498
527
|
claimableRewardRaw: readU64String(body, layout.offsets.claimableRewardRaw),
|
|
499
528
|
rewardDebtFp: readU128String(body, layout.offsets.rewardDebtFp),
|
|
529
|
+
fractionalRemainderFp: readU64String(body, layout.offsets.fractionalRemainderFp),
|
|
500
530
|
lastSyncedSlot: readU64Number(body, layout.offsets.lastSyncedSlot)
|
|
501
531
|
};
|
|
502
532
|
}
|
|
@@ -723,6 +753,7 @@ const satReadRpcRuntimeState = {
|
|
|
723
753
|
lastRpcUrl: null,
|
|
724
754
|
quotaLikely: false
|
|
725
755
|
};
|
|
756
|
+
const satReadRpcEndpointStates = new Map();
|
|
726
757
|
function readPositiveIntEnv(name, fallback) {
|
|
727
758
|
const value = Number.parseInt(String(process.env[name] ?? ""), 10);
|
|
728
759
|
return Number.isFinite(value) && value > 0 ? value : fallback;
|
|
@@ -736,6 +767,13 @@ const SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS = 5 * 6e4;
|
|
|
736
767
|
const SAT_RPC_METHOD_METRIC_BUCKET_MS = 60 * 6e4;
|
|
737
768
|
const SAT_RPC_METHOD_METRIC_RETENTION_MS = 24 * 60 * 6e4;
|
|
738
769
|
const SAT_RPC_QUOTA_BACKOFF_MS = 3e4;
|
|
770
|
+
const SAT_RPC_FAILURE_BACKOFF_THRESHOLD = 2;
|
|
771
|
+
const SAT_RPC_FAILURE_BACKOFF_BASE_MS = 5e3;
|
|
772
|
+
const SAT_RPC_FAILURE_BACKOFF_MAX_MS = 3e4;
|
|
773
|
+
const SAT_RPC_MAX_RESPONSE_BYTES = 16 * 1024 * 1024;
|
|
774
|
+
function satRpcRequestTimeoutMs() {
|
|
775
|
+
return readPositiveIntEnv("FASED_SAT_RPC_REQUEST_TIMEOUT_MS", 1e4);
|
|
776
|
+
}
|
|
739
777
|
const satRpcReadCache = new Map();
|
|
740
778
|
const satRpcReadInFlight = new Map();
|
|
741
779
|
const satRpcMethodMetrics = new Map();
|
|
@@ -894,36 +932,75 @@ function looksLikeRpcQuotaFailure(value) {
|
|
|
894
932
|
}
|
|
895
933
|
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
934
|
}
|
|
897
|
-
function
|
|
898
|
-
|
|
899
|
-
|
|
935
|
+
function getOrCreateReadRpcEndpointState(rpcUrl) {
|
|
936
|
+
const key = normalizeRpcUrlForComparison(rpcUrl);
|
|
937
|
+
const existing = satReadRpcEndpointStates.get(key);
|
|
938
|
+
if (existing) {
|
|
939
|
+
return existing;
|
|
900
940
|
}
|
|
901
|
-
const
|
|
902
|
-
|
|
941
|
+
const created = {
|
|
942
|
+
consecutiveFailures: 0,
|
|
943
|
+
backoffUntilMs: 0,
|
|
944
|
+
quotaLikely: false,
|
|
945
|
+
lastError: null,
|
|
946
|
+
lastFailureAt: null,
|
|
947
|
+
lastSuccessAt: null
|
|
948
|
+
};
|
|
949
|
+
satReadRpcEndpointStates.set(key, created);
|
|
950
|
+
return created;
|
|
951
|
+
}
|
|
952
|
+
function currentReadRpcBackoffMs(rpcUrl, nowMs = Date.now()) {
|
|
953
|
+
const state = satReadRpcEndpointStates.get(normalizeRpcUrlForComparison(rpcUrl));
|
|
954
|
+
if (!state) {
|
|
903
955
|
return 0;
|
|
904
956
|
}
|
|
905
|
-
|
|
906
|
-
|
|
957
|
+
return Math.max(0, state.backoffUntilMs - nowMs);
|
|
958
|
+
}
|
|
959
|
+
function makeReadRpcBackoffError(method, remainingMs) {
|
|
960
|
+
return new Error(`rpc ${method} skipped during endpoint circuit backoff; retry in ${Math.ceil(remainingMs / 1e3)}s`);
|
|
907
961
|
}
|
|
908
|
-
function
|
|
909
|
-
|
|
962
|
+
function markReadRpcEndpointSuccess(rpcUrl) {
|
|
963
|
+
const state = getOrCreateReadRpcEndpointState(rpcUrl);
|
|
964
|
+
state.consecutiveFailures = 0;
|
|
965
|
+
state.backoffUntilMs = 0;
|
|
966
|
+
state.quotaLikely = false;
|
|
967
|
+
state.lastError = null;
|
|
968
|
+
state.lastSuccessAt = new Date().toISOString();
|
|
969
|
+
}
|
|
970
|
+
function markReadRpcEndpointFailure(rpcUrl, error) {
|
|
971
|
+
const state = getOrCreateReadRpcEndpointState(rpcUrl);
|
|
972
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
973
|
+
const quotaLikely = looksLikeRpcQuotaFailure(message);
|
|
974
|
+
state.consecutiveFailures += 1;
|
|
975
|
+
state.quotaLikely = quotaLikely;
|
|
976
|
+
state.lastError = message;
|
|
977
|
+
state.lastFailureAt = new Date().toISOString();
|
|
978
|
+
if (quotaLikely) {
|
|
979
|
+
state.backoffUntilMs = Date.now() + SAT_RPC_QUOTA_BACKOFF_MS;
|
|
980
|
+
} else if (state.consecutiveFailures >= SAT_RPC_FAILURE_BACKOFF_THRESHOLD) {
|
|
981
|
+
const exponent = state.consecutiveFailures - SAT_RPC_FAILURE_BACKOFF_THRESHOLD;
|
|
982
|
+
state.backoffUntilMs = Date.now() + Math.min(SAT_RPC_FAILURE_BACKOFF_MAX_MS, SAT_RPC_FAILURE_BACKOFF_BASE_MS * 2 ** exponent);
|
|
983
|
+
}
|
|
910
984
|
}
|
|
911
985
|
function markReadRpcSuccess(mode, rpcUrl) {
|
|
986
|
+
markReadRpcEndpointSuccess(rpcUrl);
|
|
912
987
|
satReadRpcRuntimeState.lastMode = mode;
|
|
913
988
|
satReadRpcRuntimeState.lastRpcUrl = rpcUrl;
|
|
914
|
-
satReadRpcRuntimeState.lastError = null;
|
|
915
989
|
satReadRpcRuntimeState.lastSuccessAt = new Date().toISOString();
|
|
916
|
-
|
|
917
|
-
|
|
990
|
+
if (mode === "primary") {
|
|
991
|
+
satReadRpcRuntimeState.lastError = null;
|
|
992
|
+
satReadRpcRuntimeState.quotaLikely = false;
|
|
993
|
+
} else {
|
|
918
994
|
satReadRpcRuntimeState.fallbackCount += 1;
|
|
919
995
|
}
|
|
920
996
|
}
|
|
921
|
-
function markReadRpcFailure(error) {
|
|
997
|
+
function markReadRpcFailure(error, rpcUrl) {
|
|
922
998
|
const message = error instanceof Error ? error.message : String(error);
|
|
999
|
+
markReadRpcEndpointFailure(rpcUrl, error);
|
|
923
1000
|
satReadRpcRuntimeState.lastMode = "unavailable";
|
|
924
1001
|
satReadRpcRuntimeState.lastError = message;
|
|
925
1002
|
satReadRpcRuntimeState.lastFailureAt = new Date().toISOString();
|
|
926
|
-
satReadRpcRuntimeState.quotaLikely = looksLikeRpcQuotaFailure(message);
|
|
1003
|
+
satReadRpcRuntimeState.quotaLikely = satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(message);
|
|
927
1004
|
}
|
|
928
1005
|
function firstNonEmpty(...values) {
|
|
929
1006
|
for (const value of values) {
|
|
@@ -1044,9 +1121,9 @@ function resolveReadRpcConfig(cfg, env) {
|
|
|
1044
1121
|
const walletId = typeof satMiningConfig.walletId === "string" ? String(satMiningConfig.walletId).trim() : undefined;
|
|
1045
1122
|
const registryProviderId = walletId ? readWalletProviderRegistry(env).wallets.find((wallet) => wallet.id === walletId)?.providerId : undefined;
|
|
1046
1123
|
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)
|
|
1124
|
+
const walletReadRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_URL", walletId);
|
|
1125
|
+
const walletRpcUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_URL", walletId);
|
|
1126
|
+
const walletReadRpcFallbackUrl = walletEnvValue(env, "FASED_WALLET_SOLANA_READ_RPC_FALLBACK_URL", walletId) || walletEnvValue(env, "FASED_WALLET_SOLANA_RPC_FALLBACK_URL", walletId);
|
|
1050
1127
|
if (providerId === "local-socket-signer") {
|
|
1051
1128
|
const primaryUrl = firstNonEmpty(walletReadRpcUrl, walletRpcUrl);
|
|
1052
1129
|
if (!primaryUrl) {
|
|
@@ -1101,50 +1178,98 @@ function resolveEffectiveReadRpcConfig() {
|
|
|
1101
1178
|
};
|
|
1102
1179
|
return resolveReadRpcConfig(cfg, mergedEnv);
|
|
1103
1180
|
}
|
|
1181
|
+
function createAbortableReadRpcFetch() {
|
|
1182
|
+
return (async (input, init) => {
|
|
1183
|
+
const timeoutMs = satRpcRequestTimeoutMs();
|
|
1184
|
+
const requestUrl = typeof input === "string" || input instanceof URL ? input.toString() : input.url;
|
|
1185
|
+
let guardedFetch;
|
|
1186
|
+
try {
|
|
1187
|
+
guardedFetch = await fetchWithSsrFGuard({
|
|
1188
|
+
url: requestUrl,
|
|
1189
|
+
init,
|
|
1190
|
+
timeoutMs,
|
|
1191
|
+
signal: init?.signal ?? (input instanceof Request ? input.signal : undefined),
|
|
1192
|
+
policy: { allowPrivateNetwork: true },
|
|
1193
|
+
auditContext: "sat-mining-read-rpc"
|
|
1194
|
+
});
|
|
1195
|
+
} catch (error) {
|
|
1196
|
+
const reason = redactSensitiveUrlLikeString(error instanceof Error ? `${error.name}: ${error.message}` : String(error));
|
|
1197
|
+
throw new Error(`rpc fetch failed after at most ${timeoutMs}ms (${redactSensitiveUrlLikeString(requestUrl)}): ${reason}`);
|
|
1198
|
+
}
|
|
1199
|
+
const { response, release } = guardedFetch;
|
|
1200
|
+
try {
|
|
1201
|
+
const body = await response.arrayBuffer();
|
|
1202
|
+
return new Response(body, {
|
|
1203
|
+
headers: response.headers,
|
|
1204
|
+
status: response.status,
|
|
1205
|
+
statusText: response.statusText
|
|
1206
|
+
});
|
|
1207
|
+
} finally {
|
|
1208
|
+
await release();
|
|
1209
|
+
}
|
|
1210
|
+
});
|
|
1211
|
+
}
|
|
1212
|
+
async function withReadRpcTimeout(task, method, rpcUrl) {
|
|
1213
|
+
const timeoutMs = satRpcRequestTimeoutMs();
|
|
1214
|
+
let timer;
|
|
1215
|
+
try {
|
|
1216
|
+
return await Promise.race([task, new Promise((_resolve, reject) => {
|
|
1217
|
+
timer = setTimeout(() => reject(new Error(`rpc ${method} timed out after ${timeoutMs}ms (${redactSensitiveUrlLikeString(rpcUrl)})`)), timeoutMs);
|
|
1218
|
+
timer.unref?.();
|
|
1219
|
+
})]);
|
|
1220
|
+
} finally {
|
|
1221
|
+
if (timer) {
|
|
1222
|
+
clearTimeout(timer);
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1104
1226
|
function createReadConnection(solana, rpc) {
|
|
1105
|
-
const primary = new solana.Connection(rpc.primaryUrl
|
|
1106
|
-
|
|
1227
|
+
const primary = new solana.Connection(rpc.primaryUrl, {
|
|
1228
|
+
disableRetryOnRateLimit: true,
|
|
1229
|
+
fetch: createAbortableReadRpcFetch()
|
|
1230
|
+
});
|
|
1231
|
+
const secondary = rpc.secondaryUrl ? new solana.Connection(rpc.secondaryUrl, {
|
|
1232
|
+
disableRetryOnRateLimit: true,
|
|
1233
|
+
fetch: createAbortableReadRpcFetch()
|
|
1234
|
+
}) : null;
|
|
1107
1235
|
const withFallback = (method) => {
|
|
1108
1236
|
return (async (...args) => {
|
|
1109
|
-
const
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
}
|
|
1237
|
+
const primaryBackoffMs = currentReadRpcBackoffMs(rpc.primaryUrl);
|
|
1238
|
+
const secondaryBackoffMs = rpc.secondaryUrl ? currentReadRpcBackoffMs(rpc.secondaryUrl) : 0;
|
|
1239
|
+
const callEndpoint = async (connection, mode, rpcUrl) => {
|
|
1240
|
+
updateSatRpcMethodMetric(method, "request");
|
|
1114
1241
|
try {
|
|
1115
|
-
|
|
1116
|
-
const result = await
|
|
1242
|
+
const task = connection[method](...args);
|
|
1243
|
+
const result = await withReadRpcTimeout(task, method, rpcUrl);
|
|
1117
1244
|
updateSatRpcMethodMetric(method, "success");
|
|
1118
|
-
markReadRpcSuccess(
|
|
1245
|
+
markReadRpcSuccess(mode, rpcUrl);
|
|
1119
1246
|
return result;
|
|
1120
|
-
} catch (
|
|
1247
|
+
} catch (error) {
|
|
1121
1248
|
updateSatRpcMethodMetric(method, "failure");
|
|
1122
|
-
markReadRpcFailure(
|
|
1123
|
-
throw
|
|
1249
|
+
markReadRpcFailure(error, rpcUrl);
|
|
1250
|
+
throw error;
|
|
1124
1251
|
}
|
|
1252
|
+
};
|
|
1253
|
+
if (primaryBackoffMs > 0) {
|
|
1254
|
+
if (!secondary || !rpc.secondaryUrl || secondaryBackoffMs > 0) {
|
|
1255
|
+
throw makeReadRpcBackoffError(method, Math.min(primaryBackoffMs, secondaryBackoffMs > 0 ? secondaryBackoffMs : primaryBackoffMs));
|
|
1256
|
+
}
|
|
1257
|
+
return await callEndpoint(secondary, "fallback", rpc.secondaryUrl);
|
|
1125
1258
|
}
|
|
1126
1259
|
try {
|
|
1127
|
-
|
|
1128
|
-
const result = await primary[method](...args);
|
|
1129
|
-
updateSatRpcMethodMetric(method, "success");
|
|
1130
|
-
markReadRpcSuccess("primary", rpc.primaryUrl);
|
|
1131
|
-
return result;
|
|
1260
|
+
return await callEndpoint(primary, "primary", rpc.primaryUrl);
|
|
1132
1261
|
} catch (primaryError) {
|
|
1133
|
-
|
|
1134
|
-
if (!secondary) {
|
|
1135
|
-
markReadRpcFailure(primaryError);
|
|
1262
|
+
if (!secondary || !rpc.secondaryUrl) {
|
|
1136
1263
|
throw primaryError;
|
|
1137
1264
|
}
|
|
1265
|
+
const fallbackBackoffMs = currentReadRpcBackoffMs(rpc.secondaryUrl);
|
|
1266
|
+
if (fallbackBackoffMs > 0) {
|
|
1267
|
+
throw makeReadRpcBackoffError(method, fallbackBackoffMs);
|
|
1268
|
+
}
|
|
1138
1269
|
try {
|
|
1139
|
-
|
|
1140
|
-
const result = await secondary[method](...args);
|
|
1141
|
-
updateSatRpcMethodMetric(method, "success");
|
|
1142
|
-
markReadRpcSuccess("fallback", rpc.secondaryUrl ?? rpc.primaryUrl);
|
|
1143
|
-
return result;
|
|
1270
|
+
return await callEndpoint(secondary, "fallback", rpc.secondaryUrl);
|
|
1144
1271
|
} catch (secondaryError) {
|
|
1145
|
-
|
|
1146
|
-
markReadRpcFailure(new Error(`${String(primaryError instanceof Error ? primaryError.message : primaryError)}; ${String(secondaryError instanceof Error ? secondaryError.message : secondaryError)}`));
|
|
1147
|
-
throw secondaryError;
|
|
1272
|
+
throw new Error(`rpc ${method} failed on primary (${String(primaryError instanceof Error ? primaryError.message : primaryError)}) and fallback (${String(secondaryError instanceof Error ? secondaryError.message : secondaryError)})`);
|
|
1148
1273
|
}
|
|
1149
1274
|
}
|
|
1150
1275
|
});
|
|
@@ -1187,7 +1312,6 @@ async function resolveBondProgramContext(env) {
|
|
|
1187
1312
|
programId: new solana.PublicKey(SAT_BOND_PROGRAM_ID())
|
|
1188
1313
|
};
|
|
1189
1314
|
}
|
|
1190
|
-
const SAT_REGISTRY_RESERVE_TARGET_LAMPORTS = 2e8;
|
|
1191
1315
|
const SAT_PROTOCOL_VAULT_ACCOUNT_SPACE = 0;
|
|
1192
1316
|
const SAT_CYCLE_STATE_ACCOUNT_SPACE = 336;
|
|
1193
1317
|
const SAT_CYCLE_REGISTRY_META_ACCOUNT_SPACE = 88;
|
|
@@ -1212,6 +1336,14 @@ async function rpcRequestOnce(rpcUrl, method, params) {
|
|
|
1212
1336
|
const target = new URL(rpcUrl);
|
|
1213
1337
|
const transport = target.protocol === "https:" ? https : http;
|
|
1214
1338
|
const payload = await new Promise((resolve, reject) => {
|
|
1339
|
+
let settled = false;
|
|
1340
|
+
const finishReject = (error) => {
|
|
1341
|
+
if (settled) {
|
|
1342
|
+
return;
|
|
1343
|
+
}
|
|
1344
|
+
settled = true;
|
|
1345
|
+
reject(error);
|
|
1346
|
+
};
|
|
1215
1347
|
const req = transport.request(target, {
|
|
1216
1348
|
method: "POST",
|
|
1217
1349
|
headers: {
|
|
@@ -1220,17 +1352,33 @@ async function rpcRequestOnce(rpcUrl, method, params) {
|
|
|
1220
1352
|
}
|
|
1221
1353
|
}, (res) => {
|
|
1222
1354
|
const chunks = [];
|
|
1223
|
-
|
|
1355
|
+
let responseBytes = 0;
|
|
1356
|
+
res.on("data", (chunk) => {
|
|
1357
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
1358
|
+
responseBytes += buffer.length;
|
|
1359
|
+
if (responseBytes > SAT_RPC_MAX_RESPONSE_BYTES) {
|
|
1360
|
+
req.destroy(new Error(`rpc ${method} response exceeded size limit`));
|
|
1361
|
+
return;
|
|
1362
|
+
}
|
|
1363
|
+
chunks.push(buffer);
|
|
1364
|
+
});
|
|
1224
1365
|
res.on("end", () => {
|
|
1366
|
+
if (settled) {
|
|
1367
|
+
return;
|
|
1368
|
+
}
|
|
1225
1369
|
const text = Buffer.concat(chunks).toString("utf8");
|
|
1226
1370
|
if ((res.statusCode ?? 500) >= 400) {
|
|
1227
|
-
|
|
1371
|
+
finishReject(new Error(text || `rpc ${method} failed`));
|
|
1228
1372
|
return;
|
|
1229
1373
|
}
|
|
1374
|
+
settled = true;
|
|
1230
1375
|
resolve(text);
|
|
1231
1376
|
});
|
|
1232
1377
|
});
|
|
1233
|
-
req.
|
|
1378
|
+
req.setTimeout(satRpcRequestTimeoutMs(), () => {
|
|
1379
|
+
req.destroy(new Error(`rpc ${method} timed out after ${satRpcRequestTimeoutMs()}ms (${rpcUrl})`));
|
|
1380
|
+
});
|
|
1381
|
+
req.on("error", (error) => finishReject(error));
|
|
1234
1382
|
req.write(body);
|
|
1235
1383
|
req.end();
|
|
1236
1384
|
});
|
|
@@ -1247,29 +1395,35 @@ async function rpcRequestOnce(rpcUrl, method, params) {
|
|
|
1247
1395
|
}
|
|
1248
1396
|
async function rpcRequest(rpc, method, params) {
|
|
1249
1397
|
const normalized = normalizeReadRpcConfig(rpc);
|
|
1250
|
-
const
|
|
1251
|
-
|
|
1252
|
-
|
|
1398
|
+
const primaryBackoffMs = currentReadRpcBackoffMs(normalized.primaryUrl);
|
|
1399
|
+
const secondaryBackoffMs = normalized.secondaryUrl ? currentReadRpcBackoffMs(normalized.secondaryUrl) : 0;
|
|
1400
|
+
if (primaryBackoffMs > 0 && (!normalized.secondaryUrl || secondaryBackoffMs > 0)) {
|
|
1401
|
+
throw makeReadRpcBackoffError(method, Math.min(primaryBackoffMs, secondaryBackoffMs > 0 ? secondaryBackoffMs : primaryBackoffMs));
|
|
1253
1402
|
}
|
|
1254
|
-
const
|
|
1403
|
+
const useFallbackDueToBackoff = primaryBackoffMs > 0 && Boolean(normalized.secondaryUrl);
|
|
1255
1404
|
try {
|
|
1256
|
-
const rpcUrl =
|
|
1405
|
+
const rpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
|
|
1257
1406
|
const result = await rpcRequestOnce(rpcUrl, method, params);
|
|
1258
|
-
markReadRpcSuccess(
|
|
1407
|
+
markReadRpcSuccess(useFallbackDueToBackoff && normalized.secondaryUrl ? "fallback" : "primary", rpcUrl);
|
|
1259
1408
|
return result;
|
|
1260
1409
|
} catch (primaryError) {
|
|
1261
|
-
|
|
1262
|
-
|
|
1410
|
+
const failedRpcUrl = useFallbackDueToBackoff && normalized.secondaryUrl ? normalized.secondaryUrl : normalized.primaryUrl;
|
|
1411
|
+
markReadRpcFailure(primaryError, failedRpcUrl);
|
|
1412
|
+
if (!normalized.secondaryUrl || useFallbackDueToBackoff) {
|
|
1263
1413
|
throw primaryError;
|
|
1264
1414
|
}
|
|
1415
|
+
const fallbackBackoffMs = currentReadRpcBackoffMs(normalized.secondaryUrl);
|
|
1416
|
+
if (fallbackBackoffMs > 0) {
|
|
1417
|
+
throw makeReadRpcBackoffError(method, fallbackBackoffMs);
|
|
1418
|
+
}
|
|
1265
1419
|
try {
|
|
1266
1420
|
const result = await rpcRequestOnce(normalized.secondaryUrl, method, params);
|
|
1267
1421
|
markReadRpcSuccess("fallback", normalized.secondaryUrl);
|
|
1268
1422
|
return result;
|
|
1269
1423
|
} catch (secondaryError) {
|
|
1424
|
+
markReadRpcFailure(secondaryError, normalized.secondaryUrl);
|
|
1270
1425
|
const primaryMessage = primaryError instanceof Error ? primaryError.message : String(primaryError);
|
|
1271
1426
|
const secondaryMessage = secondaryError instanceof Error ? secondaryError.message : String(secondaryError);
|
|
1272
|
-
markReadRpcFailure(new Error(`rpc ${method} failed on primary (${primaryMessage}) and fallback (${secondaryMessage})`));
|
|
1273
1427
|
throw new Error(`rpc ${method} failed on primary (${primaryMessage}) and fallback (${secondaryMessage})`);
|
|
1274
1428
|
}
|
|
1275
1429
|
}
|
|
@@ -2013,10 +2167,11 @@ async function inspectSatTreasuryVaultLamports(_config) {
|
|
|
2013
2167
|
lamports: await fetchLamportBalanceRaw(rpc, address.toBase58())
|
|
2014
2168
|
};
|
|
2015
2169
|
}
|
|
2016
|
-
async function inspectSatRentExemptionLamports(
|
|
2170
|
+
async function inspectSatRentExemptionLamports(config) {
|
|
2017
2171
|
const { connection } = await resolveConnection(process.env);
|
|
2018
2172
|
const rpc = resolveEffectiveReadRpcConfig();
|
|
2019
|
-
|
|
2173
|
+
const registryReserveTargetLamports = resolveSatGenesisProfileContract(config.network).registryReserveTargetLamports;
|
|
2174
|
+
return await getOrLoadRpcCacheValue(`view:rent-exemption:${rpcCacheScope(rpc)}:${registryReserveTargetLamports}`, SAT_RPC_RENT_EXEMPTION_CACHE_TTL_MS, async () => {
|
|
2020
2175
|
const [protocolVaultLamports, cycleStateLamports, cycleRegistryMetaLamports, cycleRegistryPageLamports, cycleSettlementProgressLamports, minerCycleLamports] = await Promise.all([
|
|
2021
2176
|
connection.getMinimumBalanceForRentExemption(SAT_PROTOCOL_VAULT_ACCOUNT_SPACE),
|
|
2022
2177
|
connection.getMinimumBalanceForRentExemption(SAT_CYCLE_STATE_ACCOUNT_SPACE),
|
|
@@ -2028,7 +2183,7 @@ async function inspectSatRentExemptionLamports(_config) {
|
|
|
2028
2183
|
const openCycleLamports = cycleStateLamports + cycleRegistryMetaLamports;
|
|
2029
2184
|
const submitCycleSharedLamports = cycleSettlementProgressLamports + cycleRegistryPageLamports;
|
|
2030
2185
|
return {
|
|
2031
|
-
registryReserveTargetLamports: String(
|
|
2186
|
+
registryReserveTargetLamports: String(registryReserveTargetLamports),
|
|
2032
2187
|
protocolVaultLamports: String(protocolVaultLamports),
|
|
2033
2188
|
cycleStateLamports: String(cycleStateLamports),
|
|
2034
2189
|
cycleRegistryMetaLamports: String(cycleRegistryMetaLamports),
|
|
@@ -2158,6 +2313,18 @@ async function inspectSatRoundState(_config, params) {
|
|
|
2158
2313
|
}
|
|
2159
2314
|
function inspectSatConnectionDetails() {
|
|
2160
2315
|
const rpc = resolveEffectiveReadRpcConfig();
|
|
2316
|
+
const endpointStates = [rpc.primaryUrl, rpc.secondaryUrl].filter((rpcUrl) => Boolean(rpcUrl)).map((rpcUrl) => {
|
|
2317
|
+
const state = satReadRpcEndpointStates.get(normalizeRpcUrlForComparison(rpcUrl));
|
|
2318
|
+
return {
|
|
2319
|
+
rpcUrl: redactSensitiveUrlLikeString(rpcUrl),
|
|
2320
|
+
consecutiveFailures: state?.consecutiveFailures ?? 0,
|
|
2321
|
+
backoffRemainingMs: currentReadRpcBackoffMs(rpcUrl),
|
|
2322
|
+
quotaLikely: state?.quotaLikely ?? false,
|
|
2323
|
+
lastError: state?.lastError ? redactSensitiveUrlLikeString(state.lastError) : null,
|
|
2324
|
+
lastFailureAt: state?.lastFailureAt ?? null,
|
|
2325
|
+
lastSuccessAt: state?.lastSuccessAt ?? null
|
|
2326
|
+
};
|
|
2327
|
+
});
|
|
2161
2328
|
return {
|
|
2162
2329
|
programId: SAT_PROGRAM_ID(),
|
|
2163
2330
|
bondProgramId: SAT_BOND_PROGRAM_ID(),
|
|
@@ -2167,7 +2334,8 @@ function inspectSatConnectionDetails() {
|
|
|
2167
2334
|
...satReadRpcRuntimeState,
|
|
2168
2335
|
lastError: satReadRpcRuntimeState.lastError ? redactSensitiveUrlLikeString(satReadRpcRuntimeState.lastError) : null,
|
|
2169
2336
|
lastRpcUrl: satReadRpcRuntimeState.lastRpcUrl ? redactSensitiveUrlLikeString(satReadRpcRuntimeState.lastRpcUrl) : null,
|
|
2170
|
-
quotaLikely: satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(satReadRpcRuntimeState.lastError)
|
|
2337
|
+
quotaLikely: satReadRpcRuntimeState.quotaLikely || looksLikeRpcQuotaFailure(satReadRpcRuntimeState.lastError),
|
|
2338
|
+
endpoints: endpointStates
|
|
2171
2339
|
},
|
|
2172
2340
|
rpcMetrics: summarizeSatRpcMethodMetrics()
|
|
2173
2341
|
};
|
|
@@ -2286,4 +2454,4 @@ function sortableValue(row, sortBy) {
|
|
|
2286
2454
|
}
|
|
2287
2455
|
|
|
2288
2456
|
//#endregion
|
|
2289
|
-
export { inspectSatBondPosition, inspectSatBondStakingDistributor, inspectSatBondStakingPosition,
|
|
2457
|
+
export { 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) {
|