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
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare function handleGoldskyStatus(): {
|
|
2
|
+
readOnly: true;
|
|
3
|
+
executionAvailable: boolean;
|
|
4
|
+
service: string;
|
|
5
|
+
status: import("../lib/goldsky.js").GoldskyConfigStatus;
|
|
6
|
+
role: string;
|
|
7
|
+
recommendedEntities: {
|
|
8
|
+
attestations: string;
|
|
9
|
+
riskRoots: string;
|
|
10
|
+
};
|
|
11
|
+
network: import("../lib/networks.js").NetworkName;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Read-only, keyless, composable on-chain reputation for an address: the count of
|
|
15
|
+
* SafeHands-verified safe broadcasts attributed to it (+ recency), plus registry
|
|
16
|
+
* authorization/risk-record context. Any agent can query this as a trust signal.
|
|
17
|
+
* Zero count = NEUTRAL (no track record yet), never negative.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleAgentReputation(address: string): Promise<{
|
|
20
|
+
readOnly: true;
|
|
21
|
+
executionAvailable: boolean;
|
|
22
|
+
address: `0x${string}`;
|
|
23
|
+
reputation: {
|
|
24
|
+
verifiedActionCount: number;
|
|
25
|
+
lastVerifiedActionAt: number;
|
|
26
|
+
configured: boolean;
|
|
27
|
+
source: "onchain" | "unconfigured";
|
|
28
|
+
};
|
|
29
|
+
registry: {
|
|
30
|
+
isAuthorizedAgent: boolean;
|
|
31
|
+
hasRiskRecord: boolean;
|
|
32
|
+
currentMerkleRoot: string | null;
|
|
33
|
+
};
|
|
34
|
+
interpretation: string;
|
|
35
|
+
network: import("../lib/networks.js").NetworkName;
|
|
36
|
+
}>;
|
|
37
|
+
export declare function handleLatestRiskRootIndex(): Promise<{
|
|
38
|
+
readOnly: true;
|
|
39
|
+
executionAvailable: boolean;
|
|
40
|
+
status: string;
|
|
41
|
+
goldsky: import("../lib/goldsky.js").GoldskyLookupResult<import("../lib/goldsky.js").IndexedRiskRootRecord>;
|
|
42
|
+
onchain: Record<string, unknown> | null;
|
|
43
|
+
note: string;
|
|
44
|
+
network: import("../lib/networks.js").NetworkName;
|
|
45
|
+
}>;
|
|
46
|
+
//# sourceMappingURL=indexerRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexerRoutes.d.ts","sourceRoot":"","sources":["../../src/api/indexerRoutes.ts"],"names":[],"mappings":"AAOA,wBAAgB,mBAAmB;;;;;;;;;;;EAYlC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;GA4B1D;AAED,wBAAsB,yBAAyB;;;;;;;;GAsB9C"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { goldskyStatus, lookupLatestRiskRootInGoldsky } from "../lib/goldsky.js";
|
|
2
|
+
import { queryRegistryForTarget } from "../lib/safeHandsRegistry.js";
|
|
3
|
+
import { getAgentReputation } from "../lib/pharos/attestationPublisher.js";
|
|
4
|
+
import { getActiveNetworkName } from "../lib/networks.js";
|
|
5
|
+
import { readOnlyMeta } from "./response.js";
|
|
6
|
+
import { isAddress } from "viem";
|
|
7
|
+
export function handleGoldskyStatus() {
|
|
8
|
+
return {
|
|
9
|
+
service: "safehands-goldsky-indexer",
|
|
10
|
+
status: goldskyStatus(),
|
|
11
|
+
role: "Goldsky indexes SafeHands on-chain Registry and Attestation events for fast user/agent lookup. Contracts remain the source of truth.",
|
|
12
|
+
recommendedEntities: {
|
|
13
|
+
attestations: process.env.GOLDSKY_ATTESTATION_ENTITIES || "safeHandsAttesteds,attestations",
|
|
14
|
+
riskRoots: process.env.GOLDSKY_RISK_ROOT_ENTITIES || "riskRootCommitteds,safeHandsRiskRootCommitteds",
|
|
15
|
+
},
|
|
16
|
+
network: getActiveNetworkName(),
|
|
17
|
+
...readOnlyMeta(),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read-only, keyless, composable on-chain reputation for an address: the count of
|
|
22
|
+
* SafeHands-verified safe broadcasts attributed to it (+ recency), plus registry
|
|
23
|
+
* authorization/risk-record context. Any agent can query this as a trust signal.
|
|
24
|
+
* Zero count = NEUTRAL (no track record yet), never negative.
|
|
25
|
+
*/
|
|
26
|
+
export async function handleAgentReputation(address) {
|
|
27
|
+
if (!address || !isAddress(address)) {
|
|
28
|
+
throw new Error("A valid 0x address is required (GET /reputation/:address).");
|
|
29
|
+
}
|
|
30
|
+
const [reputation, registry] = await Promise.all([
|
|
31
|
+
getAgentReputation(address),
|
|
32
|
+
queryRegistryForTarget(address),
|
|
33
|
+
]);
|
|
34
|
+
return {
|
|
35
|
+
address,
|
|
36
|
+
reputation: {
|
|
37
|
+
verifiedActionCount: reputation.verifiedCount,
|
|
38
|
+
lastVerifiedActionAt: reputation.lastAttestationAt,
|
|
39
|
+
configured: reputation.configured,
|
|
40
|
+
source: reputation.source,
|
|
41
|
+
},
|
|
42
|
+
registry: {
|
|
43
|
+
isAuthorizedAgent: registry.authorized,
|
|
44
|
+
hasRiskRecord: registry.hasRiskRecord,
|
|
45
|
+
currentMerkleRoot: registry.currentMerkleRoot,
|
|
46
|
+
},
|
|
47
|
+
interpretation: reputation.verifiedCount > 0
|
|
48
|
+
? `${reputation.verifiedCount} SafeHands-verified on-chain action(s); positive track record.`
|
|
49
|
+
: "No SafeHands-verified actions yet: NEUTRAL. Absence of record is not negative; this ledger only records verified-safe actions.",
|
|
50
|
+
network: getActiveNetworkName(),
|
|
51
|
+
...readOnlyMeta(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export async function handleLatestRiskRootIndex() {
|
|
55
|
+
const goldsky = await lookupLatestRiskRootInGoldsky();
|
|
56
|
+
// Optional on-chain registry read: queryRegistryForTarget also returns the current root.
|
|
57
|
+
// It needs a wallet address only to include authorization; use zero address-like fallback
|
|
58
|
+
// only when a valid operator address is supplied by env.
|
|
59
|
+
const referenceWallet = process.env.SAFEHANDS_REGISTRY_REFERENCE_WALLET;
|
|
60
|
+
let onchain = null;
|
|
61
|
+
if (referenceWallet && isAddress(referenceWallet)) {
|
|
62
|
+
onchain = { ...(await queryRegistryForTarget(referenceWallet)) };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
status: goldsky.indexed ? "indexed" : "not_indexed",
|
|
66
|
+
goldsky,
|
|
67
|
+
onchain,
|
|
68
|
+
note: onchain
|
|
69
|
+
? "onchain.currentMerkleRoot is included from SafeHandsRegistry. Goldsky is the fast query layer."
|
|
70
|
+
: "Set SAFEHANDS_REGISTRY_REFERENCE_WALLET to include an on-chain registry read in this endpoint.",
|
|
71
|
+
network: getActiveNetworkName(),
|
|
72
|
+
...readOnlyMeta(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=indexerRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexerRoutes.js","sourceRoot":"","sources":["../../src/api/indexerRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,OAAO,EAAE,2BAA2B;QACpC,MAAM,EAAE,aAAa,EAAE;QACvB,IAAI,EAAE,sIAAsI;QAC5I,mBAAmB,EAAE;YACnB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,iCAAiC;YAC3F,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,gDAAgD;SACtG;QACD,OAAO,EAAE,oBAAoB,EAAE;QAC/B,GAAG,YAAY,EAAE;KAClB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAe;IACzD,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,kBAAkB,CAAC,OAAO,CAAC;QAC3B,sBAAsB,CAAC,OAAwB,CAAC;KACjD,CAAC,CAAC;IACH,OAAO;QACL,OAAO;QACP,UAAU,EAAE;YACV,mBAAmB,EAAE,UAAU,CAAC,aAAa;YAC7C,oBAAoB,EAAE,UAAU,CAAC,iBAAiB;YAClD,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B;QACD,QAAQ,EAAE;YACR,iBAAiB,EAAE,QAAQ,CAAC,UAAU;YACtC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;SAC9C;QACD,cAAc,EACZ,UAAU,CAAC,aAAa,GAAG,CAAC;YAC1B,CAAC,CAAC,GAAG,UAAU,CAAC,aAAa,gEAAgE;YAC7F,CAAC,CAAC,gIAAgI;QACtI,OAAO,EAAE,oBAAoB,EAAE;QAC/B,GAAG,YAAY,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,OAAO,GAAG,MAAM,6BAA6B,EAAE,CAAC;IAEtD,yFAAyF;IACzF,0FAA0F;IAC1F,yDAAyD;IACzD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;IACxE,IAAI,OAAO,GAAmC,IAAI,CAAC;IACnD,IAAI,eAAe,IAAI,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,EAAE,GAAG,CAAC,MAAM,sBAAsB,CAAC,eAAgC,CAAC,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;QACnD,OAAO;QACP,OAAO;QACP,IAAI,EAAE,OAAO;YACX,CAAC,CAAC,gGAAgG;YAClG,CAAC,CAAC,gGAAgG;QACpG,OAAO,EAAE,oBAAoB,EAAE;QAC/B,GAAG,YAAY,EAAE;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type express from "express";
|
|
2
|
+
/**
|
|
3
|
+
* Register the x402 paid bundle entrypoints. MUST be called AFTER the x402 gate is
|
|
4
|
+
* installed on PAID_ROUTE_PATHS, so a verified (non-replayed) payment is guaranteed
|
|
5
|
+
* before any handler here executes.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerPaidRoutes(app: express.Application): void;
|
|
8
|
+
//# sourceMappingURL=paidRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paidRoutes.d.ts","sourceRoot":"","sources":["../../src/api/paidRoutes.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAcnC;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAuJjE"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// ─── SafeHands API — x402 Paid Bundle Entrypoints ─────────────────
|
|
2
|
+
// The additive `/paid/*` routes gated by src/api/x402Gate.ts. Each is a BUNDLE
|
|
3
|
+
// entrypoint: gating/charging happens once at the HTTP boundary (the x402 gate is
|
|
4
|
+
// installed on these paths BEFORE these handlers run), then the handler may fan out
|
|
5
|
+
// to several internal analyzers/tools in-process. Internal helper tools are never
|
|
6
|
+
// individually charged.
|
|
7
|
+
//
|
|
8
|
+
// These are read-only value-added endpoints (risk assessment, token security,
|
|
9
|
+
// simulation, market data, full risk report). They wrap the SAME pure tool handlers
|
|
10
|
+
// used by MCP/Anvita and x402Server — no signer, no wallet, no write path. Registered
|
|
11
|
+
// only after the x402 gate, so by the time a handler executes the payment is verified
|
|
12
|
+
// and non-replayed. Handlers return the standard ToolResponse envelope.
|
|
13
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
import { handleAssessRisk } from "../tools/assessRisk.js";
|
|
15
|
+
import { handleCheckTokenSecurity } from "../tools/checkTokenSecurity.js";
|
|
16
|
+
import { handleSimulateTransaction } from "../tools/simulateTransaction.js";
|
|
17
|
+
import { handleGetTokenPrice } from "../tools/getTokenPrice.js";
|
|
18
|
+
import { handleGetPoolInfo } from "../tools/getPoolInfo.js";
|
|
19
|
+
import { handleSafeHandsRiskReport } from "../tools/safehandsRiskReport.js";
|
|
20
|
+
import { getDodoRoute } from "../lib/dodoApi.js";
|
|
21
|
+
import { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET } from "../lib/constants.js";
|
|
22
|
+
import { fail, ok, productionSafeMessage } from "../lib/toolResponse.js";
|
|
23
|
+
const SOURCE = "guardian_api_x402";
|
|
24
|
+
/**
|
|
25
|
+
* Register the x402 paid bundle entrypoints. MUST be called AFTER the x402 gate is
|
|
26
|
+
* installed on PAID_ROUTE_PATHS, so a verified (non-replayed) payment is guaranteed
|
|
27
|
+
* before any handler here executes.
|
|
28
|
+
*/
|
|
29
|
+
export function registerPaidRoutes(app) {
|
|
30
|
+
app.get("/paid/assess-risk", async (req, res) => {
|
|
31
|
+
try {
|
|
32
|
+
const { action, tokenIn, tokenOut, amount, toAddress, walletAddress } = req.query;
|
|
33
|
+
const result = await handleAssessRisk({
|
|
34
|
+
action: action,
|
|
35
|
+
tokenIn: tokenIn,
|
|
36
|
+
tokenOut: tokenOut,
|
|
37
|
+
amount: amount,
|
|
38
|
+
toAddress: toAddress,
|
|
39
|
+
walletAddress: walletAddress,
|
|
40
|
+
});
|
|
41
|
+
res.json(result);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
app.get("/paid/check-token-security", async (req, res) => {
|
|
48
|
+
try {
|
|
49
|
+
const { tokenAddress, chainId } = req.query;
|
|
50
|
+
const cid = chainId ? parseInt(chainId, 10) : CHAIN_ID;
|
|
51
|
+
const result = await handleCheckTokenSecurity({ tokenAddress: tokenAddress, chainId: cid });
|
|
52
|
+
res.json(result);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
app.get("/paid/simulate-transaction", async (req, res) => {
|
|
59
|
+
try {
|
|
60
|
+
const { action, tokenIn, tokenOut, amount, toAddress, walletAddress } = req.query;
|
|
61
|
+
const result = await handleSimulateTransaction({
|
|
62
|
+
action: action,
|
|
63
|
+
tokenIn: tokenIn,
|
|
64
|
+
tokenOut: tokenOut,
|
|
65
|
+
amount: amount,
|
|
66
|
+
toAddress: toAddress,
|
|
67
|
+
walletAddress: walletAddress,
|
|
68
|
+
});
|
|
69
|
+
res.json(result);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
app.get("/paid/token-price", async (req, res) => {
|
|
76
|
+
try {
|
|
77
|
+
const { token } = req.query;
|
|
78
|
+
if (!token || typeof token !== "string") {
|
|
79
|
+
return res
|
|
80
|
+
.status(400)
|
|
81
|
+
.json(fail("BAD_REQUEST", "Missing required query parameter: token (PROS, USDC, or USDT)", false, SOURCE));
|
|
82
|
+
}
|
|
83
|
+
const result = await handleGetTokenPrice({ token: token });
|
|
84
|
+
res.json(result);
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
app.get("/paid/pool-info", async (req, res) => {
|
|
91
|
+
try {
|
|
92
|
+
const { tokenA, tokenB } = req.query;
|
|
93
|
+
if (!tokenA || !tokenB || typeof tokenA !== "string" || typeof tokenB !== "string") {
|
|
94
|
+
return res
|
|
95
|
+
.status(400)
|
|
96
|
+
.json(fail("BAD_REQUEST", "Missing required query parameters: tokenA and tokenB (PROS, USDC, or USDT)", false, SOURCE));
|
|
97
|
+
}
|
|
98
|
+
const result = await handleGetPoolInfo({ tokenA: tokenA, tokenB: tokenB });
|
|
99
|
+
res.json(result);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
app.get("/paid/swap-route", async (req, res) => {
|
|
106
|
+
try {
|
|
107
|
+
const { tokenIn, tokenOut, amount } = req.query;
|
|
108
|
+
if (!tokenIn ||
|
|
109
|
+
!tokenOut ||
|
|
110
|
+
!amount ||
|
|
111
|
+
typeof tokenIn !== "string" ||
|
|
112
|
+
typeof tokenOut !== "string" ||
|
|
113
|
+
typeof amount !== "string") {
|
|
114
|
+
return res
|
|
115
|
+
.status(400)
|
|
116
|
+
.json(fail("BAD_REQUEST", "Missing required query parameters: tokenIn, tokenOut, amount", false, SOURCE));
|
|
117
|
+
}
|
|
118
|
+
const amountNum = Number(amount);
|
|
119
|
+
if (!Number.isFinite(amountNum) || amountNum <= 0) {
|
|
120
|
+
return res.status(400).json(fail("BAD_REQUEST", "amount must be a positive number", false, SOURCE));
|
|
121
|
+
}
|
|
122
|
+
const quote = await getDodoRoute({
|
|
123
|
+
fromToken: tokenIn,
|
|
124
|
+
toToken: tokenOut,
|
|
125
|
+
amountHuman: amount,
|
|
126
|
+
walletAddress: "0x0000000000000000000000000000000000000001",
|
|
127
|
+
});
|
|
128
|
+
res.json(ok({
|
|
129
|
+
tokenIn,
|
|
130
|
+
tokenOut,
|
|
131
|
+
amountIn: amount,
|
|
132
|
+
estimatedOutput: quote.routeAvailable ? quote.amountOut : null,
|
|
133
|
+
priceImpact: quote.priceImpact,
|
|
134
|
+
routeAvailable: quote.routeAvailable,
|
|
135
|
+
gasEstimate: quote.gasLimit,
|
|
136
|
+
wasSubstituted: quote.wasSubstituted,
|
|
137
|
+
substitutionNote: quote.substitutionNote || null,
|
|
138
|
+
source: "DODO/FaroSwap route API",
|
|
139
|
+
chainId: CHAIN_ID,
|
|
140
|
+
environment: PHAROS_ENVIRONMENT,
|
|
141
|
+
isMainnet: IS_MAINNET,
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
146
|
+
if (message.includes("SWAP_LIQUIDITY_NOT_CONFIGURED")) {
|
|
147
|
+
return res.status(503).json(fail("SWAP_LIQUIDITY_NOT_CONFIGURED", message, false, SOURCE));
|
|
148
|
+
}
|
|
149
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(message), false, SOURCE));
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// Flagship bundle: one payment fans out to preflight (multiple analyzers) + registry
|
|
153
|
+
// lookup in-process. Charged exactly once at the /paid/risk-report entrypoint.
|
|
154
|
+
app.get("/paid/risk-report", async (req, res) => {
|
|
155
|
+
try {
|
|
156
|
+
const { actionType, chainId, amount, tokenAddress, spender, approvalAmount, recipient, walletAddress, includeChecks } = req.query;
|
|
157
|
+
const result = await handleSafeHandsRiskReport({
|
|
158
|
+
actionType: actionType,
|
|
159
|
+
chainId: chainId ? parseInt(chainId, 10) : CHAIN_ID,
|
|
160
|
+
amount: amount,
|
|
161
|
+
tokenAddress: tokenAddress,
|
|
162
|
+
spender: spender,
|
|
163
|
+
approvalAmount: approvalAmount,
|
|
164
|
+
recipient: recipient,
|
|
165
|
+
walletAddress: walletAddress,
|
|
166
|
+
includeChecks: includeChecks === undefined ? undefined : includeChecks !== "false",
|
|
167
|
+
});
|
|
168
|
+
res.status(result.success ? 200 : 400).json(result);
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
res.status(400).json(fail("BAD_REQUEST", productionSafeMessage(e instanceof Error ? e.message : String(e)), false, SOURCE));
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=paidRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paidRoutes.js","sourceRoot":"","sources":["../../src/api/paidRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ReadOnlyChainAccess } from "../lib/analysis/index.js";
|
|
3
|
+
import type { AgentRouteOptions } from "./agentRoutes.js";
|
|
4
|
+
declare const prepareTxSchema: z.ZodObject<{
|
|
5
|
+
to: z.ZodString;
|
|
6
|
+
data: z.ZodOptional<z.ZodString>;
|
|
7
|
+
value: z.ZodOptional<z.ZodString>;
|
|
8
|
+
chainId: z.ZodOptional<z.ZodNumber>;
|
|
9
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
10
|
+
to: z.ZodString;
|
|
11
|
+
data: z.ZodOptional<z.ZodString>;
|
|
12
|
+
value: z.ZodOptional<z.ZodString>;
|
|
13
|
+
chainId: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
15
|
+
to: z.ZodString;
|
|
16
|
+
data: z.ZodOptional<z.ZodString>;
|
|
17
|
+
value: z.ZodOptional<z.ZodString>;
|
|
18
|
+
chainId: z.ZodOptional<z.ZodNumber>;
|
|
19
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
20
|
+
export type PrepareTxInput = z.input<typeof prepareTxSchema>;
|
|
21
|
+
/**
|
|
22
|
+
* POST /prepare/tx — SafeHands-checked, prepare-only unsigned transaction.
|
|
23
|
+
* Returns `preparedTransaction` + `requiresUserSignature: true` (PREPARE_ONLY) when
|
|
24
|
+
* the action is not blocked; `BLOCK` with no prepared tx otherwise.
|
|
25
|
+
*/
|
|
26
|
+
export declare function handlePrepareTx(raw: unknown, access?: ReadOnlyChainAccess, opts?: AgentRouteOptions): Promise<{
|
|
27
|
+
readOnly: true;
|
|
28
|
+
executionAvailable: boolean;
|
|
29
|
+
decision: import("../lib/guardian/decision.js").GuardianDecision;
|
|
30
|
+
/** The underlying SafeHands verdict (ALLOW / BLOCK / REQUIRE_CONFIRMATION). */
|
|
31
|
+
guardianDecision: import("../lib/guardian/decision.js").GuardianDecision;
|
|
32
|
+
riskLevel: import("../lib/analysis/types.js").AnalyzerRiskLevel;
|
|
33
|
+
reasons: string[];
|
|
34
|
+
/** True when the underlying verdict needs explicit user confirmation before signing. */
|
|
35
|
+
confirmationRequired: boolean;
|
|
36
|
+
/** True only when an unsigned tx was prepared (never on BLOCK). */
|
|
37
|
+
requiresUserSignature: boolean;
|
|
38
|
+
preparedTransaction: {
|
|
39
|
+
to: `0x${string}`;
|
|
40
|
+
data: string;
|
|
41
|
+
value: string;
|
|
42
|
+
chainId: number;
|
|
43
|
+
from: null;
|
|
44
|
+
unsigned: boolean;
|
|
45
|
+
signature: null;
|
|
46
|
+
} | null;
|
|
47
|
+
network: import("../lib/networks.js").NetworkName;
|
|
48
|
+
chainId: number;
|
|
49
|
+
policyPreset: string | null;
|
|
50
|
+
policyVersion: string;
|
|
51
|
+
/** SafeHands signs nothing and broadcasts nothing — the caller does both externally. */
|
|
52
|
+
signingAvailable: boolean;
|
|
53
|
+
broadcastAvailable: boolean;
|
|
54
|
+
nextStep: string;
|
|
55
|
+
source: string;
|
|
56
|
+
}>;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=prepareRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareRoutes.d.ts","sourceRoot":"","sources":["../../src/api/prepareRoutes.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;gCAOL,CAAC;AAEjB,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE7D;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,OAAO,EACZ,MAAM,CAAC,EAAE,mBAAmB,EAC5B,IAAI,GAAE,iBAAsB;;;;IAuC1B,+EAA+E;;;;IAI/E,wFAAwF;;IAExF,mEAAmE;;;;;;;;;;;;;;;IAOnE,wFAAwF;;;;;GAS3F"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// ─── SafeHands API — Prepare-Only Transaction Mode ───────
|
|
2
|
+
// Builds an UNSIGNED transaction request object AFTER a SafeHands check. SafeHands
|
|
3
|
+
// holds no keys: it NEVER signs, NEVER broadcasts, NEVER creates/manages a wallet,
|
|
4
|
+
// and NEVER publishes on-chain. The flow:
|
|
5
|
+
// 1. validate the caller's intended call (to / data / value),
|
|
6
|
+
// 2. run the real escalate-only SafeHands check (policy presets apply),
|
|
7
|
+
// 3. if the verdict is BLOCK → prepare NOTHING (a BLOCK is never weakened),
|
|
8
|
+
// otherwise → return the unsigned tx + `requiresUserSignature: true` and a
|
|
9
|
+
// `PREPARE_ONLY` decision (the caller signs + broadcasts externally).
|
|
10
|
+
// Pure + read-only by construction; no signer/wallet/write primitives here.
|
|
11
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import { isAddress } from "viem";
|
|
14
|
+
import { createGuardianAgent } from "../agent/index.js";
|
|
15
|
+
import { getActiveNetwork, getActiveNetworkName } from "../lib/networks.js";
|
|
16
|
+
import { readOnlyMeta } from "./response.js";
|
|
17
|
+
const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
18
|
+
const prepareTxSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
to: z.string(),
|
|
21
|
+
data: z.string().optional(),
|
|
22
|
+
value: z.string().optional(),
|
|
23
|
+
chainId: z.number().optional(),
|
|
24
|
+
})
|
|
25
|
+
.passthrough(); // policyPreset / policy are read by the server (agentPolicyOpts)
|
|
26
|
+
/**
|
|
27
|
+
* POST /prepare/tx — SafeHands-checked, prepare-only unsigned transaction.
|
|
28
|
+
* Returns `preparedTransaction` + `requiresUserSignature: true` (PREPARE_ONLY) when
|
|
29
|
+
* the action is not blocked; `BLOCK` with no prepared tx otherwise.
|
|
30
|
+
*/
|
|
31
|
+
export async function handlePrepareTx(raw, access, opts = {}) {
|
|
32
|
+
const input = prepareTxSchema.parse(raw);
|
|
33
|
+
if (!isAddress(input.to))
|
|
34
|
+
throw new Error("`to` must be a valid address.");
|
|
35
|
+
if (input.to === ZERO_ADDRESS)
|
|
36
|
+
throw new Error("`to` must not be the zero address.");
|
|
37
|
+
if (input.data !== undefined && !/^0x[0-9a-fA-F]*$/.test(input.data)) {
|
|
38
|
+
throw new Error("`data` must be 0x-prefixed hex.");
|
|
39
|
+
}
|
|
40
|
+
if (input.value !== undefined) {
|
|
41
|
+
const n = Number(input.value);
|
|
42
|
+
if (!Number.isFinite(n) || n < 0)
|
|
43
|
+
throw new Error("`value` must be a non-negative number.");
|
|
44
|
+
}
|
|
45
|
+
const network = getActiveNetwork();
|
|
46
|
+
const chainId = input.chainId ?? network.chainId;
|
|
47
|
+
// Real escalate-only SafeHands check (policy presets apply via opts) — a BLOCK can
|
|
48
|
+
// never be weakened by any preset/request.
|
|
49
|
+
const agent = createGuardianAgent({ access, policy: opts.policy, policyPreset: opts.policyPreset });
|
|
50
|
+
const verdict = await agent.check({ to: input.to, data: input.data, value: input.value, chainId });
|
|
51
|
+
const blocked = verdict.decision === "BLOCK";
|
|
52
|
+
const confirmationRequired = verdict.decision === "REQUIRE_CONFIRMATION";
|
|
53
|
+
// Unsigned transaction request object — no signer, no signature, no nonce/gas.
|
|
54
|
+
const preparedTransaction = blocked
|
|
55
|
+
? null
|
|
56
|
+
: {
|
|
57
|
+
to: input.to,
|
|
58
|
+
data: input.data ?? "0x",
|
|
59
|
+
value: input.value ?? "0",
|
|
60
|
+
chainId,
|
|
61
|
+
from: null, // SafeHands holds no keys
|
|
62
|
+
unsigned: true,
|
|
63
|
+
signature: null,
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
decision: verdict.decision,
|
|
67
|
+
/** The underlying SafeHands verdict (ALLOW / BLOCK / REQUIRE_CONFIRMATION). */
|
|
68
|
+
guardianDecision: verdict.decision,
|
|
69
|
+
riskLevel: verdict.riskLevel,
|
|
70
|
+
reasons: verdict.reasons,
|
|
71
|
+
/** True when the underlying verdict needs explicit user confirmation before signing. */
|
|
72
|
+
confirmationRequired,
|
|
73
|
+
/** True only when an unsigned tx was prepared (never on BLOCK). */
|
|
74
|
+
requiresUserSignature: !blocked,
|
|
75
|
+
preparedTransaction,
|
|
76
|
+
network: getActiveNetworkName(),
|
|
77
|
+
chainId,
|
|
78
|
+
policyPreset: verdict.policyPreset,
|
|
79
|
+
policyVersion: verdict.policyVersion,
|
|
80
|
+
/** SafeHands signs nothing and broadcasts nothing — the caller does both externally. */
|
|
81
|
+
signingAvailable: false,
|
|
82
|
+
broadcastAvailable: false,
|
|
83
|
+
nextStep: blocked
|
|
84
|
+
? "Do not prepare: the action is unsafe. Abort and surface the block reason."
|
|
85
|
+
: "WARNING: This prepared tx is for EXTERNAL broadcast only. SafeHands holds no keys. Do not submit this to /broadcast/signed because no internal record was saved.",
|
|
86
|
+
source: "prepare_tx",
|
|
87
|
+
...readOnlyMeta(), // readOnly: true, executionAvailable: false
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=prepareRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareRoutes.js","sourceRoot":"","sources":["../../src/api/prepareRoutes.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,mFAAmF;AACnF,mFAAmF;AACnF,0CAA0C;AAC1C,gEAAgE;AAChE,0EAA0E;AAC1E,8EAA8E;AAC9E,gFAAgF;AAChF,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAE3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAIxD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAElE,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC;KACD,WAAW,EAAE,CAAC,CAAC,iEAAiE;AAInF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAY,EACZ,MAA4B,EAC5B,OAA0B,EAAE;IAE5B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,EAAE,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAEjD,mFAAmF;IACnF,2CAA2C;IAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAkB,CAAC,CAAC;IAEnH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC7C,MAAM,oBAAoB,GAAG,OAAO,CAAC,QAAQ,KAAK,sBAAsB,CAAC;IAEzE,+EAA+E;IAC/E,MAAM,mBAAmB,GAAG,OAAO;QACjC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC;YACE,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI;YACxB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,GAAG;YACzB,OAAO;YACP,IAAI,EAAE,IAAI,EAAE,0BAA0B;YACtC,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;IAEN,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,+EAA+E;QAC/E,gBAAgB,EAAE,OAAO,CAAC,QAAQ;QAClC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,wFAAwF;QACxF,oBAAoB;QACpB,mEAAmE;QACnE,qBAAqB,EAAE,CAAC,OAAO;QAC/B,mBAAmB;QACnB,OAAO,EAAE,oBAAoB,EAAE;QAC/B,OAAO;QACP,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,wFAAwF;QACxF,gBAAgB,EAAE,KAAK;QACvB,kBAAkB,EAAE,KAAK;QACzB,QAAQ,EAAE,OAAO;YACf,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,kKAAkK;QACtK,MAAM,EAAE,YAAY;QACpB,GAAG,YAAY,EAAE,EAAE,4CAA4C;KAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { PharosNetwork } from "../lib/networks.js";
|
|
2
|
+
import type { GuardianDecision } from "../lib/guardian/decision.js";
|
|
3
|
+
import { type RpcEvidence, type GasEvidence } from "../lib/pharos/rpcEvidence.js";
|
|
4
|
+
import type { ReadOnlyChainAccess } from "../lib/analysis/types.js";
|
|
5
|
+
export { ok, fail } from "../lib/toolResponse.js";
|
|
6
|
+
export interface ReadOnlyMeta {
|
|
7
|
+
/** Always true — the API never writes, signs, sends, or publishes. */
|
|
8
|
+
readOnly: true;
|
|
9
|
+
/** False by default (mainnet execution disabled + gates off). */
|
|
10
|
+
executionAvailable: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Stamp a payload as read-only and report whether execution is available. */
|
|
13
|
+
export declare function readOnlyMeta(): ReadOnlyMeta;
|
|
14
|
+
export interface RpcMeta {
|
|
15
|
+
rpcEvidence: RpcEvidence;
|
|
16
|
+
gasEvidence: GasEvidence;
|
|
17
|
+
/** Alias of `rpcEvidence` for spec-compliance (same content). */
|
|
18
|
+
pharosEvidence: RpcEvidence;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read-only RPC + gas capability evidence for a response. Deterministic, offline,
|
|
22
|
+
* and secret-free (no RPC URL/API key — only the redacted provider name). Evidence
|
|
23
|
+
* is metadata: it never relaxes a SafeHands decision.
|
|
24
|
+
*/
|
|
25
|
+
export declare function rpcMeta(network: PharosNetwork, access?: ReadOnlyChainAccess): RpcMeta;
|
|
26
|
+
export interface ExplorerLinks {
|
|
27
|
+
address?: string;
|
|
28
|
+
tx?: string;
|
|
29
|
+
socialScanAddress?: string;
|
|
30
|
+
socialScanTx?: string;
|
|
31
|
+
}
|
|
32
|
+
/** Build read-only explorer links from a network's public explorer URLs. */
|
|
33
|
+
export declare function explorerLinks(network: PharosNetwork, ref: {
|
|
34
|
+
address?: string | null;
|
|
35
|
+
txHash?: string | null;
|
|
36
|
+
}): ExplorerLinks;
|
|
37
|
+
/** Aggregate analyzer decisions to the most severe public decision. */
|
|
38
|
+
export declare function worstDecision(decisions: GuardianDecision[]): GuardianDecision;
|
|
39
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/api/response.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAA4B,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC5G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,IAAI,CAAC;IACf,iEAAiE;IACjE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,IAAI,YAAY,CAE3C;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,iEAAiE;IACjE,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAGrF;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACvD,aAAa,CAaf;AAUD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAG7E"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// ─── SafeHands API — Response Helpers (read-only) ─────────────
|
|
2
|
+
// Shared response shaping for the read-only SafeHands API. `readOnlyMeta()`
|
|
3
|
+
// stamps every payload as read-only and reports executionAvailable (false by
|
|
4
|
+
// default — mainnet executionAllowed=false and all gates default off). No helper
|
|
5
|
+
// here can sign, send, or publish.
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
7
|
+
import { isExecutionAvailable } from "../lib/config.js";
|
|
8
|
+
import { rpcEvidence, gasEvidence } from "../lib/pharos/rpcEvidence.js";
|
|
9
|
+
export { ok, fail } from "../lib/toolResponse.js";
|
|
10
|
+
/** Stamp a payload as read-only and report whether execution is available. */
|
|
11
|
+
export function readOnlyMeta() {
|
|
12
|
+
return { readOnly: true, executionAvailable: isExecutionAvailable() };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read-only RPC + gas capability evidence for a response. Deterministic, offline,
|
|
16
|
+
* and secret-free (no RPC URL/API key — only the redacted provider name). Evidence
|
|
17
|
+
* is metadata: it never relaxes a SafeHands decision.
|
|
18
|
+
*/
|
|
19
|
+
export function rpcMeta(network, access) {
|
|
20
|
+
const evidence = rpcEvidence(network, access);
|
|
21
|
+
return { rpcEvidence: evidence, gasEvidence: gasEvidence(access), pharosEvidence: evidence };
|
|
22
|
+
}
|
|
23
|
+
/** Build read-only explorer links from a network's public explorer URLs. */
|
|
24
|
+
export function explorerLinks(network, ref) {
|
|
25
|
+
const base = network.explorerUrl.replace(/\/+$/, "");
|
|
26
|
+
const social = network.socialScanUrl?.replace(/\/+$/, "");
|
|
27
|
+
const links = {};
|
|
28
|
+
if (ref.address) {
|
|
29
|
+
links.address = `${base}/address/${ref.address}`;
|
|
30
|
+
if (social)
|
|
31
|
+
links.socialScanAddress = `${social}/address/${ref.address}`;
|
|
32
|
+
}
|
|
33
|
+
if (ref.txHash) {
|
|
34
|
+
links.tx = `${base}/tx/${ref.txHash}`;
|
|
35
|
+
if (social)
|
|
36
|
+
links.socialScanTx = `${social}/tx/${ref.txHash}`;
|
|
37
|
+
}
|
|
38
|
+
return links;
|
|
39
|
+
}
|
|
40
|
+
// Severity order: most severe wins when aggregating multiple analyzers.
|
|
41
|
+
const SEVERITY = {
|
|
42
|
+
BLOCK: 3,
|
|
43
|
+
REQUIRE_CONFIRMATION: 2,
|
|
44
|
+
PREPARE_ONLY: 1,
|
|
45
|
+
ALLOW: 0,
|
|
46
|
+
};
|
|
47
|
+
/** Aggregate analyzer decisions to the most severe public decision. */
|
|
48
|
+
export function worstDecision(decisions) {
|
|
49
|
+
if (decisions.length === 0)
|
|
50
|
+
return "REQUIRE_CONFIRMATION";
|
|
51
|
+
return decisions.reduce((worst, d) => (SEVERITY[d] > SEVERITY[worst] ? d : worst), "ALLOW");
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/api/response.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,4EAA4E;AAC5E,6EAA6E;AAC7E,iFAAiF;AACjF,mCAAmC;AACnC,2EAA2E;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAsC,MAAM,8BAA8B,CAAC;AAG5G,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AASlD,8EAA8E;AAC9E,MAAM,UAAU,YAAY;IAC1B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,EAAE,CAAC;AACxE,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,OAAsB,EAAE,MAA4B;IAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAC/F,CAAC;AASD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAC3B,OAAsB,EACtB,GAAwD;IAExD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,CAAC,OAAO,GAAG,GAAG,IAAI,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;QACjD,IAAI,MAAM;YAAE,KAAK,CAAC,iBAAiB,GAAG,GAAG,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,MAAM;YAAE,KAAK,CAAC,YAAY,GAAG,GAAG,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,QAAQ,GAAqC;IACjD,KAAK,EAAE,CAAC;IACR,oBAAoB,EAAE,CAAC;IACvB,YAAY,EAAE,CAAC;IACf,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,SAA6B;IACzD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC1D,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC9F,CAAC"}
|