@fased/fased 0.1.61 → 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 +43 -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/acp/client.js +2 -2
- package/dist/acp/secret-file.js +2 -2
- package/dist/agents/agent-scope.js +2 -2
- package/dist/agents/apply-patch.js +8 -8
- package/dist/agents/auth-profiles/paths.js +2 -2
- package/dist/agents/auth-profiles/store.js +269 -33
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/bash-tools.shared.js +2 -2
- package/dist/agents/cli-credentials.js +4 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/docs-path.js +3 -3
- package/dist/agents/embedded-pi-mcp.js +4 -4
- package/dist/agents/identity-avatar.js +3 -3
- package/dist/agents/identity-file.js +2 -2
- 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/openai-codex-app-server.js +5 -5
- 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-embedded-subscribe.raw-stream.js +3 -3
- package/dist/agents/pi-extensions/compaction-safeguard.js +3 -3
- package/dist/agents/pi-model-discovery.js +6 -6
- package/dist/agents/pi-project-settings.js +3 -3
- 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/sandbox/fs-bridge.js +2 -2
- package/dist/agents/session-dirs.js +4 -4
- package/dist/agents/session-write-lock.js +13 -13
- package/dist/agents/shell-utils.js +5 -5
- package/dist/agents/skills/bundled-dir.js +4 -4
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/local-loader.js +6 -6
- package/dist/agents/skills/plugin-skills.js +2 -2
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +141 -13
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-install-download.js +7 -7
- package/dist/agents/skills-install-plan.js +2 -2
- package/dist/agents/skills-install.js +2 -2
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/skills-status.js +2 -2
- package/dist/agents/subagent-depth.js +2 -2
- package/dist/agents/system-prompt-params.js +2 -2
- 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/agents/workspace.js +22 -22
- package/dist/auto-reply/reply/agent-runner-execution.js +2 -2
- package/dist/auto-reply/reply/agent-runner.js +2 -2
- package/dist/auto-reply/reply/commands-export-session.js +7 -7
- 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/post-compaction-audit.js +3 -3
- package/dist/auto-reply/reply/post-compaction-context.js +3 -3
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/auto-reply/reply/session.js +3 -3
- package/dist/auto-reply/skill-commands.js +3 -3
- package/dist/auto-reply/status.js +6 -6
- package/dist/brand.js +1 -1
- package/dist/browser/chrome.executables.js +3 -3
- package/dist/browser/chrome.js +3 -3
- package/dist/browser/chrome.profile-decoration.js +6 -6
- package/dist/browser/profiles-service.js +2 -2
- package/dist/browser/server-context.js +2 -2
- package/dist/browser/trash.js +4 -4
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/canvas-host/server.js +4 -4
- package/dist/capabilities/catalog.js +3 -3
- package/dist/channel-web.js +2 -2
- package/dist/channels/plugins/catalog.js +3 -3
- package/dist/cli/browser-cli-extension.js +6 -6
- package/dist/cli/command-format.js +2 -2
- package/dist/cli/cron-cli/register.cron-simple.js +2 -2
- package/dist/cli/dns-cli.js +9 -9
- package/dist/cli/gateway-cli/dev.js +5 -5
- package/dist/cli/gateway-cli/run.js +10 -2
- package/dist/cli/hooks-cli.js +5 -5
- package/dist/cli/lightweight/gateway-runtime-probe.js +2 -2
- package/dist/cli/memory-cli.js +7 -7
- package/dist/cli/nodes-media-utils.js +2 -2
- package/dist/cli/plugins-cli.js +2 -2
- 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/secrets-cli.js +3 -3
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/cli/windows-argv.js +2 -2
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/dashboard-link.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-install.js +5 -5
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/doctor-memory-search.js +2 -2
- package/dist/commands/doctor-platform-notes.js +2 -2
- package/dist/commands/doctor-sandbox.js +2 -2
- package/dist/commands/doctor-state-integrity.js +23 -23
- package/dist/commands/doctor-workspace.js +3 -3
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/managed-up.js +2 -2
- 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 +35 -11
- 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/onboarding/plugin-install.js +2 -2
- package/dist/commands/sessions-cleanup.js +2 -2
- package/dist/commands/signal-install.js +6 -6
- package/dist/commands/status-all/channels.js +2 -2
- package/dist/commands/wallet.js +570 -1913
- package/dist/config/cache-utils.js +2 -2
- package/dist/config/config.js +2 -2
- package/dist/config/includes.js +5 -5
- package/dist/config/io.js +66 -4
- package/dist/config/paths.js +3 -3
- package/dist/config/sat-runtime-ids.js +3 -3
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/sessions/disk-budget.js +6 -6
- package/dist/config/sessions/paths.js +2 -2
- package/dist/config/sessions/store.js +17 -17
- package/dist/config/sessions/transcript.js +4 -4
- package/dist/config/talk.js +2 -2
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-BXA4gPvN.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-D2QbJhVg.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/cron/service/store.js +2 -2
- package/dist/cron/store.js +6 -6
- package/dist/daemon/systemd-system.js +60 -54
- package/dist/discord/monitor/thread-bindings.state.js +2 -2
- 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 +14 -11
- 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/control-ui-boot-check.js +6 -6
- package/dist/gateway/control-ui-login.js +7 -7
- package/dist/gateway/control-ui.js +9 -9
- 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/hooks-mapping.js +4 -4
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +1088 -1209
- package/dist/gateway/server-methods/chat.js +3 -3
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods/sessions.js +6 -6
- package/dist/gateway/server-methods/usage.js +2 -2
- 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/session-compaction-checkpoints.js +4 -4
- package/dist/gateway/session-utils.fs.js +24 -24
- package/dist/gateway/session-utils.js +6 -6
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/hooks/bundled-dir.js +4 -4
- package/dist/hooks/gmail-setup-utils.js +6 -6
- package/dist/hooks/import-url.js +2 -2
- package/dist/hooks/loader.js +4 -4
- package/dist/hooks/workspace.js +7 -7
- package/dist/index.js +4 -2
- package/dist/infra/archive.js +17 -17
- package/dist/infra/boundary-file-read.js +2 -2
- package/dist/infra/boundary-path.js +15 -15
- package/dist/infra/brew.js +2 -2
- package/dist/infra/control-ui-assets.js +14 -14
- package/dist/infra/device-auth-store.js +8 -8
- package/dist/infra/device-identity.js +8 -8
- package/dist/infra/dotenv.js +2 -2
- package/dist/infra/exec-approvals.js +8 -8
- package/dist/infra/exec-command-resolution.js +4 -4
- package/dist/infra/exec-safe-bin-trust.js +2 -2
- package/dist/infra/fased-root.js +5 -5
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/fs-safe.js +14 -14
- package/dist/infra/gateway-lock.js +11 -11
- package/dist/infra/git-commit.js +5 -5
- package/dist/infra/git-root.js +4 -4
- package/dist/infra/hosted-runtime-artifact.js +3 -3
- package/dist/infra/is-main.js +2 -2
- package/dist/infra/json-file.js +7 -7
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/managed-runtime-bootstrap.js +6 -6
- package/dist/infra/outbound/delivery-queue.js +16 -16
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/ports-lsof.js +4 -4
- package/dist/infra/provider-usage.auth.js +3 -3
- package/dist/infra/restart.js +41 -10
- package/dist/infra/safe-open-sync.js +2 -2
- package/dist/infra/session-cost-usage.js +9 -9
- package/dist/infra/shell-env.js +2 -2
- package/dist/infra/state-migrations.fs.js +6 -6
- package/dist/infra/state-migrations.js +23 -23
- package/dist/infra/tmp-fased-dir.js +6 -6
- package/dist/infra/update-runner.js +96 -0
- package/dist/infra/widearea-dns.js +3 -3
- package/dist/infra/wsl.js +2 -2
- package/dist/light-update-status.js +11 -11
- package/dist/line/accounts.js +2 -2
- package/dist/line/download.js +2 -2
- package/dist/logging/config.js +3 -3
- package/dist/logging/logger.js +7 -7
- package/dist/managed/federation.js +3 -3
- package/dist/managed/tunnel.js +3 -3
- package/dist/media/store.js +13 -13
- package/dist/media-understanding/runner.js +3 -3
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/embeddings.js +2 -2
- package/dist/memory/internal.js +10 -10
- package/dist/memory/manager-sync-ops.js +7 -7
- package/dist/memory/repair-executor.js +17 -17
- package/dist/memory/session-files.js +16 -2
- package/dist/node-host/invoke-system-run-plan.js +8 -8
- package/dist/node-host/invoke.js +2 -2
- package/dist/node-host/runner.js +3 -3
- package/dist/pairing/pairing-store.js +3 -3
- 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-Bv0hUOWL.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-Bk--NU3E.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-CGW6J3Pv.js → config-schema-BOT7kHb6.js} +6779 -3696
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +5 -5
- 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 +9 -27
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/json-store.js +6 -6
- 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-B9Cmt_Je.js → monitor-BCFDaqJ-.js} +31 -31
- package/dist/plugin-sdk/{monitor-B71iwAgC.js → monitor-BgbjRiPM.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-Du4GMmwo.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-BMkkS038.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-D_bbE6Yd.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 +5 -5
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-Dqo9nRhi.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-Cnag7JTH.js → telegram-actions-CC_qN4v0.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +5 -5
- 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-CLIvQaVg.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-BYDL6dQj.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-BInKQkc4.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 +5 -5
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugins/bundled-dir.js +3 -3
- package/dist/plugins/discovery.js +11 -11
- package/dist/plugins/loader.js +13 -13
- package/dist/plugins/manifest-registry.js +2 -2
- package/dist/plugins/manifest.js +4 -4
- package/dist/plugins/path-safety.js +3 -3
- package/dist/plugins/status-cache.js +9 -9
- package/dist/plugins/update.js +3 -3
- package/dist/plugins/web-search-install-catalog.js +3 -3
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +17 -17
- package/dist/secrets/audit.js +11 -11
- package/dist/secrets/runtime.js +1 -1
- package/dist/secrets/shared.js +9 -9
- package/dist/security/scan-paths.js +2 -2
- package/dist/shared/config-eval.js +2 -2
- package/dist/shared/pid-alive.js +2 -2
- package/dist/tasks/standing-orders.js +5 -5
- package/dist/tasks/task-flow-registry.js +5 -5
- package/dist/tasks/task-registry.js +5 -5
- package/dist/tasks/workflow-definitions.js +6 -6
- package/dist/telegram/token.js +5 -5
- package/dist/utils.js +5 -5
- 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 +382 -107
- 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 +20 -31
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-audit-log.js +5 -5
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +19 -14
- package/dist/wallet/wallet-observability.js +5 -5
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +95 -41
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +64 -51
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +31 -44
- package/dist/wallet/wallet-secrets-store.js +44 -22
- package/dist/wallet/wallet-send-approvals.js +1894 -592
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +17 -16
- 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/accounts.js +3 -3
- package/dist/web/auth-store.js +18 -18
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/web/session.js +4 -4
- package/dist/wizard/host-security-capability.js +15 -24
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +118 -1368
- package/dist/wizard/onboarding.js +180 -242
- package/dist/wizard/onboarding.wallet.js +323 -829
- 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 +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 +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 +4955 -0
- package/package.json +24 -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 +217 -0
- 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-BdFQvrvw.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
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { fetchSolanaMintInfoViaRpc, fetchSolanaRpc } from "./solana-assets.js";
|
|
2
|
+
import { WalletProviderError } from "./wallet-provider-adapter.js";
|
|
3
|
+
import { buildCreateAssociatedTokenAccountIdempotentInstruction, buildTransferCheckedInstruction, deriveAssociatedTokenAddress, toTransactionInstruction } from "./solana-spl-transfer.js";
|
|
4
|
+
import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
|
|
5
|
+
import { PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js";
|
|
6
|
+
|
|
7
|
+
//#region src/wallet/solana-reviewed-transaction.ts
|
|
8
|
+
const MEMO_PROGRAM_ID = new PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr");
|
|
9
|
+
const MAX_TRANSACTION_BYTES = 1232;
|
|
10
|
+
const MAX_MEMO_BYTES = 256;
|
|
11
|
+
const MAX_U64 = (1n << 64n) - 1n;
|
|
12
|
+
const INTENT_DOMAIN = "FasedAgent reviewed Solana transaction v1\0";
|
|
13
|
+
const REQUEST_DOMAIN = "FasedAgent reviewed Solana request v1\0";
|
|
14
|
+
function invalid(message) {
|
|
15
|
+
return new WalletProviderError({
|
|
16
|
+
code: "wallet_provider_invalid_config",
|
|
17
|
+
message
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function unavailable(message) {
|
|
21
|
+
return new WalletProviderError({
|
|
22
|
+
code: "wallet_provider_unavailable",
|
|
23
|
+
message,
|
|
24
|
+
retryable: false
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function parsePositiveAmount(raw) {
|
|
28
|
+
const value = String(raw ?? "").trim();
|
|
29
|
+
if (!/^\d+$/.test(value)) {
|
|
30
|
+
throw invalid("reviewed Solana transfer amount must be a positive base-unit integer");
|
|
31
|
+
}
|
|
32
|
+
const amount = BigInt(value);
|
|
33
|
+
if (amount <= 0n || amount > MAX_U64) {
|
|
34
|
+
throw invalid("reviewed Solana transfer amount is outside the supported u64 range");
|
|
35
|
+
}
|
|
36
|
+
return amount;
|
|
37
|
+
}
|
|
38
|
+
function parsePublicKey(value, label) {
|
|
39
|
+
try {
|
|
40
|
+
return new PublicKey(String(value ?? "").trim());
|
|
41
|
+
} catch {
|
|
42
|
+
throw invalid(`${label} is not a valid Solana address`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function normalizeRpcUrl(rpcUrl) {
|
|
46
|
+
const value = rpcUrl.trim();
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = new URL(value);
|
|
50
|
+
} catch {
|
|
51
|
+
throw invalid("Solana RPC URL is invalid");
|
|
52
|
+
}
|
|
53
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
|
|
54
|
+
throw invalid("Solana RPC URL must use HTTPS or HTTP");
|
|
55
|
+
}
|
|
56
|
+
return parsed.toString();
|
|
57
|
+
}
|
|
58
|
+
async function fetchStrictSolanaRpc(rpcUrl, method, params) {
|
|
59
|
+
let response;
|
|
60
|
+
try {
|
|
61
|
+
response = await fetch(normalizeRpcUrl(rpcUrl), {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: { "Content-Type": "application/json" },
|
|
64
|
+
body: JSON.stringify({
|
|
65
|
+
jsonrpc: "2.0",
|
|
66
|
+
id: 1,
|
|
67
|
+
method,
|
|
68
|
+
params
|
|
69
|
+
})
|
|
70
|
+
});
|
|
71
|
+
} catch {
|
|
72
|
+
throw unavailable(`Solana RPC ${method} reconciliation request failed`);
|
|
73
|
+
}
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
throw unavailable(`Solana RPC ${method} reconciliation request failed`);
|
|
76
|
+
}
|
|
77
|
+
let payload;
|
|
78
|
+
try {
|
|
79
|
+
payload = await response.json();
|
|
80
|
+
} catch {
|
|
81
|
+
throw unavailable(`Solana RPC ${method} reconciliation returned invalid JSON`);
|
|
82
|
+
}
|
|
83
|
+
if (payload.error != null || !("result" in payload)) {
|
|
84
|
+
throw unavailable(`Solana RPC ${method} reconciliation returned an error`);
|
|
85
|
+
}
|
|
86
|
+
return payload.result;
|
|
87
|
+
}
|
|
88
|
+
function canonicalIntent(params) {
|
|
89
|
+
return JSON.stringify({
|
|
90
|
+
version: 1,
|
|
91
|
+
chain: "solana",
|
|
92
|
+
signer: params.signer,
|
|
93
|
+
to: String(params.request.to ?? "").trim(),
|
|
94
|
+
amount: String(params.request.amount ?? "").trim(),
|
|
95
|
+
mint: String(params.request.program ?? params.request.tokenMint ?? "").trim() || null,
|
|
96
|
+
memo: String(params.request.memo ?? "").trim() || null,
|
|
97
|
+
messageBase64: params.messageBase64
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function canonicalRequest(params) {
|
|
101
|
+
return JSON.stringify({
|
|
102
|
+
version: 1,
|
|
103
|
+
chain: params.request.chain,
|
|
104
|
+
signer: params.signer,
|
|
105
|
+
to: String(params.request.to ?? "").trim(),
|
|
106
|
+
amount: String(params.request.amount ?? "").trim(),
|
|
107
|
+
mint: String(params.request.program ?? params.request.tokenMint ?? "").trim() || null,
|
|
108
|
+
memo: String(params.request.memo ?? "").trim() || null
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function computeReviewedSolanaRequestDigest(params) {
|
|
112
|
+
return createHash("sha256").update(REQUEST_DOMAIN, "utf8").update(canonicalRequest(params), "utf8").digest("base64url");
|
|
113
|
+
}
|
|
114
|
+
function computeReviewedSolanaIntentDigest(params) {
|
|
115
|
+
return createHash("sha256").update(INTENT_DOMAIN, "utf8").update(canonicalIntent(params), "utf8").digest("base64url");
|
|
116
|
+
}
|
|
117
|
+
async function buildTransferInstructions(params) {
|
|
118
|
+
const mint = String(params.request.program ?? params.request.tokenMint ?? "").trim();
|
|
119
|
+
if (!mint) {
|
|
120
|
+
if (params.amount > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
121
|
+
throw invalid("native SOL transfer exceeds JavaScript safe integer range");
|
|
122
|
+
}
|
|
123
|
+
return [SystemProgram.transfer({
|
|
124
|
+
fromPubkey: params.signer,
|
|
125
|
+
toPubkey: params.destination,
|
|
126
|
+
lamports: Number(params.amount)
|
|
127
|
+
})];
|
|
128
|
+
}
|
|
129
|
+
parsePublicKey(mint, "SPL mint");
|
|
130
|
+
const mintInfo = await fetchSolanaMintInfoViaRpc({
|
|
131
|
+
rpcUrl: params.rpcUrl,
|
|
132
|
+
mint
|
|
133
|
+
});
|
|
134
|
+
if (!mintInfo) {
|
|
135
|
+
throw unavailable("Solana RPC could not resolve the SPL mint owner and decimals");
|
|
136
|
+
}
|
|
137
|
+
const sourceTokenAccount = await deriveAssociatedTokenAddress({
|
|
138
|
+
owner: params.signer.toBase58(),
|
|
139
|
+
mint,
|
|
140
|
+
tokenProgramId: mintInfo.tokenProgramId
|
|
141
|
+
});
|
|
142
|
+
const destinationTokenAccount = await deriveAssociatedTokenAddress({
|
|
143
|
+
owner: params.destination.toBase58(),
|
|
144
|
+
mint,
|
|
145
|
+
tokenProgramId: mintInfo.tokenProgramId
|
|
146
|
+
});
|
|
147
|
+
return [await toTransactionInstruction(await buildCreateAssociatedTokenAccountIdempotentInstruction({
|
|
148
|
+
payer: params.signer.toBase58(),
|
|
149
|
+
owner: params.destination.toBase58(),
|
|
150
|
+
mint,
|
|
151
|
+
tokenProgramId: mintInfo.tokenProgramId
|
|
152
|
+
})), await toTransactionInstruction(buildTransferCheckedInstruction({
|
|
153
|
+
sourceTokenAccount,
|
|
154
|
+
mint,
|
|
155
|
+
destinationTokenAccount,
|
|
156
|
+
authority: params.signer.toBase58(),
|
|
157
|
+
amountRaw: params.amount.toString(),
|
|
158
|
+
decimals: mintInfo.decimals,
|
|
159
|
+
tokenProgramId: mintInfo.tokenProgramId
|
|
160
|
+
}))];
|
|
161
|
+
}
|
|
162
|
+
function appendMemo(transaction, memo, signer) {
|
|
163
|
+
const normalized = String(memo ?? "").trim();
|
|
164
|
+
if (!normalized) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const bytes = Buffer.from(normalized, "utf8");
|
|
168
|
+
if (bytes.length > MAX_MEMO_BYTES) {
|
|
169
|
+
throw invalid(`Solana memo must not exceed ${MAX_MEMO_BYTES} UTF-8 bytes`);
|
|
170
|
+
}
|
|
171
|
+
transaction.add(new TransactionInstruction({
|
|
172
|
+
programId: MEMO_PROGRAM_ID,
|
|
173
|
+
keys: [{
|
|
174
|
+
pubkey: signer,
|
|
175
|
+
isSigner: true,
|
|
176
|
+
isWritable: false
|
|
177
|
+
}],
|
|
178
|
+
data: bytes
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
async function buildReviewedSolanaTransaction(params) {
|
|
182
|
+
if (params.request.chain !== "solana") {
|
|
183
|
+
throw new WalletProviderError({
|
|
184
|
+
code: "wallet_provider_unsupported_chain",
|
|
185
|
+
message: "reviewed transaction builder supports Solana only"
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
const untypedSerializedTransaction = params.request.serializedTxBase64;
|
|
189
|
+
if (typeof untypedSerializedTransaction === "string" && untypedSerializedTransaction.trim()) {
|
|
190
|
+
throw invalid("reviewed SOL/SPL sends do not accept caller-supplied serialized transactions");
|
|
191
|
+
}
|
|
192
|
+
const rpcUrl = normalizeRpcUrl(params.rpcUrl);
|
|
193
|
+
const signer = parsePublicKey(params.signerAddress, "signer");
|
|
194
|
+
const destination = parsePublicKey(params.request.to, "destination");
|
|
195
|
+
const amount = parsePositiveAmount(params.request.amount);
|
|
196
|
+
const latest = await fetchSolanaRpc(rpcUrl, "getLatestBlockhash", [{ commitment: "confirmed" }]);
|
|
197
|
+
const recentBlockhash = String(latest?.value?.blockhash ?? "").trim();
|
|
198
|
+
const lastValidBlockHeight = Number(latest?.value?.lastValidBlockHeight);
|
|
199
|
+
if (!recentBlockhash || !Number.isSafeInteger(lastValidBlockHeight)) {
|
|
200
|
+
throw unavailable("Solana RPC did not return a valid recent blockhash");
|
|
201
|
+
}
|
|
202
|
+
const transaction = new Transaction({
|
|
203
|
+
feePayer: signer,
|
|
204
|
+
recentBlockhash
|
|
205
|
+
});
|
|
206
|
+
transaction.add(...await buildTransferInstructions({
|
|
207
|
+
request: params.request,
|
|
208
|
+
rpcUrl,
|
|
209
|
+
signer,
|
|
210
|
+
destination,
|
|
211
|
+
amount
|
|
212
|
+
}));
|
|
213
|
+
appendMemo(transaction, params.request.memo, signer);
|
|
214
|
+
const unsignedBytes = transaction.serialize({
|
|
215
|
+
requireAllSignatures: false,
|
|
216
|
+
verifySignatures: false
|
|
217
|
+
});
|
|
218
|
+
if (unsignedBytes.length > MAX_TRANSACTION_BYTES) {
|
|
219
|
+
throw invalid("reviewed Solana transaction exceeds the network packet limit");
|
|
220
|
+
}
|
|
221
|
+
const unsignedTxBase64 = unsignedBytes.toString("base64");
|
|
222
|
+
const messageBase64 = transaction.serializeMessage().toString("base64");
|
|
223
|
+
const simulation = await fetchSolanaRpc(rpcUrl, "simulateTransaction", [unsignedTxBase64, {
|
|
224
|
+
encoding: "base64",
|
|
225
|
+
commitment: "confirmed",
|
|
226
|
+
sigVerify: false,
|
|
227
|
+
replaceRecentBlockhash: false
|
|
228
|
+
}]);
|
|
229
|
+
if (!simulation?.value || simulation.value.err != null) {
|
|
230
|
+
throw unavailable("reviewed Solana transaction simulation failed");
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
unsignedTxBase64,
|
|
234
|
+
messageBase64,
|
|
235
|
+
intentDigest: computeReviewedSolanaIntentDigest({
|
|
236
|
+
request: params.request,
|
|
237
|
+
signer: signer.toBase58(),
|
|
238
|
+
messageBase64
|
|
239
|
+
}),
|
|
240
|
+
signer: signer.toBase58(),
|
|
241
|
+
recentBlockhash,
|
|
242
|
+
lastValidBlockHeight,
|
|
243
|
+
simulation: {
|
|
244
|
+
ok: true,
|
|
245
|
+
...Number.isFinite(simulation.value.unitsConsumed) ? { unitsConsumed: simulation.value.unitsConsumed } : {}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function encodeBase58(bytes) {
|
|
250
|
+
if (bytes.length === 0) {
|
|
251
|
+
return "";
|
|
252
|
+
}
|
|
253
|
+
const digits = [0];
|
|
254
|
+
for (const byte of bytes) {
|
|
255
|
+
let carry = byte;
|
|
256
|
+
for (let index = 0; index < digits.length; index += 1) {
|
|
257
|
+
const value = digits[index] * 256 + carry;
|
|
258
|
+
digits[index] = value % 58;
|
|
259
|
+
carry = Math.floor(value / 58);
|
|
260
|
+
}
|
|
261
|
+
while (carry > 0) {
|
|
262
|
+
digits.push(carry % 58);
|
|
263
|
+
carry = Math.floor(carry / 58);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
let output = "";
|
|
267
|
+
for (const byte of bytes) {
|
|
268
|
+
if (byte !== 0) {
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
output += "1";
|
|
272
|
+
}
|
|
273
|
+
const alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
274
|
+
for (let index = digits.length - 1; index >= 0; index -= 1) {
|
|
275
|
+
output += alphabet[digits[index]];
|
|
276
|
+
}
|
|
277
|
+
return output;
|
|
278
|
+
}
|
|
279
|
+
function validateReviewedSolanaSignedTransaction(params) {
|
|
280
|
+
let unsignedTransaction;
|
|
281
|
+
let signedTransaction;
|
|
282
|
+
let signedBytes;
|
|
283
|
+
try {
|
|
284
|
+
const unsignedBytes = Buffer.from(params.unsignedTxBase64, "base64");
|
|
285
|
+
signedBytes = Buffer.from(params.signedTxBase64, "base64");
|
|
286
|
+
if (unsignedBytes.length === 0 || signedBytes.length === 0) {
|
|
287
|
+
throw new Error("empty transaction");
|
|
288
|
+
}
|
|
289
|
+
if (signedBytes.length > MAX_TRANSACTION_BYTES) {
|
|
290
|
+
throw new Error("transaction exceeds packet limit");
|
|
291
|
+
}
|
|
292
|
+
unsignedTransaction = Transaction.from(unsignedBytes);
|
|
293
|
+
signedTransaction = Transaction.from(signedBytes);
|
|
294
|
+
} catch {
|
|
295
|
+
throw invalid("wallet returned an invalid signed Solana transaction");
|
|
296
|
+
}
|
|
297
|
+
const expectedMessage = unsignedTransaction.serializeMessage();
|
|
298
|
+
const actualMessage = signedTransaction.serializeMessage();
|
|
299
|
+
if (expectedMessage.length !== actualMessage.length || !timingSafeEqual(expectedMessage, actualMessage)) {
|
|
300
|
+
throw invalid("wallet changed the reviewed Solana transaction intent");
|
|
301
|
+
}
|
|
302
|
+
const expectedSigner = parsePublicKey(params.signerAddress, "signer");
|
|
303
|
+
if (!signedTransaction.feePayer?.equals(expectedSigner)) {
|
|
304
|
+
throw invalid("wallet signed with a different Solana fee payer");
|
|
305
|
+
}
|
|
306
|
+
const signerEntry = signedTransaction.signatures.find((entry) => entry.publicKey.equals(expectedSigner));
|
|
307
|
+
if (!signerEntry?.signature || !signedTransaction.verifySignatures(true)) {
|
|
308
|
+
throw invalid("wallet did not return a valid signature for the reviewed account");
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
signedBytes,
|
|
312
|
+
txHash: encodeBase58(signerEntry.signature)
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
async function broadcastReviewedSolanaTransaction(params) {
|
|
316
|
+
const rpcUrl = normalizeRpcUrl(params.rpcUrl);
|
|
317
|
+
const txHash = await fetchSolanaRpc(rpcUrl, "sendTransaction", [params.signedTxBase64, {
|
|
318
|
+
encoding: "base64",
|
|
319
|
+
skipPreflight: false,
|
|
320
|
+
preflightCommitment: "confirmed",
|
|
321
|
+
maxRetries: 0
|
|
322
|
+
}]);
|
|
323
|
+
if (!txHash) {
|
|
324
|
+
throw new WalletProviderError({
|
|
325
|
+
code: "wallet_provider_ambiguous",
|
|
326
|
+
message: `Solana broadcast result is unknown; reconcile signature ${params.expectedTxHash} before any new send`,
|
|
327
|
+
retryable: false
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
if (txHash !== params.expectedTxHash) {
|
|
331
|
+
throw unavailable("Solana RPC returned a transaction signature that did not match the signed payload");
|
|
332
|
+
}
|
|
333
|
+
return txHash;
|
|
334
|
+
}
|
|
335
|
+
async function reconcileReviewedSolanaTransaction(params) {
|
|
336
|
+
const expectedTxHash = params.expectedTxHash.trim();
|
|
337
|
+
if (!expectedTxHash) {
|
|
338
|
+
throw invalid("Solana reconciliation requires the exact transaction signature");
|
|
339
|
+
}
|
|
340
|
+
if (!Number.isSafeInteger(params.lastValidBlockHeight) || params.lastValidBlockHeight < 0) {
|
|
341
|
+
throw invalid("Solana reconciliation requires a valid last block height");
|
|
342
|
+
}
|
|
343
|
+
const statuses = await fetchStrictSolanaRpc(params.rpcUrl, "getSignatureStatuses", [[expectedTxHash], { searchTransactionHistory: true }]);
|
|
344
|
+
const status = Array.isArray(statuses?.value) ? statuses.value[0] : undefined;
|
|
345
|
+
if (status) {
|
|
346
|
+
if (status.err != null) {
|
|
347
|
+
return {
|
|
348
|
+
state: "failed",
|
|
349
|
+
reason: "Solana reported a terminal transaction error for the reviewed signature"
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
const confirmationStatus = status.confirmationStatus === "confirmed" || status.confirmationStatus === "finalized" ? status.confirmationStatus : "processed";
|
|
353
|
+
return {
|
|
354
|
+
state: "landed",
|
|
355
|
+
confirmationStatus
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const blockHeight = await fetchStrictSolanaRpc(params.rpcUrl, "getBlockHeight", [{ commitment: "confirmed" }]);
|
|
359
|
+
if (!Number.isSafeInteger(blockHeight) || blockHeight < 0) {
|
|
360
|
+
throw unavailable("Solana RPC returned an invalid block height during reconciliation");
|
|
361
|
+
}
|
|
362
|
+
return blockHeight > params.lastValidBlockHeight ? {
|
|
363
|
+
state: "expired",
|
|
364
|
+
blockHeight
|
|
365
|
+
} : {
|
|
366
|
+
state: "pending",
|
|
367
|
+
blockHeight
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function newReviewedSolanaPreparedId() {
|
|
371
|
+
return randomBytes(24).toString("base64url");
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
//#endregion
|
|
375
|
+
export { broadcastReviewedSolanaTransaction, buildReviewedSolanaTransaction, computeReviewedSolanaRequestDigest, reconcileReviewedSolanaTransaction, validateReviewedSolanaSignedTransaction };
|