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,221 @@
|
|
|
1
|
+
// ─── OKX DEX Aggregator API Client ─────────────────────────────────────
|
|
2
|
+
// Fetches swap quotes and executable calldata from the OKX DEX aggregator
|
|
3
|
+
// (Classic Swap API v6).
|
|
4
|
+
//
|
|
5
|
+
// CHAIN SUPPORT IS EVIDENCE-GATED. OKX's own supported-chains docs list Pharos
|
|
6
|
+
// with chainIndex 1672 and Trade capability, and both the aggregation router
|
|
7
|
+
// and the token-approve contract are registry-verified from OKX's dev docs
|
|
8
|
+
// plus on-chain bytecode checks (protocol:pacific-mainnet:okx-dex). Pacific
|
|
9
|
+
// Mainnet (1672) is therefore the only chain in the default supported set;
|
|
10
|
+
// quote fetches on any other chain fail closed with a structured
|
|
11
|
+
// SWAP_LIQUIDITY_NOT_CONFIGURED error. Override via OKX_API_SUPPORTED_CHAIN_IDS
|
|
12
|
+
// only with evidence the OKX API actually serves that chain.
|
|
13
|
+
//
|
|
14
|
+
// AUTH: every request is signed per OKX's REST authentication scheme:
|
|
15
|
+
// OK-ACCESS-SIGN = Base64(HMAC-SHA256(timestamp + method + requestPath, secret))
|
|
16
|
+
// where requestPath INCLUDES the query string. Credentials come from env at
|
|
17
|
+
// call time (OKX_API_KEY / OKX_API_SECRET / OKX_API_PASSPHRASE, optional
|
|
18
|
+
// OKX_API_PROJECT_ID for the OK-ACCESS-PROJECT header) and are never logged
|
|
19
|
+
// or echoed into error messages. Missing credentials fail closed BEFORE any
|
|
20
|
+
// network call with OKX_API_CREDENTIALS_MISSING.
|
|
21
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
22
|
+
import { createHmac } from "node:crypto";
|
|
23
|
+
import { isAddress } from "viem";
|
|
24
|
+
import { OKX_API_BASE, OKX_SWAP_ENDPOINT, OKX_DEX_APPROVE_ADDRESS, okxApiCredentials, CHAIN_ID, } from "./constants.js";
|
|
25
|
+
import { fetchWithTimeoutAndRetry } from "./http.js";
|
|
26
|
+
import { resolveTokenAddress, resolveTokenDecimals, resolveAutoSlippage, toWei, fromWei } from "./dodoApi.js";
|
|
27
|
+
// ─── Errors ────────────────────────────────────────────────────────────
|
|
28
|
+
/**
|
|
29
|
+
* Structured "provider not configured for this chain" failure. Callers must
|
|
30
|
+
* surface this as SWAP_LIQUIDITY_NOT_CONFIGURED: a permanent configuration
|
|
31
|
+
* state, not a transient provider outage.
|
|
32
|
+
*/
|
|
33
|
+
export class OkxNotConfiguredError extends Error {
|
|
34
|
+
code = "SWAP_LIQUIDITY_NOT_CONFIGURED";
|
|
35
|
+
constructor(chainId) {
|
|
36
|
+
super(`SWAP_LIQUIDITY_NOT_CONFIGURED: the OKX DEX aggregator API is not a verified provider for chainId ${chainId}. ` +
|
|
37
|
+
`Swap liquidity and route quotes cannot be served on this network via the okx venue. ` +
|
|
38
|
+
`Verified chains: ${okxApiSupportedChainIds().join(", ") || "none"} (override with OKX_API_SUPPORTED_CHAIN_IDS only with evidence of support).`);
|
|
39
|
+
this.name = "OkxNotConfiguredError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Structured "credentials not configured" failure raised BEFORE any network
|
|
44
|
+
* call. Lists only the missing env var NAMES, never any credential value.
|
|
45
|
+
*/
|
|
46
|
+
export class OkxCredentialsMissingError extends Error {
|
|
47
|
+
code = "OKX_API_CREDENTIALS_MISSING";
|
|
48
|
+
missing;
|
|
49
|
+
constructor(missing) {
|
|
50
|
+
super(`OKX_API_CREDENTIALS_MISSING: the okx swap venue requires signed API access. ` +
|
|
51
|
+
`Missing environment variables: ${missing.join(", ")}. ` +
|
|
52
|
+
`Create an API key in the OKX web3 developer portal and set OKX_API_KEY, OKX_API_SECRET, and OKX_API_PASSPHRASE (plus OKX_API_PROJECT_ID if your project requires it).`);
|
|
53
|
+
this.name = "OkxCredentialsMissingError";
|
|
54
|
+
this.missing = missing;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ─── Chain gating ──────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Chains the OKX DEX aggregator API is treated as configured for. Defaults to
|
|
60
|
+
* Pacific Mainnet (1672) only: OKX's supported-chains docs list Pharos with
|
|
61
|
+
* chainIndex 1672, and no Pharos testnet is listed. Any other chain fails
|
|
62
|
+
* closed until an operator opts in via OKX_API_SUPPORTED_CHAIN_IDS with
|
|
63
|
+
* evidence the API supports it.
|
|
64
|
+
*/
|
|
65
|
+
export function okxApiSupportedChainIds() {
|
|
66
|
+
const raw = process.env.OKX_API_SUPPORTED_CHAIN_IDS;
|
|
67
|
+
if (raw && raw.trim()) {
|
|
68
|
+
return raw
|
|
69
|
+
.split(",")
|
|
70
|
+
.map((s) => parseInt(s.trim(), 10))
|
|
71
|
+
.filter((n) => Number.isFinite(n) && n > 0);
|
|
72
|
+
}
|
|
73
|
+
return [1672];
|
|
74
|
+
}
|
|
75
|
+
export function isOkxApiConfiguredForChain(chainId = CHAIN_ID) {
|
|
76
|
+
return okxApiSupportedChainIds().includes(chainId);
|
|
77
|
+
}
|
|
78
|
+
// ─── Request signing (pure, exported for tests) ────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Computes the OK-ACCESS-SIGN header value: Base64(HMAC-SHA256(prehash, secret))
|
|
81
|
+
* with prehash = timestamp + method + requestPath (+ body for POST). The
|
|
82
|
+
* requestPath must include the query string.
|
|
83
|
+
*/
|
|
84
|
+
export function signOkxRequest(params) {
|
|
85
|
+
const prehash = `${params.timestamp}${params.method}${params.requestPath}${params.body ?? ""}`;
|
|
86
|
+
return createHmac("sha256", params.secret).update(prehash).digest("base64");
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Builds the v6 swap request path (endpoint + query string) in a fixed
|
|
90
|
+
* parameter order so the signed string is deterministic and testable.
|
|
91
|
+
*/
|
|
92
|
+
export function buildOkxSwapRequestPath(params) {
|
|
93
|
+
const query = new URLSearchParams();
|
|
94
|
+
query.set("chainIndex", String(params.chainId));
|
|
95
|
+
query.set("fromTokenAddress", params.fromTokenAddress);
|
|
96
|
+
query.set("toTokenAddress", params.toTokenAddress);
|
|
97
|
+
query.set("amount", params.amountWei);
|
|
98
|
+
query.set("userWalletAddress", params.userWalletAddress);
|
|
99
|
+
query.set("slippagePercent", String(params.slippagePercent));
|
|
100
|
+
query.set("swapMode", "exactIn");
|
|
101
|
+
return `${OKX_SWAP_ENDPOINT}?${query.toString()}`;
|
|
102
|
+
}
|
|
103
|
+
// ─── Quote fetch ───────────────────────────────────────────────────────
|
|
104
|
+
function emptyQuote(sourceStatus, usedFromToken, usedToToken, rawResponse) {
|
|
105
|
+
return {
|
|
106
|
+
amountOut: "0",
|
|
107
|
+
amountOutWei: "0",
|
|
108
|
+
priceImpact: 100,
|
|
109
|
+
gasLimit: "0",
|
|
110
|
+
value: "0",
|
|
111
|
+
calldata: "0x",
|
|
112
|
+
to: "",
|
|
113
|
+
approveAddress: "",
|
|
114
|
+
routeAvailable: false,
|
|
115
|
+
sourceStatus,
|
|
116
|
+
usedFromToken,
|
|
117
|
+
usedToToken,
|
|
118
|
+
wasSubstituted: false,
|
|
119
|
+
minReceiveAmountWei: "0",
|
|
120
|
+
rawResponse,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Fetches an executable swap quote from the OKX DEX aggregator. The returned
|
|
125
|
+
* `to`/`calldata` come from the aggregator and MUST still be contained by the
|
|
126
|
+
* caller against the OKX router allowlist; the approve address is the
|
|
127
|
+
* registry-verified OKX token-approve contract (OKX's approval model always
|
|
128
|
+
* targets that dedicated contract; the swap response itself does not carry a
|
|
129
|
+
* spender field).
|
|
130
|
+
*/
|
|
131
|
+
export async function getOkxSwapQuote(params) {
|
|
132
|
+
if (!isOkxApiConfiguredForChain(CHAIN_ID)) {
|
|
133
|
+
throw new OkxNotConfiguredError(CHAIN_ID);
|
|
134
|
+
}
|
|
135
|
+
const creds = okxApiCredentials();
|
|
136
|
+
if (!creds.ok) {
|
|
137
|
+
throw new OkxCredentialsMissingError(creds.missing);
|
|
138
|
+
}
|
|
139
|
+
if (!isAddress(params.walletAddress)) {
|
|
140
|
+
throw new Error(`INVALID_WALLET_ADDRESS: ${params.walletAddress}`);
|
|
141
|
+
}
|
|
142
|
+
const fromAddress = resolveTokenAddress(params.fromToken);
|
|
143
|
+
const toAddress = resolveTokenAddress(params.toToken);
|
|
144
|
+
const fromDecimals = resolveTokenDecimals(params.fromToken);
|
|
145
|
+
const toDecimals = resolveTokenDecimals(params.toToken);
|
|
146
|
+
const amountWei = toWei(params.amountHuman, fromDecimals);
|
|
147
|
+
const slippagePercent = params.slippage ?? resolveAutoSlippage(params.fromToken, params.toToken);
|
|
148
|
+
const requestPath = buildOkxSwapRequestPath({
|
|
149
|
+
chainId: CHAIN_ID,
|
|
150
|
+
fromTokenAddress: fromAddress,
|
|
151
|
+
toTokenAddress: toAddress,
|
|
152
|
+
amountWei,
|
|
153
|
+
userWalletAddress: params.walletAddress,
|
|
154
|
+
slippagePercent,
|
|
155
|
+
});
|
|
156
|
+
const timestamp = new Date().toISOString();
|
|
157
|
+
const headers = {
|
|
158
|
+
"Content-Type": "application/json",
|
|
159
|
+
"OK-ACCESS-KEY": creds.credentials.apiKey,
|
|
160
|
+
"OK-ACCESS-SIGN": signOkxRequest({ timestamp, method: "GET", requestPath, secret: creds.credentials.apiSecret }),
|
|
161
|
+
"OK-ACCESS-TIMESTAMP": timestamp,
|
|
162
|
+
"OK-ACCESS-PASSPHRASE": creds.credentials.passphrase,
|
|
163
|
+
};
|
|
164
|
+
if (creds.credentials.projectId) {
|
|
165
|
+
headers["OK-ACCESS-PROJECT"] = creds.credentials.projectId;
|
|
166
|
+
}
|
|
167
|
+
const response = await fetchWithTimeoutAndRetry(`${OKX_API_BASE}${requestPath}`, {
|
|
168
|
+
timeoutMs: 10_000,
|
|
169
|
+
retries: 2,
|
|
170
|
+
retryDelayMs: 300,
|
|
171
|
+
headers,
|
|
172
|
+
});
|
|
173
|
+
if (!response.ok) {
|
|
174
|
+
if (response.status === 401 || response.status === 403) {
|
|
175
|
+
throw new Error("OKX_API_AUTH_REQUIRED: the OKX DEX API rejected the configured credentials. Verify OKX_API_KEY, OKX_API_SECRET, OKX_API_PASSPHRASE (and OKX_API_PROJECT_ID if required) in the OKX web3 developer portal.");
|
|
176
|
+
}
|
|
177
|
+
if (response.status === 429) {
|
|
178
|
+
throw new Error(`OKX_API_RATE_LIMITED: ${response.status} ${response.statusText}`);
|
|
179
|
+
}
|
|
180
|
+
throw new Error(`OKX_API_UNAVAILABLE: ${response.status} ${response.statusText}`);
|
|
181
|
+
}
|
|
182
|
+
const json = (await response.json());
|
|
183
|
+
if (json.code !== "0" || !Array.isArray(json.data) || json.data.length === 0) {
|
|
184
|
+
const message = (json.msg || "").toLowerCase();
|
|
185
|
+
if (message.includes("api key") || message.includes("apikey") || message.includes("signature") || message.includes("passphrase") || message.includes("unauthorized") || message.includes("forbidden")) {
|
|
186
|
+
throw new Error("OKX_API_AUTH_REQUIRED: the OKX DEX API rejected the configured credentials. Verify OKX_API_KEY, OKX_API_SECRET, OKX_API_PASSPHRASE (and OKX_API_PROJECT_ID if required) in the OKX web3 developer portal.");
|
|
187
|
+
}
|
|
188
|
+
return emptyQuote("no_route_available", fromAddress, toAddress, json);
|
|
189
|
+
}
|
|
190
|
+
const entry = json.data[0];
|
|
191
|
+
const tx = entry.tx;
|
|
192
|
+
const routerResult = entry.routerResult;
|
|
193
|
+
// Fail closed on a malformed "success": a quote without an executable
|
|
194
|
+
// target and calldata is not tradable, whatever the response code says.
|
|
195
|
+
if (!tx || typeof tx.to !== "string" || !isAddress(tx.to) || typeof tx.data !== "string" || !/^0x[0-9a-fA-F]*$/.test(tx.data) || tx.data.length <= 2) {
|
|
196
|
+
return emptyQuote("no_route_available", fromAddress, toAddress, json);
|
|
197
|
+
}
|
|
198
|
+
const amountOutWei = String(routerResult?.toTokenAmount ?? "0");
|
|
199
|
+
// A missing/unparseable price impact must NOT default to a permissive 0:
|
|
200
|
+
// NaN makes the caller's PRICE_IMPACT_TOO_HIGH hard guard fail closed.
|
|
201
|
+
const rawImpact = routerResult?.priceImpactPercent;
|
|
202
|
+
const priceImpact = rawImpact === undefined || rawImpact === null || String(rawImpact).trim() === "" ? Number.NaN : Number(rawImpact);
|
|
203
|
+
return {
|
|
204
|
+
amountOut: fromWei(amountOutWei, toDecimals),
|
|
205
|
+
amountOutWei,
|
|
206
|
+
priceImpact,
|
|
207
|
+
gasLimit: String(tx.gas ?? "0"),
|
|
208
|
+
value: String(tx.value ?? "0"),
|
|
209
|
+
calldata: tx.data,
|
|
210
|
+
to: tx.to,
|
|
211
|
+
approveAddress: OKX_DEX_APPROVE_ADDRESS,
|
|
212
|
+
routeAvailable: true,
|
|
213
|
+
sourceStatus: "ok",
|
|
214
|
+
usedFromToken: fromAddress,
|
|
215
|
+
usedToToken: toAddress,
|
|
216
|
+
wasSubstituted: false,
|
|
217
|
+
minReceiveAmountWei: String(tx.minReceiveAmount ?? "0"),
|
|
218
|
+
rawResponse: json,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=okxDexApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"okxDexApi.js","sourceRoot":"","sources":["../../src/lib/okxDexApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function safeHandsStateDir(): string;
|
|
2
|
+
export declare function stateFile(name: string, envName?: string): string;
|
|
3
|
+
export declare function readJsonFile<T>(filePath: string, fallback: T): T;
|
|
4
|
+
export declare function writeJsonFileAtomic<T>(filePath: string, value: T): void;
|
|
5
|
+
//# sourceMappingURL=persistentJsonStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentJsonStore.d.ts","sourceRoot":"","sources":["../../src/lib/persistentJsonStore.ts"],"names":[],"mappings":"AAUA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhE;AAOD,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAShE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAKvE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// ─── Small persistent JSON store ───────────────────────────────────────
|
|
2
|
+
// Single-process durable storage for the Single-Instance Production Architecture.
|
|
3
|
+
// It writes atomically
|
|
4
|
+
// to a local file/volume and is intentionally dependency-free. For multi-node
|
|
5
|
+
// deployments, replace this adapter with Postgres/Redis.
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
|
|
8
|
+
import { dirname, join } from "path";
|
|
9
|
+
export function safeHandsStateDir() {
|
|
10
|
+
return process.env.SAFEHANDS_STATE_DIR || process.env.STATE_DIR || ".safehands";
|
|
11
|
+
}
|
|
12
|
+
export function stateFile(name, envName) {
|
|
13
|
+
return (envName ? process.env[envName] : undefined) || join(safeHandsStateDir(), name);
|
|
14
|
+
}
|
|
15
|
+
function ensureParent(filePath) {
|
|
16
|
+
const dir = dirname(filePath);
|
|
17
|
+
if (dir && dir !== "." && !existsSync(dir))
|
|
18
|
+
mkdirSync(dir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
export function readJsonFile(filePath, fallback) {
|
|
21
|
+
try {
|
|
22
|
+
if (!existsSync(filePath))
|
|
23
|
+
return fallback;
|
|
24
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
25
|
+
if (!raw.trim())
|
|
26
|
+
return fallback;
|
|
27
|
+
return JSON.parse(raw);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return fallback;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function writeJsonFileAtomic(filePath, value) {
|
|
34
|
+
ensureParent(filePath);
|
|
35
|
+
const tmpPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
36
|
+
writeFileSync(tmpPath, JSON.stringify(value, null, 2), "utf-8");
|
|
37
|
+
renameSync(tmpPath, filePath);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=persistentJsonStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistentJsonStore.js","sourceRoot":"","sources":["../../src/lib/persistentJsonStore.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,kFAAkF;AAClF,uBAAuB;AACvB,8EAA8E;AAC9E,yDAAyD;AACzD,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,YAAY,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,OAAgB;IACtD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,QAAgB,EAAE,QAAW;IAC3D,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,OAAO,QAAQ,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAI,QAAgB,EAAE,KAAQ;IAC/D,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IAC/D,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export declare const ACTION_PAYMENT: `0x${string}`;
|
|
2
|
+
export declare const ACTION_SWAP: `0x${string}`;
|
|
3
|
+
export declare const ACTION_BRIDGE: `0x${string}`;
|
|
4
|
+
export declare const ACTION_APPROVAL: `0x${string}`;
|
|
5
|
+
export declare const ACTION_CONTRACT_CALL: `0x${string}`;
|
|
6
|
+
export declare const ACTION_UNKNOWN: `0x${string}`;
|
|
7
|
+
type AttestationStatus = "required" | "skipped" | "published" | "confirmed" | "pending_retry" | "failed";
|
|
8
|
+
export interface PendingAttestation {
|
|
9
|
+
txHash: string;
|
|
10
|
+
preparedTransactionHash: string;
|
|
11
|
+
chainId: number;
|
|
12
|
+
actionType: `0x${string}`;
|
|
13
|
+
policyHash: `0x${string}`;
|
|
14
|
+
metadataHash: `0x${string}`;
|
|
15
|
+
/** The agent/signer the verified action is attributed to (drives reputationOf). */
|
|
16
|
+
agent: `0x${string}`;
|
|
17
|
+
status: AttestationStatus;
|
|
18
|
+
attempts: number;
|
|
19
|
+
nextAttemptAt: number;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
updatedAt: number;
|
|
22
|
+
attestationTxHash?: string;
|
|
23
|
+
lastError?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function getAttestationRecord(txHash: string): PendingAttestation | null;
|
|
26
|
+
export declare function checkAttestationConfig(): void;
|
|
27
|
+
export declare function classifyAction(parsedTx: any): `0x${string}`;
|
|
28
|
+
export declare function publishAttestation(txHash: string, parsedTx: any, record: any): Promise<AttestationStatus>;
|
|
29
|
+
export interface AgentReputation {
|
|
30
|
+
agent: string;
|
|
31
|
+
/** True when the on-chain SafeHandsAttestation address is configured. */
|
|
32
|
+
configured: boolean;
|
|
33
|
+
/** Count of SafeHands-verified safe broadcasts attributed to this address. */
|
|
34
|
+
verifiedCount: number;
|
|
35
|
+
/** Unix seconds of the most recent attestation (0 = no track record yet). */
|
|
36
|
+
lastAttestationAt: number;
|
|
37
|
+
source: "onchain" | "unconfigured";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Read an address's on-chain SafeHands reputation (verified-safe broadcast count +
|
|
41
|
+
* recency). Read-only, keyless, composable — any agent can consult this as a trust
|
|
42
|
+
* signal. A zero count means "no track record yet" → treat as NEUTRAL, never as a
|
|
43
|
+
* negative (the ledger only records verified-safe actions). Degrades gracefully to a
|
|
44
|
+
* neutral zero when the contract is unconfigured or the RPC read fails.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getAgentReputation(agent: string): Promise<AgentReputation>;
|
|
47
|
+
export declare function retryPendingAttestations(): Promise<number>;
|
|
48
|
+
export declare function startAttestationRetryLoop(): void;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=attestationPublisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestationPublisher.d.ts","sourceRoot":"","sources":["../../../src/lib/pharos/attestationPublisher.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,cAAc,eAAoC,CAAC;AAChE,eAAO,MAAM,WAAW,eAAiC,CAAC;AAC1D,eAAO,MAAM,aAAa,eAAmC,CAAC;AAC9D,eAAO,MAAM,eAAe,eAAqC,CAAC;AAClE,eAAO,MAAM,oBAAoB,eAA0C,CAAC;AAC5E,eAAO,MAAM,cAAc,eAAoC,CAAC;AAQhE,KAAK,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEzG,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,mFAAmF;IACnF,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAG9E;AAED,wBAAgB,sBAAsB,SAQrC;AAWD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,GAAG,KAAK,MAAM,EAAE,CAS3D;AAwHD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoB/G;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,SAAS,GAAG,cAAc,CAAC;CACpC;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BhF;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYhE;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAYhD"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { createPublicClient, createWalletClient, http, keccak256, stringToHex, parseAbi, zeroAddress } from "viem";
|
|
2
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
3
|
+
import { pharosNetwork } from "../pharosClient.js";
|
|
4
|
+
import { auditLog } from "../auditLog.js";
|
|
5
|
+
import { readJsonFile, stateFile, writeJsonFileAtomic } from "../persistentJsonStore.js";
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the SafeHandsAttestation contract address (SAFEHANDS_ATTESTATION_ADDRESS
|
|
8
|
+
* only). The legacy SAFEHANDS_RISK_REGISTRY_ADDRESS var aliases the REGISTRY
|
|
9
|
+
* contract, not this ledger — accepting it here pointed attestation calls at the
|
|
10
|
+
* wrong contract (ABI-mismatch reverts), so the fallback was removed.
|
|
11
|
+
*/
|
|
12
|
+
function attestationContractAddress() {
|
|
13
|
+
return process.env.SAFEHANDS_ATTESTATION_ADDRESS;
|
|
14
|
+
}
|
|
15
|
+
// Action Types matching the contract
|
|
16
|
+
export const ACTION_PAYMENT = keccak256(stringToHex("PAYMENT"));
|
|
17
|
+
export const ACTION_SWAP = keccak256(stringToHex("SWAP"));
|
|
18
|
+
export const ACTION_BRIDGE = keccak256(stringToHex("BRIDGE"));
|
|
19
|
+
export const ACTION_APPROVAL = keccak256(stringToHex("APPROVAL"));
|
|
20
|
+
export const ACTION_CONTRACT_CALL = keccak256(stringToHex("CONTRACT_CALL"));
|
|
21
|
+
export const ACTION_UNKNOWN = keccak256(stringToHex("UNKNOWN"));
|
|
22
|
+
const attestationAbi = parseAbi([
|
|
23
|
+
"function attest(bytes32 preparedTransactionHash, bytes32 txHash, uint256 chainId, bytes32 actionType, bytes32 policyHash, bytes32 metadataHash, address agent) external",
|
|
24
|
+
"function reputationOf(address agent) view returns (uint256 verifiedCount, uint64 lastAt)",
|
|
25
|
+
"function attestationCountByAgent(address agent) view returns (uint256)"
|
|
26
|
+
]);
|
|
27
|
+
const STORE_PATH = stateFile("attestations.json", "SAFEHANDS_ATTESTATION_STORE_PATH");
|
|
28
|
+
const RETRY_ENABLED = process.env.SAFEHANDS_ATTESTATION_RETRY_ENABLED !== "false";
|
|
29
|
+
const MAX_ATTEMPTS = Number(process.env.SAFEHANDS_ATTESTATION_MAX_ATTEMPTS || 5);
|
|
30
|
+
const RETRY_DELAY_MS = Number(process.env.SAFEHANDS_ATTESTATION_RETRY_DELAY_MS || 60_000);
|
|
31
|
+
const RETRY_INTERVAL_MS = Number(process.env.SAFEHANDS_ATTESTATION_RETRY_INTERVAL_MS || 60_000);
|
|
32
|
+
let state = readJsonFile(STORE_PATH, { records: {} });
|
|
33
|
+
let retryLoopStarted = false;
|
|
34
|
+
function persist() {
|
|
35
|
+
writeJsonFileAtomic(STORE_PATH, state);
|
|
36
|
+
}
|
|
37
|
+
function upsert(record) {
|
|
38
|
+
state.records[record.txHash.toLowerCase()] = record;
|
|
39
|
+
persist();
|
|
40
|
+
}
|
|
41
|
+
export function getAttestationRecord(txHash) {
|
|
42
|
+
state = readJsonFile(STORE_PATH, { records: {} });
|
|
43
|
+
return state.records[txHash.toLowerCase()] ?? null;
|
|
44
|
+
}
|
|
45
|
+
export function checkAttestationConfig() {
|
|
46
|
+
const required = process.env.SAFEHANDS_ATTESTATION_REQUIRED === "true";
|
|
47
|
+
const address = attestationContractAddress();
|
|
48
|
+
const pk = process.env.SAFEHANDS_ATTESTER_PRIVATE_KEY;
|
|
49
|
+
if (required && (!address || !pk)) {
|
|
50
|
+
throw new Error("Attestation required but SAFEHANDS_ATTESTATION_ADDRESS or SAFEHANDS_ATTESTER_PRIVATE_KEY is missing. Aborting broadcast.");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* True only when this process holds both an attestation contract address and an
|
|
55
|
+
* attester signing key. The zero-custody public profile has neither, so there is
|
|
56
|
+
* nothing for the retry loop to publish — arming the timer would just spin.
|
|
57
|
+
*/
|
|
58
|
+
function isAttesterConfigured() {
|
|
59
|
+
return Boolean(attestationContractAddress() && process.env.SAFEHANDS_ATTESTER_PRIVATE_KEY);
|
|
60
|
+
}
|
|
61
|
+
export function classifyAction(parsedTx) {
|
|
62
|
+
if (!parsedTx.data || parsedTx.data === "0x") {
|
|
63
|
+
return ACTION_PAYMENT;
|
|
64
|
+
}
|
|
65
|
+
const selector = parsedTx.data.slice(0, 10);
|
|
66
|
+
if (selector === "0x095ea7b3") { // approve(address,uint256)
|
|
67
|
+
return ACTION_APPROVAL;
|
|
68
|
+
}
|
|
69
|
+
return ACTION_CONTRACT_CALL;
|
|
70
|
+
}
|
|
71
|
+
function makePending(txHash, parsedTx, record) {
|
|
72
|
+
const actionType = classifyAction(parsedTx);
|
|
73
|
+
const policyHash = record.policyVersion ? keccak256(stringToHex(record.policyVersion)) : keccak256(stringToHex("none"));
|
|
74
|
+
const metadataHash = record.evidenceHash ? record.evidenceHash : keccak256(stringToHex("none"));
|
|
75
|
+
const agent = record.from || zeroAddress;
|
|
76
|
+
const now = Date.now();
|
|
77
|
+
return {
|
|
78
|
+
txHash,
|
|
79
|
+
preparedTransactionHash: record.hash,
|
|
80
|
+
chainId: record.chainId,
|
|
81
|
+
actionType,
|
|
82
|
+
policyHash,
|
|
83
|
+
metadataHash,
|
|
84
|
+
agent,
|
|
85
|
+
status: "pending_retry",
|
|
86
|
+
attempts: 0,
|
|
87
|
+
nextAttemptAt: now,
|
|
88
|
+
createdAt: now,
|
|
89
|
+
updatedAt: now,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function attemptPublish(record) {
|
|
93
|
+
const required = process.env.SAFEHANDS_ATTESTATION_REQUIRED === "true";
|
|
94
|
+
const address = attestationContractAddress();
|
|
95
|
+
const pk = process.env.SAFEHANDS_ATTESTER_PRIVATE_KEY;
|
|
96
|
+
if (!address || !pk) {
|
|
97
|
+
record.status = required ? "failed" : "skipped";
|
|
98
|
+
record.updatedAt = Date.now();
|
|
99
|
+
record.lastError = required ? "Attestation required but signer/address missing" : undefined;
|
|
100
|
+
upsert(record);
|
|
101
|
+
return record.status;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
record.status = "pending_retry";
|
|
105
|
+
record.attempts += 1;
|
|
106
|
+
record.updatedAt = Date.now();
|
|
107
|
+
upsert(record);
|
|
108
|
+
const formattedPk = pk.startsWith("0x") ? pk : `0x${pk}`;
|
|
109
|
+
const account = privateKeyToAccount(formattedPk);
|
|
110
|
+
const rpc = process.env.PHAROS_RPC_URL || "https://rpc.pharos.xyz";
|
|
111
|
+
const publicClient = createPublicClient({
|
|
112
|
+
chain: pharosNetwork,
|
|
113
|
+
transport: http(rpc)
|
|
114
|
+
});
|
|
115
|
+
const walletClient = createWalletClient({
|
|
116
|
+
account,
|
|
117
|
+
chain: pharosNetwork,
|
|
118
|
+
transport: http(rpc)
|
|
119
|
+
});
|
|
120
|
+
const { request } = await publicClient.simulateContract({
|
|
121
|
+
address,
|
|
122
|
+
abi: attestationAbi,
|
|
123
|
+
functionName: "attest",
|
|
124
|
+
args: [
|
|
125
|
+
record.preparedTransactionHash,
|
|
126
|
+
record.txHash,
|
|
127
|
+
BigInt(record.chainId),
|
|
128
|
+
record.actionType,
|
|
129
|
+
record.policyHash,
|
|
130
|
+
record.metadataHash,
|
|
131
|
+
record.agent
|
|
132
|
+
],
|
|
133
|
+
account
|
|
134
|
+
});
|
|
135
|
+
const attestationTxHash = await walletClient.writeContract(request);
|
|
136
|
+
record.attestationTxHash = attestationTxHash;
|
|
137
|
+
record.status = "published";
|
|
138
|
+
record.updatedAt = Date.now();
|
|
139
|
+
upsert(record);
|
|
140
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: attestationTxHash });
|
|
141
|
+
record.status = receipt.status === "success" ? "confirmed" : "failed";
|
|
142
|
+
record.updatedAt = Date.now();
|
|
143
|
+
if (receipt.status !== "success")
|
|
144
|
+
record.lastError = "Attestation transaction reverted";
|
|
145
|
+
upsert(record);
|
|
146
|
+
auditLog({
|
|
147
|
+
ts: new Date().toISOString(),
|
|
148
|
+
tool: "publish_attestation",
|
|
149
|
+
success: record.status === "confirmed",
|
|
150
|
+
errorCode: record.status === "confirmed" ? undefined : "ATTESTATION_TX_REVERTED",
|
|
151
|
+
txHash: record.txHash,
|
|
152
|
+
attestationTxHash,
|
|
153
|
+
attempts: record.attempts,
|
|
154
|
+
status: record.status,
|
|
155
|
+
});
|
|
156
|
+
return record.status;
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
160
|
+
record.status = record.attempts >= MAX_ATTEMPTS ? "failed" : "pending_retry";
|
|
161
|
+
record.nextAttemptAt = Date.now() + RETRY_DELAY_MS * Math.max(1, record.attempts);
|
|
162
|
+
record.updatedAt = Date.now();
|
|
163
|
+
record.lastError = message;
|
|
164
|
+
upsert(record);
|
|
165
|
+
auditLog({
|
|
166
|
+
ts: new Date().toISOString(),
|
|
167
|
+
tool: "publish_attestation",
|
|
168
|
+
success: false,
|
|
169
|
+
errorCode: "ATTESTATION_PUBLISH_FAILED",
|
|
170
|
+
txHash: record.txHash,
|
|
171
|
+
attempts: record.attempts,
|
|
172
|
+
nextAttemptAt: record.nextAttemptAt,
|
|
173
|
+
message,
|
|
174
|
+
});
|
|
175
|
+
console.error("Attestation publish failed:", message);
|
|
176
|
+
return record.status;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export async function publishAttestation(txHash, parsedTx, record) {
|
|
180
|
+
const required = process.env.SAFEHANDS_ATTESTATION_REQUIRED === "true";
|
|
181
|
+
const address = attestationContractAddress();
|
|
182
|
+
const pk = process.env.SAFEHANDS_ATTESTER_PRIVATE_KEY;
|
|
183
|
+
if (!address || !pk) {
|
|
184
|
+
const status = required ? "failed" : "skipped";
|
|
185
|
+
if (required) {
|
|
186
|
+
const pending = makePending(txHash, parsedTx, record);
|
|
187
|
+
pending.status = "failed";
|
|
188
|
+
pending.lastError = "Attestation required but signer/address missing";
|
|
189
|
+
pending.updatedAt = Date.now();
|
|
190
|
+
upsert(pending);
|
|
191
|
+
}
|
|
192
|
+
return status;
|
|
193
|
+
}
|
|
194
|
+
const pending = makePending(txHash, parsedTx, record);
|
|
195
|
+
upsert(pending);
|
|
196
|
+
return attemptPublish(pending);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Read an address's on-chain SafeHands reputation (verified-safe broadcast count +
|
|
200
|
+
* recency). Read-only, keyless, composable — any agent can consult this as a trust
|
|
201
|
+
* signal. A zero count means "no track record yet" → treat as NEUTRAL, never as a
|
|
202
|
+
* negative (the ledger only records verified-safe actions). Degrades gracefully to a
|
|
203
|
+
* neutral zero when the contract is unconfigured or the RPC read fails.
|
|
204
|
+
*/
|
|
205
|
+
export async function getAgentReputation(agent) {
|
|
206
|
+
const address = attestationContractAddress();
|
|
207
|
+
const neutral = { agent, verifiedCount: 0, lastAttestationAt: 0 };
|
|
208
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(agent)) {
|
|
209
|
+
return { ...neutral, configured: Boolean(address), source: "unconfigured" };
|
|
210
|
+
}
|
|
211
|
+
if (!address) {
|
|
212
|
+
return { ...neutral, configured: false, source: "unconfigured" };
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const rpc = process.env.PHAROS_RPC_URL || "https://rpc.pharos.xyz";
|
|
216
|
+
const publicClient = createPublicClient({ chain: pharosNetwork, transport: http(rpc) });
|
|
217
|
+
const [verifiedCount, lastAt] = (await publicClient.readContract({
|
|
218
|
+
address,
|
|
219
|
+
abi: attestationAbi,
|
|
220
|
+
functionName: "reputationOf",
|
|
221
|
+
args: [agent],
|
|
222
|
+
}));
|
|
223
|
+
return {
|
|
224
|
+
agent,
|
|
225
|
+
configured: true,
|
|
226
|
+
verifiedCount: Number(verifiedCount),
|
|
227
|
+
lastAttestationAt: Number(lastAt),
|
|
228
|
+
source: "onchain",
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return { ...neutral, configured: true, source: "onchain" };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export async function retryPendingAttestations() {
|
|
236
|
+
state = readJsonFile(STORE_PATH, { records: {} });
|
|
237
|
+
const now = Date.now();
|
|
238
|
+
const records = Object.values(state.records).filter((record) => record.status === "pending_retry" && record.attempts < MAX_ATTEMPTS && record.nextAttemptAt <= now);
|
|
239
|
+
let attempted = 0;
|
|
240
|
+
for (const record of records) {
|
|
241
|
+
attempted += 1;
|
|
242
|
+
await attemptPublish(record);
|
|
243
|
+
}
|
|
244
|
+
return attempted;
|
|
245
|
+
}
|
|
246
|
+
export function startAttestationRetryLoop() {
|
|
247
|
+
if (!RETRY_ENABLED || retryLoopStarted)
|
|
248
|
+
return;
|
|
249
|
+
// Zero-custody profile has no attester key/address: don't arm an unusable timer.
|
|
250
|
+
// If attestation is explicitly required, keep the loop so a late/misconfig gets
|
|
251
|
+
// surfaced via retryPendingAttestations → attemptPublish marking records failed.
|
|
252
|
+
if (!isAttesterConfigured() && process.env.SAFEHANDS_ATTESTATION_REQUIRED !== "true")
|
|
253
|
+
return;
|
|
254
|
+
retryLoopStarted = true;
|
|
255
|
+
setInterval(() => {
|
|
256
|
+
retryPendingAttestations().catch((err) => {
|
|
257
|
+
console.error("Attestation retry loop failed:", err instanceof Error ? err.message : String(err));
|
|
258
|
+
});
|
|
259
|
+
}, RETRY_INTERVAL_MS).unref();
|
|
260
|
+
}
|
|
261
|
+
startAttestationRetryLoop();
|
|
262
|
+
//# sourceMappingURL=attestationPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestationPublisher.js","sourceRoot":"","sources":["../../../src/lib/pharos/attestationPublisher.ts"],"names":[],"mappings":"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"}
|