@fased/fased 0.1.62 → 0.1.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +44 -29
  3. package/config/dependency-ownership.json +1 -1
  4. package/config/signer-policies/README.md +58 -0
  5. package/config/signer-policies/agent.json.template +32 -0
  6. package/config/signer-policies/mining.json.template +69 -0
  7. package/config/signer-policies/network.json.template +5 -0
  8. package/config/signer-policies/vault.json.template +70 -0
  9. package/config/signer-protocol-v2.json +78 -0
  10. package/config/typescript-noemit-baseline.json +680 -0
  11. package/dist/agents/auth-profiles/store.js +267 -31
  12. package/dist/agents/bash-tools.exec.js +10 -4
  13. package/dist/agents/current-model-catalog.js +3 -3
  14. package/dist/agents/memory-search.js +7 -1
  15. package/dist/agents/model-catalog-access.js +1 -2
  16. package/dist/agents/model-catalog-snapshot.js +1 -1
  17. package/dist/agents/model-catalog-source.js +1 -1
  18. package/dist/agents/model-metadata.js +1 -1
  19. package/dist/agents/model-selection.js +2 -28
  20. package/dist/agents/models-config.providers.js +6 -6
  21. package/dist/agents/pi-embedded-runner/compact.js +15 -7
  22. package/dist/agents/pi-embedded-runner/model.js +1 -1
  23. package/dist/agents/pi-embedded-runner/run/attempt.js +24 -13
  24. package/dist/agents/pi-embedded-runner/run.js +2 -0
  25. package/dist/agents/pi-embedded-runner/tool-split.js +40 -2
  26. package/dist/agents/pi-tool-definition-adapter.js +16 -1
  27. package/dist/agents/pi-tools.js +2 -1
  28. package/dist/agents/sandbox/config.js +1 -1
  29. package/dist/agents/sandbox/context.js +27 -2
  30. package/dist/agents/skills/env-overrides.js +38 -28
  31. package/dist/agents/skills/trust.js +93 -0
  32. package/dist/agents/skills/workspace.js +128 -0
  33. package/dist/agents/skills-clawhub.js +36 -11
  34. package/dist/agents/skills-marketplace-scan.js +49 -0
  35. package/dist/agents/tools/marketplace-offer-draft-tool.js +1 -1
  36. package/dist/agents/tools/mining-tool.js +1 -1
  37. package/dist/agents/tools/session-status-tool.js +1 -1
  38. package/dist/agents/tools/wallet-action-tool.js +172 -36
  39. package/dist/agents/tools/wallet-skill-policy.js +65 -23
  40. package/dist/agents/tools/wallet-tool.js +7 -11
  41. package/dist/auto-reply/reply/directive-handling.fast-lane.js +2 -1
  42. package/dist/auto-reply/reply/directive-handling.impl.js +2 -1
  43. package/dist/auto-reply/reply/directive-handling.model.js +2 -1
  44. package/dist/auto-reply/reply/directive-handling.persist.js +2 -2
  45. package/dist/auto-reply/reply/get-reply-directives-apply.js +2 -0
  46. package/dist/auto-reply/reply/get-reply-inline-actions.js +25 -1
  47. package/dist/auto-reply/reply/model-selection.js +7 -4
  48. package/dist/auto-reply/reply/session-reset-model.js +4 -4
  49. package/dist/brand.js +1 -1
  50. package/dist/build-info.json +3 -3
  51. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  52. package/dist/channel-web.js +2 -2
  53. package/dist/cli/gateway-cli/run.js +8 -0
  54. package/dist/cli/program/command-registry.js +1 -1
  55. package/dist/cli/program/register.onboard.js +2 -3
  56. package/dist/cli/program/register.wallet.js +16 -123
  57. package/dist/cli/providers-cli.js +1 -1
  58. package/dist/cli/sat-cli.js +129 -2
  59. package/dist/cli/update-cli/update-command.js +260 -11
  60. package/dist/commands/auth-choice.apply.api-providers.js +3 -3
  61. package/dist/commands/doctor-config-flow.js +1 -1
  62. package/dist/commands/doctor-legacy-config.js +2 -13
  63. package/dist/commands/model-picker.js +6 -6
  64. package/dist/commands/models/auth.js +1 -1
  65. package/dist/commands/onboard-auth.config-gateways.js +1 -1
  66. package/dist/commands/onboard-auth.credentials.js +32 -8
  67. package/dist/commands/onboard-non-interactive/local/wallet-config.js +28 -27
  68. package/dist/commands/onboard-non-interactive/local.js +5 -1
  69. package/dist/commands/wallet.js +568 -1911
  70. package/dist/config/config.js +2 -2
  71. package/dist/config/io.js +64 -2
  72. package/dist/config/schema.help.js +8 -7
  73. package/dist/config/schema.labels.js +5 -4
  74. package/dist/config/zod-schema.agent-runtime.js +1 -0
  75. package/dist/config/zod-schema.js +5 -0
  76. package/dist/control-ui/assets/{app-DLil9VO1.js → app-MaQnPa5G.js} +1511 -1555
  77. package/dist/control-ui/assets/{config-CU5Zi8Dh.js → config-LeImukCW.js} +10 -10
  78. package/dist/control-ui/assets/{federation-D10Q4eP_.js → federation-DgA9e-Pn.js} +364 -422
  79. package/dist/control-ui/assets/{index-DdE_NIXo.js → index-D4YMr1fA.js} +3 -3
  80. package/dist/control-ui/assets/mining-commit-DFpB_4JN.js +2 -0
  81. package/dist/control-ui/assets/{mining-BdhMn18r.js → mining-qMYs4aD-.js} +70 -50
  82. package/dist/control-ui/assets/{open-external-url-DwSiwMPl.js → open-external-url-ulF1B-sA.js} +3 -3
  83. package/dist/control-ui/assets/{providers-QMn4w2_f.js → providers-CIx9fxc6.js} +2 -2
  84. package/dist/control-ui/assets/{wallet-C2g294QT.js → wallet-DvStR_AT.js} +259 -377
  85. package/dist/control-ui/index.html +1 -1
  86. package/dist/control-ui/version.json +1 -1
  87. package/dist/daemon/systemd-system.js +56 -50
  88. package/dist/extensions/sat-mining/src/protocol-contract.js +43 -3
  89. package/dist/extensions/sat-mining/src/rpc-read.js +291 -84
  90. package/dist/extensions/sat-mining/src/sat-bond-layout.js +5 -2
  91. package/dist/extensions/sat-mining/src/signer-codec-manifest.js +406 -0
  92. package/dist/extensions/sat-mining/src/solana-submit.js +1274 -390
  93. package/dist/extensions/sat-mining/src/submission-ledger.js +349 -0
  94. package/dist/federation/auto-connect.js +98 -8
  95. package/dist/federation/marketplace-capability-adapter.js +33 -7
  96. package/dist/federation/marketplace-delivery-outbox.js +196 -0
  97. package/dist/federation/marketplace-delivery.js +351 -215
  98. package/dist/federation/marketplace-direct-payment.js +272 -141
  99. package/dist/federation/marketplace-escrow.js +607 -249
  100. package/dist/federation/marketplace-settlement-ledger.js +352 -0
  101. package/dist/federation/offers.js +9 -7
  102. package/dist/federation/peer-auth-v2.js +529 -0
  103. package/dist/gateway/a2a-http.js +425 -96
  104. package/dist/gateway/a2a-settlement.js +259 -153
  105. package/dist/gateway/a2a-task-store.js +524 -0
  106. package/dist/gateway/auth.js +38 -2
  107. package/dist/gateway/config-reload.js +46 -33
  108. package/dist/gateway/durable-capacity.js +31 -0
  109. package/dist/gateway/federation-http.js +540 -135
  110. package/dist/gateway/federation-marketplace-run-store.js +397 -0
  111. package/dist/gateway/federation-marketplace.js +535 -230
  112. package/dist/gateway/mutating-admin-rpc-rate-limit.js +5 -0
  113. package/dist/gateway/security-path.js +1 -1
  114. package/dist/gateway/server-http.js +1084 -1205
  115. package/dist/gateway/server-methods/models.js +1 -1
  116. package/dist/gateway/server-methods/secrets.js +40 -0
  117. package/dist/gateway/server-methods.js +1 -2
  118. package/dist/gateway/server-reload-handlers.js +196 -66
  119. package/dist/gateway/server-runtime-config.js +1 -1
  120. package/dist/gateway/server-secrets-runtime.js +288 -0
  121. package/dist/gateway/server.impl.js +73 -42
  122. package/dist/gateway/sessions-patch.js +3 -5
  123. package/dist/index.js +4 -2
  124. package/dist/infra/fasedhub.js +64 -1
  125. package/dist/infra/local-source-paired-update.js +538 -0
  126. package/dist/infra/restart.js +41 -10
  127. package/dist/infra/update-runner.js +96 -0
  128. package/dist/light-update-status.js +11 -11
  129. package/dist/memory/backend-config.js +2 -1
  130. package/dist/memory/session-files.js +16 -2
  131. package/dist/plugin-sdk/{accounts-DxblobYM.js → accounts-Brn3-uWN.js} +1 -1
  132. package/dist/plugin-sdk/{actions-D4UNimWa.js → actions-DRu135h0.js} +2 -2
  133. package/dist/plugin-sdk/{active-listener-CFuy106s.js → active-listener-B_NMtgPL.js} +1 -1
  134. package/dist/plugin-sdk/{audio-preflight-Bwi2Oq03.js → audio-preflight-I4IngVlJ.js} +27 -27
  135. package/dist/plugin-sdk/{audit-Cs0K7LBp.js → audit-C5d2z5U1.js} +1 -1
  136. package/dist/plugin-sdk/{channel-access-D5aHoTY8.js → channel-access-CcFRdRPO.js} +1 -1
  137. package/dist/plugin-sdk/{channel-access-configure-Dvch9mMQ.js → channel-access-configure-DaI5wevh.js} +1 -1
  138. package/dist/plugin-sdk/channel-plugin-common.d.ts +3 -3
  139. package/dist/plugin-sdk/channel-plugin-common.js +4 -4
  140. package/dist/plugin-sdk/{chunk-B0FUGc5A.js → chunk-CyoyqpbG.js} +1 -1
  141. package/dist/plugin-sdk/{chunk-items-DzT4L4Ty.js → chunk-items-DLQ6_lLK.js} +1 -1
  142. package/dist/plugin-sdk/command-status.d.ts +2 -2
  143. package/dist/plugin-sdk/command-status.js +27 -27
  144. package/dist/plugin-sdk/{commands-registry-DmDRhRAU.js → commands-registry-BfqdEWdF.js} +2 -2
  145. package/dist/plugin-sdk/{common-CfUOowOp.js → common-HCcXU-NR.js} +1 -1
  146. package/dist/plugin-sdk/{config-mxULv0fQ.js → config-DlWVeLFB.js} +7113 -6877
  147. package/dist/plugin-sdk/{config-schema-BrkmtFxB.js → config-schema-D_8FVI1C.js} +6798 -3695
  148. package/dist/plugin-sdk/device-pair.d.ts +1 -1
  149. package/dist/plugin-sdk/discord.d.ts +6 -6
  150. package/dist/plugin-sdk/discord.js +19 -19
  151. package/dist/plugin-sdk/file-lock.js +35 -4
  152. package/dist/plugin-sdk/{filesystem-manager-ZoHU8oA7.js → filesystem-manager-DoI8IBNF.js} +1 -1
  153. package/dist/plugin-sdk/{group-mentions-BHRff6j8.d.ts → group-mentions-q3hUTCt7.d.ts} +1 -1
  154. package/dist/plugin-sdk/{handle-action-DbVCF9HZ.js → handle-action-hvwapMKg.js} +13 -13
  155. package/dist/plugin-sdk/{helpers-BXbdgs5H.js → helpers-DMBU4oTo.js} +1 -1
  156. package/dist/plugin-sdk/{image-ops-D7jPxaph.js → image-ops-DQi0n_Tt.js} +1 -1
  157. package/dist/plugin-sdk/index.d.ts +21 -39
  158. package/dist/plugin-sdk/index.js +29 -29
  159. package/dist/plugin-sdk/{login-BRxww6nv.js → login-Ca583Okc.js} +3 -3
  160. package/dist/plugin-sdk/{login-qr-DJXsk9XH.js → login-qr-CGciBSNP.js} +3 -3
  161. package/dist/plugin-sdk/{manager-Y2S_5IlI.js → manager-BegWxNYX.js} +4 -4
  162. package/dist/plugin-sdk/{markdown-tables-DHLFQqaF.js → markdown-tables-DCOXEUfZ.js} +1 -1
  163. package/dist/plugin-sdk/{media-Czo4carg.js → media-CAdQF5TG.js} +47 -47
  164. package/dist/plugin-sdk/{memory-search-DTjIMw8J.js → memory-search-CrFPOeTH.js} +4 -1
  165. package/dist/plugin-sdk/{monitor-M_ta2lMc.js → monitor-B4KF4Kpo.js} +31 -31
  166. package/dist/plugin-sdk/{monitor-wYVncM9w.js → monitor-Bb6x1KAG.js} +32 -32
  167. package/dist/plugin-sdk/{openresponses-http-B2GmeSt4.js → openresponses-http-DCTO8JkL.js} +27 -27
  168. package/dist/plugin-sdk/{optional-runtime-dependency-DdMbxS24.js → optional-runtime-dependency-0dznm3ZO.js} +1 -1
  169. package/dist/plugin-sdk/{outbound-Db8mRN6P.js → outbound-BgVDdHxx.js} +6 -6
  170. package/dist/plugin-sdk/{outbound-attachment-BqFjcypb.js → outbound-attachment-QqTnIhZL.js} +2 -2
  171. package/dist/plugin-sdk/{pairing-message-B3GC_7CD.js → pairing-message-D0CoLHRJ.js} +1 -1
  172. package/dist/plugin-sdk/{pairing-message-B3bHYGaw.d.ts → pairing-message-DHPDFZbC.d.ts} +2 -2
  173. package/dist/plugin-sdk/{pairing-store-CQikgIbw.js → pairing-store-BChahgI2.js} +2 -2
  174. package/dist/plugin-sdk/{pi-model-discovery-CY3m5zJP.js → pi-model-discovery-BX_JLcEJ.js} +1 -1
  175. package/dist/plugin-sdk/{pi-model-discovery-runtime-DSh1T2pn.js → pi-model-discovery-runtime-DxTMz_XF.js} +2 -2
  176. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  177. package/dist/plugin-sdk/{pw-ai-AFUqn-tQ.js → pw-ai-natjh3rm.js} +3 -3
  178. package/dist/plugin-sdk/{qmd-manager-DSyx77KY.js → qmd-manager-CgRaTxUq.js} +1 -1
  179. package/dist/plugin-sdk/{query-expansion-CAI2kKLQ.js → query-expansion-BG3FgzF7.js} +14 -3
  180. package/dist/plugin-sdk/{replies-Fzh9PhXl.js → replies-ChYo5ZQM.js} +2 -2
  181. package/dist/plugin-sdk/{resolve-outbound-target-KpF3co6T.js → resolve-outbound-target-D-KGgHJZ.js} +1 -1
  182. package/dist/plugin-sdk/{resolve-route-CDl74O19.js → resolve-route-C8tvQm8Z.js} +1 -1
  183. package/dist/plugin-sdk/{retry-policy-D4uiqUOG.js → retry-policy-C6SjKjQA.js} +1 -1
  184. package/dist/plugin-sdk/{runtime-Bb6KRnCC.js → runtime-2B9_WKoI.js} +8 -3
  185. package/dist/plugin-sdk/{runtime-dependency-DLDmB94f.js → runtime-dependency-DczkvPxn.js} +2 -2
  186. package/dist/plugin-sdk/sat-runtime.d.ts +565 -309
  187. package/dist/plugin-sdk/sat-runtime.js +29 -29
  188. package/dist/plugin-sdk/{send-C4k4JuJN.js → send-B6KkGKZD.js} +6 -6
  189. package/dist/plugin-sdk/{send-D-uDKGIq.js → send-CFzGKJXo.js} +6 -6
  190. package/dist/plugin-sdk/{send-Du8ykP1k.js → send-DCO441U7.js} +8 -8
  191. package/dist/plugin-sdk/{send-5nFktR1n.js → send-gDoGA-7e.js} +5 -5
  192. package/dist/plugin-sdk/{send-Bfzf11VY.js → send-q9HXrSwK.js} +7 -7
  193. package/dist/plugin-sdk/{session-CS-Td9EM.js → session-DHD4ZKyG.js} +2 -2
  194. package/dist/plugin-sdk/{skill-commands-CFAlXWHk.js → skill-commands-FKEPLS7T.js} +201 -26
  195. package/dist/plugin-sdk/{slack-CxE1mfzj.js → slack-BHmvqgjH.js} +39 -39
  196. package/dist/plugin-sdk/{slack-actions-BcMkNv1Z.js → slack-actions-DhbMcp8M.js} +11 -11
  197. package/dist/plugin-sdk/slack.d.ts +6 -6
  198. package/dist/plugin-sdk/slack.js +9 -9
  199. package/dist/plugin-sdk/{sticker-cache-CGzGWu00.js → sticker-cache-By5AcorL.js} +3 -3
  200. package/dist/plugin-sdk/{tables-bFXyRpkx.js → tables-B3jr0Pvq.js} +1 -1
  201. package/dist/plugin-sdk/{targets-DH7a9lKB.js → targets-CtSbTxYX.js} +1 -1
  202. package/dist/plugin-sdk/{telegram-actions-DaEcYQ8r.js → telegram-actions-DGnBz1YT.js} +30 -30
  203. package/dist/plugin-sdk/telegram.d.ts +6 -6
  204. package/dist/plugin-sdk/telegram.js +8 -8
  205. package/dist/plugin-sdk/{thread-bindings.lifecycle-CgOvvdw8.js → thread-bindings.lifecycle-QbkNl-m6.js} +3 -3
  206. package/dist/plugin-sdk/{thread-bindings.state-CQpk44Hq.js → thread-bindings.state-D9hg_M1c.js} +2 -2
  207. package/dist/plugin-sdk/tmp-fased-dir-EJGTmL1Q.d.ts +486 -0
  208. package/dist/plugin-sdk/{types-vcJrC_uv.d.ts → types-BdwdFCD6.d.ts} +2 -3
  209. package/dist/plugin-sdk/{types-DFAW-n1J.d.ts → types-BrCpYMxn.d.ts} +2 -2
  210. package/dist/plugin-sdk/{types-DyhXnYUr.d.ts → types-D0kDG8l0.d.ts} +3 -2
  211. package/dist/plugin-sdk/{types.plugin-_fbu40Re.d.ts → types.plugin-BcSBq42x.d.ts} +8 -3
  212. package/dist/plugin-sdk/{web-CInY-lCv.js → web-DUJwrTYs.js} +32 -32
  213. package/dist/plugin-sdk/{whatsapp-actions-BtSc2CBv.js → whatsapp-actions-Bj_rOncr.js} +13 -13
  214. package/dist/plugin-sdk/{whatsapp-heartbeat-Bg9TuYzl.js → whatsapp-heartbeat-B1WHkJIg.js} +2 -2
  215. package/dist/plugin-sdk/whatsapp.d.ts +13 -13
  216. package/dist/plugin-sdk/whatsapp.js +12 -12
  217. package/dist/plugin-sdk/{wsl-C4DGFkOd.js → wsl-J-HscWxS.js} +3 -3
  218. package/dist/plugin-sdk/{zod-schema.providers-core-BEbNizPe.d.ts → zod-schema.providers-core-CIzCjXH9.d.ts} +61 -61
  219. package/dist/providers/refresh.js +1 -1
  220. package/dist/providers/registry.js +1 -1
  221. package/dist/secrets/apply.js +1 -1
  222. package/dist/secrets/runtime.js +1 -1
  223. package/dist/wallet/external-submission-ledger.js +376 -0
  224. package/dist/wallet/legacy-embedded-keystore.js +40 -0
  225. package/dist/wallet/local-socket-signer-archive.js +30 -0
  226. package/dist/wallet/local-socket-signer-lifecycle.js +97 -0
  227. package/dist/wallet/local-socket-signer-policy.js +166 -0
  228. package/dist/wallet/local-socket-signer-protocol.js +578 -117
  229. package/dist/wallet/native-signer-wallet-id.js +25 -0
  230. package/dist/wallet/providers/alchemy-adapter.js +3 -0
  231. package/dist/wallet/providers/local-socket-signer-adapter.js +380 -105
  232. package/dist/wallet/providers/turnkey-adapter.js +292 -34
  233. package/dist/wallet/providers/wallet-standard-adapter.js +100 -0
  234. package/dist/wallet/signer-network-admin.js +184 -0
  235. package/dist/wallet/signer-protocol-v2.generated.js +92 -0
  236. package/dist/wallet/solana-bond-signing.js +157 -69
  237. package/dist/wallet/solana-reviewed-transaction.js +375 -0
  238. package/dist/wallet/solana-swap.js +520 -64
  239. package/dist/wallet/solana-transaction-inspection.js +106 -4
  240. package/dist/wallet/solana-trigger.js +658 -320
  241. package/dist/wallet/turnkey-reviewed-state.js +370 -0
  242. package/dist/wallet/wallet-approval-auth.js +17 -28
  243. package/dist/wallet/wallet-atomic-state.js +53 -0
  244. package/dist/wallet/wallet-canary.js +0 -1
  245. package/dist/wallet/wallet-inbound-events.js +16 -11
  246. package/dist/wallet/wallet-policy-simulation.js +1 -1
  247. package/dist/wallet/wallet-policy.js +93 -37
  248. package/dist/wallet/wallet-provider-capabilities.js +28 -4
  249. package/dist/wallet/wallet-provider-registry.js +57 -44
  250. package/dist/wallet/wallet-provider-resolver.js +62 -63
  251. package/dist/wallet/wallet-runtime-config.js +28 -41
  252. package/dist/wallet/wallet-secrets-store.js +22 -0
  253. package/dist/wallet/wallet-send-approvals.js +1891 -589
  254. package/dist/wallet/wallet-send-execution-ledger.js +292 -0
  255. package/dist/wallet/wallet-settlement-links.js +14 -13
  256. package/dist/wallet/wallet-standard-review.js +353 -0
  257. package/dist/wallet/wallet-status.js +0 -9
  258. package/dist/wallet/wallet-task-ledger.js +16 -2
  259. package/dist/web/auto-reply/heartbeat-runner.js +1 -1
  260. package/dist/web/auto-reply/monitor.js +2 -2
  261. package/dist/wizard/host-security-capability.js +14 -23
  262. package/dist/wizard/onboarding.finalize.js +63 -184
  263. package/dist/wizard/onboarding.host-security.js +117 -1367
  264. package/dist/wizard/onboarding.js +172 -217
  265. package/dist/wizard/onboarding.wallet.js +232 -785
  266. package/extensions/acpx/package.json +1 -1
  267. package/extensions/bluebubbles/package.json +1 -1
  268. package/extensions/copilot-proxy/package.json +1 -1
  269. package/extensions/diagnostics-otel/package.json +1 -1
  270. package/extensions/fased-federation/package.json +1 -1
  271. package/extensions/google-gemini-cli-auth/package.json +1 -1
  272. package/extensions/imessage/package.json +1 -1
  273. package/extensions/irc/package.json +1 -1
  274. package/extensions/line/package.json +1 -1
  275. package/extensions/llm-task/package.json +1 -1
  276. package/extensions/lobster/package.json +1 -1
  277. package/extensions/matrix/CHANGELOG.md +18 -0
  278. package/extensions/matrix/package.json +1 -1
  279. package/extensions/mattermost/package.json +1 -1
  280. package/extensions/memory-core/package.json +2 -2
  281. package/extensions/memory-lancedb/package.json +1 -1
  282. package/extensions/minimax-portal-auth/package.json +1 -1
  283. package/extensions/msteams/CHANGELOG.md +18 -0
  284. package/extensions/msteams/package.json +1 -1
  285. package/extensions/nextcloud-talk/package.json +1 -1
  286. package/extensions/nostr/CHANGELOG.md +18 -0
  287. package/extensions/nostr/package.json +1 -1
  288. package/extensions/open-prose/package.json +1 -1
  289. package/extensions/sat-mining/index.ts +587 -154
  290. package/extensions/sat-mining/package.json +1 -1
  291. package/extensions/sat-mining/signer-codec-schema.v1.json +374 -0
  292. package/extensions/sat-mining/src/audit-store.ts +91 -5
  293. package/extensions/sat-mining/src/claim-service.ts +85 -14
  294. package/extensions/sat-mining/src/client.ts +13 -0
  295. package/extensions/sat-mining/src/config.ts +9 -0
  296. package/extensions/sat-mining/src/cycle-progress.ts +16 -8
  297. package/extensions/sat-mining/src/epoch-service.ts +9 -5
  298. package/extensions/sat-mining/src/gateway-runner.ts +21 -1
  299. package/extensions/sat-mining/src/protocol-contract.ts +45 -1
  300. package/extensions/sat-mining/src/recovery-service.ts +312 -0
  301. package/extensions/sat-mining/src/round-watcher.ts +391 -81
  302. package/extensions/sat-mining/src/rpc-read.ts +431 -106
  303. package/extensions/sat-mining/src/runtime.ts +16 -0
  304. package/extensions/sat-mining/src/sat-bond-layout.ts +6 -0
  305. package/extensions/sat-mining/src/signer-codec-manifest.ts +429 -0
  306. package/extensions/sat-mining/src/solana-submit.ts +1544 -436
  307. package/extensions/sat-mining/src/submission-ledger.ts +434 -0
  308. package/extensions/signal/package.json +1 -1
  309. package/extensions/synology-chat/package.json +1 -1
  310. package/extensions/tlon/package.json +1 -1
  311. package/extensions/twitch/CHANGELOG.md +18 -0
  312. package/extensions/twitch/package.json +1 -1
  313. package/extensions/voice-call/CHANGELOG.md +18 -0
  314. package/extensions/voice-call/package.json +1 -1
  315. package/extensions/zalo/CHANGELOG.md +18 -0
  316. package/extensions/zalo/package.json +1 -1
  317. package/extensions/zalouser/CHANGELOG.md +18 -0
  318. package/extensions/zalouser/package.json +1 -1
  319. package/install.sh +4951 -0
  320. package/package.json +23 -5
  321. package/scripts/fased-host-updater.mjs +1421 -0
  322. package/scripts/fased-host-updaterctl.mjs +186 -0
  323. package/scripts/fased-managed-service.sh +36 -0
  324. package/scripts/fased-managed-updater.mjs +3065 -156
  325. package/scripts/fased-signer-enroll-hosting.sh +275 -0
  326. package/scripts/fased-signer-network-hosting.sh +143 -0
  327. package/scripts/fased-signer-owner-policy.mjs +1442 -0
  328. package/scripts/fased-signer-policy-hosting.sh +50 -0
  329. package/scripts/fased-signer-policy-local.sh +26 -0
  330. package/scripts/hosted-release-manifest.mjs +185 -0
  331. package/scripts/install-fased-signerd.sh +183 -108
  332. package/scripts/install-managed-runtime.mjs +212 -10
  333. package/scripts/managed-runtime-layout.mjs +75 -3
  334. package/scripts/migrate-hosted-signer-v2.mjs +58 -0
  335. package/scripts/start-managed.sh +173 -360
  336. package/dist/control-ui/assets/mining-commit-R-6nu87p.js +0 -2
  337. package/dist/plugin-sdk/tmp-fased-dir-CS6zsYEE.d.ts +0 -77
  338. package/dist/wallet/local-socket-signer-broker.js +0 -224
  339. package/dist/wallet/local-socket-signer-custody.js +0 -42
  340. package/dist/wallet/providers/embedded-keystore-adapter.js +0 -402
  341. package/dist/wallet/providers/privy-adapter.js +0 -80
  342. package/dist/wallet/wallet-custody.js +0 -1836
@@ -1,186 +1,292 @@
1
- import { loadConfig } from "../config/io.js";
2
- import "../config/config.js";
3
- import { resolveWalletRuntimeConfig } from "../wallet/wallet-runtime-config.js";
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 !== null;
8
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
10
9
  }
11
- function asString(value) {
12
- if (typeof value !== "string") {
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 normalizeChain(value) {
25
- const chain = asString(value)?.toLowerCase();
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 normalizeProviderId(value) {
32
- const normalized = asString(value)?.toLowerCase();
33
- if (normalized === "embedded-keystore" || normalized === "local-socket-signer" || normalized === "alchemy" || normalized === "turnkey" || normalized === "privy") {
34
- return normalized;
16
+ function canonicalAsset(value) {
17
+ if (!isRecord(value)) {
18
+ return null;
35
19
  }
36
- return undefined;
37
- }
38
- function pickString(...values) {
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
- return undefined;
46
- }
47
- function extractCanonicalProgramAddress(assetValue) {
48
- if (!isRecord(assetValue)) {
49
- return undefined;
24
+ const address = stringField(value, "address");
25
+ if (kind === "spl-token" && isValidSolanaAddress(address)) {
26
+ return {
27
+ kind,
28
+ address
29
+ };
50
30
  }
51
- const kind = asString(assetValue.kind)?.toLowerCase();
52
- const address = asString(assetValue.address);
53
- return kind === "spl-token" && address ? address : undefined;
31
+ return null;
54
32
  }
55
- function extractA2aSettlementIntent(taskInput) {
56
- if (!isRecord(taskInput)) {
33
+ function canonicalWallet(value) {
34
+ if (!isRecord(value) || stringField(value, "chain").toLowerCase() !== "solana") {
57
35
  return null;
58
36
  }
59
- const invoiceRecord = isRecord(taskInput.invoice) ? taskInput.invoice : null;
60
- const paymentRecord = isRecord(taskInput.payment) ? taskInput.payment : isRecord(taskInput.settlement) ? taskInput.settlement : null;
61
- const taskWalletRecord = isRecord(taskInput.wallet) ? taskInput.wallet : null;
62
- const paymentWalletRecord = isRecord(paymentRecord?.wallet) ? paymentRecord.wallet : null;
63
- const invoiceWalletRecord = isRecord(invoiceRecord?.wallet) ? invoiceRecord.wallet : null;
64
- const paymentAssetRecord = isRecord(paymentRecord?.asset) ? paymentRecord.asset : null;
65
- const invoiceAssetRecord = isRecord(invoiceRecord?.asset) ? invoiceRecord.asset : null;
66
- const invoiceId = pickString(taskInput.invoiceId, taskInput.invoiceRef, taskInput.receiptRef, invoiceRecord?.id, invoiceRecord?.invoiceId, invoiceRecord?.invoiceRef, paymentRecord?.invoiceId, paymentRecord?.invoiceRef);
67
- const chain = normalizeChain(taskInput.chain ?? paymentRecord?.chain ?? invoiceRecord?.chain ?? taskInput.network);
68
- if (!chain) {
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 amount = asAmountString(taskInput.amount ?? paymentRecord?.amount ?? invoiceRecord?.amount ?? taskInput.value);
72
- if (!amount) {
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 providerId = normalizeProviderId(taskInput.providerId ?? taskInput.walletProvider ?? paymentRecord?.providerId ?? paymentRecord?.walletProvider ?? invoiceRecord?.providerId);
76
- const walletId = pickString(taskInput.walletId, taskWalletRecord?.id, paymentRecord?.walletId, paymentWalletRecord?.id, invoiceRecord?.walletId);
77
- const walletName = pickString(taskInput.walletName, taskInput.wallet, taskWalletRecord?.name, paymentRecord?.walletName, paymentRecord?.wallet, paymentWalletRecord?.name, invoiceRecord?.walletName, invoiceWalletRecord?.name);
78
- const payload = {
79
- chain,
80
- to: pickString(taskInput.to, paymentRecord?.to, paymentRecord?.recipient, invoiceRecord?.to),
81
- amount,
82
- program: pickString(taskInput.program, paymentRecord?.program, invoiceRecord?.program, extractCanonicalProgramAddress(paymentAssetRecord), extractCanonicalProgramAddress(invoiceAssetRecord)),
83
- memo: pickString(taskInput.memo, paymentRecord?.memo, invoiceId),
84
- providerId,
85
- walletId,
86
- walletName
87
- };
88
- return {
89
- payload,
90
- invoiceId
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
- loadConfig,
95
- resolveWalletRuntimeConfig,
96
- createOrExecuteWalletSend
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 intent = extractA2aSettlementIntent(params.taskInput);
104
- if (!intent) {
105
- return {
106
- status: "skipped",
107
- reason: "no settlement intent fields (requires chain + amount for paid-task settlement)"
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
- const cfg = deps.loadConfig();
111
- const walletCfg = deps.resolveWalletRuntimeConfig(cfg, params.env ?? process.env);
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 send = await deps.createOrExecuteWalletSend({
125
- payload: intent.payload,
126
- requestedBy: params.actor?.trim() || "a2a-settlement",
127
- sendPath: "automation",
128
- settlementContext: {
129
- taskId: params.taskId,
130
- invoiceId: intent.invoiceId,
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
- if (send.mode === "manual") {
161
- return {
162
- status: "queued",
163
- mode: "manual",
164
- requestId: send.request.id,
165
- invoiceId: intent.invoiceId,
166
- providerId: intent.payload.providerId,
167
- walletId: intent.payload.walletId,
168
- walletName: intent.payload.walletName,
169
- chain: intent.payload.chain,
170
- amount: intent.payload.amount
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
- mode: "autonomous",
176
- requestId: send.requestId,
177
- txHash: send.tx.txHash,
178
- invoiceId: intent.invoiceId,
179
- providerId: intent.payload.providerId,
180
- walletId: intent.payload.walletId,
181
- walletName: intent.payload.walletName,
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