safehands-pharos 1.5.0 → 2.6.0
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/.agents/policies/default.json +15 -0
- package/.env.example +81 -64
- package/README.md +301 -444
- package/SECURITY.md +112 -0
- package/SKILL.md +59 -0
- package/contracts/SafeHandsAttestation.sol +182 -0
- package/contracts/SafeHandsRegistry.sol +149 -0
- package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
- package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
- package/dist/agent/SafeHandsGuardianAgent.js +98 -0
- package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
- package/dist/agent/agentDecisionFormatter.d.ts +43 -0
- package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
- package/dist/agent/agentDecisionFormatter.js +96 -0
- package/dist/agent/agentDecisionFormatter.js.map +1 -0
- package/dist/agent/agentEnrich.d.ts +28 -0
- package/dist/agent/agentEnrich.d.ts.map +1 -0
- package/dist/agent/agentEnrich.js +99 -0
- package/dist/agent/agentEnrich.js.map +1 -0
- package/dist/agent/agentIntentClassifier.d.ts +44 -0
- package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
- package/dist/agent/agentIntentClassifier.js +77 -0
- package/dist/agent/agentIntentClassifier.js.map +1 -0
- package/dist/agent/agentPolicyResolver.d.ts +44 -0
- package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
- package/dist/agent/agentPolicyResolver.js +94 -0
- package/dist/agent/agentPolicyResolver.js.map +1 -0
- package/dist/agent/agentRuntime.d.ts +12 -0
- package/dist/agent/agentRuntime.d.ts.map +1 -0
- package/dist/agent/agentRuntime.js +31 -0
- package/dist/agent/agentRuntime.js.map +1 -0
- package/dist/agent/agentToolRouter.d.ts +24 -0
- package/dist/agent/agentToolRouter.d.ts.map +1 -0
- package/dist/agent/agentToolRouter.js +89 -0
- package/dist/agent/agentToolRouter.js.map +1 -0
- package/dist/agent/guardianOperator.d.ts +35 -0
- package/dist/agent/guardianOperator.d.ts.map +1 -0
- package/dist/agent/guardianOperator.js +65 -0
- package/dist/agent/guardianOperator.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +14 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/api/activityRoutes.d.ts +70 -0
- package/dist/api/activityRoutes.d.ts.map +1 -0
- package/dist/api/activityRoutes.js +100 -0
- package/dist/api/activityRoutes.js.map +1 -0
- package/dist/api/agentRoutes.d.ts +16 -0
- package/dist/api/agentRoutes.d.ts.map +1 -0
- package/dist/api/agentRoutes.js +37 -0
- package/dist/api/agentRoutes.js.map +1 -0
- package/dist/api/broadcastRoutes.d.ts +34 -0
- package/dist/api/broadcastRoutes.d.ts.map +1 -0
- package/dist/api/broadcastRoutes.js +147 -0
- package/dist/api/broadcastRoutes.js.map +1 -0
- package/dist/api/consolePage.d.ts +2 -0
- package/dist/api/consolePage.d.ts.map +1 -0
- package/dist/api/consolePage.js +206 -0
- package/dist/api/consolePage.js.map +1 -0
- package/dist/api/httpHardening.d.ts +75 -0
- package/dist/api/httpHardening.d.ts.map +1 -0
- package/dist/api/httpHardening.js +122 -0
- package/dist/api/httpHardening.js.map +1 -0
- package/dist/api/indexerRoutes.d.ts +46 -0
- package/dist/api/indexerRoutes.d.ts.map +1 -0
- package/dist/api/indexerRoutes.js +75 -0
- package/dist/api/indexerRoutes.js.map +1 -0
- package/dist/api/paidRoutes.d.ts +8 -0
- package/dist/api/paidRoutes.d.ts.map +1 -0
- package/dist/api/paidRoutes.js +175 -0
- package/dist/api/paidRoutes.js.map +1 -0
- package/dist/api/prepareRoutes.d.ts +58 -0
- package/dist/api/prepareRoutes.d.ts.map +1 -0
- package/dist/api/prepareRoutes.js +90 -0
- package/dist/api/prepareRoutes.js.map +1 -0
- package/dist/api/response.d.ts +39 -0
- package/dist/api/response.d.ts.map +1 -0
- package/dist/api/response.js +53 -0
- package/dist/api/response.js.map +1 -0
- package/dist/api/routes.d.ts +175 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +276 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/api/schemas.d.ts +147 -0
- package/dist/api/schemas.d.ts.map +1 -0
- package/dist/api/schemas.js +81 -0
- package/dist/api/schemas.js.map +1 -0
- package/dist/api/server.d.ts +11 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +505 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/toolRoutes.d.ts +14 -0
- package/dist/api/toolRoutes.d.ts.map +1 -0
- package/dist/api/toolRoutes.js +138 -0
- package/dist/api/toolRoutes.js.map +1 -0
- package/dist/api/walletPrepareRoutes.d.ts +74 -0
- package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
- package/dist/api/walletPrepareRoutes.js +127 -0
- package/dist/api/walletPrepareRoutes.js.map +1 -0
- package/dist/api/x402Gate.d.ts +51 -0
- package/dist/api/x402Gate.d.ts.map +1 -0
- package/dist/api/x402Gate.js +184 -0
- package/dist/api/x402Gate.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -1
- package/dist/cli.js.map +1 -1
- package/dist/data/ecosystemRegistry.data.d.ts +3 -0
- package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
- package/dist/data/ecosystemRegistry.data.js +582 -0
- package/dist/data/ecosystemRegistry.data.js.map +1 -0
- package/dist/demo.d.ts +0 -0
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +43 -8
- package/dist/demo.js.map +1 -1
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +212 -135
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +0 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +72 -10
- package/dist/init.js.map +1 -1
- package/dist/lib/analysis/approval.d.ts +29 -0
- package/dist/lib/analysis/approval.d.ts.map +1 -0
- package/dist/lib/analysis/approval.js +162 -0
- package/dist/lib/analysis/approval.js.map +1 -0
- package/dist/lib/analysis/calldata.d.ts +60 -0
- package/dist/lib/analysis/calldata.d.ts.map +1 -0
- package/dist/lib/analysis/calldata.js +349 -0
- package/dist/lib/analysis/calldata.js.map +1 -0
- package/dist/lib/analysis/contractIntel.d.ts +65 -0
- package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
- package/dist/lib/analysis/contractIntel.js +320 -0
- package/dist/lib/analysis/contractIntel.js.map +1 -0
- package/dist/lib/analysis/evm.d.ts +42 -0
- package/dist/lib/analysis/evm.d.ts.map +1 -0
- package/dist/lib/analysis/evm.js +185 -0
- package/dist/lib/analysis/evm.js.map +1 -0
- package/dist/lib/analysis/gas.d.ts +4 -0
- package/dist/lib/analysis/gas.d.ts.map +1 -0
- package/dist/lib/analysis/gas.js +13 -0
- package/dist/lib/analysis/gas.js.map +1 -0
- package/dist/lib/analysis/index.d.ts +11 -0
- package/dist/lib/analysis/index.d.ts.map +1 -0
- package/dist/lib/analysis/index.js +16 -0
- package/dist/lib/analysis/index.js.map +1 -0
- package/dist/lib/analysis/pharosTokens.d.ts +31 -0
- package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
- package/dist/lib/analysis/pharosTokens.js +78 -0
- package/dist/lib/analysis/pharosTokens.js.map +1 -0
- package/dist/lib/analysis/safeTx.d.ts +27 -0
- package/dist/lib/analysis/safeTx.d.ts.map +1 -0
- package/dist/lib/analysis/safeTx.js +118 -0
- package/dist/lib/analysis/safeTx.js.map +1 -0
- package/dist/lib/analysis/token.d.ts +21 -0
- package/dist/lib/analysis/token.d.ts.map +1 -0
- package/dist/lib/analysis/token.js +151 -0
- package/dist/lib/analysis/token.js.map +1 -0
- package/dist/lib/analysis/types.d.ts +49 -0
- package/dist/lib/analysis/types.d.ts.map +1 -0
- package/dist/lib/analysis/types.js +10 -0
- package/dist/lib/analysis/types.js.map +1 -0
- package/dist/lib/analysis/x402.d.ts +24 -0
- package/dist/lib/analysis/x402.d.ts.map +1 -0
- package/dist/lib/analysis/x402.js +60 -0
- package/dist/lib/analysis/x402.js.map +1 -0
- package/dist/lib/auditLog.d.ts +1 -0
- package/dist/lib/auditLog.d.ts.map +1 -1
- package/dist/lib/auditLog.js +0 -0
- package/dist/lib/auditLog.js.map +1 -1
- package/dist/lib/config.d.ts +77 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +120 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +246 -97
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +334 -127
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +26 -3
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +80 -17
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/ecosystemRegistry.d.ts +116 -0
- package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
- package/dist/lib/ecosystemRegistry.js +178 -0
- package/dist/lib/ecosystemRegistry.js.map +1 -0
- package/dist/lib/envLoader.d.ts +0 -0
- package/dist/lib/envLoader.d.ts.map +0 -0
- package/dist/lib/envLoader.js +39 -18
- package/dist/lib/envLoader.js.map +1 -1
- package/dist/lib/goldsky.d.ts +58 -0
- package/dist/lib/goldsky.d.ts.map +1 -0
- package/dist/lib/goldsky.js +275 -0
- package/dist/lib/goldsky.js.map +1 -0
- package/dist/lib/guardian/decision.d.ts +23 -0
- package/dist/lib/guardian/decision.d.ts.map +1 -0
- package/dist/lib/guardian/decision.js +40 -0
- package/dist/lib/guardian/decision.js.map +1 -0
- package/dist/lib/http.d.ts +0 -1
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +297 -32
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/managedExecution.d.ts +19 -0
- package/dist/lib/managedExecution.d.ts.map +1 -0
- package/dist/lib/managedExecution.js +64 -0
- package/dist/lib/managedExecution.js.map +1 -0
- package/dist/lib/merkleBatcher.d.ts +23 -0
- package/dist/lib/merkleBatcher.d.ts.map +1 -0
- package/dist/lib/merkleBatcher.js +62 -0
- package/dist/lib/merkleBatcher.js.map +1 -0
- package/dist/lib/networks.d.ts +48 -0
- package/dist/lib/networks.d.ts.map +1 -0
- package/dist/lib/networks.js +103 -0
- package/dist/lib/networks.js.map +1 -0
- package/dist/lib/observability/accessContext.d.ts +29 -0
- package/dist/lib/observability/accessContext.d.ts.map +1 -0
- package/dist/lib/observability/accessContext.js +50 -0
- package/dist/lib/observability/accessContext.js.map +1 -0
- package/dist/lib/observability/activityStore.d.ts +70 -0
- package/dist/lib/observability/activityStore.d.ts.map +1 -0
- package/dist/lib/observability/activityStore.js +149 -0
- package/dist/lib/observability/activityStore.js.map +1 -0
- package/dist/lib/observability/apiKey.d.ts +55 -0
- package/dist/lib/observability/apiKey.d.ts.map +1 -0
- package/dist/lib/observability/apiKey.js +141 -0
- package/dist/lib/observability/apiKey.js.map +1 -0
- package/dist/lib/observability/logger.d.ts +30 -0
- package/dist/lib/observability/logger.d.ts.map +1 -0
- package/dist/lib/observability/logger.js +30 -0
- package/dist/lib/observability/logger.js.map +1 -0
- package/dist/lib/observability/quota.d.ts +33 -0
- package/dist/lib/observability/quota.d.ts.map +1 -0
- package/dist/lib/observability/quota.js +49 -0
- package/dist/lib/observability/quota.js.map +1 -0
- package/dist/lib/observability/requestId.d.ts +8 -0
- package/dist/lib/observability/requestId.d.ts.map +1 -0
- package/dist/lib/observability/requestId.js +24 -0
- package/dist/lib/observability/requestId.js.map +1 -0
- package/dist/lib/observability/sanitize.d.ts +77 -0
- package/dist/lib/observability/sanitize.d.ts.map +1 -0
- package/dist/lib/observability/sanitize.js +228 -0
- package/dist/lib/observability/sanitize.js.map +1 -0
- package/dist/lib/observability/scopes.d.ts +20 -0
- package/dist/lib/observability/scopes.d.ts.map +1 -0
- package/dist/lib/observability/scopes.js +77 -0
- package/dist/lib/observability/scopes.js.map +1 -0
- package/dist/lib/okxDexApi.d.ts +106 -0
- package/dist/lib/okxDexApi.d.ts.map +1 -0
- package/dist/lib/okxDexApi.js +221 -0
- package/dist/lib/okxDexApi.js.map +1 -0
- package/dist/lib/persistentJsonStore.d.ts +5 -0
- package/dist/lib/persistentJsonStore.d.ts.map +1 -0
- package/dist/lib/persistentJsonStore.js +39 -0
- package/dist/lib/persistentJsonStore.js.map +1 -0
- package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
- package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
- package/dist/lib/pharos/attestationPublisher.js +262 -0
- package/dist/lib/pharos/attestationPublisher.js.map +1 -0
- package/dist/lib/pharos/ecosystem.d.ts +52 -0
- package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
- package/dist/lib/pharos/ecosystem.js +431 -0
- package/dist/lib/pharos/ecosystem.js.map +1 -0
- package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
- package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
- package/dist/lib/pharos/ecosystemEvidence.js +133 -0
- package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
- package/dist/lib/pharos/rpc.d.ts +44 -0
- package/dist/lib/pharos/rpc.d.ts.map +1 -0
- package/dist/lib/pharos/rpc.js +90 -0
- package/dist/lib/pharos/rpc.js.map +1 -0
- package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
- package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
- package/dist/lib/pharos/rpcEvidence.js +46 -0
- package/dist/lib/pharos/rpcEvidence.js.map +1 -0
- package/dist/lib/pharos/rpcMethods.d.ts +46 -0
- package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
- package/dist/lib/pharos/rpcMethods.js +176 -0
- package/dist/lib/pharos/rpcMethods.js.map +1 -0
- package/dist/lib/pharos/spvVerifier.d.ts +47 -0
- package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
- package/dist/lib/pharos/spvVerifier.js +105 -0
- package/dist/lib/pharos/spvVerifier.js.map +1 -0
- package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
- package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
- package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
- package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
- package/dist/lib/pharosClient.d.ts +5 -10
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +9 -16
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.js +213 -52
- package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
- package/dist/lib/policy/agentPolicy.d.ts +29 -0
- package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
- package/dist/lib/policy/agentPolicy.js +154 -0
- package/dist/lib/policy/agentPolicy.js.map +1 -0
- package/dist/lib/policy/policyPresets.d.ts +30 -0
- package/dist/lib/policy/policyPresets.d.ts.map +1 -0
- package/dist/lib/policy/policyPresets.js +124 -0
- package/dist/lib/policy/policyPresets.js.map +1 -0
- package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
- package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
- package/dist/lib/policy/writeExecutionGate.js +65 -0
- package/dist/lib/policy/writeExecutionGate.js.map +1 -0
- package/dist/lib/preparedTxStore.d.ts +21 -0
- package/dist/lib/preparedTxStore.d.ts.map +1 -0
- package/dist/lib/preparedTxStore.js +90 -0
- package/dist/lib/preparedTxStore.js.map +1 -0
- package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
- package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
- package/dist/lib/price/chainlinkPushProvider.js +36 -0
- package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
- package/dist/lib/price/feedRegistry.d.ts +26 -0
- package/dist/lib/price/feedRegistry.d.ts.map +1 -0
- package/dist/lib/price/feedRegistry.js +67 -0
- package/dist/lib/price/feedRegistry.js.map +1 -0
- package/dist/lib/price/priceResolver.d.ts +35 -0
- package/dist/lib/price/priceResolver.d.ts.map +1 -0
- package/dist/lib/price/priceResolver.js +246 -0
- package/dist/lib/price/priceResolver.js.map +1 -0
- package/dist/lib/price/supraProvider.d.ts +9 -0
- package/dist/lib/price/supraProvider.d.ts.map +1 -0
- package/dist/lib/price/supraProvider.js +17 -0
- package/dist/lib/price/supraProvider.js.map +1 -0
- package/dist/lib/price/types.d.ts +67 -0
- package/dist/lib/price/types.d.ts.map +1 -0
- package/dist/lib/price/types.js +7 -0
- package/dist/lib/price/types.js.map +1 -0
- package/dist/lib/productionGuards.d.ts +16 -0
- package/dist/lib/productionGuards.d.ts.map +1 -0
- package/dist/lib/productionGuards.js +93 -0
- package/dist/lib/productionGuards.js.map +1 -0
- package/dist/lib/recipientSafety.d.ts +5 -0
- package/dist/lib/recipientSafety.d.ts.map +1 -0
- package/dist/lib/recipientSafety.js +28 -0
- package/dist/lib/recipientSafety.js.map +1 -0
- package/dist/lib/riskEngine.d.ts +19 -0
- package/dist/lib/riskEngine.d.ts.map +1 -1
- package/dist/lib/riskEngine.js +94 -36
- package/dist/lib/riskEngine.js.map +1 -1
- package/dist/lib/riskInclusion.d.ts +72 -0
- package/dist/lib/riskInclusion.d.ts.map +1 -0
- package/dist/lib/riskInclusion.js +252 -0
- package/dist/lib/riskInclusion.js.map +1 -0
- package/dist/lib/safeHandsRegistry.d.ts +32 -0
- package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
- package/dist/lib/safeHandsRegistry.js +151 -0
- package/dist/lib/safeHandsRegistry.js.map +1 -0
- package/dist/lib/signer/index.d.ts +3 -3
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +33 -11
- package/dist/lib/signer/index.js.map +1 -1
- package/dist/lib/spendAccumulator.d.ts +24 -1
- package/dist/lib/spendAccumulator.d.ts.map +1 -1
- package/dist/lib/spendAccumulator.js +76 -6
- package/dist/lib/spendAccumulator.js.map +1 -1
- package/dist/lib/toolResponse.d.ts +6 -1
- package/dist/lib/toolResponse.d.ts.map +1 -1
- package/dist/lib/toolResponse.js +13 -9
- package/dist/lib/toolResponse.js.map +1 -1
- package/dist/lib/validation.d.ts +7 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +62 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/wallet/index.d.ts +8 -12
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +48 -35
- package/dist/lib/wallet/index.js.map +1 -1
- package/dist/lib/x402ReplayStore.d.ts +6 -0
- package/dist/lib/x402ReplayStore.d.ts.map +1 -0
- package/dist/lib/x402ReplayStore.js +79 -0
- package/dist/lib/x402ReplayStore.js.map +1 -0
- package/dist/safehands.zip +0 -0
- package/dist/sdk.d.ts +14 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +25 -0
- package/dist/sdk.js.map +1 -0
- package/dist/tools/approveToken.d.ts +31 -10
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +91 -24
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +13 -26
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +34 -75
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +9 -3
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +27 -5
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +62 -5
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +166 -21
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +4 -2
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +36 -31
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +7 -2
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +16 -10
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +56 -8
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +194 -46
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +9 -9
- package/dist/tools/explainRisk.d.ts.map +1 -1
- package/dist/tools/explainRisk.js +5 -4
- package/dist/tools/explainRisk.js.map +1 -1
- package/dist/tools/getAgentPolicy.d.ts +15 -0
- package/dist/tools/getAgentPolicy.d.ts.map +1 -0
- package/dist/tools/getAgentPolicy.js +16 -0
- package/dist/tools/getAgentPolicy.js.map +1 -0
- package/dist/tools/getAgentReputation.d.ts +31 -0
- package/dist/tools/getAgentReputation.d.ts.map +1 -0
- package/dist/tools/getAgentReputation.js +44 -0
- package/dist/tools/getAgentReputation.js.map +1 -0
- package/dist/tools/getAgentWallet.d.ts +1 -1
- package/dist/tools/getAgentWallet.d.ts.map +1 -1
- package/dist/tools/getAgentWallet.js +11 -1
- package/dist/tools/getAgentWallet.js.map +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
- package/dist/tools/getAgentWalletBalance.js +58 -26
- package/dist/tools/getAgentWalletBalance.js.map +1 -1
- package/dist/tools/getExecutionHistory.d.ts +1 -1
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +13 -19
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +3 -3
- package/dist/tools/getGasPrice.d.ts.map +0 -0
- package/dist/tools/getGasPrice.js +7 -7
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +17 -17
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +14 -9
- package/dist/tools/getPoolInfo.js.map +1 -1
- package/dist/tools/getSpvProof.d.ts +24 -0
- package/dist/tools/getSpvProof.d.ts.map +1 -0
- package/dist/tools/getSpvProof.js +64 -0
- package/dist/tools/getSpvProof.js.map +1 -0
- package/dist/tools/getTokenPrice.d.ts +28 -85
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +87 -94
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getTransactionStatus.d.ts +2 -2
- package/dist/tools/getTransactionStatus.d.ts.map +0 -0
- package/dist/tools/getTransactionStatus.js +0 -0
- package/dist/tools/getTransactionStatus.js.map +0 -0
- package/dist/tools/getWalletBalance.d.ts +38 -3
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +92 -52
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +36 -14
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +80 -32
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryGoldsky.d.ts +20 -0
- package/dist/tools/queryGoldsky.d.ts.map +1 -0
- package/dist/tools/queryGoldsky.js +29 -0
- package/dist/tools/queryGoldsky.js.map +1 -0
- package/dist/tools/queryRiskRegistry.d.ts +14 -14
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +34 -30
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
- package/dist/tools/safehandsPreflightCheck.js +133 -6
- package/dist/tools/safehandsPreflightCheck.js.map +1 -1
- package/dist/tools/safehandsRiskReport.d.ts +29 -14
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
- package/dist/tools/safehandsRiskReport.js +23 -3
- package/dist/tools/safehandsRiskReport.js.map +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +100 -17
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +15 -1
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
- package/dist/tools/safehandsWalletHealth.js +67 -25
- package/dist/tools/safehandsWalletHealth.js.map +1 -1
- package/dist/tools/safehandsX402Preflight.d.ts +3 -3
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
- package/dist/tools/safehandsX402Preflight.js +24 -3
- package/dist/tools/safehandsX402Preflight.js.map +1 -1
- package/dist/tools/sendPayment.d.ts +10 -4
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +63 -36
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/setAgentPolicy.d.ts +75 -0
- package/dist/tools/setAgentPolicy.d.ts.map +1 -0
- package/dist/tools/setAgentPolicy.js +80 -0
- package/dist/tools/setAgentPolicy.js.map +1 -0
- package/dist/tools/simulateTransaction.d.ts +7 -3
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +42 -9
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +25 -5
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
- package/dist/tools/tokenRegistryStatus.js +61 -31
- package/dist/tools/tokenRegistryStatus.js.map +1 -1
- package/dist/tools/verifyRiskInclusion.d.ts +59 -0
- package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
- package/dist/tools/verifyRiskInclusion.js +40 -0
- package/dist/tools/verifyRiskInclusion.js.map +1 -0
- package/dist/tools/x402PayAndFetch.d.ts +15 -9
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +163 -20
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +39 -0
- package/dist/worker.js.map +1 -0
- package/dist/x402Server.d.ts +1 -1
- package/dist/x402Server.d.ts.map +1 -1
- package/dist/x402Server.js +144 -35
- package/dist/x402Server.js.map +1 -1
- package/docs/REVIEWER_QUICKSTART.md +113 -0
- package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
- package/package.json +130 -73
- package/contracts/RiskRegistry.json +0 -223
- package/contracts/RiskRegistry.sol +0 -58
- package/dist/lib/testDodoLive.d.ts +0 -2
- package/dist/lib/testDodoLive.d.ts.map +0 -1
- package/dist/lib/testDodoLive.js +0 -105
- package/dist/lib/testDodoLive.js.map +0 -1
- package/dist/lib/testLiveSafehands.d.ts +0 -2
- package/dist/lib/testLiveSafehands.d.ts.map +0 -1
- package/dist/lib/testLiveSafehands.js +0 -93
- package/dist/lib/testLiveSafehands.js.map +0 -1
- package/dist/lib/testRpc.d.ts +0 -2
- package/dist/lib/testRpc.d.ts.map +0 -1
- package/dist/lib/testRpc.js +0 -30
- package/dist/lib/testRpc.js.map +0 -1
- package/dist/lib/testRpcLive.d.ts +0 -2
- package/dist/lib/testRpcLive.d.ts.map +0 -1
- package/dist/lib/testRpcLive.js +0 -89
- package/dist/lib/testRpcLive.js.map +0 -1
- package/dist/lib/testTools.d.ts +0 -2
- package/dist/lib/testTools.d.ts.map +0 -1
- package/dist/lib/testTools.js +0 -397
- package/dist/lib/testTools.js.map +0 -1
- package/dist/lib/testX402Live.d.ts +0 -2
- package/dist/lib/testX402Live.d.ts.map +0 -1
- package/dist/lib/testX402Live.js +0 -160
- package/dist/lib/testX402Live.js.map +0 -1
- package/dist/scripts/checkDeploy.d.ts +0 -2
- package/dist/scripts/checkDeploy.d.ts.map +0 -1
- package/dist/scripts/checkDeploy.js +0 -25
- package/dist/scripts/checkDeploy.js.map +0 -1
- package/dist/scripts/deployRegistry.d.ts +0 -2
- package/dist/scripts/deployRegistry.d.ts.map +0 -1
- package/dist/scripts/deployRegistry.js +0 -101
- package/dist/scripts/deployRegistry.js.map +0 -1
- package/dist/scripts/testRegistry.d.ts +0 -2
- package/dist/scripts/testRegistry.d.ts.map +0 -1
- package/dist/scripts/testRegistry.js +0 -44
- package/dist/scripts/testRegistry.js.map +0 -1
|
@@ -1,38 +1,53 @@
|
|
|
1
1
|
// ─── Tool: token_registry_status ───────────────────────────────────────
|
|
2
|
-
// Classify exact token
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// Classify exact token inputs against the active network token registry.
|
|
3
|
+
// Pacific Mainnet uses PACIFIC_MAINNET_TOKEN_REGISTRY; Atlantic Testnet keeps
|
|
4
|
+
// the legacy testnet registry for compatibility.
|
|
5
5
|
// ───────────────────────────────────────────────────────────────────────
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { getAddress, isAddress } from "viem";
|
|
8
8
|
import { ok } from "../lib/toolResponse.js";
|
|
9
|
-
import { TOKEN_REGISTRY, CIRCLE_USDC_ADDRESS, CHAIN_ID, PHAROS_ENVIRONMENT } from "../lib/constants.js";
|
|
9
|
+
import { TOKEN_REGISTRY, CIRCLE_USDC_ADDRESS, CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET, PACIFIC_MAINNET_TOKEN_REGISTRY, } from "../lib/constants.js";
|
|
10
|
+
import { getActiveNetwork } from "../lib/networks.js";
|
|
11
|
+
import { fetchGoplusTokenIdentity } from "./checkTokenSecurity.js";
|
|
10
12
|
export const tokenRegistryStatusSchema = z.object({
|
|
11
13
|
token: z.string().optional().describe("Token symbol or exact contract address to classify"),
|
|
12
14
|
tokenAddress: z.string().optional().describe("Exact token contract address to classify"),
|
|
13
15
|
});
|
|
16
|
+
function activeRegistry() {
|
|
17
|
+
return getActiveNetwork().isMainnet
|
|
18
|
+
? PACIFIC_MAINNET_TOKEN_REGISTRY
|
|
19
|
+
: TOKEN_REGISTRY;
|
|
20
|
+
}
|
|
14
21
|
function deriveStatus(match) {
|
|
22
|
+
if (getActiveNetwork().isMainnet || match.isMainnet)
|
|
23
|
+
return "CANONICAL_MAINNET_TOKEN";
|
|
15
24
|
if (match.verificationStatus === "DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE")
|
|
16
25
|
return "SKILL_ENGINE_CANONICAL_TOKEN";
|
|
17
26
|
if (match.verificationStatus === "CIRCLE_REFERENCED_USDC")
|
|
18
27
|
return "ALTERNATE_SOURCE_TOKEN";
|
|
19
|
-
return "
|
|
28
|
+
return "CANONICAL_MAINNET_TOKEN";
|
|
29
|
+
}
|
|
30
|
+
function responseBase() {
|
|
31
|
+
return {
|
|
32
|
+
chainId: CHAIN_ID,
|
|
33
|
+
environment: PHAROS_ENVIRONMENT,
|
|
34
|
+
isMainnet: IS_MAINNET,
|
|
35
|
+
};
|
|
20
36
|
}
|
|
21
37
|
export function classifyTokenRegistryStatus(token) {
|
|
22
38
|
const raw = token.trim();
|
|
23
39
|
const upper = raw.toUpperCase();
|
|
24
|
-
const
|
|
40
|
+
const registry = activeRegistry();
|
|
41
|
+
const bySymbol = registry[upper];
|
|
25
42
|
if (bySymbol) {
|
|
26
43
|
return {
|
|
27
44
|
input: token,
|
|
28
45
|
normalizedAddress: bySymbol.address,
|
|
29
46
|
symbol: bySymbol.symbol,
|
|
30
47
|
status: deriveStatus(bySymbol),
|
|
31
|
-
verificationStatus: bySymbol.verificationStatus || (bySymbol.isCanonical ? "
|
|
32
|
-
docsSource: bySymbol.docsSource || "
|
|
33
|
-
|
|
34
|
-
environment: PHAROS_ENVIRONMENT,
|
|
35
|
-
isMainnet: false,
|
|
48
|
+
verificationStatus: bySymbol.verificationStatus || (bySymbol.isCanonical ? "DOCS_VERIFIED" : "UNVERIFIED_CONFIG_VALUE"),
|
|
49
|
+
docsSource: bySymbol.docsSource || "active network token registry",
|
|
50
|
+
...responseBase(),
|
|
36
51
|
};
|
|
37
52
|
}
|
|
38
53
|
if (!isAddress(raw)) {
|
|
@@ -40,16 +55,14 @@ export function classifyTokenRegistryStatus(token) {
|
|
|
40
55
|
input: token,
|
|
41
56
|
normalizedAddress: null,
|
|
42
57
|
symbol: null,
|
|
43
|
-
status: "INVALID_ADDRESS",
|
|
44
|
-
verificationStatus: "INVALID_ADDRESS",
|
|
58
|
+
status: (raw ? "UNKNOWN" : "INVALID_ADDRESS"),
|
|
59
|
+
verificationStatus: raw ? "UNKNOWN_SYMBOL" : "INVALID_ADDRESS",
|
|
45
60
|
docsSource: null,
|
|
46
|
-
|
|
47
|
-
environment: PHAROS_ENVIRONMENT,
|
|
48
|
-
isMainnet: false,
|
|
61
|
+
...responseBase(),
|
|
49
62
|
};
|
|
50
63
|
}
|
|
51
64
|
const checksum = getAddress(raw);
|
|
52
|
-
const entries = Object.values(
|
|
65
|
+
const entries = Object.values(registry);
|
|
53
66
|
const match = entries.find((t) => t.address.toLowerCase() === checksum.toLowerCase());
|
|
54
67
|
if (match) {
|
|
55
68
|
return {
|
|
@@ -57,15 +70,14 @@ export function classifyTokenRegistryStatus(token) {
|
|
|
57
70
|
normalizedAddress: checksum,
|
|
58
71
|
symbol: match.symbol,
|
|
59
72
|
status: deriveStatus(match),
|
|
60
|
-
verificationStatus: match.verificationStatus || "PROJECT_CONFIGURED",
|
|
61
|
-
docsSource: match.docsSource || "
|
|
62
|
-
|
|
63
|
-
environment: PHAROS_ENVIRONMENT,
|
|
64
|
-
isMainnet: false,
|
|
73
|
+
verificationStatus: match.verificationStatus || (getActiveNetwork().isMainnet ? "DOCS_VERIFIED" : "PROJECT_CONFIGURED"),
|
|
74
|
+
docsSource: match.docsSource || "active network token registry",
|
|
75
|
+
...responseBase(),
|
|
65
76
|
};
|
|
66
77
|
}
|
|
67
|
-
//
|
|
68
|
-
|
|
78
|
+
// Atlantic-only alternate USDC recognition. On Pacific Mainnet this old
|
|
79
|
+
// address is intentionally treated as custom/non-registry.
|
|
80
|
+
if (!getActiveNetwork().isMainnet && checksum.toLowerCase() === CIRCLE_USDC_ADDRESS.toLowerCase()) {
|
|
69
81
|
return {
|
|
70
82
|
input: token,
|
|
71
83
|
normalizedAddress: checksum,
|
|
@@ -73,9 +85,7 @@ export function classifyTokenRegistryStatus(token) {
|
|
|
73
85
|
status: "ALTERNATE_SOURCE_TOKEN",
|
|
74
86
|
verificationStatus: "CIRCLE_REFERENCED_USDC",
|
|
75
87
|
docsSource: "https://developers.circle.com/stablecoins/usdc-contract-addresses",
|
|
76
|
-
|
|
77
|
-
environment: PHAROS_ENVIRONMENT,
|
|
78
|
-
isMainnet: false,
|
|
88
|
+
...responseBase(),
|
|
79
89
|
};
|
|
80
90
|
}
|
|
81
91
|
return {
|
|
@@ -85,13 +95,33 @@ export function classifyTokenRegistryStatus(token) {
|
|
|
85
95
|
status: "CUSTOM_NON_REGISTRY",
|
|
86
96
|
verificationStatus: "UNVERIFIED_CUSTOM_TOKEN",
|
|
87
97
|
docsSource: null,
|
|
88
|
-
|
|
89
|
-
environment: PHAROS_ENVIRONMENT,
|
|
90
|
-
isMainnet: false,
|
|
98
|
+
...responseBase(),
|
|
91
99
|
};
|
|
92
100
|
}
|
|
93
101
|
export async function handleTokenRegistryStatus(raw) {
|
|
94
102
|
const input = tokenRegistryStatusSchema.parse(raw);
|
|
95
|
-
|
|
103
|
+
const classification = classifyTokenRegistryStatus(input.tokenAddress || input.token || "");
|
|
104
|
+
// For custom/non-registry tokens, best-effort DISPLAY-ONLY identity enrichment.
|
|
105
|
+
// Purely additive: status/verificationStatus/symbol are never altered, metadata
|
|
106
|
+
// is never fed into policy or gates (those consume classifyTokenRegistryStatus
|
|
107
|
+
// directly), and a fetch failure leaves the response identical to before.
|
|
108
|
+
if (classification.status !== "CUSTOM_NON_REGISTRY" || !classification.normalizedAddress) {
|
|
109
|
+
return ok(classification);
|
|
110
|
+
}
|
|
111
|
+
const identity = await fetchGoplusTokenIdentity(classification.normalizedAddress);
|
|
112
|
+
if (!identity.tokenName && !identity.tokenSymbol) {
|
|
113
|
+
return ok(classification);
|
|
114
|
+
}
|
|
115
|
+
return ok({
|
|
116
|
+
...classification,
|
|
117
|
+
tokenMetadata: {
|
|
118
|
+
tokenName: identity.tokenName,
|
|
119
|
+
tokenSymbol: identity.tokenSymbol,
|
|
120
|
+
source: "goplus_metadata",
|
|
121
|
+
verified: false,
|
|
122
|
+
displayOnly: true,
|
|
123
|
+
warning: "Untrusted display-only metadata reported by a third-party API. It does NOT verify this token's identity and does NOT imply the token is safe. The token remains UNVERIFIED_CUSTOM_TOKEN; anyone can deploy a token with any name/symbol.",
|
|
124
|
+
},
|
|
125
|
+
});
|
|
96
126
|
}
|
|
97
127
|
//# sourceMappingURL=tokenRegistryStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenRegistryStatus.js","sourceRoot":"","sources":["../../src/tools/tokenRegistryStatus.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"tokenRegistryStatus.js","sourceRoot":"","sources":["../../src/tools/tokenRegistryStatus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const verifyRiskInclusionSchema: z.ZodObject<{
|
|
3
|
+
target: z.ZodString;
|
|
4
|
+
actionHash: z.ZodOptional<z.ZodString>;
|
|
5
|
+
verifyOnchain: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
target: string;
|
|
8
|
+
verifyOnchain: boolean;
|
|
9
|
+
actionHash?: string | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
target: string;
|
|
12
|
+
actionHash?: string | undefined;
|
|
13
|
+
verifyOnchain?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type VerifyRiskInclusionInput = z.input<typeof verifyRiskInclusionSchema>;
|
|
16
|
+
export declare const verifyRiskInclusionTool: {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
inputSchema: z.ZodObject<{
|
|
20
|
+
target: z.ZodString;
|
|
21
|
+
actionHash: z.ZodOptional<z.ZodString>;
|
|
22
|
+
verifyOnchain: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
23
|
+
}, "strip", z.ZodTypeAny, {
|
|
24
|
+
target: string;
|
|
25
|
+
verifyOnchain: boolean;
|
|
26
|
+
actionHash?: string | undefined;
|
|
27
|
+
}, {
|
|
28
|
+
target: string;
|
|
29
|
+
actionHash?: string | undefined;
|
|
30
|
+
verifyOnchain?: boolean | undefined;
|
|
31
|
+
}>;
|
|
32
|
+
};
|
|
33
|
+
export declare function handleVerifyRiskInclusion(raw: VerifyRiskInclusionInput): Promise<import("../sdk.js").ToolFailure | import("../sdk.js").ToolSuccess<{
|
|
34
|
+
registryContract: string | null;
|
|
35
|
+
included: boolean;
|
|
36
|
+
configured: boolean;
|
|
37
|
+
committed: boolean;
|
|
38
|
+
onchainMerkleRoot: string | null;
|
|
39
|
+
dataURI: string | null;
|
|
40
|
+
found: boolean;
|
|
41
|
+
rootMatches: boolean;
|
|
42
|
+
verifiedLocal: boolean;
|
|
43
|
+
verifiedOnchain: boolean | null;
|
|
44
|
+
expired: boolean;
|
|
45
|
+
proof: string[] | null;
|
|
46
|
+
record: {
|
|
47
|
+
target: string;
|
|
48
|
+
actionHash: string;
|
|
49
|
+
score: number;
|
|
50
|
+
level: number;
|
|
51
|
+
recommendation: number;
|
|
52
|
+
policyVersionHash: string;
|
|
53
|
+
evidenceHash: string;
|
|
54
|
+
expiresAt: string;
|
|
55
|
+
} | null;
|
|
56
|
+
source: "onchain-view" | "local-only" | "unconfigured" | "not-committed" | "not-found" | "root-mismatch" | "error";
|
|
57
|
+
error?: string;
|
|
58
|
+
}>>;
|
|
59
|
+
//# sourceMappingURL=verifyRiskInclusion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyRiskInclusion.d.ts","sourceRoot":"","sources":["../../src/tools/verifyRiskInclusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAOnC,CAAC;AAEF,wBAAsB,yBAAyB,CAAC,GAAG,EAAE,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;IA4B5E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isAddress } from "viem";
|
|
3
|
+
import { ok, fail } from "../lib/toolResponse.js";
|
|
4
|
+
import { SAFEHANDS_REGISTRY_ADDRESS } from "../lib/constants.js";
|
|
5
|
+
import { verifyRiskInclusion } from "../lib/riskInclusion.js";
|
|
6
|
+
export const verifyRiskInclusionSchema = z.object({
|
|
7
|
+
target: z.string().describe("The address whose risk record you want to prove is included in the committed on-chain Merkle root."),
|
|
8
|
+
actionHash: z.string().optional().describe("Optional 32-byte action hash to disambiguate when a target has multiple records in the batch."),
|
|
9
|
+
verifyOnchain: z.boolean().optional().default(true).describe("If true (default), also verify the Merkle proof through the contract's verifyRiskRecord view for a trustless result."),
|
|
10
|
+
});
|
|
11
|
+
export const verifyRiskInclusionTool = {
|
|
12
|
+
name: "verify_risk_inclusion",
|
|
13
|
+
description: "Prove a target's SafeHands risk record is included in the currently committed on-chain Merkle root. " +
|
|
14
|
+
"Fetches the committed root + data-availability batch, rebuilds the Merkle proof, and verifies it both " +
|
|
15
|
+
"locally and (by default) through the SafeHandsRegistry.verifyRiskRecord view. Read-only, keyless, composable.",
|
|
16
|
+
inputSchema: verifyRiskInclusionSchema,
|
|
17
|
+
};
|
|
18
|
+
export async function handleVerifyRiskInclusion(raw) {
|
|
19
|
+
const input = verifyRiskInclusionSchema.parse(raw);
|
|
20
|
+
if (!isAddress(input.target)) {
|
|
21
|
+
return fail("VALIDATION_ERROR", "target is not a valid EVM address.", false, "verify_risk_inclusion");
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const result = await verifyRiskInclusion({ target: input.target, actionHash: input.actionHash }, { verifyOnchain: input.verifyOnchain });
|
|
25
|
+
return ok({
|
|
26
|
+
...result,
|
|
27
|
+
registryContract: SAFEHANDS_REGISTRY_ADDRESS || null,
|
|
28
|
+
// A single, unambiguous verdict for callers that don't want to interpret the flags themselves.
|
|
29
|
+
included: Boolean(result.found &&
|
|
30
|
+
result.rootMatches &&
|
|
31
|
+
result.verifiedLocal &&
|
|
32
|
+
(result.verifiedOnchain === null || result.verifiedOnchain === true) &&
|
|
33
|
+
!result.expired),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return fail("RISK_INCLUSION_FAILED", `Failed to verify risk inclusion: ${err.message}`, true, "verify_risk_inclusion");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=verifyRiskInclusion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyRiskInclusion.js","sourceRoot":"","sources":["../../src/tools/verifyRiskInclusion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oGAAoG,CAAC;IACjI,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+FAA+F,CAAC;IAC3I,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sHAAsH,CAAC;CACrL,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,sGAAsG;QACtG,wGAAwG;QACxG,+GAA+G;IACjH,WAAW,EAAE,yBAAyB;CACvC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,GAA6B;IAC3E,MAAM,KAAK,GAAG,yBAAyB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEnD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,kBAAkB,EAAE,oCAAoC,EAAE,KAAK,EAAE,uBAAuB,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EACtD,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CACvC,CAAC;QAEF,OAAO,EAAE,CAAC;YACR,GAAG,MAAM;YACT,gBAAgB,EAAE,0BAA0B,IAAI,IAAI;YACpD,+FAA+F;YAC/F,QAAQ,EAAE,OAAO,CACf,MAAM,CAAC,KAAK;gBACV,MAAM,CAAC,WAAW;gBAClB,MAAM,CAAC,aAAa;gBACpB,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;gBACpE,CAAC,MAAM,CAAC,OAAO,CAClB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAC,uBAAuB,EAAE,oCAAqC,GAAa,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACpI,CAAC;AACH,CAAC"}
|
|
@@ -6,9 +6,11 @@ export declare const x402PayAndFetchSchema: z.ZodObject<{
|
|
|
6
6
|
rpcUrl: z.ZodOptional<z.ZodString>;
|
|
7
7
|
agentId: z.ZodOptional<z.ZodString>;
|
|
8
8
|
maxPaymentUsdc: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
10
|
+
}, "strict", z.ZodTypeAny, {
|
|
11
11
|
method: "GET" | "POST" | "PUT" | "DELETE";
|
|
12
|
+
url: string;
|
|
13
|
+
confirm: boolean;
|
|
12
14
|
maxPaymentUsdc: string;
|
|
13
15
|
body?: string | undefined;
|
|
14
16
|
agentId?: string | undefined;
|
|
@@ -18,6 +20,7 @@ export declare const x402PayAndFetchSchema: z.ZodObject<{
|
|
|
18
20
|
body?: string | undefined;
|
|
19
21
|
method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
|
|
20
22
|
agentId?: string | undefined;
|
|
23
|
+
confirm?: boolean | undefined;
|
|
21
24
|
rpcUrl?: string | undefined;
|
|
22
25
|
maxPaymentUsdc?: string | undefined;
|
|
23
26
|
}>;
|
|
@@ -32,9 +35,11 @@ export declare const x402PayAndFetchTool: {
|
|
|
32
35
|
rpcUrl: z.ZodOptional<z.ZodString>;
|
|
33
36
|
agentId: z.ZodOptional<z.ZodString>;
|
|
34
37
|
maxPaymentUsdc: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
confirm: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
39
|
+
}, "strict", z.ZodTypeAny, {
|
|
37
40
|
method: "GET" | "POST" | "PUT" | "DELETE";
|
|
41
|
+
url: string;
|
|
42
|
+
confirm: boolean;
|
|
38
43
|
maxPaymentUsdc: string;
|
|
39
44
|
body?: string | undefined;
|
|
40
45
|
agentId?: string | undefined;
|
|
@@ -44,11 +49,12 @@ export declare const x402PayAndFetchTool: {
|
|
|
44
49
|
body?: string | undefined;
|
|
45
50
|
method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
|
|
46
51
|
agentId?: string | undefined;
|
|
52
|
+
confirm?: boolean | undefined;
|
|
47
53
|
rpcUrl?: string | undefined;
|
|
48
54
|
maxPaymentUsdc?: string | undefined;
|
|
49
55
|
}>;
|
|
50
56
|
};
|
|
51
|
-
export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promise<import("../
|
|
57
|
+
export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promise<import("../sdk.js").ToolFailure | import("../sdk.js").ToolSuccess<{
|
|
52
58
|
status: number;
|
|
53
59
|
statusText: string;
|
|
54
60
|
data: unknown;
|
|
@@ -57,9 +63,9 @@ export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promis
|
|
|
57
63
|
chainId: number;
|
|
58
64
|
environment: string;
|
|
59
65
|
isMainnet: boolean;
|
|
60
|
-
policy: import("../
|
|
66
|
+
policy: import("../sdk.js").ActionPolicyResult;
|
|
61
67
|
source: string;
|
|
62
|
-
}> | import("../
|
|
68
|
+
}> | import("../sdk.js").ToolSuccess<{
|
|
63
69
|
status: number;
|
|
64
70
|
statusText: string;
|
|
65
71
|
data: unknown;
|
|
@@ -75,8 +81,8 @@ export declare function handleX402PayAndFetch(raw: X402PayAndFetchInput): Promis
|
|
|
75
81
|
chainId: number;
|
|
76
82
|
environment: string;
|
|
77
83
|
isMainnet: boolean;
|
|
78
|
-
policy: import("../
|
|
79
|
-
|
|
84
|
+
policy: import("../sdk.js").ActionPolicyResult;
|
|
85
|
+
mainnetPayment: boolean;
|
|
80
86
|
source: string;
|
|
81
87
|
}>>;
|
|
82
88
|
//# sourceMappingURL=x402PayAndFetch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x402PayAndFetch.d.ts","sourceRoot":"","sources":["../../src/tools/x402PayAndFetch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"x402PayAndFetch.d.ts","sourceRoot":"","sources":["../../src/tools/x402PayAndFetch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM/B,CAAC;AA+DF,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkPpE"}
|
|
@@ -5,23 +5,29 @@
|
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
|
|
7
7
|
import { registerExactEvmScheme } from "@x402/evm/exact/client";
|
|
8
|
-
import { CHAIN_ID, PHAROS_ENVIRONMENT, RPC_URL, MAX_X402_PAYMENT_USDC, X402_PAYMENT_TOKEN_ADDRESS } from "../lib/constants.js";
|
|
8
|
+
import { CHAIN_ID, PHAROS_ENVIRONMENT, RPC_URL, MAX_X402_PAYMENT_USDC, X402_PAYMENT_TOKEN_ADDRESS, IS_MAINNET, activeX402AllowedTokenAddresses } from "../lib/constants.js";
|
|
9
9
|
import { assertSafeFetchUrl, fetchWithTimeoutAndRetry } from "../lib/http.js";
|
|
10
10
|
import { fail, ok, requireWriteToolsEnabled } from "../lib/toolResponse.js";
|
|
11
11
|
import { getSigner, isSignerFailure } from "../lib/signer/index.js";
|
|
12
|
+
import { checkManagedWalletAuthorization } from "../lib/safeHandsRegistry.js";
|
|
13
|
+
import { REQUIRE_AUTHORIZED_AGENT_FOR_X402 } from "../lib/constants.js";
|
|
12
14
|
import { evaluateActionPolicy } from "../lib/policy/actionPolicyEngine.js";
|
|
15
|
+
import { enforceWriteDecision } from "../lib/policy/writeExecutionGate.js";
|
|
16
|
+
import { validatePositiveAmount } from "../lib/validation.js";
|
|
17
|
+
import { reserveDailyLimit, releaseReservation, estimateUsd } from "../lib/spendAccumulator.js";
|
|
13
18
|
export const x402PayAndFetchSchema = z.object({
|
|
14
19
|
url: z.string().describe("Target URL of the protected resource requiring x402 payment"),
|
|
15
20
|
method: z.enum(["GET", "POST", "PUT", "DELETE"]).optional().default("GET").describe("HTTP method to use"),
|
|
16
21
|
body: z.string().optional().describe("Optional stringified JSON request body"),
|
|
17
|
-
rpcUrl: z.string().optional().describe("Custom RPC URL for payment verification
|
|
18
|
-
agentId: z.string().optional().describe("Managed
|
|
22
|
+
rpcUrl: z.string().optional().describe("Custom RPC URL for payment verification"),
|
|
23
|
+
agentId: z.string().optional().describe("Managed wallet agentId when WALLET_MODE=managed-mainnet"),
|
|
19
24
|
maxPaymentUsdc: z.string().optional().default(MAX_X402_PAYMENT_USDC),
|
|
20
|
-
|
|
25
|
+
confirm: z.boolean().optional().default(false).describe("Explicit acknowledgement to proceed when SafeHands returns REQUIRE_CONFIRMATION for the payment. Hard BLOCK / SSRF / over-limit / unsupported-token are never overridable."),
|
|
26
|
+
}).strict();
|
|
21
27
|
export const x402PayAndFetchTool = {
|
|
22
28
|
name: "x402_pay_and_fetch",
|
|
23
29
|
description: "Fetch resources from an HTTP x402 payment-gated server. " +
|
|
24
|
-
"If the server challenges with HTTP 402, this tool signs the required
|
|
30
|
+
"If the server challenges with HTTP 402, this tool signs the required mainnet payment payload and completes the fetch.",
|
|
25
31
|
inputSchema: x402PayAndFetchSchema,
|
|
26
32
|
};
|
|
27
33
|
async function readResponseBody(res) {
|
|
@@ -47,8 +53,56 @@ function buildFetchOptions(input) {
|
|
|
47
53
|
fetchOptions.body = input.body;
|
|
48
54
|
return fetchOptions;
|
|
49
55
|
}
|
|
56
|
+
function x402AllowedTokenSet() {
|
|
57
|
+
return new Set(activeX402AllowedTokenAddresses().map((a) => a.toLowerCase()));
|
|
58
|
+
}
|
|
59
|
+
function validateX402Challenge(challengeHeader, maxPaymentUsdc) {
|
|
60
|
+
if (!challengeHeader)
|
|
61
|
+
return null;
|
|
62
|
+
try {
|
|
63
|
+
const decoded = JSON.parse(Buffer.from(challengeHeader, "base64").toString("utf-8"));
|
|
64
|
+
if (decoded.maxAmountRequired) {
|
|
65
|
+
const challengeAmount = Number(decoded.maxAmountRequired) / 1e6;
|
|
66
|
+
if (challengeAmount > Number(maxPaymentUsdc)) {
|
|
67
|
+
return `x402 challenge amount (${challengeAmount} USDC) exceeds maxPaymentUsdc (${maxPaymentUsdc}).`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (decoded.network) {
|
|
71
|
+
const parts = String(decoded.network).split(":");
|
|
72
|
+
const challengeChainId = parts.length === 2 ? Number(parts[1]) : Number(decoded.network);
|
|
73
|
+
if (Number.isFinite(challengeChainId) && challengeChainId !== CHAIN_ID) {
|
|
74
|
+
return `x402 challenge targets chain ${challengeChainId}, expected ${PHAROS_ENVIRONMENT} (${CHAIN_ID}).`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (decoded.asset) {
|
|
78
|
+
const asset = String(decoded.asset).toLowerCase();
|
|
79
|
+
if (!x402AllowedTokenSet().has(asset)) {
|
|
80
|
+
const allowed = activeX402AllowedTokenAddresses().join(", ");
|
|
81
|
+
return `x402 challenge requests payment in unsupported token ${decoded.asset}. Supported for ${PHAROS_ENVIRONMENT}: ${allowed}.`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Challenge header not parseable — proceed with caution but don't block
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
50
90
|
export async function handleX402PayAndFetch(raw) {
|
|
51
|
-
|
|
91
|
+
let input;
|
|
92
|
+
try {
|
|
93
|
+
input = x402PayAndFetchSchema.parse(raw);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
const msg = err instanceof z.ZodError
|
|
97
|
+
? err.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")
|
|
98
|
+
: String(err);
|
|
99
|
+
return fail("VALIDATION_ERROR", `x402_pay_and_fetch input validation failed: ${msg}`, false, "x402_pay_and_fetch");
|
|
100
|
+
}
|
|
101
|
+
if (input.maxPaymentUsdc) {
|
|
102
|
+
const amtErr = validatePositiveAmount(input.maxPaymentUsdc, "maxPaymentUsdc");
|
|
103
|
+
if (amtErr)
|
|
104
|
+
return fail("VALIDATION_ERROR", amtErr, false, "x402_pay_and_fetch");
|
|
105
|
+
}
|
|
52
106
|
try {
|
|
53
107
|
await assertSafeFetchUrl(input.url);
|
|
54
108
|
}
|
|
@@ -57,24 +111,43 @@ export async function handleX402PayAndFetch(raw) {
|
|
|
57
111
|
}
|
|
58
112
|
const staticPolicy = evaluateActionPolicy({
|
|
59
113
|
actionType: "x402_pay_and_fetch",
|
|
114
|
+
agentId: input.agentId,
|
|
60
115
|
url: input.url,
|
|
61
116
|
paymentAmountUsdc: input.maxPaymentUsdc,
|
|
62
117
|
paymentTokenAddress: X402_PAYMENT_TOKEN_ADDRESS,
|
|
63
118
|
chainId: CHAIN_ID,
|
|
64
119
|
environment: PHAROS_ENVIRONMENT,
|
|
65
|
-
isMainnet:
|
|
120
|
+
isMainnet: IS_MAINNET,
|
|
66
121
|
});
|
|
67
122
|
if (staticPolicy.decision === "BLOCK") {
|
|
68
123
|
return fail("POLICY_BLOCKED", staticPolicy.reasons.join(" ") || "x402 request blocked by SafeHands policy.", false, "x402_pay_and_fetch");
|
|
69
124
|
}
|
|
70
125
|
const fetchOptions = buildFetchOptions(input);
|
|
126
|
+
// Daily-cap reservation state, hoisted above the try so the catch block can
|
|
127
|
+
// return the budget if the paying fetch throws after the reserve.
|
|
128
|
+
let reservedUsd = 0;
|
|
129
|
+
let reservedWallet = null;
|
|
71
130
|
try {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
131
|
+
let initial;
|
|
132
|
+
try {
|
|
133
|
+
initial = await fetchWithTimeoutAndRetry(input.url, {
|
|
134
|
+
...fetchOptions,
|
|
135
|
+
timeoutMs: 10_000,
|
|
136
|
+
retries: 1,
|
|
137
|
+
retryDelayMs: 250,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
// fetchWithTimeoutAndRetry follows redirects internally and re-validates
|
|
142
|
+
// SSRF on every hop (initial URL and every redirect target). Surface
|
|
143
|
+
// that as the same clean SSRF_BLOCKED error code used for the upfront
|
|
144
|
+
// check, instead of falling through to the generic X402_PAYMENT_FAILED.
|
|
145
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
146
|
+
if (msg.includes("SSRF_BLOCKED")) {
|
|
147
|
+
return fail("SSRF_BLOCKED", msg.replace(/^SSRF_BLOCKED:\s*/, ""), false, "x402_pay_and_fetch");
|
|
148
|
+
}
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
78
151
|
if (initial.status !== 402) {
|
|
79
152
|
const data = await readResponseBody(initial);
|
|
80
153
|
return ok({
|
|
@@ -85,11 +158,16 @@ export async function handleX402PayAndFetch(raw) {
|
|
|
85
158
|
paymentDetails: null,
|
|
86
159
|
chainId: CHAIN_ID,
|
|
87
160
|
environment: PHAROS_ENVIRONMENT,
|
|
88
|
-
isMainnet:
|
|
161
|
+
isMainnet: IS_MAINNET,
|
|
89
162
|
policy: staticPolicy,
|
|
90
163
|
source: "x402_fetch",
|
|
91
164
|
});
|
|
92
165
|
}
|
|
166
|
+
const challengeHeader = initial.headers.get("PAYMENT-REQUIRED");
|
|
167
|
+
const challengeError = validateX402Challenge(challengeHeader, input.maxPaymentUsdc);
|
|
168
|
+
if (challengeError) {
|
|
169
|
+
return fail("X402_CHALLENGE_INVALID", challengeError, false, "x402_pay_and_fetch");
|
|
170
|
+
}
|
|
93
171
|
const writeGuard = requireWriteToolsEnabled("x402_pay_and_fetch");
|
|
94
172
|
if (writeGuard)
|
|
95
173
|
return writeGuard;
|
|
@@ -97,20 +175,42 @@ export async function handleX402PayAndFetch(raw) {
|
|
|
97
175
|
if (isSignerFailure(signer)) {
|
|
98
176
|
return fail("X402_PAYMENT_REQUIRED", `The resource returned HTTP 402, but no safe x402 signer is available: ${signer.error.message}`, false, "x402_pay_and_fetch");
|
|
99
177
|
}
|
|
178
|
+
// x402 is permissionless-first: self-signed x402 (mode "x402-env") never needs
|
|
179
|
+
// registry authorization. A managed/custodial x402 payment is allowlist-gated
|
|
180
|
+
// ONLY when explicitly opted in via REQUIRE_AUTHORIZED_AGENT_FOR_X402=true.
|
|
181
|
+
if (signer.mode === "managed-mainnet" && REQUIRE_AUTHORIZED_AGENT_FOR_X402) {
|
|
182
|
+
const authCheck = await checkManagedWalletAuthorization(signer.address);
|
|
183
|
+
if (!authCheck.authorized) {
|
|
184
|
+
return fail("REQUIRE_AUTHORIZATION", authCheck.errorMessage || "Managed wallet is not authorized in SafeHandsRegistry.", false, "x402_pay_and_fetch");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
100
187
|
const paymentPolicy = evaluateActionPolicy({
|
|
101
188
|
actionType: "x402_pay_and_fetch",
|
|
189
|
+
agentId: input.agentId,
|
|
102
190
|
url: input.url,
|
|
103
191
|
paymentAmountUsdc: input.maxPaymentUsdc,
|
|
104
192
|
paymentTokenAddress: X402_PAYMENT_TOKEN_ADDRESS,
|
|
105
193
|
chainId: CHAIN_ID,
|
|
106
194
|
environment: PHAROS_ENVIRONMENT,
|
|
107
|
-
isMainnet:
|
|
195
|
+
isMainnet: IS_MAINNET,
|
|
108
196
|
signerAvailable: true,
|
|
109
197
|
requiresSigner: true,
|
|
110
198
|
});
|
|
111
|
-
|
|
112
|
-
|
|
199
|
+
const paymentGate = enforceWriteDecision(paymentPolicy, { confirmed: input.confirm === true, toolName: "x402_pay_and_fetch" });
|
|
200
|
+
if (paymentGate)
|
|
201
|
+
return paymentGate;
|
|
202
|
+
// x402 payments count toward the same per-wallet daily USD cap as
|
|
203
|
+
// send_payment / execute_swap — otherwise a looping agent could drain the
|
|
204
|
+
// wallet in per-call-cap increments. Reserve the payment BOUND
|
|
205
|
+
// (maxPaymentUsdc; the 402 challenge amount is validated to be ≤ this)
|
|
206
|
+
// atomically before the paying fetch, and release it if no payment settles.
|
|
207
|
+
const reserveUsd = estimateUsd(input.maxPaymentUsdc, "USDC");
|
|
208
|
+
const reservation = reserveDailyLimit(signer.address, reserveUsd);
|
|
209
|
+
if (!reservation.allowed) {
|
|
210
|
+
return fail("DAILY_SPEND_LIMIT_EXCEEDED", `Daily spend limit reached. Spent $${reservation.currentUsd.toFixed(2)} of $${reservation.limitUsd.toFixed(2)} USD today. Remaining: $${reservation.remainingUsd.toFixed(2)}. Resets at UTC midnight.`, false, "x402_pay_and_fetch");
|
|
113
211
|
}
|
|
212
|
+
reservedUsd = reserveUsd;
|
|
213
|
+
reservedWallet = signer.address;
|
|
114
214
|
const rpc = input.rpcUrl || process.env.PHAROS_RPC_URL || RPC_URL;
|
|
115
215
|
const client = new x402Client();
|
|
116
216
|
registerExactEvmScheme(client, {
|
|
@@ -119,10 +219,46 @@ export async function handleX402PayAndFetch(raw) {
|
|
|
119
219
|
[CHAIN_ID]: { rpcUrl: rpc },
|
|
120
220
|
},
|
|
121
221
|
});
|
|
122
|
-
|
|
222
|
+
// wrapFetchWithPayment always invokes the supplied fetch with a single
|
|
223
|
+
// Request object (it builds one internally via `new Request(input, init)`
|
|
224
|
+
// and clones it for retries/hooks). This guard re-derives the URL/method/
|
|
225
|
+
// headers/body from that Request and routes the actual network call
|
|
226
|
+
// through fetchWithTimeoutAndRetry, so the payment-carrying request — the
|
|
227
|
+
// most sensitive call in this flow — gets the same DNS-pinned SSRF
|
|
228
|
+
// protection as the initial request instead of bypassing it via the raw
|
|
229
|
+
// global fetch.
|
|
230
|
+
const guardedFetch = async (requestInput, requestInit) => {
|
|
231
|
+
const req = requestInput instanceof Request ? requestInput : new Request(requestInput, requestInit);
|
|
232
|
+
const method = req.method || "GET";
|
|
233
|
+
const headersInit = {};
|
|
234
|
+
req.headers.forEach((value, key) => {
|
|
235
|
+
headersInit[key] = value;
|
|
236
|
+
});
|
|
237
|
+
let body;
|
|
238
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
239
|
+
const buf = await req.arrayBuffer();
|
|
240
|
+
if (buf.byteLength > 0)
|
|
241
|
+
body = new Uint8Array(buf);
|
|
242
|
+
}
|
|
243
|
+
return fetchWithTimeoutAndRetry(req.url, {
|
|
244
|
+
method,
|
|
245
|
+
headers: headersInit,
|
|
246
|
+
body,
|
|
247
|
+
timeoutMs: 10_000,
|
|
248
|
+
retries: 0, // avoid duplicate payment submission on a transient error
|
|
249
|
+
});
|
|
250
|
+
};
|
|
251
|
+
const fetchWithPayment = wrapFetchWithPayment(guardedFetch, client);
|
|
123
252
|
const paidResponse = await fetchWithPayment(input.url, fetchOptions);
|
|
124
253
|
const data = await readResponseBody(paidResponse);
|
|
125
254
|
const paymentResponseHeader = paidResponse.headers.get("PAYMENT-RESPONSE");
|
|
255
|
+
if (!paymentResponseHeader) {
|
|
256
|
+
// No payment actually settled (e.g. the resource stopped charging) —
|
|
257
|
+
// return the reserved budget so unpaid fetches never consume the cap.
|
|
258
|
+
releaseReservation(signer.address, reservedUsd);
|
|
259
|
+
reservedUsd = 0;
|
|
260
|
+
reservedWallet = null;
|
|
261
|
+
}
|
|
126
262
|
return ok({
|
|
127
263
|
status: paidResponse.status,
|
|
128
264
|
statusText: paidResponse.statusText,
|
|
@@ -140,13 +276,20 @@ export async function handleX402PayAndFetch(raw) {
|
|
|
140
276
|
maxPaymentUsdc: input.maxPaymentUsdc,
|
|
141
277
|
chainId: CHAIN_ID,
|
|
142
278
|
environment: PHAROS_ENVIRONMENT,
|
|
143
|
-
isMainnet:
|
|
279
|
+
isMainnet: IS_MAINNET,
|
|
144
280
|
policy: paymentPolicy,
|
|
145
|
-
|
|
281
|
+
mainnetPayment: true,
|
|
146
282
|
source: "x402_fetch",
|
|
147
283
|
});
|
|
148
284
|
}
|
|
149
285
|
catch (err) {
|
|
286
|
+
// A payment that failed in flight is ambiguous (it MAY have settled), but
|
|
287
|
+
// the x402 replay store makes a re-submission of the same authorization
|
|
288
|
+
// safe — release the reservation so a transient fetch error does not
|
|
289
|
+
// permanently consume the daily budget.
|
|
290
|
+
if (reservedWallet && reservedUsd > 0) {
|
|
291
|
+
releaseReservation(reservedWallet, reservedUsd);
|
|
292
|
+
}
|
|
150
293
|
return fail("X402_PAYMENT_FAILED", err instanceof Error ? err.message : String(err), true, "x402_pay_and_fetch");
|
|
151
294
|
}
|
|
152
295
|
}
|