safehands-pharos 1.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/policies/default.json +15 -0
- package/.env.example +81 -64
- package/README.md +301 -333
- 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 +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +154 -124
- 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 +1 -1
- package/dist/demo.d.ts.map +1 -1
- package/dist/demo.js +206 -171
- package/dist/demo.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +249 -164
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +127 -65
- package/dist/init.js.map +1 -1
- package/dist/lib/analysis/approval.d.ts +29 -0
- package/dist/lib/analysis/approval.d.ts.map +1 -0
- package/dist/lib/analysis/approval.js +162 -0
- package/dist/lib/analysis/approval.js.map +1 -0
- package/dist/lib/analysis/calldata.d.ts +60 -0
- package/dist/lib/analysis/calldata.d.ts.map +1 -0
- package/dist/lib/analysis/calldata.js +349 -0
- package/dist/lib/analysis/calldata.js.map +1 -0
- package/dist/lib/analysis/contractIntel.d.ts +65 -0
- package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
- package/dist/lib/analysis/contractIntel.js +320 -0
- package/dist/lib/analysis/contractIntel.js.map +1 -0
- package/dist/lib/analysis/evm.d.ts +42 -0
- package/dist/lib/analysis/evm.d.ts.map +1 -0
- package/dist/lib/analysis/evm.js +185 -0
- package/dist/lib/analysis/evm.js.map +1 -0
- package/dist/lib/analysis/gas.d.ts +4 -0
- package/dist/lib/analysis/gas.d.ts.map +1 -0
- package/dist/lib/analysis/gas.js +13 -0
- package/dist/lib/analysis/gas.js.map +1 -0
- package/dist/lib/analysis/index.d.ts +11 -0
- package/dist/lib/analysis/index.d.ts.map +1 -0
- package/dist/lib/analysis/index.js +16 -0
- package/dist/lib/analysis/index.js.map +1 -0
- package/dist/lib/analysis/pharosTokens.d.ts +31 -0
- package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
- package/dist/lib/analysis/pharosTokens.js +78 -0
- package/dist/lib/analysis/pharosTokens.js.map +1 -0
- package/dist/lib/analysis/safeTx.d.ts +27 -0
- package/dist/lib/analysis/safeTx.d.ts.map +1 -0
- package/dist/lib/analysis/safeTx.js +118 -0
- package/dist/lib/analysis/safeTx.js.map +1 -0
- package/dist/lib/analysis/token.d.ts +21 -0
- package/dist/lib/analysis/token.d.ts.map +1 -0
- package/dist/lib/analysis/token.js +151 -0
- package/dist/lib/analysis/token.js.map +1 -0
- package/dist/lib/analysis/types.d.ts +49 -0
- package/dist/lib/analysis/types.d.ts.map +1 -0
- package/dist/lib/analysis/types.js +10 -0
- package/dist/lib/analysis/types.js.map +1 -0
- package/dist/lib/analysis/x402.d.ts +24 -0
- package/dist/lib/analysis/x402.d.ts.map +1 -0
- package/dist/lib/analysis/x402.js +60 -0
- package/dist/lib/analysis/x402.js.map +1 -0
- package/dist/lib/auditLog.d.ts +1 -0
- package/dist/lib/auditLog.d.ts.map +1 -1
- package/dist/lib/auditLog.js +0 -0
- package/dist/lib/auditLog.js.map +1 -1
- package/dist/lib/config.d.ts +77 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +120 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +452 -291
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +509 -292
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +101 -78
- package/dist/lib/dodoApi.d.ts.map +1 -1
- package/dist/lib/dodoApi.js +259 -196
- package/dist/lib/dodoApi.js.map +1 -1
- package/dist/lib/ecosystemRegistry.d.ts +116 -0
- package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
- package/dist/lib/ecosystemRegistry.js +178 -0
- package/dist/lib/ecosystemRegistry.js.map +1 -0
- package/dist/lib/envLoader.d.ts +2 -0
- package/dist/lib/envLoader.d.ts.map +1 -0
- package/dist/lib/envLoader.js +65 -0
- package/dist/lib/envLoader.js.map +1 -0
- 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 +13 -14
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +383 -118
- 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 +53 -58
- package/dist/lib/pharosClient.d.ts.map +1 -1
- package/dist/lib/pharosClient.js +56 -63
- package/dist/lib/pharosClient.js.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.d.ts +89 -53
- package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
- package/dist/lib/policy/actionPolicyEngine.js +373 -212
- 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 +45 -26
- package/dist/lib/riskEngine.d.ts.map +1 -1
- package/dist/lib/riskEngine.js +346 -283
- 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 +24 -24
- package/dist/lib/signer/index.d.ts.map +1 -1
- package/dist/lib/signer/index.js +110 -88
- 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 +30 -25
- package/dist/lib/toolResponse.d.ts.map +1 -1
- package/dist/lib/toolResponse.js +57 -53
- 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 +33 -37
- package/dist/lib/wallet/index.d.ts.map +1 -1
- package/dist/lib/wallet/index.js +141 -128
- 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 +66 -45
- package/dist/tools/approveToken.d.ts.map +1 -1
- package/dist/tools/approveToken.js +152 -85
- package/dist/tools/approveToken.js.map +1 -1
- package/dist/tools/assessRisk.d.ts +66 -79
- package/dist/tools/assessRisk.d.ts.map +1 -1
- package/dist/tools/assessRisk.js +63 -104
- package/dist/tools/assessRisk.js.map +1 -1
- package/dist/tools/checkAllowance.d.ts +49 -43
- package/dist/tools/checkAllowance.d.ts.map +1 -1
- package/dist/tools/checkAllowance.js +78 -56
- package/dist/tools/checkAllowance.js.map +1 -1
- package/dist/tools/checkTokenSecurity.d.ts +103 -46
- package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
- package/dist/tools/checkTokenSecurity.js +240 -95
- package/dist/tools/checkTokenSecurity.js.map +1 -1
- package/dist/tools/createAgentWallet.d.ts +30 -26
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +87 -58
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +84 -79
- package/dist/tools/estimateGas.d.ts.map +1 -1
- package/dist/tools/estimateGas.js +130 -124
- package/dist/tools/estimateGas.js.map +1 -1
- package/dist/tools/executeSwap.d.ts +109 -61
- package/dist/tools/executeSwap.d.ts.map +1 -1
- package/dist/tools/executeSwap.js +289 -141
- package/dist/tools/executeSwap.js.map +1 -1
- package/dist/tools/explainRisk.d.ts +29 -29
- package/dist/tools/explainRisk.d.ts.map +1 -1
- package/dist/tools/explainRisk.js +33 -32
- 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 +21 -21
- package/dist/tools/getAgentWallet.d.ts.map +1 -1
- package/dist/tools/getAgentWallet.js +37 -27
- package/dist/tools/getAgentWallet.js.map +1 -1
- package/dist/tools/getAgentWalletBalance.d.ts +11 -11
- package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
- package/dist/tools/getAgentWalletBalance.js +102 -70
- package/dist/tools/getAgentWalletBalance.js.map +1 -1
- package/dist/tools/getExecutionHistory.d.ts +49 -49
- package/dist/tools/getExecutionHistory.d.ts.map +1 -1
- package/dist/tools/getExecutionHistory.js +148 -154
- package/dist/tools/getExecutionHistory.js.map +1 -1
- package/dist/tools/getGasPrice.d.ts +43 -43
- package/dist/tools/getGasPrice.d.ts.map +0 -0
- package/dist/tools/getGasPrice.js +59 -59
- package/dist/tools/getGasPrice.js.map +1 -1
- package/dist/tools/getPoolInfo.d.ts +75 -75
- package/dist/tools/getPoolInfo.d.ts.map +1 -1
- package/dist/tools/getPoolInfo.js +142 -137
- 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 +56 -113
- package/dist/tools/getTokenPrice.d.ts.map +1 -1
- package/dist/tools/getTokenPrice.js +110 -117
- package/dist/tools/getTokenPrice.js.map +1 -1
- package/dist/tools/getTransactionStatus.d.ts +43 -43
- package/dist/tools/getTransactionStatus.d.ts.map +0 -0
- package/dist/tools/getTransactionStatus.js +59 -59
- package/dist/tools/getTransactionStatus.js.map +0 -0
- package/dist/tools/getWalletBalance.d.ts +103 -68
- package/dist/tools/getWalletBalance.d.ts.map +1 -1
- package/dist/tools/getWalletBalance.js +127 -87
- package/dist/tools/getWalletBalance.js.map +1 -1
- package/dist/tools/publishRiskScore.d.ts +85 -63
- package/dist/tools/publishRiskScore.d.ts.map +1 -1
- package/dist/tools/publishRiskScore.js +136 -88
- 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 +38 -38
- package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
- package/dist/tools/queryRiskRegistry.js +59 -55
- package/dist/tools/queryRiskRegistry.js.map +1 -1
- package/dist/tools/safehandsPreflightCheck.d.ts +92 -77
- package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
- package/dist/tools/safehandsPreflightCheck.js +174 -47
- package/dist/tools/safehandsPreflightCheck.js.map +1 -1
- package/dist/tools/safehandsRiskReport.d.ts +96 -81
- package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
- package/dist/tools/safehandsRiskReport.js +48 -28
- package/dist/tools/safehandsRiskReport.js.map +1 -1
- package/dist/tools/safehandsSafeExecute.d.ts +20 -20
- package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
- package/dist/tools/safehandsSafeExecute.js +164 -81
- package/dist/tools/safehandsSafeExecute.js.map +1 -1
- package/dist/tools/safehandsWalletHealth.d.ts +28 -14
- package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
- package/dist/tools/safehandsWalletHealth.js +145 -103
- package/dist/tools/safehandsWalletHealth.js.map +1 -1
- package/dist/tools/safehandsX402Preflight.d.ts +26 -26
- package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
- package/dist/tools/safehandsX402Preflight.js +86 -65
- package/dist/tools/safehandsX402Preflight.js.map +1 -1
- package/dist/tools/sendPayment.d.ts +63 -57
- package/dist/tools/sendPayment.d.ts.map +1 -1
- package/dist/tools/sendPayment.js +144 -117
- 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 +64 -60
- package/dist/tools/simulateTransaction.d.ts.map +1 -1
- package/dist/tools/simulateTransaction.js +116 -83
- package/dist/tools/simulateTransaction.js.map +1 -1
- package/dist/tools/tokenRegistryStatus.d.ts +46 -26
- package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
- package/dist/tools/tokenRegistryStatus.js +126 -96
- 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 +87 -81
- package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
- package/dist/tools/x402PayAndFetch.js +295 -152
- 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 +409 -252
- package/dist/x402Server.js.map +1 -1
- package/docs/REVIEWER_QUICKSTART.md +113 -0
- package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
- package/package.json +130 -83
- 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 -398
- 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
- package/examples/dashboard/index.html +0 -337
- package/examples/pharos-skill-engine/SKILL.safehands.md +0 -85
- package/examples/pharos-skill-engine/assets/safehands/example-actions.json +0 -49
- package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +0 -11
- package/examples/pharos-skill-engine/references/safehands.md +0 -345
- package/examples/scenario-hack.ts +0 -38
- package/skill/SKILL.md +0 -133
- package/skill/assets/safehands/example-actions.json +0 -49
- package/skill/assets/safehands/policy-defaults.json +0 -11
- package/skill/references/safehands.md +0 -345
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { keccak256, stringToHex } from "viem";
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { readJsonFile, stateFile, writeJsonFileAtomic } from "./persistentJsonStore.js";
|
|
4
|
+
const STORE_PATH = stateFile("prepared_transactions.json", "SAFEHANDS_PREPARED_TX_STORE_PATH");
|
|
5
|
+
const EXPIRATION_MS = Number(process.env.SAFEHANDS_PREPARED_TX_TTL_MS || 60 * 60 * 1000);
|
|
6
|
+
let state = loadState();
|
|
7
|
+
function loadState() {
|
|
8
|
+
const loaded = readJsonFile(STORE_PATH, { records: {} });
|
|
9
|
+
cleanupExpired(loaded, Date.now(), false);
|
|
10
|
+
return loaded;
|
|
11
|
+
}
|
|
12
|
+
function persist() {
|
|
13
|
+
writeJsonFileAtomic(STORE_PATH, state);
|
|
14
|
+
}
|
|
15
|
+
function cleanupExpired(target = state, now = Date.now(), shouldPersist = true) {
|
|
16
|
+
let changed = false;
|
|
17
|
+
for (const [id, record] of Object.entries(target.records)) {
|
|
18
|
+
if (record.expiresAt < now) {
|
|
19
|
+
delete target.records[id];
|
|
20
|
+
changed = true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (changed && shouldPersist)
|
|
24
|
+
persist();
|
|
25
|
+
}
|
|
26
|
+
// Bound the store so an anonymous flood of /wallet/prepare writes cannot grow
|
|
27
|
+
// it without limit between TTL sweeps. Evicts oldest-created first. (Public-scale
|
|
28
|
+
// deployments should back this with Redis/Postgres rather than a JSON file.)
|
|
29
|
+
const MAX_PREPARED_TX_RECORDS = Number(process.env.SAFEHANDS_PREPARED_TX_MAX || 5000);
|
|
30
|
+
function enforceStoreCap() {
|
|
31
|
+
const ids = Object.keys(state.records);
|
|
32
|
+
if (ids.length <= MAX_PREPARED_TX_RECORDS)
|
|
33
|
+
return;
|
|
34
|
+
const excess = ids.length - MAX_PREPARED_TX_RECORDS;
|
|
35
|
+
const oldest = ids
|
|
36
|
+
.map((id) => ({ id, createdAt: state.records[id].createdAt ?? 0 }))
|
|
37
|
+
.sort((a, b) => a.createdAt - b.createdAt)
|
|
38
|
+
.slice(0, excess);
|
|
39
|
+
for (const { id } of oldest)
|
|
40
|
+
delete state.records[id];
|
|
41
|
+
}
|
|
42
|
+
export function generatePreparedTransactionHash(from, to, data, value, chainId, decision) {
|
|
43
|
+
const payload = `${from.toLowerCase()}:${to.toLowerCase()}:${data.toLowerCase()}:${value}:${chainId}:${decision}`;
|
|
44
|
+
return keccak256(stringToHex(payload));
|
|
45
|
+
}
|
|
46
|
+
export function savePreparedTx(from, to, data, value, chainId, decision, policyVersion, policyPreset) {
|
|
47
|
+
cleanupExpired();
|
|
48
|
+
const id = randomUUID();
|
|
49
|
+
const hash = generatePreparedTransactionHash(from, to, data, value, chainId, decision);
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const record = {
|
|
52
|
+
id,
|
|
53
|
+
hash,
|
|
54
|
+
from: from.toLowerCase(),
|
|
55
|
+
to: to.toLowerCase(),
|
|
56
|
+
dataHash: keccak256(data),
|
|
57
|
+
value,
|
|
58
|
+
chainId,
|
|
59
|
+
decision,
|
|
60
|
+
policyVersion,
|
|
61
|
+
policyPreset,
|
|
62
|
+
expiresAt: now + EXPIRATION_MS,
|
|
63
|
+
usedAt: null,
|
|
64
|
+
createdAt: now,
|
|
65
|
+
updatedAt: now,
|
|
66
|
+
};
|
|
67
|
+
state.records[id] = record;
|
|
68
|
+
enforceStoreCap();
|
|
69
|
+
persist();
|
|
70
|
+
return record;
|
|
71
|
+
}
|
|
72
|
+
export function getPreparedTx(id) {
|
|
73
|
+
// Reload on read so a restarted process or another single-node lifecycle write
|
|
74
|
+
// is visible without requiring a full application restart.
|
|
75
|
+
state = loadState();
|
|
76
|
+
const record = state.records[id];
|
|
77
|
+
return record ?? null;
|
|
78
|
+
}
|
|
79
|
+
export function markPreparedTxUsed(id) {
|
|
80
|
+
state = loadState();
|
|
81
|
+
const record = state.records[id];
|
|
82
|
+
if (record && !record.usedAt) {
|
|
83
|
+
const now = Date.now();
|
|
84
|
+
record.usedAt = now;
|
|
85
|
+
record.updatedAt = now;
|
|
86
|
+
persist();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
setInterval(() => cleanupExpired(), 5 * 60 * 1000).unref();
|
|
90
|
+
//# sourceMappingURL=preparedTxStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preparedTxStore.js","sourceRoot":"","sources":["../../src/lib/preparedTxStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ContractReader, PriceFeedConfig, PriceProvider, ProviderQuote } from "./types.js";
|
|
2
|
+
export declare const CHAINLINK_PUSH_FEED_ABI: readonly [{
|
|
3
|
+
readonly name: "latestAnswer";
|
|
4
|
+
readonly type: "function";
|
|
5
|
+
readonly stateMutability: "view";
|
|
6
|
+
readonly inputs: readonly [];
|
|
7
|
+
readonly outputs: readonly [{
|
|
8
|
+
readonly type: "int256";
|
|
9
|
+
}];
|
|
10
|
+
}, {
|
|
11
|
+
readonly name: "latestTimestamp";
|
|
12
|
+
readonly type: "function";
|
|
13
|
+
readonly stateMutability: "view";
|
|
14
|
+
readonly inputs: readonly [];
|
|
15
|
+
readonly outputs: readonly [{
|
|
16
|
+
readonly type: "uint256";
|
|
17
|
+
}];
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "getFeedId";
|
|
20
|
+
readonly type: "function";
|
|
21
|
+
readonly stateMutability: "view";
|
|
22
|
+
readonly inputs: readonly [];
|
|
23
|
+
readonly outputs: readonly [{
|
|
24
|
+
readonly type: "bytes32";
|
|
25
|
+
}];
|
|
26
|
+
}];
|
|
27
|
+
export declare class ChainlinkPushProvider implements PriceProvider {
|
|
28
|
+
readonly kind: "chainlink-push";
|
|
29
|
+
readonly label = "Chainlink Push Engine feed on Pharos";
|
|
30
|
+
private readonly reader;
|
|
31
|
+
constructor(reader?: ContractReader);
|
|
32
|
+
fetchQuote(feed: PriceFeedConfig): Promise<ProviderQuote>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=chainlinkPushProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainlinkPushProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/price/chainlinkPushProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhG,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;EAMlC,CAAC;AAEH,qBAAa,qBAAsB,YAAW,aAAa;IACzD,QAAQ,CAAC,IAAI,EAAG,gBAAgB,CAAU;IAC1C,QAAQ,CAAC,KAAK,0CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,CAAC,EAAE,cAAc;IAI7B,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;CAchE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// ─── Chainlink Push Engine Provider ────────────────────────────────────
|
|
2
|
+
// Reads latestAnswer/latestTimestamp live from Chainlink Push Engine feed
|
|
3
|
+
// contracts on Pharos via viem eth_call.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { parseAbi } from "viem";
|
|
6
|
+
import { publicClient } from "../pharosClient.js";
|
|
7
|
+
export const CHAINLINK_PUSH_FEED_ABI = parseAbi([
|
|
8
|
+
"function latestAnswer() view returns (int256)",
|
|
9
|
+
"function latestTimestamp() view returns (uint256)",
|
|
10
|
+
// Declared for verification tooling only — never called per price request;
|
|
11
|
+
// feed identity is static registry config.
|
|
12
|
+
"function getFeedId() view returns (bytes32)",
|
|
13
|
+
]);
|
|
14
|
+
export class ChainlinkPushProvider {
|
|
15
|
+
kind = "chainlink-push";
|
|
16
|
+
label = "Chainlink Push Engine feed on Pharos";
|
|
17
|
+
reader;
|
|
18
|
+
constructor(reader) {
|
|
19
|
+
this.reader = reader ?? publicClient;
|
|
20
|
+
}
|
|
21
|
+
async fetchQuote(feed) {
|
|
22
|
+
// Sequential on purpose: the public Pharos RPC rate-limits parallel eth_call bursts.
|
|
23
|
+
const answer = (await this.reader.readContract({
|
|
24
|
+
address: feed.feedAddress,
|
|
25
|
+
abi: CHAINLINK_PUSH_FEED_ABI,
|
|
26
|
+
functionName: "latestAnswer",
|
|
27
|
+
}));
|
|
28
|
+
const updatedAt = (await this.reader.readContract({
|
|
29
|
+
address: feed.feedAddress,
|
|
30
|
+
abi: CHAINLINK_PUSH_FEED_ABI,
|
|
31
|
+
functionName: "latestTimestamp",
|
|
32
|
+
}));
|
|
33
|
+
return { answer, updatedAtUnix: Number(updatedAt) };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=chainlinkPushProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chainlinkPushProvider.js","sourceRoot":"","sources":["../../../src/lib/price/chainlinkPushProvider.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,yCAAyC;AACzC,2EAA2E;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC9C,+CAA+C;IAC/C,mDAAmD;IACnD,2EAA2E;IAC3E,2CAA2C;IAC3C,6CAA6C;CAC9C,CAAC,CAAC;AAEH,MAAM,OAAO,qBAAqB;IACvB,IAAI,GAAG,gBAAyB,CAAC;IACjC,KAAK,GAAG,sCAAsC,CAAC;IACvC,MAAM,CAAiB;IAExC,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAK,YAA0C,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAqB;QACpC,qFAAqF;QACrF,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,uBAAuB;YAC5B,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAW,CAAC;QACd,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,uBAAuB;YAC5B,YAAY,EAAE,iBAAiB;SAChC,CAAC,CAAW,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PriceFeedConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pacific Mainnet (1672) Chainlink Push Engine feeds — derived from the
|
|
4
|
+
* canonical ecosystem registry (src/data/ecosystemRegistry.data.ts) so the
|
|
5
|
+
* price resolver and the Anvita hosted-skill assets share one feed set.
|
|
6
|
+
*/
|
|
7
|
+
export declare const PACIFIC_MAINNET_PRICE_FEEDS: Record<string, PriceFeedConfig>;
|
|
8
|
+
/** No published Push Engine feed addresses for Atlantic testnet — fail closed. */
|
|
9
|
+
export declare const ATLANTIC_TESTNET_PRICE_FEEDS: Record<string, PriceFeedConfig>;
|
|
10
|
+
/**
|
|
11
|
+
* Wrapped/native aliases → canonical feed key. WBTC is NOT aliased to BTC:
|
|
12
|
+
* a dedicated WBTC/USD feed exists on Pacific Mainnet.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PRICE_FEED_ALIASES: Record<string, string>;
|
|
15
|
+
export declare function activePriceFeeds(): Record<string, PriceFeedConfig>;
|
|
16
|
+
export interface FeedLookup {
|
|
17
|
+
requested: string;
|
|
18
|
+
canonical: string;
|
|
19
|
+
aliased: boolean;
|
|
20
|
+
feed: PriceFeedConfig;
|
|
21
|
+
}
|
|
22
|
+
/** Case-insensitive symbol → feed lookup with alias mapping; null if not configured for the active network. */
|
|
23
|
+
export declare function resolveFeedSymbol(symbol: string): FeedLookup | null;
|
|
24
|
+
/** Symbols the active network can price (canonical feeds + configured aliases). */
|
|
25
|
+
export declare function pricedSymbolsForActiveNetwork(): string[];
|
|
26
|
+
//# sourceMappingURL=feedRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedRegistry.d.ts","sourceRoot":"","sources":["../../../src/lib/price/feedRegistry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAiBlD;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAOpE,CAAC;AAEL,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM,CAAC;AAEhF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC;AAEF,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAElE;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAMnE;AAED,mFAAmF;AACnF,wBAAgB,6BAA6B,IAAI,MAAM,EAAE,CAMxD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// ─── Price Feed Registry ───────────────────────────────────────────────
|
|
2
|
+
// Network-keyed oracle feed configuration. Feed addresses/decimals/heartbeats
|
|
3
|
+
// are static config; prices are ALWAYS read live from the feed contracts.
|
|
4
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
5
|
+
import { getActiveNetwork } from "../networks.js";
|
|
6
|
+
import { ECOSYSTEM_REGISTRY_ITEMS } from "../../data/ecosystemRegistry.data.js";
|
|
7
|
+
const CHAINLINK_PUSH_DOCS = "Chainlink Push Engine Feeds on Pharos Pacific Mainnet (docs.pharos.xyz)";
|
|
8
|
+
function pushFeed(base, feedAddress) {
|
|
9
|
+
return {
|
|
10
|
+
pair: `${base}/USD`,
|
|
11
|
+
base,
|
|
12
|
+
quote: "USD",
|
|
13
|
+
feedAddress,
|
|
14
|
+
decimals: 18,
|
|
15
|
+
heartbeatSeconds: 3600,
|
|
16
|
+
provider: "chainlink-push",
|
|
17
|
+
docsSource: CHAINLINK_PUSH_DOCS,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Pacific Mainnet (1672) Chainlink Push Engine feeds — derived from the
|
|
22
|
+
* canonical ecosystem registry (src/data/ecosystemRegistry.data.ts) so the
|
|
23
|
+
* price resolver and the Anvita hosted-skill assets share one feed set.
|
|
24
|
+
*/
|
|
25
|
+
export const PACIFIC_MAINNET_PRICE_FEEDS = (() => {
|
|
26
|
+
const item = ECOSYSTEM_REGISTRY_ITEMS.find((i) => i.id === "oracle:pacific-mainnet:chainlink-push-feeds");
|
|
27
|
+
const feeds = {};
|
|
28
|
+
for (const c of item?.contracts ?? []) {
|
|
29
|
+
if (c.symbol)
|
|
30
|
+
feeds[c.symbol] = pushFeed(c.symbol, c.address);
|
|
31
|
+
}
|
|
32
|
+
return feeds;
|
|
33
|
+
})();
|
|
34
|
+
/** No published Push Engine feed addresses for Atlantic testnet — fail closed. */
|
|
35
|
+
export const ATLANTIC_TESTNET_PRICE_FEEDS = {};
|
|
36
|
+
/**
|
|
37
|
+
* Wrapped/native aliases → canonical feed key. WBTC is NOT aliased to BTC:
|
|
38
|
+
* a dedicated WBTC/USD feed exists on Pacific Mainnet.
|
|
39
|
+
*/
|
|
40
|
+
export const PRICE_FEED_ALIASES = {
|
|
41
|
+
WPROS: "PROS",
|
|
42
|
+
WETH: "ETH",
|
|
43
|
+
// Pharos is the network/ecosystem; PROS is the token. Priced via the PROS/USD
|
|
44
|
+
// feed. Matches supported-assets.json + the Anvita engine.
|
|
45
|
+
PHAROS: "PROS",
|
|
46
|
+
};
|
|
47
|
+
export function activePriceFeeds() {
|
|
48
|
+
return getActiveNetwork().isMainnet ? PACIFIC_MAINNET_PRICE_FEEDS : ATLANTIC_TESTNET_PRICE_FEEDS;
|
|
49
|
+
}
|
|
50
|
+
/** Case-insensitive symbol → feed lookup with alias mapping; null if not configured for the active network. */
|
|
51
|
+
export function resolveFeedSymbol(symbol) {
|
|
52
|
+
const requested = symbol.trim().toUpperCase();
|
|
53
|
+
const canonical = PRICE_FEED_ALIASES[requested] ?? requested;
|
|
54
|
+
const feed = activePriceFeeds()[canonical];
|
|
55
|
+
if (!feed)
|
|
56
|
+
return null;
|
|
57
|
+
return { requested, canonical, aliased: canonical !== requested, feed };
|
|
58
|
+
}
|
|
59
|
+
/** Symbols the active network can price (canonical feeds + configured aliases). */
|
|
60
|
+
export function pricedSymbolsForActiveNetwork() {
|
|
61
|
+
const canonical = Object.keys(activePriceFeeds());
|
|
62
|
+
const aliases = Object.entries(PRICE_FEED_ALIASES)
|
|
63
|
+
.filter(([, target]) => canonical.includes(target))
|
|
64
|
+
.map(([alias]) => alias);
|
|
65
|
+
return [...canonical, ...aliases].sort();
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=feedRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedRegistry.js","sourceRoot":"","sources":["../../../src/lib/price/feedRegistry.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,2EAA2E;AAE3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,MAAM,mBAAmB,GAAG,yEAAyE,CAAC;AAEtG,SAAS,QAAQ,CAAC,IAAY,EAAE,WAA0B;IACxD,OAAO;QACL,IAAI,EAAE,GAAG,IAAI,MAAM;QACnB,IAAI;QACJ,KAAK,EAAE,KAAK;QACZ,WAAW;QACX,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,gBAAgB;QAC1B,UAAU,EAAE,mBAAmB;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAoC,CAAC,GAAG,EAAE;IAChF,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,6CAA6C,CAAC,CAAC;IAC1G,MAAM,KAAK,GAAoC,EAAE,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,CAAC,MAAM;YAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,EAAE,CAAC;AAEL,kFAAkF;AAClF,MAAM,CAAC,MAAM,4BAA4B,GAAoC,EAAE,CAAC;AAEhF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,KAAK;IACX,8EAA8E;IAC9E,2DAA2D;IAC3D,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC9B,OAAO,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,4BAA4B,CAAC;AACnG,CAAC;AASD,+GAA+G;AAC/G,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1E,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,6BAA6B;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PriceFeedProviderKind, PriceProvider, PriceResolverResult } from "./types.js";
|
|
2
|
+
export declare const PRICE_CACHE_TTL_MS = 45000;
|
|
3
|
+
export declare const DEGRADED_CACHE_MAX_AGE_MS = 300000;
|
|
4
|
+
export interface ResolvePriceOptions {
|
|
5
|
+
cacheTtlMs?: number;
|
|
6
|
+
/** Set false to disable rpc_degraded_cache serves and strictly fail on RPC errors. */
|
|
7
|
+
allowDegradedCache?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class PriceResolver {
|
|
10
|
+
private readonly providers;
|
|
11
|
+
private readonly now;
|
|
12
|
+
private readonly cache;
|
|
13
|
+
private readonly inflight;
|
|
14
|
+
constructor(providers: Partial<Record<PriceFeedProviderKind, PriceProvider>>, now?: () => number);
|
|
15
|
+
clearCache(): void;
|
|
16
|
+
resolvePriceUsd(symbol: string, opts?: ResolvePriceOptions): Promise<PriceResolverResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Serve a cached resolution if it is within maxAgeMs AND the original oracle
|
|
19
|
+
* timestamp is still within the feed heartbeat. Returns null otherwise.
|
|
20
|
+
*/
|
|
21
|
+
private serveFromCache;
|
|
22
|
+
private fetchLive;
|
|
23
|
+
private invalid;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Process-wide singleton wired to the live publicClient. Only implemented
|
|
27
|
+
* providers are registered — the Supra pull provider is a stub
|
|
28
|
+
* (src/lib/price/supraProvider.ts) and is deliberately NOT registered; a feed
|
|
29
|
+
* configured for "supra-pull" fails closed with a structured
|
|
30
|
+
* PRICE_SOURCE_UNAVAILABLE ("no provider registered") instead of advertising an
|
|
31
|
+
* unimplemented source.
|
|
32
|
+
*/
|
|
33
|
+
export declare const priceResolver: PriceResolver;
|
|
34
|
+
export declare function resolvePriceUsd(symbol: string, opts?: ResolvePriceOptions): Promise<PriceResolverResult>;
|
|
35
|
+
//# sourceMappingURL=priceResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priceResolver.d.ts","sourceRoot":"","sources":["../../../src/lib/price/priceResolver.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,aAAa,EAEb,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,yBAAyB,SAAU,CAAC;AAQjD,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAqDD,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IALtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmD;gBAGzD,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC,EAChE,GAAG,GAAE,MAAM,MAAiB;IAG/C,UAAU,IAAI,IAAI;IAIZ,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAwC/F;;;OAGG;IACH,OAAO,CAAC,cAAc;YAwBR,SAAS;IAiGvB,OAAO,CAAC,OAAO;CAYhB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,eAExB,CAAC;AAEH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAExG"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
// ─── PriceResolver ─────────────────────────────────────────────────────
|
|
2
|
+
// Canonical USD price resolution: live oracle reads + validation + bounded
|
|
3
|
+
// per-feed cache + structured error classification. Never fabricates prices;
|
|
4
|
+
// never assumes stablecoins equal exactly 1 USD.
|
|
5
|
+
//
|
|
6
|
+
// Cache semantics:
|
|
7
|
+
// - Fresh serve: entry younger than the TTL AND the oracle timestamp still
|
|
8
|
+
// within heartbeat → sourceStatus "ok", confidence "high".
|
|
9
|
+
// - Degraded serve (RPC failed transiently): allowed ONLY after a previous
|
|
10
|
+
// successful oracle read, cache age <= 5 minutes, AND the oracle timestamp
|
|
11
|
+
// still within heartbeat → sourceStatus "rpc_degraded_cache",
|
|
12
|
+
// confidence "degraded". feedStale is never set just because a value came
|
|
13
|
+
// from cache — it means heartbeat violation only.
|
|
14
|
+
// - Otherwise: structured PRICE_SOURCE_* failure with no price.
|
|
15
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
16
|
+
import { formatUnits, BaseError, HttpRequestError, RpcRequestError, TimeoutError } from "viem";
|
|
17
|
+
import { getActiveNetwork } from "../networks.js";
|
|
18
|
+
import { CHAIN_ID } from "../constants.js";
|
|
19
|
+
import { resolveFeedSymbol, pricedSymbolsForActiveNetwork } from "./feedRegistry.js";
|
|
20
|
+
import { ChainlinkPushProvider } from "./chainlinkPushProvider.js";
|
|
21
|
+
export const PRICE_CACHE_TTL_MS = 45_000; // fresh-serve window (mandated 30–60s)
|
|
22
|
+
export const DEGRADED_CACHE_MAX_AGE_MS = 300_000; // hard bound for rpc_degraded_cache serves
|
|
23
|
+
const MAX_FUTURE_SKEW_SECONDS = 300;
|
|
24
|
+
function classifyPriceSourceError(err) {
|
|
25
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
26
|
+
const lower = message.toLowerCase();
|
|
27
|
+
// viem readContract failures arrive as ContractFunctionExecutionError wrapping
|
|
28
|
+
// the transport error; walk the chain, but also match the top-level message —
|
|
29
|
+
// the fallback transport can rewrap and viem embeds status text in `details`.
|
|
30
|
+
const walked = err instanceof BaseError
|
|
31
|
+
? err.walk((e) => e instanceof HttpRequestError || e instanceof RpcRequestError || e instanceof TimeoutError)
|
|
32
|
+
: undefined;
|
|
33
|
+
const httpStatus = walked instanceof HttpRequestError ? walked.status : undefined;
|
|
34
|
+
const rpcCode = walked instanceof RpcRequestError ? walked.code : undefined;
|
|
35
|
+
const rateLimited = httpStatus === 429 ||
|
|
36
|
+
rpcCode === -32005 || // JSON-RPC "limit exceeded" (EIP-1474)
|
|
37
|
+
rpcCode === -32016 || // provider-specific throttle code
|
|
38
|
+
/\b429\b/.test(lower) ||
|
|
39
|
+
lower.includes("rate limit") ||
|
|
40
|
+
lower.includes("rate-limit") ||
|
|
41
|
+
lower.includes("too many requests") ||
|
|
42
|
+
lower.includes("compute unit") ||
|
|
43
|
+
lower.includes("cu limit") ||
|
|
44
|
+
lower.includes("capacity exceeded") ||
|
|
45
|
+
lower.includes("request limit") ||
|
|
46
|
+
lower.includes("quota");
|
|
47
|
+
if (rateLimited) {
|
|
48
|
+
return { code: "PRICE_SOURCE_RATE_LIMITED", retryable: true, message };
|
|
49
|
+
}
|
|
50
|
+
if (lower.includes("supra_provider_not_implemented")) {
|
|
51
|
+
return { code: "PRICE_SOURCE_UNAVAILABLE", retryable: false, message };
|
|
52
|
+
}
|
|
53
|
+
// Zero-data/revert at the feed address means a wrong or absent contract —
|
|
54
|
+
// a configuration problem, not a transient outage.
|
|
55
|
+
if (lower.includes("returned no data") || lower.includes("zero data") || lower.includes("reverted")) {
|
|
56
|
+
return { code: "PRICE_SOURCE_INVALID", retryable: false, message };
|
|
57
|
+
}
|
|
58
|
+
// Timeouts, aborts, network failures, 5xx → transient unavailability.
|
|
59
|
+
return { code: "PRICE_SOURCE_UNAVAILABLE", retryable: true, message };
|
|
60
|
+
}
|
|
61
|
+
export class PriceResolver {
|
|
62
|
+
providers;
|
|
63
|
+
now;
|
|
64
|
+
cache = new Map();
|
|
65
|
+
inflight = new Map();
|
|
66
|
+
constructor(providers, now = Date.now) {
|
|
67
|
+
this.providers = providers;
|
|
68
|
+
this.now = now;
|
|
69
|
+
}
|
|
70
|
+
clearCache() {
|
|
71
|
+
this.cache.clear();
|
|
72
|
+
}
|
|
73
|
+
async resolvePriceUsd(symbol, opts) {
|
|
74
|
+
const lookup = resolveFeedSymbol(symbol);
|
|
75
|
+
if (!lookup) {
|
|
76
|
+
const network = getActiveNetwork().name;
|
|
77
|
+
const configured = pricedSymbolsForActiveNetwork();
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
error: {
|
|
81
|
+
code: "PRICE_FEED_NOT_CONFIGURED",
|
|
82
|
+
message: `${symbol} has no price feed configured for ${network} (${CHAIN_ID}). Configured symbols: ${configured.length > 0 ? configured.join(", ") : "none"}. No fallback price was fabricated.`,
|
|
83
|
+
retryable: false,
|
|
84
|
+
provider: "none",
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const key = `${getActiveNetwork().name}:${lookup.feed.pair}`;
|
|
89
|
+
const ttlMs = opts?.cacheTtlMs ?? PRICE_CACHE_TTL_MS;
|
|
90
|
+
const fresh = this.serveFromCache(key, lookup, ttlMs, "ok");
|
|
91
|
+
if (fresh)
|
|
92
|
+
return { ok: true, resolution: fresh };
|
|
93
|
+
const inflight = this.inflight.get(key);
|
|
94
|
+
if (inflight) {
|
|
95
|
+
const shared = await inflight;
|
|
96
|
+
if (shared.ok) {
|
|
97
|
+
return { ok: true, resolution: { ...shared.resolution, token: lookup.requested } };
|
|
98
|
+
}
|
|
99
|
+
return shared;
|
|
100
|
+
}
|
|
101
|
+
const pending = this.fetchLive(key, lookup, opts).finally(() => {
|
|
102
|
+
this.inflight.delete(key);
|
|
103
|
+
});
|
|
104
|
+
this.inflight.set(key, pending);
|
|
105
|
+
return pending;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Serve a cached resolution if it is within maxAgeMs AND the original oracle
|
|
109
|
+
* timestamp is still within the feed heartbeat. Returns null otherwise.
|
|
110
|
+
*/
|
|
111
|
+
serveFromCache(key, lookup, maxAgeMs, mode) {
|
|
112
|
+
const entry = this.cache.get(key);
|
|
113
|
+
if (!entry)
|
|
114
|
+
return null;
|
|
115
|
+
const nowMs = this.now();
|
|
116
|
+
const cacheAgeMs = nowMs - entry.fetchedAtMs;
|
|
117
|
+
if (cacheAgeMs < 0 || cacheAgeMs > maxAgeMs)
|
|
118
|
+
return null;
|
|
119
|
+
const feedAgeSeconds = Math.max(0, Math.floor(nowMs / 1000) - entry.resolution.updatedAtUnix);
|
|
120
|
+
if (feedAgeSeconds > lookup.feed.heartbeatSeconds)
|
|
121
|
+
return null;
|
|
122
|
+
return {
|
|
123
|
+
...entry.resolution,
|
|
124
|
+
token: lookup.requested,
|
|
125
|
+
cached: true,
|
|
126
|
+
cacheAgeSeconds: Math.floor(cacheAgeMs / 1000),
|
|
127
|
+
feedAgeSeconds,
|
|
128
|
+
sourceStatus: mode,
|
|
129
|
+
confidence: mode === "ok" ? "high" : "degraded",
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async fetchLive(key, lookup, opts) {
|
|
133
|
+
const feed = lookup.feed;
|
|
134
|
+
const provider = this.providers[feed.provider];
|
|
135
|
+
if (!provider) {
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
error: {
|
|
139
|
+
code: "PRICE_SOURCE_UNAVAILABLE",
|
|
140
|
+
message: `No ${feed.provider} provider is registered for ${feed.pair}.`,
|
|
141
|
+
retryable: false,
|
|
142
|
+
provider: feed.provider,
|
|
143
|
+
pair: feed.pair,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const quote = await provider.fetchQuote(feed);
|
|
149
|
+
const nowSec = Math.floor(this.now() / 1000);
|
|
150
|
+
if (quote.answer <= 0n) {
|
|
151
|
+
return this.invalid(feed, `latestAnswer ${quote.answer} is not a positive value`);
|
|
152
|
+
}
|
|
153
|
+
if (!Number.isFinite(quote.updatedAtUnix) ||
|
|
154
|
+
quote.updatedAtUnix <= 0 ||
|
|
155
|
+
quote.updatedAtUnix > nowSec + MAX_FUTURE_SKEW_SECONDS) {
|
|
156
|
+
return this.invalid(feed, `latestTimestamp ${quote.updatedAtUnix} is zero or implausible`);
|
|
157
|
+
}
|
|
158
|
+
const feedAgeSeconds = Math.max(0, nowSec - quote.updatedAtUnix);
|
|
159
|
+
if (feedAgeSeconds > feed.heartbeatSeconds) {
|
|
160
|
+
return {
|
|
161
|
+
ok: false,
|
|
162
|
+
error: {
|
|
163
|
+
code: "PRICE_SOURCE_STALE",
|
|
164
|
+
message: `${feed.pair} feed is stale: feed age ${feedAgeSeconds}s exceeds heartbeat ${feed.heartbeatSeconds}s (feed ${feed.feedAddress}).`,
|
|
165
|
+
retryable: true,
|
|
166
|
+
provider: feed.provider,
|
|
167
|
+
pair: feed.pair,
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const priceUsd = formatUnits(quote.answer, feed.decimals);
|
|
172
|
+
const priceUsdNumber = Number(priceUsd);
|
|
173
|
+
if (!Number.isFinite(priceUsdNumber) || priceUsdNumber <= 0) {
|
|
174
|
+
return this.invalid(feed, `latestAnswer did not decode to a finite positive price (${priceUsd})`);
|
|
175
|
+
}
|
|
176
|
+
const resolution = {
|
|
177
|
+
token: lookup.requested,
|
|
178
|
+
canonicalSymbol: lookup.canonical,
|
|
179
|
+
pair: feed.pair,
|
|
180
|
+
priceUsd,
|
|
181
|
+
priceUsdNumber,
|
|
182
|
+
provider: feed.provider,
|
|
183
|
+
source: provider.label,
|
|
184
|
+
sourceStatus: "ok",
|
|
185
|
+
confidence: "high",
|
|
186
|
+
timestamp: new Date(quote.updatedAtUnix * 1000).toISOString(),
|
|
187
|
+
updatedAtUnix: quote.updatedAtUnix,
|
|
188
|
+
feedAgeSeconds,
|
|
189
|
+
feedStale: false,
|
|
190
|
+
cached: false,
|
|
191
|
+
cacheAgeSeconds: null,
|
|
192
|
+
feedAddress: feed.feedAddress,
|
|
193
|
+
heartbeatSeconds: feed.heartbeatSeconds,
|
|
194
|
+
network: getActiveNetwork().name,
|
|
195
|
+
chainId: CHAIN_ID,
|
|
196
|
+
};
|
|
197
|
+
this.cache.set(key, { resolution, fetchedAtMs: this.now() });
|
|
198
|
+
return { ok: true, resolution };
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
const classified = classifyPriceSourceError(err);
|
|
202
|
+
if (classified.retryable && opts?.allowDegradedCache !== false) {
|
|
203
|
+
const degraded = this.serveFromCache(key, lookup, DEGRADED_CACHE_MAX_AGE_MS, "rpc_degraded_cache");
|
|
204
|
+
if (degraded)
|
|
205
|
+
return { ok: true, resolution: degraded };
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
error: {
|
|
210
|
+
code: classified.code,
|
|
211
|
+
message: classified.message,
|
|
212
|
+
retryable: classified.retryable,
|
|
213
|
+
provider: feed.provider,
|
|
214
|
+
pair: feed.pair,
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
invalid(feed, detail) {
|
|
220
|
+
return {
|
|
221
|
+
ok: false,
|
|
222
|
+
error: {
|
|
223
|
+
code: "PRICE_SOURCE_INVALID",
|
|
224
|
+
message: `${feed.pair} feed returned invalid data: ${detail} (feed ${feed.feedAddress}).`,
|
|
225
|
+
retryable: false,
|
|
226
|
+
provider: feed.provider,
|
|
227
|
+
pair: feed.pair,
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Process-wide singleton wired to the live publicClient. Only implemented
|
|
234
|
+
* providers are registered — the Supra pull provider is a stub
|
|
235
|
+
* (src/lib/price/supraProvider.ts) and is deliberately NOT registered; a feed
|
|
236
|
+
* configured for "supra-pull" fails closed with a structured
|
|
237
|
+
* PRICE_SOURCE_UNAVAILABLE ("no provider registered") instead of advertising an
|
|
238
|
+
* unimplemented source.
|
|
239
|
+
*/
|
|
240
|
+
export const priceResolver = new PriceResolver({
|
|
241
|
+
"chainlink-push": new ChainlinkPushProvider(),
|
|
242
|
+
});
|
|
243
|
+
export function resolvePriceUsd(symbol, opts) {
|
|
244
|
+
return priceResolver.resolvePriceUsd(symbol, opts);
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=priceResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priceResolver.js","sourceRoot":"","sources":["../../../src/lib/price/priceResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PriceFeedConfig, PriceProvider, ProviderQuote } from "./types.js";
|
|
2
|
+
export declare const SUPRA_DORA_STORAGE_ADDRESS: "0x58e158c74DF7Ad6396C0dcbadc4878faC9e93d57";
|
|
3
|
+
export declare const SUPRA_DORA_PULL_ADDRESS: "0x16f70cAD28dd621b0072B5A8a8c392970E87C3dD";
|
|
4
|
+
export declare class SupraPullProvider implements PriceProvider {
|
|
5
|
+
readonly kind: "supra-pull";
|
|
6
|
+
readonly label = "Supra DORA pull oracle on Pharos (not yet enabled)";
|
|
7
|
+
fetchQuote(_feed: PriceFeedConfig): Promise<ProviderQuote>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=supraProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supraProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/price/supraProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhF,eAAO,MAAM,0BAA0B,EAAG,4CAAqD,CAAC;AAChG,eAAO,MAAM,uBAAuB,EAAG,4CAAqD,CAAC;AAE7F,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,QAAQ,CAAC,KAAK,wDAAwD;IAEhE,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;CAKjE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// ─── Supra DORA Provider (placeholder) ─────────────────────────────────
|
|
2
|
+
// Supra DORA Pull Oracle is deployed on Pharos, but exact feed IDs / pull
|
|
3
|
+
// payload schema / timestamp semantics are not yet confirmed, so this provider
|
|
4
|
+
// is intentionally a stub. The PriceResolver treats it as an unavailable
|
|
5
|
+
// source; no price is ever fabricated.
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
7
|
+
// Pacific Mainnet deployment (recorded for future Phase 2 wiring).
|
|
8
|
+
export const SUPRA_DORA_STORAGE_ADDRESS = "0x58e158c74DF7Ad6396C0dcbadc4878faC9e93d57";
|
|
9
|
+
export const SUPRA_DORA_PULL_ADDRESS = "0x16f70cAD28dd621b0072B5A8a8c392970E87C3dD";
|
|
10
|
+
export class SupraPullProvider {
|
|
11
|
+
kind = "supra-pull";
|
|
12
|
+
label = "Supra DORA pull oracle on Pharos (not yet enabled)";
|
|
13
|
+
async fetchQuote(_feed) {
|
|
14
|
+
throw new Error("SUPRA_PROVIDER_NOT_IMPLEMENTED: Supra DORA pull provider is a stub until feed IDs and payload schema are confirmed.");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=supraProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supraProvider.js","sourceRoot":"","sources":["../../../src/lib/price/supraProvider.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,+EAA+E;AAC/E,yEAAyE;AACzE,uCAAuC;AACvC,2EAA2E;AAI3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,0BAA0B,GAAG,4CAAqD,CAAC;AAChG,MAAM,CAAC,MAAM,uBAAuB,GAAG,4CAAqD,CAAC;AAE7F,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,YAAqB,CAAC;IAC7B,KAAK,GAAG,oDAAoD,CAAC;IAEtE,KAAK,CAAC,UAAU,CAAC,KAAsB;QACrC,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAC;IACJ,CAAC;CACF"}
|