safehands-pharos 1.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/policies/default.json +15 -0
- package/.env.example +81 -64
- package/README.md +301 -444
- package/SECURITY.md +112 -0
- package/SKILL.md +59 -0
- package/contracts/SafeHandsAttestation.sol +182 -0
- package/contracts/SafeHandsRegistry.sol +149 -0
- package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
- package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
- package/dist/agent/SafeHandsGuardianAgent.js +98 -0
- package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
- package/dist/agent/agentDecisionFormatter.d.ts +43 -0
- package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
- package/dist/agent/agentDecisionFormatter.js +96 -0
- package/dist/agent/agentDecisionFormatter.js.map +1 -0
- package/dist/agent/agentEnrich.d.ts +28 -0
- package/dist/agent/agentEnrich.d.ts.map +1 -0
- package/dist/agent/agentEnrich.js +99 -0
- package/dist/agent/agentEnrich.js.map +1 -0
- package/dist/agent/agentIntentClassifier.d.ts +44 -0
- package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
- package/dist/agent/agentIntentClassifier.js +77 -0
- package/dist/agent/agentIntentClassifier.js.map +1 -0
- package/dist/agent/agentPolicyResolver.d.ts +44 -0
- package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
- package/dist/agent/agentPolicyResolver.js +94 -0
- package/dist/agent/agentPolicyResolver.js.map +1 -0
- package/dist/agent/agentRuntime.d.ts +12 -0
- package/dist/agent/agentRuntime.d.ts.map +1 -0
- package/dist/agent/agentRuntime.js +31 -0
- package/dist/agent/agentRuntime.js.map +1 -0
- package/dist/agent/agentToolRouter.d.ts +24 -0
- package/dist/agent/agentToolRouter.d.ts.map +1 -0
- package/dist/agent/agentToolRouter.js +89 -0
- package/dist/agent/agentToolRouter.js.map +1 -0
- package/dist/agent/guardianOperator.d.ts +35 -0
- package/dist/agent/guardianOperator.d.ts.map +1 -0
- package/dist/agent/guardianOperator.js +65 -0
- package/dist/agent/guardianOperator.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +14 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/api/activityRoutes.d.ts +70 -0
- package/dist/api/activityRoutes.d.ts.map +1 -0
- package/dist/api/activityRoutes.js +100 -0
- package/dist/api/activityRoutes.js.map +1 -0
- package/dist/api/agentRoutes.d.ts +16 -0
- package/dist/api/agentRoutes.d.ts.map +1 -0
- package/dist/api/agentRoutes.js +37 -0
- package/dist/api/agentRoutes.js.map +1 -0
- package/dist/api/broadcastRoutes.d.ts +34 -0
- package/dist/api/broadcastRoutes.d.ts.map +1 -0
- package/dist/api/broadcastRoutes.js +147 -0
- package/dist/api/broadcastRoutes.js.map +1 -0
- package/dist/api/consolePage.d.ts +2 -0
- package/dist/api/consolePage.d.ts.map +1 -0
- package/dist/api/consolePage.js +206 -0
- package/dist/api/consolePage.js.map +1 -0
- package/dist/api/httpHardening.d.ts +75 -0
- package/dist/api/httpHardening.d.ts.map +1 -0
- package/dist/api/httpHardening.js +122 -0
- package/dist/api/httpHardening.js.map +1 -0
- package/dist/api/indexerRoutes.d.ts +46 -0
- package/dist/api/indexerRoutes.d.ts.map +1 -0
- package/dist/api/indexerRoutes.js +75 -0
- package/dist/api/indexerRoutes.js.map +1 -0
- package/dist/api/paidRoutes.d.ts +8 -0
- package/dist/api/paidRoutes.d.ts.map +1 -0
- package/dist/api/paidRoutes.js +175 -0
- package/dist/api/paidRoutes.js.map +1 -0
- package/dist/api/prepareRoutes.d.ts +58 -0
- package/dist/api/prepareRoutes.d.ts.map +1 -0
- package/dist/api/prepareRoutes.js +90 -0
- package/dist/api/prepareRoutes.js.map +1 -0
- package/dist/api/response.d.ts +39 -0
- package/dist/api/response.d.ts.map +1 -0
- package/dist/api/response.js +53 -0
- package/dist/api/response.js.map +1 -0
- package/dist/api/routes.d.ts +175 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +276 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/api/schemas.d.ts +147 -0
- package/dist/api/schemas.d.ts.map +1 -0
- package/dist/api/schemas.js +81 -0
- package/dist/api/schemas.js.map +1 -0
- package/dist/api/server.d.ts +11 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +505 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/toolRoutes.d.ts +14 -0
- package/dist/api/toolRoutes.d.ts.map +1 -0
- package/dist/api/toolRoutes.js +138 -0
- package/dist/api/toolRoutes.js.map +1 -0
- package/dist/api/walletPrepareRoutes.d.ts +74 -0
- package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
- package/dist/api/walletPrepareRoutes.js +127 -0
- package/dist/api/walletPrepareRoutes.js.map +1 -0
- package/dist/api/x402Gate.d.ts +51 -0
- package/dist/api/x402Gate.d.ts.map +1 -0
- package/dist/api/x402Gate.js +184 -0
- package/dist/api/x402Gate.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -1
- package/dist/cli.js.map +1 -1
- package/dist/data/ecosystemRegistry.data.d.ts +3 -0
- package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
- package/dist/data/ecosystemRegistry.data.js +582 -0
- package/dist/data/ecosystemRegistry.data.js.map +1 -0
- package/dist/demo.d.ts +0 -0
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +43 -8
- package/dist/demo.js.map +1 -1
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +212 -135
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +0 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +72 -10
- package/dist/init.js.map +1 -1
- package/dist/lib/analysis/approval.d.ts +29 -0
- package/dist/lib/analysis/approval.d.ts.map +1 -0
- package/dist/lib/analysis/approval.js +162 -0
- package/dist/lib/analysis/approval.js.map +1 -0
- package/dist/lib/analysis/calldata.d.ts +60 -0
- package/dist/lib/analysis/calldata.d.ts.map +1 -0
- package/dist/lib/analysis/calldata.js +349 -0
- package/dist/lib/analysis/calldata.js.map +1 -0
- package/dist/lib/analysis/contractIntel.d.ts +65 -0
- package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
- package/dist/lib/analysis/contractIntel.js +320 -0
- package/dist/lib/analysis/contractIntel.js.map +1 -0
- package/dist/lib/analysis/evm.d.ts +42 -0
- package/dist/lib/analysis/evm.d.ts.map +1 -0
- package/dist/lib/analysis/evm.js +185 -0
- package/dist/lib/analysis/evm.js.map +1 -0
- package/dist/lib/analysis/gas.d.ts +4 -0
- package/dist/lib/analysis/gas.d.ts.map +1 -0
- package/dist/lib/analysis/gas.js +13 -0
- package/dist/lib/analysis/gas.js.map +1 -0
- package/dist/lib/analysis/index.d.ts +11 -0
- package/dist/lib/analysis/index.d.ts.map +1 -0
- package/dist/lib/analysis/index.js +16 -0
- package/dist/lib/analysis/index.js.map +1 -0
- package/dist/lib/analysis/pharosTokens.d.ts +31 -0
- package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
- package/dist/lib/analysis/pharosTokens.js +78 -0
- package/dist/lib/analysis/pharosTokens.js.map +1 -0
- package/dist/lib/analysis/safeTx.d.ts +27 -0
- package/dist/lib/analysis/safeTx.d.ts.map +1 -0
- package/dist/lib/analysis/safeTx.js +118 -0
- package/dist/lib/analysis/safeTx.js.map +1 -0
- package/dist/lib/analysis/token.d.ts +21 -0
- package/dist/lib/analysis/token.d.ts.map +1 -0
- package/dist/lib/analysis/token.js +151 -0
- package/dist/lib/analysis/token.js.map +1 -0
- package/dist/lib/analysis/types.d.ts +49 -0
- package/dist/lib/analysis/types.d.ts.map +1 -0
- package/dist/lib/analysis/types.js +10 -0
- package/dist/lib/analysis/types.js.map +1 -0
- package/dist/lib/analysis/x402.d.ts +24 -0
- package/dist/lib/analysis/x402.d.ts.map +1 -0
- package/dist/lib/analysis/x402.js +60 -0
- package/dist/lib/analysis/x402.js.map +1 -0
- package/dist/lib/auditLog.d.ts +1 -0
- package/dist/lib/auditLog.d.ts.map +1 -1
- package/dist/lib/auditLog.js +0 -0
- package/dist/lib/auditLog.js.map +1 -1
- package/dist/lib/config.d.ts +77 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +120 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +246 -97
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +334 -127
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +26 -3
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +80 -17
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/ecosystemRegistry.d.ts +116 -0
- package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
- package/dist/lib/ecosystemRegistry.js +178 -0
- package/dist/lib/ecosystemRegistry.js.map +1 -0
- package/dist/lib/envLoader.d.ts +0 -0
- package/dist/lib/envLoader.d.ts.map +0 -0
- package/dist/lib/envLoader.js +39 -18
- package/dist/lib/envLoader.js.map +1 -1
- package/dist/lib/goldsky.d.ts +58 -0
- package/dist/lib/goldsky.d.ts.map +1 -0
- package/dist/lib/goldsky.js +275 -0
- package/dist/lib/goldsky.js.map +1 -0
- package/dist/lib/guardian/decision.d.ts +23 -0
- package/dist/lib/guardian/decision.d.ts.map +1 -0
- package/dist/lib/guardian/decision.js +40 -0
- package/dist/lib/guardian/decision.js.map +1 -0
- package/dist/lib/http.d.ts +0 -1
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +297 -32
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/managedExecution.d.ts +19 -0
- package/dist/lib/managedExecution.d.ts.map +1 -0
- package/dist/lib/managedExecution.js +64 -0
- package/dist/lib/managedExecution.js.map +1 -0
- package/dist/lib/merkleBatcher.d.ts +23 -0
- package/dist/lib/merkleBatcher.d.ts.map +1 -0
- package/dist/lib/merkleBatcher.js +62 -0
- package/dist/lib/merkleBatcher.js.map +1 -0
- package/dist/lib/networks.d.ts +48 -0
- package/dist/lib/networks.d.ts.map +1 -0
- package/dist/lib/networks.js +103 -0
- package/dist/lib/networks.js.map +1 -0
- package/dist/lib/observability/accessContext.d.ts +29 -0
- package/dist/lib/observability/accessContext.d.ts.map +1 -0
- package/dist/lib/observability/accessContext.js +50 -0
- package/dist/lib/observability/accessContext.js.map +1 -0
- package/dist/lib/observability/activityStore.d.ts +70 -0
- package/dist/lib/observability/activityStore.d.ts.map +1 -0
- package/dist/lib/observability/activityStore.js +149 -0
- package/dist/lib/observability/activityStore.js.map +1 -0
- package/dist/lib/observability/apiKey.d.ts +55 -0
- package/dist/lib/observability/apiKey.d.ts.map +1 -0
- package/dist/lib/observability/apiKey.js +141 -0
- package/dist/lib/observability/apiKey.js.map +1 -0
- package/dist/lib/observability/logger.d.ts +30 -0
- package/dist/lib/observability/logger.d.ts.map +1 -0
- package/dist/lib/observability/logger.js +30 -0
- package/dist/lib/observability/logger.js.map +1 -0
- package/dist/lib/observability/quota.d.ts +33 -0
- package/dist/lib/observability/quota.d.ts.map +1 -0
- package/dist/lib/observability/quota.js +49 -0
- package/dist/lib/observability/quota.js.map +1 -0
- package/dist/lib/observability/requestId.d.ts +8 -0
- package/dist/lib/observability/requestId.d.ts.map +1 -0
- package/dist/lib/observability/requestId.js +24 -0
- package/dist/lib/observability/requestId.js.map +1 -0
- package/dist/lib/observability/sanitize.d.ts +77 -0
- package/dist/lib/observability/sanitize.d.ts.map +1 -0
- package/dist/lib/observability/sanitize.js +228 -0
- package/dist/lib/observability/sanitize.js.map +1 -0
- package/dist/lib/observability/scopes.d.ts +20 -0
- package/dist/lib/observability/scopes.d.ts.map +1 -0
- package/dist/lib/observability/scopes.js +77 -0
- package/dist/lib/observability/scopes.js.map +1 -0
- package/dist/lib/okxDexApi.d.ts +106 -0
- package/dist/lib/okxDexApi.d.ts.map +1 -0
- package/dist/lib/okxDexApi.js +221 -0
- package/dist/lib/okxDexApi.js.map +1 -0
- package/dist/lib/persistentJsonStore.d.ts +5 -0
- package/dist/lib/persistentJsonStore.d.ts.map +1 -0
- package/dist/lib/persistentJsonStore.js +39 -0
- package/dist/lib/persistentJsonStore.js.map +1 -0
- package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
- package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
- package/dist/lib/pharos/attestationPublisher.js +262 -0
- package/dist/lib/pharos/attestationPublisher.js.map +1 -0
- package/dist/lib/pharos/ecosystem.d.ts +52 -0
- package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
- package/dist/lib/pharos/ecosystem.js +431 -0
- package/dist/lib/pharos/ecosystem.js.map +1 -0
- package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
- package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
- package/dist/lib/pharos/ecosystemEvidence.js +133 -0
- package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
- package/dist/lib/pharos/rpc.d.ts +44 -0
- package/dist/lib/pharos/rpc.d.ts.map +1 -0
- package/dist/lib/pharos/rpc.js +90 -0
- package/dist/lib/pharos/rpc.js.map +1 -0
- package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
- package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
- package/dist/lib/pharos/rpcEvidence.js +46 -0
- package/dist/lib/pharos/rpcEvidence.js.map +1 -0
- package/dist/lib/pharos/rpcMethods.d.ts +46 -0
- package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
- package/dist/lib/pharos/rpcMethods.js +176 -0
- package/dist/lib/pharos/rpcMethods.js.map +1 -0
- package/dist/lib/pharos/spvVerifier.d.ts +47 -0
- package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
- package/dist/lib/pharos/spvVerifier.js +105 -0
- package/dist/lib/pharos/spvVerifier.js.map +1 -0
- package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
- package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
- package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
- package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
- package/dist/lib/pharosClient.d.ts +5 -10
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +9 -16
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.js +213 -52
- package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
- package/dist/lib/policy/agentPolicy.d.ts +29 -0
- package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
- package/dist/lib/policy/agentPolicy.js +154 -0
- package/dist/lib/policy/agentPolicy.js.map +1 -0
- package/dist/lib/policy/policyPresets.d.ts +30 -0
- package/dist/lib/policy/policyPresets.d.ts.map +1 -0
- package/dist/lib/policy/policyPresets.js +124 -0
- package/dist/lib/policy/policyPresets.js.map +1 -0
- package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
- package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
- package/dist/lib/policy/writeExecutionGate.js +65 -0
- package/dist/lib/policy/writeExecutionGate.js.map +1 -0
- package/dist/lib/preparedTxStore.d.ts +21 -0
- package/dist/lib/preparedTxStore.d.ts.map +1 -0
- package/dist/lib/preparedTxStore.js +90 -0
- package/dist/lib/preparedTxStore.js.map +1 -0
- package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
- package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
- package/dist/lib/price/chainlinkPushProvider.js +36 -0
- package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
- package/dist/lib/price/feedRegistry.d.ts +26 -0
- package/dist/lib/price/feedRegistry.d.ts.map +1 -0
- package/dist/lib/price/feedRegistry.js +67 -0
- package/dist/lib/price/feedRegistry.js.map +1 -0
- package/dist/lib/price/priceResolver.d.ts +35 -0
- package/dist/lib/price/priceResolver.d.ts.map +1 -0
- package/dist/lib/price/priceResolver.js +246 -0
- package/dist/lib/price/priceResolver.js.map +1 -0
- package/dist/lib/price/supraProvider.d.ts +9 -0
- package/dist/lib/price/supraProvider.d.ts.map +1 -0
- package/dist/lib/price/supraProvider.js +17 -0
- package/dist/lib/price/supraProvider.js.map +1 -0
- package/dist/lib/price/types.d.ts +67 -0
- package/dist/lib/price/types.d.ts.map +1 -0
- package/dist/lib/price/types.js +7 -0
- package/dist/lib/price/types.js.map +1 -0
- package/dist/lib/productionGuards.d.ts +16 -0
- package/dist/lib/productionGuards.d.ts.map +1 -0
- package/dist/lib/productionGuards.js +93 -0
- package/dist/lib/productionGuards.js.map +1 -0
- package/dist/lib/recipientSafety.d.ts +5 -0
- package/dist/lib/recipientSafety.d.ts.map +1 -0
- package/dist/lib/recipientSafety.js +28 -0
- package/dist/lib/recipientSafety.js.map +1 -0
- package/dist/lib/riskEngine.d.ts +19 -0
- package/dist/lib/riskEngine.d.ts.map +1 -1
- package/dist/lib/riskEngine.js +94 -36
- package/dist/lib/riskEngine.js.map +1 -1
- package/dist/lib/riskInclusion.d.ts +72 -0
- package/dist/lib/riskInclusion.d.ts.map +1 -0
- package/dist/lib/riskInclusion.js +252 -0
- package/dist/lib/riskInclusion.js.map +1 -0
- package/dist/lib/safeHandsRegistry.d.ts +32 -0
- package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
- package/dist/lib/safeHandsRegistry.js +151 -0
- package/dist/lib/safeHandsRegistry.js.map +1 -0
- package/dist/lib/signer/index.d.ts +3 -3
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +33 -11
- package/dist/lib/signer/index.js.map +1 -1
- package/dist/lib/spendAccumulator.d.ts +24 -1
- package/dist/lib/spendAccumulator.d.ts.map +1 -1
- package/dist/lib/spendAccumulator.js +76 -6
- package/dist/lib/spendAccumulator.js.map +1 -1
- package/dist/lib/toolResponse.d.ts +6 -1
- package/dist/lib/toolResponse.d.ts.map +1 -1
- package/dist/lib/toolResponse.js +13 -9
- package/dist/lib/toolResponse.js.map +1 -1
- package/dist/lib/validation.d.ts +7 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +62 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/wallet/index.d.ts +8 -12
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +48 -35
- package/dist/lib/wallet/index.js.map +1 -1
- package/dist/lib/x402ReplayStore.d.ts +6 -0
- package/dist/lib/x402ReplayStore.d.ts.map +1 -0
- package/dist/lib/x402ReplayStore.js +79 -0
- package/dist/lib/x402ReplayStore.js.map +1 -0
- package/dist/safehands.zip +0 -0
- package/dist/sdk.d.ts +14 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +25 -0
- package/dist/sdk.js.map +1 -0
- package/dist/tools/approveToken.d.ts +31 -10
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +91 -24
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +13 -26
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +34 -75
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +9 -3
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +27 -5
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +62 -5
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +166 -21
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +4 -2
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +36 -31
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +7 -2
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +16 -10
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +56 -8
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +194 -46
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +9 -9
- package/dist/tools/explainRisk.d.ts.map +1 -1
- package/dist/tools/explainRisk.js +5 -4
- package/dist/tools/explainRisk.js.map +1 -1
- package/dist/tools/getAgentPolicy.d.ts +15 -0
- package/dist/tools/getAgentPolicy.d.ts.map +1 -0
- package/dist/tools/getAgentPolicy.js +16 -0
- package/dist/tools/getAgentPolicy.js.map +1 -0
- package/dist/tools/getAgentReputation.d.ts +31 -0
- package/dist/tools/getAgentReputation.d.ts.map +1 -0
- package/dist/tools/getAgentReputation.js +44 -0
- package/dist/tools/getAgentReputation.js.map +1 -0
- package/dist/tools/getAgentWallet.d.ts +1 -1
- package/dist/tools/getAgentWallet.d.ts.map +1 -1
- package/dist/tools/getAgentWallet.js +11 -1
- package/dist/tools/getAgentWallet.js.map +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
- package/dist/tools/getAgentWalletBalance.js +58 -26
- package/dist/tools/getAgentWalletBalance.js.map +1 -1
- package/dist/tools/getExecutionHistory.d.ts +1 -1
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +13 -19
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +3 -3
- package/dist/tools/getGasPrice.d.ts.map +0 -0
- package/dist/tools/getGasPrice.js +7 -7
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +17 -17
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +14 -9
- package/dist/tools/getPoolInfo.js.map +1 -1
- package/dist/tools/getSpvProof.d.ts +24 -0
- package/dist/tools/getSpvProof.d.ts.map +1 -0
- package/dist/tools/getSpvProof.js +64 -0
- package/dist/tools/getSpvProof.js.map +1 -0
- package/dist/tools/getTokenPrice.d.ts +28 -85
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +87 -94
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getTransactionStatus.d.ts +2 -2
- package/dist/tools/getTransactionStatus.d.ts.map +0 -0
- package/dist/tools/getTransactionStatus.js +0 -0
- package/dist/tools/getTransactionStatus.js.map +0 -0
- package/dist/tools/getWalletBalance.d.ts +38 -3
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +92 -52
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +36 -14
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +80 -32
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryGoldsky.d.ts +20 -0
- package/dist/tools/queryGoldsky.d.ts.map +1 -0
- package/dist/tools/queryGoldsky.js +29 -0
- package/dist/tools/queryGoldsky.js.map +1 -0
- package/dist/tools/queryRiskRegistry.d.ts +14 -14
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +34 -30
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
- package/dist/tools/safehandsPreflightCheck.js +133 -6
- package/dist/tools/safehandsPreflightCheck.js.map +1 -1
- package/dist/tools/safehandsRiskReport.d.ts +29 -14
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
- package/dist/tools/safehandsRiskReport.js +23 -3
- package/dist/tools/safehandsRiskReport.js.map +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +100 -17
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +15 -1
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
- package/dist/tools/safehandsWalletHealth.js +67 -25
- package/dist/tools/safehandsWalletHealth.js.map +1 -1
- package/dist/tools/safehandsX402Preflight.d.ts +3 -3
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
- package/dist/tools/safehandsX402Preflight.js +24 -3
- package/dist/tools/safehandsX402Preflight.js.map +1 -1
- package/dist/tools/sendPayment.d.ts +10 -4
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +63 -36
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/setAgentPolicy.d.ts +75 -0
- package/dist/tools/setAgentPolicy.d.ts.map +1 -0
- package/dist/tools/setAgentPolicy.js +80 -0
- package/dist/tools/setAgentPolicy.js.map +1 -0
- package/dist/tools/simulateTransaction.d.ts +7 -3
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +42 -9
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +25 -5
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
- package/dist/tools/tokenRegistryStatus.js +61 -31
- package/dist/tools/tokenRegistryStatus.js.map +1 -1
- package/dist/tools/verifyRiskInclusion.d.ts +59 -0
- package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
- package/dist/tools/verifyRiskInclusion.js +40 -0
- package/dist/tools/verifyRiskInclusion.js.map +1 -0
- package/dist/tools/x402PayAndFetch.d.ts +15 -9
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +163 -20
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +39 -0
- package/dist/worker.js.map +1 -0
- package/dist/x402Server.d.ts +1 -1
- package/dist/x402Server.d.ts.map +1 -1
- package/dist/x402Server.js +144 -35
- package/dist/x402Server.js.map +1 -1
- package/docs/REVIEWER_QUICKSTART.md +113 -0
- package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
- package/package.json +130 -73
- package/contracts/RiskRegistry.json +0 -223
- package/contracts/RiskRegistry.sol +0 -58
- package/dist/lib/testDodoLive.d.ts +0 -2
- package/dist/lib/testDodoLive.d.ts.map +0 -1
- package/dist/lib/testDodoLive.js +0 -105
- package/dist/lib/testDodoLive.js.map +0 -1
- package/dist/lib/testLiveSafehands.d.ts +0 -2
- package/dist/lib/testLiveSafehands.d.ts.map +0 -1
- package/dist/lib/testLiveSafehands.js +0 -93
- package/dist/lib/testLiveSafehands.js.map +0 -1
- package/dist/lib/testRpc.d.ts +0 -2
- package/dist/lib/testRpc.d.ts.map +0 -1
- package/dist/lib/testRpc.js +0 -30
- package/dist/lib/testRpc.js.map +0 -1
- package/dist/lib/testRpcLive.d.ts +0 -2
- package/dist/lib/testRpcLive.d.ts.map +0 -1
- package/dist/lib/testRpcLive.js +0 -89
- package/dist/lib/testRpcLive.js.map +0 -1
- package/dist/lib/testTools.d.ts +0 -2
- package/dist/lib/testTools.d.ts.map +0 -1
- package/dist/lib/testTools.js +0 -397
- package/dist/lib/testTools.js.map +0 -1
- package/dist/lib/testX402Live.d.ts +0 -2
- package/dist/lib/testX402Live.d.ts.map +0 -1
- package/dist/lib/testX402Live.js +0 -160
- package/dist/lib/testX402Live.js.map +0 -1
- package/dist/scripts/checkDeploy.d.ts +0 -2
- package/dist/scripts/checkDeploy.d.ts.map +0 -1
- package/dist/scripts/checkDeploy.js +0 -25
- package/dist/scripts/checkDeploy.js.map +0 -1
- package/dist/scripts/deployRegistry.d.ts +0 -2
- package/dist/scripts/deployRegistry.d.ts.map +0 -1
- package/dist/scripts/deployRegistry.js +0 -101
- package/dist/scripts/deployRegistry.js.map +0 -1
- package/dist/scripts/testRegistry.d.ts +0 -2
- package/dist/scripts/testRegistry.d.ts.map +0 -1
- package/dist/scripts/testRegistry.js +0 -44
- package/dist/scripts/testRegistry.js.map +0 -1
|
@@ -1,9 +1,23 @@
|
|
|
1
1
|
// ─── SafeHands Action Policy Engine ───────────────────────────────────
|
|
2
2
|
// Reusable transaction safety firewall for AI agent actions on Pharos.
|
|
3
|
-
// It is intentionally deterministic
|
|
3
|
+
// It is intentionally deterministic. Mainnet-first (Pharos Pacific, chain 1672).
|
|
4
4
|
// ───────────────────────────────────────────────────────────────────────
|
|
5
5
|
import { isAddress, parseUnits } from "viem";
|
|
6
|
-
import {
|
|
6
|
+
import { isDenylistedRecipient } from "../recipientSafety.js";
|
|
7
|
+
import { CHAIN_ID, PHAROS_ENVIRONMENT, COUNTERPARTY_CRITICAL_THRESHOLD, RISK_BLOCK_THRESHOLD, activeX402AllowedTokenAddresses, PACIFIC_USDC_ADDRESS, PACIFIC_WPROS_ADDRESS, USDC_ADDRESS, WPROS_ADDRESS, isCanonicalInfrastructure, } from "../constants.js";
|
|
8
|
+
import { getNetworkByChainId } from "../networks.js";
|
|
9
|
+
import { resolvePriceableToken } from "../spendAccumulator.js";
|
|
10
|
+
import { loadAgentPolicy, resolveEffectiveLimits } from "./agentPolicy.js";
|
|
11
|
+
/** Projects a RiskAssessment into the policy-evidence shape. Single mapper — write tools must use this rather than hand-rolling the projection. */
|
|
12
|
+
export function riskEvidenceFromAssessment(a) {
|
|
13
|
+
return {
|
|
14
|
+
score: a.riskScore,
|
|
15
|
+
degraded: a.degraded,
|
|
16
|
+
degradedReasons: a.degradedReasons,
|
|
17
|
+
counterpartyRisk: a.breakdown.counterpartyRisk,
|
|
18
|
+
swapProviderNotConfigured: a.swapProviderNotConfigured,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
7
21
|
function numeric(value) {
|
|
8
22
|
if (!value)
|
|
9
23
|
return null;
|
|
@@ -33,28 +47,41 @@ export function isUnlimitedApprovalAmount(value) {
|
|
|
33
47
|
function isSuspiciousUrl(rawUrl) {
|
|
34
48
|
if (!rawUrl)
|
|
35
49
|
return false;
|
|
36
|
-
|
|
37
|
-
return false;
|
|
50
|
+
let parsed;
|
|
38
51
|
try {
|
|
39
|
-
|
|
40
|
-
const host = parsed.hostname.toLowerCase();
|
|
41
|
-
if (!["http:", "https:"].includes(parsed.protocol))
|
|
42
|
-
return true;
|
|
43
|
-
if (host === "localhost" || host.endsWith(".localhost"))
|
|
44
|
-
return true;
|
|
45
|
-
if (host === "127.0.0.1" || host.startsWith("127.") || host === "0.0.0.0")
|
|
46
|
-
return true;
|
|
47
|
-
if (host.startsWith("10.") || host.startsWith("192.168."))
|
|
48
|
-
return true;
|
|
49
|
-
if (/^172\.(1[6-9]|2\d|3[0-1])\./.test(host))
|
|
50
|
-
return true;
|
|
51
|
-
if (host === "[::1]" || host === "::1")
|
|
52
|
-
return true;
|
|
53
|
-
return false;
|
|
52
|
+
parsed = new URL(rawUrl);
|
|
54
53
|
}
|
|
55
54
|
catch {
|
|
56
55
|
return true;
|
|
57
56
|
}
|
|
57
|
+
const host = parsed.hostname.toLowerCase();
|
|
58
|
+
if (!["http:", "https:"].includes(parsed.protocol))
|
|
59
|
+
return true;
|
|
60
|
+
// ALLOW_LOCAL_X402_FETCH relaxes ONLY loopback, and only outside production.
|
|
61
|
+
// Cloud-metadata / private / link-local ranges are ALWAYS suspicious — the flag
|
|
62
|
+
// can no longer wave through 169.254.169.254 or RFC1918 hosts.
|
|
63
|
+
const isLoopback = host === "localhost" || host.endsWith(".localhost") ||
|
|
64
|
+
host === "127.0.0.1" || host.startsWith("127.") ||
|
|
65
|
+
host === "[::1]" || host === "::1";
|
|
66
|
+
const loopbackBypass = process.env.ALLOW_LOCAL_X402_FETCH === "true" &&
|
|
67
|
+
(process.env.NODE_ENV || "").toLowerCase() !== "production";
|
|
68
|
+
if (isLoopback)
|
|
69
|
+
return loopbackBypass ? false : true;
|
|
70
|
+
if (host === "0.0.0.0")
|
|
71
|
+
return true;
|
|
72
|
+
if (/^0\./.test(host))
|
|
73
|
+
return true;
|
|
74
|
+
if (host.startsWith("10.") || host.startsWith("192.168."))
|
|
75
|
+
return true;
|
|
76
|
+
if (/^172\.(1[6-9]|2\d|3[0-1])\./.test(host))
|
|
77
|
+
return true;
|
|
78
|
+
if (host.startsWith("169.254."))
|
|
79
|
+
return true;
|
|
80
|
+
if (host.startsWith("[fc") || host.startsWith("[fd") || host.startsWith("[fe80:"))
|
|
81
|
+
return true;
|
|
82
|
+
if (host.startsWith("fc") || host.startsWith("fd") || host.startsWith("fe80:"))
|
|
83
|
+
return true;
|
|
84
|
+
return false;
|
|
58
85
|
}
|
|
59
86
|
function classifyRisk(checks) {
|
|
60
87
|
const fails = checks.filter((c) => c.status === "fail").length;
|
|
@@ -73,30 +100,40 @@ function classifyRisk(checks) {
|
|
|
73
100
|
function defaultDecision(riskLevel, checks) {
|
|
74
101
|
if (checks.some((c) => c.status === "fail"))
|
|
75
102
|
return "BLOCK";
|
|
76
|
-
if (riskLevel === "
|
|
77
|
-
return "
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
103
|
+
if (riskLevel === "LOW")
|
|
104
|
+
return "ALLOW";
|
|
105
|
+
// classifyRisk only produces MEDIUM here (HIGH/CRITICAL imply a fail, caught
|
|
106
|
+
// above). Any other level, including a future UNKNOWN, lands here fail-closed
|
|
107
|
+
// rather than falling through to ALLOW.
|
|
108
|
+
return "REQUIRE_CONFIRMATION";
|
|
81
109
|
}
|
|
82
110
|
export function evaluateActionPolicy(input) {
|
|
83
111
|
const environment = input.environment || PHAROS_ENVIRONMENT;
|
|
84
112
|
const chainId = input.chainId ?? CHAIN_ID;
|
|
85
|
-
const
|
|
113
|
+
const network = getNetworkByChainId(chainId);
|
|
114
|
+
const isMainnet = input.isMainnet ?? network?.isMainnet ?? false;
|
|
86
115
|
const checks = [];
|
|
87
116
|
const reasons = [];
|
|
88
117
|
const requiredActions = [];
|
|
89
|
-
|
|
90
|
-
|
|
118
|
+
const policy = input.agentPolicy ?? loadAgentPolicy(input.agentId);
|
|
119
|
+
const effectiveLimits = resolveEffectiveLimits(policy);
|
|
120
|
+
// Chain guard: only supported Pharos networks pass. Unknown chains (e.g.
|
|
121
|
+
// Ethereum mainnet, chain 1) are blocked. Pharos Pacific Mainnet (1672) is a
|
|
122
|
+
// supported network for read-only SafeHands checks.
|
|
123
|
+
if (!network) {
|
|
124
|
+
pushCheck(checks, "chain_id", "fail", `Chain ID ${chainId} is not a supported Pharos network.`, reasons, requiredActions, "Unsupported chain.", "Use Pharos Pacific Mainnet (1672) or Atlantic Testnet (688689).");
|
|
91
125
|
}
|
|
92
126
|
else {
|
|
93
|
-
pushCheck(checks, "
|
|
127
|
+
pushCheck(checks, "chain_id", "pass", `Chain ID is ${network.label} (${chainId}).`);
|
|
94
128
|
}
|
|
95
|
-
|
|
96
|
-
|
|
129
|
+
// Mainnet read-only SafeHands checks are allowed. Mainnet execution / write /
|
|
130
|
+
// payment is disabled by default and gated separately (WRITE_TOOLS_ENABLED and
|
|
131
|
+
// the network executionAllowed flag) — it is never live here.
|
|
132
|
+
if (isMainnet) {
|
|
133
|
+
pushCheck(checks, "mainnet_guard", "pass", `${network ? network.label : "Pharos mainnet"}: read-only SafeHands checks allowed; execution/write/payment is gated and disabled by default.`);
|
|
97
134
|
}
|
|
98
135
|
else {
|
|
99
|
-
pushCheck(checks, "
|
|
136
|
+
pushCheck(checks, "mainnet_guard", "pass", "Action is not targeting mainnet.");
|
|
100
137
|
}
|
|
101
138
|
if (environment !== PHAROS_ENVIRONMENT) {
|
|
102
139
|
pushCheck(checks, "environment", "warn", `Expected ${PHAROS_ENVIRONMENT}, received ${environment}.`, reasons, requiredActions, undefined, "Verify the runtime environment before execution.");
|
|
@@ -104,23 +141,48 @@ export function evaluateActionPolicy(input) {
|
|
|
104
141
|
else {
|
|
105
142
|
pushCheck(checks, "environment", "pass", `Environment is ${PHAROS_ENVIRONMENT}.`);
|
|
106
143
|
}
|
|
107
|
-
if (input.requiresSigner &&
|
|
108
|
-
pushCheck(checks, "signer", "fail", "No signer is available for this write/payment action.", reasons, requiredActions, "No signer available.", "Configure WALLET_MODE=managed-
|
|
144
|
+
if (input.requiresSigner && input.signerAvailable === false) {
|
|
145
|
+
pushCheck(checks, "signer", "fail", "No signer is available for this write/payment action.", reasons, requiredActions, "No signer available.", "Configure WALLET_MODE=managed-mainnet, X402_SIGNER_PRIVATE_KEY, or PRIVATE_KEY for mainnet only.");
|
|
146
|
+
}
|
|
147
|
+
else if (input.requiresSigner && input.signerAvailable === undefined) {
|
|
148
|
+
pushCheck(checks, "signer_unknown", "warn", "Signer availability is unknown; a signer will be required for execution.", reasons, requiredActions, undefined, "Ensure a signer is available before executing this write/payment action.");
|
|
109
149
|
}
|
|
110
150
|
if (input.actionType === "send_payment") {
|
|
111
151
|
const amount = numeric(input.amount);
|
|
112
|
-
|
|
113
|
-
|
|
152
|
+
const paymentLimit = effectiveLimits.maxPaymentPROS;
|
|
153
|
+
if (amount !== null && amount > paymentLimit) {
|
|
154
|
+
pushCheck(checks, "payment_limit", "fail", `Payment ${amount} PROS exceeds limit ${paymentLimit} PROS (policy: ${policy.profile}).`, reasons, requiredActions, "Payment exceeds configured PROS limit.", "Reduce amount or adjust agent policy.");
|
|
114
155
|
}
|
|
115
156
|
else {
|
|
116
|
-
pushCheck(checks, "payment_limit", "pass", `Payment is within ${
|
|
157
|
+
pushCheck(checks, "payment_limit", "pass", `Payment is within ${paymentLimit} PROS limit (policy: ${policy.profile}).`);
|
|
158
|
+
}
|
|
159
|
+
const balance = numeric(input.walletBalancePhs);
|
|
160
|
+
if (amount !== null && balance !== null) {
|
|
161
|
+
if (amount > balance) {
|
|
162
|
+
pushCheck(checks, "funding_balance", "fail", `Insufficient PROS balance. Have ${balance}, need ${amount}.`, reasons, requiredActions, "Insufficient PROS balance.", "Fund the wallet before executing.");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
pushCheck(checks, "funding_balance", "pass", "Sufficient PROS balance for payment.");
|
|
166
|
+
}
|
|
117
167
|
}
|
|
118
168
|
if (input.recipient && !isAddress(input.recipient)) {
|
|
119
169
|
pushCheck(checks, "recipient_address", "fail", "Recipient address is invalid.", reasons, requiredActions, "Invalid recipient address.", "Provide a valid EVM address.");
|
|
120
170
|
}
|
|
171
|
+
else if (isDenylistedRecipient(input.recipient)) {
|
|
172
|
+
pushCheck(checks, "recipient_denylist", "fail", "Recipient is on the operator denylist (known-bad address).", reasons, requiredActions, "Recipient address is denylisted.", "Do not send to this address; it is flagged as known-bad by the operator.");
|
|
173
|
+
}
|
|
121
174
|
else if (input.recipientVerified === false) {
|
|
122
175
|
pushCheck(checks, "recipient_reputation", "warn", "Recipient is unverified.", reasons, requiredActions, undefined, "Verify recipient before sending funds.");
|
|
123
176
|
}
|
|
177
|
+
else if (input.recipient && input.recipientVerified === undefined) {
|
|
178
|
+
// Fail-closed: recipientVerified is a caller CLAIM. When it is omitted, no
|
|
179
|
+
// verification happened — treat exactly like an unverified recipient instead
|
|
180
|
+
// of silently skipping the reputation check (truth-model rule 5).
|
|
181
|
+
pushCheck(checks, "recipient_reputation", "unknown", "Recipient verification was not asserted; the recipient is treated as an unverified claim.", reasons, requiredActions, undefined, "Verify the recipient against chain/registry evidence before sending funds.");
|
|
182
|
+
}
|
|
183
|
+
else if (input.recipient && input.recipientVerified === true) {
|
|
184
|
+
pushCheck(checks, "recipient_reputation", "pass", "Recipient verification asserted by the caller (caller-attested claim; not independently verified by SafeHands).");
|
|
185
|
+
}
|
|
124
186
|
}
|
|
125
187
|
if (input.actionType === "approve_token") {
|
|
126
188
|
const unlimited = input.approvalUnlimited || isUnlimitedApprovalAmount(input.approvalAmount) || isUnlimitedApprovalAmount(input.amount);
|
|
@@ -129,11 +191,12 @@ export function evaluateActionPolicy(input) {
|
|
|
129
191
|
}
|
|
130
192
|
else {
|
|
131
193
|
const approvalAmount = numeric(input.approvalAmount) ?? numeric(input.amount);
|
|
132
|
-
|
|
133
|
-
|
|
194
|
+
const approvalLimit = effectiveLimits.maxApprovalUSDC;
|
|
195
|
+
if (approvalAmount !== null && approvalAmount > approvalLimit) {
|
|
196
|
+
pushCheck(checks, "approval_limit", "fail", `Approval ${approvalAmount} exceeds limit ${approvalLimit} (policy: ${policy.profile}).`, reasons, requiredActions, "Approval exceeds configured limit.", "Reduce approval or adjust agent policy.");
|
|
134
197
|
}
|
|
135
198
|
else {
|
|
136
|
-
pushCheck(checks, "approval_limit", "pass", `Approval is within ${
|
|
199
|
+
pushCheck(checks, "approval_limit", "pass", `Approval is within ${approvalLimit} USDC-equivalent limit (policy: ${policy.profile}).`);
|
|
137
200
|
}
|
|
138
201
|
}
|
|
139
202
|
if (input.spender && !isAddress(input.spender)) {
|
|
@@ -142,11 +205,42 @@ export function evaluateActionPolicy(input) {
|
|
|
142
205
|
else if (input.spenderVerified === false) {
|
|
143
206
|
pushCheck(checks, "spender_reputation", "warn", "Spender is unverified.", reasons, requiredActions, undefined, "Verify spender contract before approving.");
|
|
144
207
|
}
|
|
208
|
+
else if (input.spender && input.spenderVerified === undefined) {
|
|
209
|
+
// Fail-closed: same rule as recipientVerified — an omitted claim is not evidence.
|
|
210
|
+
pushCheck(checks, "spender_reputation", "unknown", "Spender verification was not asserted; the spender is treated as an unverified claim.", reasons, requiredActions, undefined, "Verify the spender contract against chain/registry evidence before approving.");
|
|
211
|
+
}
|
|
212
|
+
else if (input.spender && input.spenderVerified === true) {
|
|
213
|
+
pushCheck(checks, "spender_reputation", "pass", "Spender verification asserted by the caller (caller-attested claim; not independently verified by SafeHands).");
|
|
214
|
+
}
|
|
145
215
|
}
|
|
146
216
|
if (input.actionType === "execute_swap") {
|
|
147
217
|
const amount = numeric(input.amount);
|
|
148
|
-
|
|
149
|
-
|
|
218
|
+
const swapLimit = effectiveLimits.maxSwapPROS;
|
|
219
|
+
if (amount !== null && amount > swapLimit && (input.tokenIn || "").toUpperCase() === "PROS") {
|
|
220
|
+
pushCheck(checks, "swap_amount_limit", "fail", `Swap ${amount} PROS exceeds limit ${swapLimit} PROS (policy: ${policy.profile}).`, reasons, requiredActions, "Swap exceeds configured PROS limit.", "Reduce amount or adjust agent policy.");
|
|
221
|
+
}
|
|
222
|
+
// An input token that cannot be priced in USD contributes $0 to
|
|
223
|
+
// MAX_DAILY_SPEND_USD and has no per-transaction ceiling — the spend caps would
|
|
224
|
+
// silently not apply. Deny by default (fail → BLOCK, never confirmable).
|
|
225
|
+
if (input.tokenIn && resolvePriceableToken(input.tokenIn) === null) {
|
|
226
|
+
pushCheck(checks, "swap_notional_unpriceable", "fail", `Swap input token ${input.tokenIn} cannot be priced in USD, so the daily USD cap and per-transaction ceiling cannot bound this spend; denied by default.`, reasons, requiredActions, "Unpriceable input token would escape spend caps.", "Swap a priceable token (PROS, WPROS, USDC, USDT) or add the token to the price map before enabling it.");
|
|
227
|
+
}
|
|
228
|
+
const balance = numeric(input.walletBalancePhs);
|
|
229
|
+
if (amount !== null && balance !== null && (input.tokenIn || "").toUpperCase() === "PROS") {
|
|
230
|
+
if (amount > balance) {
|
|
231
|
+
pushCheck(checks, "funding_balance", "fail", `Insufficient PROS balance. Have ${balance}, need ${amount}.`, reasons, requiredActions, "Insufficient PROS balance.", "Fund the wallet before executing.");
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
pushCheck(checks, "funding_balance", "pass", "Sufficient PROS balance for swap.");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (input.actionType === "custom_contract_call" && input.targetContract) {
|
|
239
|
+
if (isCanonicalInfrastructure(input.targetContract, isMainnet)) {
|
|
240
|
+
pushCheck(checks, "canonical_contract", "pass", `Contract ${input.targetContract} is recognized as official Pharos canonical infrastructure.`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
pushCheck(checks, "unknown_contract", "warn", `Contract ${input.targetContract} is not recognized as canonical Pharos infrastructure.`, reasons, requiredActions, undefined, "Review the contract interaction carefully before confirming.");
|
|
150
244
|
}
|
|
151
245
|
}
|
|
152
246
|
if (input.actionType === "x402_pay_and_fetch") {
|
|
@@ -157,30 +251,91 @@ export function evaluateActionPolicy(input) {
|
|
|
157
251
|
pushCheck(checks, "x402_url", "pass", "x402 URL passed static SSRF checks.");
|
|
158
252
|
}
|
|
159
253
|
const payment = numeric(input.paymentAmountUsdc);
|
|
160
|
-
|
|
161
|
-
|
|
254
|
+
const x402Limit = effectiveLimits.maxX402PaymentUSDC;
|
|
255
|
+
if (payment !== null && payment > x402Limit) {
|
|
256
|
+
pushCheck(checks, "x402_payment_limit", "fail", `x402 payment ${payment} USDC exceeds limit ${x402Limit} USDC (policy: ${policy.profile}).`, reasons, requiredActions, "x402 payment exceeds configured limit.", "Reduce payment amount or adjust agent policy.");
|
|
162
257
|
}
|
|
163
258
|
else {
|
|
164
|
-
pushCheck(checks, "x402_payment_limit", "pass", `x402 payment is within ${
|
|
259
|
+
pushCheck(checks, "x402_payment_limit", "pass", `x402 payment is within ${x402Limit} USDC limit (policy: ${policy.profile}).`);
|
|
165
260
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
261
|
+
const balance = numeric(input.walletBalancePhs);
|
|
262
|
+
if (payment !== null && balance !== null && (input.paymentTokenAddress || "").toLowerCase() === PACIFIC_USDC_ADDRESS.toLowerCase()) {
|
|
263
|
+
if (payment > balance) {
|
|
264
|
+
pushCheck(checks, "funding_balance_x402", "fail", `Insufficient USDC balance for x402 payment. Have ${balance}, need ${payment}.`, reasons, requiredActions, "Insufficient USDC balance.", "Fund the wallet with USDC.");
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
pushCheck(checks, "funding_balance_x402", "pass", "Sufficient USDC balance for x402 payment.");
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const allowedX402Tokens = activeX402AllowedTokenAddresses().map((a) => a.toLowerCase());
|
|
271
|
+
if (input.paymentTokenAddress && !allowedX402Tokens.includes(input.paymentTokenAddress.toLowerCase())) {
|
|
272
|
+
const mainnetMsg = `supported x402 payment tokens are Pacific USDC (${PACIFIC_USDC_ADDRESS}) or Pacific WPROS (${PACIFIC_WPROS_ADDRESS})`;
|
|
273
|
+
const testnetMsg = `supported x402 payment tokens are USDC (${USDC_ADDRESS}) or WPROS (${WPROS_ADDRESS})`;
|
|
274
|
+
pushCheck(checks, "x402_payment_token", "fail", `Payment token ${input.paymentTokenAddress} is not a supported x402 payment token; ${isMainnet ? mainnetMsg : testnetMsg}.`, reasons, requiredActions, "x402 payment token is not supported for this network.", isMainnet ? "Use Pacific USDC or Pacific WPROS for x402 payments." : "Use the active network USDC or WPROS token for x402 payments.");
|
|
275
|
+
}
|
|
276
|
+
else if (input.paymentTokenAddress) {
|
|
277
|
+
pushCheck(checks, "x402_payment_token", "pass", `Payment token ${input.paymentTokenAddress} is supported for x402 on ${isMainnet ? "Pharos Pacific Mainnet" : "the active Pharos network"}.`);
|
|
169
278
|
}
|
|
170
279
|
}
|
|
171
280
|
const tokenStatus = input.tokenRegistryStatus;
|
|
172
281
|
if (tokenStatus === "CUSTOM_NON_REGISTRY" || tokenStatus === "UNKNOWN") {
|
|
173
282
|
pushCheck(checks, "token_registry", "warn", `Token registry status is ${tokenStatus}.`, reasons, requiredActions, undefined, "Review token contract before execution.");
|
|
174
283
|
}
|
|
175
|
-
if (input.tokenSecurityStatus === "unavailable"
|
|
176
|
-
|
|
284
|
+
if (input.tokenSecurityStatus === "unavailable") {
|
|
285
|
+
// Intel is MISSING (provider outage / token not indexed) — nothing was
|
|
286
|
+
// reviewed. Distinct check name so the write-execution gate can fail closed on it
|
|
287
|
+
// (a caller confirmation cannot substitute for intel that never existed).
|
|
288
|
+
pushCheck(checks, "token_security_intel_missing", "unknown", "Token security intelligence is unavailable (provider outage or token not indexed); the token was NOT reviewed.", reasons, requiredActions, undefined, "Retry when the token-security provider is reachable, or verify the token independently before executing.");
|
|
289
|
+
}
|
|
290
|
+
else if (input.tokenSecurityStatus === "unknown") {
|
|
291
|
+
pushCheck(checks, "token_security_provider", "unknown", "Token security provider is unavailable or unknown.", reasons, requiredActions, undefined, "Proceed only after manual token review.");
|
|
292
|
+
}
|
|
293
|
+
// ─── Advisory risk-engine evidence (write paths) ─────────────────────
|
|
294
|
+
// The risk engine never gates execution itself: its output arrives here as
|
|
295
|
+
// evidence and these checks are where the score/degradation actually decide.
|
|
296
|
+
if (input.risk) {
|
|
297
|
+
const risk = input.risk;
|
|
298
|
+
if (risk.score > RISK_BLOCK_THRESHOLD) {
|
|
299
|
+
pushCheck(checks, "risk_score", "fail", `Weighted risk score ${risk.score}/100 exceeds the block threshold (${RISK_BLOCK_THRESHOLD}).`, reasons, requiredActions, `Risk score ${risk.score}/100 exceeds the block threshold (${RISK_BLOCK_THRESHOLD}).`, "Review the risk reasons and adjust the transaction parameters significantly before retrying.");
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
pushCheck(checks, "risk_score", "pass", `Weighted risk score ${risk.score}/100 is within the block threshold (${RISK_BLOCK_THRESHOLD}).`);
|
|
303
|
+
}
|
|
304
|
+
if (typeof risk.counterpartyRisk === "number" && risk.counterpartyRisk >= COUNTERPARTY_CRITICAL_THRESHOLD) {
|
|
305
|
+
pushCheck(checks, "risk_counterparty", "fail", `Counterparty risk ${risk.counterpartyRisk}/100 is critical (≥ ${COUNTERPARTY_CRITICAL_THRESHOLD}): missing, invalid, or zero-address counterparty.`, reasons, requiredActions, "Critically risky counterparty (missing/invalid/zero recipient).", "Provide a valid, verified counterparty address.");
|
|
306
|
+
}
|
|
307
|
+
else if (typeof risk.counterpartyRisk === "number") {
|
|
308
|
+
pushCheck(checks, "risk_counterparty", "pass", `Counterparty risk ${risk.counterpartyRisk}/100 is below the critical threshold (${COUNTERPARTY_CRITICAL_THRESHOLD}).`);
|
|
309
|
+
}
|
|
310
|
+
if (risk.degraded) {
|
|
311
|
+
let detail = (risk.degradedReasons ?? []).join(" ") || "A critical risk signal could not be evaluated.";
|
|
312
|
+
if (risk.swapProviderNotConfigured && !detail.includes("SWAP_LIQUIDITY_NOT_CONFIGURED")) {
|
|
313
|
+
detail += " The swap liquidity provider is not configured for this chain (SWAP_LIQUIDITY_NOT_CONFIGURED), a permanent configuration state, not a transient outage.";
|
|
314
|
+
}
|
|
315
|
+
pushCheck(checks, "risk_degraded", "unknown", `Risk assessment is degraded: ${detail}`, reasons, requiredActions, undefined, "Re-invoke with confirm=true only after manually reviewing the degraded risk data.");
|
|
316
|
+
// Unknown-status checks do not populate `reasons`; surface the degradation
|
|
317
|
+
// detail there anyway so the CONFIRMATION_REQUIRED envelope explains itself
|
|
318
|
+
// (parity with the former tool-level degraded message).
|
|
319
|
+
reasons.push(`Risk assessment is degraded: ${detail}`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
pushCheck(checks, "risk_degraded", "pass", "No critical risk signal was missing during assessment.");
|
|
323
|
+
}
|
|
177
324
|
}
|
|
178
325
|
const riskLevel = classifyRisk(checks);
|
|
179
326
|
let decision = defaultDecision(riskLevel, checks);
|
|
180
|
-
|
|
327
|
+
// Soft, recoverable signals must NEVER downgrade a hard BLOCK. Only remap when
|
|
328
|
+
// the block is *solely* a funding shortfall (fundable) or when no hard fail
|
|
329
|
+
// exists at all (token-security unresolved → review before proceeding).
|
|
330
|
+
const hardFails = checks.filter((c) => c.status === "fail");
|
|
331
|
+
const onlyFundingFails = hardFails.length > 0 && hardFails.every((c) => c.name.includes("funding"));
|
|
332
|
+
const hasTokenUnknown = checks.some((c) => c.name.includes("token") && c.status === "unknown");
|
|
333
|
+
if (decision === "BLOCK" && onlyFundingFails) {
|
|
181
334
|
decision = "REQUIRE_FUNDING";
|
|
182
|
-
|
|
335
|
+
}
|
|
336
|
+
else if (decision !== "BLOCK" && hasTokenUnknown) {
|
|
183
337
|
decision = "REQUIRE_TOKEN_REVIEW";
|
|
338
|
+
}
|
|
184
339
|
return {
|
|
185
340
|
decision,
|
|
186
341
|
riskLevel,
|
|
@@ -193,9 +348,15 @@ export function evaluateActionPolicy(input) {
|
|
|
193
348
|
isMainnet,
|
|
194
349
|
};
|
|
195
350
|
}
|
|
351
|
+
/** Network-aware phrase for explanations — never hardcodes a single network. */
|
|
352
|
+
function networkPhrase(isMainnet) {
|
|
353
|
+
if (typeof isMainnet !== "boolean")
|
|
354
|
+
return "the Pharos network";
|
|
355
|
+
return isMainnet ? "Pharos Pacific Mainnet" : "Pharos Atlantic Testnet";
|
|
356
|
+
}
|
|
196
357
|
export function explainPolicyResult(result) {
|
|
197
358
|
if (result.decision === "ALLOW") {
|
|
198
|
-
return
|
|
359
|
+
return `This action was allowed because it targets ${networkPhrase(result.isMainnet)}, passed policy checks, and stayed within configured safety limits.`;
|
|
199
360
|
}
|
|
200
361
|
const reasonText = result.reasons.length > 0 ? result.reasons.join(" ") : "one or more safety checks failed or require review.";
|
|
201
362
|
const actionText = result.requiredActions.length > 0 ? ` SafeHands recommends: ${result.requiredActions.join(" ")}` : "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actionPolicyEngine.js","sourceRoot":"","sources":["../../../src/lib/policy/actionPolicyEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"actionPolicyEngine.js","sourceRoot":"","sources":["../../../src/lib/policy/actionPolicyEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type PolicyProfile = "conservative" | "balanced" | "advanced" | "custom";
|
|
2
|
+
export interface AgentPolicyLimits {
|
|
3
|
+
maxPaymentPROS: string;
|
|
4
|
+
maxSwapPROS: string;
|
|
5
|
+
maxDailySpendPROS: string;
|
|
6
|
+
maxX402PaymentUSDC: string;
|
|
7
|
+
maxApprovalUSDC: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AgentPolicyFlags {
|
|
10
|
+
allowUnknownTokens: boolean;
|
|
11
|
+
allowCustomContractCalls: boolean;
|
|
12
|
+
requireConfirmationAboveRisk: "LOW" | "MEDIUM" | "HIGH" | "CRITICAL";
|
|
13
|
+
}
|
|
14
|
+
export interface AgentPolicy {
|
|
15
|
+
profile: PolicyProfile;
|
|
16
|
+
limits: AgentPolicyLimits;
|
|
17
|
+
flags: AgentPolicyFlags;
|
|
18
|
+
}
|
|
19
|
+
export declare const POLICY_PROFILES: Record<Exclude<PolicyProfile, "custom">, AgentPolicy>;
|
|
20
|
+
export declare function isSafeAgentId(agentId: string): boolean;
|
|
21
|
+
export declare function loadAgentPolicy(agentId?: string): AgentPolicy;
|
|
22
|
+
export declare function saveAgentPolicy(agentId: string, policy: AgentPolicy): void;
|
|
23
|
+
export declare function resolveEffectiveLimits(policy: AgentPolicy): {
|
|
24
|
+
maxPaymentPROS: number;
|
|
25
|
+
maxSwapPROS: number;
|
|
26
|
+
maxX402PaymentUSDC: number;
|
|
27
|
+
maxApprovalUSDC: number;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=agentPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentPolicy.d.ts","sourceRoot":"","sources":["../../../src/lib/policy/agentPolicy.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,OAAO,CAAC;IAClC,4BAA4B,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACtE;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,WAAW,CA8CjF,CAAC;AAUF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAqDD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAsB7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAI1E;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,GAClB;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAOtG"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
export const POLICY_PROFILES = {
|
|
5
|
+
conservative: {
|
|
6
|
+
profile: "conservative",
|
|
7
|
+
limits: {
|
|
8
|
+
maxPaymentPROS: "0.1",
|
|
9
|
+
maxSwapPROS: "1",
|
|
10
|
+
maxDailySpendPROS: "5",
|
|
11
|
+
maxX402PaymentUSDC: "0.01",
|
|
12
|
+
maxApprovalUSDC: "10",
|
|
13
|
+
},
|
|
14
|
+
flags: {
|
|
15
|
+
allowUnknownTokens: false,
|
|
16
|
+
allowCustomContractCalls: false,
|
|
17
|
+
requireConfirmationAboveRisk: "LOW",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
balanced: {
|
|
21
|
+
profile: "balanced",
|
|
22
|
+
limits: {
|
|
23
|
+
maxPaymentPROS: "1",
|
|
24
|
+
maxSwapPROS: "10",
|
|
25
|
+
maxDailySpendPROS: "25",
|
|
26
|
+
maxX402PaymentUSDC: "0.1",
|
|
27
|
+
maxApprovalUSDC: "50",
|
|
28
|
+
},
|
|
29
|
+
flags: {
|
|
30
|
+
allowUnknownTokens: false,
|
|
31
|
+
allowCustomContractCalls: false,
|
|
32
|
+
requireConfirmationAboveRisk: "MEDIUM",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
advanced: {
|
|
36
|
+
profile: "advanced",
|
|
37
|
+
limits: {
|
|
38
|
+
maxPaymentPROS: "100",
|
|
39
|
+
maxSwapPROS: "1000",
|
|
40
|
+
maxDailySpendPROS: "5000",
|
|
41
|
+
maxX402PaymentUSDC: "1",
|
|
42
|
+
maxApprovalUSDC: "500",
|
|
43
|
+
},
|
|
44
|
+
flags: {
|
|
45
|
+
allowUnknownTokens: true,
|
|
46
|
+
allowCustomContractCalls: true,
|
|
47
|
+
requireConfirmationAboveRisk: "HIGH",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
function getPoliciesDir() {
|
|
52
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
53
|
+
return join(__dirname, "..", "..", "..", ".agents", "policies");
|
|
54
|
+
}
|
|
55
|
+
// agentId becomes a filename — it must NEVER be able to traverse out of the
|
|
56
|
+
// policies directory. Reject path separators and `..` before it touches the FS.
|
|
57
|
+
const SAFE_AGENT_ID = /^[A-Za-z0-9_.:-]+$/;
|
|
58
|
+
export function isSafeAgentId(agentId) {
|
|
59
|
+
return SAFE_AGENT_ID.test(agentId) && !agentId.includes("..");
|
|
60
|
+
}
|
|
61
|
+
function policyPath(agentId) {
|
|
62
|
+
if (!isSafeAgentId(agentId)) {
|
|
63
|
+
throw new Error(`Invalid agentId '${agentId}': only letters, digits and _ . : - are allowed (no path separators or '..').`);
|
|
64
|
+
}
|
|
65
|
+
return join(getPoliciesDir(), `${agentId}.json`);
|
|
66
|
+
}
|
|
67
|
+
function validatePolicy(raw) {
|
|
68
|
+
if (!raw || typeof raw !== "object")
|
|
69
|
+
return null;
|
|
70
|
+
const obj = raw;
|
|
71
|
+
const profile = obj.profile;
|
|
72
|
+
if (typeof profile !== "string")
|
|
73
|
+
return null;
|
|
74
|
+
if (!["conservative", "balanced", "advanced", "custom"].includes(profile))
|
|
75
|
+
return null;
|
|
76
|
+
const limits = obj.limits;
|
|
77
|
+
if (!limits || typeof limits !== "object")
|
|
78
|
+
return null;
|
|
79
|
+
const l = limits;
|
|
80
|
+
for (const key of ["maxPaymentPROS", "maxSwapPROS", "maxDailySpendPROS", "maxX402PaymentUSDC", "maxApprovalUSDC"]) {
|
|
81
|
+
if (typeof l[key] !== "string")
|
|
82
|
+
return null;
|
|
83
|
+
const n = Number(l[key]);
|
|
84
|
+
if (!Number.isFinite(n) || n < 0)
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const flags = obj.flags;
|
|
88
|
+
if (!flags || typeof flags !== "object")
|
|
89
|
+
return null;
|
|
90
|
+
const f = flags;
|
|
91
|
+
if (typeof f.allowUnknownTokens !== "boolean")
|
|
92
|
+
return null;
|
|
93
|
+
if (typeof f.allowCustomContractCalls !== "boolean")
|
|
94
|
+
return null;
|
|
95
|
+
if (typeof f.requireConfirmationAboveRisk !== "string")
|
|
96
|
+
return null;
|
|
97
|
+
if (!["LOW", "MEDIUM", "HIGH", "CRITICAL"].includes(f.requireConfirmationAboveRisk))
|
|
98
|
+
return null;
|
|
99
|
+
return {
|
|
100
|
+
profile: profile,
|
|
101
|
+
limits: l,
|
|
102
|
+
flags: f,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Fail-closed fallback: a policy file that EXISTS but is malformed or
|
|
107
|
+
* invalid must never silently degrade to the more permissive `balanced`
|
|
108
|
+
* profile (a typo in a conservative custom policy would otherwise 10× the
|
|
109
|
+
* per-tx limits). Warn the operator and pin the most restrictive profile.
|
|
110
|
+
*/
|
|
111
|
+
function invalidPolicyFallback(label, path) {
|
|
112
|
+
console.warn(`[SafeHands policy] ${label} policy file exists but is malformed or invalid; falling back to the 'conservative' profile (fail-closed). Fix ${path} to restore the intended limits.`);
|
|
113
|
+
return POLICY_PROFILES.conservative;
|
|
114
|
+
}
|
|
115
|
+
export function loadAgentPolicy(agentId) {
|
|
116
|
+
if (agentId && isSafeAgentId(agentId)) {
|
|
117
|
+
const specific = policyPath(agentId);
|
|
118
|
+
if (existsSync(specific)) {
|
|
119
|
+
try {
|
|
120
|
+
const parsed = validatePolicy(JSON.parse(readFileSync(specific, "utf-8")));
|
|
121
|
+
if (parsed)
|
|
122
|
+
return parsed;
|
|
123
|
+
}
|
|
124
|
+
catch { /* malformed JSON — fail closed below */ }
|
|
125
|
+
return invalidPolicyFallback(`Agent '${agentId}'`, specific);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const defaultPath = policyPath("default");
|
|
129
|
+
if (existsSync(defaultPath)) {
|
|
130
|
+
try {
|
|
131
|
+
const parsed = validatePolicy(JSON.parse(readFileSync(defaultPath, "utf-8")));
|
|
132
|
+
if (parsed)
|
|
133
|
+
return parsed;
|
|
134
|
+
}
|
|
135
|
+
catch { /* malformed JSON — fail closed below */ }
|
|
136
|
+
return invalidPolicyFallback("Default", defaultPath);
|
|
137
|
+
}
|
|
138
|
+
return POLICY_PROFILES.balanced;
|
|
139
|
+
}
|
|
140
|
+
export function saveAgentPolicy(agentId, policy) {
|
|
141
|
+
const dir = getPoliciesDir();
|
|
142
|
+
if (!existsSync(dir))
|
|
143
|
+
mkdirSync(dir, { recursive: true });
|
|
144
|
+
writeFileSync(policyPath(agentId), JSON.stringify(policy, null, 2), "utf-8");
|
|
145
|
+
}
|
|
146
|
+
export function resolveEffectiveLimits(policy) {
|
|
147
|
+
return {
|
|
148
|
+
maxPaymentPROS: Number(policy.limits.maxPaymentPROS),
|
|
149
|
+
maxSwapPROS: Number(policy.limits.maxSwapPROS),
|
|
150
|
+
maxX402PaymentUSDC: Number(policy.limits.maxX402PaymentUSDC),
|
|
151
|
+
maxApprovalUSDC: Number(policy.limits.maxApprovalUSDC),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=agentPolicy.js.map
|