@fangorn-network/westmarch 2026.10.20-dev → 2026.10.21-dev
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/README.md +4 -2
- package/docs/app-to-agent.md +23 -7
- package/package.json +4 -5
- package/site/dist/assets/AccountNotFoundScreen-C4njXc69-DyVH4CEz.js +1 -0
- package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-Dz1--SS9.js +31 -0
- package/site/dist/assets/Address-H8kD1d9O-BdFZmRwI.js +17 -0
- package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-CxaCAisL.js +6 -0
- package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-JGk7vndN.js +1 -0
- package/site/dist/assets/ApiController-CTLbMCcH.js +5 -0
- package/site/dist/assets/ArrowsRightLeftIcon-B8g9adpz.js +1 -0
- package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-CXD9_OP8.js +1 -0
- package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-BtJCglvU.js +1 -0
- package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-BgC2TsqH.js +1 -0
- package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-B9OzLeEO.js +103 -0
- package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-C7r5snUL.js +1 -0
- package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-BTV0NRio.js +68 -0
- package/site/dist/assets/CaptchaScreen-DbpvkIGx-7rSZIuM-.js +1 -0
- package/site/dist/assets/CheckCircleIcon-B1l17ioc.js +1 -0
- package/site/dist/assets/CheckCircleIcon-BGSI8nKf.js +1 -0
- package/site/dist/assets/Checkbox-D1EDeo41-BUfq0w99.js +52 -0
- package/site/dist/assets/ChevronDownIcon-B6uJvPHu.js +1 -0
- package/site/dist/assets/Chip-CZKIKt9K-r9Nk__0-.js +26 -0
- package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-DWWNHxmR.js +16 -0
- package/site/dist/assets/ConnectEmailForm-B-VRE0MN-CRQwS0Xu.js +3 -0
- package/site/dist/assets/ConnectLedgerScreen-DWHABGot-CZcCt31O.js +10 -0
- package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-C5IOf-SQ.js +1 -0
- package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-cwg74F3A.js +1 -0
- package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-D28oeK6b.js +1 -0
- package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-EEdkKeTp.js +95 -0
- package/site/dist/assets/ConnectWalletView-DqI-PTvX-C2mEzukj.js +74 -0
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-CH_7r8iV.js +7 -0
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-Z33kis0B.js +1 -0
- package/site/dist/assets/ConnectorUtil-DH4NePk5.js +21 -0
- package/site/dist/assets/ConstantsUtil-DmLsRHAl.js +198 -0
- package/site/dist/assets/CopyToClipboard-i_OQSBJr-_G88JCVR.js +39 -0
- package/site/dist/assets/CopyableText-CQapvaMr-CGGfc_zM.js +28 -0
- package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-C9Okoc0V.js +1 -0
- package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-D2l6hdSl.js +22 -0
- package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-Dda3KKqS.js +1 -0
- package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-DG8kJPt1.js +1 -0
- package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-CcOUfn6f.js +187 -0
- package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DeituDNh.js +8 -0
- package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-FDg6K14-.js +1 -0
- package/site/dist/assets/{EmailInputForm-Cqo1mda8-CZD4r5LM.js → EmailInputForm-Cqo1mda8-BmbxvPHC.js} +11 -11
- package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-B05CQ9rx.js +1 -0
- package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-Cxd1b9XH.js +1 -0
- package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-CrJy0ViX.js +23 -0
- package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-Bakaa3zu.js +1 -0
- package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-j78vKrcj.js +1 -0
- package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-D3dr7W9_.js +1 -0
- package/site/dist/assets/EnrollTotp-Dibew4dp-BXbYV8nI.js +66 -0
- package/site/dist/assets/EnvelopeIcon-DjPofnRI.js +1 -0
- package/site/dist/assets/ErrorBanner-BcpGRt0h-BhH6_V-9.js +21 -0
- package/site/dist/assets/{ErrorMessage-D8VaAP5m-oSruKN8L.js → ErrorMessage-D8VaAP5m-Bs7uX2a9.js} +2 -2
- package/site/dist/assets/ErrorScreen-DipdTWzE-BgPRgnOb.js +4 -0
- package/site/dist/assets/ErrorScreen-DipdTWzE-CvxXC6pz.js +1 -0
- package/site/dist/assets/ExclamationCircleIcon-BE-WGrut.js +1 -0
- package/site/dist/assets/ExclamationTriangleIcon-Ca1Xlc_f.js +1 -0
- package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-De2JvZdV.js +75 -0
- package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-bLp3hXoO.js +28 -0
- package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-Jr6D6JiZ.js +491 -0
- package/site/dist/assets/FingerPrintIcon-DOCbS93y.js +1 -0
- package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-A_G5kfa1.js +1 -0
- package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-LPv35wkD.js +1 -0
- package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-0hfGrfvf.js +58 -0
- package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-Dz0s_NWR.js +1 -0
- package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-ZGm-3-Io.js +1 -0
- package/site/dist/assets/GlobeAltIcon-BBRl2MMn.js +1 -0
- package/site/dist/assets/GooglePay-B53WnudL-BGiVpB8y.js +1 -0
- package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-CHdfIeD_.js +4 -0
- package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-Cgoiow3m.js +1 -0
- package/site/dist/assets/InfoBanner-Cb3p1z12-_YqQmRiu.js +22 -0
- package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-tuIrKQHH.js +1 -0
- package/site/dist/assets/InstallWalletScreen-DTA8dwLv-BMU_wa61.js +1 -0
- package/site/dist/assets/{JsonTree-BHzNC-ic-pAEq1bl9.js → JsonTree-BHzNC-ic-DcVr0YF0.js} +3 -3
- package/site/dist/assets/{LabelXs-oqZNqbm_-D09YjVR4.js → LabelXs-oqZNqbm_-CNprGVQM.js} +2 -2
- package/site/dist/assets/LandingScreen-CGWUoSUG-fH6rsQen.js +1 -0
- package/site/dist/assets/{Layouts-BMRfo5hw-D2u1-w8g.js → Layouts-BMRfo5hw-e-sepi6F.js} +16 -16
- package/site/dist/assets/Link-BdDilT2T-BdwlRJch.js +40 -0
- package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-BXKN2Qm5.js +77 -0
- package/site/dist/assets/LinkEmailScreen-dKo9frwc-Cyn7Q8p1.js +1 -0
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-CWiqnwLM.js +117 -0
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-YmDevJzf.js +1 -0
- package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-h7shW-Ay.js +1 -0
- package/site/dist/assets/Loader-UAZqxsnw-DJEVblm1.js +62 -0
- package/site/dist/assets/{LoadingSkeleton-BMsgO5PV-BRMh4Fv4.js → LoadingSkeleton-BMsgO5PV-D2atjsP5.js} +6 -6
- package/site/dist/assets/LockClosedIcon-9EFzWK1C.js +1 -0
- package/site/dist/assets/LoginFailedScreen-CN0dJV6U-By3Si77a.js +1 -0
- package/site/dist/assets/ManualTransferScreen-CHqcuqbs-BAHPY8rs.js +1 -0
- package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-CLjffFG1.js +1 -0
- package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-BmQg1Y61.js +1 -0
- package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-DmBtTtlw.js +1 -0
- package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-4a683Bmf.js +1 -0
- package/site/dist/assets/ModalFooter-BCuEK_nz-C_71qsaz.js +403 -0
- package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-DEHHcEf8.js +16 -0
- package/site/dist/assets/OAuthStatusScreen-ufbOa-da-BjAb_WsY.js +1 -0
- package/site/dist/assets/OpenLink-CUpJ1mOr-BLWFsPOW.js +39 -0
- package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-2PJTJxX-.js +1 -0
- package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-DCEg761l.js +6 -0
- package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-8nVjNc8k.js +20 -0
- package/site/dist/assets/{PhArrowCircleDown-BtlNV0TZ.js → PhArrowCircleDown-D97G-BOA.js} +5 -5
- package/site/dist/assets/PhArrowClockwise-DVgyFuez.js +14 -0
- package/site/dist/assets/PhArrowDown-87b1BizM.js +14 -0
- package/site/dist/assets/PhArrowLeft-Da0MfnbK.js +14 -0
- package/site/dist/assets/PhArrowRight-AdrIL4DW.js +14 -0
- package/site/dist/assets/{PhArrowSquareOut-DnQ7n_B4.js → PhArrowSquareOut-Bk2CMG3I.js} +5 -5
- package/site/dist/assets/PhArrowUp-4sgyKPGx.js +14 -0
- package/site/dist/assets/PhArrowUpRight-BNghD2zq.js +14 -0
- package/site/dist/assets/{PhArrowsClockwise-Brtx2Re-.js → PhArrowsClockwise-BXRn1GEl.js} +5 -5
- package/site/dist/assets/{PhArrowsDownUp-PZosTqZG.js → PhArrowsDownUp-DM09Jo_3.js} +5 -5
- package/site/dist/assets/PhArrowsLeftRight-MuKBLUoF.js +14 -0
- package/site/dist/assets/{PhBank-hhPAIPVb.js → PhBank-fHbgCqqZ.js} +5 -5
- package/site/dist/assets/PhBrowser-2-9m-AkM.js +14 -0
- package/site/dist/assets/PhCaretDown-BDNabFuL.js +14 -0
- package/site/dist/assets/PhCaretLeft-CI460R-A.js +14 -0
- package/site/dist/assets/PhCaretRight-D7ZS3Ls8.js +14 -0
- package/site/dist/assets/PhCaretUp-C-iIfyvO.js +14 -0
- package/site/dist/assets/PhCheck-DxQXn57r.js +14 -0
- package/site/dist/assets/{PhCircleHalf-Bk9C4DvT.js → PhCircleHalf-MJZeRBGF.js} +5 -5
- package/site/dist/assets/PhClock-x3MS3Mwi.js +14 -0
- package/site/dist/assets/{PhCompass-Df1ugFO-.js → PhCompass-hYn3HhGN.js} +5 -5
- package/site/dist/assets/PhCopy-CWNYcABI.js +14 -0
- package/site/dist/assets/{PhCreditCard-CZpdid2n.js → PhCreditCard-Fy4pzwtt.js} +5 -5
- package/site/dist/assets/{PhCurrencyDollar-B6IKKjue.js → PhCurrencyDollar-BgiaenCi.js} +5 -5
- package/site/dist/assets/{PhDesktop-BuCDXYJj.js → PhDesktop-CxrzCSv5.js} +5 -5
- package/site/dist/assets/PhDeviceMobile-CsyA5Goi.js +14 -0
- package/site/dist/assets/PhDotsThree-D-k1BiYg.js +14 -0
- package/site/dist/assets/PhEnvelope-D8kzeNox.js +14 -0
- package/site/dist/assets/PhFunnelSimple-CfQs5DAW.js +14 -0
- package/site/dist/assets/{PhGlobe-q1mqj65V.js → PhGlobe-DvmSc9_A.js} +5 -5
- package/site/dist/assets/{PhIdentificationCard-BeLXJpfZ.js → PhIdentificationCard-CfkZm-5K.js} +5 -5
- package/site/dist/assets/{PhImage-BYrKfN9k.js → PhImage-Cf0J2ZfJ.js} +5 -5
- package/site/dist/assets/{PhInfo-X33f06Ej.js → PhInfo-Bwi51-2X.js} +5 -5
- package/site/dist/assets/{PhLightbulb-DMZJsowR.js → PhLightbulb-C4FZV7Es.js} +5 -5
- package/site/dist/assets/PhMagnifyingGlass-C9u8jSCJ.js +14 -0
- package/site/dist/assets/{PhPaperPlaneRight-Dvo-nXr9.js → PhPaperPlaneRight-zxQVvPLX.js} +5 -5
- package/site/dist/assets/PhPlus-C4UoW-2n.js +14 -0
- package/site/dist/assets/{PhPower-D8-AcNM6.js → PhPower-CFyWDmgD.js} +5 -5
- package/site/dist/assets/{PhPuzzlePiece-C-7mYqGO.js → PhPuzzlePiece-BjoNVfST.js} +5 -5
- package/site/dist/assets/{PhQrCode-uIXlI5ER.js → PhQrCode-CP3tFauY.js} +5 -5
- package/site/dist/assets/{PhQuestion-rUoqC2sC.js → PhQuestion-wOWJBd3G.js} +5 -5
- package/site/dist/assets/{PhQuestionMark-W55Txvvb.js → PhQuestionMark-CV0k9C0Y.js} +5 -5
- package/site/dist/assets/{PhSealCheck-BeVLq9PH.js → PhSealCheck-vIKzREuN.js} +5 -5
- package/site/dist/assets/{PhSignOut-Cq2PivQ6.js → PhSignOut-CxELV-i0.js} +5 -5
- package/site/dist/assets/{PhSpinner-CZMtAFdX.js → PhSpinner-CGDmbzUd.js} +5 -5
- package/site/dist/assets/{PhTrash-BamrmMsN.js → PhTrash-C9PD0SAt.js} +5 -5
- package/site/dist/assets/{PhUser-A2fxqIV0.js → PhUser-0sWNXQeZ.js} +5 -5
- package/site/dist/assets/{PhVault-B8m1usHw.js → PhVault-6JTskUcC.js} +5 -5
- package/site/dist/assets/{PhWarning-CpkID9oi.js → PhWarning-CoKs3gz6.js} +5 -5
- package/site/dist/assets/PhWarningCircle-BXHw1fCt.js +14 -0
- package/site/dist/assets/PhX-DX0SFIqC.js +14 -0
- package/site/dist/assets/PhoneIcon-CZ47md80.js +1 -0
- package/site/dist/assets/PinInput-DbZ0b1i1-BrTXu3Km.js +247 -0
- package/site/dist/assets/PrivyPluginContext-DA-yS5vO-CY60yubk.js +1 -0
- package/site/dist/assets/QrCode-DbnZwlkH-CcMrWV5D.js +22 -0
- package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-DgeDnHOK.js +1 -0
- package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-CvJJwLhK.js +1 -0
- package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-CADtGtSV.js +7 -0
- package/site/dist/assets/SIWXUtil-Cpiv91-M.js +1 -0
- package/site/dist/assets/{Screen-D30meWsY-DDum2qlY.js → Screen-D30meWsY-vEusJ7KX.js} +22 -22
- package/site/dist/assets/{ScreenHeader-CHmc4-Lu-BqrAEXbV.js → ScreenHeader-CHmc4-Lu-BvGTLg53.js} +4 -4
- package/site/dist/assets/ScreenLayout-OwaQQcxH-cfOTmyl0.js +1 -0
- package/site/dist/assets/{SelectSourceAsset-CWFog6gm-8iXuqbAs.js → SelectSourceAsset-CWFog6gm-DxYklZYs.js} +18 -18
- package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-oeqeo05x.js +14 -0
- package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-BxFee9UA.js +11 -0
- package/site/dist/assets/ShieldCheckIcon-eFjsosCA.js +1 -0
- package/site/dist/assets/SignRequestScreen-BHKv32KR-z8ixfIma.js +26 -0
- package/site/dist/assets/SolanaWalletConnector-C7Lqk-Wz-Bc_lvdiF.js +1 -0
- package/site/dist/assets/{StackedContainer-B2vaEl56-C-ojzCoQ.js → StackedContainer-B2vaEl56-Do5dXB8-.js} +2 -2
- package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-DudetZAc.js +20 -0
- package/site/dist/assets/{Subtitle-CV-2yKE4-o-1FQLlX.js → Subtitle-CV-2yKE4-DV0o1av3.js} +2 -2
- package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-Bo3sONvf.js +1 -0
- package/site/dist/assets/{Title-BnzYV3Is-RX1f0RV-.js → Title-BnzYV3Is-C3qOPnO_.js} +2 -2
- package/site/dist/assets/TodoList-DnyULl18-BvxvubbF.js +36 -0
- package/site/dist/assets/TransactionDetails-e9nesl30-WWflkOIi.js +109 -0
- package/site/dist/assets/TransactionErrorView-BDBNqA_f-CotYKcgf.js +178 -0
- package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-sVFlWqa8.js +31 -0
- package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-CV2-mY19.js +6 -0
- package/site/dist/assets/TurnstileWrapper-B7sNddys-oPbuMTQt.js +1 -0
- package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-D_mjSpAy.js +1 -0
- package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-6RLG0ahv.js +1 -0
- package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-CaVN0bti.js +1 -0
- package/site/dist/assets/{Value-DTgR824E-DZpvBCWi.js → Value-DTgR824E-Bp6WGZZm.js} +7 -7
- package/site/dist/assets/WalletCards-DH1rqayz-D3cOTb9x.js +1 -0
- package/site/dist/assets/WalletIcon-DOIZhb2l.js +1 -0
- package/site/dist/assets/WalletInfoCard-sq_2wgFg-bOqfl5MA.js +29 -0
- package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-DWaVkMCA.js +1 -0
- package/site/dist/assets/WalletLink-DK5LB5Ha-DjUZvqs-.js +20 -0
- package/site/dist/assets/WalletOverflowButton-bfCnp-9T-B6P7DQXA.js +1 -0
- package/site/dist/assets/WarningBanner-ZZqCEtZK-Bc2YKZb7.js +21 -0
- package/site/dist/assets/__vite-browser-external-NciY4Vu1.js +1 -0
- package/site/dist/assets/_esm-BZP3cXTv.js +1 -0
- package/site/dist/assets/_esm-ZmzBJpEs.js +6 -0
- package/site/dist/assets/accounts-D4AXF17G.js +1 -0
- package/site/dist/assets/accounts-IkdFx9nq.js +1 -0
- package/site/dist/assets/analytics-mkkvFRju-BRBcadka.js +1 -0
- package/site/dist/assets/baseSepolia-Bn1j1Ysw.js +1 -0
- package/site/dist/assets/basic-Cz1YiCSk.js +1575 -0
- package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-DtOXx-2n.js +1 -0
- package/site/dist/assets/ccip-B1J3oTZx.js +7 -0
- package/site/dist/assets/ccip-Bd7261zy.js +1 -0
- package/site/dist/assets/ccip-D6EHKpjI.js +1 -0
- package/site/dist/assets/chain-scefkYIH.js +5 -0
- package/site/dist/assets/check-DHnllI8N.js +1 -0
- package/site/dist/assets/chevron-down-1y-r4bGO.js +1 -0
- package/site/dist/assets/circle-alert-OwxamXUX.js +1 -0
- package/site/dist/assets/circle-check-big-3sZGVC10.js +1 -0
- package/site/dist/assets/circle-x-DQjNUV9J.js +1 -0
- package/site/dist/assets/client-B-BpRtwY.js +1 -0
- package/site/dist/assets/client-BfIR1FvH.js +9 -0
- package/site/dist/assets/coinbase-DCPC2L_R-YEuIn3jh.js +3 -0
- package/site/dist/assets/copy-DMOX_yn7.js +1 -0
- package/site/dist/assets/core-GIEmxmAa.js +12 -0
- package/site/dist/assets/createLucideIcon-BsERoFTA.js +1 -0
- package/site/dist/assets/defineChain-B-SQDLTG.js +1 -0
- package/site/dist/assets/dijkstra-CY95afk4.js +1 -0
- package/site/dist/assets/dist-CoS6E-3x.js +1 -0
- package/site/dist/assets/dist-Cp6IXeJd.js +1 -0
- package/site/dist/assets/dist-CrNxmdZj.js +1 -0
- package/site/dist/assets/dist-DYGtf4F0.js +16 -0
- package/site/dist/assets/embed.worker-Cnl4VGr3.js +1 -0
- package/site/dist/assets/errors-BQ3N-RVt-CZPAWCgC.js +1 -0
- package/site/dist/assets/esm-C3DslVJx.js +1 -0
- package/site/dist/assets/esm-Ci1ogKuK.js +1 -0
- package/site/dist/assets/esm-Co94ENUV.js +37 -0
- package/site/dist/assets/esm-bb8SANZh.js +1 -0
- package/site/dist/assets/esm-n2lWo7kz.js +1 -0
- package/site/dist/assets/ethers-zTjbodk5-Cs648CnD.js +1 -0
- package/site/dist/assets/eventemitter3-Dzc_0Uq2.js +1 -0
- package/site/dist/assets/external-link-BBPG3rG7.js +1 -0
- package/site/dist/assets/farcaster-DPlSjvF5-CzBCmgyL.js +1 -0
- package/site/dist/assets/features-CuiHbgEJ.js +2 -0
- package/site/dist/assets/fingerprint-pattern-CjLtyIxB.js +1 -0
- package/site/dist/assets/floating-ui.react-DmaCfayr.js +1 -0
- package/site/dist/assets/floating-ui.react-dom-CaoMF8mP.js +1 -0
- package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-BVqOKQif.js +1 -0
- package/site/dist/assets/formatter-CVbp4SlJ.js +1 -0
- package/site/dist/assets/get-entropy-details-for-user-dHRH5Gpi-BNiOFXbK.js +1 -0
- package/site/dist/assets/getChainName-DjpPdUSc-DUyKDrnp.js +1 -0
- package/site/dist/assets/getErc20Balance-jXNpFf0N-q4bV8kQq.js +1 -0
- package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-DcnTFrXN.js +1 -0
- package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-Gx4_wxON.js +1 -0
- package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-r2UnDeEy.js +1 -0
- package/site/dist/assets/guards-BIW-GiMJ-D3tWTQAR.js +1 -0
- package/site/dist/assets/hooks.module-BYZGfwDl.js +1 -0
- package/site/dist/assets/hourglass-D_GfQdJr.js +1 -0
- package/site/dist/assets/id-UqEwL2BI-CTlvRMA5.js +1 -0
- package/site/dist/assets/index-BdEw5wyl-kLbhqLbv.js +1 -0
- package/site/dist/assets/index-C2h3EneX.js +8 -0
- package/site/dist/assets/{index-CWARkn2w-D6ikWJWj.js → index-CWARkn2w-DxuckIFn.js} +7 -7
- package/site/dist/assets/index-DvMddJcd-CNBb4VUn.js +12 -0
- package/site/dist/assets/index-YiCw0Y_x-Czl0tWfF.js +436 -0
- package/site/dist/assets/index.browser-B-i-Lj3J.js +1 -0
- package/site/dist/assets/index.browser-BMmUcykv.js +1 -0
- package/site/dist/assets/index.es-Crd0TyUS.js +2 -0
- package/site/dist/assets/index.es-DQbup1WG.js +3 -0
- package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-Cjf3l05I.js +1 -0
- package/site/dist/assets/jsx-runtime-CndCZlyt.js +1 -0
- package/site/dist/assets/landmark-BZPqMFEf.js +1 -0
- package/site/dist/assets/lib-DGtzi2DK.js +1 -0
- package/site/dist/assets/localBatchGatewayRequest-B71J8sQ9.js +29 -0
- package/site/dist/assets/lock-DyN_c-ud.js +1 -0
- package/site/dist/assets/logger-CsXm3oIv-B0UYpNFI.js +1 -0
- package/site/dist/assets/mail-V_mcPb64.js +1 -0
- package/site/dist/assets/modal-context-CwmSeFcv-DPWNJrfK.js +1 -0
- package/site/dist/assets/native-BKj27wfc.js +1 -0
- package/site/dist/assets/ofetch.CWycOUEr-Duby3iHT.js +1 -0
- package/site/dist/assets/parseAbi-Csg-8t59.js +2 -0
- package/site/dist/assets/parseAbiParameters-BWbIMYe4.js +1 -0
- package/site/dist/assets/parseEther-CHS0GNkM.js +1 -0
- package/site/dist/assets/pkce-DXF0yKjP-7_VY-d83.js +1 -0
- package/site/dist/assets/preload-helper-CRzLMJPS.js +1 -0
- package/site/dist/assets/privy-context-81KmsBw2-DiR6-Yq8.js +2 -0
- package/site/dist/assets/property-DuZ9DLP4.js +3 -0
- package/site/dist/assets/react-BfYA1q0G.js +1 -0
- package/site/dist/assets/react-CK2HRI1t.js +1 -0
- package/site/dist/assets/react-DxGeY8B8.js +1 -0
- package/site/dist/assets/react-auth-sHnipzbS.js +1 -0
- package/site/dist/assets/react-dom-BI2Koe4o.js +1 -0
- package/site/dist/assets/reservoir-x-nGuZkT-BguVFH3D.js +1 -0
- package/site/dist/assets/roles-BDPDWrwo.js +1 -0
- package/site/dist/assets/roles-DKPW79Ca.js +1 -0
- package/site/dist/assets/rolldown-runtime-Bjp52BOI.js +1 -0
- package/site/dist/assets/safe-url-D7SRPu33-CkMedGro.js +1 -0
- package/site/dist/assets/secp256k1-BeYL8aZl.js +1 -0
- package/site/dist/assets/secp256k1-Bh4MSkhz.js +1 -0
- package/site/dist/assets/secp256k1-Ci4cqHl0.js +1 -0
- package/site/dist/assets/secp256k1-DsxXqbXv.js +1 -0
- package/site/dist/assets/secp256k1-N9RUmafO.js +1 -0
- package/site/dist/assets/serializeAuthorizationList-DGMik9Wx.js +1 -0
- package/site/dist/assets/serializeSignature-CWKpxoab.js +2 -0
- package/site/dist/assets/sha2-C6s7zZmb.js +1 -0
- package/site/dist/assets/{shared-DRZUmnL5-MWD-C-pp.js → shared-DRZUmnL5-BewE5wK8.js} +33 -33
- package/site/dist/assets/{shared-FM0rljBt-c4eSjzGj.js → shared-FM0rljBt-CxLACri_.js} +6 -6
- package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-BkAKsRNi.js +1 -0
- package/site/dist/assets/simulateTransaction-CfuOrae4-PjA_tGjX.js +1 -0
- package/site/dist/assets/smartphone-3p8nFSTE.js +1 -0
- package/site/dist/assets/src-BBjkfi-Q.js +1 -0
- package/site/dist/assets/storage-Ufl800Ne-1qCR2JMO.js +8 -0
- package/site/dist/assets/stringify-DqUj9VzO.js +20 -0
- package/site/dist/assets/stripe.esm-DEi2D291.js +2 -0
- package/site/dist/assets/styles-BsotlekN-Aq27nZGc.js +9 -0
- package/site/dist/assets/{styles-Cm9H63WO-Cv1TbqYi.js → styles-Cm9H63WO-p_ic_dxE.js} +17 -17
- package/site/dist/assets/{styles-DVyDvTdj-CI4xZNHp.js → styles-DVyDvTdj-CjsWqAld.js} +8 -8
- package/site/dist/assets/{styles-hslXy6xG-DeVcFoDD.js → styles-hslXy6xG-D5QHIrJU.js} +23 -23
- package/site/dist/assets/telegram-B-JqnkqZ-Dqkm4rDn.js +1 -0
- package/site/dist/assets/to-ui-error-DWe-qwS3-Bi1HUQI9.js +4 -0
- package/site/dist/assets/toViemAccount-B5iDGq1b-CdFZwv07.js +2 -0
- package/site/dist/assets/transaction-BNTP-bFm-M5tJx8vY.js +1 -0
- package/site/dist/assets/transfer-6YztDh-t-BVQkTvG-.js +1 -0
- package/site/dist/assets/transformers.web-BTyOEJ0C.js +40 -0
- package/site/dist/assets/transformers.web-CUZUFjAK.js +49 -0
- package/site/dist/assets/triangle-alert-BG3Qw-Hq.js +1 -0
- package/site/dist/assets/twitch-5IOe4sIQ-CaXHFlAu.js +1 -0
- package/site/dist/assets/types-4CuOD23i.js +1 -0
- package/site/dist/assets/use-headless-crypto-deposit-Yn-QRLB3-CQqeyhGY.js +1 -0
- package/site/dist/assets/use-unlink-wallet-BKK4_5Ur-C0xQN_Lp.js +1 -0
- package/site/dist/assets/useActiveWallet-B-yZYGc6-BkK6rFBm.js +123 -0
- package/site/dist/assets/useGetSolPrice-x7gfUIHJ-CLVXqv6I.js +1 -0
- package/site/dist/assets/useGetTokenPrice-CaoUkb79-DAXXs3rs.js +1 -0
- package/site/dist/assets/useI18n-C-5n_noF-CGpkgIVy.js +1 -0
- package/site/dist/assets/useWalletBalance-CZnP5f_f-Cfd64m4n.js +1 -0
- package/site/dist/assets/useWallets-X1ndvJ_U-CAYqg7Za.js +1 -0
- package/site/dist/assets/utils-BkR7EQjg.js +1 -0
- package/site/dist/assets/utils-DJhBNOZA.js +1 -0
- package/site/dist/assets/utils-DdckVfQr.js +1 -0
- package/site/dist/assets/w3m-modal-B4H_uiPH.js +1174 -0
- package/site/dist/assets/wallet-BNI12IYk.js +1 -0
- package/site/dist/assets/wallet-CITSaPlB.js +2 -0
- package/site/dist/assets/wallet-connect-BvJtUsDt-CVlSNIXP.js +1 -0
- package/site/dist/assets/walletconnect-registry-xxG8XLCb-BpzpBq5s.js +1 -0
- package/site/dist/assets/walletconnect-v2-3frQFwbg-CzZ6oybX.js +12 -0
- package/site/dist/assets/{index-CztIxJB6.js → wui-ux-by-reown-XyHdtV1O.js} +296 -296
- package/site/dist/assets/x-gjDrY2rk.js +1 -0
- package/site/dist/index.html +5 -117
- package/site/worker.js +0 -24
- package/src/agent/mcp.js +47 -15
- package/src/agent/view-tools.js +3 -11
- package/src/agent/x402.js +3 -42
- package/src/discover/apps.js +37 -2
- package/src/discover/explore.js +19 -13
- package/src/publish/ship.js +2 -6
- package/site/dist/assets/AccountNotFoundScreen-C4njXc69-RUyAWRzV.js +0 -1
- package/site/dist/assets/AddFundsSelectionScreen-RAoCn7ej-ZV-LlYBe.js +0 -31
- package/site/dist/assets/Address-H8kD1d9O-CGQnt7Pu.js +0 -17
- package/site/dist/assets/AffirmativeConsentScreen-BG0MJxku-CKn2JLwq.js +0 -6
- package/site/dist/assets/AllowlistRejectionScreen-Cae6e1Od-9oIP9fma.js +0 -1
- package/site/dist/assets/ArrowsRightLeftIcon-BEhBD_6N.js +0 -1
- package/site/dist/assets/AuthenticateWithWalletScreen-CU6hIcFT-D1wLlSJs.js +0 -1
- package/site/dist/assets/AwaitingEvmToSolBridgingScreen-D0e_sZMS-CSBbHTyz.js +0 -1
- package/site/dist/assets/AwaitingExternalEthereumTransferScreen-ur5HL4R7-BsRq-xBt.js +0 -1
- package/site/dist/assets/AwaitingPasswordlessCodeScreen-DRHz76mM-BPdhsKvN.js +0 -103
- package/site/dist/assets/AwaitingSolToEvmBridgingScreen-CdLRrGD2-CEGNdrkr.js +0 -1
- package/site/dist/assets/BridgeNetworkSelectionView-CFGjB2nO-Da9P7eSx.js +0 -68
- package/site/dist/assets/CaptchaScreen-DbpvkIGx-BecgMnD_.js +0 -1
- package/site/dist/assets/CheckCircleIcon-DBiWFjO6.js +0 -1
- package/site/dist/assets/CheckCircleIcon-DzG2ROJZ.js +0 -1
- package/site/dist/assets/Checkbox-D1EDeo41-DMHcj9o_.js +0 -52
- package/site/dist/assets/ChevronDownIcon-2Os56gUt.js +0 -1
- package/site/dist/assets/Chip-CZKIKt9K-BWzs9fj5.js +0 -26
- package/site/dist/assets/CoinbaseOnrampStatusScreen-BbyCJDXL-CFvcSiDs.js +0 -16
- package/site/dist/assets/ConnectEmailForm-B-VRE0MN-BozkCg8q.js +0 -3
- package/site/dist/assets/ConnectLedgerScreen-DWHABGot-DaCnbBzh.js +0 -10
- package/site/dist/assets/ConnectOnlyLandingScreen-CZYx9Bmp-DUkCLkxD.js +0 -1
- package/site/dist/assets/ConnectOnlyStatusScreen-DCRzjxHx-Dv_5nMkZ.js +0 -1
- package/site/dist/assets/ConnectOrCreateScreen-CUUYUO07-DSGEeB3Y.js +0 -1
- package/site/dist/assets/ConnectPhoneForm-Dek5xn4C-C-s4s_Lq.js +0 -95
- package/site/dist/assets/ConnectWalletView-DqI-PTvX-BKX7fdYr.js +0 -74
- package/site/dist/assets/ConnectionStatusScreen-fUfROm9m-DSoAuMFZ.js +0 -7
- package/site/dist/assets/CopyToClipboard-i_OQSBJr-CZTXyfV0.js +0 -39
- package/site/dist/assets/CopyableText-CQapvaMr-DHO818I0.js +0 -28
- package/site/dist/assets/CrossAppAuthScreen-CLw7ymZq-DW4nRGfz.js +0 -1
- package/site/dist/assets/CustomLandingScreenView-Cm_MBSyX-DH8Nnb4Y.js +0 -22
- package/site/dist/assets/DelegatedActionsConsentScreen-DYF2U4y5-gfUS_uV5.js +0 -1
- package/site/dist/assets/DelegatedActionsRevokeScreen-bPp6Uwyh-DZj9HTHc.js +0 -1
- package/site/dist/assets/DepositAddressAddressStepView-4vdkb55L-eHYsDK9W.js +0 -187
- package/site/dist/assets/DepositAddressScreen-DBLRs7aI-DK_XVgVk.js +0 -8
- package/site/dist/assets/DepositAddressV3Screen-CDqIEMQw-6gRZzhLe.js +0 -1
- package/site/dist/assets/EmbeddedWalletConnectingScreen-D4T7DUzs-BZu2ae0k.js +0 -1
- package/site/dist/assets/EmbeddedWalletCreatedScreen-D7WhW5ve-86pviemJ.js +0 -1
- package/site/dist/assets/EmbeddedWalletKeyExportScreen-CqV4NYQ3-vDcvT53Y.js +0 -23
- package/site/dist/assets/EmbeddedWalletOnAccountCreateScreen-BoKb3Q2S-rNJAtSJc.js +0 -1
- package/site/dist/assets/EmbeddedWalletPasswordUpdateScreen-D3rMlqS7-I8Q95280.js +0 -1
- package/site/dist/assets/EmbeddedWalletPasswordUpdateSplashScreen-BPFkWJeE-Coi7OxoI.js +0 -1
- package/site/dist/assets/EnrollTotp-Dibew4dp-DC7FrDgo.js +0 -66
- package/site/dist/assets/EnvelopeIcon-DY6ERnW7.js +0 -1
- package/site/dist/assets/ErrorBanner-BcpGRt0h-BvESwN99.js +0 -21
- package/site/dist/assets/ErrorScreen-DipdTWzE-DnKGxH1Z.js +0 -4
- package/site/dist/assets/ExclamationCircleIcon-BZhlqH0r.js +0 -1
- package/site/dist/assets/ExclamationTriangleIcon-CkAOJIYV.js +0 -1
- package/site/dist/assets/FarcasterConnectStatusScreen-51tjUxqq-4pi7jooW.js +0 -75
- package/site/dist/assets/FarcasterSignerStatusScreen-6x-Uh95G-z2XCMaLL.js +0 -28
- package/site/dist/assets/FiatOnrampScreen-BAhYeiTI-CBVA9v1-.js +0 -491
- package/site/dist/assets/FingerPrintIcon-ra2dqmJO.js +0 -1
- package/site/dist/assets/FundSolWalletWithExternalSolanaWallet-WtLwYaOl-DwAwc6Ny.js +0 -1
- package/site/dist/assets/FundWalletMethodHeader-BWNkokCT-CZszQsZf.js +0 -1
- package/site/dist/assets/FundWithBankDepositScreen-DajkHxBD-DfX6nvFQ.js +0 -58
- package/site/dist/assets/FundingEditAmountScreen-CpvpiO4M-CDS_sk_t.js +0 -1
- package/site/dist/assets/FundingMethodSelectionScreen-Db7vhRlE-CPfNQemT.js +0 -1
- package/site/dist/assets/GlobeAltIcon-SEUEIe_E.js +0 -1
- package/site/dist/assets/GooglePay-B53WnudL-aap7zwag.js +0 -1
- package/site/dist/assets/HCaptchaWrapper-CUi9LJsp-DgSjCjQI.js +0 -4
- package/site/dist/assets/InAppBrowserLoginNotPossible-BMR9br1T-DO4wICml.js +0 -1
- package/site/dist/assets/InfoBanner-Cb3p1z12-CDWt2ADo.js +0 -22
- package/site/dist/assets/InjectedWalletIcon-DLcYOGDj-Ba19XoBr.js +0 -1
- package/site/dist/assets/InstallWalletScreen-DTA8dwLv-DGpewEch.js +0 -1
- package/site/dist/assets/LandingScreen-CGWUoSUG-CUOCWUXd.js +0 -1
- package/site/dist/assets/Link-BdDilT2T-BYiP1zvW.js +0 -40
- package/site/dist/assets/LinkConflictScreen-C3ZEPsgl-Tb6cAepT.js +0 -77
- package/site/dist/assets/LinkEmailScreen-dKo9frwc-pq0NF2JO.js +0 -1
- package/site/dist/assets/LinkPasskeyScreen-zbrl_AI_-D9MOmDqg.js +0 -117
- package/site/dist/assets/LinkPhoneScreen-oIUpfj0w-B80UJqAZ.js +0 -1
- package/site/dist/assets/LockClosedIcon-BqkoEL9J.js +0 -1
- package/site/dist/assets/LoginFailedScreen-CN0dJV6U-DlnOM-Kh.js +0 -1
- package/site/dist/assets/ManualTransferScreen-CHqcuqbs-DSShupq9.js +0 -1
- package/site/dist/assets/MfaAuthEnrollmentFlowScreen-Dj7gPTRC-DUPV_SLA.js +0 -1
- package/site/dist/assets/MfaAuthVerifyFlowScreen-DbFpyWMy-D96GpzXX.js +0 -1
- package/site/dist/assets/MfaEnrollmentFlowScreen-DhLnGgnr-CYQDa4ND.js +0 -1
- package/site/dist/assets/MfaVerifyFlowScreen-C_XPjMRP-CJtSAXGN.js +0 -1
- package/site/dist/assets/ModalFooter-BCuEK_nz-D2I8KWtk.js +0 -403
- package/site/dist/assets/MoonpayStatusScreen-CzTUtokc-Bx5aHy-z.js +0 -16
- package/site/dist/assets/OAuthStatusScreen-ufbOa-da-CS6988X2.js +0 -1
- package/site/dist/assets/OpenLink-CUpJ1mOr-EZWVSX2r.js +0 -39
- package/site/dist/assets/PasskeySelectSignupOrLogin-xh2ScC_l-BY4eK5Jh.js +0 -1
- package/site/dist/assets/PasskeyStatusScreen-Bla8MaOk-LXys76u9.js +0 -6
- package/site/dist/assets/PasswordRecoveryScreen-awGXZkQk-RczvLvmo.js +0 -20
- package/site/dist/assets/PhArrowClockwise-mOiWYLMV.js +0 -14
- package/site/dist/assets/PhArrowDown-CkoOD89h.js +0 -14
- package/site/dist/assets/PhArrowLeft-C0jlxVhM.js +0 -14
- package/site/dist/assets/PhArrowRight-BI-V03Xf.js +0 -14
- package/site/dist/assets/PhArrowUp-izKvURUW.js +0 -14
- package/site/dist/assets/PhArrowUpRight-Bn-JhHsY.js +0 -14
- package/site/dist/assets/PhArrowsLeftRight-CYsRQ2qh.js +0 -14
- package/site/dist/assets/PhBrowser-BjzAmrHO.js +0 -14
- package/site/dist/assets/PhCaretDown-ddSjwcwm.js +0 -14
- package/site/dist/assets/PhCaretLeft-B7YLoNEF.js +0 -14
- package/site/dist/assets/PhCaretRight-BY8D5MIg.js +0 -14
- package/site/dist/assets/PhCaretUp-BG10nSut.js +0 -14
- package/site/dist/assets/PhCheck-DrKd7pBC.js +0 -14
- package/site/dist/assets/PhClock-Sj17weCB.js +0 -14
- package/site/dist/assets/PhCopy-rgttky8E.js +0 -14
- package/site/dist/assets/PhDeviceMobile-CnybhXY-.js +0 -14
- package/site/dist/assets/PhDotsThree-CSAEcba1.js +0 -14
- package/site/dist/assets/PhEnvelope-SmaNeXoQ.js +0 -14
- package/site/dist/assets/PhFunnelSimple-DKx35ITq.js +0 -14
- package/site/dist/assets/PhMagnifyingGlass-B6D0sWFL.js +0 -14
- package/site/dist/assets/PhPlus-CBvZvLax.js +0 -14
- package/site/dist/assets/PhWarningCircle-Cm58gXb9.js +0 -14
- package/site/dist/assets/PhX-C3b4cCEy.js +0 -14
- package/site/dist/assets/PhoneIcon-CzbssTb8.js +0 -1
- package/site/dist/assets/PinInput-DbZ0b1i1-1DtLWL81.js +0 -247
- package/site/dist/assets/QrCode-DbnZwlkH-ChwcUk_h.js +0 -22
- package/site/dist/assets/RecoveryOAuthStatusScreen-CsgtTI2x-C79jd345.js +0 -1
- package/site/dist/assets/RecoveryPasswordCreateScreen-Be-qJ-LU-C9c0x-yq.js +0 -1
- package/site/dist/assets/RecoverySelectionScreen-D1iGtpmi-PNqHb6CI.js +0 -7
- package/site/dist/assets/ScreenLayout-OwaQQcxH-B4Z8FjFp.js +0 -1
- package/site/dist/assets/SetAutomaticRecoveryScreen-BO_OEqAZ-CUpQZ9wq.js +0 -14
- package/site/dist/assets/SetWalletPasswordForm-DwCTVtAh-ZzvPLj2s.js +0 -15
- package/site/dist/assets/ShieldCheckIcon-Bjwe_-PV.js +0 -1
- package/site/dist/assets/SignRequestScreen-BHKv32KR-0qGeNipB.js +0 -26
- package/site/dist/assets/StandardSignAndSendTransactionScreen-CfhIXVtd-C3lgJb68.js +0 -20
- package/site/dist/assets/TelegramAuthScreen-UL9zLfO8-l35_C2DG.js +0 -1
- package/site/dist/assets/TodoList-DnyULl18-JxWWU9KA.js +0 -36
- package/site/dist/assets/TransactionDetails-e9nesl30-C91nJPM9.js +0 -109
- package/site/dist/assets/TransactionErrorView-BDBNqA_f-Cpm-4xzm.js +0 -178
- package/site/dist/assets/TransferFromWalletScreen-Qvn1Yuno-BWCH7-Si.js +0 -31
- package/site/dist/assets/TransferOrBridgeLoadingScreen-Dl1I_iIz-BWMeJabk.js +0 -6
- package/site/dist/assets/TurnstileWrapper-B7sNddys-Dgr80Gih.js +0 -1
- package/site/dist/assets/UpdateEmailScreen-DVOhPV0H-Clk4zk-8.js +0 -1
- package/site/dist/assets/UpdatePhoneScreen-CXRswTNZ-BgRsoR3B.js +0 -1
- package/site/dist/assets/UserLimitReachedScreen-5we2DHn8-D-SU-vAz.js +0 -1
- package/site/dist/assets/WalletCards-DH1rqayz-UuZ4i_Ze.js +0 -1
- package/site/dist/assets/WalletIcon-B1i03Vqc.js +0 -1
- package/site/dist/assets/WalletInfoCard-sq_2wgFg-TXTxmb8L.js +0 -29
- package/site/dist/assets/WalletInterstitialScreen-Sh7LfsAh-CbrFb0ON.js +0 -1
- package/site/dist/assets/WalletLink-DK5LB5Ha-BYQZV7UV.js +0 -20
- package/site/dist/assets/WalletOverflowButton-bfCnp-9T-CNgSPnTS.js +0 -1
- package/site/dist/assets/WarningBanner-ZZqCEtZK-DNZUUOph.js +0 -21
- package/site/dist/assets/__vite-browser-external-BIHI7g3E.js +0 -1
- package/site/dist/assets/analytics-mkkvFRju-DOXuftJB.js +0 -1
- package/site/dist/assets/basic-C9wn6QoQ.js +0 -1575
- package/site/dist/assets/bytes-CjWw8TJh.js +0 -1
- package/site/dist/assets/capitalizeFirstLetter-DmLYqXsO-tV1Idewc.js +0 -1
- package/site/dist/assets/ccip-BhHEqVIW.js +0 -1
- package/site/dist/assets/check-C_DTyjLS.js +0 -1
- package/site/dist/assets/chevron-down-iklXXH-z.js +0 -1
- package/site/dist/assets/circle-alert-KEOUF48T.js +0 -1
- package/site/dist/assets/circle-check-big-BJ_ADwB4.js +0 -1
- package/site/dist/assets/circle-x-BSfWmhYk.js +0 -1
- package/site/dist/assets/client-BnDcP42J.js +0 -9
- package/site/dist/assets/client-DH86IrJA.js +0 -125
- package/site/dist/assets/coinbase-DCPC2L_R-2ivYfoMv.js +0 -3
- package/site/dist/assets/copy-sK00DOfH.js +0 -1
- package/site/dist/assets/core-CRE213RM.js +0 -211
- package/site/dist/assets/createLucideIcon-D9OK_uxG.js +0 -1
- package/site/dist/assets/custom-V1wex-Di.js +0 -1
- package/site/dist/assets/dijkstra-COg3n3zL.js +0 -1
- package/site/dist/assets/embed.worker-BRIYO7m8.js +0 -1
- package/site/dist/assets/encodePacked-DyXYq3Cc.js +0 -1
- package/site/dist/assets/ethers-zTjbodk5-DSYOi6tU.js +0 -1
- package/site/dist/assets/external-link-Cdp8NBio.js +0 -1
- package/site/dist/assets/fallback-DiFue5Zm.js +0 -1
- package/site/dist/assets/farcaster-DPlSjvF5-DP2DLoHZ.js +0 -1
- package/site/dist/assets/features-B6BTj_BL.js +0 -5
- package/site/dist/assets/fingerprint-pattern-gFJTz5e4.js +0 -1
- package/site/dist/assets/floating-ui.react-D9ndYqYK.js +0 -1
- package/site/dist/assets/floating-ui.react-dom-CNbOgOFt.js +0 -1
- package/site/dist/assets/formatErc20TokenAmount-BuPk9xcy-CkAr4Oc0.js +0 -1
- package/site/dist/assets/getChainName-DjpPdUSc-c2urPd0g.js +0 -1
- package/site/dist/assets/getErc20Balance-jXNpFf0N-mFQ9Iqk-.js +0 -1
- package/site/dist/assets/getErc20TokenInfo-BNTrzLMP-Dx5he_uG.js +0 -1
- package/site/dist/assets/getFormattedUsdFromLamports-De3U9GlO-C446pzMl.js +0 -1
- package/site/dist/assets/getTransactionCount-80UHlwAV.js +0 -1
- package/site/dist/assets/getUsdcMintAddress-BVgm9GRo-FDalV59C.js +0 -1
- package/site/dist/assets/hashTypedData-Beq57Ogb.js +0 -22
- package/site/dist/assets/hooks.module-ClpaQ1Tg.js +0 -1
- package/site/dist/assets/hourglass-CB7z_I9H.js +0 -1
- package/site/dist/assets/http-BocEfKYb.js +0 -19
- package/site/dist/assets/index-0knDOgU9.js +0 -1
- package/site/dist/assets/index-9jNeS_nC.js +0 -1
- package/site/dist/assets/index-B--T-Fmt.js +0 -16
- package/site/dist/assets/index-BDkarAkX.js +0 -2
- package/site/dist/assets/index-BMfMy017.js +0 -679
- package/site/dist/assets/index-BOd8jv8-.js +0 -1
- package/site/dist/assets/index-BdEw5wyl-2VGMzHIs.js +0 -1
- package/site/dist/assets/index-C8ThRelw.js +0 -9
- package/site/dist/assets/index-D4LdLFDC.js +0 -1
- package/site/dist/assets/index-D6T-s6sR.js +0 -1
- package/site/dist/assets/index-D7396TWe.js +0 -1
- package/site/dist/assets/index-DdxtHe81.js +0 -2
- package/site/dist/assets/index-DvMddJcd-D7AEQrzj.js +0 -12
- package/site/dist/assets/index-nibyPLVP.js +0 -1
- package/site/dist/assets/index.browser-B6Bt5URJ.js +0 -1
- package/site/dist/assets/isPaymentRequestAvailable-Bq1cemEn-D7xtzRqA.js +0 -1
- package/site/dist/assets/landmark-CMLKifhk.js +0 -1
- package/site/dist/assets/lock-BkyjNE8h.js +0 -1
- package/site/dist/assets/mail-B6-Tq9Ld.js +0 -1
- package/site/dist/assets/native-CJ5et6AR.js +0 -1
- package/site/dist/assets/nonceManager-zkW7cM66.js +0 -1
- package/site/dist/assets/parseEther-C7aOvuze.js +0 -1
- package/site/dist/assets/parseSignature-BIjcuWdB.js +0 -1
- package/site/dist/assets/preload-helper-PPVm8Dsz.js +0 -1
- package/site/dist/assets/privateKeyToAccount-CRvvpHWf.js +0 -1
- package/site/dist/assets/property-CnFDNXw5.js +0 -3
- package/site/dist/assets/react-auth_false-DedQs79w.js +0 -1
- package/site/dist/assets/reservoir-x-nGuZkT-DFxAFt2v.js +0 -1
- package/site/dist/assets/roles-DV_6FRBZ.js +0 -1
- package/site/dist/assets/safe-url-D7SRPu33-A8zMgOTd.js +0 -1
- package/site/dist/assets/serializeErc6492Signature-CeJeL3h6.js +0 -1
- package/site/dist/assets/serializeTransaction-L-_Ej-jW.js +0 -8
- package/site/dist/assets/shouldProceedtoEmbeddedWalletCreationFlow-B3vyavrh-CF2QteTJ.js +0 -1
- package/site/dist/assets/simulateTransaction-CfuOrae4-BHUMPf6Q.js +0 -1
- package/site/dist/assets/smartphone-DAN5rY0T.js +0 -1
- package/site/dist/assets/stripe.esm-Dv8C3q95.js +0 -2
- package/site/dist/assets/styles-BsotlekN-Cjuu2SDV.js +0 -9
- package/site/dist/assets/telegram-B-JqnkqZ-DTjJLkIF.js +0 -1
- package/site/dist/assets/to-ui-error-DWe-qwS3-Dx3yzcV0.js +0 -4
- package/site/dist/assets/toAccount-Bq6rbpbI.js +0 -1
- package/site/dist/assets/transaction-BNTP-bFm-CrebgH-D.js +0 -1
- package/site/dist/assets/transactionReceipt-BwJl-gjg.js +0 -1
- package/site/dist/assets/transfer-6YztDh-t-DU6hH7CZ.js +0 -1
- package/site/dist/assets/transformers.web-BEKVh7pD.js +0 -40
- package/site/dist/assets/transformers.web-aWa49tv1.js +0 -40
- package/site/dist/assets/triangle-alert-ndoiBs4y.js +0 -1
- package/site/dist/assets/twitch-5IOe4sIQ-BXviIywg.js +0 -1
- package/site/dist/assets/useGetSolPrice-x7gfUIHJ-C7axYJ--.js +0 -1
- package/site/dist/assets/useGetTokenPrice-CaoUkb79-CR4CrguU.js +0 -1
- package/site/dist/assets/useI18n-C-5n_noF-C_t8QqBJ.js +0 -1
- package/site/dist/assets/useWalletBalance-CZnP5f_f-BnSHLVI_.js +0 -1
- package/site/dist/assets/w3m-modal-Bz5KWTQ-.js +0 -1174
- package/site/dist/assets/wallet-DTM31trz.js +0 -2
- package/site/dist/assets/wallet-UESEqPei.js +0 -1
- package/site/dist/assets/wallet-connect-BvJtUsDt-CnvUnFbz.js +0 -1
- package/site/dist/assets/walletconnect-v2-3frQFwbg-CzQk99gS.js +0 -15
- package/site/dist/assets/x-B2_XdOVQ.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-BsERoFTA.js";var t=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
|
package/site/dist/index.html
CHANGED
|
@@ -1,126 +1,14 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
|
-
<script type="module" crossorigin src="./assets/index-
|
|
4
|
-
<link rel="modulepreload" crossorigin href="./assets/
|
|
5
|
-
<link rel="modulepreload" crossorigin href="./assets/
|
|
3
|
+
<script type="module" crossorigin src="./assets/index-C2h3EneX.js"></script>
|
|
4
|
+
<link rel="modulepreload" crossorigin href="./assets/rolldown-runtime-Bjp52BOI.js">
|
|
5
|
+
<link rel="modulepreload" crossorigin href="./assets/preload-helper-CRzLMJPS.js">
|
|
6
|
+
<link rel="modulepreload" crossorigin href="./assets/roles-DKPW79Ca.js">
|
|
6
7
|
|
|
7
8
|
<meta charset="utf-8">
|
|
8
9
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
9
10
|
<title>Fangorn app</title>
|
|
10
|
-
<style>
|
|
11
|
-
/* The fangorn base: structure and a few tokens, no paint. An app repaints by shipping its own
|
|
12
|
-
theme.css (site.pages/theme.css), loaded after this; override the tokens first, rules if you must. */
|
|
13
|
-
:root {
|
|
14
|
-
--bg: #fbfbf8; --fg: #1a1c19; --muted: #6a6f68; --line: #dfe1db; --accent: #2f5d45;
|
|
15
|
-
--mark: #e6eedb; --hot: #b4432f; --edge: #b7bab2;
|
|
16
|
-
--font: system-ui, sans-serif; --font-display: var(--font); --radius: 3px; --gutter: 16px; --measure: 760px;
|
|
17
|
-
color-scheme: light;
|
|
18
|
-
}
|
|
19
|
-
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
|
|
20
|
-
--bg: #121412; --fg: #e4e6e0; --muted: #959a92; --line: #2a2e29; --accent: #8fbf9f;
|
|
21
|
-
--mark: #2d3b2a; --hot: #d9674f; --edge: #4b5049; color-scheme: dark; } }
|
|
22
|
-
* { box-sizing: border-box; }
|
|
23
|
-
body { background: var(--bg); color: var(--fg); font: 16px/1.5 var(--font); margin: 0; }
|
|
24
|
-
a { color: var(--accent); } button, input { font: inherit; color: inherit; }
|
|
25
|
-
button { cursor: pointer; background: none; border: 1px solid var(--line); border-radius: var(--radius); padding: 4px 10px; }
|
|
26
|
-
button:disabled { opacity: .45; cursor: default; }
|
|
27
|
-
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
28
|
-
ul { list-style: none; padding: 0; margin: 0; }
|
|
29
|
-
h2 { font-size: .75rem; font-weight: 600; text-transform: uppercase; letter-spacing: .08em; color: var(--muted); margin: 28px 0 8px; }
|
|
30
|
-
h2.page, .record h2 { font: 600 1.3rem/1.3 var(--font-display); text-transform: none; letter-spacing: 0; color: var(--fg); margin: 4px 0 12px; }
|
|
31
|
-
h3 { margin: 0; font-size: 1rem; }
|
|
32
|
-
small, time, .hint, .empty, .about, #status, .resultsbar, .detail { color: var(--muted); }
|
|
33
|
-
small, time, .hint { font-size: .8rem; }
|
|
34
|
-
.paid { border: 1px solid var(--line); border-radius: var(--radius); padding: 10px 14px; margin: 12px 0; display: grid; gap: 6px; }
|
|
35
|
-
.paid h3 { margin: 0; font-size: 1rem; } .paid ul { margin: 0; padding-left: 18px; } .detail { margin: 0; font-size: .9rem; }
|
|
36
|
-
.forsale { color: var(--accent); font-weight: 600; }
|
|
37
|
-
mark { background: var(--mark); color: inherit; }
|
|
38
|
-
|
|
39
|
-
/* the bar: name, search, sections */
|
|
40
|
-
.bar { position: sticky; top: 0; z-index: 2; background: var(--bg); border-bottom: 1px solid var(--line); }
|
|
41
|
-
.bar > div, main, footer { max-width: var(--measure); margin: 0 auto; padding-inline: var(--gutter); }
|
|
42
|
-
.bar > div { padding-block: 10px; display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
|
|
43
|
-
#home { color: var(--fg); text-decoration: none; font: 600 1.1rem var(--font-display); white-space: nowrap; }
|
|
44
|
-
#q { flex: 1 1 240px; }
|
|
45
|
-
#q input { width: 100%; padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius); background: transparent; }
|
|
46
|
-
/* Where to go on the left; the reader's account and the app's own pages after a rule. */
|
|
47
|
-
nav { display: flex; gap: 14px; font-size: .9rem; } nav > span { display: flex; gap: inherit; }
|
|
48
|
-
#aside:not(:empty) { border-left: 1px solid var(--line); padding-left: 14px; }
|
|
49
|
-
nav a { color: var(--muted); text-decoration: none; } nav a.on, nav a:hover { color: var(--fg); }
|
|
50
|
-
main { padding-block: 16px 48px; }
|
|
51
|
-
|
|
52
|
-
/* results: one rule between rows, votes on the right */
|
|
53
|
-
.list, article { border-top: 1px solid var(--line); }
|
|
54
|
-
.row { display: flex; gap: 10px; align-items: flex-start; padding: 10px 0; border-bottom: 1px solid var(--line); }
|
|
55
|
-
.main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
|
|
56
|
-
.title { color: var(--fg); text-decoration: none; font-weight: 500; } .title:hover { color: var(--accent); }
|
|
57
|
-
.resultsbar { display: flex; justify-content: space-between; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; font-size: .9rem; }
|
|
58
|
-
.sort, .chips, .acts, .votes { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
|
|
59
|
-
.chips { margin: 4px 0 16px; }
|
|
60
|
-
.picker { display: inline-flex; flex-direction: column; gap: 4px; margin: 4px 0 16px; font-size: .85rem; color: var(--muted); }
|
|
61
|
-
.picker select { font: inherit; font-size: 1rem; color: var(--fg); background: var(--bg); border: 1px solid var(--edge); border-radius: var(--radius); padding: 6px 10px; min-width: min(320px, 100%); }
|
|
62
|
-
details.about summary { cursor: pointer; color: var(--fg); font-size: 1.05rem; }
|
|
63
|
-
details.about p { color: var(--muted); margin: 6px 0 0; }
|
|
64
|
-
.chip { font-size: .85rem; padding: 2px 10px; }
|
|
65
|
-
.chip.on, .vote[aria-pressed="true"] { border-color: var(--accent); background: var(--mark); }
|
|
66
|
-
.vote { padding: 2px 7px; line-height: 1.3; }
|
|
67
|
-
.star { font-size: 1.25rem; line-height: 1; padding: 4px 6px; border: 0; color: var(--muted); }
|
|
68
|
-
.star[aria-pressed="true"] { color: var(--accent); background: none; }
|
|
69
|
-
.more, .linkish { border: 0; color: var(--accent); padding: 8px 0 0; font-size: .9rem; }
|
|
70
|
-
.act { font-size: .88rem; text-decoration: none; color: var(--fg); border: 1px solid var(--line); border-radius: var(--radius); padding: 4px 10px; }
|
|
71
|
-
|
|
72
|
-
/* occasions on the front page, one record */
|
|
73
|
-
article { padding: 12px 0 4px; } article header { display: flex; flex-direction: column; margin-bottom: 4px; }
|
|
74
|
-
article .list { border-top: 0; } article .row:last-child { border-bottom: 0; }
|
|
75
|
-
.record { border-top: 0; }
|
|
76
|
-
.record dl { display: grid; grid-template-columns: max-content 1fr; gap: 2px 14px; font-size: .88rem; margin: 12px 0; }
|
|
77
|
-
.record dt { color: var(--muted); text-transform: capitalize; } .record dd { margin: 0; }
|
|
78
|
-
.acts { margin: 12px 0 4px; }
|
|
79
|
-
.signal { padding: 14px 0 6px; } .signal h3 { margin: 4px 0 6px; font: 600 1.15rem/1.3 var(--font-display); }
|
|
80
|
-
.signal .meta { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; font-size: .78rem; color: var(--muted); text-transform: uppercase; letter-spacing: .04em; }
|
|
81
|
-
.stage { color: var(--accent); font-weight: 700; }
|
|
82
|
-
.steps { list-style: none; margin: 8px 0 0; padding: 0; } .steps li { display: grid; grid-template-columns: 7.5em 1fr; gap: 10px; padding: 5px 0; border-top: 1px solid var(--line); font-size: .9rem; }
|
|
83
|
-
.steps time { color: var(--muted); font-variant-numeric: tabular-nums; }
|
|
84
|
-
.doc iframe { width: 100%; height: 80vh; border: 1px solid var(--line); margin-top: 12px; background: #fff; }
|
|
85
|
-
|
|
86
|
-
/* For you: what the taste is built from, and the four knobs */
|
|
87
|
-
.taste { margin-bottom: 20px; }
|
|
88
|
-
.pills { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0; }
|
|
89
|
-
.pills li { display: inline-flex; align-items: center; gap: 2px; border: 1px solid var(--line); border-radius: var(--radius); padding: 0 0 0 8px; font-size: .85rem; }
|
|
90
|
-
.pills li.no { text-decoration: line-through; color: var(--muted); }
|
|
91
|
-
.pills button { border: 0; padding: 0 8px; color: var(--muted); }
|
|
92
|
-
.knobs { display: grid; gap: 12px; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); margin: 12px 0; }
|
|
93
|
-
.knob { display: grid; gap: 2px; font-size: .85rem; }
|
|
94
|
-
.knob span { display: flex; justify-content: space-between; font-weight: 600; }
|
|
95
|
-
.knob input { width: 100%; accent-color: var(--accent); }
|
|
96
|
-
|
|
97
|
-
/* the map, for apps that ship map.json */
|
|
98
|
-
body.wide { --measure: 1200px; }
|
|
99
|
-
.mapbar input { width: 100%; padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius); background: transparent; margin-bottom: 8px; }
|
|
100
|
-
.mapwrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; align-items: start; }
|
|
101
|
-
@media (max-width: 760px) { .mapwrap { grid-template-columns: 1fr; } }
|
|
102
|
-
svg.map { width: 100%; height: auto; display: block; position: sticky; top: 70px; }
|
|
103
|
-
svg.map path { stroke: var(--edge); stroke-width: .8; cursor: pointer; }
|
|
104
|
-
svg.map path:hover, svg.map path:focus { stroke: var(--accent); stroke-width: 2; outline: none; }
|
|
105
|
-
svg.map path.near { stroke: var(--accent); stroke-width: 2; stroke-dasharray: 4 3; }
|
|
106
|
-
svg.map path.on { stroke: var(--fg); stroke-width: 2.6; }
|
|
107
|
-
.h0 { fill: var(--bg); background: var(--bg); }
|
|
108
|
-
.h1 { fill: color-mix(in srgb, var(--hot) 18%, var(--bg)); background: color-mix(in srgb, var(--hot) 18%, var(--bg)); }
|
|
109
|
-
.h2 { fill: color-mix(in srgb, var(--hot) 36%, var(--bg)); background: color-mix(in srgb, var(--hot) 36%, var(--bg)); }
|
|
110
|
-
.h3 { fill: color-mix(in srgb, var(--hot) 56%, var(--bg)); background: color-mix(in srgb, var(--hot) 56%, var(--bg)); }
|
|
111
|
-
.h4 { fill: color-mix(in srgb, var(--hot) 78%, var(--bg)); background: color-mix(in srgb, var(--hot) 78%, var(--bg)); }
|
|
112
|
-
.h5 { fill: var(--hot); background: var(--hot); }
|
|
113
|
-
.sw { display: inline-block; width: 14px; height: 12px; border: 1px solid var(--edge); vertical-align: -1px; }
|
|
114
|
-
.panel h3 { margin: 4px 0; } .panel .chips { margin: 6px 0; } .panel .list { margin-top: 8px; }
|
|
115
|
-
|
|
116
|
-
footer { padding-block: 0 32px; color: var(--muted); font-size: .8rem; }
|
|
117
|
-
/* what is inside, a pass, an agent's line */
|
|
118
|
-
.gate .stats { font-size: 1.05rem; } .gate .stats strong { font: 600 1.4rem var(--font-display); }
|
|
119
|
-
.buy { justify-self: start; border-color: var(--accent); background: var(--accent); color: var(--bg); padding: 8px 16px; font-weight: 600; }
|
|
120
|
-
.agents { margin-top: 28px; } .copy { display: grid; gap: 4px; margin: 10px 0; }
|
|
121
|
-
.copy pre { margin: 0; padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius); overflow-x: auto; font-size: .8rem; }
|
|
122
|
-
.copy .chip { justify-self: start; }
|
|
123
|
-
</style>
|
|
11
|
+
<style>:root{--bg:#fbfbf8;--fg:#1a1c19;--muted:#6a6f68;--line:#dfe1db;--accent:#2f5d45;--mark:#e6eedb;--hot:#b4432f;--edge:#b7bab2;--font:system-ui, sans-serif;--font-display:var(--font);--radius:3px;--gutter:16px;--measure:760px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#121412;--fg:#e4e6e0;--muted:#959a92;--line:#2a2e29;--accent:#8fbf9f;--mark:#2d3b2a;--hot:#d9674f;--edge:#4b5049;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);font:16px/1.5 var(--font);margin:0}a{color:var(--accent)}button,input{font:inherit;color:inherit}button{cursor:pointer;border:1px solid var(--line);border-radius:var(--radius);background:0 0;padding:4px 10px}button:disabled{opacity:.45;cursor:default}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}ul{margin:0;padding:0;list-style:none}h2{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:28px 0 8px;font-size:.75rem;font-weight:600}h2.page,.record h2{font:600 1.3rem/1.3 var(--font-display);text-transform:none;letter-spacing:0;color:var(--fg);margin:4px 0 12px}h3{margin:0;font-size:1rem}small,time,.hint,.empty,.about,#status,.resultsbar,.detail{color:var(--muted)}small,time,.hint{font-size:.8rem}.paid{border:1px solid var(--line);border-radius:var(--radius);gap:6px;margin:12px 0;padding:10px 14px;display:grid}.paid h3{margin:0;font-size:1rem}.paid ul{margin:0;padding-left:18px}.detail{margin:0;font-size:.9rem}.forsale{color:var(--accent);font-weight:600}mark{background:var(--mark);color:inherit}.bar{z-index:2;background:var(--bg);border-bottom:1px solid var(--line);position:sticky;top:0}.bar>div,main,footer{max-width:var(--measure);padding-inline:var(--gutter);margin:0 auto}.bar>div{flex-wrap:wrap;align-items:center;gap:12px;padding-block:10px;display:flex}#home{color:var(--fg);font:600 1.1rem var(--font-display);white-space:nowrap;text-decoration:none}#q{flex:240px}#q input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;padding:8px 10px}nav{gap:14px;font-size:.9rem;display:flex}nav>span{gap:inherit;display:flex}#aside:not(:empty){border-left:1px solid var(--line);padding-left:14px}nav a{color:var(--muted);text-decoration:none}nav a.on,nav a:hover{color:var(--fg)}main{padding-block:16px 48px}.list,article{border-top:1px solid var(--line)}.row{border-bottom:1px solid var(--line);align-items:flex-start;gap:10px;padding:10px 0;display:flex}.main{overflow-wrap:anywhere;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.title{color:var(--fg);font-weight:500;text-decoration:none}.title:hover{color:var(--accent)}.resultsbar{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:.9rem;display:flex}.sort,.chips,.acts,.votes{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.chips{margin:4px 0 16px}.picker{color:var(--muted);flex-direction:column;gap:4px;margin:4px 0 16px;font-size:.85rem;display:inline-flex}.picker select{font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--edge);border-radius:var(--radius);min-width:min(320px,100%);padding:6px 10px;font-size:1rem}details.about summary{cursor:pointer;color:var(--fg);font-size:1.05rem}details.about p{color:var(--muted);margin:6px 0 0}.chip{padding:2px 10px;font-size:.85rem}.chip.on,.vote[aria-pressed=true]{border-color:var(--accent);background:var(--mark)}.vote{padding:2px 7px;line-height:1.3}.star{color:var(--muted);border:0;padding:4px 6px;font-size:1.25rem;line-height:1}.star[aria-pressed=true]{color:var(--accent);background:0 0}.more,.linkish{color:var(--accent);border:0;padding:8px 0 0;font-size:.9rem}.act{color:var(--fg);border:1px solid var(--line);border-radius:var(--radius);padding:4px 10px;font-size:.88rem;text-decoration:none}article{padding:12px 0 4px}article header{flex-direction:column;margin-bottom:4px;display:flex}article .list{border-top:0}article .row:last-child{border-bottom:0}.record{border-top:0}.record dl{grid-template-columns:max-content 1fr;gap:2px 14px;margin:12px 0;font-size:.88rem;display:grid}.record dt{color:var(--muted);text-transform:capitalize}.record dd{margin:0}.acts{margin:12px 0 4px}.signal{padding:14px 0 6px}.signal h3{font:600 1.15rem/1.3 var(--font-display);margin:4px 0 6px}.signal .meta{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:.78rem;display:flex}.stage{color:var(--accent);font-weight:700}.steps{margin:8px 0 0;padding:0;list-style:none}.steps li{border-top:1px solid var(--line);grid-template-columns:7.5em 1fr;gap:10px;padding:5px 0;font-size:.9rem;display:grid}.steps time{color:var(--muted);font-variant-numeric:tabular-nums}.doc iframe{border:1px solid var(--line);background:#fff;width:100%;height:80vh;margin-top:12px}.taste{margin-bottom:20px}.pills{flex-wrap:wrap;gap:6px;margin:6px 0;display:flex}.pills li{border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:2px;padding:0 0 0 8px;font-size:.85rem;display:inline-flex}.pills li.no{color:var(--muted);text-decoration:line-through}.pills button{color:var(--muted);border:0;padding:0 8px}.knobs{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:12px 0;display:grid}.knob{gap:2px;font-size:.85rem;display:grid}.knob span{justify-content:space-between;font-weight:600;display:flex}.knob input{width:100%;accent-color:var(--accent)}body.wide{--measure:1200px}.mapbar input{border:1px solid var(--line);border-radius:var(--radius);background:0 0;width:100%;margin-bottom:8px;padding:8px 10px}.mapwrap{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;gap:16px;display:grid}@media (width<=760px){.mapwrap{grid-template-columns:1fr}}svg.map{width:100%;height:auto;display:block;position:sticky;top:70px}svg.map path{stroke:var(--edge);stroke-width:.8px;cursor:pointer}svg.map path:hover,svg.map path:focus{stroke:var(--accent);stroke-width:2px;outline:none}svg.map path.near{stroke:var(--accent);stroke-width:2px;stroke-dasharray:4 3}svg.map path.on{stroke:var(--fg);stroke-width:2.6px}.h0{fill:var(--bg);background:var(--bg)}.h1{fill:color-mix(in srgb, var(--hot) 18%, var(--bg));background:color-mix(in srgb, var(--hot) 18%, var(--bg))}.h2{fill:color-mix(in srgb, var(--hot) 36%, var(--bg));background:color-mix(in srgb, var(--hot) 36%, var(--bg))}.h3{fill:color-mix(in srgb, var(--hot) 56%, var(--bg));background:color-mix(in srgb, var(--hot) 56%, var(--bg))}.h4{fill:color-mix(in srgb, var(--hot) 78%, var(--bg));background:color-mix(in srgb, var(--hot) 78%, var(--bg))}.h5{fill:var(--hot);background:var(--hot)}.sw{border:1px solid var(--edge);vertical-align:-1px;width:14px;height:12px;display:inline-block}.panel h3{margin:4px 0}.panel .chips{margin:6px 0}.panel .list{margin-top:8px}footer{color:var(--muted);padding-block:0 32px;font-size:.8rem}.gate .stats{font-size:1.05rem}.gate .stats strong{font:600 1.4rem var(--font-display)}.buy{border-color:var(--accent);background:var(--accent);color:var(--bg);justify-self:start;padding:8px 16px;font-weight:600}.agents{margin-top:28px}.copy{gap:4px;margin:10px 0;display:grid}.copy pre{border:1px solid var(--line);border-radius:var(--radius);margin:0;padding:8px 10px;font-size:.8rem;overflow-x:auto}.copy .chip{justify-self:start}</style>
|
|
124
12
|
<link rel="stylesheet" href="./theme.css">
|
|
125
13
|
<header class="bar"><div>
|
|
126
14
|
<a id="home" href="#/"><span id="name">Fangorn app</span></a>
|
package/site/worker.js
CHANGED
|
@@ -19,9 +19,6 @@
|
|
|
19
19
|
// POST /paid {ids} many keys for one price, paid by one payment or several (vouchers).
|
|
20
20
|
// Its 402 carries the Bazaar extension, so the facilitator lists it on
|
|
21
21
|
// the first sale; /openapi.json and /.well-known/x402 name it for x402scan
|
|
22
|
-
// POST /key {ids, tokenId, issuedAt, signature}
|
|
23
|
-
// keys for a member: Barliman checks the signed request against the
|
|
24
|
-
// MembershipRegistry (`canRead`), and nothing is paid here
|
|
25
22
|
// anything else the static site (the stock page, the card)
|
|
26
23
|
//
|
|
27
24
|
// The paid records are not here. Each is already in the app's committed rows on IPFS,
|
|
@@ -396,26 +393,6 @@ async function sellBatch(request, env, url) {
|
|
|
396
393
|
return json({ keys: await keysFor(env, found), missing, receipts, paid: auths.map((a) => a.nonce) });
|
|
397
394
|
}
|
|
398
395
|
|
|
399
|
-
// POST /key: keys for a member. Barliman recovers who signed the request and asks the
|
|
400
|
-
// MembershipRegistry whether that address may read this app now; this worker trusts its answer.
|
|
401
|
-
// ponytail: one Barliman call per request; cache {tokenId, reader} → until if it gets busy.
|
|
402
|
-
async function member(request, env) {
|
|
403
|
-
const M = CONFIG.paid.membership;
|
|
404
|
-
if (!M) return json({ error: "this app sells no memberships" }, 404);
|
|
405
|
-
let b;
|
|
406
|
-
try { b = await request.json(); } catch { return json({ error: "body must be JSON" }, 400); }
|
|
407
|
-
const ids = [...new Set(b?.ids ?? [])].filter((x) => typeof x === "string");
|
|
408
|
-
if (!ids.length || ids.length > MAX_BATCH) return json({ error: `between 1 and ${MAX_BATCH} ids` }, 400);
|
|
409
|
-
let check;
|
|
410
|
-
try {
|
|
411
|
-
const r = await fetch(`${M.barliman}/check`, { method: "POST", headers: { "content-type": "application/json" },
|
|
412
|
-
body: JSON.stringify({ appId: M.appId, tokenId: String(b.tokenId), ids, issuedAt: b.issuedAt, signature: b.signature }) });
|
|
413
|
-
check = await r.json();
|
|
414
|
-
} catch (e) { return json({ error: `could not check the membership: ${e.message}` }, 502); }
|
|
415
|
-
if (!check.ok) return json({ error: check.error ?? "this membership cannot read this app now", until: check.until ?? null }, 403);
|
|
416
|
-
return json({ keys: await keysFor(env, ids), reader: check.reader, until: check.until });
|
|
417
|
-
}
|
|
418
|
-
|
|
419
396
|
// ── a private app ─────────────────────────────────────────────────────────────
|
|
420
397
|
// CONFIG.private: the rows are sealed on chain (x402.js's sealRow), opened by the cron with
|
|
421
398
|
// PAID_SECRET, and the view is served only with access: a pass bought at POST /pass (one x402
|
|
@@ -495,7 +472,6 @@ const worker = {
|
|
|
495
472
|
if (p === "/doc") return doc(request, env, url);
|
|
496
473
|
if (p === "/paid" && request.method === "POST") return CONFIG.paid ? sellBatch(request, env, url) : json({ error: "nothing is sold here" }, 404);
|
|
497
474
|
if (p.startsWith("/paid/")) return CONFIG.paid ? sell(request, env, url) : json({ error: "nothing is sold here" }, 404);
|
|
498
|
-
if (p === "/key" && request.method === "POST") return CONFIG.paid ? member(request, env) : json({ error: "nothing is sold here" }, 404);
|
|
499
475
|
|
|
500
476
|
const res = await env.ASSETS.fetch(request);
|
|
501
477
|
const out = new Response(res.body, res);
|
package/src/agent/mcp.js
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
// price is handed back to the agent, to say to the person.
|
|
22
22
|
|
|
23
23
|
import net from "node:net";
|
|
24
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
24
25
|
import { homedir } from "node:os";
|
|
25
26
|
import { createInterface } from "node:readline";
|
|
26
27
|
import { APP_EXTENSION, listApps, toApp } from "../discover/apps.js";
|
|
@@ -88,7 +89,7 @@ export async function remoteTools(url, fetcher = fetch, { access = null, wallet
|
|
|
88
89
|
if (!asked) return r;
|
|
89
90
|
if (!wallet) return { ...r, content: [...r.content, { type: "text", text: "This server has no wallet (FANGORN_MCP_WALLET_KEY), so nothing was paid: tell the person the price." }] };
|
|
90
91
|
const x = await import("./x402.js");
|
|
91
|
-
const account = (await import("viem/accounts")).privateKeyToAccount(wallet);
|
|
92
|
+
const account = (await import("viem/accounts")).privateKeyToAccount(`0x${wallet.trim().replace(/^0x/i, "")}`); // a key file may lack 0x
|
|
92
93
|
if (access && maxPass != null && BigInt(access.pass) <= usdc(maxPass)) {
|
|
93
94
|
bearer = (await x.buyPass(access, { account, fetchImpl: fetcher })).token;
|
|
94
95
|
return rpc("tools/call", params);
|
|
@@ -102,7 +103,7 @@ export async function remoteTools(url, fetcher = fetch, { access = null, wallet
|
|
|
102
103
|
// ── the network ─────────────────────────────────────────────────────────────
|
|
103
104
|
// Catalogs, manifests and cards change on a rebake: held for a minute, so one
|
|
104
105
|
// search (or resolving then verifying a card) does not fetch each twice.
|
|
105
|
-
const CACHE = `${homedir()}/.cache/fangorn-mcp`; // the embedding model
|
|
106
|
+
const CACHE = `${homedir()}/.cache/fangorn-mcp`; // the embedding model (find-apps) and the chain logs read
|
|
106
107
|
function cachingFetch(real = globalThis.fetch) {
|
|
107
108
|
const memo = new Map();
|
|
108
109
|
return async (input, init) => {
|
|
@@ -126,6 +127,27 @@ function cachingFetch(real = globalThis.fetch) {
|
|
|
126
127
|
};
|
|
127
128
|
}
|
|
128
129
|
|
|
130
|
+
/**
|
|
131
|
+
* The chain logs a scan has read, on disk, so a new session reads only the
|
|
132
|
+
* blocks since (apps.js cachedLogs). Logs carry bigints; JSON does not.
|
|
133
|
+
* ponytail: two servers writing at once can tear the file. A torn file reads
|
|
134
|
+
* as empty and the next scan starts over; write-then-rename if that ever bites.
|
|
135
|
+
*/
|
|
136
|
+
function fileStore(path) {
|
|
137
|
+
const big = (_, v) => (typeof v === "bigint" ? { $n: String(v) } : v);
|
|
138
|
+
const unbig = (_, v) => (v?.$n !== undefined ? BigInt(v.$n) : v);
|
|
139
|
+
let data;
|
|
140
|
+
try { data = JSON.parse(readFileSync(path, "utf8"), unbig); } catch { data = {}; }
|
|
141
|
+
return {
|
|
142
|
+
get: (k) => data[k],
|
|
143
|
+
set: (k, v) => {
|
|
144
|
+
data[k] = v;
|
|
145
|
+
try { mkdirSync(CACHE, { recursive: true }); writeFileSync(path, JSON.stringify(data, big)); }
|
|
146
|
+
catch (e) { log(`log cache not saved: ${e.message}`); }
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
129
151
|
/** JSON-RPC over newline-delimited stdio. Returns `notify` for server → client messages. */
|
|
130
152
|
export function serve(handlers, { input = process.stdin, output = process.stdout } = {}) {
|
|
131
153
|
const send = (m) => output.write(JSON.stringify({ jsonrpc: "2.0", ...m }) + "\n");
|
|
@@ -348,12 +370,25 @@ const vt = await import("./view-tools.js");
|
|
|
348
370
|
const fb = argv.indexOf("--from-block");
|
|
349
371
|
// The SDK's deployment by default: pass --from-block for another one.
|
|
350
372
|
const fromBlock = fb >= 0 ? BigInt(argv[fb + 1]) : (await network()).appRegistryFromBlock;
|
|
351
|
-
let found, foundAt = 0, explored, exploredAt = 0;
|
|
373
|
+
let found, foundAt = 0, explored, exploredAt = 0, pub, warming;
|
|
374
|
+
const chainClient = async () => {
|
|
375
|
+
if (!pub) {
|
|
376
|
+
const [{ createPublicClient, http }, net] = await Promise.all([import("viem"), network()]);
|
|
377
|
+
pub = createPublicClient({ chain: net.chain, transport: http(net.rpcUrl) });
|
|
378
|
+
}
|
|
379
|
+
return pub;
|
|
380
|
+
};
|
|
381
|
+
const store = fileStore(`${CACHE}/logs-${(await network()).chain.id}.json`);
|
|
382
|
+
// The embedder is for find-apps' ranking alone. Loading it blocks the thread for
|
|
383
|
+
// seconds, so not at startup, where it would hold up list-apps.
|
|
384
|
+
const warmEmbedder = () => (warming ??= vt.warm({ cacheDir: `${CACHE}/models` }).then((ok) => ok ? trace("embedder ready")
|
|
385
|
+
: log(`embedder unavailable, searching by words: ${vt.warmError}`)));
|
|
352
386
|
const deps = {
|
|
353
|
-
// ponytail: cached for a minute. The
|
|
387
|
+
// ponytail: cached for a minute. The logs since the last scan, plus a fetch per card.
|
|
354
388
|
findApps: async () => {
|
|
355
389
|
if (!found || Date.now() - foundAt > 60_000) {
|
|
356
|
-
const
|
|
390
|
+
const [f, head] = await Promise.all([fangorn(), chainClient().then((c) => c.getBlockNumber())]);
|
|
391
|
+
const { apps, rejected } = await listApps(f, { fromBlock, toBlock: head, store });
|
|
357
392
|
found = { apps, rejected };
|
|
358
393
|
foundAt = Date.now();
|
|
359
394
|
}
|
|
@@ -361,9 +396,10 @@ const deps = {
|
|
|
361
396
|
},
|
|
362
397
|
// ponytail: cached for a minute, like findApps. Two getLogs, a card and catalog per app.
|
|
363
398
|
exploreApps: async (query) => {
|
|
399
|
+
if (query?.trim()) warmEmbedder(); // loads behind the directory read; a first download ranks by words
|
|
364
400
|
if (!explored || Date.now() - exploredAt > 60_000) {
|
|
365
|
-
const [ex,
|
|
366
|
-
explored = { ex, dir: await ex.readDirectory(
|
|
401
|
+
const [ex, client, net] = await Promise.all([import("../discover/explore.js"), chainClient(), network()]);
|
|
402
|
+
explored = { ex, dir: await ex.readDirectory(client, { chain: ex.chainOf(net), store }) };
|
|
367
403
|
exploredAt = Date.now();
|
|
368
404
|
}
|
|
369
405
|
const { ex, dir } = explored;
|
|
@@ -386,16 +422,12 @@ const deps = {
|
|
|
386
422
|
};
|
|
387
423
|
const h = handlers(deps);
|
|
388
424
|
// The client starts this server with the session, long before an agent opens an
|
|
389
|
-
// app: load the SDK
|
|
390
|
-
//
|
|
391
|
-
//
|
|
425
|
+
// app: load the SDK then, behind the agent's first thought. After the initialize
|
|
426
|
+
// reply, not before: it blocks the thread while it loads, and the client is
|
|
427
|
+
// waiting on that reply.
|
|
392
428
|
const reply = h.initialize;
|
|
393
429
|
h.initialize = async (p) => {
|
|
394
|
-
setImmediate(() => {
|
|
395
|
-
fangorn().then(() => trace("sdk ready"), () => {});
|
|
396
|
-
vt.warm({ cacheDir: `${CACHE}/models` }).then((ok) => ok ? trace("embedder ready")
|
|
397
|
-
: log(`embedder unavailable, searching by words: ${vt.warmError}`));
|
|
398
|
-
});
|
|
430
|
+
setImmediate(() => fangorn().then(() => trace("sdk ready"), () => {}));
|
|
399
431
|
return reply(p);
|
|
400
432
|
};
|
|
401
433
|
deps.notify = serve(h);
|
package/src/agent/view-tools.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
// - a search goes to the 3 views whose coverage sketch best matches the query,
|
|
12
12
|
// not to all of them (Kingsfoil: ~3 of 23 views, ~92% of the true top 10 with
|
|
13
13
|
// a 32-vector sketch). The result names what was searched and what was not.
|
|
14
|
-
// - `warm()` starts the embedder the
|
|
14
|
+
// - `warm()` starts the embedder before the first query (fangorn-mcp: on find-apps), and a search
|
|
15
15
|
// never waits on a first-time model download.
|
|
16
16
|
//
|
|
17
17
|
// `get`/`similar`/`count` answer over what is loaded, and say so.
|
|
@@ -188,20 +188,12 @@ export function viewTools(app, { fetchCatalog = fetch, queryVector: embedQ = que
|
|
|
188
188
|
return { key: hit ? hit.r[rolesOf(hit.view).identity] ?? id : id, want: hit?.r.paid_sha256, ct: hit?.r.paid_ct };
|
|
189
189
|
};
|
|
190
190
|
run.buy = async ({ id, ids }) => {
|
|
191
|
-
const { buyBatch, withLock
|
|
191
|
+
const { buyBatch, withLock } = await import("./x402.js");
|
|
192
192
|
const rs = (ids?.length ? ids : id ? [id] : []).map(resolve);
|
|
193
193
|
const ct = Object.fromEntries(rs.filter((r) => r.ct).map((r) => [r.key, r.ct]));
|
|
194
194
|
const want = Object.fromEntries(rs.filter((r) => r.want).map((r) => [r.key, r.want]));
|
|
195
195
|
const verdict = (records) => { const bad = records.filter((x) => x.verified === false).map((x) => x.id);
|
|
196
196
|
return bad.length ? `MISMATCH for ${bad.join(", ")}` : "every record opened matches its published sha256"; };
|
|
197
|
-
// A membership the agent was named on (FANGORN_MCP_READER_KEY + FANGORN_MCP_MEMBERSHIP,
|
|
198
|
-
// the token id): read for free, nothing paid.
|
|
199
|
-
if (process.env.FANGORN_MCP_READER_KEY && process.env.FANGORN_MCP_MEMBERSHIP && p.membership) {
|
|
200
|
-
const { privateKeyToAccount } = await import("viem/accounts");
|
|
201
|
-
const r = await readAsMember(p, rs.map((r) => r.key).filter((k) => ct[k]), { reader: privateKeyToAccount(process.env.FANGORN_MCP_READER_KEY),
|
|
202
|
-
tokenId: process.env.FANGORN_MCP_MEMBERSHIP, ct, want });
|
|
203
|
-
return { read: r.records.length, with: "membership", until: r.until, verified: verdict(r.records), records: r.records.map(({ id, record, error }) => ({ id, record, error })) };
|
|
204
|
-
}
|
|
205
197
|
if (ids?.length) {
|
|
206
198
|
// Many at once, one price: from the allowance file (FANGORN_MCP_VOUCHERS, vouchers the
|
|
207
199
|
// person's wallet signed) if there is one, else one payment from the wallet key.
|
|
@@ -234,7 +226,7 @@ export function viewTools(app, { fetchCatalog = fetch, queryVector: embedQ = que
|
|
|
234
226
|
tools.push({ name: "buy", description: `Buy one ${n} record's paid detail for ${price} (x402 on ${p.network}): ${p.description || "the structured record"}. ` +
|
|
235
227
|
"Pass an id from search, or ids for up to 1000 at once (one price, one manifest of hashes and transactions). " +
|
|
236
228
|
"The record is already in the row, sealed; this buys its key and opens it. " +
|
|
237
|
-
"
|
|
229
|
+
"Paid from the allowance (FANGORN_MCP_VOUCHERS) or this server's wallet (FANGORN_MCP_WALLET_KEY), never above FANGORN_MCP_MAX_PRICE a record.",
|
|
238
230
|
inputSchema: { type: "object", properties: { id: str("A record id from search or get"), ids: { type: "array", items: { type: "string" }, description: "Several record ids, bought together" } } } });
|
|
239
231
|
}
|
|
240
232
|
|
package/src/agent/x402.js
CHANGED
|
@@ -171,30 +171,6 @@ export async function buyRecord(paid, key, { ct, want, account, privateKey, maxP
|
|
|
171
171
|
return { id: key, price: r.price, receipt: r.receipt, digest: opened.sha256, verified: opened.verified, record: opened.record };
|
|
172
172
|
}
|
|
173
173
|
|
|
174
|
-
/** The typed data a reader signs to read with a membership: a copy of @fangorn-network/barliman's
|
|
175
|
-
* src/read.js, which its /check verifies. ponytail: import it once barliman is on npm. */
|
|
176
|
-
export const readTypedData = ({ registry, chainId, appId, tokenId, ids, issuedAt }) => ({
|
|
177
|
-
domain: { name: "Fangorn Read", version: "1", chainId: Number(chainId), verifyingContract: registry },
|
|
178
|
-
types: { Read: [{ name: "app", type: "bytes32" }, { name: "tokenId", type: "uint256" }, { name: "ids", type: "string[]" }, { name: "issuedAt", type: "uint256" }] },
|
|
179
|
-
primaryType: "Read",
|
|
180
|
-
message: { app: appId, tokenId: BigInt(tokenId), ids, issuedAt: BigInt(issuedAt) },
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
/** Read records with a membership: `reader` (the holder, or the agent it named) signs the
|
|
184
|
-
* request, the app's worker has Barliman check it, and the keys come back. Nothing is paid. */
|
|
185
|
-
export async function readAsMember(paid, ids, { reader, tokenId, ct = {}, want = {}, fetchImpl = fetch } = {}) {
|
|
186
|
-
const m = paid.membership;
|
|
187
|
-
if (!m) throw new Error("this app sells no memberships");
|
|
188
|
-
const issuedAt = Math.floor(Date.now() / 1000);
|
|
189
|
-
const signature = await reader.signTypedData(readTypedData({ registry: m.registry, chainId: m.chainId, appId: m.appId, tokenId, ids, issuedAt }));
|
|
190
|
-
const url = paid.key_url ?? paid.url.replace(/\/paid\/\{id\}$/, "/key");
|
|
191
|
-
const res = await fetchImpl(url, { method: "POST", headers: { "content-type": "application/json" },
|
|
192
|
-
body: JSON.stringify({ ids, tokenId: String(tokenId), issuedAt, signature }) });
|
|
193
|
-
const body = await res.json();
|
|
194
|
-
if (res.status !== 200) throw new Error(`membership refused: ${body.error ?? res.status}`);
|
|
195
|
-
return { records: await openAll(body.keys, ct, want), until: body.until };
|
|
196
|
-
}
|
|
197
|
-
|
|
198
174
|
// ── Batches and vouchers ──────────────────────────────────────────────────────────────────
|
|
199
175
|
// `POST <app>/paid {ids}` answers 402 with one price for every record it has; PAYMENT-SIGNATURE may then
|
|
200
176
|
// carry several payments (a JSON array) that add up to exactly that price. A payment signs
|
|
@@ -331,8 +307,7 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
331
307
|
// that checks signatures and refuses a nonce settled twice, and vouchers signed ahead.
|
|
332
308
|
const { mkdtempSync, writeFileSync } = await import("node:fs");
|
|
333
309
|
const { tmpdir } = await import("node:os");
|
|
334
|
-
const
|
|
335
|
-
const sale = { price: "100000", network: `eip155:${CHAIN}`, asset: USDC, payTo: SELLER, facilitator: "https://fac", ...DOMAIN, description: "", membership };
|
|
310
|
+
const sale = { price: "100000", network: `eip155:${CHAIN}`, asset: USDC, payTo: SELLER, facilitator: "https://fac", ...DOMAIN, description: "" };
|
|
336
311
|
// Not a literal: the page bundles this module, and a bundler would follow it into the Worker.
|
|
337
312
|
const WORKER = "../../site/worker.js";
|
|
338
313
|
const worker = (await import(/* @vite-ignore */ WORKER)).default;
|
|
@@ -344,17 +319,9 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
344
319
|
want[id] = await sha256(new TextEncoder().encode(plain));
|
|
345
320
|
}
|
|
346
321
|
const env = { PAID_SECRET: SECRET, CONFIG: { name: "Test", paid: sale } };
|
|
347
|
-
const member = privateKeyToAccount(generatePrivateKey()), memberToken = "77";
|
|
348
322
|
const spent = new Set(), facilitated = [];
|
|
349
323
|
const realFetch = globalThis.fetch;
|
|
350
|
-
const { recoverTypedDataAddress } = await import("viem");
|
|
351
324
|
globalThis.fetch = async (u, init) => {
|
|
352
|
-
if (u === "https://barliman/check") { // a stand-in Barliman: the member's token reads, nobody else's
|
|
353
|
-
const b = JSON.parse(init.body);
|
|
354
|
-
const reader = await recoverTypedDataAddress({ ...readTypedData({ registry: membership.registry, chainId: CHAIN, ...b }), signature: b.signature });
|
|
355
|
-
const ok = reader === member.address && b.tokenId === memberToken && b.appId === membership.appId;
|
|
356
|
-
return new Response(JSON.stringify({ ok, reader, until: ok ? "1900000000" : "0" }));
|
|
357
|
-
}
|
|
358
325
|
const { x402Version, paymentPayload: p, paymentRequirements: q } = JSON.parse(init.body), a = p.payload.authorization;
|
|
359
326
|
if (x402Version !== 2 || p.x402Version !== 2) throw new Error("the facilitator is spoken to in v2");
|
|
360
327
|
facilitated.push(p);
|
|
@@ -372,7 +339,7 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
372
339
|
return new Response(JSON.stringify({ success: true, transaction: `0x${spent.size}` }));
|
|
373
340
|
};
|
|
374
341
|
const viaWorker = (u, init) => worker.fetch(new Request(u, init), env);
|
|
375
|
-
const paidCard = { url: "https://x/paid/{id}",
|
|
342
|
+
const paidCard = { url: "https://x/paid/{id}", price: sale.price };
|
|
376
343
|
try {
|
|
377
344
|
// One record, one payment: the key opens the row's sealed record, which matches its hash.
|
|
378
345
|
const single = await buyRecord(paidCard, "a", { ct: ct.a, want: want.a, account: buyer, maxPrice: 100000n, fetchImpl: viaWorker });
|
|
@@ -419,12 +386,6 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
419
386
|
let threw = false;
|
|
420
387
|
try { await buyBatch(paidCard, ["a", "b"], { vouchers: stack2, ct, want, fetchImpl: viaWorker }); } catch { threw = true; }
|
|
421
388
|
if (!threw || stack2.length !== 1 || stack2[0] !== fresh) throw new Error(`refused batch must drop only the spent voucher: ${stack2.length}`);
|
|
422
|
-
// A member reads for free: the signed request names the token; a stranger's is refused.
|
|
423
|
-
const read = await readAsMember(paidCard, ["a", "c"], { reader: member, tokenId: memberToken, ct, want, fetchImpl: viaWorker });
|
|
424
|
-
if (read.records.length !== 2 || !read.records.every((r) => r.verified === true)) throw new Error(`member read: ${JSON.stringify(read)}`);
|
|
425
|
-
let stranger = false;
|
|
426
|
-
try { await readAsMember(paidCard, ["a"], { reader: buyer, tokenId: memberToken, ct, want, fetchImpl: viaWorker }); } catch { stranger = true; }
|
|
427
|
-
if (!stranger) throw new Error("a reader the membership does not name must be refused");
|
|
428
389
|
// The allowance lock: two purchases at once take turns; a crashed one's lock is taken over.
|
|
429
390
|
const vfile = `${mkdtempSync(`${tmpdir()}/wm-`)}/vouchers.json`, order = [];
|
|
430
391
|
const turn = (name) => withLock(vfile, async () => { order.push(`${name}+`); await new Promise((ok) => setTimeout(ok, 50)); order.push(`${name}-`); });
|
|
@@ -435,6 +396,6 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
435
396
|
utimesSync(`${vfile}.lock`, new Date(Date.now() - 300_000), new Date(Date.now() - 300_000));
|
|
436
397
|
if (await withLock(vfile, async () => 7) !== 7 || existsSync(`${vfile}.lock`)) throw new Error("a stale lock must be taken over and released");
|
|
437
398
|
} finally { globalThis.fetch = realFetch; }
|
|
438
|
-
console.log("x402.js batch self-check ok — keys, not records: each opens the row's sealed record and matches its hash;
|
|
399
|
+
console.log("x402.js batch self-check ok — keys, not records: each opens the row's sealed record and matches its hash; one price for the ids sealed in the rows, paid by one signature or by vouchers signed ahead, spent vouchers removed and refused if replayed, short payment refused, a half-settled batch delivers what was paid and drops spent vouchers, the allowance file is locked per purchase");
|
|
439
400
|
console.log("x402.js self-check ok — a signed EIP-3009 authorization the seller can verify, exactly the asked amount to the asked payee, the receipt read back, and a price over the cap refused before signing");
|
|
440
401
|
}
|
package/src/discover/apps.js
CHANGED
|
@@ -48,16 +48,39 @@ export function toApp({ card, appId, fromBlock, repos }, cardUrl) {
|
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
// Blocks this close to the head can still reorg: read again every time, never stored.
|
|
52
|
+
const SETTLED = 64n;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Logs from `start` to `head`, oldest first, reading only the blocks `store`
|
|
56
|
+
* has not seen. A scan from the registry's deployment grows with the chain;
|
|
57
|
+
* this one grows with the time since the last call. `store` is `{ get, set }`
|
|
58
|
+
* of `{ to, logs }` by `key`; `read(from, to)` returns logs with `blockNumber`.
|
|
59
|
+
*/
|
|
60
|
+
export async function cachedLogs(store, key, start, head, read) {
|
|
61
|
+
const hit = store.get(key) ?? { to: start - 1n, logs: [] };
|
|
62
|
+
const fresh = hit.to < head ? await read(hit.to + 1n, head) : [];
|
|
63
|
+
const settled = head - SETTLED;
|
|
64
|
+
if (settled > hit.to) store.set(key, { to: settled, logs: [...hit.logs, ...fresh.filter((l) => l.blockNumber <= settled)] });
|
|
65
|
+
return [...hit.logs, ...fresh];
|
|
66
|
+
}
|
|
67
|
+
|
|
51
68
|
/**
|
|
52
69
|
* Every app with a bound, verifiable card. The ones that fail are reported
|
|
53
70
|
* with the reason, not dropped: a card that is down and a card that lies look
|
|
54
71
|
* the same from outside, and an agent should see both.
|
|
55
72
|
*
|
|
56
73
|
* An app that cleared its uri (bound to "") is skipped. It is not an error.
|
|
74
|
+
*
|
|
75
|
+
* With a `store` (see cachedLogs) and `toBlock`, the logs read before are not
|
|
76
|
+
* read again; the cards are still all verified.
|
|
57
77
|
*/
|
|
58
|
-
export async function listApps(fangorn, { fromBlock, toBlock } = {}) {
|
|
78
|
+
export async function listApps(fangorn, { fromBlock, toBlock, store } = {}) {
|
|
59
79
|
if (fromBlock == null) throw new Error("listApps: pass fromBlock, a block at or before the AppRegistry's deployment — from 0 is one RPC call per 1000 blocks of chain history");
|
|
60
|
-
const
|
|
80
|
+
const read = (from, to) => fangorn.getAppRegistry().getAppAgentLogs({ fromBlock: from, toBlock: to });
|
|
81
|
+
const logs = store && toBlock != null
|
|
82
|
+
? await cachedLogs(store, `AppAgentChanged:${fromBlock}`, BigInt(fromBlock), BigInt(toBlock), read)
|
|
83
|
+
: await read(BigInt(fromBlock), toBlock);
|
|
61
84
|
// Oldest first, so the last write wins. discoverApp re-reads the binding,
|
|
62
85
|
// so a stale uri here is caught there, not trusted.
|
|
63
86
|
const latest = new Map(logs.map((l) => [l.appId, l.agentUri]));
|
|
@@ -110,5 +133,17 @@ if (typeof process !== "undefined" && import.meta.url === `file://${process.argv
|
|
|
110
133
|
eq(rejected.map((r) => r.why), ["not bound to app"], "a card that fails verification is reported");
|
|
111
134
|
await listApps(fangorn).then(() => { throw new Error("missing fromBlock must throw"); }, () => {});
|
|
112
135
|
|
|
136
|
+
const m = new Map(), store = { get: (k) => m.get(k), set: (k, v) => m.set(k, v) }, asked = [];
|
|
137
|
+
const chain = [{ blockNumber: 10n, n: 1 }, { blockNumber: 150n, n: 2 }, { blockNumber: 190n, n: 3 }];
|
|
138
|
+
const read = async (from, to) => (asked.push([from, to]), chain.filter((l) => l.blockNumber >= from && l.blockNumber <= to));
|
|
139
|
+
eq((await cachedLogs(store, "k", 5n, 200n, read)).map((l) => l.n), [1, 2, 3], "first call reads it all");
|
|
140
|
+
eq(m.get("k").to, 136n, "stores only what is settled");
|
|
141
|
+
eq(m.get("k").logs.map((l) => l.n), [1], "the unsettled tail is not stored");
|
|
142
|
+
eq((await cachedLogs(store, "k", 5n, 210n, read)).map((l) => l.n), [1, 2, 3], "second call: same logs, no duplicates");
|
|
143
|
+
eq(asked, [[5n, 200n], [137n, 210n]], "second call reads only from the settled point");
|
|
144
|
+
asked.length = 0;
|
|
145
|
+
await cachedLogs(store, "k", 5n, 146n, read);
|
|
146
|
+
eq(asked, [], "head at the stored point: no read");
|
|
147
|
+
|
|
113
148
|
console.log("apps.js self-check ok — latest card per app, unbound skipped, failures reported, views gated to http(s)");
|
|
114
149
|
}
|
package/src/discover/explore.js
CHANGED
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
// `client` is a viem PublicClient (getLogs, readContract): passed in, so this
|
|
16
16
|
// runs in a tab and in node, and the self-check needs no chain.
|
|
17
17
|
//
|
|
18
|
-
//
|
|
19
|
-
// the
|
|
18
|
+
// Windows grow with the chain. Pass `store` (apps.js cachedLogs) and only the
|
|
19
|
+
// blocks since the last read are scanned; the page passes none.
|
|
20
20
|
|
|
21
21
|
import { parseAbi, parseAbiItem } from "viem";
|
|
22
22
|
// The config module alone (viem only), not the SDK's root: this runs in a tab too.
|
|
23
23
|
import { BaseSepoliaConfig } from "@fangorn-network/sdk/lib/config.js";
|
|
24
|
-
import { APP_EXTENSION } from "./apps.js";
|
|
24
|
+
import { APP_EXTENSION, cachedLogs } from "./apps.js";
|
|
25
25
|
import { survey, comparable } from "./directory.js";
|
|
26
26
|
import { rankDomains, zFloor, lexScore } from "../core/rank.js";
|
|
27
27
|
|
|
@@ -123,14 +123,18 @@ async function reputation(client, agentId, chain) {
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
// `window`: the most blocks one getLogs may span on the client's RPC (chainOf says, per chain).
|
|
126
|
-
async function getLogsSince(client, start, filter, window) {
|
|
126
|
+
async function getLogsSince(client, start, filter, window, store) {
|
|
127
127
|
const head = await client.getBlockNumber();
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
128
|
+
const read = async (start, head) => {
|
|
129
|
+
const windows = [];
|
|
130
|
+
for (let from = start; from <= head; from += window) {
|
|
131
|
+
const to = from + window - 1n < head ? from + window - 1n : head;
|
|
132
|
+
windows.push(client.getLogs({ ...filter, fromBlock: from, toBlock: to }));
|
|
133
|
+
}
|
|
134
|
+
// In window order: oldest first still holds. Only what readDirectory reads, so a store stays small.
|
|
135
|
+
return (await Promise.all(windows)).flat().map(({ args, blockNumber }) => ({ args, blockNumber }));
|
|
136
|
+
};
|
|
137
|
+
return store ? cachedLogs(store, `${filter.address}:${filter.event.name}:${start}`, start, head, read) : read(start, head);
|
|
134
138
|
}
|
|
135
139
|
|
|
136
140
|
/**
|
|
@@ -140,11 +144,13 @@ async function getLogsSince(client, start, filter, window) {
|
|
|
140
144
|
* `onUpdate({ apps, pending })`, if given, is called once the bindings are read
|
|
141
145
|
* and again as each app lands or drops, so a page can show apps as they arrive.
|
|
142
146
|
* `pending` counts the bound apps not yet settled.
|
|
147
|
+
* `store`, if given, keeps the logs read (apps.js cachedLogs), so the next read
|
|
148
|
+
* scans only the blocks since.
|
|
143
149
|
*/
|
|
144
|
-
export async function readDirectory(client, { chain = CHAIN, onUpdate = () => {} } = {}) {
|
|
150
|
+
export async function readDirectory(client, { chain = CHAIN, onUpdate = () => {}, store } = {}) {
|
|
145
151
|
const [bindLogs, regLogs] = await Promise.all([
|
|
146
|
-
getLogsSince(client, chain.appRegistryFrom ?? 0n, { address: chain.appRegistry, event: APP_AGENT_CHANGED }, chain.window ?? 1000n),
|
|
147
|
-
getLogsSince(client, chain.identityFrom ?? 0n, { address: chain.identity, event: REGISTERED }, chain.window ?? 1000n),
|
|
152
|
+
getLogsSince(client, chain.appRegistryFrom ?? 0n, { address: chain.appRegistry, event: APP_AGENT_CHANGED }, chain.window ?? 1000n, store),
|
|
153
|
+
getLogsSince(client, chain.identityFrom ?? 0n, { address: chain.identity, event: REGISTERED }, chain.window ?? 1000n, store),
|
|
148
154
|
]);
|
|
149
155
|
const registered = regLogs.map((l) => ({ agentId: l.args.agentId, owner: l.args.owner, block: l.blockNumber }));
|
|
150
156
|
const latest = new Map(); // logs come oldest first: the last write wins
|
package/src/publish/ship.js
CHANGED
|
@@ -335,12 +335,8 @@ export async function ship(configPath, { crawl = true, deploy = true, dry = fals
|
|
|
335
335
|
const sale = (u) => {
|
|
336
336
|
if (!cfg.paid) return { paid: null, sale: null };
|
|
337
337
|
const T = terms(cfg.paid), price = units(cfg.paid.price, T.decimals), description = cfg.paid.description ?? "";
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
chainId: cfg.paid.membership.chainId ?? FangornConfig.caip2, appId } : null;
|
|
341
|
-
const paid = { url: `${u}/paid/{id}`, key_url: `${u}/key`, price, asset: T.asset, network: T.network, decimals: T.decimals, symbol: T.symbol,
|
|
342
|
-
description, ...(membership ? { membership } : {}) };
|
|
343
|
-
return { paid, sale: { ...T, price, description, ...(membership ? { membership } : {}) } };
|
|
338
|
+
const paid = { url: `${u}/paid/{id}`, price, asset: T.asset, network: T.network, decimals: T.decimals, symbol: T.symbol, description };
|
|
339
|
+
return { paid, sale: { ...T, price, description } };
|
|
344
340
|
};
|
|
345
341
|
const access = (u) => {
|
|
346
342
|
const X = cfg.private;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as p,W as m,l,j as n}from"./index-BMfMy017.js";import{n as s}from"./ScreenLayout-OwaQQcxH-B4Z8FjFp.js";import{c as u}from"./createLucideIcon-D9OK_uxG.js";import"./preload-helper-PPVm8Dsz.js";import"./index-BOd8jv8-.js";import"./index-9jNeS_nC.js";import"./serializeTransaction-L-_Ej-jW.js";import"./http-BocEfKYb.js";import"./hashTypedData-Beq57Ogb.js";import"./getTransactionCount-80UHlwAV.js";import"./transactionReceipt-BwJl-gjg.js";import"./toAccount-Bq6rbpbI.js";import"./parseSignature-BIjcuWdB.js";import"./index-D6T-s6sR.js";import"./ModalFooter-BCuEK_nz-D2I8KWtk.js";import"./Screen-D30meWsY-DDum2qlY.js";import"./index-CWARkn2w-D6ikWJWj.js";const g=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],d=u("circle-question-mark",g),y=({title:o="Account not found",subtitle:i,appName:t="this app",ctaText:a="Try logging in again",onRetry:e})=>n.jsx(s,{title:o,subtitle:i||`Please try logging in again or go to ${t} to create an account.`,icon:d,iconVariant:"warning",primaryCta:{label:a,onClick:e},watermark:!0}),V={component:()=>{let{navigate:o,setModalData:i,data:t}=p(),a=m(),{getAuthMeta:e,client:r}=l();return n.jsx(y,{appName:a?.name,onRetry:()=>{let c=e();i({...t,login:{...t?.login,...c?.disableSignup?{disableSignup:!0}:{}}}),r?.authFlow&&(r.authFlow=void 0),o("LandingScreen")}})}};export{V as AccountNotFoundScreen,y as AccountNotFoundScreenView,V as default};
|