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
package/dist/lib/riskEngine.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
// ─── Risk Scoring Engine
|
|
1
|
+
// ─── Risk Scoring Engine (ADVISORY) ────────────────────────────────────
|
|
2
2
|
// 5-dimension risk assessment engine for SafeHands.
|
|
3
3
|
// Weights: liquidity 25%, slippage 25%, counterparty 20%,
|
|
4
4
|
// balance 15%, market conditions 15%
|
|
5
|
+
//
|
|
6
|
+
// This engine never gates execution. Its output is advisory: published
|
|
7
|
+
// on-chain as part of the assessment record (publish_risk_score) and fed to
|
|
8
|
+
// the actionPolicyEngine as evidence (riskEvidenceFromAssessment) — the
|
|
9
|
+
// policy engine is the sole ALLOW/BLOCK decider on write paths
|
|
10
|
+
// (docs/DECISION_CONTRACT.md).
|
|
5
11
|
// ────────────────────────────────────────────────────────────────────────
|
|
6
12
|
import { publicClient } from "./pharosClient.js";
|
|
7
|
-
import { getDodoRoute, isNativeToken, resolveTokenAddress, resolveTokenDecimals, toWei, } from "./dodoApi.js";
|
|
8
|
-
import { RISK_WEIGHTS, RISK_BLOCK_THRESHOLD, MAX_SLIPPAGE_PCT, MAX_BALANCE_USAGE_PCT, ERC20_ABI, } from "./constants.js";
|
|
13
|
+
import { getDodoRoute, isNativeToken, resolveTokenAddress, resolveTokenDecimals, toWei, DodoNotConfiguredError, } from "./dodoApi.js";
|
|
14
|
+
import { RISK_WEIGHTS, RISK_BLOCK_THRESHOLD, COUNTERPARTY_CRITICAL_THRESHOLD, MAX_SLIPPAGE_PCT, MAX_BALANCE_USAGE_PCT, ERC20_ABI, CHAIN_ID, } from "./constants.js";
|
|
15
|
+
import { addressTrustEvidence } from "./ecosystemRegistry.js";
|
|
9
16
|
import { formatEther, isAddress, parseEther } from "viem";
|
|
10
17
|
// ─── Helpers ───────────────────────────────────────────────────────────
|
|
11
18
|
function clamp(value, min = 0, max = 100) {
|
|
@@ -39,32 +46,37 @@ function weightedAverage(breakdown) {
|
|
|
39
46
|
/**
|
|
40
47
|
* Pre-fetches the DODO route quote once for swap actions.
|
|
41
48
|
* Both scoreLiquidity and scoreSlippage use this cached result.
|
|
49
|
+
* `notConfigured` distinguishes the structural provider-not-configured state
|
|
50
|
+
* (SWAP_LIQUIDITY_NOT_CONFIGURED) from a transient fetch failure.
|
|
42
51
|
*/
|
|
43
52
|
async function fetchSwapQuote(input) {
|
|
44
53
|
if (input.action !== "swap")
|
|
45
|
-
return null;
|
|
54
|
+
return { quote: null, notConfigured: false };
|
|
46
55
|
try {
|
|
47
|
-
|
|
56
|
+
const quote = await getDodoRoute({
|
|
48
57
|
fromToken: input.tokenIn,
|
|
49
58
|
toToken: input.tokenOut,
|
|
50
59
|
amountHuman: input.amount,
|
|
51
60
|
walletAddress: input.walletAddress,
|
|
52
61
|
});
|
|
62
|
+
return { quote, notConfigured: false };
|
|
53
63
|
}
|
|
54
|
-
catch {
|
|
55
|
-
return null;
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { quote: null, notConfigured: err instanceof DodoNotConfiguredError };
|
|
56
66
|
}
|
|
57
67
|
}
|
|
58
|
-
function scoreLiquidity(input, quote) {
|
|
68
|
+
function scoreLiquidity(input, quote, notConfigured) {
|
|
59
69
|
const reasons = [];
|
|
60
70
|
if (input.action !== "swap")
|
|
61
71
|
return { score: 0, reasons };
|
|
62
72
|
if (!quote) {
|
|
63
|
-
reasons.push(
|
|
73
|
+
reasons.push(notConfigured
|
|
74
|
+
? `Swap liquidity provider is not configured for chainId ${CHAIN_ID} (SWAP_LIQUIDITY_NOT_CONFIGURED); liquidity cannot be verified on this network.`
|
|
75
|
+
: "Failed to fetch liquidity data: route provider unavailable.");
|
|
64
76
|
return { score: 70, reasons };
|
|
65
77
|
}
|
|
66
78
|
if (!quote.routeAvailable) {
|
|
67
|
-
reasons.push("No swap route available
|
|
79
|
+
reasons.push("No swap route available; liquidity may be exhausted");
|
|
68
80
|
return { score: 100, reasons };
|
|
69
81
|
}
|
|
70
82
|
const impact = Math.abs(quote.priceImpact);
|
|
@@ -79,16 +91,18 @@ function scoreLiquidity(input, quote) {
|
|
|
79
91
|
reasons.push(`Price impact acceptable: ${impact.toFixed(2)}%`);
|
|
80
92
|
return { score: clamp(impact * 15), reasons };
|
|
81
93
|
}
|
|
82
|
-
function scoreSlippage(input, quote) {
|
|
94
|
+
function scoreSlippage(input, quote, notConfigured) {
|
|
83
95
|
const reasons = [];
|
|
84
96
|
if (input.action !== "swap")
|
|
85
97
|
return { score: 0, reasons };
|
|
86
98
|
if (!quote) {
|
|
87
|
-
reasons.push(
|
|
99
|
+
reasons.push(notConfigured
|
|
100
|
+
? `Slippage cannot be estimated: swap route provider not configured for chainId ${CHAIN_ID} (SWAP_LIQUIDITY_NOT_CONFIGURED).`
|
|
101
|
+
: "Slippage estimation failed: route provider unavailable.");
|
|
88
102
|
return { score: 60, reasons };
|
|
89
103
|
}
|
|
90
104
|
if (!quote.routeAvailable) {
|
|
91
|
-
reasons.push("Cannot estimate slippage
|
|
105
|
+
reasons.push("Cannot estimate slippage: no route");
|
|
92
106
|
return { score: 90, reasons };
|
|
93
107
|
}
|
|
94
108
|
const impact = Math.abs(quote.priceImpact);
|
|
@@ -99,12 +113,28 @@ function scoreSlippage(input, quote) {
|
|
|
99
113
|
reasons.push(`Estimated slippage: ${impact.toFixed(2)}%`);
|
|
100
114
|
return { score: clamp(impact * 16), reasons };
|
|
101
115
|
}
|
|
102
|
-
async function scoreCounterparty(input) {
|
|
116
|
+
async function scoreCounterparty(input, quote) {
|
|
103
117
|
const reasons = [];
|
|
104
118
|
if (input.action === "swap") {
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
119
|
+
// Registry-driven counterparty trust ONLY. The former unconditional
|
|
120
|
+
// "DODO protocol (known) → 5" relaxed risk with a testnet-provenance claim
|
|
121
|
+
// that holds on no network per the ecosystem registry.
|
|
122
|
+
const router = quote?.routeAvailable && isAddress(quote.to) ? quote.to : null;
|
|
123
|
+
if (!router) {
|
|
124
|
+
reasons.push("Swap counterparty (router) could not be determined; no route data to evaluate.");
|
|
125
|
+
return { score: 55, reasons };
|
|
126
|
+
}
|
|
127
|
+
const evidence = addressTrustEvidence(router, CHAIN_ID);
|
|
128
|
+
if (evidence.verifiedCanonical) {
|
|
129
|
+
reasons.push(`Swap router ${evidence.contractLabel ?? router} is VERIFIED in the SafeHands ecosystem registry.`);
|
|
130
|
+
return { score: 5, reasons };
|
|
131
|
+
}
|
|
132
|
+
if (evidence.recognized) {
|
|
133
|
+
reasons.push(`Swap router matches ecosystem-registry entry "${evidence.contractLabel}" (${evidence.verificationStatus}); recognition only, not a safety signal.`);
|
|
134
|
+
return { score: 40, reasons };
|
|
135
|
+
}
|
|
136
|
+
reasons.push(`Swap router ${router} is not in the SafeHands ecosystem registry: unverified counterparty (the execution allowlist still constrains which router may execute at write time).`);
|
|
137
|
+
return { score: 55, reasons };
|
|
108
138
|
}
|
|
109
139
|
// For transfers, check the recipient address
|
|
110
140
|
const to = input.toAddress;
|
|
@@ -118,19 +148,19 @@ async function scoreCounterparty(input) {
|
|
|
118
148
|
}
|
|
119
149
|
// Zero address check
|
|
120
150
|
if (to === "0x0000000000000000000000000000000000000000") {
|
|
121
|
-
reasons.push("Sending to zero address
|
|
151
|
+
reasons.push("Sending to zero address; tokens will be burned");
|
|
122
152
|
return { score: 95, reasons };
|
|
123
153
|
}
|
|
124
154
|
// Self-send check
|
|
125
155
|
if (to.toLowerCase() === input.walletAddress.toLowerCase()) {
|
|
126
|
-
reasons.push("Sending to own address
|
|
156
|
+
reasons.push("Sending to own address; likely unintended");
|
|
127
157
|
return { score: 50, reasons };
|
|
128
158
|
}
|
|
129
159
|
// Check if address has code (is a contract)
|
|
130
160
|
try {
|
|
131
161
|
const code = await publicClient.getCode({ address: to });
|
|
132
162
|
if (code && code !== "0x") {
|
|
133
|
-
reasons.push("Recipient is a contract address
|
|
163
|
+
reasons.push("Recipient is a contract address; verify intent");
|
|
134
164
|
return { score: 40, reasons };
|
|
135
165
|
}
|
|
136
166
|
}
|
|
@@ -141,7 +171,7 @@ async function scoreCounterparty(input) {
|
|
|
141
171
|
try {
|
|
142
172
|
const balance = await publicClient.getBalance({ address: to });
|
|
143
173
|
if (balance === 0n) {
|
|
144
|
-
reasons.push("Recipient has zero balance
|
|
174
|
+
reasons.push("Recipient has zero balance; new or unused address");
|
|
145
175
|
return { score: 30, reasons };
|
|
146
176
|
}
|
|
147
177
|
}
|
|
@@ -155,19 +185,19 @@ async function scoreBalance(input) {
|
|
|
155
185
|
const reasons = [];
|
|
156
186
|
try {
|
|
157
187
|
const walletAddr = input.walletAddress;
|
|
158
|
-
if (input.action === "transfer" || (input.action === "swap" && isNativeToken(input.tokenIn || "
|
|
159
|
-
// Check native
|
|
188
|
+
if (input.action === "transfer" || (input.action === "swap" && isNativeToken(input.tokenIn || "PROS"))) {
|
|
189
|
+
// Check native PROS balance
|
|
160
190
|
const balance = await publicClient.getBalance({ address: walletAddr });
|
|
161
191
|
const amountWei = parseEther(input.amount);
|
|
162
|
-
const gasBuffer = parseEther("0.01"); // ~0.01
|
|
192
|
+
const gasBuffer = parseEther("0.01"); // ~0.01 PROS for gas
|
|
163
193
|
if (balance < amountWei + gasBuffer) {
|
|
164
194
|
const balanceHuman = formatEther(balance);
|
|
165
|
-
reasons.push(`Insufficient
|
|
195
|
+
reasons.push(`Insufficient PROS balance: have ${balanceHuman}, need ${input.amount} + gas`);
|
|
166
196
|
return { score: 100, reasons };
|
|
167
197
|
}
|
|
168
198
|
const usagePct = Number((amountWei * 100n) / balance);
|
|
169
199
|
if (usagePct > MAX_BALANCE_USAGE_PCT) {
|
|
170
|
-
reasons.push(`Using ${usagePct}% of wallet balance
|
|
200
|
+
reasons.push(`Using ${usagePct}% of wallet balance; high exposure`);
|
|
171
201
|
return { score: clamp(60 + (usagePct - MAX_BALANCE_USAGE_PCT)), reasons };
|
|
172
202
|
}
|
|
173
203
|
reasons.push(`Balance sufficient, using ${usagePct}% of wallet`);
|
|
@@ -191,7 +221,7 @@ async function scoreBalance(input) {
|
|
|
191
221
|
// Also check gas balance
|
|
192
222
|
const ethBalance = await publicClient.getBalance({ address: walletAddr });
|
|
193
223
|
if (ethBalance < parseEther("0.005")) {
|
|
194
|
-
reasons.push("Very low
|
|
224
|
+
reasons.push("Very low PROS balance for gas fees");
|
|
195
225
|
return { score: 80, reasons };
|
|
196
226
|
}
|
|
197
227
|
reasons.push("Token and gas balance sufficient");
|
|
@@ -201,7 +231,7 @@ async function scoreBalance(input) {
|
|
|
201
231
|
}
|
|
202
232
|
catch (err) {
|
|
203
233
|
reasons.push(`Balance check failed: ${err.message}`);
|
|
204
|
-
return { score: 50, reasons };
|
|
234
|
+
return { score: 50, reasons, degraded: true };
|
|
205
235
|
}
|
|
206
236
|
}
|
|
207
237
|
async function scoreMarketCondition(_input) {
|
|
@@ -215,7 +245,7 @@ async function scoreMarketCondition(_input) {
|
|
|
215
245
|
const timeDiff = Number(latestBlock.timestamp - prevBlock.timestamp);
|
|
216
246
|
const avgBlockTime = timeDiff / 10;
|
|
217
247
|
if (avgBlockTime > 30) {
|
|
218
|
-
reasons.push(`Slow block production: ~${avgBlockTime.toFixed(1)}s/block
|
|
248
|
+
reasons.push(`Slow block production: ~${avgBlockTime.toFixed(1)}s/block; chain may be congested`);
|
|
219
249
|
return { score: 60, reasons };
|
|
220
250
|
}
|
|
221
251
|
if (avgBlockTime > 15) {
|
|
@@ -239,15 +269,15 @@ async function scoreMarketCondition(_input) {
|
|
|
239
269
|
}
|
|
240
270
|
// ─── Main Risk Assessment ──────────────────────────────────────────────
|
|
241
271
|
export async function assessRisk(input) {
|
|
242
|
-
// Fetch DODO route once and share between liquidity + slippage scorers
|
|
243
|
-
const swapQuote = await fetchSwapQuote(input);
|
|
272
|
+
// Fetch DODO route once and share between liquidity + slippage + counterparty scorers
|
|
273
|
+
const { quote: swapQuote, notConfigured: swapProviderNotConfigured } = await fetchSwapQuote(input);
|
|
244
274
|
const [counterparty, balance, market] = await Promise.all([
|
|
245
|
-
scoreCounterparty(input),
|
|
275
|
+
scoreCounterparty(input, swapQuote),
|
|
246
276
|
scoreBalance(input),
|
|
247
277
|
scoreMarketCondition(input),
|
|
248
278
|
]);
|
|
249
|
-
const liquidity = scoreLiquidity(input, swapQuote);
|
|
250
|
-
const slippage = scoreSlippage(input, swapQuote);
|
|
279
|
+
const liquidity = scoreLiquidity(input, swapQuote, swapProviderNotConfigured);
|
|
280
|
+
const slippage = scoreSlippage(input, swapQuote, swapProviderNotConfigured);
|
|
251
281
|
const breakdown = {
|
|
252
282
|
liquidityRisk: liquidity.score,
|
|
253
283
|
slippageRisk: slippage.score,
|
|
@@ -257,7 +287,32 @@ export async function assessRisk(input) {
|
|
|
257
287
|
};
|
|
258
288
|
const riskScore = clamp(weightedAverage(breakdown));
|
|
259
289
|
const riskLevel = computeRiskLevel(riskScore);
|
|
260
|
-
|
|
290
|
+
let recommendation = computeRecommendation(riskScore);
|
|
291
|
+
// Fail-closed on missing CRITICAL data. A swap whose route/liquidity could
|
|
292
|
+
// not be fetched, or any action whose balance check threw, must NOT be scored as
|
|
293
|
+
// safe on degraded inputs. Mark degraded and refuse to "proceed" silently.
|
|
294
|
+
const degradedReasons = [];
|
|
295
|
+
if (input.action === "swap" && swapQuote === null) {
|
|
296
|
+
degradedReasons.push(swapProviderNotConfigured
|
|
297
|
+
? `Swap liquidity provider is not configured for chainId ${CHAIN_ID} (SWAP_LIQUIDITY_NOT_CONFIGURED); this is a permanent configuration state on this network, not a transient outage.`
|
|
298
|
+
: "Liquidity/slippage could not be assessed: swap route fetch failed.");
|
|
299
|
+
}
|
|
300
|
+
if (balance.degraded) {
|
|
301
|
+
degradedReasons.push("Wallet balance could not be verified; RPC unavailable.");
|
|
302
|
+
}
|
|
303
|
+
const degraded = degradedReasons.length > 0;
|
|
304
|
+
if (degraded && recommendation === "proceed") {
|
|
305
|
+
recommendation = "caution";
|
|
306
|
+
}
|
|
307
|
+
// Advisory escalation mirroring the policy engine's `risk_counterparty`
|
|
308
|
+
// check (the actual block mechanism). Kept so the published recommendation
|
|
309
|
+
// stays honest for critically-risky transfers (missing / invalid / zero
|
|
310
|
+
// recipient): weighted heuristics alone can never cross the block threshold
|
|
311
|
+
// for a transfer, so without this the on-chain record would say "caution"
|
|
312
|
+
// where the policy engine blocks.
|
|
313
|
+
if (input.action === "transfer" && counterparty.score >= COUNTERPARTY_CRITICAL_THRESHOLD) {
|
|
314
|
+
recommendation = "block";
|
|
315
|
+
}
|
|
261
316
|
const reasons = [
|
|
262
317
|
...liquidity.reasons,
|
|
263
318
|
...slippage.reasons,
|
|
@@ -275,7 +330,7 @@ export async function assessRisk(input) {
|
|
|
275
330
|
}
|
|
276
331
|
else {
|
|
277
332
|
suggestion =
|
|
278
|
-
"High risk detected
|
|
333
|
+
"High risk detected: execution blocked for safety. Review the reasons and adjust your transaction parameters significantly before retrying.";
|
|
279
334
|
}
|
|
280
335
|
return {
|
|
281
336
|
riskScore,
|
|
@@ -284,6 +339,9 @@ export async function assessRisk(input) {
|
|
|
284
339
|
breakdown,
|
|
285
340
|
reasons,
|
|
286
341
|
suggestion,
|
|
342
|
+
degraded,
|
|
343
|
+
degradedReasons,
|
|
344
|
+
...(input.action === "swap" ? { swapProviderNotConfigured } : {}),
|
|
287
345
|
};
|
|
288
346
|
}
|
|
289
347
|
//# sourceMappingURL=riskEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"riskEngine.js","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"riskEngine.js","sourceRoot":"","sources":["../../src/lib/riskEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type RiskRecordInput } from "./merkleBatcher.js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize the DA batch JSON into typed RiskRecordInput[]. The writer may
|
|
4
|
+
* serialize expiresAt as a bigint-tagged string or a plain number, so we coerce
|
|
5
|
+
* defensively rather than trusting a single encoding.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeRiskRecords(raw: unknown): RiskRecordInput[];
|
|
8
|
+
export interface InclusionProof {
|
|
9
|
+
record: RiskRecordInput;
|
|
10
|
+
leaf: `0x${string}`;
|
|
11
|
+
proof: `0x${string}`[];
|
|
12
|
+
/** Root recomputed from the full batch — must equal the on-chain root for a valid claim. */
|
|
13
|
+
computedRoot: `0x${string}`;
|
|
14
|
+
/** merkletreejs verification of proof→leaf against the recomputed root. */
|
|
15
|
+
verifiedLocal: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Pure inclusion proof: find the record matching `match` in `records`, rebuild
|
|
19
|
+
* the tree, and produce the Merkle proof for its leaf. No network, no chain —
|
|
20
|
+
* fully unit-testable. Returns null when no record matches.
|
|
21
|
+
*/
|
|
22
|
+
export declare function proveInclusion(records: RiskRecordInput[], match: {
|
|
23
|
+
target: string;
|
|
24
|
+
actionHash?: string;
|
|
25
|
+
}): InclusionProof | null;
|
|
26
|
+
export interface RiskInclusionResult {
|
|
27
|
+
/** SAFEHANDS_REGISTRY_ADDRESS is set to a valid address. */
|
|
28
|
+
configured: boolean;
|
|
29
|
+
/** A non-zero Merkle root has been committed on-chain. */
|
|
30
|
+
committed: boolean;
|
|
31
|
+
onchainMerkleRoot: string | null;
|
|
32
|
+
dataURI: string | null;
|
|
33
|
+
/** A record for the target was located in the batch. */
|
|
34
|
+
found: boolean;
|
|
35
|
+
/** The recomputed batch root equals the committed on-chain root (DA is authentic & current). */
|
|
36
|
+
rootMatches: boolean;
|
|
37
|
+
/** Merkle proof verified locally (merkletreejs) against the recomputed root. */
|
|
38
|
+
verifiedLocal: boolean;
|
|
39
|
+
/** Contract verifyRiskRecord view returned true (trustless, composable). null = not attempted. */
|
|
40
|
+
verifiedOnchain: boolean | null;
|
|
41
|
+
/** Record's expiresAt has passed (on-chain verifyRiskRecord would revert with Expired). */
|
|
42
|
+
expired: boolean;
|
|
43
|
+
proof: string[] | null;
|
|
44
|
+
record: {
|
|
45
|
+
target: string;
|
|
46
|
+
actionHash: string;
|
|
47
|
+
score: number;
|
|
48
|
+
level: number;
|
|
49
|
+
recommendation: number;
|
|
50
|
+
policyVersionHash: string;
|
|
51
|
+
evidenceHash: string;
|
|
52
|
+
expiresAt: string;
|
|
53
|
+
} | null;
|
|
54
|
+
source: "onchain-view" | "local-only" | "unconfigured" | "not-committed" | "not-found" | "root-mismatch" | "error";
|
|
55
|
+
error?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* End-to-end keyless inclusion check for a target's risk record against the
|
|
59
|
+
* currently committed on-chain Merkle root. Fail-closed and neutral on every
|
|
60
|
+
* missing precondition (unconfigured, uncommitted, unreachable DA, not found).
|
|
61
|
+
* When `verifyOnchain` is true (default) it additionally calls the contract's
|
|
62
|
+
* verifyRiskRecord view so the "yes, this verdict is in the on-chain root" claim
|
|
63
|
+
* is proven trustlessly rather than only in-process.
|
|
64
|
+
*/
|
|
65
|
+
export declare function verifyRiskInclusion(match: {
|
|
66
|
+
target: string;
|
|
67
|
+
actionHash?: string;
|
|
68
|
+
}, opts?: {
|
|
69
|
+
verifyOnchain?: boolean;
|
|
70
|
+
registryAddress?: string;
|
|
71
|
+
}): Promise<RiskInclusionResult>;
|
|
72
|
+
//# sourceMappingURL=riskInclusion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riskInclusion.d.ts","sourceRoot":"","sources":["../../src/lib/riskInclusion.ts"],"names":[],"mappings":"AAaA,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAuB5F;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,EAAE,CAcpE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,KAAK,MAAM,EAAE,EAAE,CAAC;IACvB,4FAA4F;IAC5F,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EAAE,EAC1B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,cAAc,GAAG,IAAI,CAiBvB;AAED,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,UAAU,EAAE,OAAO,CAAC;IACpB,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,gGAAgG;IAChG,WAAW,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,aAAa,EAAE,OAAO,CAAC;IACvB,kGAAkG;IAClG,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,2FAA2F;IAC3F,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,eAAe,GAAG,OAAO,CAAC;IACnH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoCD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,OAAO,CAAC,mBAAmB,CAAC,CAgJ9B"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// ─── L1 Merkle inclusion read-path ─────────────────────────────────────
|
|
2
|
+
// The keyless consumer that closes the L1 on-chain-memory loop. commitRiskRoot
|
|
3
|
+
// publishes a Merkle root (on-chain) + a data-availability pointer to the batch
|
|
4
|
+
// JSON (off-chain). This module reads that root, fetches the batch, and proves a
|
|
5
|
+
// single risk record is included — both locally and, for trustlessness, through
|
|
6
|
+
// the contract's own verifyRiskRecord view. No private key is ever touched: this
|
|
7
|
+
// is a pure read/verify path, safe for the zero-custody public profile.
|
|
8
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
9
|
+
import { isAddress, keccak256 } from "viem";
|
|
10
|
+
import { MerkleTree } from "merkletreejs";
|
|
11
|
+
import { publicClient } from "./pharosClient.js";
|
|
12
|
+
import { fetchWithTimeoutAndRetry } from "./http.js";
|
|
13
|
+
import { buildMerkleTree, computeRiskLeaf } from "./merkleBatcher.js";
|
|
14
|
+
import { SAFEHANDS_REGISTRY_ADDRESS, SAFEHANDS_REGISTRY_ABI } from "./constants.js";
|
|
15
|
+
const ZERO_ROOT = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
16
|
+
function registryAddress() {
|
|
17
|
+
return SAFEHANDS_REGISTRY_ADDRESS && isAddress(SAFEHANDS_REGISTRY_ADDRESS)
|
|
18
|
+
? SAFEHANDS_REGISTRY_ADDRESS
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
/** Coerce expiresAt from any serialized form ("123n" suffixed, numeric string, number, bigint). */
|
|
22
|
+
function toBigInt(value) {
|
|
23
|
+
if (typeof value === "bigint")
|
|
24
|
+
return value;
|
|
25
|
+
if (typeof value === "number")
|
|
26
|
+
return BigInt(Math.trunc(value));
|
|
27
|
+
if (typeof value === "string") {
|
|
28
|
+
const trimmed = value.trim();
|
|
29
|
+
const digits = /n$/.test(trimmed) ? trimmed.slice(0, -1) : trimmed;
|
|
30
|
+
if (/^\d+$/.test(digits))
|
|
31
|
+
return BigInt(digits);
|
|
32
|
+
}
|
|
33
|
+
return 0n;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Normalize the DA batch JSON into typed RiskRecordInput[]. The writer may
|
|
37
|
+
* serialize expiresAt as a bigint-tagged string or a plain number, so we coerce
|
|
38
|
+
* defensively rather than trusting a single encoding.
|
|
39
|
+
*/
|
|
40
|
+
export function normalizeRiskRecords(raw) {
|
|
41
|
+
if (!Array.isArray(raw))
|
|
42
|
+
return [];
|
|
43
|
+
return raw
|
|
44
|
+
.filter((r) => r && typeof r === "object")
|
|
45
|
+
.map((r) => ({
|
|
46
|
+
target: String(r.target ?? ""),
|
|
47
|
+
actionHash: String(r.actionHash ?? ""),
|
|
48
|
+
score: Number(r.score ?? 0),
|
|
49
|
+
level: Number(r.level ?? 0),
|
|
50
|
+
recommendation: Number(r.recommendation ?? 0),
|
|
51
|
+
policyVersionHash: String(r.policyVersionHash ?? ""),
|
|
52
|
+
evidenceHash: String(r.evidenceHash ?? ""),
|
|
53
|
+
expiresAt: toBigInt(r.expiresAt),
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Pure inclusion proof: find the record matching `match` in `records`, rebuild
|
|
58
|
+
* the tree, and produce the Merkle proof for its leaf. No network, no chain —
|
|
59
|
+
* fully unit-testable. Returns null when no record matches.
|
|
60
|
+
*/
|
|
61
|
+
export function proveInclusion(records, match) {
|
|
62
|
+
const target = match.target.toLowerCase();
|
|
63
|
+
const actionHash = match.actionHash?.toLowerCase();
|
|
64
|
+
const record = records.find((r) => r.target.toLowerCase() === target &&
|
|
65
|
+
(actionHash === undefined || r.actionHash.toLowerCase() === actionHash));
|
|
66
|
+
if (!record)
|
|
67
|
+
return null;
|
|
68
|
+
const tree = buildMerkleTree(records);
|
|
69
|
+
const leaf = computeRiskLeaf(record);
|
|
70
|
+
const proof = tree.getHexProof(leaf);
|
|
71
|
+
const computedRoot = tree.getHexRoot();
|
|
72
|
+
const verifiedLocal = MerkleTree.verify(proof, leaf, computedRoot, keccak256, { sortPairs: true });
|
|
73
|
+
return { record, leaf, proof, computedRoot, verifiedLocal };
|
|
74
|
+
}
|
|
75
|
+
function neutral(partial) {
|
|
76
|
+
return {
|
|
77
|
+
configured: false,
|
|
78
|
+
committed: false,
|
|
79
|
+
onchainMerkleRoot: null,
|
|
80
|
+
dataURI: null,
|
|
81
|
+
found: false,
|
|
82
|
+
rootMatches: false,
|
|
83
|
+
verifiedLocal: false,
|
|
84
|
+
verifiedOnchain: null,
|
|
85
|
+
expired: false,
|
|
86
|
+
proof: null,
|
|
87
|
+
record: null,
|
|
88
|
+
source: "unconfigured",
|
|
89
|
+
...partial,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function fetchBatch(dataURI) {
|
|
93
|
+
if (!/^https?:\/\//i.test(dataURI)) {
|
|
94
|
+
throw new Error(`Unsupported data-availability URI scheme: ${dataURI}. Only http(s) batch pointers are resolvable by this read-path.`);
|
|
95
|
+
}
|
|
96
|
+
// dataURI is operator-controlled (read from chain), so fetch through the
|
|
97
|
+
// SSRF-guarded layer (DNS-pinned lookup, blocked internal ranges, redirect
|
|
98
|
+
// re-validation) — a malicious/compromised operator must not be able to point
|
|
99
|
+
// this read-path at internal endpoints. The Merkle-root comparison downstream
|
|
100
|
+
// already detects content tampering; this guards the request itself.
|
|
101
|
+
const res = await fetchWithTimeoutAndRetry(dataURI, { timeoutMs: 10_000, retries: 0 });
|
|
102
|
+
if (!res.ok)
|
|
103
|
+
throw new Error(`DA fetch failed: HTTP ${res.status} for ${dataURI}`);
|
|
104
|
+
return res.json();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* End-to-end keyless inclusion check for a target's risk record against the
|
|
108
|
+
* currently committed on-chain Merkle root. Fail-closed and neutral on every
|
|
109
|
+
* missing precondition (unconfigured, uncommitted, unreachable DA, not found).
|
|
110
|
+
* When `verifyOnchain` is true (default) it additionally calls the contract's
|
|
111
|
+
* verifyRiskRecord view so the "yes, this verdict is in the on-chain root" claim
|
|
112
|
+
* is proven trustlessly rather than only in-process.
|
|
113
|
+
*/
|
|
114
|
+
export async function verifyRiskInclusion(match, opts = {}) {
|
|
115
|
+
// An explicit registryAddress override (incl. "") lets callers/tests exercise the
|
|
116
|
+
// fail-closed branch deterministically without touching env or the network.
|
|
117
|
+
const address = opts.registryAddress !== undefined
|
|
118
|
+
? (opts.registryAddress && isAddress(opts.registryAddress) ? opts.registryAddress : null)
|
|
119
|
+
: registryAddress();
|
|
120
|
+
if (!address) {
|
|
121
|
+
return neutral({ source: "unconfigured", error: "SAFEHANDS_REGISTRY_ADDRESS not configured." });
|
|
122
|
+
}
|
|
123
|
+
let onchainMerkleRoot;
|
|
124
|
+
let dataURI;
|
|
125
|
+
try {
|
|
126
|
+
[onchainMerkleRoot, dataURI] = (await Promise.all([
|
|
127
|
+
publicClient.readContract({ address, abi: SAFEHANDS_REGISTRY_ABI, functionName: "currentMerkleRoot", args: [] }),
|
|
128
|
+
publicClient.readContract({ address, abi: SAFEHANDS_REGISTRY_ABI, functionName: "currentDataURI", args: [] }),
|
|
129
|
+
]));
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
return neutral({ configured: true, source: "error", error: `Registry read failed: ${err.message}` });
|
|
133
|
+
}
|
|
134
|
+
if (!onchainMerkleRoot || onchainMerkleRoot === ZERO_ROOT) {
|
|
135
|
+
return neutral({ configured: true, onchainMerkleRoot, dataURI, source: "not-committed" });
|
|
136
|
+
}
|
|
137
|
+
let records;
|
|
138
|
+
try {
|
|
139
|
+
records = normalizeRiskRecords(await fetchBatch(dataURI));
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return neutral({
|
|
143
|
+
configured: true,
|
|
144
|
+
committed: true,
|
|
145
|
+
onchainMerkleRoot,
|
|
146
|
+
dataURI,
|
|
147
|
+
source: "error",
|
|
148
|
+
error: err.message,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const proven = proveInclusion(records, match);
|
|
152
|
+
if (!proven) {
|
|
153
|
+
return neutral({
|
|
154
|
+
configured: true,
|
|
155
|
+
committed: true,
|
|
156
|
+
onchainMerkleRoot,
|
|
157
|
+
dataURI,
|
|
158
|
+
source: "not-found",
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const rootMatches = proven.computedRoot.toLowerCase() === onchainMerkleRoot.toLowerCase();
|
|
162
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
163
|
+
const expired = proven.record.expiresAt !== 0n && proven.record.expiresAt < now;
|
|
164
|
+
const record = {
|
|
165
|
+
target: proven.record.target,
|
|
166
|
+
actionHash: proven.record.actionHash,
|
|
167
|
+
score: proven.record.score,
|
|
168
|
+
level: proven.record.level,
|
|
169
|
+
recommendation: proven.record.recommendation,
|
|
170
|
+
policyVersionHash: proven.record.policyVersionHash,
|
|
171
|
+
evidenceHash: proven.record.evidenceHash,
|
|
172
|
+
expiresAt: proven.record.expiresAt === 0n ? "never" : proven.record.expiresAt.toString(),
|
|
173
|
+
};
|
|
174
|
+
// If the batch we fetched does not hash to the committed root, the DA content is
|
|
175
|
+
// stale or tampered — the proof is meaningless. Fail loudly rather than half-pass.
|
|
176
|
+
if (!rootMatches) {
|
|
177
|
+
return {
|
|
178
|
+
...neutral({}),
|
|
179
|
+
configured: true,
|
|
180
|
+
committed: true,
|
|
181
|
+
onchainMerkleRoot,
|
|
182
|
+
dataURI,
|
|
183
|
+
found: true,
|
|
184
|
+
rootMatches: false,
|
|
185
|
+
verifiedLocal: proven.verifiedLocal,
|
|
186
|
+
verifiedOnchain: null,
|
|
187
|
+
expired,
|
|
188
|
+
proof: proven.proof,
|
|
189
|
+
record,
|
|
190
|
+
source: "root-mismatch",
|
|
191
|
+
error: "Recomputed batch root does not match the on-chain committed root (stale or tampered data availability).",
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
let verifiedOnchain = null;
|
|
195
|
+
const shouldVerifyOnchain = opts.verifyOnchain !== false;
|
|
196
|
+
if (shouldVerifyOnchain) {
|
|
197
|
+
try {
|
|
198
|
+
verifiedOnchain = (await publicClient.readContract({
|
|
199
|
+
address,
|
|
200
|
+
abi: SAFEHANDS_REGISTRY_ABI,
|
|
201
|
+
functionName: "verifyRiskRecord",
|
|
202
|
+
args: [
|
|
203
|
+
proven.record.target,
|
|
204
|
+
proven.record.actionHash,
|
|
205
|
+
proven.record.score,
|
|
206
|
+
proven.record.level,
|
|
207
|
+
proven.record.recommendation,
|
|
208
|
+
proven.record.policyVersionHash,
|
|
209
|
+
proven.record.evidenceHash,
|
|
210
|
+
proven.record.expiresAt,
|
|
211
|
+
proven.proof,
|
|
212
|
+
],
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
// Expired() revert is a legitimate on-chain answer, not an infra failure.
|
|
217
|
+
verifiedOnchain = false;
|
|
218
|
+
if (!expired) {
|
|
219
|
+
return {
|
|
220
|
+
configured: true,
|
|
221
|
+
committed: true,
|
|
222
|
+
onchainMerkleRoot,
|
|
223
|
+
dataURI,
|
|
224
|
+
found: true,
|
|
225
|
+
rootMatches: true,
|
|
226
|
+
verifiedLocal: proven.verifiedLocal,
|
|
227
|
+
verifiedOnchain: false,
|
|
228
|
+
expired,
|
|
229
|
+
proof: proven.proof,
|
|
230
|
+
record,
|
|
231
|
+
source: "error",
|
|
232
|
+
error: `On-chain verifyRiskRecord failed: ${err.message}`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
configured: true,
|
|
239
|
+
committed: true,
|
|
240
|
+
onchainMerkleRoot,
|
|
241
|
+
dataURI,
|
|
242
|
+
found: true,
|
|
243
|
+
rootMatches: true,
|
|
244
|
+
verifiedLocal: proven.verifiedLocal,
|
|
245
|
+
verifiedOnchain,
|
|
246
|
+
expired,
|
|
247
|
+
proof: proven.proof,
|
|
248
|
+
record,
|
|
249
|
+
source: shouldVerifyOnchain ? "onchain-view" : "local-only",
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=riskInclusion.js.map
|