safehands-pharos 1.5.0 → 2.8.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/handsafe.zip +0 -0
- 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/abiWords.d.ts +17 -0
- package/dist/lib/analysis/abiWords.d.ts.map +1 -0
- package/dist/lib/analysis/abiWords.js +48 -0
- package/dist/lib/analysis/abiWords.js.map +1 -0
- 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 +189 -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 +464 -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 +126 -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 +107 -38
- 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 +131 -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,133 @@
|
|
|
1
|
+
// ─── Pharos Ecosystem Evidence Classifier (read-only, evidence-only) ───
|
|
2
|
+
// Labels a target/intent with an ecosystem category and an HONEST status, from:
|
|
3
|
+
// known official addresses (e.g. Chainlink cache), recognized canonical contracts
|
|
4
|
+
// (Safe, Phase 5B), and provider/category hints. The evidence EXPLAINS risk and may
|
|
5
|
+
// only ESCALATE a decision (cross-chain/WASM → REQUIRE_CONFIRMATION); it can NEVER
|
|
6
|
+
// relax policy or make a risky action safe. Pure: no RPC, no keys, no external APIs.
|
|
7
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
8
|
+
import { getActiveNetwork, getNetworkByChainId, isNetworkName } from "../networks.js";
|
|
9
|
+
import { ECOSYSTEM_PROVIDERS, ecosystemForCanonical, lookupEcosystemByAddress, lookupEcosystemByName, } from "./ecosystem.js";
|
|
10
|
+
/** Per-category decision impact. Only cross-chain + WASM-interop escalate. */
|
|
11
|
+
const CATEGORY_IMPACT = {
|
|
12
|
+
oracle: "none",
|
|
13
|
+
cross_chain: "REQUIRE_CONFIRMATION",
|
|
14
|
+
indexing: "none",
|
|
15
|
+
wallet_infrastructure: "none",
|
|
16
|
+
custody_infrastructure: "none",
|
|
17
|
+
evm_wasm_interop: "REQUIRE_CONFIRMATION",
|
|
18
|
+
payment: "none",
|
|
19
|
+
rpc_provider: "none",
|
|
20
|
+
security: "none",
|
|
21
|
+
identity: "none",
|
|
22
|
+
unknown: "none",
|
|
23
|
+
};
|
|
24
|
+
/** Generic descriptions for category-only / unknown classifications. */
|
|
25
|
+
const CATEGORY_META = {
|
|
26
|
+
oracle: { riskRelevance: "Oracle/price dependency.", safehandsBehavior: "Evidence only; SafeHands has no direct oracle analyzer." },
|
|
27
|
+
cross_chain: { riskRelevance: "Cross-chain / bridge-like: relayer/finality risk.", safehandsBehavior: "Bridge-like intent → REQUIRE_CONFIRMATION unless trusted. No cross-chain API is called." },
|
|
28
|
+
indexing: { riskRelevance: "Indexing/data source.", safehandsBehavior: "Optional read-only data source only; not an execution path." },
|
|
29
|
+
wallet_infrastructure: { riskRelevance: "Smart-account / wallet infrastructure.", safehandsBehavior: "Awareness only; SafeHands holds no keys and never custodies." },
|
|
30
|
+
custody_infrastructure: { riskRelevance: "External custody/key management.", safehandsBehavior: "Awareness only; SafeHands holds no keys." },
|
|
31
|
+
evm_wasm_interop: { riskRelevance: "EVM↔WASM interop can bypass EVM-only assumptions.", safehandsBehavior: "Experimental; WASM-interop intent → REQUIRE_CONFIRMATION. No WASM analyzer." },
|
|
32
|
+
payment: { riskRelevance: "Payment intent (x402).", safehandsBehavior: "Route to the x402 preflight analyzer. mainnet-only; never signs/settles." },
|
|
33
|
+
rpc_provider: { riskRelevance: "RPC provider/infrastructure.", safehandsBehavior: "Read-only RPC only; secrets redacted." },
|
|
34
|
+
security: { riskRelevance: "External security/compliance/audit intel.", safehandsBehavior: "Awareness only; SafeHands does not call it and its own verdicts remain the source of truth. An audit/screening is evidence, never a guarantee." },
|
|
35
|
+
identity: { riskRelevance: "Name service / identity / NFT: names can be spoofed; name ≠ address trust.", safehandsBehavior: "Awareness only; SafeHands never resolves or trusts names as identity; address verification is still required." },
|
|
36
|
+
unknown: { riskRelevance: "No ecosystem category recognized.", safehandsBehavior: "No ecosystem awareness applies; base analyzers/policy still govern the decision." },
|
|
37
|
+
};
|
|
38
|
+
function isEcosystemCategory(v) {
|
|
39
|
+
return Object.prototype.hasOwnProperty.call(CATEGORY_IMPACT, v);
|
|
40
|
+
}
|
|
41
|
+
function evidenceFromEntry(entry, ctx) {
|
|
42
|
+
return {
|
|
43
|
+
category: entry.category,
|
|
44
|
+
providerName: entry.name,
|
|
45
|
+
status: entry.status,
|
|
46
|
+
confidence: ctx.confidence,
|
|
47
|
+
source: entry.source,
|
|
48
|
+
officialDocsUrl: entry.officialDocsUrl ?? null,
|
|
49
|
+
riskRelevance: entry.riskRelevance,
|
|
50
|
+
safehandsBehavior: entry.safehandsBehavior,
|
|
51
|
+
recommendedDecisionImpact: CATEGORY_IMPACT[entry.category],
|
|
52
|
+
network: ctx.network ?? null,
|
|
53
|
+
chainId: ctx.chainId ?? null,
|
|
54
|
+
address: ctx.address ?? null,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function evidenceFromCategory(category, source, address) {
|
|
58
|
+
const meta = CATEGORY_META[category];
|
|
59
|
+
return {
|
|
60
|
+
category,
|
|
61
|
+
providerName: null,
|
|
62
|
+
status: category === "unknown" ? "not_implemented" : "to_verify",
|
|
63
|
+
confidence: "low",
|
|
64
|
+
source,
|
|
65
|
+
officialDocsUrl: null,
|
|
66
|
+
riskRelevance: meta.riskRelevance,
|
|
67
|
+
safehandsBehavior: meta.safehandsBehavior,
|
|
68
|
+
recommendedDecisionImpact: CATEGORY_IMPACT[category],
|
|
69
|
+
network: null,
|
|
70
|
+
chainId: null,
|
|
71
|
+
address,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Classify an ecosystem target. Priority: known official address → recognized
|
|
76
|
+
* canonical Safe → provider-name hint → category hint → unknown.
|
|
77
|
+
*/
|
|
78
|
+
export function classifyEcosystem(input) {
|
|
79
|
+
const network = input.network ?? getActiveNetwork();
|
|
80
|
+
const address = input.address?.trim() || null;
|
|
81
|
+
// 1) Known official ecosystem address (e.g. Chainlink price-feed cache).
|
|
82
|
+
if (address) {
|
|
83
|
+
const byAddr = lookupEcosystemByAddress(address);
|
|
84
|
+
if (byAddr) {
|
|
85
|
+
return evidenceFromEntry(byAddr.entry, { confidence: "high", network: byAddr.network, chainId: byAddr.chainId, address });
|
|
86
|
+
}
|
|
87
|
+
// 2) Recognized canonical contract that maps to an ecosystem (Safe → wallet infra).
|
|
88
|
+
const canonicalEco = ecosystemForCanonical(address, network);
|
|
89
|
+
if (canonicalEco) {
|
|
90
|
+
return evidenceFromEntry(canonicalEco, { confidence: "high", network: network.name, chainId: network.chainId, address });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 3) Provider name/alias hint.
|
|
94
|
+
if (input.provider) {
|
|
95
|
+
const byName = lookupEcosystemByName(input.provider);
|
|
96
|
+
if (byName)
|
|
97
|
+
return evidenceFromEntry(byName, { confidence: "medium", address });
|
|
98
|
+
}
|
|
99
|
+
// 4) Direct category hint.
|
|
100
|
+
if (input.category) {
|
|
101
|
+
const c = input.category.trim().toLowerCase();
|
|
102
|
+
if (isEcosystemCategory(c) && c !== "unknown")
|
|
103
|
+
return evidenceFromCategory(c, "to_verify", address);
|
|
104
|
+
}
|
|
105
|
+
// 5) Nothing recognized.
|
|
106
|
+
return evidenceFromCategory("unknown", "to_verify", address);
|
|
107
|
+
}
|
|
108
|
+
/** Classify ecosystem evidence for a request (address/target + optional hints). */
|
|
109
|
+
export function ecosystemEvidenceForRequest(req) {
|
|
110
|
+
const network = req.network && isNetworkName(req.network)
|
|
111
|
+
? getNetworkByChainId(req.network === "pacific-mainnet" ? 1672 : 688689) ?? getActiveNetwork()
|
|
112
|
+
: getActiveNetwork();
|
|
113
|
+
return classifyEcosystem({
|
|
114
|
+
address: req.address ?? req.to ?? req.token,
|
|
115
|
+
provider: req.provider,
|
|
116
|
+
category: req.ecosystemCategory,
|
|
117
|
+
network,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
const SEVERITY = { BLOCK: 3, REQUIRE_CONFIRMATION: 2, PREPARE_ONLY: 1, ALLOW: 0 };
|
|
121
|
+
/**
|
|
122
|
+
* Apply ecosystem evidence to a decision — ESCALATE-ONLY. Returns the more severe
|
|
123
|
+
* of the current decision and the evidence's recommended impact; it NEVER downgrades
|
|
124
|
+
* (a BLOCK stays BLOCK; an unlimited-approval BLOCK is never relaxed).
|
|
125
|
+
*/
|
|
126
|
+
export function applyEcosystemEscalation(decision, evidence) {
|
|
127
|
+
if (evidence.recommendedDecisionImpact !== "REQUIRE_CONFIRMATION")
|
|
128
|
+
return decision;
|
|
129
|
+
return SEVERITY[decision] >= SEVERITY.REQUIRE_CONFIRMATION ? decision : "REQUIRE_CONFIRMATION";
|
|
130
|
+
}
|
|
131
|
+
/** Re-export the registry for callers that want the full provider list. */
|
|
132
|
+
export { ECOSYSTEM_PROVIDERS };
|
|
133
|
+
//# sourceMappingURL=ecosystemEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecosystemEvidence.js","sourceRoot":"","sources":["../../../src/lib/pharos/ecosystemEvidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type PharosNetwork } from "../networks.js";
|
|
2
|
+
import { type RpcMethodClassification } from "./rpcMethods.js";
|
|
3
|
+
/** Raw JSON-RPC transport: (method, params) → result. Must perform reads only. */
|
|
4
|
+
export type RpcTransport = (method: string, params: unknown[]) => Promise<unknown>;
|
|
5
|
+
export interface PharosReadOnlyRpcOptions {
|
|
6
|
+
network?: PharosNetwork;
|
|
7
|
+
/** Explicit RPC URL override; otherwise resolved from env (never exposed). */
|
|
8
|
+
url?: string;
|
|
9
|
+
/** Injectable transport (used by tests). Defaults to a fetch JSON-RPC POST. */
|
|
10
|
+
transport?: RpcTransport;
|
|
11
|
+
}
|
|
12
|
+
export interface RpcAdapterCapabilities {
|
|
13
|
+
configured: boolean;
|
|
14
|
+
ethGetProof: RpcMethodClassification;
|
|
15
|
+
ethGetAccount: RpcMethodClassification;
|
|
16
|
+
ethFeeHistory: RpcMethodClassification;
|
|
17
|
+
}
|
|
18
|
+
export declare class PharosReadOnlyRpc {
|
|
19
|
+
readonly network: PharosNetwork;
|
|
20
|
+
private readonly url;
|
|
21
|
+
private readonly injectedTransport;
|
|
22
|
+
constructor(opts?: PharosReadOnlyRpcOptions);
|
|
23
|
+
/** True when a transport or RPC URL is available (does not perform any I/O). */
|
|
24
|
+
isConfigured(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Gate + execute a raw read-only JSON-RPC call. The matrix gate runs FIRST, so
|
|
27
|
+
* write/unsupported/unknown methods throw before any network I/O.
|
|
28
|
+
*/
|
|
29
|
+
request<T = unknown>(method: string, params?: unknown[]): Promise<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Best-effort experimental read: still gated (throws for blocked methods), but
|
|
32
|
+
* returns null instead of throwing when the transport is missing or fails.
|
|
33
|
+
*/
|
|
34
|
+
tryRequest<T = unknown>(method: string, params?: unknown[]): Promise<T | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Gate a method name, then run a (e.g. viem) read function. Lets existing typed
|
|
37
|
+
* reads keep their result parsing while still passing the whitelist chokepoint.
|
|
38
|
+
*/
|
|
39
|
+
guarded<T>(method: string, fn: () => Promise<T>): Promise<T>;
|
|
40
|
+
/** Matrix-derived capability descriptor (deterministic; performs no I/O). */
|
|
41
|
+
capabilities(): RpcAdapterCapabilities;
|
|
42
|
+
private transport;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/lib/pharos/rpc.ts"],"names":[],"mappings":"AASA,OAAO,EAAmC,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAErF,OAAO,EAAiD,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE9G,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,CAAC,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,uBAAuB,CAAC;IACrC,aAAa,EAAE,uBAAuB,CAAC;IACvC,aAAa,EAAE,uBAAuB,CAAC;CACxC;AAED,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;gBAEjD,IAAI,GAAE,wBAA6B;IAM/C,gFAAgF;IAChF,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAK9E;;;OAGG;IACG,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAUxF;;;OAGG;IACG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAKlE,6EAA6E;IAC7E,YAAY,IAAI,sBAAsB;IAStC,OAAO,CAAC,SAAS;CAsBlB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// ─── Pharos Read-Only RPC Adapter (single whitelist chokepoint) ────────
|
|
2
|
+
// A read-only JSON-RPC adapter that gates EVERY call through the method matrix
|
|
3
|
+
// (rpcMethods.ts) BEFORE any network I/O. Write/signing/account/unknown methods
|
|
4
|
+
// throw fail-closed and never reach the transport. There is no signer, wallet,
|
|
5
|
+
// or key surface here — read-only by construction. The transport is injectable
|
|
6
|
+
// (tests inject a spy); the default is a fetch-based JSON-RPC POST whose URL is
|
|
7
|
+
// resolved from env only (premium/keyed URLs are never hardcoded or exposed).
|
|
8
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
9
|
+
import { getActiveNetwork, resolveRpcUrl } from "../networks.js";
|
|
10
|
+
import { fetchWithTimeoutAndRetry } from "../http.js";
|
|
11
|
+
import { assertHostedReadOnlyMethod, classifyRpcMethod } from "./rpcMethods.js";
|
|
12
|
+
export class PharosReadOnlyRpc {
|
|
13
|
+
network;
|
|
14
|
+
url;
|
|
15
|
+
injectedTransport;
|
|
16
|
+
constructor(opts = {}) {
|
|
17
|
+
this.network = opts.network ?? getActiveNetwork();
|
|
18
|
+
this.url = opts.url ?? resolveRpcUrl(this.network);
|
|
19
|
+
this.injectedTransport = opts.transport;
|
|
20
|
+
}
|
|
21
|
+
/** True when a transport or RPC URL is available (does not perform any I/O). */
|
|
22
|
+
isConfigured() {
|
|
23
|
+
return Boolean(this.injectedTransport) || Boolean(this.url);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Gate + execute a raw read-only JSON-RPC call. The matrix gate runs FIRST, so
|
|
27
|
+
* write/unsupported/unknown methods throw before any network I/O.
|
|
28
|
+
*/
|
|
29
|
+
async request(method, params = []) {
|
|
30
|
+
assertHostedReadOnlyMethod(method);
|
|
31
|
+
return (await this.transport()(method, params));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Best-effort experimental read: still gated (throws for blocked methods), but
|
|
35
|
+
* returns null instead of throwing when the transport is missing or fails.
|
|
36
|
+
*/
|
|
37
|
+
async tryRequest(method, params = []) {
|
|
38
|
+
assertHostedReadOnlyMethod(method);
|
|
39
|
+
if (!this.isConfigured())
|
|
40
|
+
return null;
|
|
41
|
+
try {
|
|
42
|
+
return (await this.transport()(method, params));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Gate a method name, then run a (e.g. viem) read function. Lets existing typed
|
|
50
|
+
* reads keep their result parsing while still passing the whitelist chokepoint.
|
|
51
|
+
*/
|
|
52
|
+
async guarded(method, fn) {
|
|
53
|
+
assertHostedReadOnlyMethod(method);
|
|
54
|
+
return fn();
|
|
55
|
+
}
|
|
56
|
+
/** Matrix-derived capability descriptor (deterministic; performs no I/O). */
|
|
57
|
+
capabilities() {
|
|
58
|
+
return {
|
|
59
|
+
configured: this.isConfigured(),
|
|
60
|
+
ethGetProof: classifyRpcMethod("eth_getProof"),
|
|
61
|
+
ethGetAccount: classifyRpcMethod("eth_getAccount"),
|
|
62
|
+
ethFeeHistory: classifyRpcMethod("eth_feeHistory"),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
transport() {
|
|
66
|
+
if (this.injectedTransport)
|
|
67
|
+
return this.injectedTransport;
|
|
68
|
+
const url = this.url;
|
|
69
|
+
if (!url) {
|
|
70
|
+
return async (method) => {
|
|
71
|
+
throw new Error(`No RPC URL configured for ${this.network.name} (offline read-only); cannot call ${method}.`);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return async (method, params) => {
|
|
75
|
+
const res = await fetchWithTimeoutAndRetry(url, {
|
|
76
|
+
method: "POST",
|
|
77
|
+
headers: { "content-type": "application/json" },
|
|
78
|
+
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method, params }),
|
|
79
|
+
timeoutMs: 10_000,
|
|
80
|
+
retries: 1,
|
|
81
|
+
retryDelayMs: 250,
|
|
82
|
+
});
|
|
83
|
+
const json = (await res.json());
|
|
84
|
+
if (json.error)
|
|
85
|
+
throw new Error(`RPC error for ${method}: ${json.error.message ?? "unknown"}`);
|
|
86
|
+
return json.result;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../src/lib/pharos/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type NetworkName, type PharosNetwork, type RpcProviderName } from "../networks.js";
|
|
2
|
+
import type { ReadOnlyChainAccess } from "../analysis/types.js";
|
|
3
|
+
import { type RpcMethodMatrixSummary } from "./rpcMethods.js";
|
|
4
|
+
export interface RpcProviderEvidence {
|
|
5
|
+
name: RpcProviderName;
|
|
6
|
+
configuredViaEnv: boolean;
|
|
7
|
+
usingPublicDefault: boolean;
|
|
8
|
+
/** Always true — the URL/API key is never included in evidence. */
|
|
9
|
+
secretsRedacted: true;
|
|
10
|
+
}
|
|
11
|
+
export interface RpcProofCapability {
|
|
12
|
+
method: "eth_getProof";
|
|
13
|
+
status: "experimental" | "implemented";
|
|
14
|
+
readOnly: true;
|
|
15
|
+
spvVerification: "not_implemented" | "implemented";
|
|
16
|
+
}
|
|
17
|
+
export interface RpcFeeCapability {
|
|
18
|
+
gasPrice: boolean;
|
|
19
|
+
maxPriorityFeePerGas: boolean;
|
|
20
|
+
feeHistory: boolean;
|
|
21
|
+
estimateGas: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface RpcEvidence {
|
|
24
|
+
readOnly: true;
|
|
25
|
+
executionAvailable: boolean;
|
|
26
|
+
network: NetworkName;
|
|
27
|
+
chainId: number;
|
|
28
|
+
provider: RpcProviderEvidence;
|
|
29
|
+
methods: RpcMethodMatrixSummary;
|
|
30
|
+
writeBlocked: string[];
|
|
31
|
+
capabilities: {
|
|
32
|
+
ethGetProof: RpcProofCapability;
|
|
33
|
+
feeData: RpcFeeCapability;
|
|
34
|
+
};
|
|
35
|
+
/** True when no live read-only access was supplied (capability-only evidence). */
|
|
36
|
+
fallbackUsed: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare function rpcEvidence(network?: PharosNetwork, access?: ReadOnlyChainAccess): RpcEvidence;
|
|
39
|
+
export interface GasEvidence {
|
|
40
|
+
gasBufferPct: number;
|
|
41
|
+
feeDataAvailable: boolean;
|
|
42
|
+
feeHistoryAvailable: boolean;
|
|
43
|
+
priorityFeeAvailable: boolean;
|
|
44
|
+
estimateGasAvailable: boolean;
|
|
45
|
+
/** True when no live gas estimator was supplied (offline/capability-only). */
|
|
46
|
+
fallbackUsed: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare function gasEvidence(access?: ReadOnlyChainAccess): GasEvidence;
|
|
49
|
+
//# sourceMappingURL=rpcEvidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpcEvidence.d.ts","sourceRoot":"","sources":["../../../src/lib/pharos/rpcEvidence.ts"],"names":[],"mappings":"AAQA,OAAO,EAAwC,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGlI,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAmE,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE/H,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mEAAmE;IACnE,eAAe,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,cAAc,GAAG,aAAa,CAAC;IACvC,QAAQ,EAAE,IAAI,CAAC;IACf,eAAe,EAAE,iBAAiB,GAAG,aAAa,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,IAAI,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,OAAO,EAAE,sBAAsB,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE;QACZ,WAAW,EAAE,kBAAkB,CAAC;QAChC,OAAO,EAAE,gBAAgB,CAAC;KAC3B,CAAC;IACF,kFAAkF;IAClF,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,aAAkC,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,WAAW,CAuBlH;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,8EAA8E;IAC9E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,WAAW,CASrE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// ─── Pharos Read-Only RPC Evidence (deterministic, secret-free) ────────
|
|
2
|
+
// Builds read-only `rpcEvidence` / `gasEvidence` descriptors for API and Agent
|
|
3
|
+
// responses. Everything here is derived from the method matrix + network/config
|
|
4
|
+
// — it performs NO network I/O and is deterministic offline. It NEVER exposes an
|
|
5
|
+
// RPC URL or API key (only the redacted provider name). Evidence is metadata: it
|
|
6
|
+
// describes read-only capability and never relaxes a SafeHands decision.
|
|
7
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
8
|
+
import { getActiveNetwork, resolveRpcProvider } from "../networks.js";
|
|
9
|
+
import { isExecutionAvailable } from "../config.js";
|
|
10
|
+
import { DEFAULT_GAS_BUFFER_PCT } from "../analysis/gas.js";
|
|
11
|
+
import { isReadOnlyMethod, rpcMethodMatrixSummary, WRITE_BLOCKED_METHODS } from "./rpcMethods.js";
|
|
12
|
+
export function rpcEvidence(network = getActiveNetwork(), access) {
|
|
13
|
+
const provider = resolveRpcProvider(network);
|
|
14
|
+
return {
|
|
15
|
+
readOnly: true,
|
|
16
|
+
executionAvailable: isExecutionAvailable(network),
|
|
17
|
+
network: network.name,
|
|
18
|
+
chainId: network.chainId,
|
|
19
|
+
provider: { ...provider, secretsRedacted: true },
|
|
20
|
+
methods: rpcMethodMatrixSummary(),
|
|
21
|
+
writeBlocked: WRITE_BLOCKED_METHODS,
|
|
22
|
+
capabilities: {
|
|
23
|
+
// Status matches rpcMethods.ts: the method is experimental (heavy, best-effort);
|
|
24
|
+
// SPV verification itself is implemented (spvVerifier.ts via get_spv_proof).
|
|
25
|
+
ethGetProof: { method: "eth_getProof", status: "experimental", readOnly: true, spvVerification: "implemented" },
|
|
26
|
+
feeData: {
|
|
27
|
+
gasPrice: isReadOnlyMethod("eth_gasPrice"),
|
|
28
|
+
maxPriorityFeePerGas: isReadOnlyMethod("eth_maxPriorityFeePerGas"),
|
|
29
|
+
feeHistory: isReadOnlyMethod("eth_feeHistory"),
|
|
30
|
+
estimateGas: isReadOnlyMethod("eth_estimateGas"),
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
fallbackUsed: !access,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function gasEvidence(access) {
|
|
37
|
+
return {
|
|
38
|
+
gasBufferPct: DEFAULT_GAS_BUFFER_PCT,
|
|
39
|
+
feeDataAvailable: isReadOnlyMethod("eth_gasPrice"),
|
|
40
|
+
feeHistoryAvailable: isReadOnlyMethod("eth_feeHistory"),
|
|
41
|
+
priorityFeeAvailable: isReadOnlyMethod("eth_maxPriorityFeePerGas"),
|
|
42
|
+
estimateGasAvailable: isReadOnlyMethod("eth_estimateGas"),
|
|
43
|
+
fallbackUsed: !access?.estimateGas,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=rpcEvidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpcEvidence.js","sourceRoot":"","sources":["../../../src/lib/pharos/rpcEvidence.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,yEAAyE;AACzE,0EAA0E;AAE1E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAA8D,MAAM,gBAAgB,CAAC;AAClI,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,qBAAqB,EAA+B,MAAM,iBAAiB,CAAC;AAwC/H,MAAM,UAAU,WAAW,CAAC,UAAyB,gBAAgB,EAAE,EAAE,MAA4B;IACnG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,kBAAkB,EAAE,oBAAoB,CAAC,OAAO,CAAC;QACjD,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE;QAChD,OAAO,EAAE,sBAAsB,EAAE;QACjC,YAAY,EAAE,qBAAqB;QACnC,YAAY,EAAE;YACZ,iFAAiF;YACjF,6EAA6E;YAC7E,WAAW,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE;YAC/G,OAAO,EAAE;gBACP,QAAQ,EAAE,gBAAgB,CAAC,cAAc,CAAC;gBAC1C,oBAAoB,EAAE,gBAAgB,CAAC,0BAA0B,CAAC;gBAClE,UAAU,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;gBAC9C,WAAW,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;aACjD;SACF;QACD,YAAY,EAAE,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAYD,MAAM,UAAU,WAAW,CAAC,MAA4B;IACtD,OAAO;QACL,YAAY,EAAE,sBAAsB;QACpC,gBAAgB,EAAE,gBAAgB,CAAC,cAAc,CAAC;QAClD,mBAAmB,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;QACvD,oBAAoB,EAAE,gBAAgB,CAAC,0BAA0B,CAAC;QAClE,oBAAoB,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;QACzD,YAAY,EAAE,CAAC,MAAM,EAAE,WAAW;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export type RpcMethodClassification = "read_only" | "experimental_read_only" | "write_blocked" | "unsupported" | "to_verify";
|
|
2
|
+
export type RpcMethodSafehandsStatus = "implemented" | "experimental" | "blocked" | "not_implemented" | "to_verify";
|
|
3
|
+
export interface RpcMethodEntry {
|
|
4
|
+
method: string;
|
|
5
|
+
classification: RpcMethodClassification;
|
|
6
|
+
officialDocsUrl?: string;
|
|
7
|
+
safehandsStatus: RpcMethodSafehandsStatus;
|
|
8
|
+
riskRelevance: string;
|
|
9
|
+
hostedModeBehavior: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const RPC_METHOD_MATRIX: Record<string, RpcMethodEntry>;
|
|
12
|
+
/** Error thrown when a non-read-only (or unknown) method is requested in hosted mode. */
|
|
13
|
+
export declare class RpcMethodBlockedError extends Error {
|
|
14
|
+
readonly method: string;
|
|
15
|
+
readonly classification: RpcMethodClassification;
|
|
16
|
+
constructor(method: string, classification: RpcMethodClassification);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Classify a method. Known methods use the matrix; unknown `wallet_*`/`personal_*`
|
|
20
|
+
* are treated as write_blocked, and any other unknown method as unsupported — both
|
|
21
|
+
* fail closed in {@link assertHostedReadOnlyMethod}.
|
|
22
|
+
*/
|
|
23
|
+
export declare function classifyRpcMethod(method: string): RpcMethodClassification;
|
|
24
|
+
/** A method usable by read-only analyzers (read_only or experimental_read_only). */
|
|
25
|
+
export declare function isReadOnlyMethod(method: string): boolean;
|
|
26
|
+
export declare function isWriteBlockedMethod(method: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Fail-closed gate for hosted/read-only mode. Returns for read_only and
|
|
29
|
+
* experimental_read_only methods; THROWS for write_blocked, unsupported,
|
|
30
|
+
* to_verify, and any unknown method. This must run BEFORE any network I/O.
|
|
31
|
+
*/
|
|
32
|
+
export declare function assertHostedReadOnlyMethod(method: string): void;
|
|
33
|
+
export declare const READ_ONLY_METHODS: string[];
|
|
34
|
+
export declare const EXPERIMENTAL_READ_ONLY_METHODS: string[];
|
|
35
|
+
export declare const WRITE_BLOCKED_METHODS: string[];
|
|
36
|
+
export declare const UNSUPPORTED_METHODS: string[];
|
|
37
|
+
export interface RpcMethodMatrixSummary {
|
|
38
|
+
readOnly: number;
|
|
39
|
+
experimentalReadOnly: number;
|
|
40
|
+
writeBlocked: number;
|
|
41
|
+
unsupported: number;
|
|
42
|
+
toVerify: number;
|
|
43
|
+
total: number;
|
|
44
|
+
}
|
|
45
|
+
export declare function rpcMethodMatrixSummary(): RpcMethodMatrixSummary;
|
|
46
|
+
//# sourceMappingURL=rpcMethods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpcMethods.d.ts","sourceRoot":"","sources":["../../../src/lib/pharos/rpcMethods.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,uBAAuB,GAC/B,WAAW,GACX,wBAAwB,GACxB,eAAe,GACf,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,MAAM,wBAAwB,GAChC,aAAa,GACb,cAAc,GACd,SAAS,GACT,iBAAiB,GACjB,WAAW,CAAC;AAEhB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,uBAAuB,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,wBAAwB,CAAC;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAwHD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAE5D,CAAC;AAEF,yFAAyF;AACzF,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,uBAAuB,CAAC;gBACrC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,uBAAuB;CAMpE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAKzE;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI/D;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAiF,CAAC;AACxH,eAAO,MAAM,8BAA8B,EAAE,MAAM,EAA8F,CAAC;AAClJ,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAAqF,CAAC;AAChI,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAAmF,CAAC;AAE5H,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,sBAAsB,IAAI,sBAAsB,CAW/D"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// ─── Pharos JSON-RPC Method Matrix (read-only enforcement) ─────────────
|
|
2
|
+
// Single source of truth classifying every JSON-RPC method SafeHands may
|
|
3
|
+
// encounter. Hosted/read-only mode allows ONLY read methods; write, signing,
|
|
4
|
+
// and account methods are blocked fail-closed (unknown methods are blocked too).
|
|
5
|
+
// Grounded in the official Pharos JSON-RPC docs
|
|
6
|
+
// (docs.pharos.xyz/api-and-sdk/json-rpc-methods, verified 2026-06-27):
|
|
7
|
+
// • the ONLY documented write method is eth_sendRawTransaction
|
|
8
|
+
// • eth_getProof (EIP-1186) and eth_getAccount are officially supported reads
|
|
9
|
+
// • eth_accounts returns [] (the node manages no accounts); eth_sign is undocumented
|
|
10
|
+
// Nothing in this module signs, sends, or mutates chain state.
|
|
11
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
12
|
+
const JSON_RPC_DOCS = "https://docs.pharos.xyz/api-and-sdk/json-rpc-methods";
|
|
13
|
+
const GETPROOF_DOCS = "https://docs.pharos.xyz/api-and-sdk/eth-getproof-storage-state-verification";
|
|
14
|
+
const ALLOW_BEHAVIOR = "Allowed in hosted read-only mode.";
|
|
15
|
+
const EXPERIMENTAL_BEHAVIOR = "Allowed as a read-only call, attempted with graceful fallback; deeper verification (e.g. SPV) is NOT implemented.";
|
|
16
|
+
const BLOCK_BEHAVIOR = "BLOCKED in hosted read-only mode; never called.";
|
|
17
|
+
const UNSUPPORTED_BEHAVIOR = "Unsupported on Pharos / never called automatically.";
|
|
18
|
+
function readOnly(method, riskRelevance, officialDocsUrl = JSON_RPC_DOCS) {
|
|
19
|
+
return { method, classification: "read_only", officialDocsUrl, safehandsStatus: "implemented", riskRelevance, hostedModeBehavior: ALLOW_BEHAVIOR };
|
|
20
|
+
}
|
|
21
|
+
function experimental(method, riskRelevance, officialDocsUrl = JSON_RPC_DOCS) {
|
|
22
|
+
return { method, classification: "experimental_read_only", officialDocsUrl, safehandsStatus: "experimental", riskRelevance, hostedModeBehavior: EXPERIMENTAL_BEHAVIOR };
|
|
23
|
+
}
|
|
24
|
+
function writeBlocked(method, riskRelevance) {
|
|
25
|
+
return { method, classification: "write_blocked", officialDocsUrl: JSON_RPC_DOCS, safehandsStatus: "blocked", riskRelevance, hostedModeBehavior: BLOCK_BEHAVIOR };
|
|
26
|
+
}
|
|
27
|
+
function unsupported(method, riskRelevance) {
|
|
28
|
+
return { method, classification: "unsupported", safehandsStatus: "not_implemented", riskRelevance, hostedModeBehavior: UNSUPPORTED_BEHAVIOR };
|
|
29
|
+
}
|
|
30
|
+
const ENTRIES = [
|
|
31
|
+
// ── Read-only (officially supported) ──────────────────────────────────
|
|
32
|
+
readOnly("eth_chainId", "Confirms the active chain (Pacific Mainnet = 1672)."),
|
|
33
|
+
readOnly("eth_blockNumber", "Chain head; freshness of read evidence."),
|
|
34
|
+
readOnly("eth_gasPrice", "Legacy gas price for fee estimation."),
|
|
35
|
+
readOnly("eth_maxPriorityFeePerGas", "EIP-1559 priority fee for fee estimation."),
|
|
36
|
+
readOnly("eth_feeHistory", "Historical base/priority fees for fee estimation."),
|
|
37
|
+
readOnly("eth_call", "Simulated read-only call; never changes state."),
|
|
38
|
+
readOnly("eth_estimateGas", "Gas estimation; a failing estimate often signals a revert."),
|
|
39
|
+
readOnly("eth_getCode", "Distinguishes contracts from EOAs."),
|
|
40
|
+
readOnly("eth_getBalance", "Account balance for affordability checks."),
|
|
41
|
+
readOnly("eth_getStorageAt", "Raw contract storage read."),
|
|
42
|
+
readOnly("eth_getTransactionCount", "Account nonce."),
|
|
43
|
+
readOnly("eth_getTransactionByHash", "Transaction lookup by hash."),
|
|
44
|
+
readOnly("eth_getTransactionReceipt", "Receipt/status of a mined transaction."),
|
|
45
|
+
readOnly("eth_getBlockByHash", "Block lookup by hash."),
|
|
46
|
+
readOnly("eth_getBlockByNumber", "Block lookup by number."),
|
|
47
|
+
readOnly("eth_getBlockReceipts", "All transaction receipts in a block."),
|
|
48
|
+
readOnly("eth_getLogs", "Event logs (block range ≤100 when rate-limited)."),
|
|
49
|
+
readOnly("eth_getAccount", "Account details (balance/nonce); officially supported read."),
|
|
50
|
+
readOnly("eth_syncing", "Node sync status."),
|
|
51
|
+
readOnly("net_version", "Network id."),
|
|
52
|
+
readOnly("web3_clientVersion", "Client version string."),
|
|
53
|
+
// ── Experimental read-only (supported but heavy / not fully consumed) ──
|
|
54
|
+
experimental("eth_getProof", "EIP-1186 account/storage Merkle proof. SPV verification is implemented (src/lib/pharos/spvVerifier.ts, exposed via get_spv_proof) using Pharos' SHA-256 trie; the method itself remains experimental (heavy, best-effort).", GETPROOF_DOCS),
|
|
55
|
+
experimental("debug_traceTransaction", "Full execution trace; heavy/optional, best-effort only."),
|
|
56
|
+
experimental("trace_filter", "Filtered traces (block range ≤500); heavy/optional, best-effort only."),
|
|
57
|
+
// ── Write — BLOCKED in hosted read-only mode ──────────────────────────
|
|
58
|
+
writeBlocked("eth_sendRawTransaction", "Submits a signed transaction: the only documented state-changing method; NEVER used in hosted read-only mode."),
|
|
59
|
+
writeBlocked("eth_sendTransaction", "Node-signed send; blocked (the node manages no accounts and SafeHands never sends)."),
|
|
60
|
+
writeBlocked("eth_signTransaction", "Signs a transaction; blocked: SafeHands never signs."),
|
|
61
|
+
writeBlocked("eth_sign", "Signs arbitrary data; blocked (also undocumented on Pharos)."),
|
|
62
|
+
writeBlocked("personal_sign", "Wallet message signing; blocked: SafeHands holds no keys."),
|
|
63
|
+
writeBlocked("eth_signTypedData", "EIP-712 typed-data signing; blocked."),
|
|
64
|
+
writeBlocked("eth_signTypedData_v4", "EIP-712 typed-data signing; blocked."),
|
|
65
|
+
writeBlocked("personal_unlockAccount", "Unlocks a node-managed account; blocked."),
|
|
66
|
+
writeBlocked("personal_newAccount", "Account creation; blocked: SafeHands never creates/holds keys."),
|
|
67
|
+
writeBlocked("personal_importRawKey", "Private-key import; blocked: SafeHands never imports keys."),
|
|
68
|
+
writeBlocked("wallet_addEthereumChain", "Wallet management; blocked."),
|
|
69
|
+
writeBlocked("wallet_switchEthereumChain", "Wallet management; blocked."),
|
|
70
|
+
writeBlocked("wallet_watchAsset", "Wallet management; blocked."),
|
|
71
|
+
writeBlocked("wallet_requestPermissions", "Wallet management; blocked."),
|
|
72
|
+
// ── Unsupported on Pharos / never auto-called ─────────────────────────
|
|
73
|
+
unsupported("eth_accounts", "Returns [] on Pharos (node manages no accounts); never relied upon."),
|
|
74
|
+
unsupported("eth_coinbase", "Deprecated PoW-era method; not used."),
|
|
75
|
+
unsupported("eth_mining", "Deprecated PoW-era method; not used."),
|
|
76
|
+
unsupported("eth_hashrate", "Deprecated PoW-era method; not used."),
|
|
77
|
+
unsupported("eth_getUncleCountByBlockHash", "Uncles are a PoW concept; returns null."),
|
|
78
|
+
unsupported("eth_getUncleCountByBlockNumber", "Uncles are a PoW concept; returns null."),
|
|
79
|
+
unsupported("eth_getUncleByBlockHashAndIndex", "Uncles are a PoW concept; returns null."),
|
|
80
|
+
unsupported("eth_getUncleByBlockNumberAndIndex", "Uncles are a PoW concept; returns null."),
|
|
81
|
+
unsupported("eth_getCompilers", "Deprecated."),
|
|
82
|
+
unsupported("eth_pendingTransactions", "Returns empty array on Pharos."),
|
|
83
|
+
unsupported("eth_batchGetBlockByNumber", "Method not implemented on Pharos."),
|
|
84
|
+
unsupported("eth_batchGetTransactionByHash", "Method not implemented on Pharos."),
|
|
85
|
+
unsupported("eth_batchGetTransactionReceipt", "Method not implemented on Pharos."),
|
|
86
|
+
unsupported("eth_batchGetBlockReceipts", "Method not implemented on Pharos."),
|
|
87
|
+
// ── Newly Documented Read Methods (Pacific Mainnet) ───────────────────
|
|
88
|
+
readOnly("eth_createAccessList", "Creates an EIP-2930 access list for a transaction (under debugging)."),
|
|
89
|
+
readOnly("eth_getBlockTransactionCountByHash", "Returns the number of transactions in a block by block hash."),
|
|
90
|
+
readOnly("eth_getBlockTransactionCountByNumber", "Returns the number of transactions in a block by block number."),
|
|
91
|
+
readOnly("eth_getTransactionByBlockHashAndIndex", "Returns a transaction by block hash and index position."),
|
|
92
|
+
readOnly("eth_getTransactionByBlockNumberAndIndex", "Returns a transaction by block number and index position."),
|
|
93
|
+
readOnly("eth_subscribe", "Creates a subscription for real-time events (WebSocket only)."),
|
|
94
|
+
readOnly("eth_unsubscribe", "Cancels an existing subscription (WebSocket only)."),
|
|
95
|
+
readOnly("net_listening", "Returns whether the node is actively listening (not available on public RPC)."),
|
|
96
|
+
readOnly("net_peerCount", "Returns the number of connected peers (not available on public RPC)."),
|
|
97
|
+
readOnly("web3_sha3", "Returns the Keccak-256 hash of the given data (not available on public RPC)."),
|
|
98
|
+
readOnly("eth_getProposerByTxHash", "Returns the block proposer for a given transaction (Pharos Extension)."),
|
|
99
|
+
readOnly("eth_getProposersByBlockNumber", "Returns the list of proposers for a given block (Pharos Extension)."),
|
|
100
|
+
// ── Debug / Trace Methods ──────────────────────────────────────────────
|
|
101
|
+
experimental("debug_traceCall", "Executes a call and returns the execution trace without creating a transaction."),
|
|
102
|
+
experimental("debug_traceBlockByHash", "Returns traces for all transactions in a block by block hash."),
|
|
103
|
+
experimental("debug_traceBlockByNumber", "Returns traces for all transactions in a block by block number."),
|
|
104
|
+
experimental("debug_getRawBlock", "Returns the RLP-encoded block data."),
|
|
105
|
+
experimental("debug_getRawHeader", "Returns the RLP-encoded block header."),
|
|
106
|
+
experimental("debug_getRawReceipts", "Returns the raw receipts for a block."),
|
|
107
|
+
experimental("debug_getRawTransaction", "Returns the raw transaction data by hash."),
|
|
108
|
+
experimental("debug_protocolVersion", "Returns detailed protocol and version information."),
|
|
109
|
+
experimental("txpool_nonceFrom", "Returns the next nonce for an address from the transaction pool."),
|
|
110
|
+
experimental("debug_getValidatorInfo", "Returns validator information for the consensus layer (Pharos Extension)."),
|
|
111
|
+
experimental("debug_getBlockProof", "Returns the block proof data for BLS signature verification (Pharos Extension)."),
|
|
112
|
+
experimental("debug_getBlockReadStates", "Returns the read state set for a block (Pharos Extension)."),
|
|
113
|
+
experimental("debug_getBlockWriteStates", "Returns the write state set for a block (Pharos Extension)."),
|
|
114
|
+
experimental("debug_getBlockWriteSetKeys", "Returns the write set keys for a block (Pharos Extension)."),
|
|
115
|
+
];
|
|
116
|
+
export const RPC_METHOD_MATRIX = Object.fromEntries(ENTRIES.map((e) => [e.method, e]));
|
|
117
|
+
/** Error thrown when a non-read-only (or unknown) method is requested in hosted mode. */
|
|
118
|
+
export class RpcMethodBlockedError extends Error {
|
|
119
|
+
method;
|
|
120
|
+
classification;
|
|
121
|
+
constructor(method, classification) {
|
|
122
|
+
super(`RPC method "${method}" is blocked in hosted read-only mode (classification: ${classification}).`);
|
|
123
|
+
this.name = "RpcMethodBlockedError";
|
|
124
|
+
this.method = method;
|
|
125
|
+
this.classification = classification;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Classify a method. Known methods use the matrix; unknown `wallet_*`/`personal_*`
|
|
130
|
+
* are treated as write_blocked, and any other unknown method as unsupported — both
|
|
131
|
+
* fail closed in {@link assertHostedReadOnlyMethod}.
|
|
132
|
+
*/
|
|
133
|
+
export function classifyRpcMethod(method) {
|
|
134
|
+
const entry = RPC_METHOD_MATRIX[method];
|
|
135
|
+
if (entry)
|
|
136
|
+
return entry.classification;
|
|
137
|
+
if (method.startsWith("wallet_") || method.startsWith("personal_"))
|
|
138
|
+
return "write_blocked";
|
|
139
|
+
return "unsupported";
|
|
140
|
+
}
|
|
141
|
+
/** A method usable by read-only analyzers (read_only or experimental_read_only). */
|
|
142
|
+
export function isReadOnlyMethod(method) {
|
|
143
|
+
const c = classifyRpcMethod(method);
|
|
144
|
+
return c === "read_only" || c === "experimental_read_only";
|
|
145
|
+
}
|
|
146
|
+
export function isWriteBlockedMethod(method) {
|
|
147
|
+
return classifyRpcMethod(method) === "write_blocked";
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Fail-closed gate for hosted/read-only mode. Returns for read_only and
|
|
151
|
+
* experimental_read_only methods; THROWS for write_blocked, unsupported,
|
|
152
|
+
* to_verify, and any unknown method. This must run BEFORE any network I/O.
|
|
153
|
+
*/
|
|
154
|
+
export function assertHostedReadOnlyMethod(method) {
|
|
155
|
+
const c = classifyRpcMethod(method);
|
|
156
|
+
if (c === "read_only" || c === "experimental_read_only")
|
|
157
|
+
return;
|
|
158
|
+
throw new RpcMethodBlockedError(method, c);
|
|
159
|
+
}
|
|
160
|
+
export const READ_ONLY_METHODS = ENTRIES.filter((e) => e.classification === "read_only").map((e) => e.method);
|
|
161
|
+
export const EXPERIMENTAL_READ_ONLY_METHODS = ENTRIES.filter((e) => e.classification === "experimental_read_only").map((e) => e.method);
|
|
162
|
+
export const WRITE_BLOCKED_METHODS = ENTRIES.filter((e) => e.classification === "write_blocked").map((e) => e.method);
|
|
163
|
+
export const UNSUPPORTED_METHODS = ENTRIES.filter((e) => e.classification === "unsupported").map((e) => e.method);
|
|
164
|
+
export function rpcMethodMatrixSummary() {
|
|
165
|
+
const vals = Object.values(RPC_METHOD_MATRIX);
|
|
166
|
+
const count = (c) => vals.filter((e) => e.classification === c).length;
|
|
167
|
+
return {
|
|
168
|
+
readOnly: count("read_only"),
|
|
169
|
+
experimentalReadOnly: count("experimental_read_only"),
|
|
170
|
+
writeBlocked: count("write_blocked"),
|
|
171
|
+
unsupported: count("unsupported"),
|
|
172
|
+
toVerify: count("to_verify"),
|
|
173
|
+
total: vals.length,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=rpcMethods.js.map
|