@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,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry untuk token info (address, decimals, etc) per chain.
|
|
5
|
+
* Pre-registers common tokens (USDC) untuk supported chains.
|
|
6
|
+
*
|
|
7
|
+
* USAGE:
|
|
8
|
+
* const registry = new TokenRegistry();
|
|
9
|
+
* registry.register({ address: "0xA0b8...", symbol: "USDC", decimals: 6, chainId: 1, name: "USD Coin" });
|
|
10
|
+
*
|
|
11
|
+
* const usdc = registry.get("USDC", 1);
|
|
12
|
+
* const usdcByAddr = registry.getByAddress("0xA0b8...", 1);
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* TokenRegistry
|
|
16
|
+
*
|
|
17
|
+
* Manages token info indexed by (symbol, chainId) and (address, chainId).
|
|
18
|
+
*/
|
|
19
|
+
export class TokenRegistry {
|
|
20
|
+
/** symbol:chainId → TokenInfo */
|
|
21
|
+
bySymbol = new Map();
|
|
22
|
+
/** address:chainId → TokenInfo */
|
|
23
|
+
byAddress = new Map();
|
|
24
|
+
/**
|
|
25
|
+
* Generate composite key for maps
|
|
26
|
+
*/
|
|
27
|
+
symbolKey(symbol, chainId) {
|
|
28
|
+
return `${symbol.toUpperCase()}:${chainId}`;
|
|
29
|
+
}
|
|
30
|
+
addressKey(address, chainId) {
|
|
31
|
+
return `${address.toLowerCase()}:${chainId}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Register a token.
|
|
35
|
+
* Updates existing entry if same (symbol, chainId) already registered.
|
|
36
|
+
*/
|
|
37
|
+
register(token) {
|
|
38
|
+
const sKey = this.symbolKey(token.symbol, token.chainId);
|
|
39
|
+
const aKey = this.addressKey(token.address, token.chainId);
|
|
40
|
+
this.bySymbol.set(sKey, token);
|
|
41
|
+
this.byAddress.set(aKey, token);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register multiple tokens at once.
|
|
45
|
+
*/
|
|
46
|
+
registerAll(tokens) {
|
|
47
|
+
for (const token of tokens) {
|
|
48
|
+
this.register(token);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get token by symbol and chain ID.
|
|
53
|
+
* Returns undefined if not found.
|
|
54
|
+
*/
|
|
55
|
+
get(symbol, chainId) {
|
|
56
|
+
return this.bySymbol.get(this.symbolKey(symbol, chainId));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get token by contract address and chain ID.
|
|
60
|
+
* Returns undefined if not found.
|
|
61
|
+
*/
|
|
62
|
+
getByAddress(address, chainId) {
|
|
63
|
+
return this.byAddress.get(this.addressKey(address, chainId));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if a token is registered.
|
|
67
|
+
*/
|
|
68
|
+
has(symbol, chainId) {
|
|
69
|
+
return this.bySymbol.has(this.symbolKey(symbol, chainId));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* List all tokens on a specific chain.
|
|
73
|
+
*/
|
|
74
|
+
listByChain(chainId) {
|
|
75
|
+
return Array.from(this.bySymbol.values()).filter((t) => t.chainId === chainId);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* List all registered tokens.
|
|
79
|
+
*/
|
|
80
|
+
listAll() {
|
|
81
|
+
return Array.from(this.bySymbol.values());
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get number of registered tokens.
|
|
85
|
+
*/
|
|
86
|
+
get size() {
|
|
87
|
+
return this.bySymbol.size;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Pre-configured USDC token info for common chains.
|
|
92
|
+
* Register these via registry.registerAll(DEFAULT_TOKENS).
|
|
93
|
+
*/
|
|
94
|
+
export const DEFAULT_TOKENS = [
|
|
95
|
+
{
|
|
96
|
+
address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
97
|
+
symbol: "USDC",
|
|
98
|
+
decimals: 6,
|
|
99
|
+
chainId: 1,
|
|
100
|
+
name: "USD Coin",
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
104
|
+
symbol: "USDC",
|
|
105
|
+
decimals: 6,
|
|
106
|
+
chainId: 137,
|
|
107
|
+
name: "USD Coin",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
address: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
111
|
+
symbol: "USDC",
|
|
112
|
+
decimals: 6,
|
|
113
|
+
chainId: 42161,
|
|
114
|
+
name: "USD Coin",
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
/**
|
|
118
|
+
* Testnet USDC token info for supported testnet chains.
|
|
119
|
+
* Register these via registry.registerAll(TESTNET_TOKENS).
|
|
120
|
+
*
|
|
121
|
+
* Stage 3 — Live Integration
|
|
122
|
+
*
|
|
123
|
+
* Chains: Sepolia, Arbitrum Sepolia, Unichain Sepolia, Base Sepolia
|
|
124
|
+
*/
|
|
125
|
+
export const TESTNET_TOKENS = [
|
|
126
|
+
{
|
|
127
|
+
address: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
|
|
128
|
+
symbol: "USDC",
|
|
129
|
+
decimals: 6,
|
|
130
|
+
chainId: 11155111, // Sepolia
|
|
131
|
+
name: "USD Coin (Testnet)",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
address: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d",
|
|
135
|
+
symbol: "USDC",
|
|
136
|
+
decimals: 6,
|
|
137
|
+
chainId: 421614, // Arbitrum Sepolia
|
|
138
|
+
name: "USD Coin (Testnet)",
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
address: "0x31d0220469e10c4E71834a79b1f276d740d3768F",
|
|
142
|
+
symbol: "USDC",
|
|
143
|
+
decimals: 6,
|
|
144
|
+
chainId: 1301, // Unichain Sepolia
|
|
145
|
+
name: "USD Coin (Testnet)",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
address: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
149
|
+
symbol: "USDC",
|
|
150
|
+
decimals: 6,
|
|
151
|
+
chainId: 84532, // Base Sepolia
|
|
152
|
+
name: "USD Coin (Testnet)",
|
|
153
|
+
},
|
|
154
|
+
];
|
|
155
|
+
/**
|
|
156
|
+
* Additional mainnet tokens beyond USDC.
|
|
157
|
+
* Register these via registry.registerAll(MAINNET_TOKENS).
|
|
158
|
+
*
|
|
159
|
+
* Stage 3 — Live Integration
|
|
160
|
+
*
|
|
161
|
+
* Tokens: USDT, WETH, WBTC, DAI on Ethereum/Arbitrum/Optimism
|
|
162
|
+
*/
|
|
163
|
+
export const MAINNET_TOKENS = [
|
|
164
|
+
// --- USDT ---
|
|
165
|
+
{ address: "0xdAC17F958D2ee523a2206206994597C13D831ec7", symbol: "USDT", decimals: 6, chainId: 1, name: "Tether USD" },
|
|
166
|
+
{ address: "0xFd086bC7CD5C481DCC9C85EBE478A1C0b69FCbb9", symbol: "USDT", decimals: 6, chainId: 42161, name: "Tether USD" },
|
|
167
|
+
{ address: "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", symbol: "USDT", decimals: 6, chainId: 10, name: "Tether USD" },
|
|
168
|
+
// --- WETH ---
|
|
169
|
+
{ address: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", symbol: "WETH", decimals: 18, chainId: 42161, name: "Wrapped Ether" },
|
|
170
|
+
{ address: "0x4200000000000000000000000000000000000006", symbol: "WETH", decimals: 18, chainId: 10, name: "Wrapped Ether" },
|
|
171
|
+
// --- WBTC ---
|
|
172
|
+
{ address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", symbol: "WBTC", decimals: 8, chainId: 1, name: "Wrapped BTC" },
|
|
173
|
+
{ address: "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", symbol: "WBTC", decimals: 8, chainId: 42161, name: "Wrapped BTC" },
|
|
174
|
+
// --- DAI ---
|
|
175
|
+
{ address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", symbol: "DAI", decimals: 18, chainId: 1, name: "Dai Stablecoin" },
|
|
176
|
+
{ address: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", symbol: "DAI", decimals: 18, chainId: 42161, name: "Dai Stablecoin" },
|
|
177
|
+
{ address: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", symbol: "DAI", decimals: 18, chainId: 10, name: "Dai Stablecoin" },
|
|
178
|
+
];
|
|
179
|
+
/**
|
|
180
|
+
* Resolve a token address from symbol + chainId.
|
|
181
|
+
*
|
|
182
|
+
* Looks up the token in the provided registry instance.
|
|
183
|
+
* Throws if the token is not found.
|
|
184
|
+
*
|
|
185
|
+
* Stage 3 — Live Integration
|
|
186
|
+
*
|
|
187
|
+
* @param registry - TokenRegistry instance to search in
|
|
188
|
+
* @param symbol - Token symbol (e.g., "USDC")
|
|
189
|
+
* @param chainId - Target chain ID
|
|
190
|
+
* @returns The token's contract address
|
|
191
|
+
* @throws Error if token not found for the given symbol + chainId
|
|
192
|
+
*/
|
|
193
|
+
export function resolveFromSymbol(registry, symbol, chainId) {
|
|
194
|
+
const token = registry.get(symbol, chainId);
|
|
195
|
+
if (!token) {
|
|
196
|
+
throw new Error(`Target token ${symbol} is not registered for chain ID ${chainId}`);
|
|
197
|
+
}
|
|
198
|
+
return token.address;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/shared/token-registry/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC-20 Utilities
|
|
3
|
+
*
|
|
4
|
+
* Lightweight pure functions for encoding ERC-20 contract calls
|
|
5
|
+
* without requiring full ethers.js/viem contract instances.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ERC20_TRANSFER_SELECTOR = "0xa9059cbb";
|
|
8
|
+
export declare const ERC20_BALANCEOF_SELECTOR = "0x70a08231";
|
|
9
|
+
/**
|
|
10
|
+
* Encode an ERC-20 `transfer(address to, uint256 amount)` contract call.
|
|
11
|
+
*
|
|
12
|
+
* @param to - Recipient address
|
|
13
|
+
* @param amount - Amount in basic units (wei)
|
|
14
|
+
* @returns Hex data string for the transaction
|
|
15
|
+
*/
|
|
16
|
+
export declare function encodeTransferData(to: string, amount: bigint): `0x${string}`;
|
|
17
|
+
/**
|
|
18
|
+
* Encode an ERC-20 `balanceOf(address account)` contract call.
|
|
19
|
+
*
|
|
20
|
+
* @param account - Address to check balance for
|
|
21
|
+
* @returns Hex data string for the eth_call
|
|
22
|
+
*/
|
|
23
|
+
export declare function encodeBalanceOfData(account: string): `0x${string}`;
|
|
24
|
+
//# sourceMappingURL=erc20-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-utils.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/erc20-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,eAAO,MAAM,uBAAuB,eAAe,CAAC;AACpD,eAAO,MAAM,wBAAwB,eAAe,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAI5E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAGlE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC-20 Utilities
|
|
3
|
+
*
|
|
4
|
+
* Lightweight pure functions for encoding ERC-20 contract calls
|
|
5
|
+
* without requiring full ethers.js/viem contract instances.
|
|
6
|
+
*/
|
|
7
|
+
export const ERC20_TRANSFER_SELECTOR = "0xa9059cbb"; // keccak256("transfer(address,uint256)").slice(0, 10)
|
|
8
|
+
export const ERC20_BALANCEOF_SELECTOR = "0x70a08231"; // keccak256("balanceOf(address)").slice(0, 10)
|
|
9
|
+
/**
|
|
10
|
+
* Encode an ERC-20 `transfer(address to, uint256 amount)` contract call.
|
|
11
|
+
*
|
|
12
|
+
* @param to - Recipient address
|
|
13
|
+
* @param amount - Amount in basic units (wei)
|
|
14
|
+
* @returns Hex data string for the transaction
|
|
15
|
+
*/
|
|
16
|
+
export function encodeTransferData(to, amount) {
|
|
17
|
+
const paddedTo = to.toLowerCase().replace("0x", "").padStart(64, "0");
|
|
18
|
+
const paddedAmount = amount.toString(16).padStart(64, "0");
|
|
19
|
+
return `${ERC20_TRANSFER_SELECTOR}${paddedTo}${paddedAmount}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Encode an ERC-20 `balanceOf(address account)` contract call.
|
|
23
|
+
*
|
|
24
|
+
* @param account - Address to check balance for
|
|
25
|
+
* @returns Hex data string for the eth_call
|
|
26
|
+
*/
|
|
27
|
+
export function encodeBalanceOfData(account) {
|
|
28
|
+
const paddedAccount = account.toLowerCase().replace("0x", "").padStart(64, "0");
|
|
29
|
+
return `${ERC20_BALANCEOF_SELECTOR}${paddedAccount}`;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=erc20-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erc20-utils.js","sourceRoot":"","sources":["../../../src/shared/utils/erc20-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC,CAAC,sDAAsD;AAC3G,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC,CAAC,+CAA+C;AAErG;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,MAAc;IACzD,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,GAAG,uBAAuB,GAAG,QAAQ,GAAG,YAAY,EAAmB,CAAC;AACnF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAChF,OAAO,GAAG,wBAAwB,GAAG,aAAa,EAAmB,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Utility with Exponential Backoff
|
|
3
|
+
*
|
|
4
|
+
* Generic retry wrapper for async operations with configurable
|
|
5
|
+
* backoff, jitter, and retryable-error filtering.
|
|
6
|
+
*
|
|
7
|
+
* Stage 3 — Phase G (Production Hardening)
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
* const result = await withRetry(() => provider.getBlockNumber(), {
|
|
11
|
+
* maxRetries: 3,
|
|
12
|
+
* baseDelayMs: 1000,
|
|
13
|
+
* onRetry: (err, attempt) => console.warn(`Retry ${attempt}: ${err.message}`),
|
|
14
|
+
* });
|
|
15
|
+
*/
|
|
16
|
+
export interface RetryOptions {
|
|
17
|
+
/** Maximum number of retry attempts (default: 3) */
|
|
18
|
+
maxRetries?: number;
|
|
19
|
+
/** Base delay in ms before first retry (default: 1000) */
|
|
20
|
+
baseDelayMs?: number;
|
|
21
|
+
/** Maximum delay cap in ms (default: 10000) */
|
|
22
|
+
maxDelayMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Predicate to decide if an error is retryable.
|
|
25
|
+
* Return `true` to retry, `false` to throw immediately.
|
|
26
|
+
* Default: retries all errors.
|
|
27
|
+
*/
|
|
28
|
+
isRetryable?: (error: Error) => boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Callback invoked before each retry attempt.
|
|
31
|
+
* Useful for logging.
|
|
32
|
+
*/
|
|
33
|
+
onRetry?: (error: Error, attempt: number, delayMs: number) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Execute an async function with exponential backoff retry.
|
|
37
|
+
*
|
|
38
|
+
* Delay formula: `min(baseDelay * 2^attempt + jitter, maxDelay)`
|
|
39
|
+
*
|
|
40
|
+
* @param fn - Async function to execute
|
|
41
|
+
* @param options - Retry configuration
|
|
42
|
+
* @returns The result of `fn()` on success
|
|
43
|
+
* @throws The last error after all retries are exhausted, or immediately for non-retryable errors
|
|
44
|
+
*/
|
|
45
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
46
|
+
/**
|
|
47
|
+
* Check if an RPC/network error is transient and worth retrying.
|
|
48
|
+
*
|
|
49
|
+
* Retryable conditions:
|
|
50
|
+
* - Timeout errors
|
|
51
|
+
* - HTTP 429 (Too Many Requests)
|
|
52
|
+
* - HTTP 502/503/504 (Bad Gateway / Service Unavailable / Gateway Timeout)
|
|
53
|
+
* - Connection refused / reset
|
|
54
|
+
* - "ECONNRESET", "ETIMEDOUT", "ENOTFOUND"
|
|
55
|
+
*/
|
|
56
|
+
export declare function isTransientNetworkError(error: Error): boolean;
|
|
57
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,YAAY;IACzB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC;IAExC;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE;AAQD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC7B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GAC3B,OAAO,CAAC,CAAC,CAAC,CAuCZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAyB7D"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry Utility with Exponential Backoff
|
|
3
|
+
*
|
|
4
|
+
* Generic retry wrapper for async operations with configurable
|
|
5
|
+
* backoff, jitter, and retryable-error filtering.
|
|
6
|
+
*
|
|
7
|
+
* Stage 3 — Phase G (Production Hardening)
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
* const result = await withRetry(() => provider.getBlockNumber(), {
|
|
11
|
+
* maxRetries: 3,
|
|
12
|
+
* baseDelayMs: 1000,
|
|
13
|
+
* onRetry: (err, attempt) => console.warn(`Retry ${attempt}: ${err.message}`),
|
|
14
|
+
* });
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_OPTIONS = {
|
|
17
|
+
maxRetries: 3,
|
|
18
|
+
baseDelayMs: 1000,
|
|
19
|
+
maxDelayMs: 10_000,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Execute an async function with exponential backoff retry.
|
|
23
|
+
*
|
|
24
|
+
* Delay formula: `min(baseDelay * 2^attempt + jitter, maxDelay)`
|
|
25
|
+
*
|
|
26
|
+
* @param fn - Async function to execute
|
|
27
|
+
* @param options - Retry configuration
|
|
28
|
+
* @returns The result of `fn()` on success
|
|
29
|
+
* @throws The last error after all retries are exhausted, or immediately for non-retryable errors
|
|
30
|
+
*/
|
|
31
|
+
export async function withRetry(fn, options = {}) {
|
|
32
|
+
const maxRetries = options.maxRetries ?? DEFAULT_OPTIONS.maxRetries;
|
|
33
|
+
const baseDelayMs = options.baseDelayMs ?? DEFAULT_OPTIONS.baseDelayMs;
|
|
34
|
+
const maxDelayMs = options.maxDelayMs ?? DEFAULT_OPTIONS.maxDelayMs;
|
|
35
|
+
let lastError;
|
|
36
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
37
|
+
try {
|
|
38
|
+
return await fn();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
42
|
+
lastError = error;
|
|
43
|
+
// Check if we've exhausted retries
|
|
44
|
+
if (attempt >= maxRetries) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
// Check if error is retryable
|
|
48
|
+
if (options.isRetryable && !options.isRetryable(error)) {
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
// Calculate delay with exponential backoff + jitter
|
|
52
|
+
const exponentialDelay = baseDelayMs * Math.pow(2, attempt);
|
|
53
|
+
const jitter = Math.random() * baseDelayMs * 0.5;
|
|
54
|
+
const delay = Math.min(exponentialDelay + jitter, maxDelayMs);
|
|
55
|
+
// Notify before sleeping
|
|
56
|
+
if (options.onRetry) {
|
|
57
|
+
options.onRetry(error, attempt + 1, delay);
|
|
58
|
+
}
|
|
59
|
+
await sleep(delay);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
throw lastError;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if an RPC/network error is transient and worth retrying.
|
|
66
|
+
*
|
|
67
|
+
* Retryable conditions:
|
|
68
|
+
* - Timeout errors
|
|
69
|
+
* - HTTP 429 (Too Many Requests)
|
|
70
|
+
* - HTTP 502/503/504 (Bad Gateway / Service Unavailable / Gateway Timeout)
|
|
71
|
+
* - Connection refused / reset
|
|
72
|
+
* - "ECONNRESET", "ETIMEDOUT", "ENOTFOUND"
|
|
73
|
+
*/
|
|
74
|
+
export function isTransientNetworkError(error) {
|
|
75
|
+
const message = error.message.toLowerCase();
|
|
76
|
+
// Common transient patterns
|
|
77
|
+
const transientPatterns = [
|
|
78
|
+
"timeout",
|
|
79
|
+
"econnreset",
|
|
80
|
+
"econnrefused",
|
|
81
|
+
"etimedout",
|
|
82
|
+
"enotfound",
|
|
83
|
+
"socket hang up",
|
|
84
|
+
"network error",
|
|
85
|
+
"fetch failed",
|
|
86
|
+
"429",
|
|
87
|
+
"too many requests",
|
|
88
|
+
"502",
|
|
89
|
+
"503",
|
|
90
|
+
"504",
|
|
91
|
+
"bad gateway",
|
|
92
|
+
"service unavailable",
|
|
93
|
+
"gateway timeout",
|
|
94
|
+
"rate limit",
|
|
95
|
+
];
|
|
96
|
+
return transientPatterns.some(pattern => message.includes(pattern));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Sleep for the given number of milliseconds.
|
|
100
|
+
*/
|
|
101
|
+
function sleep(ms) {
|
|
102
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/shared/utils/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA0BH,MAAM,eAAe,GAA4D;IAC7E,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,MAAM;CACrB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,EAAoB,EACpB,UAAwB,EAAE;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,eAAe,CAAC,UAAU,CAAC;IACpE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,eAAe,CAAC,UAAU,CAAC;IAEpE,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC;YACD,OAAO,MAAM,EAAE,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,SAAS,GAAG,KAAK,CAAC;YAElB,mCAAmC;YACnC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBACxB,MAAM;YACV,CAAC;YAED,8BAA8B;YAC9B,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM;YACV,CAAC;YAED,oDAAoD;YACpD,MAAM,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,GAAG,GAAG,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,UAAU,CAAC,CAAC;YAE9D,yBAAyB;YACzB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAED,MAAM,SAAU,CAAC;AACrB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAY;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAE5C,4BAA4B;IAC5B,MAAM,iBAAiB,GAAG;QACtB,SAAS;QACT,YAAY;QACZ,cAAc;QACd,WAAW;QACX,WAAW;QACX,gBAAgB;QAChB,eAAe;QACf,cAAc;QACd,KAAK;QACL,mBAAmB;QACnB,KAAK;QACL,KAAK;QACL,KAAK;QACL,aAAa;QACb,qBAAqB;QACrB,iBAAiB;QACjB,YAAY;KACf,CAAC;IAEF,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* viem Wallet Signer
|
|
3
|
+
*
|
|
4
|
+
* Implements WalletSigner interface using viem's privateKeyToAccount + createWalletClient.
|
|
5
|
+
* Provides real transaction signing and EIP-712 typed data signing.
|
|
6
|
+
*
|
|
7
|
+
* Stage 3 — Live Integration (Phase B)
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
* import { createViemSignerFactory } from "./viem-signer";
|
|
11
|
+
* const wallet = new WalletManager("0xprivatekey...", createViemSignerFactory());
|
|
12
|
+
* const address = wallet.getAddress();
|
|
13
|
+
* const sig = await wallet.signMessage("hello");
|
|
14
|
+
*/
|
|
15
|
+
import { type PrivateKeyAccount } from "viem/accounts";
|
|
16
|
+
import type { Address, ChainId } from "../../types/common";
|
|
17
|
+
import type { WalletSigner } from "./wallet-manager";
|
|
18
|
+
/**
|
|
19
|
+
* WalletSigner implementation backed by viem's WalletClient.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ViemSigner implements WalletSigner {
|
|
22
|
+
private account;
|
|
23
|
+
private walletClient;
|
|
24
|
+
private chain;
|
|
25
|
+
constructor(privateKey: `0x${string}`, chainId: ChainId, rpcUrl?: string);
|
|
26
|
+
/**
|
|
27
|
+
* Get the wallet address derived from the private key.
|
|
28
|
+
*/
|
|
29
|
+
getAddress(): Address;
|
|
30
|
+
/**
|
|
31
|
+
* Sign an arbitrary message using personal_sign.
|
|
32
|
+
*/
|
|
33
|
+
signMessage(message: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Sign EIP-712 typed data.
|
|
36
|
+
*
|
|
37
|
+
* Used for creating intent signatures compatible with IntentSettlement.sol.
|
|
38
|
+
*/
|
|
39
|
+
signTypedData(domain: object, types: object, value: object): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Send a transaction through this wallet (sign + broadcast).
|
|
42
|
+
*
|
|
43
|
+
* Returns the transaction hash.
|
|
44
|
+
*/
|
|
45
|
+
sendTransaction(tx: {
|
|
46
|
+
to: Address;
|
|
47
|
+
data?: `0x${string}`;
|
|
48
|
+
value?: bigint;
|
|
49
|
+
gas?: bigint;
|
|
50
|
+
}): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Get the underlying viem account (for advanced use cases).
|
|
53
|
+
*/
|
|
54
|
+
getAccount(): PrivateKeyAccount;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Factory function that creates ViemSigner instances.
|
|
58
|
+
*
|
|
59
|
+
* Pass this to WalletManager constructor as the signerFactory.
|
|
60
|
+
*
|
|
61
|
+
* Factory for creating viem signers.
|
|
62
|
+
* Suitable for injection into WalletManager.
|
|
63
|
+
*
|
|
64
|
+
* @param rpcMapper - Optional function to provide RPC URLs for specific chains
|
|
65
|
+
* (required for `sendTransaction` live execution).
|
|
66
|
+
*/
|
|
67
|
+
export declare function createViemSignerFactory(rpcMapper?: (chainId: ChainId) => string | undefined): (privateKey: string, chainId: ChainId) => WalletSigner;
|
|
68
|
+
//# sourceMappingURL=viem-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viem-signer.d.ts","sourceRoot":"","sources":["../../../src/shared/wallet-manager/viem-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;GAEG;AACH,qBAAa,UAAW,YAAW,YAAY;IAC3C,OAAO,CAAC,OAAO,CAAoB;IAEnC,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,KAAK,CAAoB;gBAErB,UAAU,EAAE,KAAK,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM;IAuBxE;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInD;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBlF;;;;OAIG;IACG,eAAe,CAAC,EAAE,EAAE;QACtB,EAAE,EAAE,OAAO,CAAC;QACZ,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnB;;OAEG;IACH,UAAU,IAAI,iBAAiB;CAGlC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACnC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,GACrD,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,YAAY,CAKxD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* viem Wallet Signer
|
|
3
|
+
*
|
|
4
|
+
* Implements WalletSigner interface using viem's privateKeyToAccount + createWalletClient.
|
|
5
|
+
* Provides real transaction signing and EIP-712 typed data signing.
|
|
6
|
+
*
|
|
7
|
+
* Stage 3 — Live Integration (Phase B)
|
|
8
|
+
*
|
|
9
|
+
* USAGE:
|
|
10
|
+
* import { createViemSignerFactory } from "./viem-signer";
|
|
11
|
+
* const wallet = new WalletManager("0xprivatekey...", createViemSignerFactory());
|
|
12
|
+
* const address = wallet.getAddress();
|
|
13
|
+
* const sig = await wallet.signMessage("hello");
|
|
14
|
+
*/
|
|
15
|
+
import { createWalletClient, http, defineChain } from "viem";
|
|
16
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
17
|
+
/**
|
|
18
|
+
* WalletSigner implementation backed by viem's WalletClient.
|
|
19
|
+
*/
|
|
20
|
+
export class ViemSigner {
|
|
21
|
+
account;
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
|
+
walletClient;
|
|
24
|
+
chain;
|
|
25
|
+
constructor(privateKey, chainId, rpcUrl) {
|
|
26
|
+
this.account = privateKeyToAccount(privateKey);
|
|
27
|
+
// Build a minimal viem chain definition so viem includes the
|
|
28
|
+
// correct chainId in EIP-155 signatures and knows tx type parameters.
|
|
29
|
+
this.chain = rpcUrl
|
|
30
|
+
? defineChain({
|
|
31
|
+
id: chainId,
|
|
32
|
+
name: `Chain ${chainId}`,
|
|
33
|
+
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
|
|
34
|
+
rpcUrls: {
|
|
35
|
+
default: { http: [rpcUrl] },
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
: undefined;
|
|
39
|
+
this.walletClient = createWalletClient({
|
|
40
|
+
account: this.account,
|
|
41
|
+
chain: this.chain,
|
|
42
|
+
transport: http(rpcUrl || "http://offline-signer.local"),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the wallet address derived from the private key.
|
|
47
|
+
*/
|
|
48
|
+
getAddress() {
|
|
49
|
+
return this.account.address;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Sign an arbitrary message using personal_sign.
|
|
53
|
+
*/
|
|
54
|
+
async signMessage(message) {
|
|
55
|
+
return await this.walletClient.signMessage({ account: this.account, message });
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Sign EIP-712 typed data.
|
|
59
|
+
*
|
|
60
|
+
* Used for creating intent signatures compatible with IntentSettlement.sol.
|
|
61
|
+
*/
|
|
62
|
+
async signTypedData(domain, types, value) {
|
|
63
|
+
// Extract primary type from types (usually the first key that isn't EIP712Domain)
|
|
64
|
+
const primaryType = Object.keys(types).find((t) => t !== "EIP712Domain");
|
|
65
|
+
if (!primaryType) {
|
|
66
|
+
throw new Error("Could not determine primaryType from types");
|
|
67
|
+
}
|
|
68
|
+
return await this.walletClient.signTypedData({
|
|
69
|
+
account: this.account,
|
|
70
|
+
domain,
|
|
71
|
+
types: types,
|
|
72
|
+
primaryType,
|
|
73
|
+
message: value,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Send a transaction through this wallet (sign + broadcast).
|
|
78
|
+
*
|
|
79
|
+
* Returns the transaction hash.
|
|
80
|
+
*/
|
|
81
|
+
async sendTransaction(tx) {
|
|
82
|
+
return await this.walletClient.sendTransaction({
|
|
83
|
+
account: this.account,
|
|
84
|
+
to: tx.to,
|
|
85
|
+
data: tx.data,
|
|
86
|
+
value: tx.value,
|
|
87
|
+
gas: tx.gas,
|
|
88
|
+
// Pass the configured chain; null bypasses per-call chain ID check for offline signers
|
|
89
|
+
chain: this.chain ?? null,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the underlying viem account (for advanced use cases).
|
|
94
|
+
*/
|
|
95
|
+
getAccount() {
|
|
96
|
+
return this.account;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Factory function that creates ViemSigner instances.
|
|
101
|
+
*
|
|
102
|
+
* Pass this to WalletManager constructor as the signerFactory.
|
|
103
|
+
*
|
|
104
|
+
* Factory for creating viem signers.
|
|
105
|
+
* Suitable for injection into WalletManager.
|
|
106
|
+
*
|
|
107
|
+
* @param rpcMapper - Optional function to provide RPC URLs for specific chains
|
|
108
|
+
* (required for `sendTransaction` live execution).
|
|
109
|
+
*/
|
|
110
|
+
export function createViemSignerFactory(rpcMapper) {
|
|
111
|
+
return (privateKey, chainId) => {
|
|
112
|
+
const rpcUrl = rpcMapper ? rpcMapper(chainId) : undefined;
|
|
113
|
+
return new ViemSigner(privateKey, chainId, rpcUrl);
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=viem-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viem-signer.js","sourceRoot":"","sources":["../../../src/shared/wallet-manager/viem-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAqD,MAAM,MAAM,CAAC;AAChH,OAAO,EAAE,mBAAmB,EAA0B,MAAM,eAAe,CAAC;AAI5E;;GAEG;AACH,MAAM,OAAO,UAAU;IACX,OAAO,CAAoB;IACnC,8DAA8D;IACtD,YAAY,CAAmC;IAC/C,KAAK,CAAoB;IAEjC,YAAY,UAAyB,EAAE,OAAgB,EAAE,MAAe;QACpE,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAE/C,6DAA6D;QAC7D,sEAAsE;QACtE,IAAI,CAAC,KAAK,GAAG,MAAM;YACf,CAAC,CAAC,WAAW,CAAC;gBACV,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,SAAS,OAAO,EAAE;gBACxB,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;gBAC9D,OAAO,EAAE;oBACL,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;iBAC9B;aACJ,CAAC;YACF,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC;YACnC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,MAAM,IAAI,6BAA6B,CAAC;SAC3D,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,OAAkB,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe;QAC7B,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,KAAa,EAAE,KAAa;QAC5D,kFAAkF;QAClF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC;QACzE,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;YACzC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,KAAK,EAAE,KAAgC;YACvC,WAAW;YACX,OAAO,EAAE,KAAgC;SAC5C,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,EAKrB;QACG,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC;YAC3C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,KAAK,EAAE,EAAE,CAAC,KAAK;YACf,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,uFAAuF;YACvF,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;SAC5B,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,UAAU;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;CACJ;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CACnC,SAAoD;IAEpD,OAAO,CAAC,UAAkB,EAAE,OAAgB,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,OAAO,IAAI,UAAU,CAAC,UAA2B,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACxE,CAAC,CAAC;AACN,CAAC"}
|