safehands-pharos 1.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/policies/default.json +15 -0
- package/.env.example +81 -64
- package/README.md +301 -444
- package/SECURITY.md +112 -0
- package/SKILL.md +59 -0
- package/contracts/SafeHandsAttestation.sol +182 -0
- package/contracts/SafeHandsRegistry.sol +149 -0
- package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
- package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
- package/dist/agent/SafeHandsGuardianAgent.js +98 -0
- package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
- package/dist/agent/agentDecisionFormatter.d.ts +43 -0
- package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
- package/dist/agent/agentDecisionFormatter.js +96 -0
- package/dist/agent/agentDecisionFormatter.js.map +1 -0
- package/dist/agent/agentEnrich.d.ts +28 -0
- package/dist/agent/agentEnrich.d.ts.map +1 -0
- package/dist/agent/agentEnrich.js +99 -0
- package/dist/agent/agentEnrich.js.map +1 -0
- package/dist/agent/agentIntentClassifier.d.ts +44 -0
- package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
- package/dist/agent/agentIntentClassifier.js +77 -0
- package/dist/agent/agentIntentClassifier.js.map +1 -0
- package/dist/agent/agentPolicyResolver.d.ts +44 -0
- package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
- package/dist/agent/agentPolicyResolver.js +94 -0
- package/dist/agent/agentPolicyResolver.js.map +1 -0
- package/dist/agent/agentRuntime.d.ts +12 -0
- package/dist/agent/agentRuntime.d.ts.map +1 -0
- package/dist/agent/agentRuntime.js +31 -0
- package/dist/agent/agentRuntime.js.map +1 -0
- package/dist/agent/agentToolRouter.d.ts +24 -0
- package/dist/agent/agentToolRouter.d.ts.map +1 -0
- package/dist/agent/agentToolRouter.js +89 -0
- package/dist/agent/agentToolRouter.js.map +1 -0
- package/dist/agent/guardianOperator.d.ts +35 -0
- package/dist/agent/guardianOperator.d.ts.map +1 -0
- package/dist/agent/guardianOperator.js +65 -0
- package/dist/agent/guardianOperator.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +14 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/api/activityRoutes.d.ts +70 -0
- package/dist/api/activityRoutes.d.ts.map +1 -0
- package/dist/api/activityRoutes.js +100 -0
- package/dist/api/activityRoutes.js.map +1 -0
- package/dist/api/agentRoutes.d.ts +16 -0
- package/dist/api/agentRoutes.d.ts.map +1 -0
- package/dist/api/agentRoutes.js +37 -0
- package/dist/api/agentRoutes.js.map +1 -0
- package/dist/api/broadcastRoutes.d.ts +34 -0
- package/dist/api/broadcastRoutes.d.ts.map +1 -0
- package/dist/api/broadcastRoutes.js +147 -0
- package/dist/api/broadcastRoutes.js.map +1 -0
- package/dist/api/consolePage.d.ts +2 -0
- package/dist/api/consolePage.d.ts.map +1 -0
- package/dist/api/consolePage.js +206 -0
- package/dist/api/consolePage.js.map +1 -0
- package/dist/api/httpHardening.d.ts +75 -0
- package/dist/api/httpHardening.d.ts.map +1 -0
- package/dist/api/httpHardening.js +122 -0
- package/dist/api/httpHardening.js.map +1 -0
- package/dist/api/indexerRoutes.d.ts +46 -0
- package/dist/api/indexerRoutes.d.ts.map +1 -0
- package/dist/api/indexerRoutes.js +75 -0
- package/dist/api/indexerRoutes.js.map +1 -0
- package/dist/api/paidRoutes.d.ts +8 -0
- package/dist/api/paidRoutes.d.ts.map +1 -0
- package/dist/api/paidRoutes.js +175 -0
- package/dist/api/paidRoutes.js.map +1 -0
- package/dist/api/prepareRoutes.d.ts +58 -0
- package/dist/api/prepareRoutes.d.ts.map +1 -0
- package/dist/api/prepareRoutes.js +90 -0
- package/dist/api/prepareRoutes.js.map +1 -0
- package/dist/api/response.d.ts +39 -0
- package/dist/api/response.d.ts.map +1 -0
- package/dist/api/response.js +53 -0
- package/dist/api/response.js.map +1 -0
- package/dist/api/routes.d.ts +175 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +276 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/api/schemas.d.ts +147 -0
- package/dist/api/schemas.d.ts.map +1 -0
- package/dist/api/schemas.js +81 -0
- package/dist/api/schemas.js.map +1 -0
- package/dist/api/server.d.ts +11 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +505 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/toolRoutes.d.ts +14 -0
- package/dist/api/toolRoutes.d.ts.map +1 -0
- package/dist/api/toolRoutes.js +138 -0
- package/dist/api/toolRoutes.js.map +1 -0
- package/dist/api/walletPrepareRoutes.d.ts +74 -0
- package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
- package/dist/api/walletPrepareRoutes.js +127 -0
- package/dist/api/walletPrepareRoutes.js.map +1 -0
- package/dist/api/x402Gate.d.ts +51 -0
- package/dist/api/x402Gate.d.ts.map +1 -0
- package/dist/api/x402Gate.js +184 -0
- package/dist/api/x402Gate.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -1
- package/dist/cli.js.map +1 -1
- package/dist/data/ecosystemRegistry.data.d.ts +3 -0
- package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
- package/dist/data/ecosystemRegistry.data.js +582 -0
- package/dist/data/ecosystemRegistry.data.js.map +1 -0
- package/dist/demo.d.ts +0 -0
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +43 -8
- package/dist/demo.js.map +1 -1
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +212 -135
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +0 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +72 -10
- package/dist/init.js.map +1 -1
- package/dist/lib/analysis/approval.d.ts +29 -0
- package/dist/lib/analysis/approval.d.ts.map +1 -0
- package/dist/lib/analysis/approval.js +162 -0
- package/dist/lib/analysis/approval.js.map +1 -0
- package/dist/lib/analysis/calldata.d.ts +60 -0
- package/dist/lib/analysis/calldata.d.ts.map +1 -0
- package/dist/lib/analysis/calldata.js +349 -0
- package/dist/lib/analysis/calldata.js.map +1 -0
- package/dist/lib/analysis/contractIntel.d.ts +65 -0
- package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
- package/dist/lib/analysis/contractIntel.js +320 -0
- package/dist/lib/analysis/contractIntel.js.map +1 -0
- package/dist/lib/analysis/evm.d.ts +42 -0
- package/dist/lib/analysis/evm.d.ts.map +1 -0
- package/dist/lib/analysis/evm.js +185 -0
- package/dist/lib/analysis/evm.js.map +1 -0
- package/dist/lib/analysis/gas.d.ts +4 -0
- package/dist/lib/analysis/gas.d.ts.map +1 -0
- package/dist/lib/analysis/gas.js +13 -0
- package/dist/lib/analysis/gas.js.map +1 -0
- package/dist/lib/analysis/index.d.ts +11 -0
- package/dist/lib/analysis/index.d.ts.map +1 -0
- package/dist/lib/analysis/index.js +16 -0
- package/dist/lib/analysis/index.js.map +1 -0
- package/dist/lib/analysis/pharosTokens.d.ts +31 -0
- package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
- package/dist/lib/analysis/pharosTokens.js +78 -0
- package/dist/lib/analysis/pharosTokens.js.map +1 -0
- package/dist/lib/analysis/safeTx.d.ts +27 -0
- package/dist/lib/analysis/safeTx.d.ts.map +1 -0
- package/dist/lib/analysis/safeTx.js +118 -0
- package/dist/lib/analysis/safeTx.js.map +1 -0
- package/dist/lib/analysis/token.d.ts +21 -0
- package/dist/lib/analysis/token.d.ts.map +1 -0
- package/dist/lib/analysis/token.js +151 -0
- package/dist/lib/analysis/token.js.map +1 -0
- package/dist/lib/analysis/types.d.ts +49 -0
- package/dist/lib/analysis/types.d.ts.map +1 -0
- package/dist/lib/analysis/types.js +10 -0
- package/dist/lib/analysis/types.js.map +1 -0
- package/dist/lib/analysis/x402.d.ts +24 -0
- package/dist/lib/analysis/x402.d.ts.map +1 -0
- package/dist/lib/analysis/x402.js +60 -0
- package/dist/lib/analysis/x402.js.map +1 -0
- package/dist/lib/auditLog.d.ts +1 -0
- package/dist/lib/auditLog.d.ts.map +1 -1
- package/dist/lib/auditLog.js +0 -0
- package/dist/lib/auditLog.js.map +1 -1
- package/dist/lib/config.d.ts +77 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +120 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +246 -97
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +334 -127
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +26 -3
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +80 -17
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/ecosystemRegistry.d.ts +116 -0
- package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
- package/dist/lib/ecosystemRegistry.js +178 -0
- package/dist/lib/ecosystemRegistry.js.map +1 -0
- package/dist/lib/envLoader.d.ts +0 -0
- package/dist/lib/envLoader.d.ts.map +0 -0
- package/dist/lib/envLoader.js +39 -18
- package/dist/lib/envLoader.js.map +1 -1
- package/dist/lib/goldsky.d.ts +58 -0
- package/dist/lib/goldsky.d.ts.map +1 -0
- package/dist/lib/goldsky.js +275 -0
- package/dist/lib/goldsky.js.map +1 -0
- package/dist/lib/guardian/decision.d.ts +23 -0
- package/dist/lib/guardian/decision.d.ts.map +1 -0
- package/dist/lib/guardian/decision.js +40 -0
- package/dist/lib/guardian/decision.js.map +1 -0
- package/dist/lib/http.d.ts +0 -1
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +297 -32
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/managedExecution.d.ts +19 -0
- package/dist/lib/managedExecution.d.ts.map +1 -0
- package/dist/lib/managedExecution.js +64 -0
- package/dist/lib/managedExecution.js.map +1 -0
- package/dist/lib/merkleBatcher.d.ts +23 -0
- package/dist/lib/merkleBatcher.d.ts.map +1 -0
- package/dist/lib/merkleBatcher.js +62 -0
- package/dist/lib/merkleBatcher.js.map +1 -0
- package/dist/lib/networks.d.ts +48 -0
- package/dist/lib/networks.d.ts.map +1 -0
- package/dist/lib/networks.js +103 -0
- package/dist/lib/networks.js.map +1 -0
- package/dist/lib/observability/accessContext.d.ts +29 -0
- package/dist/lib/observability/accessContext.d.ts.map +1 -0
- package/dist/lib/observability/accessContext.js +50 -0
- package/dist/lib/observability/accessContext.js.map +1 -0
- package/dist/lib/observability/activityStore.d.ts +70 -0
- package/dist/lib/observability/activityStore.d.ts.map +1 -0
- package/dist/lib/observability/activityStore.js +149 -0
- package/dist/lib/observability/activityStore.js.map +1 -0
- package/dist/lib/observability/apiKey.d.ts +55 -0
- package/dist/lib/observability/apiKey.d.ts.map +1 -0
- package/dist/lib/observability/apiKey.js +141 -0
- package/dist/lib/observability/apiKey.js.map +1 -0
- package/dist/lib/observability/logger.d.ts +30 -0
- package/dist/lib/observability/logger.d.ts.map +1 -0
- package/dist/lib/observability/logger.js +30 -0
- package/dist/lib/observability/logger.js.map +1 -0
- package/dist/lib/observability/quota.d.ts +33 -0
- package/dist/lib/observability/quota.d.ts.map +1 -0
- package/dist/lib/observability/quota.js +49 -0
- package/dist/lib/observability/quota.js.map +1 -0
- package/dist/lib/observability/requestId.d.ts +8 -0
- package/dist/lib/observability/requestId.d.ts.map +1 -0
- package/dist/lib/observability/requestId.js +24 -0
- package/dist/lib/observability/requestId.js.map +1 -0
- package/dist/lib/observability/sanitize.d.ts +77 -0
- package/dist/lib/observability/sanitize.d.ts.map +1 -0
- package/dist/lib/observability/sanitize.js +228 -0
- package/dist/lib/observability/sanitize.js.map +1 -0
- package/dist/lib/observability/scopes.d.ts +20 -0
- package/dist/lib/observability/scopes.d.ts.map +1 -0
- package/dist/lib/observability/scopes.js +77 -0
- package/dist/lib/observability/scopes.js.map +1 -0
- package/dist/lib/okxDexApi.d.ts +106 -0
- package/dist/lib/okxDexApi.d.ts.map +1 -0
- package/dist/lib/okxDexApi.js +221 -0
- package/dist/lib/okxDexApi.js.map +1 -0
- package/dist/lib/persistentJsonStore.d.ts +5 -0
- package/dist/lib/persistentJsonStore.d.ts.map +1 -0
- package/dist/lib/persistentJsonStore.js +39 -0
- package/dist/lib/persistentJsonStore.js.map +1 -0
- package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
- package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
- package/dist/lib/pharos/attestationPublisher.js +262 -0
- package/dist/lib/pharos/attestationPublisher.js.map +1 -0
- package/dist/lib/pharos/ecosystem.d.ts +52 -0
- package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
- package/dist/lib/pharos/ecosystem.js +431 -0
- package/dist/lib/pharos/ecosystem.js.map +1 -0
- package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
- package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
- package/dist/lib/pharos/ecosystemEvidence.js +133 -0
- package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
- package/dist/lib/pharos/rpc.d.ts +44 -0
- package/dist/lib/pharos/rpc.d.ts.map +1 -0
- package/dist/lib/pharos/rpc.js +90 -0
- package/dist/lib/pharos/rpc.js.map +1 -0
- package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
- package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
- package/dist/lib/pharos/rpcEvidence.js +46 -0
- package/dist/lib/pharos/rpcEvidence.js.map +1 -0
- package/dist/lib/pharos/rpcMethods.d.ts +46 -0
- package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
- package/dist/lib/pharos/rpcMethods.js +176 -0
- package/dist/lib/pharos/rpcMethods.js.map +1 -0
- package/dist/lib/pharos/spvVerifier.d.ts +47 -0
- package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
- package/dist/lib/pharos/spvVerifier.js +105 -0
- package/dist/lib/pharos/spvVerifier.js.map +1 -0
- package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
- package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
- package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
- package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
- package/dist/lib/pharosClient.d.ts +5 -10
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +9 -16
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.js +213 -52
- package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
- package/dist/lib/policy/agentPolicy.d.ts +29 -0
- package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
- package/dist/lib/policy/agentPolicy.js +154 -0
- package/dist/lib/policy/agentPolicy.js.map +1 -0
- package/dist/lib/policy/policyPresets.d.ts +30 -0
- package/dist/lib/policy/policyPresets.d.ts.map +1 -0
- package/dist/lib/policy/policyPresets.js +124 -0
- package/dist/lib/policy/policyPresets.js.map +1 -0
- package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
- package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
- package/dist/lib/policy/writeExecutionGate.js +65 -0
- package/dist/lib/policy/writeExecutionGate.js.map +1 -0
- package/dist/lib/preparedTxStore.d.ts +21 -0
- package/dist/lib/preparedTxStore.d.ts.map +1 -0
- package/dist/lib/preparedTxStore.js +90 -0
- package/dist/lib/preparedTxStore.js.map +1 -0
- package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
- package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
- package/dist/lib/price/chainlinkPushProvider.js +36 -0
- package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
- package/dist/lib/price/feedRegistry.d.ts +26 -0
- package/dist/lib/price/feedRegistry.d.ts.map +1 -0
- package/dist/lib/price/feedRegistry.js +67 -0
- package/dist/lib/price/feedRegistry.js.map +1 -0
- package/dist/lib/price/priceResolver.d.ts +35 -0
- package/dist/lib/price/priceResolver.d.ts.map +1 -0
- package/dist/lib/price/priceResolver.js +246 -0
- package/dist/lib/price/priceResolver.js.map +1 -0
- package/dist/lib/price/supraProvider.d.ts +9 -0
- package/dist/lib/price/supraProvider.d.ts.map +1 -0
- package/dist/lib/price/supraProvider.js +17 -0
- package/dist/lib/price/supraProvider.js.map +1 -0
- package/dist/lib/price/types.d.ts +67 -0
- package/dist/lib/price/types.d.ts.map +1 -0
- package/dist/lib/price/types.js +7 -0
- package/dist/lib/price/types.js.map +1 -0
- package/dist/lib/productionGuards.d.ts +16 -0
- package/dist/lib/productionGuards.d.ts.map +1 -0
- package/dist/lib/productionGuards.js +93 -0
- package/dist/lib/productionGuards.js.map +1 -0
- package/dist/lib/recipientSafety.d.ts +5 -0
- package/dist/lib/recipientSafety.d.ts.map +1 -0
- package/dist/lib/recipientSafety.js +28 -0
- package/dist/lib/recipientSafety.js.map +1 -0
- package/dist/lib/riskEngine.d.ts +19 -0
- package/dist/lib/riskEngine.d.ts.map +1 -1
- package/dist/lib/riskEngine.js +94 -36
- package/dist/lib/riskEngine.js.map +1 -1
- package/dist/lib/riskInclusion.d.ts +72 -0
- package/dist/lib/riskInclusion.d.ts.map +1 -0
- package/dist/lib/riskInclusion.js +252 -0
- package/dist/lib/riskInclusion.js.map +1 -0
- package/dist/lib/safeHandsRegistry.d.ts +32 -0
- package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
- package/dist/lib/safeHandsRegistry.js +151 -0
- package/dist/lib/safeHandsRegistry.js.map +1 -0
- package/dist/lib/signer/index.d.ts +3 -3
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +33 -11
- package/dist/lib/signer/index.js.map +1 -1
- package/dist/lib/spendAccumulator.d.ts +24 -1
- package/dist/lib/spendAccumulator.d.ts.map +1 -1
- package/dist/lib/spendAccumulator.js +76 -6
- package/dist/lib/spendAccumulator.js.map +1 -1
- package/dist/lib/toolResponse.d.ts +6 -1
- package/dist/lib/toolResponse.d.ts.map +1 -1
- package/dist/lib/toolResponse.js +13 -9
- package/dist/lib/toolResponse.js.map +1 -1
- package/dist/lib/validation.d.ts +7 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +62 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/wallet/index.d.ts +8 -12
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +48 -35
- package/dist/lib/wallet/index.js.map +1 -1
- package/dist/lib/x402ReplayStore.d.ts +6 -0
- package/dist/lib/x402ReplayStore.d.ts.map +1 -0
- package/dist/lib/x402ReplayStore.js +79 -0
- package/dist/lib/x402ReplayStore.js.map +1 -0
- package/dist/safehands.zip +0 -0
- package/dist/sdk.d.ts +14 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +25 -0
- package/dist/sdk.js.map +1 -0
- package/dist/tools/approveToken.d.ts +31 -10
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +91 -24
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +13 -26
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +34 -75
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +9 -3
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +27 -5
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +62 -5
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +166 -21
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +4 -2
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +36 -31
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +7 -2
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +16 -10
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +56 -8
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +194 -46
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +9 -9
- package/dist/tools/explainRisk.d.ts.map +1 -1
- package/dist/tools/explainRisk.js +5 -4
- package/dist/tools/explainRisk.js.map +1 -1
- package/dist/tools/getAgentPolicy.d.ts +15 -0
- package/dist/tools/getAgentPolicy.d.ts.map +1 -0
- package/dist/tools/getAgentPolicy.js +16 -0
- package/dist/tools/getAgentPolicy.js.map +1 -0
- package/dist/tools/getAgentReputation.d.ts +31 -0
- package/dist/tools/getAgentReputation.d.ts.map +1 -0
- package/dist/tools/getAgentReputation.js +44 -0
- package/dist/tools/getAgentReputation.js.map +1 -0
- package/dist/tools/getAgentWallet.d.ts +1 -1
- package/dist/tools/getAgentWallet.d.ts.map +1 -1
- package/dist/tools/getAgentWallet.js +11 -1
- package/dist/tools/getAgentWallet.js.map +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
- package/dist/tools/getAgentWalletBalance.js +58 -26
- package/dist/tools/getAgentWalletBalance.js.map +1 -1
- package/dist/tools/getExecutionHistory.d.ts +1 -1
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +13 -19
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +3 -3
- package/dist/tools/getGasPrice.d.ts.map +0 -0
- package/dist/tools/getGasPrice.js +7 -7
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +17 -17
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +14 -9
- package/dist/tools/getPoolInfo.js.map +1 -1
- package/dist/tools/getSpvProof.d.ts +24 -0
- package/dist/tools/getSpvProof.d.ts.map +1 -0
- package/dist/tools/getSpvProof.js +64 -0
- package/dist/tools/getSpvProof.js.map +1 -0
- package/dist/tools/getTokenPrice.d.ts +28 -85
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +87 -94
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getTransactionStatus.d.ts +2 -2
- package/dist/tools/getTransactionStatus.d.ts.map +0 -0
- package/dist/tools/getTransactionStatus.js +0 -0
- package/dist/tools/getTransactionStatus.js.map +0 -0
- package/dist/tools/getWalletBalance.d.ts +38 -3
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +92 -52
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +36 -14
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +80 -32
- package/dist/tools/publishRiskScore.js.map +1 -1
- package/dist/tools/queryGoldsky.d.ts +20 -0
- package/dist/tools/queryGoldsky.d.ts.map +1 -0
- package/dist/tools/queryGoldsky.js +29 -0
- package/dist/tools/queryGoldsky.js.map +1 -0
- package/dist/tools/queryRiskRegistry.d.ts +14 -14
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +34 -30
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
- package/dist/tools/safehandsPreflightCheck.js +133 -6
- package/dist/tools/safehandsPreflightCheck.js.map +1 -1
- package/dist/tools/safehandsRiskReport.d.ts +29 -14
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
- package/dist/tools/safehandsRiskReport.js +23 -3
- package/dist/tools/safehandsRiskReport.js.map +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +100 -17
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +15 -1
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
- package/dist/tools/safehandsWalletHealth.js +67 -25
- package/dist/tools/safehandsWalletHealth.js.map +1 -1
- package/dist/tools/safehandsX402Preflight.d.ts +3 -3
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
- package/dist/tools/safehandsX402Preflight.js +24 -3
- package/dist/tools/safehandsX402Preflight.js.map +1 -1
- package/dist/tools/sendPayment.d.ts +10 -4
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +63 -36
- package/dist/tools/sendPayment.js.map +1 -1
- package/dist/tools/setAgentPolicy.d.ts +75 -0
- package/dist/tools/setAgentPolicy.d.ts.map +1 -0
- package/dist/tools/setAgentPolicy.js +80 -0
- package/dist/tools/setAgentPolicy.js.map +1 -0
- package/dist/tools/simulateTransaction.d.ts +7 -3
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +42 -9
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +25 -5
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
- package/dist/tools/tokenRegistryStatus.js +61 -31
- package/dist/tools/tokenRegistryStatus.js.map +1 -1
- package/dist/tools/verifyRiskInclusion.d.ts +59 -0
- package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
- package/dist/tools/verifyRiskInclusion.js +40 -0
- package/dist/tools/verifyRiskInclusion.js.map +1 -0
- package/dist/tools/x402PayAndFetch.d.ts +15 -9
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +163 -20
- package/dist/tools/x402PayAndFetch.js.map +1 -1
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +39 -0
- package/dist/worker.js.map +1 -0
- package/dist/x402Server.d.ts +1 -1
- package/dist/x402Server.d.ts.map +1 -1
- package/dist/x402Server.js +144 -35
- package/dist/x402Server.js.map +1 -1
- package/docs/REVIEWER_QUICKSTART.md +113 -0
- package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
- package/package.json +130 -73
- package/contracts/RiskRegistry.json +0 -223
- package/contracts/RiskRegistry.sol +0 -58
- package/dist/lib/testDodoLive.d.ts +0 -2
- package/dist/lib/testDodoLive.d.ts.map +0 -1
- package/dist/lib/testDodoLive.js +0 -105
- package/dist/lib/testDodoLive.js.map +0 -1
- package/dist/lib/testLiveSafehands.d.ts +0 -2
- package/dist/lib/testLiveSafehands.d.ts.map +0 -1
- package/dist/lib/testLiveSafehands.js +0 -93
- package/dist/lib/testLiveSafehands.js.map +0 -1
- package/dist/lib/testRpc.d.ts +0 -2
- package/dist/lib/testRpc.d.ts.map +0 -1
- package/dist/lib/testRpc.js +0 -30
- package/dist/lib/testRpc.js.map +0 -1
- package/dist/lib/testRpcLive.d.ts +0 -2
- package/dist/lib/testRpcLive.d.ts.map +0 -1
- package/dist/lib/testRpcLive.js +0 -89
- package/dist/lib/testRpcLive.js.map +0 -1
- package/dist/lib/testTools.d.ts +0 -2
- package/dist/lib/testTools.d.ts.map +0 -1
- package/dist/lib/testTools.js +0 -397
- package/dist/lib/testTools.js.map +0 -1
- package/dist/lib/testX402Live.d.ts +0 -2
- package/dist/lib/testX402Live.d.ts.map +0 -1
- package/dist/lib/testX402Live.js +0 -160
- package/dist/lib/testX402Live.js.map +0 -1
- package/dist/scripts/checkDeploy.d.ts +0 -2
- package/dist/scripts/checkDeploy.d.ts.map +0 -1
- package/dist/scripts/checkDeploy.js +0 -25
- package/dist/scripts/checkDeploy.js.map +0 -1
- package/dist/scripts/deployRegistry.d.ts +0 -2
- package/dist/scripts/deployRegistry.d.ts.map +0 -1
- package/dist/scripts/deployRegistry.js +0 -101
- package/dist/scripts/deployRegistry.js.map +0 -1
- package/dist/scripts/testRegistry.d.ts +0 -2
- package/dist/scripts/testRegistry.d.ts.map +0 -1
- package/dist/scripts/testRegistry.js +0 -44
- package/dist/scripts/testRegistry.js.map +0 -1
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// ─── Contract Intelligence Analyzer (read-only, decode-only) ───────────
|
|
2
|
+
// Recognizes well-known canonical contracts by address and reports on-chain
|
|
3
|
+
// code presence via read-only eth_getCode. It does NOT verify source code, does
|
|
4
|
+
// NOT call explorer verification APIs, and does NOT confirm a contract is
|
|
5
|
+
// deployed/verified on the active Pharos network. Recognition is by canonical
|
|
6
|
+
// address only.
|
|
7
|
+
//
|
|
8
|
+
// Recognition is PER-NETWORK. Pacific Mainnet uses the Pharos-official canonical
|
|
9
|
+
// addresses recorded from the Phase 5A Pharos docs audit — Pharos deploys
|
|
10
|
+
// Safe/SafeL2/MultiSend at Pharos-specific addresses and ships CreateX, so the
|
|
11
|
+
// standard-Ethereum Safe addresses are NOT used as Pharos defaults. Deterministic
|
|
12
|
+
// CREATE2 contracts (Permit2/Multicall3/EntryPoint) share one address across EVM
|
|
13
|
+
// chains and are recognized on every network.
|
|
14
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
15
|
+
import { getAddress, isAddress } from "viem";
|
|
16
|
+
import { getActiveNetwork } from "../networks.js";
|
|
17
|
+
import { ATLANTIC_CANONICAL_CONTRACTS, PACIFIC_CANONICAL_CONTRACTS } from "../constants.js";
|
|
18
|
+
import { makeResult } from "./types.js";
|
|
19
|
+
/**
|
|
20
|
+
* Per-network recognition scope is derived from the canonical infrastructure
|
|
21
|
+
* lists in constants.ts (which in turn derive from the canonical ecosystem
|
|
22
|
+
* registry). This keeps the read-API analyzer and the policy engine's
|
|
23
|
+
* isCanonicalInfrastructure() recognizing the SAME set per network — the same
|
|
24
|
+
* address can no longer be "canonical" to one layer and "unknown" to another.
|
|
25
|
+
*/
|
|
26
|
+
function networksFor(lowercaseAddress) {
|
|
27
|
+
const networks = [];
|
|
28
|
+
if (PACIFIC_CANONICAL_CONTRACTS.includes(lowercaseAddress))
|
|
29
|
+
networks.push("pacific-mainnet");
|
|
30
|
+
if (ATLANTIC_CANONICAL_CONTRACTS.includes(lowercaseAddress))
|
|
31
|
+
networks.push("atlantic-testnet");
|
|
32
|
+
return networks;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Known canonical addresses. Recognition is by canonical address only —
|
|
36
|
+
* deployment/verification on the active network is NOT asserted. Addresses are
|
|
37
|
+
* lowercase keys. Pharos-specific Safe/SafeL2/MultiSend + CreateX are taken from
|
|
38
|
+
* the official Pharos canonical-contracts page (Phase 5A audit); per-network
|
|
39
|
+
* scope comes from networksFor(). DODO/DEX testnet infrastructure from the
|
|
40
|
+
* Atlantic allowlist is intentionally NOT given canonical metadata here — those
|
|
41
|
+
* addresses are governed by the DODO-specific allowlists and swap policy.
|
|
42
|
+
*/
|
|
43
|
+
const CANONICAL_CONTRACT_METADATA = {
|
|
44
|
+
// ── Deterministic CREATE2 deployments (same address on every EVM chain) ──
|
|
45
|
+
"0x000000000022d473030f116ddee9f6b43ac78ba3": {
|
|
46
|
+
label: "Uniswap Permit2",
|
|
47
|
+
standard: "Permit2",
|
|
48
|
+
category: "approval-router",
|
|
49
|
+
deterministic: true,
|
|
50
|
+
source: "official_docs",
|
|
51
|
+
status: "implemented",
|
|
52
|
+
riskRelevance: "Permit2 manages ERC-20 allowances and can later authorize transfers via signatures; an approval to Permit2 delegates allowance management to it.",
|
|
53
|
+
recommendedSafeHandsBehavior: "Recognize as canonical, but do NOT treat as automatically safe: unlimited approvals still REQUIRE_CONFIRMATION (deep Permit2 decode is experimental).",
|
|
54
|
+
},
|
|
55
|
+
"0xca11bde05977b3631167028862be2a173976ca11": {
|
|
56
|
+
label: "Multicall3",
|
|
57
|
+
standard: "MultiCall3",
|
|
58
|
+
category: "batching",
|
|
59
|
+
deterministic: true,
|
|
60
|
+
source: "official_docs",
|
|
61
|
+
status: "implemented",
|
|
62
|
+
riskRelevance: "Aggregates multiple calls into one; the batch's inner calls determine the real risk.",
|
|
63
|
+
recommendedSafeHandsBehavior: "Recognize as canonical batching contract; inspect the inner calls, not just the entrypoint.",
|
|
64
|
+
},
|
|
65
|
+
"0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789": {
|
|
66
|
+
label: "ERC-4337 EntryPoint v0.6",
|
|
67
|
+
standard: "ERC4337EntryPoint",
|
|
68
|
+
category: "account-abstraction",
|
|
69
|
+
deterministic: true,
|
|
70
|
+
source: "official_docs",
|
|
71
|
+
status: "implemented",
|
|
72
|
+
riskRelevance: "ERC-4337 account-abstraction entrypoint; executes bundled UserOperations.",
|
|
73
|
+
recommendedSafeHandsBehavior: "Recognize as canonical; UserOperation contents are not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
74
|
+
},
|
|
75
|
+
"0x0000000071727de22e5e9d8baf0edac6f37da032": {
|
|
76
|
+
label: "ERC-4337 EntryPoint v0.7",
|
|
77
|
+
standard: "ERC4337EntryPoint",
|
|
78
|
+
category: "account-abstraction",
|
|
79
|
+
deterministic: true,
|
|
80
|
+
source: "official_docs",
|
|
81
|
+
status: "implemented",
|
|
82
|
+
riskRelevance: "ERC-4337 account-abstraction entrypoint; executes bundled UserOperations.",
|
|
83
|
+
recommendedSafeHandsBehavior: "Recognize as canonical; UserOperation contents are not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
84
|
+
},
|
|
85
|
+
// ── Pharos Pacific Mainnet official addresses (canonical-contracts page) ──
|
|
86
|
+
// Pharos deploys Safe v1.3.0 at Pharos-specific addresses (NOT the standard
|
|
87
|
+
// Ethereum Safe addresses), so those are used here for Pacific Mainnet.
|
|
88
|
+
"0x69f4d1788e39c87893c980c06edf4b7f686e2938": {
|
|
89
|
+
label: "Pharos Safe Singleton (GnosisSafe v1.3.0)",
|
|
90
|
+
standard: "Safe",
|
|
91
|
+
category: "smart-account",
|
|
92
|
+
deterministic: false,
|
|
93
|
+
source: "official_docs",
|
|
94
|
+
status: "implemented",
|
|
95
|
+
riskRelevance: "Safe smart-account singleton; transactions execute via the Safe's owners/threshold.",
|
|
96
|
+
recommendedSafeHandsBehavior: "Recognize as the canonical Safe singleton on Pacific Mainnet; Safe execTransaction / MultiSend batch contents are decoded separately (experimental).",
|
|
97
|
+
note: "Pharos-specific deployment address (differs from the standard-Ethereum Safe 1.3.0 address).",
|
|
98
|
+
},
|
|
99
|
+
"0xfb1bffc9d739b8d520daf37df666da4c687191ea": {
|
|
100
|
+
label: "Pharos SafeL2 Singleton (GnosisSafeL2 v1.3.0)",
|
|
101
|
+
standard: "SafeL2",
|
|
102
|
+
category: "smart-account",
|
|
103
|
+
deterministic: false,
|
|
104
|
+
source: "official_docs",
|
|
105
|
+
status: "implemented",
|
|
106
|
+
riskRelevance: "SafeL2 smart-account singleton (emits L2 events); transactions execute via the Safe's owners/threshold.",
|
|
107
|
+
recommendedSafeHandsBehavior: "Recognize as the canonical SafeL2 singleton on Pacific Mainnet; Safe execTransaction / MultiSend batch contents are decoded separately (experimental).",
|
|
108
|
+
note: "Pharos-specific deployment address (differs from the standard-Ethereum SafeL2 1.3.0 address).",
|
|
109
|
+
},
|
|
110
|
+
"0x998739bfdaadde7c933b942a68053933098f9eda": {
|
|
111
|
+
label: "Pharos Safe MultiSend (v1.3.0)",
|
|
112
|
+
standard: "MultiSend",
|
|
113
|
+
category: "batching",
|
|
114
|
+
deterministic: false,
|
|
115
|
+
source: "official_docs",
|
|
116
|
+
status: "implemented",
|
|
117
|
+
riskRelevance: "Batches multiple calls within a Safe transaction; the inner calls determine the real risk.",
|
|
118
|
+
recommendedSafeHandsBehavior: "Recognize as the canonical MultiSend on Pacific Mainnet; decode the batch's inner calls before trusting it (experimental).",
|
|
119
|
+
note: "Pharos-specific deployment address (differs from the standard-Ethereum MultiSend 1.3.0 address).",
|
|
120
|
+
},
|
|
121
|
+
"0xba5ed099633d3b313e4d5f7bdc1305d3c28ba5ed": {
|
|
122
|
+
label: "CreateX Factory",
|
|
123
|
+
standard: "CreateX",
|
|
124
|
+
category: "deployer",
|
|
125
|
+
deterministic: false,
|
|
126
|
+
source: "official_docs",
|
|
127
|
+
status: "implemented",
|
|
128
|
+
riskRelevance: "Deterministic contract-deployment factory (CREATE2/CREATE3); can deploy arbitrary contracts.",
|
|
129
|
+
recommendedSafeHandsBehavior: "Recognize as the canonical CreateX deployer on Pacific Mainnet; deployment payloads are not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
130
|
+
note: "Listed for Pacific Mainnet in the Pharos canonical-contracts page; Atlantic deployment not asserted.",
|
|
131
|
+
},
|
|
132
|
+
"0x13b0d85ccb8bf860b6b79af3029fca081ae9bef2": {
|
|
133
|
+
label: "Create2Deployer",
|
|
134
|
+
standard: "Create2Deployer",
|
|
135
|
+
category: "deployer",
|
|
136
|
+
deterministic: true,
|
|
137
|
+
source: "official_docs",
|
|
138
|
+
status: "implemented",
|
|
139
|
+
riskRelevance: "CREATE2 contract-deployment factory; can deploy arbitrary contracts at deterministic addresses.",
|
|
140
|
+
recommendedSafeHandsBehavior: "Recognize as canonical deployer infrastructure; deployment payloads are not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
141
|
+
},
|
|
142
|
+
"0x4e59b44847b379578588920ca78fbf26c0b4956c": {
|
|
143
|
+
label: "Foundry Deterministic Deployment Proxy",
|
|
144
|
+
standard: "DeterministicDeploymentProxy",
|
|
145
|
+
category: "deployer",
|
|
146
|
+
deterministic: true,
|
|
147
|
+
source: "official_docs",
|
|
148
|
+
status: "implemented",
|
|
149
|
+
riskRelevance: "Deterministic deployment proxy used by Foundry tooling; can deploy arbitrary contracts.",
|
|
150
|
+
recommendedSafeHandsBehavior: "Recognize as canonical deployer infrastructure; deployment payloads are not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
151
|
+
},
|
|
152
|
+
"0x914d7fec6aac8cd542e72bca78b30650d45643d7": {
|
|
153
|
+
label: "Safe Singleton Factory",
|
|
154
|
+
standard: "SafeSingletonFactory",
|
|
155
|
+
category: "deployer",
|
|
156
|
+
deterministic: true,
|
|
157
|
+
source: "official_docs",
|
|
158
|
+
status: "implemented",
|
|
159
|
+
riskRelevance: "Deterministic factory used to deploy Safe singletons; can deploy arbitrary contracts.",
|
|
160
|
+
recommendedSafeHandsBehavior: "Recognize as canonical deployer infrastructure; deployment payloads are not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
161
|
+
},
|
|
162
|
+
"0xa1dabef33b3b82c7814b6d82a79e50f4ac44102b": {
|
|
163
|
+
label: "Safe MultiSendCallOnly (v1.3.0)",
|
|
164
|
+
standard: "MultiSendCallOnly",
|
|
165
|
+
category: "batching",
|
|
166
|
+
deterministic: true,
|
|
167
|
+
source: "official_docs",
|
|
168
|
+
status: "implemented",
|
|
169
|
+
riskRelevance: "Batches multiple CALLs within a Safe transaction (no delegatecall); the inner calls determine the real risk.",
|
|
170
|
+
recommendedSafeHandsBehavior: "Recognize as canonical batching contract; decode the batch's inner calls before trusting it (experimental).",
|
|
171
|
+
},
|
|
172
|
+
"0xefc2c1444ebcc4db75e7613d20c6a62ff67a167c": {
|
|
173
|
+
label: "ERC-4337 SenderCreator v0.7",
|
|
174
|
+
standard: "ERC4337SenderCreator",
|
|
175
|
+
category: "account-abstraction",
|
|
176
|
+
deterministic: true,
|
|
177
|
+
source: "official_docs",
|
|
178
|
+
status: "implemented",
|
|
179
|
+
riskRelevance: "ERC-4337 helper that deploys smart accounts on first UserOperation.",
|
|
180
|
+
recommendedSafeHandsBehavior: "Recognize as canonical account-abstraction infrastructure; account initcode is not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
181
|
+
},
|
|
182
|
+
"0x7fc98430eaedbb6070b35b39d798725049088348": {
|
|
183
|
+
label: "ERC-4337 SenderCreator v0.6",
|
|
184
|
+
standard: "ERC4337SenderCreator",
|
|
185
|
+
category: "account-abstraction",
|
|
186
|
+
deterministic: true,
|
|
187
|
+
source: "official_docs",
|
|
188
|
+
status: "implemented",
|
|
189
|
+
riskRelevance: "ERC-4337 helper that deploys smart accounts on first UserOperation.",
|
|
190
|
+
recommendedSafeHandsBehavior: "Recognize as canonical account-abstraction infrastructure; account initcode is not decoded; treat the action as REQUIRE_CONFIRMATION.",
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
export const CANONICAL_CONTRACTS = Object.fromEntries(Object.entries(CANONICAL_CONTRACT_METADATA).map(([address, entry]) => [
|
|
194
|
+
address,
|
|
195
|
+
{ ...entry, networks: networksFor(address) },
|
|
196
|
+
]));
|
|
197
|
+
/**
|
|
198
|
+
* Raw, network-agnostic lookup by address (returns the entry if the address is a
|
|
199
|
+
* known canonical contract on ANY network). Kept for back-compat with spender /
|
|
200
|
+
* allowance recognition. Use {@link canonicalContractEvidence} for per-network
|
|
201
|
+
* recognition.
|
|
202
|
+
*/
|
|
203
|
+
export function lookupCanonical(address) {
|
|
204
|
+
if (!isAddress(address))
|
|
205
|
+
return undefined;
|
|
206
|
+
return CANONICAL_CONTRACTS[address.toLowerCase()];
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Per-network canonical recognition evidence. Returns evidence ONLY when the
|
|
210
|
+
* address is a known canonical contract recognized on `network`. A known address
|
|
211
|
+
* that is not recognized on this network (e.g. a Pacific-only Safe address while
|
|
212
|
+
* the active network is Atlantic) returns `null` — fail-safe under-recognition,
|
|
213
|
+
* never a false positive. Recognition is metadata, not a safety guarantee.
|
|
214
|
+
*/
|
|
215
|
+
export function canonicalContractEvidence(address, network = getActiveNetwork()) {
|
|
216
|
+
const entry = lookupCanonical(address);
|
|
217
|
+
if (!entry || !entry.networks.includes(network.name))
|
|
218
|
+
return null;
|
|
219
|
+
return {
|
|
220
|
+
name: entry.label,
|
|
221
|
+
category: entry.category,
|
|
222
|
+
standard: entry.standard,
|
|
223
|
+
network: network.name,
|
|
224
|
+
chainId: network.chainId,
|
|
225
|
+
address: getAddress(address),
|
|
226
|
+
deterministic: entry.deterministic,
|
|
227
|
+
source: entry.source,
|
|
228
|
+
status: entry.status,
|
|
229
|
+
riskRelevance: entry.riskRelevance,
|
|
230
|
+
recommendedSafeHandsBehavior: entry.recommendedSafeHandsBehavior,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
export async function analyzeContract(address, access) {
|
|
234
|
+
const reasons = [];
|
|
235
|
+
const warnings = [];
|
|
236
|
+
const network = getActiveNetwork();
|
|
237
|
+
if (!isAddress(address)) {
|
|
238
|
+
return makeResult({
|
|
239
|
+
analyzer: "contract_intel",
|
|
240
|
+
decision: "BLOCK",
|
|
241
|
+
internalDecision: "BLOCK",
|
|
242
|
+
riskLevel: "CRITICAL",
|
|
243
|
+
reasons: ["Not a valid EVM address."],
|
|
244
|
+
warnings: [],
|
|
245
|
+
analyzerStatus: "ok",
|
|
246
|
+
details: { address: null, recognized: false, label: null, standard: null, recognitionSource: "none", sourceVerified: false, canonicalContractEvidence: null, network: network.name, chainId: network.chainId, codePresent: "unknown", isContract: "unknown" },
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
const checksum = getAddress(address);
|
|
250
|
+
const knownEntry = lookupCanonical(address);
|
|
251
|
+
const evidence = canonicalContractEvidence(checksum, network);
|
|
252
|
+
const recognizedOnNetwork = evidence !== null;
|
|
253
|
+
let codePresent = "unknown";
|
|
254
|
+
if (access?.getCode) {
|
|
255
|
+
try {
|
|
256
|
+
const code = await access.getCode(checksum);
|
|
257
|
+
codePresent = !(code === undefined || code === null || code === "0x" || code === "");
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
codePresent = "unknown";
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const isContract = codePresent;
|
|
264
|
+
let internalDecision;
|
|
265
|
+
let riskLevel;
|
|
266
|
+
if (recognizedOnNetwork && evidence) {
|
|
267
|
+
reasons.push(`Address matches the canonical ${evidence.name} address on ${network.label} (recognized by address; deployment/verification on the active network is NOT confirmed).`);
|
|
268
|
+
if (codePresent === false)
|
|
269
|
+
warnings.push("No code found at this canonical address on the active network; it may not be deployed here.");
|
|
270
|
+
internalDecision = "ALLOW";
|
|
271
|
+
riskLevel = "LOW";
|
|
272
|
+
}
|
|
273
|
+
else if (knownEntry) {
|
|
274
|
+
// Known canonical address, but not recognized on the ACTIVE network — do not auto-allow.
|
|
275
|
+
reasons.push(`Address matches the canonical ${knownEntry.label} address, but that contract is not recognized on ${network.label}; treat as an unknown contract and confirm.`);
|
|
276
|
+
if (knownEntry.note)
|
|
277
|
+
warnings.push(knownEntry.note);
|
|
278
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
279
|
+
riskLevel = "MEDIUM";
|
|
280
|
+
}
|
|
281
|
+
else if (codePresent === true) {
|
|
282
|
+
reasons.push(`Contract at ${checksum} is not a recognized canonical contract; unknown contract requires confirmation.`);
|
|
283
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
284
|
+
riskLevel = "MEDIUM";
|
|
285
|
+
}
|
|
286
|
+
else if (codePresent === false) {
|
|
287
|
+
reasons.push(`No code at ${checksum} (EOA), not a contract.`);
|
|
288
|
+
internalDecision = "ALLOW";
|
|
289
|
+
riskLevel = "LOW";
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
reasons.push(`Code presence for ${checksum} not verified (no read-only client); treat unknown contracts with confirmation.`);
|
|
293
|
+
warnings.push("Provide a read-only RPC client to confirm code presence.");
|
|
294
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
295
|
+
riskLevel = "UNKNOWN";
|
|
296
|
+
}
|
|
297
|
+
return makeResult({
|
|
298
|
+
analyzer: "contract_intel",
|
|
299
|
+
decision: internalDecision,
|
|
300
|
+
internalDecision,
|
|
301
|
+
riskLevel,
|
|
302
|
+
reasons,
|
|
303
|
+
warnings,
|
|
304
|
+
analyzerStatus: codePresent === "unknown" ? "partial" : "ok",
|
|
305
|
+
details: {
|
|
306
|
+
address: checksum,
|
|
307
|
+
recognized: recognizedOnNetwork,
|
|
308
|
+
label: evidence?.name ?? knownEntry?.label ?? null,
|
|
309
|
+
standard: evidence?.standard ?? knownEntry?.standard ?? null,
|
|
310
|
+
recognitionSource: recognizedOnNetwork ? "canonical-address" : "none",
|
|
311
|
+
sourceVerified: false,
|
|
312
|
+
canonicalContractEvidence: evidence,
|
|
313
|
+
network: network.name,
|
|
314
|
+
chainId: network.chainId,
|
|
315
|
+
codePresent,
|
|
316
|
+
isContract,
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=contractIntel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractIntel.js","sourceRoot":"","sources":["../../../src/lib/analysis/contractIntel.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,4EAA4E;AAC5E,gFAAgF;AAChF,0EAA0E;AAC1E,8EAA8E;AAC9E,gBAAgB;AAChB,EAAE;AACF,iFAAiF;AACjF,0EAA0E;AAC1E,+EAA+E;AAC/E,kFAAkF;AAClF,iFAAiF;AACjF,8CAA8C;AAC9C,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAwC,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAA2F,MAAM,YAAY,CAAC;AAuCjI;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,gBAAwB;IAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,2BAA2B,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7F,IAAI,4BAA4B,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC/F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,2BAA2B,GAAwD;IACvF,4EAA4E;IAC5E,4CAA4C,EAAE;QAC5C,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,iBAAiB;QAC3B,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EACX,kJAAkJ;QACpJ,4BAA4B,EAC1B,uJAAuJ;KAC1J;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,sFAAsF;QACrG,4BAA4B,EAAE,6FAA6F;KAC5H;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,0BAA0B;QACjC,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,qBAAqB;QAC/B,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,2EAA2E;QAC1F,4BAA4B,EAAE,2GAA2G;KAC1I;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,0BAA0B;QACjC,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,qBAAqB;QAC/B,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,2EAA2E;QAC1F,4BAA4B,EAAE,2GAA2G;KAC1I;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,wEAAwE;IACxE,4CAA4C,EAAE;QAC5C,KAAK,EAAE,2CAA2C;QAClD,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,eAAe;QACzB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,qFAAqF;QACpG,4BAA4B,EAC1B,sJAAsJ;QACxJ,IAAI,EAAE,6FAA6F;KACpG;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,+CAA+C;QACtD,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,eAAe;QACzB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,yGAAyG;QACxH,4BAA4B,EAC1B,wJAAwJ;QAC1J,IAAI,EAAE,+FAA+F;KACtG;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,gCAAgC;QACvC,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,4FAA4F;QAC3G,4BAA4B,EAC1B,4HAA4H;QAC9H,IAAI,EAAE,kGAAkG;KACzG;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,8FAA8F;QAC7G,4BAA4B,EAC1B,gJAAgJ;QAClJ,IAAI,EAAE,sGAAsG;KAC7G;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,iGAAiG;QAChH,4BAA4B,EAC1B,gIAAgI;KACnI;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,wCAAwC;QAC/C,QAAQ,EAAE,8BAA8B;QACxC,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,yFAAyF;QACxG,4BAA4B,EAC1B,gIAAgI;KACnI;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,wBAAwB;QAC/B,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,uFAAuF;QACtG,4BAA4B,EAC1B,gIAAgI;KACnI;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,iCAAiC;QACxC,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,8GAA8G;QAC7H,4BAA4B,EAC1B,6GAA6G;KAChH;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,6BAA6B;QACpC,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,qBAAqB;QAC/B,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,qEAAqE;QACpF,4BAA4B,EAC1B,uIAAuI;KAC1I;IACD,4CAA4C,EAAE;QAC5C,KAAK,EAAE,6BAA6B;QACpC,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,qBAAqB;QAC/B,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,aAAa,EAAE,qEAAqE;QACpF,4BAA4B,EAC1B,uIAAuI;KAC1I;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAsC,MAAM,CAAC,WAAW,CACtF,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;IACpE,OAAO;IACP,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE;CAC7C,CAAC,CACH,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,OAAO,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AACpD,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAe,EACf,UAAyB,gBAAgB,EAAE;IAE3C,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClE,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,KAAK;QACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,4BAA4B,EAAE,KAAK,CAAC,4BAA4B;KACjE,CAAC;AACJ,CAAC;AAkBD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,MAA4B;IAE5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,UAAU,CAAuB;YACtC,QAAQ,EAAE,gBAAgB;YAC1B,QAAQ,EAAE,OAAO;YACjB,gBAAgB,EAAE,OAAO;YACzB,SAAS,EAAE,UAAU;YACrB,OAAO,EAAE,CAAC,0BAA0B,CAAC;YACrC,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,IAAI;YACpB,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE;SAC9P,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,mBAAmB,GAAG,QAAQ,KAAK,IAAI,CAAC;IAE9C,IAAI,WAAW,GAAwB,SAAS,CAAC;IACjD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAyB,CAAC,CAAC;YAC7D,WAAW,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,WAAW,CAAC;IAE/B,IAAI,gBAAkD,CAAC;IACvD,IAAI,SAAsC,CAAC;IAE3C,IAAI,mBAAmB,IAAI,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,iCAAiC,QAAQ,CAAC,IAAI,eAAe,OAAO,CAAC,KAAK,2FAA2F,CAAC,CAAC;QACpL,IAAI,WAAW,KAAK,KAAK;YAAE,QAAQ,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;QACxI,gBAAgB,GAAG,OAAO,CAAC;QAC3B,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,yFAAyF;QACzF,OAAO,CAAC,IAAI,CAAC,iCAAiC,UAAU,CAAC,KAAK,oDAAoD,OAAO,CAAC,KAAK,6CAA6C,CAAC,CAAC;QAC9K,IAAI,UAAU,CAAC,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpD,gBAAgB,GAAG,sBAAsB,CAAC;QAC1C,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;SAAM,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,eAAe,QAAQ,kFAAkF,CAAC,CAAC;QACxH,gBAAgB,GAAG,sBAAsB,CAAC;QAC1C,SAAS,GAAG,QAAQ,CAAC;IACvB,CAAC;SAAM,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,yBAAyB,CAAC,CAAC;QAC9D,gBAAgB,GAAG,OAAO,CAAC;QAC3B,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,qBAAqB,QAAQ,iFAAiF,CAAC,CAAC;QAC7H,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAC1E,gBAAgB,GAAG,sBAAsB,CAAC;QAC1C,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,OAAO,UAAU,CAAuB;QACtC,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,gBAAgB;QAC1B,gBAAgB;QAChB,SAAS;QACT,OAAO;QACP,QAAQ;QACR,cAAc,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC5D,OAAO,EAAE;YACP,OAAO,EAAE,QAAQ;YACjB,UAAU,EAAE,mBAAmB;YAC/B,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,UAAU,EAAE,KAAK,IAAI,IAAI;YAClD,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,UAAU,EAAE,QAAQ,IAAI,IAAI;YAC5D,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,MAAM;YACrE,cAAc,EAAE,KAAK;YACrB,yBAAyB,EAAE,QAAQ;YACnC,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW;YACX,UAAU;SACX;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type CanonicalContractEvidence } from "./contractIntel.js";
|
|
2
|
+
import { type AnalyzerResult, type ReadOnlyChainAccess } from "./types.js";
|
|
3
|
+
export type EvmTargetType = "EOA" | "contract" | "unknown";
|
|
4
|
+
export type EvmCallClass = "native_transfer" | "contract_call" | "calldata_to_eoa" | "empty" | "invalid";
|
|
5
|
+
export interface EvmCallInput {
|
|
6
|
+
to?: string;
|
|
7
|
+
/** Calldata, e.g. 0x095ea7b3... */
|
|
8
|
+
data?: string;
|
|
9
|
+
/** Value as a decimal or hex string (wei). */
|
|
10
|
+
value?: string;
|
|
11
|
+
chainId?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface EvmAnalysisDetails {
|
|
14
|
+
to: string | null;
|
|
15
|
+
toValid: boolean;
|
|
16
|
+
hasCalldata: boolean;
|
|
17
|
+
selector: string | null;
|
|
18
|
+
valueProvided: boolean;
|
|
19
|
+
valueIsPositive: boolean;
|
|
20
|
+
isNativeValueTransfer: boolean;
|
|
21
|
+
targetType: EvmTargetType;
|
|
22
|
+
callClass: EvmCallClass;
|
|
23
|
+
chainId: number | null;
|
|
24
|
+
/** Per-network canonical recognition of `to` (null when not a known canonical). */
|
|
25
|
+
canonicalContractEvidence: CanonicalContractEvidence | null;
|
|
26
|
+
}
|
|
27
|
+
/** Classify a target address as EOA / contract / unknown using read-only eth_getCode. */
|
|
28
|
+
export declare function classifyTarget(address: string, access?: ReadOnlyChainAccess): Promise<EvmTargetType>;
|
|
29
|
+
export declare function analyzeEvmCall(input: EvmCallInput, access?: ReadOnlyChainAccess): Promise<AnalyzerResult<EvmAnalysisDetails>>;
|
|
30
|
+
export interface EvmTxReceiptDetails {
|
|
31
|
+
txHash: string;
|
|
32
|
+
status: "success" | "reverted" | "unknown";
|
|
33
|
+
blockNumber: string | null;
|
|
34
|
+
gasUsed: string | null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Optional existing-transaction analysis via read-only eth_getTransactionReceipt.
|
|
38
|
+
* Returns analyzerStatus "unavailable" when no read-only client is supplied
|
|
39
|
+
* (keeps offline use safe). Never sends a transaction.
|
|
40
|
+
*/
|
|
41
|
+
export declare function analyzeTxHash(txHash: string, access?: ReadOnlyChainAccess): Promise<AnalyzerResult<EvmTxReceiptDetails>>;
|
|
42
|
+
//# sourceMappingURL=evm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/evm.ts"],"names":[],"mappings":"AAMA,OAAO,EAA6B,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3D,MAAM,MAAM,YAAY,GACpB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,UAAU,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mFAAmF;IACnF,yBAAyB,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC7D;AAyBD,yFAAyF;AACzF,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CASxB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,EACnB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,CA2F7C;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,CA6C9C"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// ─── EVM Call Analyzer (read-only) ─────────────────────────────────────
|
|
2
|
+
// Analyzes `to + calldata + value` (and, optionally, an existing tx hash) using
|
|
3
|
+
// only read-only JSON-RPC. Never executes, never sends a transaction.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { isAddress } from "viem";
|
|
6
|
+
import { canonicalContractEvidence } from "./contractIntel.js";
|
|
7
|
+
import { makeResult } from "./types.js";
|
|
8
|
+
function valueInfo(value) {
|
|
9
|
+
if (value === undefined || value === null || String(value).trim() === "") {
|
|
10
|
+
return { provided: false, positive: false };
|
|
11
|
+
}
|
|
12
|
+
const s = String(value).trim();
|
|
13
|
+
try {
|
|
14
|
+
return { provided: true, positive: BigInt(s) > 0n };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
const n = Number(s);
|
|
18
|
+
return { provided: true, positive: Number.isFinite(n) && n > 0 };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function hasCalldata(data) {
|
|
22
|
+
return typeof data === "string" && data !== "0x" && data.replace(/^0x/, "").length > 0;
|
|
23
|
+
}
|
|
24
|
+
function selectorOf(data) {
|
|
25
|
+
if (!data)
|
|
26
|
+
return null;
|
|
27
|
+
const hex = data.startsWith("0x") ? data : `0x${data}`;
|
|
28
|
+
return hex.length >= 10 ? hex.slice(0, 10).toLowerCase() : null;
|
|
29
|
+
}
|
|
30
|
+
/** Classify a target address as EOA / contract / unknown using read-only eth_getCode. */
|
|
31
|
+
export async function classifyTarget(address, access) {
|
|
32
|
+
if (!isAddress(address) || !access?.getCode)
|
|
33
|
+
return "unknown";
|
|
34
|
+
try {
|
|
35
|
+
const code = await access.getCode(address);
|
|
36
|
+
if (code === undefined || code === null || code === "0x" || code === "")
|
|
37
|
+
return "EOA";
|
|
38
|
+
return "contract";
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return "unknown";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function analyzeEvmCall(input, access) {
|
|
45
|
+
const reasons = [];
|
|
46
|
+
const warnings = [];
|
|
47
|
+
const to = input.to ?? null;
|
|
48
|
+
const toValid = to === null ? true : isAddress(to);
|
|
49
|
+
const calldata = hasCalldata(input.data);
|
|
50
|
+
const selector = calldata ? selectorOf(input.data) : null;
|
|
51
|
+
const { provided: valueProvided, positive: valueIsPositive } = valueInfo(input.value);
|
|
52
|
+
const isNativeValueTransfer = valueIsPositive && !calldata;
|
|
53
|
+
const toCanonical = to && toValid ? canonicalContractEvidence(to) : null;
|
|
54
|
+
const targetType = to && toValid ? await classifyTarget(to, access) : "unknown";
|
|
55
|
+
let callClass;
|
|
56
|
+
let internalDecision;
|
|
57
|
+
let riskLevel;
|
|
58
|
+
if (to !== null && !toValid) {
|
|
59
|
+
callClass = "invalid";
|
|
60
|
+
internalDecision = "BLOCK";
|
|
61
|
+
riskLevel = "CRITICAL";
|
|
62
|
+
reasons.push(`Target address is not a valid EVM address (${to}).`);
|
|
63
|
+
}
|
|
64
|
+
else if (!calldata && !valueIsPositive) {
|
|
65
|
+
callClass = "empty";
|
|
66
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
67
|
+
riskLevel = "MEDIUM";
|
|
68
|
+
reasons.push("No calldata and no value: empty / no-op transaction.");
|
|
69
|
+
}
|
|
70
|
+
else if (isNativeValueTransfer) {
|
|
71
|
+
callClass = "native_transfer";
|
|
72
|
+
if (targetType === "contract") {
|
|
73
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
74
|
+
riskLevel = "MEDIUM";
|
|
75
|
+
reasons.push("Native value sent to a contract with no calldata; may trigger a fallback/receive function.");
|
|
76
|
+
}
|
|
77
|
+
else if (targetType === "EOA") {
|
|
78
|
+
internalDecision = "ALLOW";
|
|
79
|
+
riskLevel = "LOW";
|
|
80
|
+
reasons.push("Plain native value transfer to an EOA.");
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// targetType === "unknown": recipient code could NOT be verified (RPC down /
|
|
84
|
+
// no read-only client). Fail-closed — a security layer must not ALLOW when it
|
|
85
|
+
// cannot rule out a hostile contract recipient. Ask for confirmation instead.
|
|
86
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
87
|
+
riskLevel = "MEDIUM";
|
|
88
|
+
reasons.push("Native value transfer with unverifiable recipient code; confirm the recipient before sending.");
|
|
89
|
+
warnings.push("Recipient code could not be verified (no read-only client).");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (calldata) {
|
|
93
|
+
if (targetType === "EOA") {
|
|
94
|
+
callClass = "calldata_to_eoa";
|
|
95
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
96
|
+
riskLevel = "MEDIUM";
|
|
97
|
+
warnings.push("Calldata sent to an address with no code (EOA); the call will not execute contract logic.");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
callClass = "contract_call";
|
|
101
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
102
|
+
riskLevel = "MEDIUM";
|
|
103
|
+
reasons.push(targetType === "contract"
|
|
104
|
+
? `Contract call to ${to} (selector ${selector ?? "n/a"}); unknown contract call requires confirmation.`
|
|
105
|
+
: `Contract call (selector ${selector ?? "n/a"}); target code not verified; requires confirmation.`);
|
|
106
|
+
if (targetType === "unknown")
|
|
107
|
+
warnings.push("Target code could not be verified (no read-only client).");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
callClass = "empty";
|
|
112
|
+
internalDecision = "REQUIRE_CONFIRMATION";
|
|
113
|
+
riskLevel = "MEDIUM";
|
|
114
|
+
}
|
|
115
|
+
return makeResult({
|
|
116
|
+
analyzer: "evm",
|
|
117
|
+
decision: internalDecision === "BLOCK" ? "BLOCK" : internalDecision === "ALLOW" ? "ALLOW" : "REQUIRE_CONFIRMATION",
|
|
118
|
+
internalDecision,
|
|
119
|
+
riskLevel,
|
|
120
|
+
reasons,
|
|
121
|
+
warnings,
|
|
122
|
+
analyzerStatus: targetType === "unknown" && (calldata || isNativeValueTransfer) ? "partial" : "ok",
|
|
123
|
+
details: {
|
|
124
|
+
to,
|
|
125
|
+
toValid,
|
|
126
|
+
hasCalldata: calldata,
|
|
127
|
+
selector,
|
|
128
|
+
valueProvided,
|
|
129
|
+
valueIsPositive,
|
|
130
|
+
isNativeValueTransfer,
|
|
131
|
+
targetType,
|
|
132
|
+
callClass,
|
|
133
|
+
chainId: input.chainId ?? null,
|
|
134
|
+
canonicalContractEvidence: toCanonical,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Optional existing-transaction analysis via read-only eth_getTransactionReceipt.
|
|
140
|
+
* Returns analyzerStatus "unavailable" when no read-only client is supplied
|
|
141
|
+
* (keeps offline use safe). Never sends a transaction.
|
|
142
|
+
*/
|
|
143
|
+
export async function analyzeTxHash(txHash, access) {
|
|
144
|
+
const base = (status, details, reasons, warnings = []) => makeResult({
|
|
145
|
+
analyzer: "evm_tx",
|
|
146
|
+
decision: "REQUIRE_CONFIRMATION",
|
|
147
|
+
internalDecision: "REQUIRE_CONFIRMATION",
|
|
148
|
+
riskLevel: "UNKNOWN",
|
|
149
|
+
reasons,
|
|
150
|
+
warnings,
|
|
151
|
+
analyzerStatus: status,
|
|
152
|
+
details,
|
|
153
|
+
});
|
|
154
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(txHash)) {
|
|
155
|
+
return makeResult({
|
|
156
|
+
analyzer: "evm_tx",
|
|
157
|
+
decision: "BLOCK",
|
|
158
|
+
internalDecision: "BLOCK",
|
|
159
|
+
riskLevel: "CRITICAL",
|
|
160
|
+
reasons: ["Invalid transaction hash."],
|
|
161
|
+
warnings: [],
|
|
162
|
+
analyzerStatus: "ok",
|
|
163
|
+
details: { txHash, status: "unknown", blockNumber: null, gasUsed: null },
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (!access?.getTransactionReceipt) {
|
|
167
|
+
return base("unavailable", { txHash, status: "unknown", blockNumber: null, gasUsed: null }, ["Receipt analysis requires a read-only RPC client."]);
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const r = (await access.getTransactionReceipt(txHash));
|
|
171
|
+
if (!r)
|
|
172
|
+
return base("unavailable", { txHash, status: "unknown", blockNumber: null, gasUsed: null }, ["Transaction not found or not yet mined."]);
|
|
173
|
+
const status = r.status === "success" ? "success" : r.status === "reverted" ? "reverted" : "unknown";
|
|
174
|
+
return base("ok", {
|
|
175
|
+
txHash,
|
|
176
|
+
status,
|
|
177
|
+
blockNumber: r.blockNumber !== undefined ? r.blockNumber.toString() : null,
|
|
178
|
+
gasUsed: r.gasUsed !== undefined ? r.gasUsed.toString() : null,
|
|
179
|
+
}, [status === "reverted" ? "Transaction reverted on-chain." : "Transaction receipt retrieved."]);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return base("unavailable", { txHash, status: "unknown", blockNumber: null, gasUsed: null }, ["Could not read transaction receipt."]);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=evm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm.js","sourceRoot":"","sources":["../../../src/lib/analysis/evm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/gas.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAA+B,GAAG,MAAM,CAG3G"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// ─── Gas buffering helpers (read-only) ─────────────────────────────────
|
|
2
|
+
// Shared gas-limit buffering used by the estimate_gas / simulate_transaction
|
|
3
|
+
// tools and RPC evidence. Never submits a transaction.
|
|
4
|
+
// (A full `analyzeGas` analyzer lived here until 2026-07: zero call sites, no
|
|
5
|
+
// surface, no tests — removed per the dead-code policy; see git history.)
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
7
|
+
export const DEFAULT_GAS_BUFFER_PCT = 20;
|
|
8
|
+
/** Apply a buffer percentage to a raw gas estimate (integer math). */
|
|
9
|
+
export function recommendGasWithBuffer(estimate, bufferPct = DEFAULT_GAS_BUFFER_PCT) {
|
|
10
|
+
const pct = BigInt(Math.max(0, Math.trunc(bufferPct)));
|
|
11
|
+
return estimate + (estimate * pct) / 100n;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=gas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas.js","sourceRoot":"","sources":["../../../src/lib/analysis/gas.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,uDAAuD;AACvD,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAE3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,sEAAsE;AACtE,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,YAAoB,sBAAsB;IACjG,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,QAAQ,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./evm.js";
|
|
3
|
+
export * from "./token.js";
|
|
4
|
+
export * from "./pharosTokens.js";
|
|
5
|
+
export * from "./gas.js";
|
|
6
|
+
export * from "./contractIntel.js";
|
|
7
|
+
export * from "./approval.js";
|
|
8
|
+
export * from "./calldata.js";
|
|
9
|
+
export * from "./safeTx.js";
|
|
10
|
+
export * from "./x402.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/analysis/index.ts"],"names":[],"mappings":"AAMA,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// ─── SafeHands Read-Only Analyzers ─────────────────────────────────────
|
|
2
|
+
// Shared, read-only analysis used by MCP tools (and, later, API/Web/SDK/CLI).
|
|
3
|
+
// Every analyzer is read-only and returns the public four-value SafeHands
|
|
4
|
+
// decision plus internal detail for explanation. No analyzer signs or writes.
|
|
5
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
6
|
+
export * from "./types.js";
|
|
7
|
+
export * from "./evm.js";
|
|
8
|
+
export * from "./token.js";
|
|
9
|
+
export * from "./pharosTokens.js";
|
|
10
|
+
export * from "./gas.js";
|
|
11
|
+
export * from "./contractIntel.js";
|
|
12
|
+
export * from "./approval.js";
|
|
13
|
+
export * from "./calldata.js";
|
|
14
|
+
export * from "./safeTx.js";
|
|
15
|
+
export * from "./x402.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|