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 @@
|
|
|
1
|
+
{"version":3,"file":"agentPolicy.js","sourceRoot":"","sources":["../../../src/lib/policy/agentPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type GuardianPolicy } from "../../agent/agentPolicyResolver.js";
|
|
2
|
+
export type PolicyPreset = "standard" | "strict" | "agent" | "x402-preflight";
|
|
3
|
+
export declare const PRESET_NAMES: readonly PolicyPreset[];
|
|
4
|
+
/** Bump when preset semantics change. Surfaced (never secret) in responses/metrics. */
|
|
5
|
+
export declare const POLICY_VERSION = "p8c-2026.06";
|
|
6
|
+
export declare const PRESETS: Readonly<Record<PolicyPreset, GuardianPolicy>>;
|
|
7
|
+
export declare function isPreset(value: unknown): value is PolicyPreset;
|
|
8
|
+
export declare function presetPolicy(name: PolicyPreset): GuardianPolicy;
|
|
9
|
+
/**
|
|
10
|
+
* True iff `candidate` is equal-or-stricter than `baseline`: every numeric limit
|
|
11
|
+
* is ≤ baseline, the safety booleans are not weaker, and it adds no extra trusted
|
|
12
|
+
* entries. Used both at load (presets vs `standard`) and at request resolution.
|
|
13
|
+
*/
|
|
14
|
+
export declare function assertNotWeaker(candidate: GuardianPolicy, baseline: GuardianPolicy): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the effective preset NAME (tighten-only). Precedence:
|
|
17
|
+
* serverDefault = env (SAFEHANDS_POLICY_PRESET) → endpointDefault → "standard".
|
|
18
|
+
* A request preset is honored only if it is a valid preset that is equal-or-stricter
|
|
19
|
+
* than the server default; otherwise the server default wins (a request can never
|
|
20
|
+
* loosen policy).
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolvePresetName(requestPreset: unknown, endpointDefault?: PolicyPreset, envPreset?: string): PolicyPreset;
|
|
23
|
+
/**
|
|
24
|
+
* Sanitize request-supplied policy overrides onto a server policy: TIGHTEN-ONLY.
|
|
25
|
+
* Numeric limits may only be lowered; safety booleans may only be set toward safer
|
|
26
|
+
* (true); request-supplied trusted lists are IGNORED (server-config only) so public
|
|
27
|
+
* callers can never add an approval/transfer bypass.
|
|
28
|
+
*/
|
|
29
|
+
export declare function sanitizeRequestPolicy(serverPolicy: GuardianPolicy, overrides: unknown): GuardianPolicy;
|
|
30
|
+
//# sourceMappingURL=policyPresets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyPresets.d.ts","sourceRoot":"","sources":["../../../src/lib/policy/policyPresets.ts"],"names":[],"mappings":"AAaA,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEjG,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAE9E,eAAO,MAAM,YAAY,EAAE,SAAS,YAAY,EAAsD,CAAC;AAEvG,uFAAuF;AACvF,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAS5C,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CA+BlE,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAE9D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAS5F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,OAAO,EACtB,eAAe,GAAE,YAAyB,EAC1C,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,CAMd;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,GAAG,cAAc,CAkBtG"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// ─── SafeHands Policy Presets ─────────────────────────────────────
|
|
2
|
+
// Named presets are `GuardianPolicy` configs fed to the EXISTING escalate-only
|
|
3
|
+
// `applyPolicy` (agentPolicyResolver) — so no preset or request can ever weaken
|
|
4
|
+
// the analyzer's decision (a BLOCK stays a BLOCK by construction). On top of that
|
|
5
|
+
// structural guarantee:
|
|
6
|
+
// • every preset is equal-or-stricter than `standard` (assertNotWeaker, tested),
|
|
7
|
+
// • preset resolution is TIGHTEN-ONLY (a request may only pick an equal/stricter
|
|
8
|
+
// preset than the server default),
|
|
9
|
+
// • `sanitizeRequestPolicy` clamps request overrides to tighten-only and drops
|
|
10
|
+
// request-supplied trusted lists (public callers can never add a bypass).
|
|
11
|
+
// Pure + offline. No signing/wallet/write primitives.
|
|
12
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
13
|
+
import { DEFAULT_BACKEND_POLICY } from "../../agent/agentPolicyResolver.js";
|
|
14
|
+
export const PRESET_NAMES = ["standard", "strict", "agent", "x402-preflight"];
|
|
15
|
+
/** Bump when preset semantics change. Surfaced (never secret) in responses/metrics. */
|
|
16
|
+
export const POLICY_VERSION = "p8c-2026.06";
|
|
17
|
+
const NUMERIC_KEYS = [
|
|
18
|
+
"maxNativeTransferWei",
|
|
19
|
+
"maxApprovalAmount",
|
|
20
|
+
"maxX402PaymentUsdc",
|
|
21
|
+
"maxDailyAgentSpendUsdc",
|
|
22
|
+
];
|
|
23
|
+
export const PRESETS = {
|
|
24
|
+
// standard = the current public default (no change in behavior).
|
|
25
|
+
standard: { ...DEFAULT_BACKEND_POLICY },
|
|
26
|
+
// strict = much lower limits; always confirm/block the risky cases.
|
|
27
|
+
strict: {
|
|
28
|
+
maxNativeTransferWei: "1000000000000000000", // 1 native
|
|
29
|
+
maxApprovalAmount: "1000000000", // 1e9 raw units
|
|
30
|
+
maxX402PaymentUsdc: "0.1",
|
|
31
|
+
maxDailyAgentSpendUsdc: "10",
|
|
32
|
+
trustedRecipients: [],
|
|
33
|
+
trustedSpenders: [],
|
|
34
|
+
blockUnlimitedApproval: true,
|
|
35
|
+
requireConfirmationForUnknownContract: true,
|
|
36
|
+
},
|
|
37
|
+
// agent = the A2A/agent runtime baseline — equal-or-stricter than standard.
|
|
38
|
+
agent: {
|
|
39
|
+
...DEFAULT_BACKEND_POLICY,
|
|
40
|
+
maxX402PaymentUsdc: "0.5",
|
|
41
|
+
maxDailyAgentSpendUsdc: "50",
|
|
42
|
+
trustedRecipients: [],
|
|
43
|
+
trustedSpenders: [],
|
|
44
|
+
blockUnlimitedApproval: true,
|
|
45
|
+
requireConfirmationForUnknownContract: true,
|
|
46
|
+
},
|
|
47
|
+
// x402-preflight = payment-intent focused tightening; still read-only.
|
|
48
|
+
"x402-preflight": {
|
|
49
|
+
...DEFAULT_BACKEND_POLICY,
|
|
50
|
+
maxX402PaymentUsdc: "0.1",
|
|
51
|
+
blockUnlimitedApproval: true,
|
|
52
|
+
requireConfirmationForUnknownContract: true,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
export function isPreset(value) {
|
|
56
|
+
return typeof value === "string" && PRESET_NAMES.includes(value);
|
|
57
|
+
}
|
|
58
|
+
export function presetPolicy(name) {
|
|
59
|
+
const p = PRESETS[name];
|
|
60
|
+
return { ...p, trustedRecipients: [...p.trustedRecipients], trustedSpenders: [...p.trustedSpenders] };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* True iff `candidate` is equal-or-stricter than `baseline`: every numeric limit
|
|
64
|
+
* is ≤ baseline, the safety booleans are not weaker, and it adds no extra trusted
|
|
65
|
+
* entries. Used both at load (presets vs `standard`) and at request resolution.
|
|
66
|
+
*/
|
|
67
|
+
export function assertNotWeaker(candidate, baseline) {
|
|
68
|
+
for (const k of NUMERIC_KEYS) {
|
|
69
|
+
if (Number(candidate[k]) > Number(baseline[k]))
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (baseline.blockUnlimitedApproval && !candidate.blockUnlimitedApproval)
|
|
73
|
+
return false;
|
|
74
|
+
if (baseline.requireConfirmationForUnknownContract && !candidate.requireConfirmationForUnknownContract)
|
|
75
|
+
return false;
|
|
76
|
+
if (candidate.trustedRecipients.length > baseline.trustedRecipients.length)
|
|
77
|
+
return false;
|
|
78
|
+
if (candidate.trustedSpenders.length > baseline.trustedSpenders.length)
|
|
79
|
+
return false;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolve the effective preset NAME (tighten-only). Precedence:
|
|
84
|
+
* serverDefault = env (SAFEHANDS_POLICY_PRESET) → endpointDefault → "standard".
|
|
85
|
+
* A request preset is honored only if it is a valid preset that is equal-or-stricter
|
|
86
|
+
* than the server default; otherwise the server default wins (a request can never
|
|
87
|
+
* loosen policy).
|
|
88
|
+
*/
|
|
89
|
+
export function resolvePresetName(requestPreset, endpointDefault = "standard", envPreset) {
|
|
90
|
+
const serverDefault = isPreset(envPreset) ? envPreset : endpointDefault;
|
|
91
|
+
if (isPreset(requestPreset) && assertNotWeaker(PRESETS[requestPreset], PRESETS[serverDefault])) {
|
|
92
|
+
return requestPreset;
|
|
93
|
+
}
|
|
94
|
+
return serverDefault;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Sanitize request-supplied policy overrides onto a server policy: TIGHTEN-ONLY.
|
|
98
|
+
* Numeric limits may only be lowered; safety booleans may only be set toward safer
|
|
99
|
+
* (true); request-supplied trusted lists are IGNORED (server-config only) so public
|
|
100
|
+
* callers can never add an approval/transfer bypass.
|
|
101
|
+
*/
|
|
102
|
+
export function sanitizeRequestPolicy(serverPolicy, overrides) {
|
|
103
|
+
const out = {
|
|
104
|
+
...serverPolicy,
|
|
105
|
+
trustedRecipients: [...serverPolicy.trustedRecipients],
|
|
106
|
+
trustedSpenders: [...serverPolicy.trustedSpenders],
|
|
107
|
+
};
|
|
108
|
+
if (!overrides || typeof overrides !== "object")
|
|
109
|
+
return out;
|
|
110
|
+
const o = overrides;
|
|
111
|
+
for (const k of NUMERIC_KEYS) {
|
|
112
|
+
const raw = o[k];
|
|
113
|
+
const n = Number(raw);
|
|
114
|
+
if (Number.isFinite(n) && n >= 0 && n < Number(out[k])) {
|
|
115
|
+
out[k] = typeof raw === "string" ? raw : String(n);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (o.blockUnlimitedApproval === true)
|
|
119
|
+
out.blockUnlimitedApproval = true;
|
|
120
|
+
if (o.requireConfirmationForUnknownContract === true)
|
|
121
|
+
out.requireConfirmationForUnknownContract = true;
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=policyPresets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policyPresets.js","sourceRoot":"","sources":["../../../src/lib/policy/policyPresets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ToolFailure } from "../toolResponse.js";
|
|
2
|
+
import type { ActionPolicyResult } from "./actionPolicyEngine.js";
|
|
3
|
+
export interface EnforceWriteDecisionOptions {
|
|
4
|
+
/** True when the caller explicitly acknowledged/confirmed this action (e.g. input.confirm === true). */
|
|
5
|
+
confirmed: boolean;
|
|
6
|
+
/** Tool name for the error envelope + telemetry. */
|
|
7
|
+
toolName: string;
|
|
8
|
+
/**
|
|
9
|
+
* Set by write tools whose policy input MUST include risk-engine evidence
|
|
10
|
+
* (execute_swap / send_payment). When true and the evaluated policy carries
|
|
11
|
+
* no `risk_*` check, the gate fails closed — a wiring mistake (assessRisk
|
|
12
|
+
* result not passed to evaluateActionPolicy) blocks loudly instead of
|
|
13
|
+
* silently losing the risk gates.
|
|
14
|
+
*/
|
|
15
|
+
requireRiskEvidence?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns a ToolFailure to short-circuit execution, or `null` to proceed.
|
|
19
|
+
* `policy.decision` is the internal 6-value decision from evaluateActionPolicy
|
|
20
|
+
* (NOT the mapped public 4-value), so all six cases are handled here.
|
|
21
|
+
*/
|
|
22
|
+
export declare function enforceWriteDecision(policy: ActionPolicyResult, opts: EnforceWriteDecisionOptions): ToolFailure | null;
|
|
23
|
+
//# sourceMappingURL=writeExecutionGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeExecutionGate.d.ts","sourceRoot":"","sources":["../../../src/lib/policy/writeExecutionGate.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,WAAW,2BAA2B;IAC1C,wGAAwG;IACxG,SAAS,EAAE,OAAO,CAAC;IACnB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,2BAA2B,GAChC,WAAW,GAAG,IAAI,CA4DpB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// ─── SafeHands Write-Execution Gate ────────────────────────────────────
|
|
2
|
+
// Enforces the FULL deterministic decision at the direct write-tool boundary.
|
|
3
|
+
//
|
|
4
|
+
// Historically the raw write tools (execute_swap / send_payment / approve_token /
|
|
5
|
+
// x402_pay_and_fetch) only halted on `BLOCK` and silently signed on every other
|
|
6
|
+
// non-ALLOW decision — so a REQUIRE_CONFIRMATION / REQUIRE_TOKEN_REVIEW action
|
|
7
|
+
// (unverified recipient, unknown/flagged token) was auto-executed. That defeated
|
|
8
|
+
// the core SafeHands promise ("one of four decisions before every action").
|
|
9
|
+
//
|
|
10
|
+
// This gate makes the raw tools honor the whole decision:
|
|
11
|
+
// • ALLOW → proceed.
|
|
12
|
+
// • BLOCK → hard stop (never confirmable).
|
|
13
|
+
// • REQUIRE_FUNDING → hard stop (fund first; not a confirmable risk).
|
|
14
|
+
// • REQUIRE_CONFIRMATION → proceed ONLY if the caller passed an explicit
|
|
15
|
+
// REQUIRE_TOKEN_REVIEW / confirmation (`confirmed`); otherwise return a
|
|
16
|
+
// WARN non-executing CONFIRMATION_REQUIRED with the
|
|
17
|
+
// reasons, so the confirmation is explicit + audited
|
|
18
|
+
// instead of silent.
|
|
19
|
+
// Honeypot/malicious tokens are turned into a hard BLOCK upstream (in the tool,
|
|
20
|
+
// before this gate) while GoPlus token intel is available. When intel is MISSING
|
|
21
|
+
// (provider outage / token not indexed / unresolvable address), the policy emits
|
|
22
|
+
// the `token_security_intel_missing` check and this gate fails closed:
|
|
23
|
+
// a caller confirmation cannot substitute for intel that never existed, so the
|
|
24
|
+
// action stops with TOKEN_INTEL_UNAVAILABLE even with confirm=true. Only tokens
|
|
25
|
+
// GoPlus actually reviewed-and-flagged remain confirmable after review.
|
|
26
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
27
|
+
import { fail } from "../toolResponse.js";
|
|
28
|
+
/**
|
|
29
|
+
* Returns a ToolFailure to short-circuit execution, or `null` to proceed.
|
|
30
|
+
* `policy.decision` is the internal 6-value decision from evaluateActionPolicy
|
|
31
|
+
* (NOT the mapped public 4-value), so all six cases are handled here.
|
|
32
|
+
*/
|
|
33
|
+
export function enforceWriteDecision(policy, opts) {
|
|
34
|
+
const reasons = policy.reasons.join(" ").trim();
|
|
35
|
+
const actions = policy.requiredActions.join(" ").trim();
|
|
36
|
+
if (opts.requireRiskEvidence && !policy.checks.some((c) => c.name.startsWith("risk_"))) {
|
|
37
|
+
return fail("POLICY_EVIDENCE_MISSING", `${opts.toolName} is blocked fail-closed: the policy decision was evaluated WITHOUT risk-engine evidence (no risk_* check present). This indicates a wiring defect: the assessRisk result must be passed to evaluateActionPolicy via riskEvidenceFromAssessment(). Not confirmable.`, false, opts.toolName);
|
|
38
|
+
}
|
|
39
|
+
switch (policy.decision) {
|
|
40
|
+
case "ALLOW":
|
|
41
|
+
return null;
|
|
42
|
+
case "BLOCK":
|
|
43
|
+
return fail("POLICY_BLOCKED", reasons || `${opts.toolName} was blocked by SafeHands policy.`, false, opts.toolName);
|
|
44
|
+
case "REQUIRE_FUNDING":
|
|
45
|
+
return fail("REQUIRE_FUNDING", `${opts.toolName} requires funding before execution. ${reasons} ${actions}`.replace(/\s+/g, " ").trim(), false, opts.toolName);
|
|
46
|
+
case "REQUIRE_CONFIRMATION":
|
|
47
|
+
case "REQUIRE_TOKEN_REVIEW":
|
|
48
|
+
case "WARN":
|
|
49
|
+
default:
|
|
50
|
+
// Fail-closed: when token-security intel is MISSING (not merely flagged),
|
|
51
|
+
// nothing was reviewed — a caller confirmation cannot attest to a review that
|
|
52
|
+
// never happened. Hard stop, never confirmable on the direct write path.
|
|
53
|
+
if (policy.checks.some((c) => c.name === "token_security_intel_missing" && c.status === "unknown")) {
|
|
54
|
+
return fail("TOKEN_INTEL_UNAVAILABLE", `${opts.toolName} is blocked fail-closed: token-security intelligence is unavailable for this token (provider outage or token not yet indexed), so nothing was actually reviewed. Retry when the provider is reachable, or verify the token independently. ${reasons}`
|
|
55
|
+
.replace(/\s+/g, " ")
|
|
56
|
+
.trim(), true, opts.toolName);
|
|
57
|
+
}
|
|
58
|
+
if (opts.confirmed)
|
|
59
|
+
return null;
|
|
60
|
+
return fail("CONFIRMATION_REQUIRED", `${opts.toolName} needs explicit confirmation before signing (decision: ${policy.decision}). ${reasons} ${actions} Re-invoke with confirm=true only after reviewing and approving this action.`
|
|
61
|
+
.replace(/\s+/g, " ")
|
|
62
|
+
.trim(), false, opts.toolName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=writeExecutionGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeExecutionGate.js","sourceRoot":"","sources":["../../../src/lib/policy/writeExecutionGate.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,EAAE;AACF,kFAAkF;AAClF,gFAAgF;AAChF,+EAA+E;AAC/E,iFAAiF;AACjF,4EAA4E;AAC5E,EAAE;AACF,0DAA0D;AAC1D,uCAAuC;AACvC,6DAA6D;AAC7D,8EAA8E;AAC9E,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AAC5E,kFAAkF;AAClF,kDAAkD;AAClD,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,uEAAuE;AACvE,+EAA+E;AAC/E,gFAAgF;AAChF,wEAAwE;AACxE,2EAA2E;AAE3E,OAAO,EAAE,IAAI,EAAoB,MAAM,oBAAoB,CAAC;AAkB5D;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAA0B,EAC1B,IAAiC;IAEjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAExD,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvF,OAAO,IAAI,CACT,yBAAyB,EACzB,GAAG,IAAI,CAAC,QAAQ,oQAAoQ,EACpR,KAAK,EACL,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAED,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,IAAI,CAAC;QAEd,KAAK,OAAO;YACV,OAAO,IAAI,CACT,gBAAgB,EAChB,OAAO,IAAI,GAAG,IAAI,CAAC,QAAQ,mCAAmC,EAC9D,KAAK,EACL,IAAI,CAAC,QAAQ,CACd,CAAC;QAEJ,KAAK,iBAAiB;YACpB,OAAO,IAAI,CACT,iBAAiB,EACjB,GAAG,IAAI,CAAC,QAAQ,uCAAuC,OAAO,IAAI,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EACvG,KAAK,EACL,IAAI,CAAC,QAAQ,CACd,CAAC;QAEJ,KAAK,sBAAsB,CAAC;QAC5B,KAAK,sBAAsB,CAAC;QAC5B,KAAK,MAAM,CAAC;QACZ;YACE,0EAA0E;YAC1E,8EAA8E;YAC9E,yEAAyE;YACzE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,8BAA8B,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;gBACnG,OAAO,IAAI,CACT,yBAAyB,EACzB,GAAG,IAAI,CAAC,QAAQ,6OAA6O,OAAO,EAAE;qBACnQ,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;qBACpB,IAAI,EAAE,EACT,IAAI,EACJ,IAAI,CAAC,QAAQ,CACd,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,IAAI,CACT,uBAAuB,EACvB,GAAG,IAAI,CAAC,QAAQ,0DAA0D,MAAM,CAAC,QAAQ,MAAM,OAAO,IAAI,OAAO,8EAA8E;iBAC5L,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;iBACpB,IAAI,EAAE,EACT,KAAK,EACL,IAAI,CAAC,QAAQ,CACd,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface PreparedTransactionRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
hash: string;
|
|
4
|
+
from: string;
|
|
5
|
+
to: string;
|
|
6
|
+
dataHash: string;
|
|
7
|
+
value: string;
|
|
8
|
+
chainId: number;
|
|
9
|
+
decision: string;
|
|
10
|
+
policyVersion: string | null;
|
|
11
|
+
policyPreset: string | null;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
usedAt: number | null;
|
|
14
|
+
createdAt?: number;
|
|
15
|
+
updatedAt?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function generatePreparedTransactionHash(from: string, to: string, data: string, value: string, chainId: number, decision: string): string;
|
|
18
|
+
export declare function savePreparedTx(from: string, to: string, data: string, value: string, chainId: number, decision: string, policyVersion: string | null, policyPreset: string | null): PreparedTransactionRecord;
|
|
19
|
+
export declare function getPreparedTx(id: string): PreparedTransactionRecord | null;
|
|
20
|
+
export declare function markPreparedTxUsed(id: string): void;
|
|
21
|
+
//# sourceMappingURL=preparedTxStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparedTxStore.d.ts","sourceRoot":"","sources":["../../src/lib/preparedTxStore.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgDD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,yBAAyB,CA2B3B;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,yBAAyB,GAAG,IAAI,CAM1E;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CASnD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { keccak256, stringToHex } from "viem";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { readJsonFile, stateFile, writeJsonFileAtomic } from "./persistentJsonStore.js";
|
|
4
|
+
const STORE_PATH = stateFile("prepared_transactions.json", "SAFEHANDS_PREPARED_TX_STORE_PATH");
|
|
5
|
+
const EXPIRATION_MS = Number(process.env.SAFEHANDS_PREPARED_TX_TTL_MS || 60 * 60 * 1000);
|
|
6
|
+
let state = loadState();
|
|
7
|
+
function loadState() {
|
|
8
|
+
const loaded = readJsonFile(STORE_PATH, { records: {} });
|
|
9
|
+
cleanupExpired(loaded, Date.now(), false);
|
|
10
|
+
return loaded;
|
|
11
|
+
}
|
|
12
|
+
function persist() {
|
|
13
|
+
writeJsonFileAtomic(STORE_PATH, state);
|
|
14
|
+
}
|
|
15
|
+
function cleanupExpired(target = state, now = Date.now(), shouldPersist = true) {
|
|
16
|
+
let changed = false;
|
|
17
|
+
for (const [id, record] of Object.entries(target.records)) {
|
|
18
|
+
if (record.expiresAt < now) {
|
|
19
|
+
delete target.records[id];
|
|
20
|
+
changed = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (changed && shouldPersist)
|
|
24
|
+
persist();
|
|
25
|
+
}
|
|
26
|
+
// Bound the store so an anonymous flood of /wallet/prepare writes cannot grow
|
|
27
|
+
// it without limit between TTL sweeps. Evicts oldest-created first. (Public-scale
|
|
28
|
+
// deployments should back this with Redis/Postgres rather than a JSON file.)
|
|
29
|
+
const MAX_PREPARED_TX_RECORDS = Number(process.env.SAFEHANDS_PREPARED_TX_MAX || 5000);
|
|
30
|
+
function enforceStoreCap() {
|
|
31
|
+
const ids = Object.keys(state.records);
|
|
32
|
+
if (ids.length <= MAX_PREPARED_TX_RECORDS)
|
|
33
|
+
return;
|
|
34
|
+
const excess = ids.length - MAX_PREPARED_TX_RECORDS;
|
|
35
|
+
const oldest = ids
|
|
36
|
+
.map((id) => ({ id, createdAt: state.records[id].createdAt ?? 0 }))
|
|
37
|
+
.sort((a, b) => a.createdAt - b.createdAt)
|
|
38
|
+
.slice(0, excess);
|
|
39
|
+
for (const { id } of oldest)
|
|
40
|
+
delete state.records[id];
|
|
41
|
+
}
|
|
42
|
+
export function generatePreparedTransactionHash(from, to, data, value, chainId, decision) {
|
|
43
|
+
const payload = `${from.toLowerCase()}:${to.toLowerCase()}:${data.toLowerCase()}:${value}:${chainId}:${decision}`;
|
|
44
|
+
return keccak256(stringToHex(payload));
|
|
45
|
+
}
|
|
46
|
+
export function savePreparedTx(from, to, data, value, chainId, decision, policyVersion, policyPreset) {
|
|
47
|
+
cleanupExpired();
|
|
48
|
+
const id = randomUUID();
|
|
49
|
+
const hash = generatePreparedTransactionHash(from, to, data, value, chainId, decision);
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const record = {
|
|
52
|
+
id,
|
|
53
|
+
hash,
|
|
54
|
+
from: from.toLowerCase(),
|
|
55
|
+
to: to.toLowerCase(),
|
|
56
|
+
dataHash: keccak256(data),
|
|
57
|
+
value,
|
|
58
|
+
chainId,
|
|
59
|
+
decision,
|
|
60
|
+
policyVersion,
|
|
61
|
+
policyPreset,
|
|
62
|
+
expiresAt: now + EXPIRATION_MS,
|
|
63
|
+
usedAt: null,
|
|
64
|
+
createdAt: now,
|
|
65
|
+
updatedAt: now,
|
|
66
|
+
};
|
|
67
|
+
state.records[id] = record;
|
|
68
|
+
enforceStoreCap();
|
|
69
|
+
persist();
|
|
70
|
+
return record;
|
|
71
|
+
}
|
|
72
|
+
export function getPreparedTx(id) {
|
|
73
|
+
// Reload on read so a restarted process or another single-node lifecycle write
|
|
74
|
+
// is visible without requiring a full application restart.
|
|
75
|
+
state = loadState();
|
|
76
|
+
const record = state.records[id];
|
|
77
|
+
return record ?? null;
|
|
78
|
+
}
|
|
79
|
+
export function markPreparedTxUsed(id) {
|
|
80
|
+
state = loadState();
|
|
81
|
+
const record = state.records[id];
|
|
82
|
+
if (record && !record.usedAt) {
|
|
83
|
+
const now = Date.now();
|
|
84
|
+
record.usedAt = now;
|
|
85
|
+
record.updatedAt = now;
|
|
86
|
+
persist();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
setInterval(() => cleanupExpired(), 5 * 60 * 1000).unref();
|
|
90
|
+
//# sourceMappingURL=preparedTxStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparedTxStore.js","sourceRoot":"","sources":["../../src/lib/preparedTxStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ContractReader, PriceFeedConfig, PriceProvider, ProviderQuote } from "./types.js";
|
|
2
|
+
export declare const CHAINLINK_PUSH_FEED_ABI: readonly [{
|
|
3
|
+
readonly name: "latestAnswer";
|
|
4
|
+
readonly type: "function";
|
|
5
|
+
readonly stateMutability: "view";
|
|
6
|
+
readonly inputs: readonly [];
|
|
7
|
+
readonly outputs: readonly [{
|
|
8
|
+
readonly type: "int256";
|
|
9
|
+
}];
|
|
10
|
+
}, {
|
|
11
|
+
readonly name: "latestTimestamp";
|
|
12
|
+
readonly type: "function";
|
|
13
|
+
readonly stateMutability: "view";
|
|
14
|
+
readonly inputs: readonly [];
|
|
15
|
+
readonly outputs: readonly [{
|
|
16
|
+
readonly type: "uint256";
|
|
17
|
+
}];
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "getFeedId";
|
|
20
|
+
readonly type: "function";
|
|
21
|
+
readonly stateMutability: "view";
|
|
22
|
+
readonly inputs: readonly [];
|
|
23
|
+
readonly outputs: readonly [{
|
|
24
|
+
readonly type: "bytes32";
|
|
25
|
+
}];
|
|
26
|
+
}];
|
|
27
|
+
export declare class ChainlinkPushProvider implements PriceProvider {
|
|
28
|
+
readonly kind: "chainlink-push";
|
|
29
|
+
readonly label = "Chainlink Push Engine feed on Pharos";
|
|
30
|
+
private readonly reader;
|
|
31
|
+
constructor(reader?: ContractReader);
|
|
32
|
+
fetchQuote(feed: PriceFeedConfig): Promise<ProviderQuote>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=chainlinkPushProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainlinkPushProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/price/chainlinkPushProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAMlC,CAAC;AAEH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAC1C,QAAQ,CAAC,KAAK,0CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,CAAC,EAAE,cAAc;IAI7B,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;CAchE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// ─── Chainlink Push Engine Provider ────────────────────────────────────
|
|
2
|
+
// Reads latestAnswer/latestTimestamp live from Chainlink Push Engine feed
|
|
3
|
+
// contracts on Pharos via viem eth_call.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { parseAbi } from "viem";
|
|
6
|
+
import { publicClient } from "../pharosClient.js";
|
|
7
|
+
export const CHAINLINK_PUSH_FEED_ABI = parseAbi([
|
|
8
|
+
"function latestAnswer() view returns (int256)",
|
|
9
|
+
"function latestTimestamp() view returns (uint256)",
|
|
10
|
+
// Declared for verification tooling only — never called per price request;
|
|
11
|
+
// feed identity is static registry config.
|
|
12
|
+
"function getFeedId() view returns (bytes32)",
|
|
13
|
+
]);
|
|
14
|
+
export class ChainlinkPushProvider {
|
|
15
|
+
kind = "chainlink-push";
|
|
16
|
+
label = "Chainlink Push Engine feed on Pharos";
|
|
17
|
+
reader;
|
|
18
|
+
constructor(reader) {
|
|
19
|
+
this.reader = reader ?? publicClient;
|
|
20
|
+
}
|
|
21
|
+
async fetchQuote(feed) {
|
|
22
|
+
// Sequential on purpose: the public Pharos RPC rate-limits parallel eth_call bursts.
|
|
23
|
+
const answer = (await this.reader.readContract({
|
|
24
|
+
address: feed.feedAddress,
|
|
25
|
+
abi: CHAINLINK_PUSH_FEED_ABI,
|
|
26
|
+
functionName: "latestAnswer",
|
|
27
|
+
}));
|
|
28
|
+
const updatedAt = (await this.reader.readContract({
|
|
29
|
+
address: feed.feedAddress,
|
|
30
|
+
abi: CHAINLINK_PUSH_FEED_ABI,
|
|
31
|
+
functionName: "latestTimestamp",
|
|
32
|
+
}));
|
|
33
|
+
return { answer, updatedAtUnix: Number(updatedAt) };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=chainlinkPushProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainlinkPushProvider.js","sourceRoot":"","sources":["../../../src/lib/price/chainlinkPushProvider.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,yCAAyC;AACzC,2EAA2E;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC9C,+CAA+C;IAC/C,mDAAmD;IACnD,2EAA2E;IAC3E,2CAA2C;IAC3C,6CAA6C;CAC9C,CAAC,CAAC;AAEH,MAAM,OAAO,qBAAqB;IACvB,IAAI,GAAG,gBAAyB,CAAC;IACjC,KAAK,GAAG,sCAAsC,CAAC;IACvC,MAAM,CAAiB;IAExC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAK,YAA0C,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB;QACpC,qFAAqF;QACrF,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,uBAAuB;YAC5B,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAW,CAAC;QACd,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,uBAAuB;YAC5B,YAAY,EAAE,iBAAiB;SAChC,CAAC,CAAW,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PriceFeedConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pacific Mainnet (1672) Chainlink Push Engine feeds — derived from the
|
|
4
|
+
* canonical ecosystem registry (src/data/ecosystemRegistry.data.ts) so the
|
|
5
|
+
* price resolver and the Anvita hosted-skill assets share one feed set.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PACIFIC_MAINNET_PRICE_FEEDS: Record<string, PriceFeedConfig>;
|
|
8
|
+
/** No published Push Engine feed addresses for Atlantic testnet — fail closed. */
|
|
9
|
+
export declare const ATLANTIC_TESTNET_PRICE_FEEDS: Record<string, PriceFeedConfig>;
|
|
10
|
+
/**
|
|
11
|
+
* Wrapped/native aliases → canonical feed key. WBTC is NOT aliased to BTC:
|
|
12
|
+
* a dedicated WBTC/USD feed exists on Pacific Mainnet.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PRICE_FEED_ALIASES: Record<string, string>;
|
|
15
|
+
export declare function activePriceFeeds(): Record<string, PriceFeedConfig>;
|
|
16
|
+
export interface FeedLookup {
|
|
17
|
+
requested: string;
|
|
18
|
+
canonical: string;
|
|
19
|
+
aliased: boolean;
|
|
20
|
+
feed: PriceFeedConfig;
|
|
21
|
+
}
|
|
22
|
+
/** Case-insensitive symbol → feed lookup with alias mapping; null if not configured for the active network. */
|
|
23
|
+
export declare function resolveFeedSymbol(symbol: string): FeedLookup | null;
|
|
24
|
+
/** Symbols the active network can price (canonical feeds + configured aliases). */
|
|
25
|
+
export declare function pricedSymbolsForActiveNetwork(): string[];
|
|
26
|
+
//# sourceMappingURL=feedRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedRegistry.d.ts","sourceRoot":"","sources":["../../../src/lib/price/feedRegistry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAiBlD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAOpE,CAAC;AAEL,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,CAAC;AAEhF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAElE;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAMnE;AAED,mFAAmF;AACnF,wBAAgB,6BAA6B,IAAI,MAAM,EAAE,CAMxD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// ─── Price Feed Registry ───────────────────────────────────────────────
|
|
2
|
+
// Network-keyed oracle feed configuration. Feed addresses/decimals/heartbeats
|
|
3
|
+
// are static config; prices are ALWAYS read live from the feed contracts.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { getActiveNetwork } from "../networks.js";
|
|
6
|
+
import { ECOSYSTEM_REGISTRY_ITEMS } from "../../data/ecosystemRegistry.data.js";
|
|
7
|
+
const CHAINLINK_PUSH_DOCS = "Chainlink Push Engine Feeds on Pharos Pacific Mainnet (docs.pharos.xyz)";
|
|
8
|
+
function pushFeed(base, feedAddress) {
|
|
9
|
+
return {
|
|
10
|
+
pair: `${base}/USD`,
|
|
11
|
+
base,
|
|
12
|
+
quote: "USD",
|
|
13
|
+
feedAddress,
|
|
14
|
+
decimals: 18,
|
|
15
|
+
heartbeatSeconds: 3600,
|
|
16
|
+
provider: "chainlink-push",
|
|
17
|
+
docsSource: CHAINLINK_PUSH_DOCS,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Pacific Mainnet (1672) Chainlink Push Engine feeds — derived from the
|
|
22
|
+
* canonical ecosystem registry (src/data/ecosystemRegistry.data.ts) so the
|
|
23
|
+
* price resolver and the Anvita hosted-skill assets share one feed set.
|
|
24
|
+
*/
|
|
25
|
+
export const PACIFIC_MAINNET_PRICE_FEEDS = (() => {
|
|
26
|
+
const item = ECOSYSTEM_REGISTRY_ITEMS.find((i) => i.id === "oracle:pacific-mainnet:chainlink-push-feeds");
|
|
27
|
+
const feeds = {};
|
|
28
|
+
for (const c of item?.contracts ?? []) {
|
|
29
|
+
if (c.symbol)
|
|
30
|
+
feeds[c.symbol] = pushFeed(c.symbol, c.address);
|
|
31
|
+
}
|
|
32
|
+
return feeds;
|
|
33
|
+
})();
|
|
34
|
+
/** No published Push Engine feed addresses for Atlantic testnet — fail closed. */
|
|
35
|
+
export const ATLANTIC_TESTNET_PRICE_FEEDS = {};
|
|
36
|
+
/**
|
|
37
|
+
* Wrapped/native aliases → canonical feed key. WBTC is NOT aliased to BTC:
|
|
38
|
+
* a dedicated WBTC/USD feed exists on Pacific Mainnet.
|
|
39
|
+
*/
|
|
40
|
+
export const PRICE_FEED_ALIASES = {
|
|
41
|
+
WPROS: "PROS",
|
|
42
|
+
WETH: "ETH",
|
|
43
|
+
// Pharos is the network/ecosystem; PROS is the token. Priced via the PROS/USD
|
|
44
|
+
// feed. Matches supported-assets.json + the Anvita engine.
|
|
45
|
+
PHAROS: "PROS",
|
|
46
|
+
};
|
|
47
|
+
export function activePriceFeeds() {
|
|
48
|
+
return getActiveNetwork().isMainnet ? PACIFIC_MAINNET_PRICE_FEEDS : ATLANTIC_TESTNET_PRICE_FEEDS;
|
|
49
|
+
}
|
|
50
|
+
/** Case-insensitive symbol → feed lookup with alias mapping; null if not configured for the active network. */
|
|
51
|
+
export function resolveFeedSymbol(symbol) {
|
|
52
|
+
const requested = symbol.trim().toUpperCase();
|
|
53
|
+
const canonical = PRICE_FEED_ALIASES[requested] ?? requested;
|
|
54
|
+
const feed = activePriceFeeds()[canonical];
|
|
55
|
+
if (!feed)
|
|
56
|
+
return null;
|
|
57
|
+
return { requested, canonical, aliased: canonical !== requested, feed };
|
|
58
|
+
}
|
|
59
|
+
/** Symbols the active network can price (canonical feeds + configured aliases). */
|
|
60
|
+
export function pricedSymbolsForActiveNetwork() {
|
|
61
|
+
const canonical = Object.keys(activePriceFeeds());
|
|
62
|
+
const aliases = Object.entries(PRICE_FEED_ALIASES)
|
|
63
|
+
.filter(([, target]) => canonical.includes(target))
|
|
64
|
+
.map(([alias]) => alias);
|
|
65
|
+
return [...canonical, ...aliases].sort();
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=feedRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedRegistry.js","sourceRoot":"","sources":["../../../src/lib/price/feedRegistry.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,MAAM,mBAAmB,GAAG,yEAAyE,CAAC;AAEtG,SAAS,QAAQ,CAAC,IAAY,EAAE,WAA0B;IACxD,OAAO;QACL,IAAI,EAAE,GAAG,IAAI,MAAM;QACnB,IAAI;QACJ,KAAK,EAAE,KAAK;QACZ,WAAW;QACX,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,gBAAgB;QAC1B,UAAU,EAAE,mBAAmB;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAoC,CAAC,GAAG,EAAE;IAChF,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,6CAA6C,CAAC,CAAC;IAC1G,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM;YAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,EAAE,CAAC;AAEL,kFAAkF;AAClF,MAAM,CAAC,MAAM,4BAA4B,GAAoC,EAAE,CAAC;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,KAAK;IACX,8EAA8E;IAC9E,2DAA2D;IAC3D,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,4BAA4B,CAAC;AACnG,CAAC;AASD,+GAA+G;AAC/G,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,6BAA6B;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PriceFeedProviderKind, PriceProvider, PriceResolverResult } from "./types.js";
|
|
2
|
+
export declare const PRICE_CACHE_TTL_MS = 45000;
|
|
3
|
+
export declare const DEGRADED_CACHE_MAX_AGE_MS = 300000;
|
|
4
|
+
export interface ResolvePriceOptions {
|
|
5
|
+
cacheTtlMs?: number;
|
|
6
|
+
/** Set false to disable rpc_degraded_cache serves and strictly fail on RPC errors. */
|
|
7
|
+
allowDegradedCache?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class PriceResolver {
|
|
10
|
+
private readonly providers;
|
|
11
|
+
private readonly now;
|
|
12
|
+
private readonly cache;
|
|
13
|
+
private readonly inflight;
|
|
14
|
+
constructor(providers: Partial<Record<PriceFeedProviderKind, PriceProvider>>, now?: () => number);
|
|
15
|
+
clearCache(): void;
|
|
16
|
+
resolvePriceUsd(symbol: string, opts?: ResolvePriceOptions): Promise<PriceResolverResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Serve a cached resolution if it is within maxAgeMs AND the original oracle
|
|
19
|
+
* timestamp is still within the feed heartbeat. Returns null otherwise.
|
|
20
|
+
*/
|
|
21
|
+
private serveFromCache;
|
|
22
|
+
private fetchLive;
|
|
23
|
+
private invalid;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Process-wide singleton wired to the live publicClient. Only implemented
|
|
27
|
+
* providers are registered — the Supra pull provider is a stub
|
|
28
|
+
* (src/lib/price/supraProvider.ts) and is deliberately NOT registered; a feed
|
|
29
|
+
* configured for "supra-pull" fails closed with a structured
|
|
30
|
+
* PRICE_SOURCE_UNAVAILABLE ("no provider registered") instead of advertising an
|
|
31
|
+
* unimplemented source.
|
|
32
|
+
*/
|
|
33
|
+
export declare const priceResolver: PriceResolver;
|
|
34
|
+
export declare function resolvePriceUsd(symbol: string, opts?: ResolvePriceOptions): Promise<PriceResolverResult>;
|
|
35
|
+
//# sourceMappingURL=priceResolver.d.ts.map
|