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,252 @@
|
|
|
1
|
+
// ─── L1 Merkle inclusion read-path ─────────────────────────────────────
|
|
2
|
+
// The keyless consumer that closes the L1 on-chain-memory loop. commitRiskRoot
|
|
3
|
+
// publishes a Merkle root (on-chain) + a data-availability pointer to the batch
|
|
4
|
+
// JSON (off-chain). This module reads that root, fetches the batch, and proves a
|
|
5
|
+
// single risk record is included — both locally and, for trustlessness, through
|
|
6
|
+
// the contract's own verifyRiskRecord view. No private key is ever touched: this
|
|
7
|
+
// is a pure read/verify path, safe for the zero-custody public profile.
|
|
8
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
9
|
+
import { isAddress, keccak256 } from "viem";
|
|
10
|
+
import { MerkleTree } from "merkletreejs";
|
|
11
|
+
import { publicClient } from "./pharosClient.js";
|
|
12
|
+
import { fetchWithTimeoutAndRetry } from "./http.js";
|
|
13
|
+
import { buildMerkleTree, computeRiskLeaf } from "./merkleBatcher.js";
|
|
14
|
+
import { SAFEHANDS_REGISTRY_ADDRESS, SAFEHANDS_REGISTRY_ABI } from "./constants.js";
|
|
15
|
+
const ZERO_ROOT = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
16
|
+
function registryAddress() {
|
|
17
|
+
return SAFEHANDS_REGISTRY_ADDRESS && isAddress(SAFEHANDS_REGISTRY_ADDRESS)
|
|
18
|
+
? SAFEHANDS_REGISTRY_ADDRESS
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
/** Coerce expiresAt from any serialized form ("123n" suffixed, numeric string, number, bigint). */
|
|
22
|
+
function toBigInt(value) {
|
|
23
|
+
if (typeof value === "bigint")
|
|
24
|
+
return value;
|
|
25
|
+
if (typeof value === "number")
|
|
26
|
+
return BigInt(Math.trunc(value));
|
|
27
|
+
if (typeof value === "string") {
|
|
28
|
+
const trimmed = value.trim();
|
|
29
|
+
const digits = /n$/.test(trimmed) ? trimmed.slice(0, -1) : trimmed;
|
|
30
|
+
if (/^\d+$/.test(digits))
|
|
31
|
+
return BigInt(digits);
|
|
32
|
+
}
|
|
33
|
+
return 0n;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Normalize the DA batch JSON into typed RiskRecordInput[]. The writer may
|
|
37
|
+
* serialize expiresAt as a bigint-tagged string or a plain number, so we coerce
|
|
38
|
+
* defensively rather than trusting a single encoding.
|
|
39
|
+
*/
|
|
40
|
+
export function normalizeRiskRecords(raw) {
|
|
41
|
+
if (!Array.isArray(raw))
|
|
42
|
+
return [];
|
|
43
|
+
return raw
|
|
44
|
+
.filter((r) => r && typeof r === "object")
|
|
45
|
+
.map((r) => ({
|
|
46
|
+
target: String(r.target ?? ""),
|
|
47
|
+
actionHash: String(r.actionHash ?? ""),
|
|
48
|
+
score: Number(r.score ?? 0),
|
|
49
|
+
level: Number(r.level ?? 0),
|
|
50
|
+
recommendation: Number(r.recommendation ?? 0),
|
|
51
|
+
policyVersionHash: String(r.policyVersionHash ?? ""),
|
|
52
|
+
evidenceHash: String(r.evidenceHash ?? ""),
|
|
53
|
+
expiresAt: toBigInt(r.expiresAt),
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Pure inclusion proof: find the record matching `match` in `records`, rebuild
|
|
58
|
+
* the tree, and produce the Merkle proof for its leaf. No network, no chain —
|
|
59
|
+
* fully unit-testable. Returns null when no record matches.
|
|
60
|
+
*/
|
|
61
|
+
export function proveInclusion(records, match) {
|
|
62
|
+
const target = match.target.toLowerCase();
|
|
63
|
+
const actionHash = match.actionHash?.toLowerCase();
|
|
64
|
+
const record = records.find((r) => r.target.toLowerCase() === target &&
|
|
65
|
+
(actionHash === undefined || r.actionHash.toLowerCase() === actionHash));
|
|
66
|
+
if (!record)
|
|
67
|
+
return null;
|
|
68
|
+
const tree = buildMerkleTree(records);
|
|
69
|
+
const leaf = computeRiskLeaf(record);
|
|
70
|
+
const proof = tree.getHexProof(leaf);
|
|
71
|
+
const computedRoot = tree.getHexRoot();
|
|
72
|
+
const verifiedLocal = MerkleTree.verify(proof, leaf, computedRoot, keccak256, { sortPairs: true });
|
|
73
|
+
return { record, leaf, proof, computedRoot, verifiedLocal };
|
|
74
|
+
}
|
|
75
|
+
function neutral(partial) {
|
|
76
|
+
return {
|
|
77
|
+
configured: false,
|
|
78
|
+
committed: false,
|
|
79
|
+
onchainMerkleRoot: null,
|
|
80
|
+
dataURI: null,
|
|
81
|
+
found: false,
|
|
82
|
+
rootMatches: false,
|
|
83
|
+
verifiedLocal: false,
|
|
84
|
+
verifiedOnchain: null,
|
|
85
|
+
expired: false,
|
|
86
|
+
proof: null,
|
|
87
|
+
record: null,
|
|
88
|
+
source: "unconfigured",
|
|
89
|
+
...partial,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function fetchBatch(dataURI) {
|
|
93
|
+
if (!/^https?:\/\//i.test(dataURI)) {
|
|
94
|
+
throw new Error(`Unsupported data-availability URI scheme: ${dataURI}. Only http(s) batch pointers are resolvable by this read-path.`);
|
|
95
|
+
}
|
|
96
|
+
// dataURI is operator-controlled (read from chain), so fetch through the
|
|
97
|
+
// SSRF-guarded layer (DNS-pinned lookup, blocked internal ranges, redirect
|
|
98
|
+
// re-validation) — a malicious/compromised operator must not be able to point
|
|
99
|
+
// this read-path at internal endpoints. The Merkle-root comparison downstream
|
|
100
|
+
// already detects content tampering; this guards the request itself.
|
|
101
|
+
const res = await fetchWithTimeoutAndRetry(dataURI, { timeoutMs: 10_000, retries: 0 });
|
|
102
|
+
if (!res.ok)
|
|
103
|
+
throw new Error(`DA fetch failed: HTTP ${res.status} for ${dataURI}`);
|
|
104
|
+
return res.json();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* End-to-end keyless inclusion check for a target's risk record against the
|
|
108
|
+
* currently committed on-chain Merkle root. Fail-closed and neutral on every
|
|
109
|
+
* missing precondition (unconfigured, uncommitted, unreachable DA, not found).
|
|
110
|
+
* When `verifyOnchain` is true (default) it additionally calls the contract's
|
|
111
|
+
* verifyRiskRecord view so the "yes, this verdict is in the on-chain root" claim
|
|
112
|
+
* is proven trustlessly rather than only in-process.
|
|
113
|
+
*/
|
|
114
|
+
export async function verifyRiskInclusion(match, opts = {}) {
|
|
115
|
+
// An explicit registryAddress override (incl. "") lets callers/tests exercise the
|
|
116
|
+
// fail-closed branch deterministically without touching env or the network.
|
|
117
|
+
const address = opts.registryAddress !== undefined
|
|
118
|
+
? (opts.registryAddress && isAddress(opts.registryAddress) ? opts.registryAddress : null)
|
|
119
|
+
: registryAddress();
|
|
120
|
+
if (!address) {
|
|
121
|
+
return neutral({ source: "unconfigured", error: "SAFEHANDS_REGISTRY_ADDRESS not configured." });
|
|
122
|
+
}
|
|
123
|
+
let onchainMerkleRoot;
|
|
124
|
+
let dataURI;
|
|
125
|
+
try {
|
|
126
|
+
[onchainMerkleRoot, dataURI] = (await Promise.all([
|
|
127
|
+
publicClient.readContract({ address, abi: SAFEHANDS_REGISTRY_ABI, functionName: "currentMerkleRoot", args: [] }),
|
|
128
|
+
publicClient.readContract({ address, abi: SAFEHANDS_REGISTRY_ABI, functionName: "currentDataURI", args: [] }),
|
|
129
|
+
]));
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
return neutral({ configured: true, source: "error", error: `Registry read failed: ${err.message}` });
|
|
133
|
+
}
|
|
134
|
+
if (!onchainMerkleRoot || onchainMerkleRoot === ZERO_ROOT) {
|
|
135
|
+
return neutral({ configured: true, onchainMerkleRoot, dataURI, source: "not-committed" });
|
|
136
|
+
}
|
|
137
|
+
let records;
|
|
138
|
+
try {
|
|
139
|
+
records = normalizeRiskRecords(await fetchBatch(dataURI));
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return neutral({
|
|
143
|
+
configured: true,
|
|
144
|
+
committed: true,
|
|
145
|
+
onchainMerkleRoot,
|
|
146
|
+
dataURI,
|
|
147
|
+
source: "error",
|
|
148
|
+
error: err.message,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const proven = proveInclusion(records, match);
|
|
152
|
+
if (!proven) {
|
|
153
|
+
return neutral({
|
|
154
|
+
configured: true,
|
|
155
|
+
committed: true,
|
|
156
|
+
onchainMerkleRoot,
|
|
157
|
+
dataURI,
|
|
158
|
+
source: "not-found",
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const rootMatches = proven.computedRoot.toLowerCase() === onchainMerkleRoot.toLowerCase();
|
|
162
|
+
const now = BigInt(Math.floor(Date.now() / 1000));
|
|
163
|
+
const expired = proven.record.expiresAt !== 0n && proven.record.expiresAt < now;
|
|
164
|
+
const record = {
|
|
165
|
+
target: proven.record.target,
|
|
166
|
+
actionHash: proven.record.actionHash,
|
|
167
|
+
score: proven.record.score,
|
|
168
|
+
level: proven.record.level,
|
|
169
|
+
recommendation: proven.record.recommendation,
|
|
170
|
+
policyVersionHash: proven.record.policyVersionHash,
|
|
171
|
+
evidenceHash: proven.record.evidenceHash,
|
|
172
|
+
expiresAt: proven.record.expiresAt === 0n ? "never" : proven.record.expiresAt.toString(),
|
|
173
|
+
};
|
|
174
|
+
// If the batch we fetched does not hash to the committed root, the DA content is
|
|
175
|
+
// stale or tampered — the proof is meaningless. Fail loudly rather than half-pass.
|
|
176
|
+
if (!rootMatches) {
|
|
177
|
+
return {
|
|
178
|
+
...neutral({}),
|
|
179
|
+
configured: true,
|
|
180
|
+
committed: true,
|
|
181
|
+
onchainMerkleRoot,
|
|
182
|
+
dataURI,
|
|
183
|
+
found: true,
|
|
184
|
+
rootMatches: false,
|
|
185
|
+
verifiedLocal: proven.verifiedLocal,
|
|
186
|
+
verifiedOnchain: null,
|
|
187
|
+
expired,
|
|
188
|
+
proof: proven.proof,
|
|
189
|
+
record,
|
|
190
|
+
source: "root-mismatch",
|
|
191
|
+
error: "Recomputed batch root does not match the on-chain committed root (stale or tampered data availability).",
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
let verifiedOnchain = null;
|
|
195
|
+
const shouldVerifyOnchain = opts.verifyOnchain !== false;
|
|
196
|
+
if (shouldVerifyOnchain) {
|
|
197
|
+
try {
|
|
198
|
+
verifiedOnchain = (await publicClient.readContract({
|
|
199
|
+
address,
|
|
200
|
+
abi: SAFEHANDS_REGISTRY_ABI,
|
|
201
|
+
functionName: "verifyRiskRecord",
|
|
202
|
+
args: [
|
|
203
|
+
proven.record.target,
|
|
204
|
+
proven.record.actionHash,
|
|
205
|
+
proven.record.score,
|
|
206
|
+
proven.record.level,
|
|
207
|
+
proven.record.recommendation,
|
|
208
|
+
proven.record.policyVersionHash,
|
|
209
|
+
proven.record.evidenceHash,
|
|
210
|
+
proven.record.expiresAt,
|
|
211
|
+
proven.proof,
|
|
212
|
+
],
|
|
213
|
+
}));
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
// Expired() revert is a legitimate on-chain answer, not an infra failure.
|
|
217
|
+
verifiedOnchain = false;
|
|
218
|
+
if (!expired) {
|
|
219
|
+
return {
|
|
220
|
+
configured: true,
|
|
221
|
+
committed: true,
|
|
222
|
+
onchainMerkleRoot,
|
|
223
|
+
dataURI,
|
|
224
|
+
found: true,
|
|
225
|
+
rootMatches: true,
|
|
226
|
+
verifiedLocal: proven.verifiedLocal,
|
|
227
|
+
verifiedOnchain: false,
|
|
228
|
+
expired,
|
|
229
|
+
proof: proven.proof,
|
|
230
|
+
record,
|
|
231
|
+
source: "error",
|
|
232
|
+
error: `On-chain verifyRiskRecord failed: ${err.message}`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
configured: true,
|
|
239
|
+
committed: true,
|
|
240
|
+
onchainMerkleRoot,
|
|
241
|
+
dataURI,
|
|
242
|
+
found: true,
|
|
243
|
+
rootMatches: true,
|
|
244
|
+
verifiedLocal: proven.verifiedLocal,
|
|
245
|
+
verifiedOnchain,
|
|
246
|
+
expired,
|
|
247
|
+
proof: proven.proof,
|
|
248
|
+
record,
|
|
249
|
+
source: shouldVerifyOnchain ? "onchain-view" : "local-only",
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=riskInclusion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riskInclusion.js","sourceRoot":"","sources":["../../src/lib/riskInclusion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Map a risk-engine level string to the on-chain RiskLevel enum (default MEDIUM). */
|
|
2
|
+
export declare function riskLevelToEnum(level: string): number;
|
|
3
|
+
/** Map a risk-engine recommendation string to the on-chain Recommendation enum (default CAUTION). */
|
|
4
|
+
export declare function recommendationToEnum(rec: string): number;
|
|
5
|
+
export declare function isAgentAuthorized(walletAddress: `0x${string}`): Promise<boolean>;
|
|
6
|
+
export interface AutoAuthorizeResult {
|
|
7
|
+
riskRegistryAuthorized: boolean;
|
|
8
|
+
autoAuthorized: boolean;
|
|
9
|
+
authorizationTxHash?: string;
|
|
10
|
+
authorizationReason?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function tryAutoAuthorize(walletAddress: `0x${string}`): Promise<AutoAuthorizeResult>;
|
|
13
|
+
export interface ManagedAuthCheckResult {
|
|
14
|
+
authorized: boolean;
|
|
15
|
+
autoAuthResult?: AutoAuthorizeResult;
|
|
16
|
+
errorCode?: string;
|
|
17
|
+
errorMessage?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function checkManagedWalletAuthorization(walletAddress: `0x${string}`): Promise<ManagedAuthCheckResult>;
|
|
20
|
+
export declare function deriveActionHash(chainId: number, actionType: string, walletAddress: string, extra: Record<string, string | undefined>): `0x${string}`;
|
|
21
|
+
export interface RegistryQueryResult {
|
|
22
|
+
version: string;
|
|
23
|
+
address: string;
|
|
24
|
+
walletAddress: string;
|
|
25
|
+
authorized: boolean;
|
|
26
|
+
hasRiskRecord: boolean;
|
|
27
|
+
currentMerkleRoot: string | null;
|
|
28
|
+
currentDataURI: string | null;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function queryRegistryForTarget(walletAddress: `0x${string}`): Promise<RegistryQueryResult>;
|
|
32
|
+
//# sourceMappingURL=safeHandsRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeHandsRegistry.d.ts","sourceRoot":"","sources":["../../src/lib/safeHandsRegistry.ts"],"names":[],"mappings":"AAoBA,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,qGAAqG;AACrG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGxD;AASD,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAatF;AAED,MAAM,WAAW,mBAAmB;IAClC,sBAAsB,EAAE,OAAO,CAAC;IAChC,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyCjG;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,+BAA+B,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiBnH;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACxC,KAAK,MAAM,EAAE,CAGf;AAOD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,sBAAsB,CAAC,aAAa,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmDvG"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// ─── SafeHandsRegistry client ──────────────────────────────────────────
|
|
2
|
+
// Read/write client for the on-chain SafeHandsRegistry (trust + reputation
|
|
3
|
+
// oracle). Replaces the legacy SafeHandsRegistry client. Read-only by default;
|
|
4
|
+
// the only writes are agent authorization (owner key) and risk-record
|
|
5
|
+
// publishing (operator key) — both behind explicit gates in the callers.
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
7
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
8
|
+
import { keccak256, encodePacked, isAddress } from "viem";
|
|
9
|
+
import { publicClient, createPharosWalletClientFromAccount } from "./pharosClient.js";
|
|
10
|
+
import { SAFEHANDS_REGISTRY_ADDRESS, SAFEHANDS_REGISTRY_ABI, AUTO_AUTHORIZE_AGENT_WALLET, } from "./constants.js";
|
|
11
|
+
// SafeHandsRegistry enum orderings (must match the Solidity enums).
|
|
12
|
+
const LEVELS = ["low", "medium", "high", "critical"];
|
|
13
|
+
const RECOMMENDATIONS = ["proceed", "caution", "block"];
|
|
14
|
+
/** Map a risk-engine level string to the on-chain RiskLevel enum (default MEDIUM). */
|
|
15
|
+
export function riskLevelToEnum(level) {
|
|
16
|
+
const i = LEVELS.indexOf(level.toLowerCase());
|
|
17
|
+
return i >= 0 ? i : 1;
|
|
18
|
+
}
|
|
19
|
+
/** Map a risk-engine recommendation string to the on-chain Recommendation enum (default CAUTION). */
|
|
20
|
+
export function recommendationToEnum(rec) {
|
|
21
|
+
const i = RECOMMENDATIONS.indexOf(rec.toLowerCase());
|
|
22
|
+
return i >= 0 ? i : 1;
|
|
23
|
+
}
|
|
24
|
+
/** The configured registry address, or null when not yet deployed/configured. */
|
|
25
|
+
function registryAddress() {
|
|
26
|
+
return SAFEHANDS_REGISTRY_ADDRESS && isAddress(SAFEHANDS_REGISTRY_ADDRESS)
|
|
27
|
+
? SAFEHANDS_REGISTRY_ADDRESS
|
|
28
|
+
: null;
|
|
29
|
+
}
|
|
30
|
+
export async function isAgentAuthorized(walletAddress) {
|
|
31
|
+
const address = registryAddress();
|
|
32
|
+
if (!address)
|
|
33
|
+
return false;
|
|
34
|
+
try {
|
|
35
|
+
return (await publicClient.readContract({
|
|
36
|
+
address,
|
|
37
|
+
abi: SAFEHANDS_REGISTRY_ABI,
|
|
38
|
+
functionName: "isAuthorizedAgent",
|
|
39
|
+
args: [walletAddress],
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function tryAutoAuthorize(walletAddress) {
|
|
47
|
+
if (!AUTO_AUTHORIZE_AGENT_WALLET) {
|
|
48
|
+
return { riskRegistryAuthorized: false, autoAuthorized: false, authorizationReason: "AUTO_AUTHORIZE_AGENT_WALLET is disabled." };
|
|
49
|
+
}
|
|
50
|
+
const address = registryAddress();
|
|
51
|
+
if (!address) {
|
|
52
|
+
return { riskRegistryAuthorized: false, autoAuthorized: false, authorizationReason: "SAFEHANDS_REGISTRY_ADDRESS is not configured." };
|
|
53
|
+
}
|
|
54
|
+
const ownerKey = process.env.RISK_REGISTRY_OWNER_PRIVATE_KEY;
|
|
55
|
+
if (!ownerKey) {
|
|
56
|
+
return { riskRegistryAuthorized: false, autoAuthorized: false, authorizationReason: "RISK_REGISTRY_OWNER_PRIVATE_KEY is not configured." };
|
|
57
|
+
}
|
|
58
|
+
if (!isAddress(walletAddress) || walletAddress === "0x0000000000000000000000000000000000000000") {
|
|
59
|
+
return { riskRegistryAuthorized: false, autoAuthorized: false, authorizationReason: "Invalid wallet address for auto-authorization." };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
if (await isAgentAuthorized(walletAddress)) {
|
|
63
|
+
return { riskRegistryAuthorized: true, autoAuthorized: false };
|
|
64
|
+
}
|
|
65
|
+
const normalized = (ownerKey.startsWith("0x") ? ownerKey : `0x${ownerKey}`);
|
|
66
|
+
const ownerWallet = createPharosWalletClientFromAccount(privateKeyToAccount(normalized));
|
|
67
|
+
const txHash = await ownerWallet.writeContract({
|
|
68
|
+
address,
|
|
69
|
+
abi: SAFEHANDS_REGISTRY_ABI,
|
|
70
|
+
functionName: "setAuthorizedAgent",
|
|
71
|
+
args: [walletAddress, true],
|
|
72
|
+
});
|
|
73
|
+
return { riskRegistryAuthorized: true, autoAuthorized: true, authorizationTxHash: txHash };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return {
|
|
77
|
+
riskRegistryAuthorized: false,
|
|
78
|
+
autoAuthorized: false,
|
|
79
|
+
authorizationReason: `Auto-authorization failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export async function checkManagedWalletAuthorization(walletAddress) {
|
|
84
|
+
if (await isAgentAuthorized(walletAddress))
|
|
85
|
+
return { authorized: true };
|
|
86
|
+
const autoResult = await tryAutoAuthorize(walletAddress);
|
|
87
|
+
if (autoResult.riskRegistryAuthorized) {
|
|
88
|
+
return { authorized: true, autoAuthResult: autoResult };
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
authorized: false,
|
|
92
|
+
autoAuthResult: autoResult,
|
|
93
|
+
errorCode: "AGENT_WALLET_NOT_AUTHORIZED",
|
|
94
|
+
errorMessage: `Managed wallet ${walletAddress} is not authorized in SafeHandsRegistry. ` +
|
|
95
|
+
`The contract owner must call setAuthorizedAgent(${walletAddress}, true), ` +
|
|
96
|
+
`or enable AUTO_AUTHORIZE_AGENT_WALLET=true with RISK_REGISTRY_OWNER_PRIVATE_KEY.`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export function deriveActionHash(chainId, actionType, walletAddress, extra) {
|
|
100
|
+
const parts = [String(chainId), actionType, walletAddress, ...Object.values(extra).filter(Boolean)].join(":");
|
|
101
|
+
return keccak256(encodePacked(["string"], [parts]));
|
|
102
|
+
}
|
|
103
|
+
export async function queryRegistryForTarget(walletAddress) {
|
|
104
|
+
const address = registryAddress();
|
|
105
|
+
const base = { version: "safehands-registry", address: address ?? "", walletAddress };
|
|
106
|
+
if (!address) {
|
|
107
|
+
return {
|
|
108
|
+
...base,
|
|
109
|
+
authorized: false,
|
|
110
|
+
hasRiskRecord: false,
|
|
111
|
+
currentMerkleRoot: null,
|
|
112
|
+
currentDataURI: null,
|
|
113
|
+
error: "SafeHandsRegistry address not configured (deploy + set SAFEHANDS_REGISTRY_ADDRESS).",
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const authorized = await isAgentAuthorized(walletAddress);
|
|
118
|
+
let currentMerkleRoot = null;
|
|
119
|
+
let currentDataURI = null;
|
|
120
|
+
try {
|
|
121
|
+
currentMerkleRoot = (await publicClient.readContract({
|
|
122
|
+
address,
|
|
123
|
+
abi: SAFEHANDS_REGISTRY_ABI,
|
|
124
|
+
functionName: "currentMerkleRoot",
|
|
125
|
+
args: [],
|
|
126
|
+
}));
|
|
127
|
+
currentDataURI = (await publicClient.readContract({
|
|
128
|
+
address,
|
|
129
|
+
abi: SAFEHANDS_REGISTRY_ABI,
|
|
130
|
+
functionName: "currentDataURI",
|
|
131
|
+
args: [],
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
/* ignore if not yet committed */
|
|
136
|
+
}
|
|
137
|
+
const hasRiskRecord = Boolean(currentMerkleRoot && currentMerkleRoot !== "0x0000000000000000000000000000000000000000000000000000000000000000");
|
|
138
|
+
return { ...base, authorized, hasRiskRecord, currentMerkleRoot, currentDataURI };
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
return {
|
|
142
|
+
...base,
|
|
143
|
+
authorized: false,
|
|
144
|
+
hasRiskRecord: false,
|
|
145
|
+
currentMerkleRoot: null,
|
|
146
|
+
currentDataURI: null,
|
|
147
|
+
error: `SafeHandsRegistry unavailable: ${err instanceof Error ? err.message : String(err)}`,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=safeHandsRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeHandsRegistry.js","sourceRoot":"","sources":["../../src/lib/safeHandsRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Account } from "viem";
|
|
2
|
-
export type SignerMode = "none" | "env" | "managed-
|
|
2
|
+
export type SignerMode = "none" | "env" | "managed-mainnet" | "external-signer" | "x402-env";
|
|
3
3
|
export type SignerPurpose = "write" | "x402";
|
|
4
4
|
export interface SignerResult {
|
|
5
5
|
account: Account;
|
|
@@ -16,8 +16,8 @@ export type GetSignerResult = SignerResult | SignerFailure;
|
|
|
16
16
|
export declare function isSignerFailure(r: GetSignerResult): r is SignerFailure;
|
|
17
17
|
/**
|
|
18
18
|
* Get a signer for write/payment operations.
|
|
19
|
-
* Priority for x402: managed wallet > X402_SIGNER_PRIVATE_KEY > PRIVATE_KEY
|
|
20
|
-
* Priority for writes: managed wallet > PRIVATE_KEY
|
|
19
|
+
* Priority for x402: managed wallet > X402_SIGNER_PRIVATE_KEY > PRIVATE_KEY when WALLET_MODE=env.
|
|
20
|
+
* Priority for writes: managed wallet > PRIVATE_KEY only when WALLET_MODE=env.
|
|
21
21
|
*/
|
|
22
22
|
export declare function getSigner(agentId?: string, options?: {
|
|
23
23
|
purpose?: SignerPurpose;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/signer/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/signer/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAC7F,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,aAAa,CAAC;AAE3D,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,IAAI,aAAa,CAEtE;AAmED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,aAAa,CAAA;CAAO,GACxC,OAAO,CAAC,eAAe,CAAC,CAmC1B"}
|
package/dist/lib/signer/index.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// ────────────────────────────────────────────────────────────────────────
|
|
5
5
|
import { privateKeyToAccount } from "viem/accounts";
|
|
6
6
|
import { walletStore, decryptKey, getEffectiveEncryptionKey } from "../wallet/index.js";
|
|
7
|
+
import { managedWalletEnabled } from "../config.js";
|
|
7
8
|
export function isSignerFailure(r) {
|
|
8
9
|
return "error" in r;
|
|
9
10
|
}
|
|
@@ -29,13 +30,25 @@ function accountFromEnvKey(envName, mode) {
|
|
|
29
30
|
}
|
|
30
31
|
async function accountFromManagedWallet(agentId) {
|
|
31
32
|
const walletMode = process.env.WALLET_MODE || "none";
|
|
32
|
-
if (walletMode !== "managed-
|
|
33
|
+
if (walletMode !== "managed-mainnet" || !agentId)
|
|
33
34
|
return null;
|
|
35
|
+
// Managed custody must be explicitly opted into. WALLET_MODE=managed-mainnet
|
|
36
|
+
// selects the signer source; MANAGED_WALLET_ENABLED=true is the required second
|
|
37
|
+
// gate (mirrors the MCP bootstrap gate + capability flags). Without it the stored
|
|
38
|
+
// managed wallet is NEVER used to sign — fail closed with a clear reason.
|
|
39
|
+
if (!managedWalletEnabled()) {
|
|
40
|
+
return {
|
|
41
|
+
error: {
|
|
42
|
+
code: "MANAGED_WALLET_DISABLED",
|
|
43
|
+
message: "Managed-wallet signing requires MANAGED_WALLET_ENABLED=true in addition to WALLET_MODE=managed-mainnet. Enable it only for trusted managed execution.",
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
34
47
|
if (process.env.WALLET_STORE_PATH && !process.env.WALLET_ENCRYPTION_KEY) {
|
|
35
48
|
return {
|
|
36
49
|
error: {
|
|
37
50
|
code: "WALLET_ENCRYPTION_KEY_REQUIRED",
|
|
38
|
-
message: "WALLET_ENCRYPTION_KEY is required when WALLET_STORE_PATH is used for persistent managed-
|
|
51
|
+
message: "WALLET_ENCRYPTION_KEY is required when WALLET_STORE_PATH is used for persistent managed-mainnet wallets.",
|
|
39
52
|
},
|
|
40
53
|
};
|
|
41
54
|
}
|
|
@@ -45,7 +58,7 @@ async function accountFromManagedWallet(agentId) {
|
|
|
45
58
|
try {
|
|
46
59
|
const privateKey = decryptKey(stored.encryptedKey, getEffectiveEncryptionKey());
|
|
47
60
|
const account = privateKeyToAccount(normalizePrivateKey(privateKey));
|
|
48
|
-
return { account, address: account.address, mode: "managed-
|
|
61
|
+
return { account, address: account.address, mode: "managed-mainnet" };
|
|
49
62
|
}
|
|
50
63
|
catch {
|
|
51
64
|
return {
|
|
@@ -58,21 +71,30 @@ async function accountFromManagedWallet(agentId) {
|
|
|
58
71
|
}
|
|
59
72
|
/**
|
|
60
73
|
* Get a signer for write/payment operations.
|
|
61
|
-
* Priority for x402: managed wallet > X402_SIGNER_PRIVATE_KEY > PRIVATE_KEY
|
|
62
|
-
* Priority for writes: managed wallet > PRIVATE_KEY
|
|
74
|
+
* Priority for x402: managed wallet > X402_SIGNER_PRIVATE_KEY > PRIVATE_KEY when WALLET_MODE=env.
|
|
75
|
+
* Priority for writes: managed wallet > PRIVATE_KEY only when WALLET_MODE=env.
|
|
63
76
|
*/
|
|
64
77
|
export async function getSigner(agentId, options = {}) {
|
|
65
78
|
const purpose = options.purpose || "write";
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
79
|
+
// x402 is permissionless-first: prefer the agent's OWN x402 signer
|
|
80
|
+
// (self-custody — no SafeHandsRegistry authorization required) over the
|
|
81
|
+
// managed/custodial wallet. To route x402 through the managed wallet instead,
|
|
82
|
+
// simply leave X402_SIGNER_PRIVATE_KEY unset.
|
|
69
83
|
if (purpose === "x402") {
|
|
70
84
|
const x402Env = accountFromEnvKey("X402_SIGNER_PRIVATE_KEY", "x402-env");
|
|
71
85
|
if (x402Env)
|
|
72
86
|
return x402Env;
|
|
73
87
|
}
|
|
88
|
+
const managed = await accountFromManagedWallet(agentId);
|
|
89
|
+
if (managed)
|
|
90
|
+
return managed;
|
|
91
|
+
if (!agentId && (process.env.WALLET_MODE === "managed-mainnet")) {
|
|
92
|
+
const defaultManaged = await accountFromManagedWallet("default");
|
|
93
|
+
if (defaultManaged)
|
|
94
|
+
return defaultManaged;
|
|
95
|
+
}
|
|
74
96
|
const walletMode = process.env.WALLET_MODE || "none";
|
|
75
|
-
if (walletMode === "env"
|
|
97
|
+
if (walletMode === "env") {
|
|
76
98
|
const env = accountFromEnvKey("PRIVATE_KEY", "env");
|
|
77
99
|
if (env)
|
|
78
100
|
return env;
|
|
@@ -81,8 +103,8 @@ export async function getSigner(agentId, options = {}) {
|
|
|
81
103
|
error: {
|
|
82
104
|
code: "NO_SIGNER_AVAILABLE",
|
|
83
105
|
message: purpose === "x402"
|
|
84
|
-
? "No x402 signer available. Use WALLET_MODE=managed-
|
|
85
|
-
: "No signer available. Use WALLET_MODE=managed-
|
|
106
|
+
? "No x402 signer available. Use WALLET_MODE=managed-mainnet with agentId, X402_SIGNER_PRIVATE_KEY, or PRIVATE_KEY in explicit local self-hosted mode."
|
|
107
|
+
: "No signer available. Use WALLET_MODE=managed-mainnet with agentId, or WALLET_MODE=env with PRIVATE_KEY for explicit local self-hosted mode.",
|
|
86
108
|
},
|
|
87
109
|
};
|
|
88
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/signer/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0EAA0E;AAC1E,0DAA0D;AAC1D,2EAA2E;AAE3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/signer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
export declare function getMaxDailySpendUsd(): number;
|
|
2
|
-
export
|
|
2
|
+
export type PriceableSpendToken = "PROS" | "WPROS" | "USDC" | "USDT";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a token symbol OR address to a priceable spend token, or `null` when the
|
|
5
|
+
* token cannot be priced in USD. Addresses are matched against the official
|
|
6
|
+
* active-network token registry so registry USDC passed by address still counts
|
|
7
|
+
* toward the caps instead of slipping past them.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolvePriceableToken(token: string): PriceableSpendToken | null;
|
|
10
|
+
export declare function estimateUsd(amount: string, token: "PROS" | "USDC" | "USDT" | string): number;
|
|
3
11
|
export declare function checkDailyLimit(walletAddress: string, amountUsd: number): {
|
|
4
12
|
allowed: boolean;
|
|
5
13
|
currentUsd: number;
|
|
@@ -7,4 +15,19 @@ export declare function checkDailyLimit(walletAddress: string, amountUsd: number
|
|
|
7
15
|
remainingUsd: number;
|
|
8
16
|
};
|
|
9
17
|
export declare function recordSpend(walletAddress: string, amountUsd: number): void;
|
|
18
|
+
/**
|
|
19
|
+
* Atomic check-and-reserve. `checkDailyLimit` + `recordSpend` run with NO
|
|
20
|
+
* `await` between them, so within Node's single-threaded event loop the reserve is
|
|
21
|
+
* atomic: two concurrent tool calls can no longer both pass the cap by reading the
|
|
22
|
+
* pre-spend bucket. Reserve immediately BEFORE broadcasting, then `releaseReservation`
|
|
23
|
+
* on any failure so a reverted/failed tx does not permanently consume the cap.
|
|
24
|
+
*/
|
|
25
|
+
export declare function reserveDailyLimit(walletAddress: string, amountUsd: number): {
|
|
26
|
+
allowed: boolean;
|
|
27
|
+
currentUsd: number;
|
|
28
|
+
limitUsd: number;
|
|
29
|
+
remainingUsd: number;
|
|
30
|
+
};
|
|
31
|
+
/** Release a previously reserved amount (call when a reserved tx fails/reverts). */
|
|
32
|
+
export declare function releaseReservation(walletAddress: string, amountUsd: number): void;
|
|
10
33
|
//# sourceMappingURL=spendAccumulator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spendAccumulator.d.ts","sourceRoot":"","sources":["../../src/lib/spendAccumulator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spendAccumulator.d.ts","sourceRoot":"","sources":["../../src/lib/spendAccumulator.ts"],"names":[],"mappings":"AA6CA,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAErE;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAY/E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAS5F;AAED,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAalF;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAW1E;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAMlF;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAQjF"}
|