@fased/fased 0.1.62 → 0.1.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/README.md +44 -29
- package/config/dependency-ownership.json +1 -1
- package/config/signer-policies/README.md +58 -0
- package/config/signer-policies/agent.json.template +32 -0
- package/config/signer-policies/mining.json.template +69 -0
- package/config/signer-policies/network.json.template +5 -0
- package/config/signer-policies/vault.json.template +70 -0
- package/config/signer-protocol-v2.json +78 -0
- package/config/typescript-noemit-baseline.json +680 -0
- package/dist/agents/auth-profiles/store.js +267 -31
- package/dist/agents/bash-tools.exec.js +10 -4
- package/dist/agents/current-model-catalog.js +3 -3
- package/dist/agents/memory-search.js +7 -1
- package/dist/agents/model-catalog-access.js +1 -2
- package/dist/agents/model-catalog-snapshot.js +1 -1
- package/dist/agents/model-catalog-source.js +1 -1
- package/dist/agents/model-metadata.js +1 -1
- package/dist/agents/model-selection.js +2 -28
- package/dist/agents/models-config.providers.js +6 -6
- package/dist/agents/pi-embedded-runner/compact.js +15 -7
- package/dist/agents/pi-embedded-runner/model.js +1 -1
- package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
- package/dist/agents/pi-embedded-runner/run.js +2 -0
- package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
- package/dist/agents/pi-tool-definition-adapter.js +16 -1
- package/dist/agents/pi-tools.js +2 -1
- package/dist/agents/sandbox/config.js +1 -1
- package/dist/agents/sandbox/context.js +27 -2
- package/dist/agents/skills/env-overrides.js +38 -28
- package/dist/agents/skills/trust.js +93 -0
- package/dist/agents/skills/workspace.js +128 -0
- package/dist/agents/skills-clawhub.js +36 -11
- package/dist/agents/skills-marketplace-scan.js +49 -0
- package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
- package/dist/agents/tools/mining-tool.js +1 -1
- package/dist/agents/tools/session-status-tool.js +1 -1
- package/dist/agents/tools/wallet-action-tool.js +172 -36
- package/dist/agents/tools/wallet-skill-policy.js +65 -23
- package/dist/agents/tools/wallet-tool.js +7 -11
- package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
- package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
- package/dist/auto-reply/reply/directive-handling.model.js +2 -1
- package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
- package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
- package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
- package/dist/auto-reply/reply/model-selection.js +7 -4
- package/dist/auto-reply/reply/session-reset-model.js +4 -4
- package/dist/brand.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/channel-web.js +2 -2
- package/dist/cli/gateway-cli/run.js +8 -0
- package/dist/cli/program/command-registry.js +1 -1
- package/dist/cli/program/register.onboard.js +2 -3
- package/dist/cli/program/register.wallet.js +16 -123
- package/dist/cli/providers-cli.js +1 -1
- package/dist/cli/sat-cli.js +129 -2
- package/dist/cli/update-cli/update-command.js +260 -11
- package/dist/commands/auth-choice.apply.api-providers.js +3 -3
- package/dist/commands/doctor-config-flow.js +1 -1
- package/dist/commands/doctor-legacy-config.js +2 -13
- package/dist/commands/model-picker.js +6 -6
- package/dist/commands/models/auth.js +1 -1
- package/dist/commands/onboard-auth.config-gateways.js +1 -1
- package/dist/commands/onboard-auth.credentials.js +32 -8
- package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
- package/dist/commands/onboard-non-interactive/local.js +5 -1
- package/dist/commands/wallet.js +568 -1911
- package/dist/config/config.js +2 -2
- package/dist/config/io.js +64 -2
- package/dist/config/schema.help.js +8 -7
- package/dist/config/schema.labels.js +5 -4
- package/dist/config/zod-schema.agent-runtime.js +1 -0
- package/dist/config/zod-schema.js +5 -0
- package/dist/control-ui/assets/{app-DLil9VO1.js → app-MaQnPa5G.js} +1511 -1555
- package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
- package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
- package/dist/control-ui/assets/{index-DdE_NIXo.js → index-D4YMr1fA.js} +3 -3
- package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
- package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
- package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
- package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
- package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
- package/dist/control-ui/index.html +1 -1
- package/dist/control-ui/version.json +1 -1
- package/dist/daemon/systemd-system.js +56 -50
- package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
- package/dist/extensions/sat-mining/src/rpc-read.js +291 -84
- package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
- package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
- package/dist/extensions/sat-mining/src/solana-submit.js +1274 -390
- package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
- package/dist/federation/auto-connect.js +98 -8
- package/dist/federation/marketplace-capability-adapter.js +33 -7
- package/dist/federation/marketplace-delivery-outbox.js +196 -0
- package/dist/federation/marketplace-delivery.js +351 -215
- package/dist/federation/marketplace-direct-payment.js +272 -141
- package/dist/federation/marketplace-escrow.js +607 -249
- package/dist/federation/marketplace-settlement-ledger.js +352 -0
- package/dist/federation/offers.js +9 -7
- package/dist/federation/peer-auth-v2.js +529 -0
- package/dist/gateway/a2a-http.js +425 -96
- package/dist/gateway/a2a-settlement.js +259 -153
- package/dist/gateway/a2a-task-store.js +524 -0
- package/dist/gateway/auth.js +38 -2
- package/dist/gateway/config-reload.js +46 -33
- package/dist/gateway/durable-capacity.js +31 -0
- package/dist/gateway/federation-http.js +540 -135
- package/dist/gateway/federation-marketplace-run-store.js +397 -0
- package/dist/gateway/federation-marketplace.js +535 -230
- package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
- package/dist/gateway/security-path.js +1 -1
- package/dist/gateway/server-http.js +1084 -1205
- package/dist/gateway/server-methods/models.js +1 -1
- package/dist/gateway/server-methods/secrets.js +40 -0
- package/dist/gateway/server-methods.js +1 -2
- package/dist/gateway/server-reload-handlers.js +196 -66
- package/dist/gateway/server-runtime-config.js +1 -1
- package/dist/gateway/server-secrets-runtime.js +288 -0
- package/dist/gateway/server.impl.js +73 -42
- package/dist/gateway/sessions-patch.js +3 -5
- package/dist/index.js +4 -2
- package/dist/infra/fasedhub.js +64 -1
- package/dist/infra/local-source-paired-update.js +538 -0
- package/dist/infra/restart.js +41 -10
- package/dist/infra/update-runner.js +96 -0
- package/dist/light-update-status.js +11 -11
- package/dist/memory/backend-config.js +2 -1
- package/dist/memory/session-files.js +16 -2
- package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
- package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
- package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-I4IngVlJ.js} +27 -27
- package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
- package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
- package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
- package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
- package/dist/plugin-sdk/channel-plugin-common.js +4 -4
- package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
- package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DLQ6_lLK.js} +1 -1
- package/dist/plugin-sdk/command-status.d.ts +2 -2
- package/dist/plugin-sdk/command-status.js +27 -27
- package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
- package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
- package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
- package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-D_8FVI1C.js} +6798 -3695
- package/dist/plugin-sdk/device-pair.d.ts +1 -1
- package/dist/plugin-sdk/discord.d.ts +6 -6
- package/dist/plugin-sdk/discord.js +19 -19
- package/dist/plugin-sdk/file-lock.js +35 -4
- package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
- package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
- package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
- package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
- package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
- package/dist/plugin-sdk/index.d.ts +21 -39
- package/dist/plugin-sdk/index.js +29 -29
- package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
- package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
- package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
- package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
- package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
- package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
- package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-B4KF4Kpo.js} +31 -31
- package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
- package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.js} +27 -27
- package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
- package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
- package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
- package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
- package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
- package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
- package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
- package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
- package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
- package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
- package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
- package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
- package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
- package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
- package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
- package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
- package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
- package/dist/plugin-sdk/sat-runtime.d.ts +565 -309
- package/dist/plugin-sdk/sat-runtime.js +29 -29
- package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
- package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
- package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
- package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
- package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
- package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
- package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
- package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BHmvqgjH.js} +39 -39
- package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
- package/dist/plugin-sdk/slack.d.ts +6 -6
- package/dist/plugin-sdk/slack.js +9 -9
- package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-By5AcorL.js} +3 -3
- package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
- package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
- package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-DGnBz1YT.js} +30 -30
- package/dist/plugin-sdk/telegram.d.ts +6 -6
- package/dist/plugin-sdk/telegram.js +8 -8
- package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
- package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
- package/dist/plugin-sdk/tmp-fased-dir-EJGTmL1Q.d.ts +486 -0
- package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
- package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
- package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
- package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
- package/dist/plugin-sdk/{web-CInY-lCv.js → web-DUJwrTYs.js} +32 -32
- package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
- package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
- package/dist/plugin-sdk/whatsapp.d.ts +13 -13
- package/dist/plugin-sdk/whatsapp.js +12 -12
- package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
- package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
- package/dist/providers/refresh.js +1 -1
- package/dist/providers/registry.js +1 -1
- package/dist/secrets/apply.js +1 -1
- package/dist/secrets/runtime.js +1 -1
- package/dist/wallet/external-submission-ledger.js +376 -0
- package/dist/wallet/legacy-embedded-keystore.js +40 -0
- package/dist/wallet/local-socket-signer-archive.js +30 -0
- package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
- package/dist/wallet/local-socket-signer-policy.js +166 -0
- package/dist/wallet/local-socket-signer-protocol.js +578 -117
- package/dist/wallet/native-signer-wallet-id.js +25 -0
- package/dist/wallet/providers/alchemy-adapter.js +3 -0
- package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
- package/dist/wallet/providers/turnkey-adapter.js +292 -34
- package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
- package/dist/wallet/signer-network-admin.js +184 -0
- package/dist/wallet/signer-protocol-v2.generated.js +92 -0
- package/dist/wallet/solana-bond-signing.js +157 -69
- package/dist/wallet/solana-reviewed-transaction.js +375 -0
- package/dist/wallet/solana-swap.js +520 -64
- package/dist/wallet/solana-transaction-inspection.js +106 -4
- package/dist/wallet/solana-trigger.js +658 -320
- package/dist/wallet/turnkey-reviewed-state.js +370 -0
- package/dist/wallet/wallet-approval-auth.js +17 -28
- package/dist/wallet/wallet-atomic-state.js +53 -0
- package/dist/wallet/wallet-canary.js +0 -1
- package/dist/wallet/wallet-inbound-events.js +16 -11
- package/dist/wallet/wallet-policy-simulation.js +1 -1
- package/dist/wallet/wallet-policy.js +93 -37
- package/dist/wallet/wallet-provider-capabilities.js +28 -4
- package/dist/wallet/wallet-provider-registry.js +57 -44
- package/dist/wallet/wallet-provider-resolver.js +62 -63
- package/dist/wallet/wallet-runtime-config.js +28 -41
- package/dist/wallet/wallet-secrets-store.js +22 -0
- package/dist/wallet/wallet-send-approvals.js +1891 -589
- package/dist/wallet/wallet-send-execution-ledger.js +292 -0
- package/dist/wallet/wallet-settlement-links.js +14 -13
- package/dist/wallet/wallet-standard-review.js +353 -0
- package/dist/wallet/wallet-status.js +0 -9
- package/dist/wallet/wallet-task-ledger.js +16 -2
- package/dist/web/auto-reply/heartbeat-runner.js +1 -1
- package/dist/web/auto-reply/monitor.js +2 -2
- package/dist/wizard/host-security-capability.js +14 -23
- package/dist/wizard/onboarding.finalize.js +63 -184
- package/dist/wizard/onboarding.host-security.js +117 -1367
- package/dist/wizard/onboarding.js +172 -217
- package/dist/wizard/onboarding.wallet.js +232 -785
- package/extensions/acpx/package.json +1 -1
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/fased-federation/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +18 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +2 -2
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +18 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +18 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/sat-mining/index.ts +587 -154
- package/extensions/sat-mining/package.json +1 -1
- package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
- package/extensions/sat-mining/src/audit-store.ts +91 -5
- package/extensions/sat-mining/src/claim-service.ts +85 -14
- package/extensions/sat-mining/src/client.ts +13 -0
- package/extensions/sat-mining/src/config.ts +9 -0
- package/extensions/sat-mining/src/cycle-progress.ts +16 -8
- package/extensions/sat-mining/src/epoch-service.ts +9 -5
- package/extensions/sat-mining/src/gateway-runner.ts +21 -1
- package/extensions/sat-mining/src/protocol-contract.ts +45 -1
- package/extensions/sat-mining/src/recovery-service.ts +312 -0
- package/extensions/sat-mining/src/round-watcher.ts +391 -81
- package/extensions/sat-mining/src/rpc-read.ts +431 -106
- package/extensions/sat-mining/src/runtime.ts +16 -0
- package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
- package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
- package/extensions/sat-mining/src/solana-submit.ts +1544 -436
- package/extensions/sat-mining/src/submission-ledger.ts +434 -0
- package/extensions/signal/package.json +1 -1
- package/extensions/synology-chat/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +18 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +18 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +18 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +18 -0
- package/extensions/zalouser/package.json +1 -1
- package/install.sh +4951 -0
- package/package.json +23 -5
- package/scripts/fased-host-updater.mjs +1421 -0
- package/scripts/fased-host-updaterctl.mjs +186 -0
- package/scripts/fased-managed-service.sh +36 -0
- package/scripts/fased-managed-updater.mjs +3065 -156
- package/scripts/fased-signer-enroll-hosting.sh +275 -0
- package/scripts/fased-signer-network-hosting.sh +143 -0
- package/scripts/fased-signer-owner-policy.mjs +1442 -0
- package/scripts/fased-signer-policy-hosting.sh +50 -0
- package/scripts/fased-signer-policy-local.sh +26 -0
- package/scripts/hosted-release-manifest.mjs +185 -0
- package/scripts/install-fased-signerd.sh +183 -108
- package/scripts/install-managed-runtime.mjs +212 -10
- package/scripts/managed-runtime-layout.mjs +75 -3
- package/scripts/migrate-hosted-signer-v2.mjs +58 -0
- package/scripts/start-managed.sh +173 -360
- package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
- package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
- package/dist/wallet/local-socket-signer-broker.js +0 -224
- package/dist/wallet/local-socket-signer-custody.js +0 -42
- package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
- package/dist/wallet/providers/privy-adapter.js +0 -80
- package/dist/wallet/wallet-custody.js +0 -1836
|
@@ -1,186 +1,292 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../
|
|
3
|
-
import {
|
|
4
|
-
import { appendWalletAuditEntry } from "../wallet/wallet-audit-log.js";
|
|
5
|
-
import { createOrExecuteWalletSend } from "../wallet/wallet-send-approvals.js";
|
|
1
|
+
import { isValidSolanaAddress } from "../wallet/solana-address.js";
|
|
2
|
+
import { fetchSolanaRpc } from "../wallet/solana-assets.js";
|
|
3
|
+
import { resolveScopedRpcUrlForWallet } from "../wallet/wallet-provider-resolver.js";
|
|
6
4
|
|
|
7
5
|
//#region src/gateway/a2a-settlement.ts
|
|
6
|
+
const A2A_PAYMENT_MEMO_PROGRAM = "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr";
|
|
8
7
|
function isRecord(value) {
|
|
9
|
-
return typeof value === "object" && value
|
|
8
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
10
9
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
return undefined;
|
|
14
|
-
}
|
|
15
|
-
const trimmed = value.trim();
|
|
16
|
-
return trimmed.length > 0 ? trimmed : undefined;
|
|
17
|
-
}
|
|
18
|
-
function asAmountString(value) {
|
|
19
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
20
|
-
return String(value);
|
|
21
|
-
}
|
|
22
|
-
return asString(value);
|
|
10
|
+
function stringField(record, field) {
|
|
11
|
+
return typeof record[field] === "string" ? record[field].trim() : "";
|
|
23
12
|
}
|
|
24
|
-
function
|
|
25
|
-
|
|
26
|
-
if (chain === "solana") {
|
|
27
|
-
return "solana";
|
|
28
|
-
}
|
|
29
|
-
return null;
|
|
13
|
+
function recordsEqual(left, right) {
|
|
14
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
30
15
|
}
|
|
31
|
-
function
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return normalized;
|
|
16
|
+
function canonicalAsset(value) {
|
|
17
|
+
if (!isRecord(value)) {
|
|
18
|
+
return null;
|
|
35
19
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (const value of values) {
|
|
40
|
-
const found = asString(value);
|
|
41
|
-
if (found) {
|
|
42
|
-
return found;
|
|
43
|
-
}
|
|
20
|
+
const kind = stringField(value, "kind").toLowerCase();
|
|
21
|
+
if (kind === "native") {
|
|
22
|
+
return { kind };
|
|
44
23
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
24
|
+
const address = stringField(value, "address");
|
|
25
|
+
if (kind === "spl-token" && isValidSolanaAddress(address)) {
|
|
26
|
+
return {
|
|
27
|
+
kind,
|
|
28
|
+
address
|
|
29
|
+
};
|
|
50
30
|
}
|
|
51
|
-
|
|
52
|
-
const address = asString(assetValue.address);
|
|
53
|
-
return kind === "spl-token" && address ? address : undefined;
|
|
31
|
+
return null;
|
|
54
32
|
}
|
|
55
|
-
function
|
|
56
|
-
if (!isRecord(
|
|
33
|
+
function canonicalWallet(value) {
|
|
34
|
+
if (!isRecord(value) || stringField(value, "chain").toLowerCase() !== "solana") {
|
|
57
35
|
return null;
|
|
58
36
|
}
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
37
|
+
const address = stringField(value, "address");
|
|
38
|
+
return isValidSolanaAddress(address) ? {
|
|
39
|
+
chain: "solana",
|
|
40
|
+
address
|
|
41
|
+
} : null;
|
|
42
|
+
}
|
|
43
|
+
function positiveSafeInteger(value) {
|
|
44
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : null;
|
|
45
|
+
}
|
|
46
|
+
function offerAmountInBaseUnits(offer) {
|
|
47
|
+
const amount = offer.pricing.amount;
|
|
48
|
+
const decimals = offer.paymentDefaults?.assetDecimals;
|
|
49
|
+
if (typeof amount !== "number" || !Number.isFinite(amount) || amount <= 0 || typeof decimals !== "number" || !Number.isInteger(decimals) || decimals < 0 || decimals > 18) {
|
|
69
50
|
return null;
|
|
70
51
|
}
|
|
71
|
-
const
|
|
72
|
-
|
|
52
|
+
const scaled = amount * 10 ** decimals;
|
|
53
|
+
const rounded = Math.round(scaled);
|
|
54
|
+
return Number.isSafeInteger(rounded) && Math.abs(scaled - rounded) < 1e-6 ? rounded : null;
|
|
55
|
+
}
|
|
56
|
+
function parseTimestamp(value) {
|
|
57
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
73
58
|
return null;
|
|
74
59
|
}
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
60
|
+
const parsed = Date.parse(value);
|
|
61
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
62
|
+
}
|
|
63
|
+
function accountKeyStrings(transaction) {
|
|
64
|
+
return (transaction.transaction?.message?.accountKeys ?? []).map((key) => typeof key === "string" ? key : String(key.pubkey ?? ""));
|
|
65
|
+
}
|
|
66
|
+
function parsedInstructions(transaction) {
|
|
67
|
+
return [...transaction.transaction?.message?.instructions ?? [], ...(transaction.meta?.innerInstructions ?? []).flatMap((entry) => entry.instructions ?? [])];
|
|
68
|
+
}
|
|
69
|
+
function hasExactNativeTransfer(params) {
|
|
70
|
+
return parsedInstructions(params.transaction).some((instruction) => {
|
|
71
|
+
const parsed = isRecord(instruction.parsed) ? instruction.parsed : null;
|
|
72
|
+
if (instruction.program !== "system" || parsed?.type !== "transfer") {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const info = isRecord(parsed.info) ? parsed.info : null;
|
|
76
|
+
return info?.source === params.payer && info?.destination === params.payee && positiveSafeInteger(info?.lamports) === params.amount;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function balanceAmount(entry) {
|
|
80
|
+
const value = entry?.uiTokenAmount?.amount;
|
|
81
|
+
return typeof value === "string" && /^\d+$/u.test(value) ? BigInt(value) : 0n;
|
|
82
|
+
}
|
|
83
|
+
function tokenBalanceFor(params) {
|
|
84
|
+
return params.balances.find((entry) => entry.accountIndex === params.accountIndex && entry.mint === params.mint && entry.owner === params.owner);
|
|
85
|
+
}
|
|
86
|
+
function hasExactTokenTransfer(params) {
|
|
87
|
+
const keys = accountKeyStrings(params.transaction);
|
|
88
|
+
const pre = params.transaction.meta?.preTokenBalances ?? [];
|
|
89
|
+
const post = params.transaction.meta?.postTokenBalances ?? [];
|
|
90
|
+
const expected = BigInt(params.amount);
|
|
91
|
+
return parsedInstructions(params.transaction).some((instruction) => {
|
|
92
|
+
if (instruction.program !== "spl-token") {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
const parsed = isRecord(instruction.parsed) ? instruction.parsed : null;
|
|
96
|
+
const parsedType = parsed?.type;
|
|
97
|
+
if (parsedType !== "transfer" && parsedType !== "transferChecked") {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
const info = isRecord(parsed?.info) ? parsed.info : null;
|
|
101
|
+
if (!info || info.authority !== params.payer) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
const instructionAmount = positiveSafeInteger(info.amount) ?? (isRecord(info.tokenAmount) ? positiveSafeInteger(Number(info.tokenAmount.amount)) : null);
|
|
105
|
+
if (instructionAmount !== params.amount) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
const sourceIndex = keys.indexOf(stringField(info, "source"));
|
|
109
|
+
const destinationIndex = keys.indexOf(stringField(info, "destination"));
|
|
110
|
+
if (sourceIndex < 0 || destinationIndex < 0) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const sourcePre = tokenBalanceFor({
|
|
114
|
+
balances: pre,
|
|
115
|
+
accountIndex: sourceIndex,
|
|
116
|
+
mint: params.mint,
|
|
117
|
+
owner: params.payer
|
|
118
|
+
});
|
|
119
|
+
const sourcePost = tokenBalanceFor({
|
|
120
|
+
balances: post,
|
|
121
|
+
accountIndex: sourceIndex,
|
|
122
|
+
mint: params.mint,
|
|
123
|
+
owner: params.payer
|
|
124
|
+
});
|
|
125
|
+
const destinationPre = tokenBalanceFor({
|
|
126
|
+
balances: pre,
|
|
127
|
+
accountIndex: destinationIndex,
|
|
128
|
+
mint: params.mint,
|
|
129
|
+
owner: params.payee
|
|
130
|
+
});
|
|
131
|
+
const destinationPost = tokenBalanceFor({
|
|
132
|
+
balances: post,
|
|
133
|
+
accountIndex: destinationIndex,
|
|
134
|
+
mint: params.mint,
|
|
135
|
+
owner: params.payee
|
|
136
|
+
});
|
|
137
|
+
return Boolean(sourcePre && sourcePost && destinationPost) && balanceAmount(sourcePre) - balanceAmount(sourcePost) === expected && balanceAmount(destinationPost) - balanceAmount(destinationPre) === expected;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function hasExactPaymentMemo(transaction, expected) {
|
|
141
|
+
return parsedInstructions(transaction).some((instruction) => {
|
|
142
|
+
const isMemoProgram = instruction.program === "spl-memo" || instruction.programId === A2A_PAYMENT_MEMO_PROGRAM;
|
|
143
|
+
if (!isMemoProgram) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (typeof instruction.parsed === "string") {
|
|
147
|
+
return instruction.parsed === expected;
|
|
148
|
+
}
|
|
149
|
+
const parsed = isRecord(instruction.parsed) ? instruction.parsed : null;
|
|
150
|
+
return parsed?.memo === expected || parsed?.info === expected;
|
|
151
|
+
});
|
|
92
152
|
}
|
|
93
153
|
const DEFAULT_DEPS = {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
154
|
+
fetchSolanaRpc,
|
|
155
|
+
now: Date.now,
|
|
156
|
+
resolveRpcUrl: (env) => resolveScopedRpcUrlForWallet({
|
|
157
|
+
env,
|
|
158
|
+
chains: ["solana"]
|
|
159
|
+
})
|
|
97
160
|
};
|
|
98
161
|
async function orchestrateA2aTaskSettlement(params) {
|
|
99
162
|
const deps = {
|
|
100
163
|
...DEFAULT_DEPS,
|
|
101
164
|
...params.deps
|
|
102
165
|
};
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
166
|
+
const env = params.env ?? process.env;
|
|
167
|
+
const task = isRecord(params.taskInput) ? params.taskInput : null;
|
|
168
|
+
const invoice = isRecord(params.invoice) ? params.invoice : null;
|
|
169
|
+
const receipt = isRecord(params.receipt) ? params.receipt : null;
|
|
170
|
+
const offer = params.offer;
|
|
171
|
+
const fail = (reason) => ({
|
|
172
|
+
status: "failed",
|
|
173
|
+
reason
|
|
174
|
+
});
|
|
175
|
+
const challenge = params.challenge;
|
|
176
|
+
if (!task || !invoice || !receipt || !offer || !offer.paymentDefaults || !challenge) {
|
|
177
|
+
return fail("paid task requires a seller-issued challenge, known offer, and complete invoice and receipt evidence");
|
|
109
178
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (!walletCfg.enabled) {
|
|
113
|
-
return {
|
|
114
|
-
status: "skipped",
|
|
115
|
-
invoiceId: intent.invoiceId,
|
|
116
|
-
providerId: intent.payload.providerId,
|
|
117
|
-
walletId: intent.payload.walletId,
|
|
118
|
-
walletName: intent.payload.walletName,
|
|
119
|
-
chain: intent.payload.chain,
|
|
120
|
-
amount: intent.payload.amount,
|
|
121
|
-
reason: "wallet is disabled"
|
|
122
|
-
};
|
|
179
|
+
if (stringField(task, "taskId") !== params.taskId) {
|
|
180
|
+
return fail("task.taskId must match the durable task identity");
|
|
123
181
|
}
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
senderHandle: params.senderHandle
|
|
132
|
-
},
|
|
133
|
-
config: walletCfg,
|
|
134
|
-
env: params.env
|
|
135
|
-
});
|
|
136
|
-
if (!send.ok) {
|
|
137
|
-
appendWalletAuditEntry({
|
|
138
|
-
action: "send_failed",
|
|
139
|
-
actor: params.actor?.trim() || "a2a-settlement",
|
|
140
|
-
details: {
|
|
141
|
-
taskId: params.taskId,
|
|
142
|
-
invoiceId: intent.invoiceId,
|
|
143
|
-
senderHandle: params.senderHandle,
|
|
144
|
-
reason: send.message
|
|
145
|
-
},
|
|
146
|
-
env: params.env
|
|
147
|
-
});
|
|
148
|
-
return {
|
|
149
|
-
status: "failed",
|
|
150
|
-
invoiceId: intent.invoiceId,
|
|
151
|
-
providerId: intent.payload.providerId,
|
|
152
|
-
walletId: intent.payload.walletId,
|
|
153
|
-
walletName: intent.payload.walletName,
|
|
154
|
-
chain: intent.payload.chain,
|
|
155
|
-
amount: intent.payload.amount,
|
|
156
|
-
reason: send.message,
|
|
157
|
-
requestId: send.requestId
|
|
158
|
-
};
|
|
182
|
+
const offerIds = [
|
|
183
|
+
task,
|
|
184
|
+
invoice,
|
|
185
|
+
receipt
|
|
186
|
+
].map((entry) => stringField(entry, "offerId"));
|
|
187
|
+
if (offerIds.some((value) => value !== offer.id)) {
|
|
188
|
+
return fail("task, invoice, and receipt must bind the exact seller offerId");
|
|
159
189
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
190
|
+
const invoiceId = stringField(invoice, "invoiceId");
|
|
191
|
+
const receiptId = stringField(receipt, "receiptId");
|
|
192
|
+
if (!invoiceId || !receiptId || stringField(task, "invoice") !== invoiceId || stringField(task, "receipt") !== receiptId || stringField(receipt, "invoiceId") !== invoiceId || stringField(invoice, "taskId") !== params.taskId || stringField(receipt, "taskId") !== params.taskId) {
|
|
193
|
+
return fail("invoice and receipt identities are not bound to the task");
|
|
194
|
+
}
|
|
195
|
+
if (challenge.taskId !== params.taskId || challenge.senderHandle !== params.senderHandle.trim().toLowerCase() || challenge.offerId !== offer.id || challenge.invoiceId !== invoiceId || challenge.receiptId !== receiptId || challenge.challengeId !== stringField(invoice, "challengeId") || challenge.challengeId !== stringField(receipt, "challengeId") || challenge.paymentMemo !== stringField(invoice, "paymentMemo") || challenge.paymentMemo !== stringField(receipt, "paymentMemo")) {
|
|
196
|
+
return fail("payment evidence does not match the seller-issued challenge");
|
|
197
|
+
}
|
|
198
|
+
const expectedAmount = offerAmountInBaseUnits(offer);
|
|
199
|
+
if (!expectedAmount) {
|
|
200
|
+
return fail("seller offer must define a positive fixed price before paid execution");
|
|
201
|
+
}
|
|
202
|
+
const invoiceAmount = positiveSafeInteger(invoice.amount);
|
|
203
|
+
const receiptAmount = positiveSafeInteger(receipt.amount);
|
|
204
|
+
if (invoiceAmount !== expectedAmount || receiptAmount !== expectedAmount) {
|
|
205
|
+
return fail("invoice and receipt amount must equal the seller offer price");
|
|
206
|
+
}
|
|
207
|
+
if (challenge.amount !== expectedAmount) {
|
|
208
|
+
return fail("seller-issued challenge amount no longer matches the offer");
|
|
209
|
+
}
|
|
210
|
+
const expectedCurrency = offer.paymentDefaults.currency.trim().toUpperCase();
|
|
211
|
+
if (stringField(invoice, "currency").toUpperCase() !== expectedCurrency || stringField(receipt, "currency").toUpperCase() !== expectedCurrency || stringField(invoice, "chain").toLowerCase() !== "solana" || stringField(receipt, "chain").toLowerCase() !== "solana") {
|
|
212
|
+
return fail("invoice and receipt payment rail does not match the seller offer");
|
|
213
|
+
}
|
|
214
|
+
if (challenge.currency !== expectedCurrency) {
|
|
215
|
+
return fail("seller-issued challenge currency no longer matches the offer");
|
|
216
|
+
}
|
|
217
|
+
const expectedAsset = canonicalAsset(offer.paymentDefaults.asset);
|
|
218
|
+
const invoiceAsset = canonicalAsset(invoice.asset);
|
|
219
|
+
const receiptAsset = canonicalAsset(receipt.asset);
|
|
220
|
+
if (!expectedAsset || !recordsEqual(invoiceAsset, expectedAsset) || !recordsEqual(receiptAsset, expectedAsset)) {
|
|
221
|
+
return fail("invoice and receipt asset does not match the seller offer");
|
|
222
|
+
}
|
|
223
|
+
if (!recordsEqual(challenge.asset, expectedAsset)) {
|
|
224
|
+
return fail("seller-issued challenge asset no longer matches the offer");
|
|
225
|
+
}
|
|
226
|
+
const expectedPayee = canonicalWallet(offer.paymentDefaults.payee);
|
|
227
|
+
const invoicePayee = canonicalWallet(invoice.payee);
|
|
228
|
+
const receiptPayee = canonicalWallet(receipt.payee);
|
|
229
|
+
const payer = canonicalWallet(receipt.payer);
|
|
230
|
+
if (!expectedPayee || !payer || !recordsEqual(invoicePayee, expectedPayee) || !recordsEqual(receiptPayee, expectedPayee) || payer.address === expectedPayee.address) {
|
|
231
|
+
return fail("invoice or receipt payer/payee is invalid");
|
|
232
|
+
}
|
|
233
|
+
if (challenge.payerAddress !== payer.address || challenge.payeeAddress !== expectedPayee.address) {
|
|
234
|
+
return fail("payment payer/payee does not match the seller-issued challenge");
|
|
235
|
+
}
|
|
236
|
+
const issuedAt = parseTimestamp(invoice.issuedAt);
|
|
237
|
+
const expiresAt = parseTimestamp(invoice.expiresAt);
|
|
238
|
+
const settledAt = parseTimestamp(receipt.settledAt);
|
|
239
|
+
const now = deps.now();
|
|
240
|
+
if (issuedAt === null || expiresAt === null || settledAt === null || issuedAt !== Date.parse(challenge.issuedAt) || expiresAt !== Date.parse(challenge.expiresAt) || issuedAt >= expiresAt || settledAt < issuedAt || settledAt > expiresAt || now > expiresAt) {
|
|
241
|
+
return fail("invoice or receipt timestamp is invalid or expired");
|
|
242
|
+
}
|
|
243
|
+
const txRef = stringField(receipt, "txRef");
|
|
244
|
+
if (!/^[1-9A-HJ-NP-Za-km-z]{80,100}$/u.test(txRef)) {
|
|
245
|
+
return fail("receipt.txRef must be a Solana transaction signature");
|
|
246
|
+
}
|
|
247
|
+
const rpcUrl = deps.resolveRpcUrl(env);
|
|
248
|
+
if (!rpcUrl) {
|
|
249
|
+
return fail("seller Solana RPC is not configured; payment cannot be verified");
|
|
250
|
+
}
|
|
251
|
+
const transaction = await deps.fetchSolanaRpc(rpcUrl, "getTransaction", [txRef, {
|
|
252
|
+
commitment: "finalized",
|
|
253
|
+
encoding: "jsonParsed",
|
|
254
|
+
maxSupportedTransactionVersion: 0
|
|
255
|
+
}]);
|
|
256
|
+
if (!transaction || !transaction.meta || transaction.meta.err != null) {
|
|
257
|
+
return fail("payment transaction is unavailable, not finalized, or failed");
|
|
258
|
+
}
|
|
259
|
+
const blockTimeMs = typeof transaction.blockTime === "number" && Number.isSafeInteger(transaction.blockTime) ? transaction.blockTime * 1e3 : null;
|
|
260
|
+
if (blockTimeMs === null || blockTimeMs < issuedAt || blockTimeMs > expiresAt || blockTimeMs > now + 6e4) {
|
|
261
|
+
return fail("finalized payment block time is outside the seller-issued challenge window");
|
|
262
|
+
}
|
|
263
|
+
if (!hasExactPaymentMemo(transaction, challenge.paymentMemo)) {
|
|
264
|
+
return fail("finalized payment does not contain the exact seller-issued challenge memo");
|
|
265
|
+
}
|
|
266
|
+
const paymentMatches = expectedAsset.kind === "native" ? hasExactNativeTransfer({
|
|
267
|
+
transaction,
|
|
268
|
+
payer: payer.address,
|
|
269
|
+
payee: expectedPayee.address,
|
|
270
|
+
amount: expectedAmount
|
|
271
|
+
}) : hasExactTokenTransfer({
|
|
272
|
+
transaction,
|
|
273
|
+
payer: payer.address,
|
|
274
|
+
payee: expectedPayee.address,
|
|
275
|
+
mint: expectedAsset.address,
|
|
276
|
+
amount: expectedAmount
|
|
277
|
+
});
|
|
278
|
+
if (!paymentMatches) {
|
|
279
|
+
return fail("finalized transaction does not contain the exact expected seller payment");
|
|
172
280
|
}
|
|
173
281
|
return {
|
|
174
282
|
status: "executed",
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
chain: intent.payload.chain,
|
|
183
|
-
amount: intent.payload.amount
|
|
283
|
+
txHash: txRef,
|
|
284
|
+
invoiceId,
|
|
285
|
+
chain: "solana",
|
|
286
|
+
amount: String(expectedAmount),
|
|
287
|
+
challengeId: challenge.challengeId,
|
|
288
|
+
payerAddress: payer.address,
|
|
289
|
+
paymentMemo: challenge.paymentMemo
|
|
184
290
|
};
|
|
185
291
|
}
|
|
186
292
|
|