safehands-pharos 1.4.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 -333
- 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 +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +154 -124
- 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 +1 -1
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +206 -171
- package/dist/demo.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +249 -164
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +127 -65
- 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 +452 -291
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +509 -292
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +101 -78
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +259 -196
- 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 +2 -0
- package/dist/lib/envLoader.d.ts.map +1 -0
- package/dist/lib/envLoader.js +65 -0
- package/dist/lib/envLoader.js.map +1 -0
- 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 +13 -14
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +383 -118
- 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 +53 -58
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +56 -63
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +89 -53
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.js +373 -212
- 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 +45 -26
- package/dist/lib/riskEngine.d.ts.map +1 -1
- package/dist/lib/riskEngine.js +346 -283
- 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 +24 -24
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +110 -88
- 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 +30 -25
- package/dist/lib/toolResponse.d.ts.map +1 -1
- package/dist/lib/toolResponse.js +57 -53
- 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 +33 -37
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +141 -128
- 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 +66 -45
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +152 -85
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +66 -79
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +63 -104
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +49 -43
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +78 -56
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +103 -46
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +240 -95
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +30 -26
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +87 -58
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +84 -79
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +130 -124
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +109 -61
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +289 -141
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +29 -29
- package/dist/tools/explainRisk.d.ts.map +1 -1
- package/dist/tools/explainRisk.js +33 -32
- 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 +21 -21
- package/dist/tools/getAgentWallet.d.ts.map +1 -1
- package/dist/tools/getAgentWallet.js +37 -27
- package/dist/tools/getAgentWallet.js.map +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts +11 -11
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
- package/dist/tools/getAgentWalletBalance.js +102 -70
- package/dist/tools/getAgentWalletBalance.js.map +1 -1
- package/dist/tools/getExecutionHistory.d.ts +49 -49
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +148 -154
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +43 -43
- package/dist/tools/getGasPrice.d.ts.map +0 -0
- package/dist/tools/getGasPrice.js +59 -59
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +75 -75
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +142 -137
- 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 +56 -113
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +110 -117
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getTransactionStatus.d.ts +43 -43
- package/dist/tools/getTransactionStatus.d.ts.map +0 -0
- package/dist/tools/getTransactionStatus.js +59 -59
- package/dist/tools/getTransactionStatus.js.map +0 -0
- package/dist/tools/getWalletBalance.d.ts +103 -68
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +127 -87
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +85 -63
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +136 -88
- 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 +38 -38
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +59 -55
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +92 -77
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
- package/dist/tools/safehandsPreflightCheck.js +174 -47
- package/dist/tools/safehandsPreflightCheck.js.map +1 -1
- package/dist/tools/safehandsRiskReport.d.ts +96 -81
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
- package/dist/tools/safehandsRiskReport.js +48 -28
- package/dist/tools/safehandsRiskReport.js.map +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts +20 -20
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +164 -81
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +28 -14
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
- package/dist/tools/safehandsWalletHealth.js +145 -103
- package/dist/tools/safehandsWalletHealth.js.map +1 -1
- package/dist/tools/safehandsX402Preflight.d.ts +26 -26
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
- package/dist/tools/safehandsX402Preflight.js +86 -65
- package/dist/tools/safehandsX402Preflight.js.map +1 -1
- package/dist/tools/sendPayment.d.ts +63 -57
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +144 -117
- 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 +64 -60
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +116 -83
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +46 -26
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
- package/dist/tools/tokenRegistryStatus.js +126 -96
- 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 +87 -81
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +295 -152
- 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 +409 -252
- 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 -83
- 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 -398
- 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
- package/examples/dashboard/index.html +0 -337
- package/examples/pharos-skill-engine/SKILL.safehands.md +0 -85
- package/examples/pharos-skill-engine/assets/safehands/example-actions.json +0 -49
- package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +0 -11
- package/examples/pharos-skill-engine/references/safehands.md +0 -345
- package/examples/scenario-hack.ts +0 -38
- package/skill/SKILL.md +0 -133
- package/skill/assets/safehands/example-actions.json +0 -49
- package/skill/assets/safehands/policy-defaults.json +0 -11
- package/skill/references/safehands.md +0 -345
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// ─── SafeHands API — Request Schemas (read-only) ──────────────
|
|
2
|
+
// Zod schemas validating API input. Addresses, calldata, tx hashes, values,
|
|
3
|
+
// and network names are validated before any analyzer runs. Invalid input
|
|
4
|
+
// throws a ZodError which the server maps to a safe 400 response. No schema
|
|
5
|
+
// here enables execution, signing, or payment — these only shape read input.
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { isAddress } from "viem";
|
|
9
|
+
import { isNetworkName } from "../lib/networks.js";
|
|
10
|
+
// ── Reusable field validators ──────────────────────────────────────────
|
|
11
|
+
export const addressSchema = z
|
|
12
|
+
.string()
|
|
13
|
+
.refine((v) => isAddress(v), { message: "Must be a valid EVM address (0x + 40 hex)." });
|
|
14
|
+
/** Calldata: 0x followed by an even number of hex chars (may be empty 0x). */
|
|
15
|
+
export const hexDataSchema = z
|
|
16
|
+
.string()
|
|
17
|
+
.regex(/^0x([0-9a-fA-F]{2})*$/, "Must be 0x-prefixed even-length hex calldata.");
|
|
18
|
+
export const txHashSchema = z
|
|
19
|
+
.string()
|
|
20
|
+
.regex(/^0x[0-9a-fA-F]{64}$/, "Must be a 0x-prefixed 32-byte transaction hash.");
|
|
21
|
+
/** Value in wei: a non-negative decimal string or 0x-prefixed hex string. */
|
|
22
|
+
export const valueSchema = z
|
|
23
|
+
.string()
|
|
24
|
+
.regex(/^(0x[0-9a-fA-F]+|[0-9]+)$/, "Must be a decimal or 0x-hex wei value string.");
|
|
25
|
+
export const networkNameSchema = z
|
|
26
|
+
.string()
|
|
27
|
+
.refine((v) => isNetworkName(v), { message: "Unknown network. Use pacific-mainnet or pacific-mainnet." });
|
|
28
|
+
export const chainIdSchema = z.number().int().positive();
|
|
29
|
+
// ── Endpoint request schemas ───────────────────────────────────────────
|
|
30
|
+
/** Universal SafeHands check — every field optional; the router decides. */
|
|
31
|
+
export const guardianCheckSchema = z.object({
|
|
32
|
+
network: networkNameSchema.optional(),
|
|
33
|
+
chainId: chainIdSchema.optional(),
|
|
34
|
+
to: addressSchema.optional(),
|
|
35
|
+
data: hexDataSchema.optional(),
|
|
36
|
+
value: valueSchema.optional(),
|
|
37
|
+
txHash: txHashSchema.optional(),
|
|
38
|
+
policy: z.string().optional(),
|
|
39
|
+
actor: z.string().optional(),
|
|
40
|
+
inputType: z.enum(["tx", "contract", "approval", "safe", "x402", "call"]).optional(),
|
|
41
|
+
/** Optional ecosystem provider hint (e.g. "LayerZero") — evidence only. */
|
|
42
|
+
provider: z.string().optional(),
|
|
43
|
+
/** Optional ecosystem category hint (e.g. "cross_chain") — evidence only. */
|
|
44
|
+
ecosystemCategory: z.string().optional(),
|
|
45
|
+
});
|
|
46
|
+
export const analyzeTxSchema = z.object({
|
|
47
|
+
txHash: txHashSchema,
|
|
48
|
+
network: networkNameSchema.optional(),
|
|
49
|
+
chainId: chainIdSchema.optional(),
|
|
50
|
+
});
|
|
51
|
+
export const analyzeContractSchema = z.object({
|
|
52
|
+
address: addressSchema,
|
|
53
|
+
network: networkNameSchema.optional(),
|
|
54
|
+
chainId: chainIdSchema.optional(),
|
|
55
|
+
});
|
|
56
|
+
export const analyzeApprovalSchema = z.object({
|
|
57
|
+
data: hexDataSchema,
|
|
58
|
+
token: addressSchema.optional(),
|
|
59
|
+
});
|
|
60
|
+
export const analyzeSafeSchema = z.object({
|
|
61
|
+
data: hexDataSchema,
|
|
62
|
+
});
|
|
63
|
+
export const analyzeCalldataSchema = z.object({
|
|
64
|
+
data: hexDataSchema,
|
|
65
|
+
/** Optional token/contract the calldata targets — read-only metadata only. */
|
|
66
|
+
token: addressSchema.optional(),
|
|
67
|
+
});
|
|
68
|
+
export const analyzeX402Schema = z.object({
|
|
69
|
+
url: z.string().min(1, "url is required."),
|
|
70
|
+
paymentAmountUsdc: z.string().optional(),
|
|
71
|
+
paymentTokenAddress: addressSchema.optional(),
|
|
72
|
+
payTo: addressSchema.optional(),
|
|
73
|
+
agentId: z.string().optional(),
|
|
74
|
+
chainId: chainIdSchema.optional(),
|
|
75
|
+
});
|
|
76
|
+
export const broadcastSignedSchema = z.object({
|
|
77
|
+
rawSignedTransaction: z.string().regex(/^0x([0-9a-fA-F]{2})+$/, "Must be 0x-prefixed hex transaction data."),
|
|
78
|
+
preparedTransactionId: z.string().uuid("Must be a valid UUID."),
|
|
79
|
+
preparedTransactionHash: txHashSchema, // 32 bytes hex
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/api/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "../lib/envLoader.js";
|
|
2
|
+
import express from "express";
|
|
3
|
+
/**
|
|
4
|
+
* Build the SafeHands Express app (no listen). Pure construction so it can
|
|
5
|
+
* be imported by tests/tooling without binding a port. All middleware is env-driven
|
|
6
|
+
* via httpHardening.ts.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createGuardianApp(): express.Application;
|
|
9
|
+
/** Start the read-only SafeHands API on 0.0.0.0:PORT (Railway-ready). */
|
|
10
|
+
export declare function startServer(): void;
|
|
11
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAaA,OAAO,qBAAqB,CAAC;AAE7B,OAAO,OAAO,MAAM,SAAS,CAAC;AAiF9B;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAmXvD;AAED,yEAAyE;AACzE,wBAAgB,WAAW,IAAI,IAAI,CAalC"}
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
// ─── SafeHands API — Express Server + Tool Gateway ───────────────
|
|
2
|
+
// Wires the pure read-only handlers (routes.ts) to HTTP. The only chain access
|
|
3
|
+
// is a READ-ONLY viem public client (getCode / estimateGas / getGasPrice /
|
|
4
|
+
// getTransactionReceipt). There is NO wallet client, NO private key, NO signer,
|
|
5
|
+
// NO facilitator, and NO write/publish path — execution is impossible by
|
|
6
|
+
// construction. Separate file/port from x402Server.ts.
|
|
7
|
+
//
|
|
8
|
+
// Production hardening lives in httpHardening.ts (pure, env-driven):
|
|
9
|
+
// PORT/host, CORS allowlist, JSON body limit, rate limiting, error/404 shape.
|
|
10
|
+
// The HTTP listener only starts when this module is run directly (e.g.
|
|
11
|
+
// `node dist/api/server.js`), so importing it (tests/tools) never binds a port.
|
|
12
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
13
|
+
import "../lib/envLoader.js";
|
|
14
|
+
import { pathToFileURL } from "url";
|
|
15
|
+
import express from "express";
|
|
16
|
+
import { createPublicClient, defineChain, http } from "viem";
|
|
17
|
+
import { getActiveNetwork, resolveRpcUrl } from "../lib/networks.js";
|
|
18
|
+
import { PharosReadOnlyRpc } from "../lib/pharos/rpc.js";
|
|
19
|
+
import { handleHealth, handleInfraStatus, handlePublicConfig, handleGuardianCheck, handleAnalyzeTx, handleAnalyzeContract, handleAnalyzeApproval, handleAnalyzeSafe, handleAnalyzeCalldata, handleAnalyzeX402, } from "./routes.js";
|
|
20
|
+
import { ok, fail } from "../lib/toolResponse.js";
|
|
21
|
+
import { handleAgentCheck, handleAgentA2ACheck } from "./agentRoutes.js";
|
|
22
|
+
import { handlePrepareTx } from "./prepareRoutes.js";
|
|
23
|
+
import { handleWalletPrepare } from "./walletPrepareRoutes.js";
|
|
24
|
+
import { handleBroadcastSigned, handleGetBroadcastAttestationStatus } from "./broadcastRoutes.js";
|
|
25
|
+
import { handleGoldskyStatus, handleLatestRiskRootIndex, handleAgentReputation } from "./indexerRoutes.js";
|
|
26
|
+
import { assertProductionPosture } from "../lib/productionGuards.js";
|
|
27
|
+
import { handleActivitySummary, handleActivityRecent, handleMetricsPublic } from "./activityRoutes.js";
|
|
28
|
+
import { listHostedTools, invokeHostedTool, isWriteTool } from "./toolRoutes.js";
|
|
29
|
+
import { DEMO_PAGE_HTML } from "./consolePage.js";
|
|
30
|
+
import { buildX402Gate } from "./x402Gate.js";
|
|
31
|
+
import { registerPaidRoutes } from "./paidRoutes.js";
|
|
32
|
+
import { BIND_HOST, resolvePort, isProduction, resolveCorsConfig, corsOriginValue, resolveJsonLimit, resolveQuotaConfig, resolveActivityConfig, resolveLoggingConfig, errorResponseBody, notFoundBody, } from "./httpHardening.js";
|
|
33
|
+
import { resolveRequestId } from "../lib/observability/requestId.js";
|
|
34
|
+
import { logRequest } from "../lib/observability/logger.js";
|
|
35
|
+
import { loadApiKeyConfig, resolveApiKey, evaluateAccess } from "../lib/observability/apiKey.js";
|
|
36
|
+
import { buildAccessContext } from "../lib/observability/accessContext.js";
|
|
37
|
+
import { QuotaLimiter, tierForCaller } from "../lib/observability/quota.js";
|
|
38
|
+
import { resolvePresetName, presetPolicy, sanitizeRequestPolicy } from "../lib/policy/policyPresets.js";
|
|
39
|
+
import { activityStore } from "../lib/observability/activityStore.js";
|
|
40
|
+
import { toActivityItem, callerTypeForEndpoint } from "../lib/observability/sanitize.js";
|
|
41
|
+
// ── Read-only chain access (no signer, no wallet) ──────────────────────
|
|
42
|
+
function buildReadOnlyAccess() {
|
|
43
|
+
const network = getActiveNetwork();
|
|
44
|
+
const rpcUrl = resolveRpcUrl(network);
|
|
45
|
+
const chain = defineChain({
|
|
46
|
+
id: network.chainId,
|
|
47
|
+
name: network.label,
|
|
48
|
+
nativeCurrency: { name: network.nativeToken, symbol: network.nativeToken, decimals: 18 },
|
|
49
|
+
rpcUrls: { default: { http: [rpcUrl] } },
|
|
50
|
+
testnet: !network.isMainnet,
|
|
51
|
+
});
|
|
52
|
+
const client = createPublicClient({ chain, transport: http(undefined, { timeout: 10_000 }) });
|
|
53
|
+
// Single whitelist chokepoint: every live read passes the read-only method gate
|
|
54
|
+
// (rpc.guarded throws fail-closed for any non-read method) before the viem call.
|
|
55
|
+
const rpc = new PharosReadOnlyRpc({ network, url: rpcUrl });
|
|
56
|
+
return {
|
|
57
|
+
getCode: (address) => rpc.guarded("eth_getCode", () => client.getCode({ address })),
|
|
58
|
+
estimateGas: (args) => rpc.guarded("eth_estimateGas", () => client.estimateGas(args)),
|
|
59
|
+
getGasPrice: () => rpc.guarded("eth_gasPrice", () => client.getGasPrice()),
|
|
60
|
+
getTransactionReceipt: (hash) => rpc.guarded("eth_getTransactionReceipt", () => client.getTransactionReceipt({ hash })),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// ── Error mapping (consistent shape; never leaks stack traces) ─────────
|
|
64
|
+
function sendError(res, err) {
|
|
65
|
+
const { status, body } = errorResponseBody(err, { production: isProduction() });
|
|
66
|
+
res.status(status).json(body);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Build the SafeHands Express app (no listen). Pure construction so it can
|
|
70
|
+
* be imported by tests/tooling without binding a port. All middleware is env-driven
|
|
71
|
+
* via httpHardening.ts.
|
|
72
|
+
*/
|
|
73
|
+
export function createGuardianApp() {
|
|
74
|
+
const chainAccess = buildReadOnlyAccess();
|
|
75
|
+
const cors = resolveCorsConfig();
|
|
76
|
+
const quotaCfg = resolveQuotaConfig();
|
|
77
|
+
const quota = new QuotaLimiter(quotaCfg);
|
|
78
|
+
const jsonLimit = resolveJsonLimit();
|
|
79
|
+
const apiKeyCfg = loadApiKeyConfig();
|
|
80
|
+
const activityCfg = resolveActivityConfig();
|
|
81
|
+
const loggingCfg = resolveLoggingConfig();
|
|
82
|
+
// Size/reset the in-memory activity ring from env at construction.
|
|
83
|
+
activityStore.configure(activityCfg.capacity);
|
|
84
|
+
const app = express();
|
|
85
|
+
app.disable("x-powered-by");
|
|
86
|
+
// Trust proxy — REQUIRED for correct client IP behind a reverse proxy/CDN, or
|
|
87
|
+
// the rate-limit buckets on req.ip collapse every client into the proxy's IP.
|
|
88
|
+
// Env-driven (default off = direct connection). "true" | integer hops | preset.
|
|
89
|
+
const tp = process.env.SAFEHANDS_TRUST_PROXY;
|
|
90
|
+
if (tp && tp !== "false") {
|
|
91
|
+
const hops = Number(tp);
|
|
92
|
+
app.set("trust proxy", tp === "true" ? true : Number.isInteger(hops) ? hops : tp);
|
|
93
|
+
}
|
|
94
|
+
// ── Request ID + structured request log (first; even 404/429 get an id) ──
|
|
95
|
+
app.use((req, res, next) => {
|
|
96
|
+
const requestId = resolveRequestId(req.headers["x-request-id"]);
|
|
97
|
+
const startNs = process.hrtime.bigint();
|
|
98
|
+
res.locals.requestId = requestId;
|
|
99
|
+
res.locals.startNs = startNs;
|
|
100
|
+
res.setHeader("X-Request-Id", requestId);
|
|
101
|
+
res.on("finish", () => {
|
|
102
|
+
const durationMs = Math.round(Number(process.hrtime.bigint() - startNs) / 1e6);
|
|
103
|
+
logRequest({
|
|
104
|
+
ts: new Date().toISOString(),
|
|
105
|
+
level: "info",
|
|
106
|
+
event: "request",
|
|
107
|
+
requestId,
|
|
108
|
+
method: req.method,
|
|
109
|
+
path: req.path,
|
|
110
|
+
status: res.statusCode,
|
|
111
|
+
durationMs,
|
|
112
|
+
callerType: res.locals.callerType ?? null,
|
|
113
|
+
decision: res.locals.decision ?? null,
|
|
114
|
+
rateLimited: res.locals.rateLimited === true,
|
|
115
|
+
apiKeyId: res.locals.apiKeyId ?? null,
|
|
116
|
+
}, loggingCfg);
|
|
117
|
+
});
|
|
118
|
+
next();
|
|
119
|
+
});
|
|
120
|
+
// CORS (env-driven allowlist; wildcard default for the public read-only API) + headers.
|
|
121
|
+
app.use((req, res, next) => {
|
|
122
|
+
const originValue = corsOriginValue(req.headers.origin, cors);
|
|
123
|
+
if (originValue)
|
|
124
|
+
res.setHeader("Access-Control-Allow-Origin", originValue);
|
|
125
|
+
if (cors.mode === "allowlist")
|
|
126
|
+
res.setHeader("Vary", "Origin");
|
|
127
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
128
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Api-Key, Authorization, X-Request-Id");
|
|
129
|
+
res.setHeader("Access-Control-Expose-Headers", "X-Request-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After");
|
|
130
|
+
res.setHeader("X-Content-Type-Options", "nosniff");
|
|
131
|
+
res.setHeader("Referrer-Policy", "no-referrer");
|
|
132
|
+
res.setHeader("X-Frame-Options", "DENY"); // clickjacking protection
|
|
133
|
+
res.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains"); // honored over HTTPS
|
|
134
|
+
if (req.method === "OPTIONS")
|
|
135
|
+
return res.sendStatus(204);
|
|
136
|
+
req.setTimeout(15_000);
|
|
137
|
+
next();
|
|
138
|
+
});
|
|
139
|
+
app.use(express.json({ limit: jsonLimit }));
|
|
140
|
+
// ── Optional API-key access control (open by default) ───────────────────
|
|
141
|
+
// Public read API stays open unless an operator configures keys AND sets
|
|
142
|
+
// SAFEHANDS_REQUIRE_API_KEY=true. An explicitly invalid key is always 401.
|
|
143
|
+
app.use((req, res, next) => {
|
|
144
|
+
const resolution = resolveApiKey(req.headers, apiKeyCfg);
|
|
145
|
+
// Sanitized caller identity (no raw key/headers/IP/payload) for activity + logs.
|
|
146
|
+
const accessCtx = buildAccessContext({
|
|
147
|
+
path: req.path,
|
|
148
|
+
resolution,
|
|
149
|
+
body: req.body,
|
|
150
|
+
requestId: res.locals.requestId,
|
|
151
|
+
});
|
|
152
|
+
res.locals.access = accessCtx;
|
|
153
|
+
res.locals.apiKeyId = accessCtx.keyId; // backward-compat for the request log
|
|
154
|
+
res.locals.apiKeyStatus = resolution.status; // "valid" | "anonymous" | "invalid" — used by the write-auth gate
|
|
155
|
+
const gate = evaluateAccess(req.path, resolution, apiKeyCfg);
|
|
156
|
+
res.locals.authGate = gate; // Save gate for evaluation after quota
|
|
157
|
+
next();
|
|
158
|
+
});
|
|
159
|
+
// Tiered in-memory quota (Phase 8B). Bucket key = TRUSTED identifier only:
|
|
160
|
+
// `keyId` for a valid key, else the client IP — never untrusted body identity.
|
|
161
|
+
// The access tier (anonymous | api-key | agent | a2a) selects the limit. Adds
|
|
162
|
+
// X-RateLimit-* headers (+ Retry-After on 429). No keys/IPs in headers or body.
|
|
163
|
+
// /health is exempt so the Railway liveness probe is never throttled.
|
|
164
|
+
if (quotaCfg.enabled) {
|
|
165
|
+
app.use((req, res, next) => {
|
|
166
|
+
if (req.path === "/health")
|
|
167
|
+
return next();
|
|
168
|
+
const ctx = res.locals.access;
|
|
169
|
+
const tier = tierForCaller(ctx?.callerType ?? "anonymous");
|
|
170
|
+
const identifier = ctx?.keyId ?? req.ip ?? "unknown";
|
|
171
|
+
const state = quota.consume(tier, identifier);
|
|
172
|
+
res.setHeader("X-RateLimit-Limit", String(state.limit));
|
|
173
|
+
res.setHeader("X-RateLimit-Remaining", String(state.remaining));
|
|
174
|
+
res.setHeader("X-RateLimit-Reset", String(state.resetAtSec));
|
|
175
|
+
if (state.limited) {
|
|
176
|
+
res.setHeader("Retry-After", String(state.retryAfterSec));
|
|
177
|
+
res.locals.rateLimited = true;
|
|
178
|
+
activityStore.recordRateLimited(tier);
|
|
179
|
+
const { body } = errorResponseBody(new Error("Too many requests"), { production: isProduction() });
|
|
180
|
+
return res.status(429).json({ ...body, error: { ...body.error, code: "RATE_LIMITED", retryable: true } });
|
|
181
|
+
}
|
|
182
|
+
return next();
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
// ── Auth Rejection Gate (runs AFTER Quota so brute-force attempts are rate-limited) ──
|
|
186
|
+
app.use((req, res, next) => {
|
|
187
|
+
const gate = res.locals.authGate;
|
|
188
|
+
if (gate && !gate.allow) {
|
|
189
|
+
const status = gate.code === "INSUFFICIENT_SCOPE" ? 403 : 401;
|
|
190
|
+
const message = gate.code === "API_KEY_REQUIRED"
|
|
191
|
+
? "A valid API key is required for this endpoint."
|
|
192
|
+
: gate.code === "INSUFFICIENT_SCOPE"
|
|
193
|
+
? "The provided API key lacks the required scope for this endpoint."
|
|
194
|
+
: "Invalid API key.";
|
|
195
|
+
return res.status(status).json(fail(gate.code ?? "UNAUTHORIZED", message, false, "guardian_api"));
|
|
196
|
+
}
|
|
197
|
+
next();
|
|
198
|
+
});
|
|
199
|
+
// ── Activity recording + response helpers (decision/analysis endpoints) ─
|
|
200
|
+
function recordDecision(req, res, endpoint, payload) {
|
|
201
|
+
const callerType = callerTypeForEndpoint(endpoint);
|
|
202
|
+
res.locals.callerType = callerType;
|
|
203
|
+
if (payload && typeof payload === "object" && "decision" in payload) {
|
|
204
|
+
res.locals.decision = payload.decision;
|
|
205
|
+
}
|
|
206
|
+
if (!activityCfg.enabled)
|
|
207
|
+
return;
|
|
208
|
+
try {
|
|
209
|
+
const access = res.locals.access;
|
|
210
|
+
activityStore.record(toActivityItem({
|
|
211
|
+
endpoint,
|
|
212
|
+
callerType,
|
|
213
|
+
requestId: res.locals.requestId ?? "unknown",
|
|
214
|
+
body: req.body,
|
|
215
|
+
payload,
|
|
216
|
+
access,
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
// recording must never affect the response
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function sendOk(req, res, data) {
|
|
224
|
+
const requestId = res.locals.requestId;
|
|
225
|
+
res.json(ok({ ...data, requestId }));
|
|
226
|
+
}
|
|
227
|
+
// State-changing endpoints (write tools, signed broadcast) must NEVER ride the
|
|
228
|
+
// open read origin. Require a VALID API key regardless of SAFEHANDS_REQUIRE_API_KEY.
|
|
229
|
+
// Fail-closed: with no keys configured, a write call cannot authenticate → refused.
|
|
230
|
+
function writeAuthOk(res) {
|
|
231
|
+
return res.locals.apiKeyStatus === "valid";
|
|
232
|
+
}
|
|
233
|
+
function denyWriteAuth(res) {
|
|
234
|
+
return res.status(401).json(fail("API_KEY_REQUIRED_FOR_WRITE", "This state-changing endpoint requires a valid API key. Configure SAFEHANDS_API_KEYS and present it via X-Api-Key or Authorization: Bearer.", false, "guardian_api"));
|
|
235
|
+
}
|
|
236
|
+
// Resolve the policy preset (tighten-only) + sanitize request overrides for the
|
|
237
|
+
// agent path. The result is fed to the EXISTING escalate-only applyPolicy, so it
|
|
238
|
+
// can never weaken a decision. Agent endpoints default to the `agent` preset.
|
|
239
|
+
function agentPolicyOpts(reqBody) {
|
|
240
|
+
const body = reqBody && typeof reqBody === "object" ? reqBody : {};
|
|
241
|
+
const policyPreset = resolvePresetName(body.policyPreset, "agent", process.env.SAFEHANDS_POLICY_PRESET);
|
|
242
|
+
const policy = sanitizeRequestPolicy(presetPolicy(policyPreset), body.policy);
|
|
243
|
+
return { policy, policyPreset };
|
|
244
|
+
}
|
|
245
|
+
// ── SafeHands/read routes ─────────────────────────────────────────────
|
|
246
|
+
// Interactive browser demo (static HTML, no keys, same-origin tool calls).
|
|
247
|
+
app.get("/demo", (_req, res) => {
|
|
248
|
+
// Static, server-controlled HTML with same-origin tool calls. Lock it down:
|
|
249
|
+
// no framing, and restrict resource origins. Inline is allowed because the
|
|
250
|
+
// console page ships its own inline script/style and reflects no user input.
|
|
251
|
+
res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; frame-ancestors 'none'");
|
|
252
|
+
res.type("html").send(DEMO_PAGE_HTML);
|
|
253
|
+
});
|
|
254
|
+
app.get("/health", (req, res) => sendOk(req, res, handleHealth()));
|
|
255
|
+
app.get("/infra/status", (req, res) => sendOk(req, res, handleInfraStatus()));
|
|
256
|
+
app.get("/public-config", (req, res) => sendOk(req, res, handlePublicConfig()));
|
|
257
|
+
app.post("/guardian/check", async (req, res) => {
|
|
258
|
+
try {
|
|
259
|
+
const payload = await handleGuardianCheck(req.body ?? {}, chainAccess);
|
|
260
|
+
recordDecision(req, res, "/guardian/check", payload);
|
|
261
|
+
sendOk(req, res, payload);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
sendError(res, err);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
app.post("/analyze/tx", async (req, res) => {
|
|
268
|
+
try {
|
|
269
|
+
const payload = await handleAnalyzeTx(req.body ?? {}, chainAccess);
|
|
270
|
+
recordDecision(req, res, "/analyze/tx", payload);
|
|
271
|
+
sendOk(req, res, payload);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
sendError(res, err);
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
app.post("/analyze/contract", async (req, res) => {
|
|
278
|
+
try {
|
|
279
|
+
const payload = await handleAnalyzeContract(req.body ?? {}, chainAccess);
|
|
280
|
+
recordDecision(req, res, "/analyze/contract", payload);
|
|
281
|
+
sendOk(req, res, payload);
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
sendError(res, err);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
app.post("/analyze/approval", (req, res) => {
|
|
288
|
+
try {
|
|
289
|
+
const payload = handleAnalyzeApproval(req.body ?? {});
|
|
290
|
+
recordDecision(req, res, "/analyze/approval", payload);
|
|
291
|
+
sendOk(req, res, payload);
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
sendError(res, err);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
app.post("/analyze/safe", async (req, res) => {
|
|
298
|
+
try {
|
|
299
|
+
const payload = await handleAnalyzeSafe(req.body ?? {});
|
|
300
|
+
recordDecision(req, res, "/analyze/safe", payload);
|
|
301
|
+
sendOk(req, res, payload);
|
|
302
|
+
}
|
|
303
|
+
catch (err) {
|
|
304
|
+
sendError(res, err);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
app.post("/analyze/calldata", (req, res) => {
|
|
308
|
+
try {
|
|
309
|
+
const payload = handleAnalyzeCalldata(req.body ?? {});
|
|
310
|
+
recordDecision(req, res, "/analyze/calldata", payload);
|
|
311
|
+
sendOk(req, res, payload);
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
sendError(res, err);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
app.post("/analyze/x402", (req, res) => {
|
|
318
|
+
try {
|
|
319
|
+
const payload = handleAnalyzeX402(req.body ?? {});
|
|
320
|
+
recordDecision(req, res, "/analyze/x402", payload);
|
|
321
|
+
sendOk(req, res, payload);
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
sendError(res, err);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
// ── SafeHands Agent endpoints (real SafeHandsGuardianAgent, read-only) ──
|
|
328
|
+
app.post("/agent/check", async (req, res) => {
|
|
329
|
+
try {
|
|
330
|
+
const payload = await handleAgentCheck(req.body ?? {}, chainAccess, agentPolicyOpts(req.body));
|
|
331
|
+
recordDecision(req, res, "/agent/check", payload);
|
|
332
|
+
sendOk(req, res, payload);
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
sendError(res, err);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
app.post("/agent/a2a/check", async (req, res) => {
|
|
339
|
+
try {
|
|
340
|
+
const payload = await handleAgentA2ACheck(req.body ?? {}, chainAccess, agentPolicyOpts(req.body));
|
|
341
|
+
recordDecision(req, res, "/agent/a2a/check", payload);
|
|
342
|
+
sendOk(req, res, payload);
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
sendError(res, err);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
// ── Prepare-only unsigned transaction — read-only; never signs/broadcasts ──
|
|
349
|
+
app.post("/prepare/tx", async (req, res) => {
|
|
350
|
+
try {
|
|
351
|
+
const payload = await handlePrepareTx(req.body ?? {}, chainAccess, agentPolicyOpts(req.body));
|
|
352
|
+
recordDecision(req, res, "/prepare/tx", payload);
|
|
353
|
+
sendOk(req, res, payload);
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
sendError(res, err);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
// ── Wallet-ready transaction handoff — read-only; never signs/broadcasts ──
|
|
360
|
+
// Reads wallet context (userAddress/from) from the request and returns a wallet-ready
|
|
361
|
+
// request for an EXTERNAL wallet to sign + send. SafeHands holds no key and creates no wallet.
|
|
362
|
+
app.post("/wallet/prepare", async (req, res) => {
|
|
363
|
+
try {
|
|
364
|
+
const payload = await handleWalletPrepare(req.body ?? {}, chainAccess, agentPolicyOpts(req.body));
|
|
365
|
+
recordDecision(req, res, "/wallet/prepare", payload);
|
|
366
|
+
sendOk(req, res, payload);
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
sendError(res, err);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
// ── Verified Broadcast ──
|
|
373
|
+
app.post("/broadcast/signed", async (req, res) => {
|
|
374
|
+
try {
|
|
375
|
+
if (!writeAuthOk(res))
|
|
376
|
+
return denyWriteAuth(res);
|
|
377
|
+
const payload = await handleBroadcastSigned(req.body ?? {});
|
|
378
|
+
recordDecision(req, res, "/broadcast/signed", payload);
|
|
379
|
+
sendOk(req, res, payload);
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
sendError(res, err);
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
app.get("/attestation/:txHash", async (req, res) => {
|
|
386
|
+
try {
|
|
387
|
+
const payload = await handleGetBroadcastAttestationStatus(req.params.txHash);
|
|
388
|
+
sendOk(req, res, payload);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
sendError(res, err);
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
app.get("/goldsky/status", (req, res) => {
|
|
395
|
+
try {
|
|
396
|
+
sendOk(req, res, handleGoldskyStatus());
|
|
397
|
+
}
|
|
398
|
+
catch (err) {
|
|
399
|
+
sendError(res, err);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
app.get("/registry/latest", async (req, res) => {
|
|
403
|
+
try {
|
|
404
|
+
sendOk(req, res, await handleLatestRiskRootIndex());
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
sendError(res, err);
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
app.get("/reputation/:address", async (req, res) => {
|
|
411
|
+
try {
|
|
412
|
+
sendOk(req, res, await handleAgentReputation(req.params.address));
|
|
413
|
+
}
|
|
414
|
+
catch (err) {
|
|
415
|
+
sendError(res, err);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
// ── Public activity feed + aggregate metrics (read-only) ──────
|
|
419
|
+
app.get("/activity/summary", (req, res) => {
|
|
420
|
+
try {
|
|
421
|
+
sendOk(req, res, handleActivitySummary());
|
|
422
|
+
}
|
|
423
|
+
catch (err) {
|
|
424
|
+
sendError(res, err);
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
app.get("/activity/recent", (req, res) => {
|
|
428
|
+
try {
|
|
429
|
+
sendOk(req, res, handleActivityRecent(req.query));
|
|
430
|
+
}
|
|
431
|
+
catch (err) {
|
|
432
|
+
sendError(res, err);
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
app.get("/metrics/public", (req, res) => {
|
|
436
|
+
try {
|
|
437
|
+
sendOk(req, res, handleMetricsPublic());
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
sendError(res, err);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
// ── Full SafeHands hosted tool gateway (same 33 tools as MCP/Anvita) ──
|
|
444
|
+
app.get("/tools", (req, res) => {
|
|
445
|
+
try {
|
|
446
|
+
sendOk(req, res, listHostedTools());
|
|
447
|
+
}
|
|
448
|
+
catch (err) {
|
|
449
|
+
sendError(res, err);
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
app.post("/tools/:toolName", async (req, res) => {
|
|
453
|
+
try {
|
|
454
|
+
// Read tools stay open; write tools require a valid API key (never open-origin execution).
|
|
455
|
+
if (isWriteTool(req.params.toolName) && !writeAuthOk(res))
|
|
456
|
+
return denyWriteAuth(res);
|
|
457
|
+
const payload = await invokeHostedTool(req.params.toolName, req.body ?? {});
|
|
458
|
+
res.status(payload.success ? 200 : 400).json(payload);
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
sendError(res, err);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
// ── x402 paid bundle entrypoints (/paid/*) ────────────────────────────
|
|
465
|
+
// Zero-custody gate: an EXTERNAL facilitator verifies/settles; the service holds no
|
|
466
|
+
// key. Installed BEFORE the handlers so paid logic never runs pre-payment; fail-closed
|
|
467
|
+
// (503) when unconfigured. Sits after quota/auth so 402 challenges stay rate-limited.
|
|
468
|
+
const x402Gate = buildX402Gate();
|
|
469
|
+
x402Gate.install(app);
|
|
470
|
+
registerPaidRoutes(app);
|
|
471
|
+
// ── Safe 404 (consistent shape) for any unmatched route/method ────────
|
|
472
|
+
app.use((req, res) => {
|
|
473
|
+
res.status(404).json(notFoundBody(req.method, req.path));
|
|
474
|
+
});
|
|
475
|
+
// ── Global error handler (last) — catches throws from middleware/body-parser
|
|
476
|
+
// that escape the per-route try/catch. ALWAYS genericized (production shape)
|
|
477
|
+
// so a stack trace can never leak regardless of NODE_ENV. ─────────────
|
|
478
|
+
app.use((err, _req, res, next) => {
|
|
479
|
+
if (res.headersSent)
|
|
480
|
+
return next(err);
|
|
481
|
+
const { status, body } = errorResponseBody(err, { production: true });
|
|
482
|
+
res.status(status).json(body);
|
|
483
|
+
});
|
|
484
|
+
return app;
|
|
485
|
+
}
|
|
486
|
+
/** Start the read-only SafeHands API on 0.0.0.0:PORT (Railway-ready). */
|
|
487
|
+
export function startServer() {
|
|
488
|
+
// Fail-fast / warn on unsafe public-hosting posture before binding (production only).
|
|
489
|
+
assertProductionPosture();
|
|
490
|
+
const app = createGuardianApp();
|
|
491
|
+
const port = resolvePort();
|
|
492
|
+
app.listen(port, BIND_HOST, () => {
|
|
493
|
+
const network = getActiveNetwork();
|
|
494
|
+
console.log(`✅ SafeHands API + Tool Gateway on http://${BIND_HOST}:${port}`);
|
|
495
|
+
console.log(`📡 Active network: ${network.label} (chainId ${network.chainId}, ${network.nativeToken})`);
|
|
496
|
+
console.log(`🔐 Default-safe: read/check routes are open; hosted tools and user-signed broadcast stay env-gated.`);
|
|
497
|
+
console.log(`🆓 GET /health, /infra/status, /public-config · POST /guardian/check, /analyze/{tx,contract,approval,safe,calldata,x402}, /agent/check, /agent/a2a/check, /prepare/tx, /wallet/prepare, /broadcast/signed · GET /tools · POST /tools/:toolName`);
|
|
498
|
+
console.log(`📊 Observability: GET /activity/summary, /activity/recent, /metrics/public · X-Request-Id on every response`);
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
// Start ONLY when run directly (e.g. `node dist/api/server.js`); importing never binds.
|
|
502
|
+
const invokedDirectly = Boolean(process.argv[1]) && import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
503
|
+
if (invokedDirectly)
|
|
504
|
+
startServer();
|
|
505
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
|