@terkoizmy/intent-sdk 1.0.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/LICENSE +21 -0
- package/README.md +258 -0
- package/dist/config/chains.d.ts +25 -0
- package/dist/config/chains.d.ts.map +1 -0
- package/dist/config/chains.js +85 -0
- package/dist/config/chains.js.map +1 -0
- package/dist/config/default.d.ts +39 -0
- package/dist/config/default.d.ts.map +1 -0
- package/dist/config/default.js +46 -0
- package/dist/config/default.js.map +1 -0
- package/dist/config/testnets.d.ts +31 -0
- package/dist/config/testnets.d.ts.map +1 -0
- package/dist/config/testnets.js +99 -0
- package/dist/config/testnets.js.map +1 -0
- package/dist/errors/inventory-errors.d.ts +31 -0
- package/dist/errors/inventory-errors.d.ts.map +1 -0
- package/dist/errors/inventory-errors.js +45 -0
- package/dist/errors/inventory-errors.js.map +1 -0
- package/dist/errors/settlement-errors.d.ts +27 -0
- package/dist/errors/settlement-errors.d.ts.map +1 -0
- package/dist/errors/settlement-errors.js +39 -0
- package/dist/errors/settlement-errors.js.map +1 -0
- package/dist/errors/solver-errors.d.ts +45 -0
- package/dist/errors/solver-errors.d.ts.map +1 -0
- package/dist/errors/solver-errors.js +66 -0
- package/dist/errors/solver-errors.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/classifiers/intent-classifier.d.ts +40 -0
- package/dist/parser/classifiers/intent-classifier.d.ts.map +1 -0
- package/dist/parser/classifiers/intent-classifier.js +72 -0
- package/dist/parser/classifiers/intent-classifier.js.map +1 -0
- package/dist/parser/extractors/action.d.ts +32 -0
- package/dist/parser/extractors/action.d.ts.map +1 -0
- package/dist/parser/extractors/action.js +72 -0
- package/dist/parser/extractors/action.js.map +1 -0
- package/dist/parser/extractors/amount.d.ts +39 -0
- package/dist/parser/extractors/amount.d.ts.map +1 -0
- package/dist/parser/extractors/amount.js +113 -0
- package/dist/parser/extractors/amount.js.map +1 -0
- package/dist/parser/extractors/constraints.d.ts +37 -0
- package/dist/parser/extractors/constraints.d.ts.map +1 -0
- package/dist/parser/extractors/constraints.js +119 -0
- package/dist/parser/extractors/constraints.js.map +1 -0
- package/dist/parser/extractors/index.d.ts +5 -0
- package/dist/parser/extractors/index.d.ts.map +1 -0
- package/dist/parser/extractors/index.js +5 -0
- package/dist/parser/extractors/index.js.map +1 -0
- package/dist/parser/extractors/token.d.ts +24 -0
- package/dist/parser/extractors/token.d.ts.map +1 -0
- package/dist/parser/extractors/token.js +124 -0
- package/dist/parser/extractors/token.js.map +1 -0
- package/dist/parser/index.d.ts +125 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +293 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/template/bridge.d.ts +37 -0
- package/dist/parser/template/bridge.d.ts.map +1 -0
- package/dist/parser/template/bridge.js +80 -0
- package/dist/parser/template/bridge.js.map +1 -0
- package/dist/parser/template/claim.d.ts +15 -0
- package/dist/parser/template/claim.d.ts.map +1 -0
- package/dist/parser/template/claim.js +36 -0
- package/dist/parser/template/claim.js.map +1 -0
- package/dist/parser/template/index.d.ts +28 -0
- package/dist/parser/template/index.d.ts.map +1 -0
- package/dist/parser/template/index.js +50 -0
- package/dist/parser/template/index.js.map +1 -0
- package/dist/parser/template/nft.d.ts +3 -0
- package/dist/parser/template/nft.d.ts.map +1 -0
- package/dist/parser/template/nft.js +19 -0
- package/dist/parser/template/nft.js.map +1 -0
- package/dist/parser/template/send.d.ts +24 -0
- package/dist/parser/template/send.d.ts.map +1 -0
- package/dist/parser/template/send.js +61 -0
- package/dist/parser/template/send.js.map +1 -0
- package/dist/parser/template/swap.d.ts +3 -0
- package/dist/parser/template/swap.d.ts.map +1 -0
- package/dist/parser/template/swap.js +21 -0
- package/dist/parser/template/swap.js.map +1 -0
- package/dist/parser/template/unknown.d.ts +3 -0
- package/dist/parser/template/unknown.d.ts.map +1 -0
- package/dist/parser/template/unknown.js +11 -0
- package/dist/parser/template/unknown.js.map +1 -0
- package/dist/parser/template/yield.d.ts +3 -0
- package/dist/parser/template/yield.d.ts.map +1 -0
- package/dist/parser/template/yield.js +25 -0
- package/dist/parser/template/yield.js.map +1 -0
- package/dist/parser/utils/normalize.d.ts +41 -0
- package/dist/parser/utils/normalize.d.ts.map +1 -0
- package/dist/parser/utils/normalize.js +71 -0
- package/dist/parser/utils/normalize.js.map +1 -0
- package/dist/parser/utils/parser-helpers.d.ts +20 -0
- package/dist/parser/utils/parser-helpers.d.ts.map +1 -0
- package/dist/parser/utils/parser-helpers.js +282 -0
- package/dist/parser/utils/parser-helpers.js.map +1 -0
- package/dist/parser/validators/schema.d.ts +14 -0
- package/dist/parser/validators/schema.d.ts.map +1 -0
- package/dist/parser/validators/schema.js +81 -0
- package/dist/parser/validators/schema.js.map +1 -0
- package/dist/sdk-factory.d.ts +55 -0
- package/dist/sdk-factory.d.ts.map +1 -0
- package/dist/sdk-factory.js +49 -0
- package/dist/sdk-factory.js.map +1 -0
- package/dist/services/token-resolver.d.ts +142 -0
- package/dist/services/token-resolver.d.ts.map +1 -0
- package/dist/services/token-resolver.js +254 -0
- package/dist/services/token-resolver.js.map +1 -0
- package/dist/shared/chain-registry/chain-names.d.ts +22 -0
- package/dist/shared/chain-registry/chain-names.d.ts.map +1 -0
- package/dist/shared/chain-registry/chain-names.js +49 -0
- package/dist/shared/chain-registry/chain-names.js.map +1 -0
- package/dist/shared/chain-registry/configs/arbitrum-sepolia.d.ts +9 -0
- package/dist/shared/chain-registry/configs/arbitrum-sepolia.d.ts.map +1 -0
- package/dist/shared/chain-registry/configs/arbitrum-sepolia.js +9 -0
- package/dist/shared/chain-registry/configs/arbitrum-sepolia.js.map +1 -0
- package/dist/shared/chain-registry/configs/base-sepolia.d.ts +9 -0
- package/dist/shared/chain-registry/configs/base-sepolia.d.ts.map +1 -0
- package/dist/shared/chain-registry/configs/base-sepolia.js +9 -0
- package/dist/shared/chain-registry/configs/base-sepolia.js.map +1 -0
- package/dist/shared/chain-registry/configs/ethereum.d.ts +7 -0
- package/dist/shared/chain-registry/configs/ethereum.d.ts.map +1 -0
- package/dist/shared/chain-registry/configs/ethereum.js +7 -0
- package/dist/shared/chain-registry/configs/ethereum.js.map +1 -0
- package/dist/shared/chain-registry/configs/polygon.d.ts +7 -0
- package/dist/shared/chain-registry/configs/polygon.d.ts.map +1 -0
- package/dist/shared/chain-registry/configs/polygon.js +7 -0
- package/dist/shared/chain-registry/configs/polygon.js.map +1 -0
- package/dist/shared/chain-registry/configs/sepolia.d.ts +9 -0
- package/dist/shared/chain-registry/configs/sepolia.d.ts.map +1 -0
- package/dist/shared/chain-registry/configs/sepolia.js +9 -0
- package/dist/shared/chain-registry/configs/sepolia.js.map +1 -0
- package/dist/shared/chain-registry/configs/unichain-sepolia.d.ts +9 -0
- package/dist/shared/chain-registry/configs/unichain-sepolia.d.ts.map +1 -0
- package/dist/shared/chain-registry/configs/unichain-sepolia.js +9 -0
- package/dist/shared/chain-registry/configs/unichain-sepolia.js.map +1 -0
- package/dist/shared/chain-registry/registry.d.ts +50 -0
- package/dist/shared/chain-registry/registry.d.ts.map +1 -0
- package/dist/shared/chain-registry/registry.js +72 -0
- package/dist/shared/chain-registry/registry.js.map +1 -0
- package/dist/shared/rpc/provider-manager.d.ts +111 -0
- package/dist/shared/rpc/provider-manager.d.ts.map +1 -0
- package/dist/shared/rpc/provider-manager.js +116 -0
- package/dist/shared/rpc/provider-manager.js.map +1 -0
- package/dist/shared/rpc/viem-provider.d.ts +78 -0
- package/dist/shared/rpc/viem-provider.d.ts.map +1 -0
- package/dist/shared/rpc/viem-provider.js +187 -0
- package/dist/shared/rpc/viem-provider.js.map +1 -0
- package/dist/shared/token-registry/enrichment.d.ts +48 -0
- package/dist/shared/token-registry/enrichment.d.ts.map +1 -0
- package/dist/shared/token-registry/enrichment.js +69 -0
- package/dist/shared/token-registry/enrichment.js.map +1 -0
- package/dist/shared/token-registry/registry.d.ts +119 -0
- package/dist/shared/token-registry/registry.d.ts.map +1 -0
- package/dist/shared/token-registry/registry.js +200 -0
- package/dist/shared/token-registry/registry.js.map +1 -0
- package/dist/shared/utils/erc20-utils.d.ts +24 -0
- package/dist/shared/utils/erc20-utils.d.ts.map +1 -0
- package/dist/shared/utils/erc20-utils.js +31 -0
- package/dist/shared/utils/erc20-utils.js.map +1 -0
- package/dist/shared/utils/retry.d.ts +57 -0
- package/dist/shared/utils/retry.d.ts.map +1 -0
- package/dist/shared/utils/retry.js +104 -0
- package/dist/shared/utils/retry.js.map +1 -0
- package/dist/shared/wallet-manager/viem-signer.d.ts +68 -0
- package/dist/shared/wallet-manager/viem-signer.d.ts.map +1 -0
- package/dist/shared/wallet-manager/viem-signer.js +116 -0
- package/dist/shared/wallet-manager/viem-signer.js.map +1 -0
- package/dist/shared/wallet-manager/wallet-manager.d.ts +96 -0
- package/dist/shared/wallet-manager/wallet-manager.d.ts.map +1 -0
- package/dist/shared/wallet-manager/wallet-manager.js +104 -0
- package/dist/shared/wallet-manager/wallet-manager.js.map +1 -0
- package/dist/solver/agent/agent-config.d.ts +62 -0
- package/dist/solver/agent/agent-config.d.ts.map +1 -0
- package/dist/solver/agent/agent-config.js +59 -0
- package/dist/solver/agent/agent-config.js.map +1 -0
- package/dist/solver/agent/index.d.ts +6 -0
- package/dist/solver/agent/index.d.ts.map +1 -0
- package/dist/solver/agent/index.js +6 -0
- package/dist/solver/agent/index.js.map +1 -0
- package/dist/solver/agent/liquidity-agent.d.ts +118 -0
- package/dist/solver/agent/liquidity-agent.d.ts.map +1 -0
- package/dist/solver/agent/liquidity-agent.js +285 -0
- package/dist/solver/agent/liquidity-agent.js.map +1 -0
- package/dist/solver/contracts/intent-settlement/index.d.ts +2 -0
- package/dist/solver/contracts/intent-settlement/index.d.ts.map +1 -0
- package/dist/solver/contracts/intent-settlement/index.js +2 -0
- package/dist/solver/contracts/intent-settlement/index.js.map +1 -0
- package/dist/solver/contracts/intent-settlement/intent-settlement.d.ts +22 -0
- package/dist/solver/contracts/intent-settlement/intent-settlement.d.ts.map +1 -0
- package/dist/solver/contracts/intent-settlement/intent-settlement.js +58 -0
- package/dist/solver/contracts/intent-settlement/intent-settlement.js.map +1 -0
- package/dist/solver/contracts/intent-settlement/viem-settlement-contract.d.ts +226 -0
- package/dist/solver/contracts/intent-settlement/viem-settlement-contract.d.ts.map +1 -0
- package/dist/solver/contracts/intent-settlement/viem-settlement-contract.js +204 -0
- package/dist/solver/contracts/intent-settlement/viem-settlement-contract.js.map +1 -0
- package/dist/solver/index.d.ts +87 -0
- package/dist/solver/index.d.ts.map +1 -0
- package/dist/solver/index.js +167 -0
- package/dist/solver/index.js.map +1 -0
- package/dist/solver/inventory/index.d.ts +7 -0
- package/dist/solver/inventory/index.d.ts.map +1 -0
- package/dist/solver/inventory/index.js +7 -0
- package/dist/solver/inventory/index.js.map +1 -0
- package/dist/solver/inventory/inventory-manager.d.ts +135 -0
- package/dist/solver/inventory/inventory-manager.d.ts.map +1 -0
- package/dist/solver/inventory/inventory-manager.js +323 -0
- package/dist/solver/inventory/inventory-manager.js.map +1 -0
- package/dist/solver/inventory/inventory-monitor.d.ts +72 -0
- package/dist/solver/inventory/inventory-monitor.d.ts.map +1 -0
- package/dist/solver/inventory/inventory-monitor.js +123 -0
- package/dist/solver/inventory/inventory-monitor.js.map +1 -0
- package/dist/solver/inventory/rebalancer.d.ts +78 -0
- package/dist/solver/inventory/rebalancer.d.ts.map +1 -0
- package/dist/solver/inventory/rebalancer.js +210 -0
- package/dist/solver/inventory/rebalancer.js.map +1 -0
- package/dist/solver/mempool/index.d.ts +8 -0
- package/dist/solver/mempool/index.d.ts.map +1 -0
- package/dist/solver/mempool/index.js +8 -0
- package/dist/solver/mempool/index.js.map +1 -0
- package/dist/solver/mempool/intent-filter.d.ts +49 -0
- package/dist/solver/mempool/intent-filter.d.ts.map +1 -0
- package/dist/solver/mempool/intent-filter.js +75 -0
- package/dist/solver/mempool/intent-filter.js.map +1 -0
- package/dist/solver/mempool/mempool-client.d.ts +105 -0
- package/dist/solver/mempool/mempool-client.d.ts.map +1 -0
- package/dist/solver/mempool/mempool-client.js +161 -0
- package/dist/solver/mempool/mempool-client.js.map +1 -0
- package/dist/solver/mempool/mempool-monitor.d.ts +71 -0
- package/dist/solver/mempool/mempool-monitor.d.ts.map +1 -0
- package/dist/solver/mempool/mempool-monitor.js +127 -0
- package/dist/solver/mempool/mempool-monitor.js.map +1 -0
- package/dist/solver/mempool/solution-submitter.d.ts +41 -0
- package/dist/solver/mempool/solution-submitter.d.ts.map +1 -0
- package/dist/solver/mempool/solution-submitter.js +71 -0
- package/dist/solver/mempool/solution-submitter.js.map +1 -0
- package/dist/solver/monitoring/alert-manager.d.ts +43 -0
- package/dist/solver/monitoring/alert-manager.d.ts.map +1 -0
- package/dist/solver/monitoring/alert-manager.js +69 -0
- package/dist/solver/monitoring/alert-manager.js.map +1 -0
- package/dist/solver/monitoring/health-checker.d.ts +53 -0
- package/dist/solver/monitoring/health-checker.d.ts.map +1 -0
- package/dist/solver/monitoring/health-checker.js +94 -0
- package/dist/solver/monitoring/health-checker.js.map +1 -0
- package/dist/solver/monitoring/index.d.ts +7 -0
- package/dist/solver/monitoring/index.d.ts.map +1 -0
- package/dist/solver/monitoring/index.js +7 -0
- package/dist/solver/monitoring/index.js.map +1 -0
- package/dist/solver/monitoring/profit-tracker.d.ts +47 -0
- package/dist/solver/monitoring/profit-tracker.d.ts.map +1 -0
- package/dist/solver/monitoring/profit-tracker.js +112 -0
- package/dist/solver/monitoring/profit-tracker.js.map +1 -0
- package/dist/solver/pricing/dynamic-pricing.d.ts +86 -0
- package/dist/solver/pricing/dynamic-pricing.d.ts.map +1 -0
- package/dist/solver/pricing/dynamic-pricing.js +189 -0
- package/dist/solver/pricing/dynamic-pricing.js.map +1 -0
- package/dist/solver/pricing/fee-calculator.d.ts +101 -0
- package/dist/solver/pricing/fee-calculator.d.ts.map +1 -0
- package/dist/solver/pricing/fee-calculator.js +149 -0
- package/dist/solver/pricing/fee-calculator.js.map +1 -0
- package/dist/solver/pricing/index.d.ts +7 -0
- package/dist/solver/pricing/index.d.ts.map +1 -0
- package/dist/solver/pricing/index.js +7 -0
- package/dist/solver/pricing/index.js.map +1 -0
- package/dist/solver/pricing/slippage-capture.d.ts +47 -0
- package/dist/solver/pricing/slippage-capture.d.ts.map +1 -0
- package/dist/solver/pricing/slippage-capture.js +63 -0
- package/dist/solver/pricing/slippage-capture.js.map +1 -0
- package/dist/solver/protocols/aggregators/lifi.d.ts +109 -0
- package/dist/solver/protocols/aggregators/lifi.d.ts.map +1 -0
- package/dist/solver/protocols/aggregators/lifi.js +110 -0
- package/dist/solver/protocols/aggregators/lifi.js.map +1 -0
- package/dist/solver/protocols/aggregators/swing.d.ts +67 -0
- package/dist/solver/protocols/aggregators/swing.d.ts.map +1 -0
- package/dist/solver/protocols/aggregators/swing.js +212 -0
- package/dist/solver/protocols/aggregators/swing.js.map +1 -0
- package/dist/solver/protocols/base-protocol.d.ts +42 -0
- package/dist/solver/protocols/base-protocol.d.ts.map +1 -0
- package/dist/solver/protocols/base-protocol.js +16 -0
- package/dist/solver/protocols/base-protocol.js.map +1 -0
- package/dist/solver/protocols/index.d.ts +10 -0
- package/dist/solver/protocols/index.d.ts.map +1 -0
- package/dist/solver/protocols/index.js +10 -0
- package/dist/solver/protocols/index.js.map +1 -0
- package/dist/solver/protocols/lending/aave.d.ts +51 -0
- package/dist/solver/protocols/lending/aave.d.ts.map +1 -0
- package/dist/solver/protocols/lending/aave.js +172 -0
- package/dist/solver/protocols/lending/aave.js.map +1 -0
- package/dist/solver/protocols/protocol-registry.d.ts +28 -0
- package/dist/solver/protocols/protocol-registry.d.ts.map +1 -0
- package/dist/solver/protocols/protocol-registry.js +40 -0
- package/dist/solver/protocols/protocol-registry.js.map +1 -0
- package/dist/solver/settlement/index.d.ts +7 -0
- package/dist/solver/settlement/index.d.ts.map +1 -0
- package/dist/solver/settlement/index.js +7 -0
- package/dist/solver/settlement/index.js.map +1 -0
- package/dist/solver/settlement/live-settlement-manager.d.ts +62 -0
- package/dist/solver/settlement/live-settlement-manager.d.ts.map +1 -0
- package/dist/solver/settlement/live-settlement-manager.js +68 -0
- package/dist/solver/settlement/live-settlement-manager.js.map +1 -0
- package/dist/solver/settlement/proof-generator.d.ts +48 -0
- package/dist/solver/settlement/proof-generator.d.ts.map +1 -0
- package/dist/solver/settlement/proof-generator.js +100 -0
- package/dist/solver/settlement/proof-generator.js.map +1 -0
- package/dist/solver/settlement/proof-verifier.d.ts +31 -0
- package/dist/solver/settlement/proof-verifier.d.ts.map +1 -0
- package/dist/solver/settlement/proof-verifier.js +46 -0
- package/dist/solver/settlement/proof-verifier.js.map +1 -0
- package/dist/solver/settlement/settlement-manager.d.ts +97 -0
- package/dist/solver/settlement/settlement-manager.d.ts.map +1 -0
- package/dist/solver/settlement/settlement-manager.js +220 -0
- package/dist/solver/settlement/settlement-manager.js.map +1 -0
- package/dist/solver/types/agent.d.ts +92 -0
- package/dist/solver/types/agent.d.ts.map +1 -0
- package/dist/solver/types/agent.js +8 -0
- package/dist/solver/types/agent.js.map +1 -0
- package/dist/solver/types/execution.d.ts +70 -0
- package/dist/solver/types/execution.d.ts.map +1 -0
- package/dist/solver/types/execution.js +7 -0
- package/dist/solver/types/execution.js.map +1 -0
- package/dist/solver/types/index.d.ts +13 -0
- package/dist/solver/types/index.d.ts.map +1 -0
- package/dist/solver/types/index.js +13 -0
- package/dist/solver/types/index.js.map +1 -0
- package/dist/solver/types/intent.d.ts +82 -0
- package/dist/solver/types/intent.d.ts.map +1 -0
- package/dist/solver/types/intent.js +33 -0
- package/dist/solver/types/intent.js.map +1 -0
- package/dist/solver/types/inventory.d.ts +83 -0
- package/dist/solver/types/inventory.d.ts.map +1 -0
- package/dist/solver/types/inventory.js +8 -0
- package/dist/solver/types/inventory.js.map +1 -0
- package/dist/solver/types/pricing.d.ts +59 -0
- package/dist/solver/types/pricing.d.ts.map +1 -0
- package/dist/solver/types/pricing.js +8 -0
- package/dist/solver/types/pricing.js.map +1 -0
- package/dist/solver/types/settlement.d.ts +98 -0
- package/dist/solver/types/settlement.d.ts.map +1 -0
- package/dist/solver/types/settlement.js +9 -0
- package/dist/solver/types/settlement.js.map +1 -0
- package/dist/types/chain.d.ts +66 -0
- package/dist/types/chain.d.ts.map +1 -0
- package/dist/types/chain.js +7 -0
- package/dist/types/chain.js.map +1 -0
- package/dist/types/common.d.ts +44 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +8 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/entities.d.ts +61 -0
- package/dist/types/entities.d.ts.map +1 -0
- package/dist/types/entities.js +2 -0
- package/dist/types/entities.js.map +1 -0
- package/dist/types/index.d.ts +44 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/intent.d.ts +70 -0
- package/dist/types/intent.d.ts.map +1 -0
- package/dist/types/intent.js +2 -0
- package/dist/types/intent.js.map +1 -0
- package/dist/types/templates.d.ts +18 -0
- package/dist/types/templates.d.ts.map +1 -0
- package/dist/types/templates.js +2 -0
- package/dist/types/templates.js.map +1 -0
- package/dist/types/token.d.ts +132 -0
- package/dist/types/token.d.ts.map +1 -0
- package/dist/types/token.js +8 -0
- package/dist/types/token.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profit Tracker — Phase H
|
|
3
|
+
*
|
|
4
|
+
* Tracks expected vs actual profit for solved intents and provides
|
|
5
|
+
* aggregate statistics for the LiquidityAgent operator.
|
|
6
|
+
*
|
|
7
|
+
* Used by: LiquidityAgent
|
|
8
|
+
*/
|
|
9
|
+
import type { PricingResult } from "../types/pricing";
|
|
10
|
+
export interface ProfitRecord {
|
|
11
|
+
intentId: string;
|
|
12
|
+
pricing: PricingResult;
|
|
13
|
+
success?: boolean;
|
|
14
|
+
actualGasUsed?: string;
|
|
15
|
+
netProfit?: string;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}
|
|
18
|
+
export interface ProfitStats {
|
|
19
|
+
totalProfit: string;
|
|
20
|
+
totalGasCost: string;
|
|
21
|
+
successCount: number;
|
|
22
|
+
failCount: number;
|
|
23
|
+
avgProfit: string;
|
|
24
|
+
totalAttempts: number;
|
|
25
|
+
}
|
|
26
|
+
export declare class ProfitTracker {
|
|
27
|
+
private records;
|
|
28
|
+
/** Timestamp of the first ever recordAttempt call — used for ROI period */
|
|
29
|
+
private startedAt;
|
|
30
|
+
/**
|
|
31
|
+
* Record an intent that the agent is attempting to solve
|
|
32
|
+
*/
|
|
33
|
+
recordAttempt(intentId: string, pricing: PricingResult): void;
|
|
34
|
+
/**
|
|
35
|
+
* Record the final result of an attempted intent
|
|
36
|
+
*/
|
|
37
|
+
recordResult(intentId: string, success: boolean, gasUsed?: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get aggregate statistics
|
|
40
|
+
*/
|
|
41
|
+
getStats(periodMs?: number): ProfitStats;
|
|
42
|
+
/**
|
|
43
|
+
* Get annualized ROI percentage based on capital deployed
|
|
44
|
+
*/
|
|
45
|
+
getROI(capitalDeployed: string): number;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=profit-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profit-tracker.d.ts","sourceRoot":"","sources":["../../../src/solver/monitoring/profit-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAwC;IACvD,2EAA2E;IAC3E,OAAO,CAAC,SAAS,CAAuB;IAExC;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAkB7D;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBxE;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW;IAmCxC;;OAEG;IACH,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM;CAuB1C"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profit Tracker — Phase H
|
|
3
|
+
*
|
|
4
|
+
* Tracks expected vs actual profit for solved intents and provides
|
|
5
|
+
* aggregate statistics for the LiquidityAgent operator.
|
|
6
|
+
*
|
|
7
|
+
* Used by: LiquidityAgent
|
|
8
|
+
*/
|
|
9
|
+
export class ProfitTracker {
|
|
10
|
+
records = new Map();
|
|
11
|
+
/** Timestamp of the first ever recordAttempt call — used for ROI period */
|
|
12
|
+
startedAt = null;
|
|
13
|
+
/**
|
|
14
|
+
* Record an intent that the agent is attempting to solve
|
|
15
|
+
*/
|
|
16
|
+
recordAttempt(intentId, pricing) {
|
|
17
|
+
// Guard: warn if this intent is already tracked but not yet resolved
|
|
18
|
+
const existing = this.records.get(intentId);
|
|
19
|
+
if (existing && existing.success === undefined) {
|
|
20
|
+
console.warn(`[ProfitTracker] Overwriting in-flight record for intent: ${intentId}`);
|
|
21
|
+
}
|
|
22
|
+
if (this.startedAt === null) {
|
|
23
|
+
this.startedAt = Date.now();
|
|
24
|
+
}
|
|
25
|
+
this.records.set(intentId, {
|
|
26
|
+
intentId,
|
|
27
|
+
pricing,
|
|
28
|
+
timestamp: Date.now(),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Record the final result of an attempted intent
|
|
33
|
+
*/
|
|
34
|
+
recordResult(intentId, success, gasUsed) {
|
|
35
|
+
const record = this.records.get(intentId);
|
|
36
|
+
if (!record) {
|
|
37
|
+
console.warn(`[ProfitTracker] Cannot record result for unknown intent: ${intentId}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
record.success = success;
|
|
41
|
+
record.actualGasUsed = gasUsed ?? record.pricing.gasCost;
|
|
42
|
+
if (success) {
|
|
43
|
+
// Net Profit = Total Fee Collected - Actual Gas Spent
|
|
44
|
+
const totalFee = BigInt(record.pricing.totalFee);
|
|
45
|
+
const actualGas = BigInt(record.actualGasUsed);
|
|
46
|
+
record.netProfit = (totalFee - actualGas).toString();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Unsuccessful translates to 0 net revenue (with actual loss = gas wasted)
|
|
50
|
+
record.netProfit = "0";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get aggregate statistics
|
|
55
|
+
*/
|
|
56
|
+
getStats(periodMs) {
|
|
57
|
+
let totalProfit = 0n;
|
|
58
|
+
let totalGasCost = 0n;
|
|
59
|
+
let successCount = 0;
|
|
60
|
+
let failCount = 0;
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
for (const record of this.records.values()) {
|
|
63
|
+
if (periodMs && now - record.timestamp > periodMs) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (record.success === true) {
|
|
67
|
+
successCount++;
|
|
68
|
+
totalProfit += BigInt(record.netProfit || "0");
|
|
69
|
+
totalGasCost += BigInt(record.actualGasUsed || "0");
|
|
70
|
+
}
|
|
71
|
+
else if (record.success === false) {
|
|
72
|
+
failCount++;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const totalAttempts = successCount + failCount;
|
|
76
|
+
const avgProfit = successCount > 0 ? (totalProfit / BigInt(successCount)).toString() : "0";
|
|
77
|
+
return {
|
|
78
|
+
totalProfit: totalProfit.toString(),
|
|
79
|
+
totalGasCost: totalGasCost.toString(),
|
|
80
|
+
successCount,
|
|
81
|
+
failCount,
|
|
82
|
+
avgProfit,
|
|
83
|
+
totalAttempts,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get annualized ROI percentage based on capital deployed
|
|
88
|
+
*/
|
|
89
|
+
getROI(capitalDeployed) {
|
|
90
|
+
const capital = BigInt(capitalDeployed);
|
|
91
|
+
if (capital === 0n)
|
|
92
|
+
return 0;
|
|
93
|
+
const stats = this.getStats();
|
|
94
|
+
if (stats.totalProfit === "0" || this.startedAt === null)
|
|
95
|
+
return 0;
|
|
96
|
+
// Safe precision: divide big-int profit by capital without converting
|
|
97
|
+
// both to float until we have the ratio (which is << 2^53 in practice)
|
|
98
|
+
const profitBn = BigInt(stats.totalProfit);
|
|
99
|
+
// Represent ratio as numerator/denominator pair, then convert to float
|
|
100
|
+
const ratioNumerator = Number(profitBn * 10000000n / capital); // 7 decimal places of room
|
|
101
|
+
const roiPeriod = ratioNumerator / 10_000_000;
|
|
102
|
+
// Use the tracked startedAt so we only iterate records once (in getStats)
|
|
103
|
+
const elapsedMs = Date.now() - this.startedAt;
|
|
104
|
+
if (elapsedMs === 0)
|
|
105
|
+
return 0;
|
|
106
|
+
const yearsElapsed = elapsedMs / (365 * 24 * 3600 * 1000);
|
|
107
|
+
if (yearsElapsed === 0)
|
|
108
|
+
return 0;
|
|
109
|
+
return (roiPeriod / yearsElapsed) * 100; // Returns percentage %
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=profit-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profit-tracker.js","sourceRoot":"","sources":["../../../src/solver/monitoring/profit-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Pricing
|
|
3
|
+
*
|
|
4
|
+
* Menyesuaikan fee multiplier berdasarkan kondisi inventory saat ini.
|
|
5
|
+
* Semakin langka inventory di chain tertentu, semakin tinggi harga yang dikenakan.
|
|
6
|
+
*
|
|
7
|
+
* TUJUAN:
|
|
8
|
+
* - Mencegah pengurasan inventory satu chain secara cepat (flood protection)
|
|
9
|
+
* - Mendorong rebalancing secara ekonomi: harga tinggi → solver rebalance lebih cepat
|
|
10
|
+
* - Memberikan keunggulan kompetitif di kondisi surplus (harga lebih rendah = lebih sering menang)
|
|
11
|
+
*
|
|
12
|
+
* INVENTORY MULTIPLIER TABLE:
|
|
13
|
+
* ≥ 80% capacity → 0.8x (surplus, bersaing aggressive)
|
|
14
|
+
* 50–79% capacity → 1.0x (normal)
|
|
15
|
+
* 20–49% capacity → 1.5x (low, mulai naikkan harga)
|
|
16
|
+
* < 20% capacity → 2.0x (critical, hampir habis)
|
|
17
|
+
*
|
|
18
|
+
* FORMULA:
|
|
19
|
+
* finalFee = baseFee * inventoryMultiplier
|
|
20
|
+
*
|
|
21
|
+
* NOTE: Multiplier diterapkan HANYA ke baseFee, bukan ke gasCost.
|
|
22
|
+
* gasCost selalu tetap (reflek biaya aktual, bukan inventory state).
|
|
23
|
+
*/
|
|
24
|
+
import type { PricingConfig, PricingResult } from "../types/pricing";
|
|
25
|
+
import type { SolverIntent } from "../types/intent";
|
|
26
|
+
import type { ChainId } from "../../types/common";
|
|
27
|
+
import type { InventoryManager } from "../inventory/inventory-manager";
|
|
28
|
+
export declare class DynamicPricing {
|
|
29
|
+
private readonly config;
|
|
30
|
+
private readonly inventoryManager;
|
|
31
|
+
private readonly feeCalculator;
|
|
32
|
+
private readonly slippageCapture;
|
|
33
|
+
constructor(config: PricingConfig, inventoryManager: InventoryManager);
|
|
34
|
+
/**
|
|
35
|
+
* Hitung harga final untuk sebuah intent dengan dynamic multiplier.
|
|
36
|
+
*
|
|
37
|
+
* Langkah:
|
|
38
|
+
* 1. Extract params dari SolverIntent (amount, sourceChain, targetChain, maxSlippage)
|
|
39
|
+
* 2. Hitung base pricing via FeeCalculator
|
|
40
|
+
* 3. Apply inventory multiplier dari getInventoryMultiplier()
|
|
41
|
+
* 4. Re-compute totalFee dan solverProfit dengan nilai yang sudah di-adjust
|
|
42
|
+
*
|
|
43
|
+
* @param intent - SolverIntent yang akan di-price
|
|
44
|
+
* @returns PricingResult dengan multiplier sudah diterapkan
|
|
45
|
+
*/
|
|
46
|
+
getPrice(intent: SolverIntent): PricingResult;
|
|
47
|
+
/**
|
|
48
|
+
* Tentukan inventory multiplier (sebagai number) berdasarkan kapasitas chain.
|
|
49
|
+
*
|
|
50
|
+
* "Kapasitas" didefinisikan sebagai proporsi balance chain ini terhadap total semua chain.
|
|
51
|
+
* capacity = getBalance(chainId, token) / getTotalBalance(token)
|
|
52
|
+
*
|
|
53
|
+
* MULTIPLIER TIERS:
|
|
54
|
+
* capacity >= 0.8 → 0.8 (surplus mode)
|
|
55
|
+
* capacity >= 0.5 → 1.0 (normal)
|
|
56
|
+
* capacity >= 0.2 → 1.5 (low inventory)
|
|
57
|
+
* capacity < 0.2 → 2.0 (critical)
|
|
58
|
+
*
|
|
59
|
+
* @param chainId - Chain yang akan di-check inventory-nya
|
|
60
|
+
* @param amount - Amount yang dibutuhkan (unused, tersedia untuk future use)
|
|
61
|
+
* @param token - Token symbol untuk inventory check (default: "USDC")
|
|
62
|
+
* @returns Multiplier float (0.8 / 1.0 / 1.5 / 2.0)
|
|
63
|
+
*/
|
|
64
|
+
getInventoryMultiplier(chainId: ChainId, amount: bigint, token?: string): number;
|
|
65
|
+
/**
|
|
66
|
+
* Cek apakah inventory di chain tertentu sudah terlalu kritis
|
|
67
|
+
* untuk menerima intent baru (reject outright, bukan hanya naikkan harga).
|
|
68
|
+
*
|
|
69
|
+
* Hard limit: inventory < 5% capacity (critical floor).
|
|
70
|
+
* Bahkan dengan multiplier 2.0x, menerima intent di kondisi ini
|
|
71
|
+
* berisiko menguras habis inventory.
|
|
72
|
+
*
|
|
73
|
+
* @param chainId - Chain yang akan di-check
|
|
74
|
+
* @param amount - Amount intent yang diminta
|
|
75
|
+
* @param token - Token symbol untuk inventory check (default: "USDC")
|
|
76
|
+
* @returns true jika harus di-reject, false jika aman diterima
|
|
77
|
+
*/
|
|
78
|
+
shouldReject(chainId: ChainId, amount: bigint, token?: string): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Kembalikan tier (multiplierNum, multiplierDen, value) untuk chain berdasarkan kapasitas.
|
|
81
|
+
* Menggunakan BigInt fraction (num/den) untuk menghindari float precision loss
|
|
82
|
+
* saat diaplikasikan ke baseFee yang mungkin sangat besar (token 18 desimal).
|
|
83
|
+
*/
|
|
84
|
+
private _getTierForChain;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=dynamic-pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-pricing.d.ts","sourceRoot":"","sources":["../../../src/solver/pricing/dynamic-pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AA6BvE,qBAAa,cAAc;IAKnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAG7B,MAAM,EAAE,aAAa,EACrB,gBAAgB,EAAE,gBAAgB;IAUvD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa;IAsD7C;;;;;;;;;;;;;;;;OAgBG;IACH,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAA0B,GAAG,MAAM;IAIjG;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAA0B,GAAG,OAAO;IAsBxF;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CAiB3B"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Pricing
|
|
3
|
+
*
|
|
4
|
+
* Menyesuaikan fee multiplier berdasarkan kondisi inventory saat ini.
|
|
5
|
+
* Semakin langka inventory di chain tertentu, semakin tinggi harga yang dikenakan.
|
|
6
|
+
*
|
|
7
|
+
* TUJUAN:
|
|
8
|
+
* - Mencegah pengurasan inventory satu chain secara cepat (flood protection)
|
|
9
|
+
* - Mendorong rebalancing secara ekonomi: harga tinggi → solver rebalance lebih cepat
|
|
10
|
+
* - Memberikan keunggulan kompetitif di kondisi surplus (harga lebih rendah = lebih sering menang)
|
|
11
|
+
*
|
|
12
|
+
* INVENTORY MULTIPLIER TABLE:
|
|
13
|
+
* ≥ 80% capacity → 0.8x (surplus, bersaing aggressive)
|
|
14
|
+
* 50–79% capacity → 1.0x (normal)
|
|
15
|
+
* 20–49% capacity → 1.5x (low, mulai naikkan harga)
|
|
16
|
+
* < 20% capacity → 2.0x (critical, hampir habis)
|
|
17
|
+
*
|
|
18
|
+
* FORMULA:
|
|
19
|
+
* finalFee = baseFee * inventoryMultiplier
|
|
20
|
+
*
|
|
21
|
+
* NOTE: Multiplier diterapkan HANYA ke baseFee, bukan ke gasCost.
|
|
22
|
+
* gasCost selalu tetap (reflek biaya aktual, bukan inventory state).
|
|
23
|
+
*/
|
|
24
|
+
import { FeeCalculator } from "./fee-calculator";
|
|
25
|
+
import { SlippageCapture } from "./slippage-capture";
|
|
26
|
+
// ─────────────────────────────────────────────
|
|
27
|
+
// Internal Helpers
|
|
28
|
+
// ─────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Inventory tier definitions.
|
|
31
|
+
* Each tier has a capacity threshold (inclusive lower bound) and a multiplier.
|
|
32
|
+
* Tiers are checked from highest to lowest.
|
|
33
|
+
*
|
|
34
|
+
* Multiplier is expressed as [numerator, denominator] to enable lossless BigInt math.
|
|
35
|
+
* e.g. 0.8x → [8, 10], 1.5x → [15, 10], 2.0x → [20, 10]
|
|
36
|
+
*/
|
|
37
|
+
const INVENTORY_TIERS = [
|
|
38
|
+
{ threshold: 0.8, multiplierNum: 8n, multiplierDen: 10n, value: 0.8 },
|
|
39
|
+
{ threshold: 0.5, multiplierNum: 10n, multiplierDen: 10n, value: 1.0 },
|
|
40
|
+
{ threshold: 0.2, multiplierNum: 15n, multiplierDen: 10n, value: 1.5 },
|
|
41
|
+
{ threshold: 0, multiplierNum: 20n, multiplierDen: 10n, value: 2.0 }, // critical fallback
|
|
42
|
+
];
|
|
43
|
+
/** Capacity below this triggers hard rejection regardless of price */
|
|
44
|
+
const CRITICAL_CAPACITY_FLOOR = 0.05;
|
|
45
|
+
/** Default settlement token for inventory checks */
|
|
46
|
+
const DEFAULT_INVENTORY_TOKEN = "USDC";
|
|
47
|
+
export class DynamicPricing {
|
|
48
|
+
config;
|
|
49
|
+
inventoryManager;
|
|
50
|
+
feeCalculator;
|
|
51
|
+
slippageCapture;
|
|
52
|
+
constructor(config, inventoryManager) {
|
|
53
|
+
this.config = config;
|
|
54
|
+
this.inventoryManager = inventoryManager;
|
|
55
|
+
this.feeCalculator = new FeeCalculator(config);
|
|
56
|
+
this.slippageCapture = new SlippageCapture(config);
|
|
57
|
+
}
|
|
58
|
+
// ─────────────────────────────────────────────
|
|
59
|
+
// Public API
|
|
60
|
+
// ─────────────────────────────────────────────
|
|
61
|
+
/**
|
|
62
|
+
* Hitung harga final untuk sebuah intent dengan dynamic multiplier.
|
|
63
|
+
*
|
|
64
|
+
* Langkah:
|
|
65
|
+
* 1. Extract params dari SolverIntent (amount, sourceChain, targetChain, maxSlippage)
|
|
66
|
+
* 2. Hitung base pricing via FeeCalculator
|
|
67
|
+
* 3. Apply inventory multiplier dari getInventoryMultiplier()
|
|
68
|
+
* 4. Re-compute totalFee dan solverProfit dengan nilai yang sudah di-adjust
|
|
69
|
+
*
|
|
70
|
+
* @param intent - SolverIntent yang akan di-price
|
|
71
|
+
* @returns PricingResult dengan multiplier sudah diterapkan
|
|
72
|
+
*/
|
|
73
|
+
getPrice(intent) {
|
|
74
|
+
// 1. Extract intent parameters
|
|
75
|
+
const params = intent.parsedIntent.parameters;
|
|
76
|
+
if (intent.parsedIntent.intentType !== "bridge") {
|
|
77
|
+
throw new Error(`Unsupported intent type for pricing: ${intent.parsedIntent.intentType}`);
|
|
78
|
+
}
|
|
79
|
+
if (!params.inputAmount || !params.inputToken || !params.sourceChain || !params.targetChain) {
|
|
80
|
+
throw new Error("Invalid bridge intent: missing required parameters");
|
|
81
|
+
}
|
|
82
|
+
const amount = BigInt(params.inputAmount);
|
|
83
|
+
const sourceChain = Number(params.sourceChain);
|
|
84
|
+
const targetChain = Number(params.targetChain);
|
|
85
|
+
const maxSlippageBps = intent.parsedIntent.constraints.maxSlippage ?? 100;
|
|
86
|
+
// Use the intent's token symbol for inventory checks (default to USDC for stablecoins)
|
|
87
|
+
const token = typeof params.inputToken === "string" ? params.inputToken : DEFAULT_INVENTORY_TOKEN;
|
|
88
|
+
// 2. Get base fees from FeeCalculator
|
|
89
|
+
const rawPricing = this.feeCalculator.calculate({
|
|
90
|
+
amount,
|
|
91
|
+
sourceChain,
|
|
92
|
+
targetChain,
|
|
93
|
+
token,
|
|
94
|
+
maxSlippageBps,
|
|
95
|
+
});
|
|
96
|
+
// 3. Apply inventory multiplier using BigInt arithmetic (no float precision loss)
|
|
97
|
+
const { multiplierNum, multiplierDen } = this._getTierForChain(targetChain, token);
|
|
98
|
+
const baseFeeVal = BigInt(rawPricing.baseFee);
|
|
99
|
+
const adjustedBaseFee = (baseFeeVal * multiplierNum) / multiplierDen;
|
|
100
|
+
// 4. Reconstruct totals with adjusted base fee
|
|
101
|
+
const gasCost = BigInt(rawPricing.gasCost);
|
|
102
|
+
const slippageCapture = BigInt(rawPricing.slippageCapture);
|
|
103
|
+
const totalFee = adjustedBaseFee + gasCost + slippageCapture;
|
|
104
|
+
let userReceives = amount - totalFee;
|
|
105
|
+
if (userReceives < 0n)
|
|
106
|
+
userReceives = 0n;
|
|
107
|
+
const solverProfit = totalFee - gasCost;
|
|
108
|
+
return {
|
|
109
|
+
baseFee: adjustedBaseFee.toString(),
|
|
110
|
+
gasCost: gasCost.toString(),
|
|
111
|
+
slippageCapture: slippageCapture.toString(),
|
|
112
|
+
totalFee: totalFee.toString(),
|
|
113
|
+
userPays: amount.toString(),
|
|
114
|
+
userReceives: userReceives.toString(),
|
|
115
|
+
solverProfit: solverProfit.toString(),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Tentukan inventory multiplier (sebagai number) berdasarkan kapasitas chain.
|
|
120
|
+
*
|
|
121
|
+
* "Kapasitas" didefinisikan sebagai proporsi balance chain ini terhadap total semua chain.
|
|
122
|
+
* capacity = getBalance(chainId, token) / getTotalBalance(token)
|
|
123
|
+
*
|
|
124
|
+
* MULTIPLIER TIERS:
|
|
125
|
+
* capacity >= 0.8 → 0.8 (surplus mode)
|
|
126
|
+
* capacity >= 0.5 → 1.0 (normal)
|
|
127
|
+
* capacity >= 0.2 → 1.5 (low inventory)
|
|
128
|
+
* capacity < 0.2 → 2.0 (critical)
|
|
129
|
+
*
|
|
130
|
+
* @param chainId - Chain yang akan di-check inventory-nya
|
|
131
|
+
* @param amount - Amount yang dibutuhkan (unused, tersedia untuk future use)
|
|
132
|
+
* @param token - Token symbol untuk inventory check (default: "USDC")
|
|
133
|
+
* @returns Multiplier float (0.8 / 1.0 / 1.5 / 2.0)
|
|
134
|
+
*/
|
|
135
|
+
getInventoryMultiplier(chainId, amount, token = DEFAULT_INVENTORY_TOKEN) {
|
|
136
|
+
return this._getTierForChain(chainId, token).value;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Cek apakah inventory di chain tertentu sudah terlalu kritis
|
|
140
|
+
* untuk menerima intent baru (reject outright, bukan hanya naikkan harga).
|
|
141
|
+
*
|
|
142
|
+
* Hard limit: inventory < 5% capacity (critical floor).
|
|
143
|
+
* Bahkan dengan multiplier 2.0x, menerima intent di kondisi ini
|
|
144
|
+
* berisiko menguras habis inventory.
|
|
145
|
+
*
|
|
146
|
+
* @param chainId - Chain yang akan di-check
|
|
147
|
+
* @param amount - Amount intent yang diminta
|
|
148
|
+
* @param token - Token symbol untuk inventory check (default: "USDC")
|
|
149
|
+
* @returns true jika harus di-reject, false jika aman diterima
|
|
150
|
+
*/
|
|
151
|
+
shouldReject(chainId, amount, token = DEFAULT_INVENTORY_TOKEN) {
|
|
152
|
+
// 1. Check strict availability first (includes reserve check)
|
|
153
|
+
if (!this.inventoryManager.canFulfill(chainId, token, amount)) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
// 2. Check hard capacity floor
|
|
157
|
+
const current = this.inventoryManager.getBalance(chainId, token);
|
|
158
|
+
const total = this.inventoryManager.getTotalBalance(token);
|
|
159
|
+
if (total === 0n)
|
|
160
|
+
return true; // Should be caught by canFulfill, but safety guard
|
|
161
|
+
const capacity = Number(current) / Number(total);
|
|
162
|
+
// Reject if capacity is critically low to force rebalancing before draining chain
|
|
163
|
+
return capacity < CRITICAL_CAPACITY_FLOOR;
|
|
164
|
+
}
|
|
165
|
+
// ─────────────────────────────────────────────
|
|
166
|
+
// Private Helpers
|
|
167
|
+
// ─────────────────────────────────────────────
|
|
168
|
+
/**
|
|
169
|
+
* Kembalikan tier (multiplierNum, multiplierDen, value) untuk chain berdasarkan kapasitas.
|
|
170
|
+
* Menggunakan BigInt fraction (num/den) untuk menghindari float precision loss
|
|
171
|
+
* saat diaplikasikan ke baseFee yang mungkin sangat besar (token 18 desimal).
|
|
172
|
+
*/
|
|
173
|
+
_getTierForChain(chainId, token) {
|
|
174
|
+
const current = this.inventoryManager.getBalance(chainId, token);
|
|
175
|
+
const total = this.inventoryManager.getTotalBalance(token);
|
|
176
|
+
// No inventory anywhere → critical tier
|
|
177
|
+
if (total === 0n)
|
|
178
|
+
return INVENTORY_TIERS[INVENTORY_TIERS.length - 1];
|
|
179
|
+
const capacity = Number(current) / Number(total);
|
|
180
|
+
// Find first matching tier (ordered highest threshold → lowest)
|
|
181
|
+
for (const tier of INVENTORY_TIERS) {
|
|
182
|
+
if (capacity >= tier.threshold)
|
|
183
|
+
return tier;
|
|
184
|
+
}
|
|
185
|
+
// Should never reach here as last tier has threshold 0
|
|
186
|
+
return INVENTORY_TIERS[INVENTORY_TIERS.length - 1];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=dynamic-pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-pricing.js","sourceRoot":"","sources":["../../../src/solver/pricing/dynamic-pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fee Calculator
|
|
3
|
+
*
|
|
4
|
+
* Menghitung total biaya yang dikenakan solver kepada user.
|
|
5
|
+
* Fee terdiri dari tiga komponen:
|
|
6
|
+
*
|
|
7
|
+
* 1. BASE FEE — persentase dari amount (default 0.5%)
|
|
8
|
+
* 2. GAS COST — estimasi biaya gas dalam token (USDC)
|
|
9
|
+
* 3. SLIPPAGE CAPTURE — bagian dari max slippage user yang solver ambil
|
|
10
|
+
*
|
|
11
|
+
* FORMULA:
|
|
12
|
+
* totalFee = baseFee + gasCost + slippageCapture
|
|
13
|
+
* userReceives = amount - totalFee
|
|
14
|
+
* solverProfit = totalFee - gasCost
|
|
15
|
+
*
|
|
16
|
+
* EXAMPLE (1000 USDC, ETH→Polygon):
|
|
17
|
+
* baseFee = 5 USDC (0.5%)
|
|
18
|
+
* gasCost = 3 USDC (ETH mainnet involved)
|
|
19
|
+
* slippageCapture = 5 USDC (50% of 1% max slippage on 1000 USDC)
|
|
20
|
+
* totalFee = 13 USDC
|
|
21
|
+
* solverProfit = 10 USDC
|
|
22
|
+
*/
|
|
23
|
+
import type { PricingConfig, PricingResult } from "../types/pricing";
|
|
24
|
+
import type { ChainId } from "../../types/common";
|
|
25
|
+
/**
|
|
26
|
+
* Parameters untuk kalkulasi fee tunggal.
|
|
27
|
+
*/
|
|
28
|
+
export interface FeeCalculationParams {
|
|
29
|
+
/** Amount yang di-bridge dalam token smallest unit (e.g., 1000 USDC = 1_000_000_000n untuk 6 decimals) */
|
|
30
|
+
amount: bigint;
|
|
31
|
+
/** Chain tempat user menyimpan dana (source) */
|
|
32
|
+
sourceChain: ChainId;
|
|
33
|
+
/** Chain tujuan pengiriman (target) */
|
|
34
|
+
targetChain: ChainId;
|
|
35
|
+
/** Token symbol (e.g., "USDC") */
|
|
36
|
+
token: string;
|
|
37
|
+
/** Max slippage yang diizinkan user, dalam basis points (100 = 1%) */
|
|
38
|
+
maxSlippageBps: number;
|
|
39
|
+
/** Jumlah desimal token (6 untuk USDC, 18 untuk ETH) */
|
|
40
|
+
tokenDecimals?: number;
|
|
41
|
+
}
|
|
42
|
+
export declare class FeeCalculator {
|
|
43
|
+
private readonly config;
|
|
44
|
+
private readonly slippageCapture;
|
|
45
|
+
constructor(config: PricingConfig);
|
|
46
|
+
/**
|
|
47
|
+
* Hitung full fee breakdown untuk sebuah bridge intent.
|
|
48
|
+
*
|
|
49
|
+
* Langkah:
|
|
50
|
+
* 1. Hitung base fee dari `amount * baseFeePercent`, clamp ke [minFee, maxFee]
|
|
51
|
+
* 2. Estimasi gas cost via `estimateGasCost()`
|
|
52
|
+
* 3. Hitung slippage capture via `SlippageCapture.calculate()`
|
|
53
|
+
* 4. Gabungkan menjadi PricingResult
|
|
54
|
+
*
|
|
55
|
+
* @param params - FeeCalculationParams
|
|
56
|
+
* @returns PricingResult dengan semua fee breakdown
|
|
57
|
+
*/
|
|
58
|
+
calculate(params: FeeCalculationParams): PricingResult;
|
|
59
|
+
/**
|
|
60
|
+
* Hitung base fee saja dari sebuah amount.
|
|
61
|
+
*
|
|
62
|
+
* Berguna untuk quick check profitabilitas tanpa full pricing.
|
|
63
|
+
*
|
|
64
|
+
* @param amount - Amount dalam token's smallest unit
|
|
65
|
+
* @param tokenDecimals - Jumlah desimal token (default 6 untuk USDC)
|
|
66
|
+
* @returns Base fee dalam token's smallest unit (bigint)
|
|
67
|
+
*/
|
|
68
|
+
calculateBaseFee(amount: bigint, tokenDecimals?: number): bigint;
|
|
69
|
+
/**
|
|
70
|
+
* Estimasi biaya gas dalam token equivalent (USDC).
|
|
71
|
+
*
|
|
72
|
+
* Logika:
|
|
73
|
+
* - Cross-chain (sourceChain !== targetChain) jauh lebih mahal dari single-chain
|
|
74
|
+
* - Ethereum mainnet memiliki gas cost tertinggi karena konsensus proof-of-stake
|
|
75
|
+
* dan tingginya demand block space
|
|
76
|
+
* - L2 (Polygon, Arbitrum) jauh lebih murah
|
|
77
|
+
*
|
|
78
|
+
* Gunakan hardcoded baseline yang akan diganti real gas oracle di Phase I.
|
|
79
|
+
*
|
|
80
|
+
* @param sourceChain - Chain ID asal
|
|
81
|
+
* @param targetChain - Chain ID tujuan (opsional, untuk cross-chain estimate)
|
|
82
|
+
* @returns Gas cost estimasi dalam USDC (6 decimals, bigint)
|
|
83
|
+
*/
|
|
84
|
+
estimateGasCost(sourceChain: ChainId, targetChain?: ChainId): bigint;
|
|
85
|
+
/**
|
|
86
|
+
* Cek apakah sebuah intent worth solving (profitable setelah fee).
|
|
87
|
+
*
|
|
88
|
+
* Intent tidak worth solving jika:
|
|
89
|
+
* - Amount terlalu kecil sehingga fee > amount
|
|
90
|
+
* - Cross-chain gas cost > baseFee (loss scenario)
|
|
91
|
+
*
|
|
92
|
+
* Note: Slippage capture diabaikan di sini (conservative check).
|
|
93
|
+
*
|
|
94
|
+
* @param amount - Amount dalam token's smallest unit
|
|
95
|
+
* @param sourceChain - Chain ID asal
|
|
96
|
+
* @param targetChain - Chain ID tujuan
|
|
97
|
+
* @returns true jika worth solving, false jika tidak
|
|
98
|
+
*/
|
|
99
|
+
isWorthSolving(amount: bigint, sourceChain: ChainId, targetChain: ChainId): boolean;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=fee-calculator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fee-calculator.d.ts","sourceRoot":"","sources":["../../../src/solver/pricing/fee-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAMlD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,0GAA0G;IAC1G,MAAM,EAAE,MAAM,CAAC;IAEf,gDAAgD;IAChD,WAAW,EAAE,OAAO,CAAC;IAErB,uCAAuC;IACvC,WAAW,EAAE,OAAO,CAAC;IAErB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IAEd,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IAEvB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,aAAa;IAIlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAG7B,MAAM,EAAE,aAAa;IAS1C;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa;IA8BtD;;;;;;;;OAQG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,MAAM;IAmB3D;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM;IAmBpE;;;;;;;;;;;;;OAaG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO;CAStF"}
|