@agirails/sdk 2.0.1-beta → 2.0.2
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 +190 -0
- package/README.md +116 -108
- package/bin/actp +10 -0
- package/dist/ACTPClient.d.ts +456 -33
- package/dist/ACTPClient.d.ts.map +1 -1
- package/dist/ACTPClient.js +477 -93
- package/dist/ACTPClient.js.map +1 -1
- package/dist/abi/AgentRegistry.json +782 -0
- package/dist/abi/EscrowVault.json +106 -38
- package/dist/abi/IdentityRegistry.json +316 -0
- package/dist/adapters/BaseAdapter.d.ts +231 -0
- package/dist/adapters/BaseAdapter.d.ts.map +1 -0
- package/dist/adapters/BaseAdapter.js +393 -0
- package/dist/adapters/BaseAdapter.js.map +1 -0
- package/dist/adapters/BeginnerAdapter.d.ts +152 -0
- package/dist/adapters/BeginnerAdapter.d.ts.map +1 -0
- package/dist/adapters/BeginnerAdapter.js +168 -0
- package/dist/adapters/BeginnerAdapter.js.map +1 -0
- package/dist/adapters/IntermediateAdapter.d.ts +211 -0
- package/dist/adapters/IntermediateAdapter.d.ts.map +1 -0
- package/dist/adapters/IntermediateAdapter.js +260 -0
- package/dist/adapters/IntermediateAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +15 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +26 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/builders/DeliveryProofBuilder.d.ts +60 -1
- package/dist/builders/DeliveryProofBuilder.d.ts.map +1 -1
- package/dist/builders/DeliveryProofBuilder.js +81 -5
- package/dist/builders/DeliveryProofBuilder.js.map +1 -1
- package/dist/builders/QuoteBuilder.d.ts +101 -0
- package/dist/builders/QuoteBuilder.d.ts.map +1 -1
- package/dist/builders/QuoteBuilder.js +120 -3
- package/dist/builders/QuoteBuilder.js.map +1 -1
- package/dist/builders/index.d.ts +4 -0
- package/dist/builders/index.d.ts.map +1 -1
- package/dist/builders/index.js +4 -0
- package/dist/builders/index.js.map +1 -1
- package/dist/cli/commands/balance.d.ts +13 -0
- package/dist/cli/commands/balance.d.ts.map +1 -0
- package/dist/cli/commands/balance.js +89 -0
- package/dist/cli/commands/balance.js.map +1 -0
- package/dist/cli/commands/batch.d.ts +24 -0
- package/dist/cli/commands/batch.d.ts.map +1 -0
- package/dist/cli/commands/batch.js +424 -0
- package/dist/cli/commands/batch.js.map +1 -0
- package/dist/cli/commands/config.d.ts +13 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +192 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +143 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/mint.d.ts +13 -0
- package/dist/cli/commands/mint.d.ts.map +1 -0
- package/dist/cli/commands/mint.js +91 -0
- package/dist/cli/commands/mint.js.map +1 -0
- package/dist/cli/commands/pay.d.ts +18 -0
- package/dist/cli/commands/pay.d.ts.map +1 -0
- package/dist/cli/commands/pay.js +87 -0
- package/dist/cli/commands/pay.js.map +1 -0
- package/dist/cli/commands/simulate.d.ts +32 -0
- package/dist/cli/commands/simulate.d.ts.map +1 -0
- package/dist/cli/commands/simulate.js +290 -0
- package/dist/cli/commands/simulate.js.map +1 -0
- package/dist/cli/commands/time.d.ts +29 -0
- package/dist/cli/commands/time.d.ts.map +1 -0
- package/dist/cli/commands/time.js +252 -0
- package/dist/cli/commands/time.js.map +1 -0
- package/dist/cli/commands/tx.d.ts +16 -0
- package/dist/cli/commands/tx.d.ts.map +1 -0
- package/dist/cli/commands/tx.js +379 -0
- package/dist/cli/commands/tx.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +20 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +160 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +104 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/client.d.ts +70 -0
- package/dist/cli/utils/client.d.ts.map +1 -0
- package/dist/cli/utils/client.js +240 -0
- package/dist/cli/utils/client.js.map +1 -0
- package/dist/cli/utils/config.d.ts +91 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +240 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/output.d.ts +174 -0
- package/dist/cli/utils/output.d.ts.map +1 -0
- package/dist/cli/utils/output.js +380 -0
- package/dist/cli/utils/output.js.map +1 -0
- package/dist/config/networks.d.ts +28 -0
- package/dist/config/networks.d.ts.map +1 -1
- package/dist/config/networks.js +60 -12
- package/dist/config/networks.js.map +1 -1
- package/dist/errors/index.d.ts +165 -2
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +260 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +61 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +141 -36
- package/dist/index.js.map +1 -1
- package/dist/level0/Provider.d.ts +106 -0
- package/dist/level0/Provider.d.ts.map +1 -0
- package/dist/level0/Provider.js +10 -0
- package/dist/level0/Provider.js.map +1 -0
- package/dist/level0/ServiceDirectory.d.ts +74 -0
- package/dist/level0/ServiceDirectory.d.ts.map +1 -0
- package/dist/level0/ServiceDirectory.js +122 -0
- package/dist/level0/ServiceDirectory.js.map +1 -0
- package/dist/level0/index.d.ts +10 -0
- package/dist/level0/index.d.ts.map +1 -0
- package/dist/level0/index.js +15 -0
- package/dist/level0/index.js.map +1 -0
- package/dist/level0/provide.d.ts +51 -0
- package/dist/level0/provide.d.ts.map +1 -0
- package/dist/level0/provide.js +113 -0
- package/dist/level0/provide.js.map +1 -0
- package/dist/level0/request.d.ts +53 -0
- package/dist/level0/request.d.ts.map +1 -0
- package/dist/level0/request.js +462 -0
- package/dist/level0/request.js.map +1 -0
- package/dist/level1/Agent.d.ts +472 -0
- package/dist/level1/Agent.d.ts.map +1 -0
- package/dist/level1/Agent.js +1091 -0
- package/dist/level1/Agent.js.map +1 -0
- package/dist/level1/index.d.ts +10 -0
- package/dist/level1/index.d.ts.map +1 -0
- package/dist/level1/index.js +30 -0
- package/dist/level1/index.js.map +1 -0
- package/dist/level1/pricing/PriceCalculator.d.ts +62 -0
- package/dist/level1/pricing/PriceCalculator.d.ts.map +1 -0
- package/dist/level1/pricing/PriceCalculator.js +237 -0
- package/dist/level1/pricing/PriceCalculator.js.map +1 -0
- package/dist/level1/pricing/PricingStrategy.d.ts +179 -0
- package/dist/level1/pricing/PricingStrategy.d.ts.map +1 -0
- package/dist/level1/pricing/PricingStrategy.js +11 -0
- package/dist/level1/pricing/PricingStrategy.js.map +1 -0
- package/dist/level1/types/Job.d.ts +166 -0
- package/dist/level1/types/Job.d.ts.map +1 -0
- package/dist/level1/types/Job.js +11 -0
- package/dist/level1/types/Job.js.map +1 -0
- package/dist/level1/types/Options.d.ts +258 -0
- package/dist/level1/types/Options.d.ts.map +1 -0
- package/dist/level1/types/Options.js +8 -0
- package/dist/level1/types/Options.js.map +1 -0
- package/dist/level1/types/index.d.ts +8 -0
- package/dist/level1/types/index.d.ts.map +1 -0
- package/dist/level1/types/index.js +8 -0
- package/dist/level1/types/index.js.map +1 -0
- package/dist/protocol/ACTPKernel.d.ts +229 -2
- package/dist/protocol/ACTPKernel.d.ts.map +1 -1
- package/dist/protocol/ACTPKernel.js +367 -33
- package/dist/protocol/ACTPKernel.js.map +1 -1
- package/dist/protocol/AgentRegistry.d.ts +177 -0
- package/dist/protocol/AgentRegistry.d.ts.map +1 -0
- package/dist/protocol/AgentRegistry.js +449 -0
- package/dist/protocol/AgentRegistry.js.map +1 -0
- package/dist/protocol/DIDManager.d.ts +289 -0
- package/dist/protocol/DIDManager.d.ts.map +1 -0
- package/dist/protocol/DIDManager.js +481 -0
- package/dist/protocol/DIDManager.js.map +1 -0
- package/dist/protocol/DIDResolver.d.ts +236 -0
- package/dist/protocol/DIDResolver.d.ts.map +1 -0
- package/dist/protocol/DIDResolver.js +495 -0
- package/dist/protocol/DIDResolver.js.map +1 -0
- package/dist/protocol/EASHelper.d.ts +57 -2
- package/dist/protocol/EASHelper.d.ts.map +1 -1
- package/dist/protocol/EASHelper.js +230 -37
- package/dist/protocol/EASHelper.js.map +1 -1
- package/dist/protocol/EscrowVault.d.ts +93 -2
- package/dist/protocol/EscrowVault.d.ts.map +1 -1
- package/dist/protocol/EscrowVault.js +122 -33
- package/dist/protocol/EscrowVault.js.map +1 -1
- package/dist/protocol/EventMonitor.d.ts +45 -1
- package/dist/protocol/EventMonitor.d.ts.map +1 -1
- package/dist/protocol/EventMonitor.js +64 -8
- package/dist/protocol/EventMonitor.js.map +1 -1
- package/dist/protocol/MessageSigner.d.ts +116 -2
- package/dist/protocol/MessageSigner.d.ts.map +1 -1
- package/dist/protocol/MessageSigner.js +215 -9
- package/dist/protocol/MessageSigner.js.map +1 -1
- package/dist/protocol/ProofGenerator.d.ts +93 -0
- package/dist/protocol/ProofGenerator.d.ts.map +1 -1
- package/dist/protocol/ProofGenerator.js +194 -9
- package/dist/protocol/ProofGenerator.js.map +1 -1
- package/dist/protocol/QuoteBuilder.d.ts +8 -0
- package/dist/protocol/QuoteBuilder.d.ts.map +1 -1
- package/dist/protocol/QuoteBuilder.js +8 -0
- package/dist/protocol/QuoteBuilder.js.map +1 -1
- package/dist/runtime/BlockchainRuntime.d.ts +360 -0
- package/dist/runtime/BlockchainRuntime.d.ts.map +1 -0
- package/dist/runtime/BlockchainRuntime.js +767 -0
- package/dist/runtime/BlockchainRuntime.js.map +1 -0
- package/dist/runtime/IACTPRuntime.d.ts +271 -0
- package/dist/runtime/IACTPRuntime.d.ts.map +1 -0
- package/dist/runtime/IACTPRuntime.js +15 -0
- package/dist/runtime/IACTPRuntime.js.map +1 -0
- package/dist/runtime/MockRuntime.d.ts +445 -0
- package/dist/runtime/MockRuntime.d.ts.map +1 -0
- package/dist/runtime/MockRuntime.js +1065 -0
- package/dist/runtime/MockRuntime.js.map +1 -0
- package/dist/runtime/MockStateManager.d.ts +233 -0
- package/dist/runtime/MockStateManager.d.ts.map +1 -0
- package/dist/runtime/MockStateManager.js +533 -0
- package/dist/runtime/MockStateManager.js.map +1 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +42 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/types/MockState.d.ts +167 -0
- package/dist/runtime/types/MockState.d.ts.map +1 -0
- package/dist/runtime/types/MockState.js +43 -0
- package/dist/runtime/types/MockState.js.map +1 -0
- package/dist/types/agent.d.ts +76 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +8 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/did.d.ts +192 -0
- package/dist/types/did.d.ts.map +1 -0
- package/dist/types/did.js +38 -0
- package/dist/types/did.js.map +1 -0
- package/dist/types/eip712.d.ts +34 -0
- package/dist/types/eip712.d.ts.map +1 -1
- package/dist/types/eip712.js +31 -5
- package/dist/types/eip712.js.map +1 -1
- package/dist/types/escrow.d.ts +17 -10
- package/dist/types/escrow.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/message.d.ts +32 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js +4 -0
- package/dist/types/message.js.map +1 -1
- package/dist/types/state.d.ts +28 -0
- package/dist/types/state.d.ts.map +1 -1
- package/dist/types/state.js +37 -6
- package/dist/types/state.js.map +1 -1
- package/dist/types/transaction.d.ts +17 -0
- package/dist/types/transaction.d.ts.map +1 -1
- package/dist/utils/ErrorRecoveryGuide.d.ts +125 -0
- package/dist/utils/ErrorRecoveryGuide.d.ts.map +1 -0
- package/dist/utils/ErrorRecoveryGuide.js +579 -0
- package/dist/utils/ErrorRecoveryGuide.js.map +1 -0
- package/dist/utils/Helpers.d.ts +453 -0
- package/dist/utils/Helpers.d.ts.map +1 -0
- package/dist/utils/Helpers.js +623 -0
- package/dist/utils/Helpers.js.map +1 -0
- package/dist/utils/IPFSClient.d.ts +113 -0
- package/dist/utils/IPFSClient.d.ts.map +1 -1
- package/dist/utils/IPFSClient.js +128 -7
- package/dist/utils/IPFSClient.js.map +1 -1
- package/dist/utils/Logger.d.ts +195 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +382 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/NonceManager.d.ts +234 -1
- package/dist/utils/NonceManager.d.ts.map +1 -1
- package/dist/utils/NonceManager.js +372 -7
- package/dist/utils/NonceManager.js.map +1 -1
- package/dist/utils/RateLimiter.d.ts +253 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +424 -0
- package/dist/utils/RateLimiter.js.map +1 -0
- package/dist/utils/ReceivedNonceTracker.d.ts +175 -0
- package/dist/utils/ReceivedNonceTracker.d.ts.map +1 -1
- package/dist/utils/ReceivedNonceTracker.js +261 -5
- package/dist/utils/ReceivedNonceTracker.js.map +1 -1
- package/dist/utils/SDKLifecycle.d.ts +156 -0
- package/dist/utils/SDKLifecycle.d.ts.map +1 -0
- package/dist/utils/SDKLifecycle.js +347 -0
- package/dist/utils/SDKLifecycle.js.map +1 -0
- package/dist/utils/SecureNonce.d.ts +57 -0
- package/dist/utils/SecureNonce.d.ts.map +1 -0
- package/dist/utils/SecureNonce.js +80 -0
- package/dist/utils/SecureNonce.js.map +1 -0
- package/dist/utils/Semaphore.d.ts +123 -0
- package/dist/utils/Semaphore.d.ts.map +1 -0
- package/dist/utils/Semaphore.js +247 -0
- package/dist/utils/Semaphore.js.map +1 -0
- package/dist/utils/UsedAttestationTracker.d.ts +167 -0
- package/dist/utils/UsedAttestationTracker.d.ts.map +1 -0
- package/dist/utils/UsedAttestationTracker.js +309 -0
- package/dist/utils/UsedAttestationTracker.js.map +1 -0
- package/dist/utils/canonicalJson.d.ts +22 -0
- package/dist/utils/canonicalJson.d.ts.map +1 -1
- package/dist/utils/canonicalJson.js +26 -3
- package/dist/utils/canonicalJson.js.map +1 -1
- package/dist/utils/computeTypeHash.d.ts +14 -0
- package/dist/utils/computeTypeHash.d.ts.map +1 -1
- package/dist/utils/computeTypeHash.js +19 -2
- package/dist/utils/computeTypeHash.js.map +1 -1
- package/dist/utils/fsSafe.d.ts +14 -0
- package/dist/utils/fsSafe.d.ts.map +1 -0
- package/dist/utils/fsSafe.js +89 -0
- package/dist/utils/fsSafe.js.map +1 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +51 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/security.d.ts +147 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +391 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/validation.d.ts +40 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +184 -7
- package/dist/utils/validation.js.map +1 -1
- package/package.json +54 -37
- package/src/ACTPClient.ts +692 -178
- package/src/abi/AgentRegistry.json +782 -0
- package/src/abi/EscrowVault.json +106 -38
- package/src/abi/IdentityRegistry.json +316 -0
- package/src/adapters/BaseAdapter.ts +473 -0
- package/src/adapters/BeginnerAdapter.ts +232 -0
- package/src/adapters/IntermediateAdapter.ts +316 -0
- package/src/adapters/index.ts +25 -0
- package/src/builders/DeliveryProofBuilder.ts +3 -2
- package/src/cli/commands/balance.ts +110 -0
- package/src/cli/commands/batch.ts +487 -0
- package/src/cli/commands/config.ts +231 -0
- package/src/cli/commands/init.ts +161 -0
- package/src/cli/commands/mint.ts +116 -0
- package/src/cli/commands/pay.ts +113 -0
- package/src/cli/commands/simulate.ts +345 -0
- package/src/cli/commands/time.ts +303 -0
- package/src/cli/commands/tx.ts +448 -0
- package/src/cli/commands/watch.ts +211 -0
- package/src/cli/index.ts +116 -0
- package/src/cli/utils/client.ts +249 -0
- package/src/cli/utils/config.ts +282 -0
- package/src/cli/utils/output.ts +465 -0
- package/src/config/networks.ts +32 -9
- package/src/errors/index.ts +298 -1
- package/src/index.ts +207 -71
- package/src/level0/Provider.ts +117 -0
- package/src/level0/ServiceDirectory.ts +131 -0
- package/src/level0/index.ts +10 -0
- package/src/level0/provide.ts +131 -0
- package/src/level0/request.ts +494 -0
- package/src/level1/Agent.ts +1432 -0
- package/src/level1/index.ts +10 -0
- package/src/level1/pricing/PriceCalculator.ts +255 -0
- package/src/level1/pricing/PricingStrategy.ts +198 -0
- package/src/level1/types/Job.ts +179 -0
- package/src/level1/types/Options.ts +291 -0
- package/src/level1/types/index.ts +8 -0
- package/src/protocol/ACTPKernel.ts +175 -23
- package/src/protocol/AgentRegistry.ts +559 -0
- package/src/protocol/DIDManager.ts +629 -0
- package/src/protocol/DIDResolver.ts +554 -0
- package/src/protocol/EASHelper.ts +230 -46
- package/src/protocol/EscrowVault.ts +68 -50
- package/src/protocol/EventMonitor.ts +44 -15
- package/src/protocol/MessageSigner.ts +193 -13
- package/src/protocol/ProofGenerator.ts +223 -4
- package/src/runtime/BlockchainRuntime.ts +993 -0
- package/src/runtime/IACTPRuntime.ts +284 -0
- package/src/runtime/MockRuntime.ts +1244 -0
- package/src/runtime/MockStateManager.ts +576 -0
- package/src/runtime/index.ts +25 -0
- package/src/runtime/types/MockState.ts +227 -0
- package/src/types/agent.ts +79 -0
- package/src/types/did.ts +223 -0
- package/src/types/escrow.ts +12 -11
- package/src/types/index.ts +5 -1
- package/src/types/state.ts +12 -3
- package/src/types/transaction.ts +4 -1
- package/src/utils/ErrorRecoveryGuide.ts +675 -0
- package/src/utils/Helpers.ts +688 -0
- package/src/utils/IPFSClient.ts +122 -5
- package/src/utils/Logger.ts +484 -0
- package/src/utils/NonceManager.ts +305 -8
- package/src/utils/RateLimiter.ts +534 -0
- package/src/utils/ReceivedNonceTracker.ts +170 -0
- package/src/utils/SDKLifecycle.ts +416 -0
- package/src/utils/SecureNonce.ts +78 -0
- package/src/utils/Semaphore.ts +276 -0
- package/src/utils/UsedAttestationTracker.ts +387 -0
- package/src/utils/fsSafe.ts +75 -0
- package/src/utils/index.ts +80 -0
- package/src/utils/security.ts +418 -0
- package/src/utils/validation.ts +164 -0
- package/src/__tests__/ProofGenerator.test.ts +0 -124
- package/src/__tests__/QuoteBuilder.test.ts +0 -516
- package/src/__tests__/StateMachine.test.ts +0 -82
- package/src/__tests__/builders/DeliveryProofBuilder.test.ts +0 -581
- package/src/__tests__/integration/ACTPClient.test.ts +0 -263
- package/src/__tests__/integration.test.ts +0 -289
- package/src/__tests__/protocol/EASHelper.test.ts +0 -472
- package/src/__tests__/protocol/EventMonitor.test.ts +0 -382
- package/src/__tests__/security/ACTPKernel.security.test.ts +0 -1167
- package/src/__tests__/security/EscrowVault.security.test.ts +0 -570
- package/src/__tests__/security/MessageSigner.security.test.ts +0 -286
- package/src/__tests__/security/NonceReplay.security.test.ts +0 -501
- package/src/__tests__/security/validation.security.test.ts +0 -376
- package/src/__tests__/utils/IPFSClient.test.ts +0 -262
- package/src/__tests__/utils/NonceManager.test.ts +0 -205
- package/src/__tests__/utils/canonicalJson.test.ts +0 -153
|
@@ -9,6 +9,25 @@ const EscrowVault_json_1 = __importDefault(require("../abi/EscrowVault.json"));
|
|
|
9
9
|
const ERC20_json_1 = __importDefault(require("../abi/ERC20.json"));
|
|
10
10
|
const errors_1 = require("../errors");
|
|
11
11
|
const validation_1 = require("../utils/validation");
|
|
12
|
+
/**
|
|
13
|
+
* EscrowVault - Escrow contract wrapper
|
|
14
|
+
*
|
|
15
|
+
* IMPORTANT:
|
|
16
|
+
* - Escrow creation happens atomically inside `ACTPKernel.linkEscrow()`.
|
|
17
|
+
* - Payout/refund functions are `onlyKernel` on-chain and MUST NOT be called by users.
|
|
18
|
+
*
|
|
19
|
+
* This module provides:
|
|
20
|
+
* - Helper methods for USDC approvals (requester → EscrowVault allowance)
|
|
21
|
+
* - Read-only access to escrow state (`escrows()` / `remaining()`)
|
|
22
|
+
*
|
|
23
|
+
* Workflow (per AIP-3):
|
|
24
|
+
* 1. Consumer approves USDC to EscrowVault address (use approveToken)
|
|
25
|
+
* 2. Consumer calls ACTPKernel.linkEscrow(txId, escrowVault, escrowId)
|
|
26
|
+
* 3. Kernel internally calls IEscrowValidator.createEscrow(escrowId, requester, provider, amount)
|
|
27
|
+
* 4. Escrow pulls USDC from requester
|
|
28
|
+
*
|
|
29
|
+
* Reference: AIP-3 §3.2 (Escrow Linking Workflow), lines 258-336
|
|
30
|
+
*/
|
|
12
31
|
class EscrowVault {
|
|
13
32
|
constructor(address, signer, gasSettings) {
|
|
14
33
|
this.address = address;
|
|
@@ -16,17 +35,43 @@ class EscrowVault {
|
|
|
16
35
|
this.contract = new ethers_1.Contract(address, EscrowVault_json_1.default, signer);
|
|
17
36
|
this.gasSettings = gasSettings;
|
|
18
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Get gas buffer multiplier based on operation complexity
|
|
40
|
+
* V6 Security Enhancement: Operation-specific gas buffers
|
|
41
|
+
* Reference: SDK_SECURITY_ANALYSIS-Ultra-Think.md Lines 326-337
|
|
42
|
+
*/
|
|
19
43
|
getGasBufferMultiplier(operation) {
|
|
20
44
|
const buffers = {
|
|
21
|
-
'
|
|
22
|
-
'approveToken': 1.20
|
|
45
|
+
'approveToken': 1.20 // 20% - Standard ERC20 approval
|
|
23
46
|
};
|
|
24
|
-
return buffers[operation] || 1.20;
|
|
47
|
+
return buffers[operation] || 1.20; // Default 20% for unknown operations
|
|
25
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Build transaction options with gas settings and estimated gas
|
|
51
|
+
* V6 Enhancement: Dynamic buffer based on operation type
|
|
52
|
+
*
|
|
53
|
+
* SECURITY FIX (NEW-C-1): Gas estimation manipulation attack protection
|
|
54
|
+
* - Enforces minimum gas floor regardless of estimate
|
|
55
|
+
* - Uses safe BigInt arithmetic with overflow detection
|
|
56
|
+
*/
|
|
26
57
|
buildTxOptions(estimatedGas, operation = 'default') {
|
|
58
|
+
// SECURITY FIX (NEW-C-1): Minimum gas floor to prevent manipulation
|
|
59
|
+
// Malicious contracts could return artificially low gas estimates
|
|
60
|
+
const MIN_GAS_FLOOR = 100000n;
|
|
61
|
+
const safeEstimate = estimatedGas > MIN_GAS_FLOOR ? estimatedGas : MIN_GAS_FLOOR;
|
|
27
62
|
const bufferMultiplier = this.getGasBufferMultiplier(operation);
|
|
63
|
+
// SECURITY FIX (NEW-H-1): Safe BigInt arithmetic with overflow check
|
|
64
|
+
// Use 10000 denominator to avoid floating point precision issues
|
|
65
|
+
const bufferNumerator = BigInt(Math.floor(bufferMultiplier * 10000));
|
|
66
|
+
const bufferDenominator = 10000n;
|
|
67
|
+
const gasLimit = (safeEstimate * bufferNumerator) / bufferDenominator;
|
|
68
|
+
// Overflow detection: result should always be >= original estimate
|
|
69
|
+
if (gasLimit < safeEstimate) {
|
|
70
|
+
throw new Error(`Gas calculation overflow detected for operation ${operation}. ` +
|
|
71
|
+
`Estimate: ${safeEstimate}, Buffer: ${bufferMultiplier}x, Result: ${gasLimit}`);
|
|
72
|
+
}
|
|
28
73
|
const options = {
|
|
29
|
-
gasLimit
|
|
74
|
+
gasLimit
|
|
30
75
|
};
|
|
31
76
|
if (this.gasSettings?.maxFeePerGas) {
|
|
32
77
|
options.maxFeePerGas = this.gasSettings.maxFeePerGas;
|
|
@@ -36,22 +81,63 @@ class EscrowVault {
|
|
|
36
81
|
}
|
|
37
82
|
return options;
|
|
38
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Get escrow vault address
|
|
86
|
+
*/
|
|
39
87
|
getAddress() {
|
|
40
88
|
return this.address;
|
|
41
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Get the underlying ethers Contract instance.
|
|
92
|
+
*
|
|
93
|
+
* SECURITY FIX (C-3): Provides public access to contract for EventMonitor
|
|
94
|
+
* instead of accessing private field via bracket notation.
|
|
95
|
+
*
|
|
96
|
+
* @returns ethers Contract instance
|
|
97
|
+
*/
|
|
98
|
+
getContract() {
|
|
99
|
+
return this.contract;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Approve USDC token for escrow creation
|
|
103
|
+
*
|
|
104
|
+
* IMPORTANT: Call this BEFORE ACTPKernel.linkEscrow()
|
|
105
|
+
* The consumer must approve EscrowVault to pull USDC when linkEscrow() is called
|
|
106
|
+
*
|
|
107
|
+
* @param tokenAddress - USDC contract address
|
|
108
|
+
* @param amount - Amount to approve (in USDC wei, 6 decimals)
|
|
109
|
+
* @throws {ValidationError} If inputs are invalid
|
|
110
|
+
* @throws {TransactionRevertedError} If approval fails
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* // Approve 100 USDC for escrow
|
|
115
|
+
* const amount = ethers.parseUnits('100', 6);
|
|
116
|
+
* await client.escrow.approveToken(BASE_SEPOLIA.contracts.usdc, amount);
|
|
117
|
+
*
|
|
118
|
+
* // Now call linkEscrow via Kernel
|
|
119
|
+
* const escrowId = ethers.id(`escrow-${Date.now()}`);
|
|
120
|
+
* await client.kernel.linkEscrow(txId, escrowVault, escrowId);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
42
123
|
async approveToken(tokenAddress, amount) {
|
|
43
124
|
(0, validation_1.validateAddress)(tokenAddress, 'tokenAddress');
|
|
44
125
|
(0, validation_1.validateAmount)(amount, 'amount');
|
|
45
126
|
const tokenContract = new ethers_1.Contract(tokenAddress, ERC20_json_1.default, this.signer);
|
|
46
127
|
try {
|
|
128
|
+
// Check current allowance
|
|
47
129
|
const currentAllowance = await tokenContract.allowance(await this.signer.getAddress(), this.address);
|
|
130
|
+
// Only approve if needed
|
|
48
131
|
if (currentAllowance < amount) {
|
|
49
132
|
const approveFunc = tokenContract.getFunction('approve');
|
|
133
|
+
// USDC-compatible approval pattern:
|
|
134
|
+
// If any residual allowance exists, reset to zero first
|
|
50
135
|
if (currentAllowance > 0n) {
|
|
51
136
|
const resetGas = await approveFunc.estimateGas(this.address, 0);
|
|
52
137
|
const resetTx = await approveFunc(this.address, 0, this.buildTxOptions(resetGas, 'approveToken'));
|
|
53
138
|
await resetTx.wait();
|
|
54
139
|
}
|
|
140
|
+
// Now set the new allowance
|
|
55
141
|
const approveGas = await approveFunc.estimateGas(this.address, amount);
|
|
56
142
|
const approveTx = await approveFunc(this.address, amount, this.buildTxOptions(approveGas, 'approveToken'));
|
|
57
143
|
await approveTx.wait();
|
|
@@ -61,50 +147,53 @@ class EscrowVault {
|
|
|
61
147
|
throw new errors_1.TransactionRevertedError(error.transactionHash, `Token approval failed: ${error.reason || error.message}`);
|
|
62
148
|
}
|
|
63
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Get escrow details
|
|
152
|
+
*/
|
|
64
153
|
async getEscrow(escrowId) {
|
|
154
|
+
(0, validation_1.validateTxId)(escrowId, 'escrowId');
|
|
65
155
|
const escrowData = await this.contract.escrows(escrowId);
|
|
66
156
|
return {
|
|
67
157
|
escrowId,
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
token: escrowData.token,
|
|
158
|
+
requester: escrowData.requester,
|
|
159
|
+
provider: escrowData.provider,
|
|
71
160
|
amount: escrowData.amount,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
released: escrowData.released
|
|
161
|
+
releasedAmount: escrowData.releasedAmount,
|
|
162
|
+
active: escrowData.active
|
|
75
163
|
};
|
|
76
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* Get escrow remaining balance (amount - releasedAmount)
|
|
167
|
+
*/
|
|
77
168
|
async getEscrowBalance(escrowId) {
|
|
78
|
-
|
|
79
|
-
return
|
|
169
|
+
(0, validation_1.validateTxId)(escrowId, 'escrowId');
|
|
170
|
+
return await this.contract.remaining(escrowId);
|
|
80
171
|
}
|
|
81
|
-
|
|
172
|
+
/**
|
|
173
|
+
* @deprecated
|
|
174
|
+
*
|
|
175
|
+
* Payouts/refunds are executed by ACTPKernel (on-chain) as part of state transitions.
|
|
176
|
+
* EscrowVault disbursement methods are `onlyKernel` and cannot be called by EOAs.
|
|
177
|
+
*
|
|
178
|
+
* Use:
|
|
179
|
+
* - `BlockchainRuntime.releaseEscrow(txId, attestationUID?)` (recommended)
|
|
180
|
+
* - or `ACTPKernel.transitionState(txId, State.SETTLED, proof)` (advanced)
|
|
181
|
+
*/
|
|
182
|
+
async releaseEscrow(escrowId, _recipients, _amounts) {
|
|
82
183
|
(0, validation_1.validateTxId)(escrowId, 'escrowId');
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
if (recipients.length === 0) {
|
|
87
|
-
throw new errors_1.ValidationError('recipients', 'Must provide at least one recipient');
|
|
88
|
-
}
|
|
89
|
-
recipients.forEach((recipient, i) => {
|
|
90
|
-
(0, validation_1.validateAddress)(recipient, `recipients[${i}]`);
|
|
91
|
-
(0, validation_1.validateAmount)(amounts[i], `amounts[${i}]`);
|
|
92
|
-
});
|
|
93
|
-
try {
|
|
94
|
-
const disburseFunc = this.contract.getFunction('disburse');
|
|
95
|
-
const estimatedGas = await disburseFunc.estimateGas(escrowId, recipients, amounts);
|
|
96
|
-
const txOptions = this.buildTxOptions(estimatedGas, 'releaseEscrow');
|
|
97
|
-
const tx = await disburseFunc(escrowId, recipients, amounts, txOptions);
|
|
98
|
-
await tx.wait();
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
throw new errors_1.TransactionRevertedError(error.transactionHash, error.reason || error.message);
|
|
102
|
-
}
|
|
184
|
+
throw new errors_1.ValidationError('EscrowVault.releaseEscrow', 'Escrow payouts are performed by ACTPKernel (onlyKernel). ' +
|
|
185
|
+
'Use BlockchainRuntime.releaseEscrow(txId, attestationUID?) or ACTPKernel.transitionState(txId, SETTLED).');
|
|
103
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Check token balance
|
|
189
|
+
*/
|
|
104
190
|
async getTokenBalance(tokenAddress, account) {
|
|
105
191
|
const tokenContract = new ethers_1.Contract(tokenAddress, ERC20_json_1.default, this.signer);
|
|
106
192
|
return await tokenContract.balanceOf(account);
|
|
107
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Check token allowance
|
|
196
|
+
*/
|
|
108
197
|
async getTokenAllowance(tokenAddress, owner, spender) {
|
|
109
198
|
const tokenContract = new ethers_1.Contract(tokenAddress, ERC20_json_1.default, this.signer);
|
|
110
199
|
return await tokenContract.allowance(owner, spender);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EscrowVault.js","sourceRoot":"","sources":["../../src/protocol/EscrowVault.ts"],"names":[],"mappings":";;;;;;AAAA,mCAA0C;AAC1C,+EAAqD;AACrD,mEAAyC;AAEzC,sCAAsE;AACtE,oDAI6B;
|
|
1
|
+
{"version":3,"file":"EscrowVault.js","sourceRoot":"","sources":["../../src/protocol/EscrowVault.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,62 @@
|
|
|
1
1
|
import { Contract } from 'ethers';
|
|
2
2
|
import { State, Transaction } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* EventMonitor - Listen to blockchain events
|
|
5
|
+
*
|
|
6
|
+
* SECURITY FIX (EVENT-MONITOR): Corrected event parameter order to match ABI.
|
|
7
|
+
* Per ACTPKernel.json, TransactionCreated signature is:
|
|
8
|
+
* (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
9
|
+
*
|
|
10
|
+
* Previous code had requester/provider swapped which caused wrong filter results.
|
|
11
|
+
*/
|
|
3
12
|
export declare class EventMonitor {
|
|
4
13
|
private readonly kernelContract;
|
|
5
14
|
constructor(kernelContract: Contract, _escrowContract: Contract);
|
|
15
|
+
/**
|
|
16
|
+
* Watch transaction state changes
|
|
17
|
+
* Returns cleanup function to stop watching
|
|
18
|
+
*/
|
|
6
19
|
watchTransaction(txId: string, callback: (state: State) => void): () => void;
|
|
20
|
+
/**
|
|
21
|
+
* Wait for specific state
|
|
22
|
+
*/
|
|
7
23
|
waitForState(txId: string, targetState: State, timeoutMs?: number): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Get all transactions for an address
|
|
26
|
+
*
|
|
27
|
+
* SECURITY FIX (EVENT-MONITOR): Corrected filter parameter order.
|
|
28
|
+
* Per ACTPKernel.json ABI, TransactionCreated event signature is:
|
|
29
|
+
* (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
30
|
+
*
|
|
31
|
+
* Filter order: TransactionCreated(txId, requester, provider)
|
|
32
|
+
* - To filter by requester: (null, address, null)
|
|
33
|
+
* - To filter by provider: (null, null, address)
|
|
34
|
+
*
|
|
35
|
+
* SECURITY FIX (EVENT-MONITOR): Use getTransaction() instead of transactions()
|
|
36
|
+
* The kernel contract exposes getTransaction(bytes32) not transactions(bytes32).
|
|
37
|
+
*/
|
|
8
38
|
getTransactionHistory(address: string, role?: 'requester' | 'provider'): Promise<Transaction[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Subscribe to transaction creation events
|
|
41
|
+
*
|
|
42
|
+
* SECURITY FIX (EVENT-MONITOR): Corrected event parameter order.
|
|
43
|
+
* Per ACTPKernel.json ABI:
|
|
44
|
+
* TransactionCreated(bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
45
|
+
*/
|
|
9
46
|
onTransactionCreated(callback: (tx: {
|
|
10
47
|
txId: string;
|
|
11
|
-
provider: string;
|
|
12
48
|
requester: string;
|
|
49
|
+
provider: string;
|
|
13
50
|
amount: bigint;
|
|
51
|
+
serviceHash?: string;
|
|
14
52
|
}) => void): () => void;
|
|
53
|
+
/**
|
|
54
|
+
* Subscribe to state change events
|
|
55
|
+
*/
|
|
15
56
|
onStateChanged(callback: (txId: string, from: State, to: State) => void): () => void;
|
|
57
|
+
/**
|
|
58
|
+
* Subscribe to escrow release events
|
|
59
|
+
*/
|
|
16
60
|
onEscrowReleased(callback: (txId: string, amount: bigint) => void): () => void;
|
|
17
61
|
}
|
|
18
62
|
//# sourceMappingURL=EventMonitor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventMonitor.d.ts","sourceRoot":"","sources":["../../src/protocol/EventMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"EventMonitor.d.ts","sourceRoot":"","sources":["../../src/protocol/EventMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE9C;;;;;;;;GAQG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,QAAQ,EACzC,eAAe,EAAE,QAAQ;IAG3B;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAe5E;;OAEG;IACG,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,KAAK,EAClB,SAAS,GAAE,MAAc,GACxB,OAAO,CAAC,IAAI,CAAC;IAiBhB;;;;;;;;;;;;;OAaG;IACG,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,WAAW,GAAG,UAAwB,GAC3C,OAAO,CAAC,WAAW,EAAE,CAAC;IA6CzB;;;;;;OAMG;IACH,oBAAoB,CAClB,QAAQ,EAAE,CAAC,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAClH,MAAM,IAAI;IAqBb;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,KAAK,IAAI,GACvD,MAAM,IAAI;IAcb;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;CAa/E"}
|
|
@@ -2,20 +2,37 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EventMonitor = void 0;
|
|
4
4
|
const types_1 = require("../types");
|
|
5
|
+
/**
|
|
6
|
+
* EventMonitor - Listen to blockchain events
|
|
7
|
+
*
|
|
8
|
+
* SECURITY FIX (EVENT-MONITOR): Corrected event parameter order to match ABI.
|
|
9
|
+
* Per ACTPKernel.json, TransactionCreated signature is:
|
|
10
|
+
* (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
11
|
+
*
|
|
12
|
+
* Previous code had requester/provider swapped which caused wrong filter results.
|
|
13
|
+
*/
|
|
5
14
|
class EventMonitor {
|
|
6
15
|
constructor(kernelContract, _escrowContract) {
|
|
7
16
|
this.kernelContract = kernelContract;
|
|
8
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Watch transaction state changes
|
|
20
|
+
* Returns cleanup function to stop watching
|
|
21
|
+
*/
|
|
9
22
|
watchTransaction(txId, callback) {
|
|
10
23
|
const filter = this.kernelContract.filters.StateTransitioned(txId);
|
|
11
24
|
const listener = (_eventTxId, _from, to) => {
|
|
12
25
|
callback(to);
|
|
13
26
|
};
|
|
14
27
|
this.kernelContract.on(filter, listener);
|
|
28
|
+
// Return cleanup function
|
|
15
29
|
return () => {
|
|
16
30
|
this.kernelContract.off(filter, listener);
|
|
17
31
|
};
|
|
18
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Wait for specific state
|
|
35
|
+
*/
|
|
19
36
|
async waitForState(txId, targetState, timeoutMs = 60000) {
|
|
20
37
|
return new Promise((resolve, reject) => {
|
|
21
38
|
const timer = setTimeout(() => {
|
|
@@ -31,42 +48,78 @@ class EventMonitor {
|
|
|
31
48
|
});
|
|
32
49
|
});
|
|
33
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Get all transactions for an address
|
|
53
|
+
*
|
|
54
|
+
* SECURITY FIX (EVENT-MONITOR): Corrected filter parameter order.
|
|
55
|
+
* Per ACTPKernel.json ABI, TransactionCreated event signature is:
|
|
56
|
+
* (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
57
|
+
*
|
|
58
|
+
* Filter order: TransactionCreated(txId, requester, provider)
|
|
59
|
+
* - To filter by requester: (null, address, null)
|
|
60
|
+
* - To filter by provider: (null, null, address)
|
|
61
|
+
*
|
|
62
|
+
* SECURITY FIX (EVENT-MONITOR): Use getTransaction() instead of transactions()
|
|
63
|
+
* The kernel contract exposes getTransaction(bytes32) not transactions(bytes32).
|
|
64
|
+
*/
|
|
34
65
|
async getTransactionHistory(address, role = 'requester') {
|
|
66
|
+
// TransactionCreated event signature per ABI:
|
|
67
|
+
// (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
68
|
+
// Filter format: TransactionCreated(txId, requester, provider)
|
|
35
69
|
const filter = role === 'requester'
|
|
36
|
-
? this.kernelContract.filters.TransactionCreated(null,
|
|
37
|
-
: this.kernelContract.filters.TransactionCreated(null,
|
|
70
|
+
? this.kernelContract.filters.TransactionCreated(null, address, null) // Match requester (2nd indexed param)
|
|
71
|
+
: this.kernelContract.filters.TransactionCreated(null, null, address); // Match provider (3rd indexed param)
|
|
38
72
|
const events = await this.kernelContract.queryFilter(filter);
|
|
39
73
|
return Promise.all(events.map(async (event) => {
|
|
74
|
+
// ethers v6: EventLog has args, Log does not
|
|
40
75
|
if (!('args' in event)) {
|
|
41
76
|
throw new Error('Event does not contain args (not an EventLog)');
|
|
42
77
|
}
|
|
43
78
|
const txId = event.args?.transactionId;
|
|
44
|
-
|
|
79
|
+
// SECURITY FIX: Use getTransaction() - the actual ABI function
|
|
80
|
+
// Previous code called transactions(txId) which doesn't exist in ABI
|
|
81
|
+
const txData = await this.kernelContract.getTransaction(txId);
|
|
45
82
|
return {
|
|
46
|
-
txId: txData.transactionId,
|
|
83
|
+
txId: txData.transactionId || txId,
|
|
47
84
|
requester: txData.requester,
|
|
48
85
|
provider: txData.provider,
|
|
49
86
|
amount: txData.amount,
|
|
50
|
-
state: txData.state,
|
|
87
|
+
state: (typeof txData.state === 'bigint' ? Number(txData.state) : txData.state),
|
|
51
88
|
createdAt: Number(txData.createdAt),
|
|
89
|
+
updatedAt: Number(txData.updatedAt),
|
|
52
90
|
deadline: Number(txData.deadline),
|
|
53
91
|
disputeWindow: Number(txData.disputeWindow),
|
|
54
92
|
escrowContract: txData.escrowContract,
|
|
55
93
|
escrowId: txData.escrowId,
|
|
56
|
-
|
|
94
|
+
serviceHash: txData.serviceHash,
|
|
95
|
+
attestationUID: txData.attestationUID,
|
|
96
|
+
// Use metadata field (quote hash for QUOTED state) if available, fallback to serviceHash
|
|
97
|
+
metadata: txData.metadata || txData.serviceHash,
|
|
98
|
+
platformFeeBpsLocked: Number(txData.platformFeeBpsLocked)
|
|
57
99
|
};
|
|
58
100
|
}));
|
|
59
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Subscribe to transaction creation events
|
|
104
|
+
*
|
|
105
|
+
* SECURITY FIX (EVENT-MONITOR): Corrected event parameter order.
|
|
106
|
+
* Per ACTPKernel.json ABI:
|
|
107
|
+
* TransactionCreated(bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
108
|
+
*/
|
|
60
109
|
onTransactionCreated(callback) {
|
|
61
110
|
const filter = this.kernelContract.filters.TransactionCreated();
|
|
62
|
-
|
|
63
|
-
|
|
111
|
+
// Event signature per ABI: (txId, requester, provider, amount, serviceHash)
|
|
112
|
+
const listener = async (txId, requester, provider, amount, serviceHash) => {
|
|
113
|
+
callback({ txId, requester, provider, amount, serviceHash });
|
|
64
114
|
};
|
|
65
115
|
this.kernelContract.on(filter, listener);
|
|
66
116
|
return () => {
|
|
67
117
|
this.kernelContract.off(filter, listener);
|
|
68
118
|
};
|
|
69
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Subscribe to state change events
|
|
122
|
+
*/
|
|
70
123
|
onStateChanged(callback) {
|
|
71
124
|
const filter = this.kernelContract.filters.StateTransitioned();
|
|
72
125
|
const listener = (txId, from, to) => {
|
|
@@ -77,6 +130,9 @@ class EventMonitor {
|
|
|
77
130
|
this.kernelContract.off(filter, listener);
|
|
78
131
|
};
|
|
79
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Subscribe to escrow release events
|
|
135
|
+
*/
|
|
80
136
|
onEscrowReleased(callback) {
|
|
81
137
|
const filter = this.kernelContract.filters.EscrowReleased();
|
|
82
138
|
const listener = (txId, amount) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventMonitor.js","sourceRoot":"","sources":["../../src/protocol/EventMonitor.ts"],"names":[],"mappings":";;;AACA,oCAA8C;
|
|
1
|
+
{"version":3,"file":"EventMonitor.js","sourceRoot":"","sources":["../../src/protocol/EventMonitor.ts"],"names":[],"mappings":";;;AACA,oCAA8C;AAE9C;;;;;;;;GAQG;AACH,MAAa,YAAY;IACvB,YACmB,cAAwB,EACzC,eAAyB;QADR,mBAAc,GAAd,cAAc,CAAU;IAExC,CAAC;IAEJ;;;OAGG;IACH,gBAAgB,CAAC,IAAY,EAAE,QAAgC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAG,CAAC,UAAkB,EAAE,KAAa,EAAE,EAAU,EAAE,EAAE;YACjE,QAAQ,CAAC,EAAW,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEzC,0BAA0B;QAC1B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,IAAY,EACZ,WAAkB,EAClB,YAAoB,KAAK;QAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,aAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC,EAAE,SAAS,CAAC,CAAC;YAEd,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;gBACpD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;oBAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,qBAAqB,CACzB,OAAe,EACf,OAAiC,WAAW;QAE5C,8CAA8C;QAC9C,4HAA4H;QAC5H,+DAA+D;QAC/D,MAAM,MAAM,GACV,IAAI,KAAK,WAAW;YAClB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,sCAAsC;YAC5G,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,qCAAqC;QAEhH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE7D,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACzB,6CAA6C;YAC7C,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YACD,MAAM,IAAI,GAAI,KAAkB,CAAC,IAAI,EAAE,aAAa,CAAC;YAErD,+DAA+D;YAC/D,qEAAqE;YACrE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAE9D,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;gBAClC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,KAAK,EAAE,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAU;gBACxF,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;gBACnC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;gBACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACjC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3C,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,yFAAyF;gBACzF,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW;gBAC/C,oBAAoB,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;aAC1D,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAClB,QAAmH;QAEnH,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAEhE,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,KAAK,EACpB,IAAY,EACZ,SAAiB,EACjB,QAAgB,EAChB,MAAc,EACd,WAAoB,EACpB,EAAE;YACF,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CACZ,QAAwD;QAExD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAE/D,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE;YAC1D,QAAQ,CAAC,IAAI,EAAE,IAAa,EAAE,EAAW,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAgD;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAE5D,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;YAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;CACF;AAhLD,oCAgLC"}
|
|
@@ -1,23 +1,137 @@
|
|
|
1
1
|
import { Signer } from 'ethers';
|
|
2
2
|
import { ACTPMessage, DeliveryProof } from '../types';
|
|
3
|
-
import { QuoteRequestData, QuoteResponseData, DeliveryProofData } from '../types/eip712';
|
|
3
|
+
import { EIP712Domain, QuoteRequestData, QuoteResponseData, DeliveryProofData } from '../types/eip712';
|
|
4
4
|
import { IReceivedNonceTracker } from '../utils/ReceivedNonceTracker';
|
|
5
|
+
/**
|
|
6
|
+
* MessageSigner - Cryptographic signing for ACTP messages with EIP-712
|
|
7
|
+
* Reference: Yellow Paper §11.4.2
|
|
8
|
+
*
|
|
9
|
+
* V4 Security Enhancement: Optional nonce replay protection via ReceivedNonceTracker
|
|
10
|
+
*
|
|
11
|
+
* IMPORTANT: Use MessageSigner.create() factory method to ensure domain is initialized.
|
|
12
|
+
*/
|
|
5
13
|
export declare class MessageSigner {
|
|
6
14
|
private readonly signer;
|
|
7
15
|
private readonly nonceTracker?;
|
|
8
16
|
private domain;
|
|
9
|
-
|
|
17
|
+
/**
|
|
18
|
+
* SECURITY FIX (H-5): Private constructor - MUST use MessageSigner.create() factory method
|
|
19
|
+
*
|
|
20
|
+
* This ensures EIP-712 domain is ALWAYS initialized before use (prevents race conditions).
|
|
21
|
+
* Direct construction would allow calling sign/verify without domain initialization.
|
|
22
|
+
*/
|
|
23
|
+
private constructor();
|
|
24
|
+
/**
|
|
25
|
+
* SECURITY FIX (H-4): Factory method to create MessageSigner with guaranteed domain initialization
|
|
26
|
+
*
|
|
27
|
+
* This factory ensures the EIP-712 domain is always properly initialized before use.
|
|
28
|
+
* Prevents the common bug of calling sign/verify without initializing domain first.
|
|
29
|
+
*
|
|
30
|
+
* @param signer - Ethers signer for signing messages
|
|
31
|
+
* @param kernelAddress - Address of ACTP Kernel contract (for domain separation)
|
|
32
|
+
* @param options - Optional configuration (chainId, nonceTracker)
|
|
33
|
+
* @returns Promise resolving to initialized MessageSigner
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const messageSigner = await MessageSigner.create(
|
|
38
|
+
* signer,
|
|
39
|
+
* KERNEL_ADDRESS,
|
|
40
|
+
* { chainId: 84532 }
|
|
41
|
+
* );
|
|
42
|
+
* const signature = await messageSigner.signMessage(message);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
static create(signer: Signer, kernelAddress: string, options?: {
|
|
46
|
+
chainId?: number;
|
|
47
|
+
nonceTracker?: IReceivedNonceTracker;
|
|
48
|
+
}): Promise<MessageSigner>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if domain is initialized
|
|
51
|
+
* @returns true if domain has been initialized
|
|
52
|
+
*/
|
|
53
|
+
isDomainInitialized(): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Get the current domain (throws if not initialized)
|
|
56
|
+
* @returns Current EIP-712 domain
|
|
57
|
+
* @throws Error if domain not initialized
|
|
58
|
+
*/
|
|
59
|
+
getDomain(): EIP712Domain;
|
|
60
|
+
/**
|
|
61
|
+
* Initialize EIP-712 domain (must be called before signing)
|
|
62
|
+
* @param kernelAddress - Address of ACTP Kernel contract
|
|
63
|
+
* @param chainId - Optional chainId (defaults to signer's chainId or 84532 for Base Sepolia)
|
|
64
|
+
*/
|
|
10
65
|
initDomain(kernelAddress: string, chainId?: number): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Sign ACTP message using EIP-712 typed data
|
|
68
|
+
* Uses ECDSA (secp256k1) with domain separation per Yellow Paper §11.4.2
|
|
69
|
+
*
|
|
70
|
+
* SECURITY FIX (H-3): Validates nonce format and warns about sequential nonces
|
|
71
|
+
*
|
|
72
|
+
* Generic ACTPMessage format (backward compatible).
|
|
73
|
+
* For strict typed AIP messages, use signQuoteRequest/signQuoteResponse/signDeliveryProof
|
|
74
|
+
*/
|
|
11
75
|
signMessage(message: ACTPMessage): Promise<string>;
|
|
76
|
+
/**
|
|
77
|
+
* Sign typed QuoteRequest message
|
|
78
|
+
*/
|
|
12
79
|
signQuoteRequest(data: QuoteRequestData): Promise<string>;
|
|
80
|
+
/**
|
|
81
|
+
* Sign typed QuoteResponse message
|
|
82
|
+
*/
|
|
13
83
|
signQuoteResponse(data: QuoteResponseData): Promise<string>;
|
|
84
|
+
/**
|
|
85
|
+
* Sign typed DeliveryProof message
|
|
86
|
+
*/
|
|
14
87
|
signDeliveryProof(data: DeliveryProofData): Promise<string>;
|
|
88
|
+
/**
|
|
89
|
+
* Convenience helper to sign a DeliveryProof generated by ProofGenerator
|
|
90
|
+
*/
|
|
15
91
|
signGeneratedDeliveryProof(proof: DeliveryProof): Promise<string>;
|
|
92
|
+
/**
|
|
93
|
+
* Verify message signature using EIP-712
|
|
94
|
+
* Uses generic ACTPMessage types (backward compatible)
|
|
95
|
+
*
|
|
96
|
+
* V4 Security: If nonceTracker is configured, validates nonce for replay protection
|
|
97
|
+
*/
|
|
16
98
|
verifySignature(message: ACTPMessage, signature: string): Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Verify signature and throw if invalid
|
|
101
|
+
* V4 Security: Throws specific error for nonce replay detection
|
|
102
|
+
*/
|
|
17
103
|
verifySignatureOrThrow(message: ACTPMessage, signature: string): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Canonicalize payload to deterministic string (recursively sorted keys)
|
|
106
|
+
* Prevents JSON serialization ambiguity across different JS runtimes
|
|
107
|
+
* Recursively handles nested objects and arrays
|
|
108
|
+
*/
|
|
18
109
|
private canonicalizePayload;
|
|
110
|
+
/**
|
|
111
|
+
* Recursively sort object keys for deterministic JSON encoding
|
|
112
|
+
*/
|
|
19
113
|
private recursiveSort;
|
|
114
|
+
/**
|
|
115
|
+
* Convert DID to Ethereum address
|
|
116
|
+
*
|
|
117
|
+
* SECURITY FIX (DID-FORMAT): Handles both DID formats:
|
|
118
|
+
* - Legacy: did:ethr:<address>
|
|
119
|
+
* - Canonical (EIP-3770): did:ethr:<chainId>:<address>
|
|
120
|
+
*
|
|
121
|
+
* Examples:
|
|
122
|
+
* - "did:ethr:0x1234...abcd" → "0x1234...abcd"
|
|
123
|
+
* - "did:ethr:84532:0x1234...abcd" → "0x1234...abcd"
|
|
124
|
+
* - "0x1234...abcd" → "0x1234...abcd" (raw address passthrough)
|
|
125
|
+
*/
|
|
20
126
|
private didToAddress;
|
|
127
|
+
/**
|
|
128
|
+
* Convert Ethereum address to DID
|
|
129
|
+
*
|
|
130
|
+
* SECURITY FIX (DID-FORMAT): Now generates canonical DID format
|
|
131
|
+
* with chainId when domain is initialized: did:ethr:<chainId>:<address>
|
|
132
|
+
*
|
|
133
|
+
* Falls back to legacy format if domain not initialized.
|
|
134
|
+
*/
|
|
21
135
|
addressToDID(address: string): string;
|
|
22
136
|
}
|
|
23
137
|
//# sourceMappingURL=MessageSigner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageSigner.d.ts","sourceRoot":"","sources":["../../src/protocol/MessageSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,
|
|
1
|
+
{"version":3,"file":"MessageSigner.d.ts","sourceRoot":"","sources":["../../src/protocol/MessageSigner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EACL,YAAY,EAEZ,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAkBtE;;;;;;;GAOG;AACH,qBAAa,aAAa;IAUtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAVhC,OAAO,CAAC,MAAM,CAA6B;IAE3C;;;;;OAKG;IACH,OAAO;IAKP;;;;;;;;;;;;;;;;;;;;OAoBG;WACU,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,qBAAqB,CAAC;KACtC,GACA,OAAO,CAAC,aAAa,CAAC;IAMzB;;;OAGG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;;;OAIG;IACH,SAAS,IAAI,YAAY;IASzB;;;;OAIG;IACG,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BxE;;;;;;;;OAQG;IACG,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAsExD;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/D;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYjE;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYjE;;OAEG;IACG,0BAA0B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAKvE;;;;;OAKG;IACG,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqDhF;;;OAGG;IACG,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4CpF;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IA8DpB;;;;;;;OAOG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAatC"}
|