@agirails/sdk 2.0.0 → 2.0.1-beta
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/README.md +108 -116
- package/dist/ACTPClient.d.ts +33 -456
- package/dist/ACTPClient.d.ts.map +1 -1
- package/dist/ACTPClient.js +93 -477
- package/dist/ACTPClient.js.map +1 -1
- package/dist/abi/EscrowVault.json +38 -106
- package/dist/builders/DeliveryProofBuilder.d.ts +1 -60
- package/dist/builders/DeliveryProofBuilder.d.ts.map +1 -1
- package/dist/builders/DeliveryProofBuilder.js +5 -81
- package/dist/builders/DeliveryProofBuilder.js.map +1 -1
- package/dist/builders/QuoteBuilder.d.ts +0 -101
- package/dist/builders/QuoteBuilder.d.ts.map +1 -1
- package/dist/builders/QuoteBuilder.js +3 -120
- package/dist/builders/QuoteBuilder.js.map +1 -1
- package/dist/builders/index.d.ts +0 -4
- package/dist/builders/index.d.ts.map +1 -1
- package/dist/builders/index.js +0 -4
- package/dist/builders/index.js.map +1 -1
- package/dist/config/networks.d.ts +0 -28
- package/dist/config/networks.d.ts.map +1 -1
- package/dist/config/networks.js +12 -60
- package/dist/config/networks.js.map +1 -1
- package/dist/errors/index.d.ts +2 -165
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +2 -260
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +13 -61
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -141
- package/dist/index.js.map +1 -1
- package/dist/protocol/ACTPKernel.d.ts +2 -229
- package/dist/protocol/ACTPKernel.d.ts.map +1 -1
- package/dist/protocol/ACTPKernel.js +33 -367
- package/dist/protocol/ACTPKernel.js.map +1 -1
- package/dist/protocol/EASHelper.d.ts +2 -57
- package/dist/protocol/EASHelper.d.ts.map +1 -1
- package/dist/protocol/EASHelper.js +37 -230
- package/dist/protocol/EASHelper.js.map +1 -1
- package/dist/protocol/EscrowVault.d.ts +2 -93
- package/dist/protocol/EscrowVault.d.ts.map +1 -1
- package/dist/protocol/EscrowVault.js +33 -122
- package/dist/protocol/EscrowVault.js.map +1 -1
- package/dist/protocol/EventMonitor.d.ts +1 -45
- package/dist/protocol/EventMonitor.d.ts.map +1 -1
- package/dist/protocol/EventMonitor.js +8 -64
- package/dist/protocol/EventMonitor.js.map +1 -1
- package/dist/protocol/MessageSigner.d.ts +2 -116
- package/dist/protocol/MessageSigner.d.ts.map +1 -1
- package/dist/protocol/MessageSigner.js +9 -215
- package/dist/protocol/MessageSigner.js.map +1 -1
- package/dist/protocol/ProofGenerator.d.ts +0 -93
- package/dist/protocol/ProofGenerator.d.ts.map +1 -1
- package/dist/protocol/ProofGenerator.js +9 -194
- package/dist/protocol/ProofGenerator.js.map +1 -1
- package/dist/protocol/QuoteBuilder.d.ts +0 -8
- package/dist/protocol/QuoteBuilder.d.ts.map +1 -1
- package/dist/protocol/QuoteBuilder.js +0 -8
- package/dist/protocol/QuoteBuilder.js.map +1 -1
- package/dist/types/eip712.d.ts +0 -34
- package/dist/types/eip712.d.ts.map +1 -1
- package/dist/types/eip712.js +5 -31
- package/dist/types/eip712.js.map +1 -1
- package/dist/types/escrow.d.ts +10 -17
- package/dist/types/escrow.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -8
- package/dist/types/index.js.map +1 -1
- package/dist/types/message.d.ts +0 -32
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js +0 -4
- package/dist/types/message.js.map +1 -1
- package/dist/types/state.d.ts +0 -28
- package/dist/types/state.d.ts.map +1 -1
- package/dist/types/state.js +6 -37
- package/dist/types/state.js.map +1 -1
- package/dist/types/transaction.d.ts +0 -17
- package/dist/types/transaction.d.ts.map +1 -1
- package/dist/utils/IPFSClient.d.ts +0 -113
- package/dist/utils/IPFSClient.d.ts.map +1 -1
- package/dist/utils/IPFSClient.js +7 -128
- package/dist/utils/IPFSClient.js.map +1 -1
- package/dist/utils/NonceManager.d.ts +1 -234
- package/dist/utils/NonceManager.d.ts.map +1 -1
- package/dist/utils/NonceManager.js +7 -372
- package/dist/utils/NonceManager.js.map +1 -1
- package/dist/utils/ReceivedNonceTracker.d.ts +0 -175
- package/dist/utils/ReceivedNonceTracker.d.ts.map +1 -1
- package/dist/utils/ReceivedNonceTracker.js +5 -261
- package/dist/utils/ReceivedNonceTracker.js.map +1 -1
- package/dist/utils/canonicalJson.d.ts +0 -22
- package/dist/utils/canonicalJson.d.ts.map +1 -1
- package/dist/utils/canonicalJson.js +3 -26
- package/dist/utils/canonicalJson.js.map +1 -1
- package/dist/utils/computeTypeHash.d.ts +0 -14
- package/dist/utils/computeTypeHash.d.ts.map +1 -1
- package/dist/utils/computeTypeHash.js +2 -19
- package/dist/utils/computeTypeHash.js.map +1 -1
- package/dist/utils/validation.d.ts +0 -40
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +7 -184
- package/dist/utils/validation.js.map +1 -1
- package/package.json +37 -54
- package/src/ACTPClient.ts +178 -692
- package/src/__tests__/ProofGenerator.test.ts +124 -0
- package/src/__tests__/QuoteBuilder.test.ts +516 -0
- package/src/__tests__/StateMachine.test.ts +82 -0
- package/src/__tests__/builders/DeliveryProofBuilder.test.ts +581 -0
- package/src/__tests__/integration/ACTPClient.test.ts +263 -0
- package/src/__tests__/integration.test.ts +289 -0
- package/src/__tests__/protocol/EASHelper.test.ts +472 -0
- package/src/__tests__/protocol/EventMonitor.test.ts +382 -0
- package/src/__tests__/security/ACTPKernel.security.test.ts +1167 -0
- package/src/__tests__/security/EscrowVault.security.test.ts +570 -0
- package/src/__tests__/security/MessageSigner.security.test.ts +286 -0
- package/src/__tests__/security/NonceReplay.security.test.ts +501 -0
- package/src/__tests__/security/validation.security.test.ts +376 -0
- package/src/__tests__/utils/IPFSClient.test.ts +262 -0
- package/src/__tests__/utils/NonceManager.test.ts +205 -0
- package/src/__tests__/utils/canonicalJson.test.ts +153 -0
- package/src/abi/EscrowVault.json +38 -106
- package/src/builders/DeliveryProofBuilder.ts +2 -3
- package/src/config/networks.ts +9 -32
- package/src/errors/index.ts +1 -298
- package/src/index.ts +71 -207
- package/src/protocol/ACTPKernel.ts +23 -175
- package/src/protocol/EASHelper.ts +46 -230
- package/src/protocol/EscrowVault.ts +50 -68
- package/src/protocol/EventMonitor.ts +15 -44
- package/src/protocol/MessageSigner.ts +13 -193
- package/src/protocol/ProofGenerator.ts +4 -223
- package/src/types/escrow.ts +11 -12
- package/src/types/index.ts +1 -5
- package/src/types/state.ts +3 -12
- package/src/types/transaction.ts +1 -4
- package/src/utils/IPFSClient.ts +5 -122
- package/src/utils/NonceManager.ts +8 -305
- package/src/utils/ReceivedNonceTracker.ts +0 -170
- package/src/utils/validation.ts +0 -164
- package/LICENSE +0 -190
- package/bin/actp +0 -10
- package/dist/abi/AgentRegistry.json +0 -782
- package/dist/abi/IdentityRegistry.json +0 -316
- package/dist/adapters/BaseAdapter.d.ts +0 -231
- package/dist/adapters/BaseAdapter.d.ts.map +0 -1
- package/dist/adapters/BaseAdapter.js +0 -393
- package/dist/adapters/BaseAdapter.js.map +0 -1
- package/dist/adapters/BeginnerAdapter.d.ts +0 -152
- package/dist/adapters/BeginnerAdapter.d.ts.map +0 -1
- package/dist/adapters/BeginnerAdapter.js +0 -168
- package/dist/adapters/BeginnerAdapter.js.map +0 -1
- package/dist/adapters/IntermediateAdapter.d.ts +0 -211
- package/dist/adapters/IntermediateAdapter.d.ts.map +0 -1
- package/dist/adapters/IntermediateAdapter.js +0 -260
- package/dist/adapters/IntermediateAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -15
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -26
- package/dist/adapters/index.js.map +0 -1
- package/dist/cli/commands/balance.d.ts +0 -13
- package/dist/cli/commands/balance.d.ts.map +0 -1
- package/dist/cli/commands/balance.js +0 -89
- package/dist/cli/commands/balance.js.map +0 -1
- package/dist/cli/commands/batch.d.ts +0 -24
- package/dist/cli/commands/batch.d.ts.map +0 -1
- package/dist/cli/commands/batch.js +0 -424
- package/dist/cli/commands/batch.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -13
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -192
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -19
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -143
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/mint.d.ts +0 -13
- package/dist/cli/commands/mint.d.ts.map +0 -1
- package/dist/cli/commands/mint.js +0 -91
- package/dist/cli/commands/mint.js.map +0 -1
- package/dist/cli/commands/pay.d.ts +0 -18
- package/dist/cli/commands/pay.d.ts.map +0 -1
- package/dist/cli/commands/pay.js +0 -87
- package/dist/cli/commands/pay.js.map +0 -1
- package/dist/cli/commands/simulate.d.ts +0 -32
- package/dist/cli/commands/simulate.d.ts.map +0 -1
- package/dist/cli/commands/simulate.js +0 -290
- package/dist/cli/commands/simulate.js.map +0 -1
- package/dist/cli/commands/time.d.ts +0 -29
- package/dist/cli/commands/time.d.ts.map +0 -1
- package/dist/cli/commands/time.js +0 -252
- package/dist/cli/commands/time.js.map +0 -1
- package/dist/cli/commands/tx.d.ts +0 -16
- package/dist/cli/commands/tx.d.ts.map +0 -1
- package/dist/cli/commands/tx.js +0 -379
- package/dist/cli/commands/tx.js.map +0 -1
- package/dist/cli/commands/watch.d.ts +0 -20
- package/dist/cli/commands/watch.d.ts.map +0 -1
- package/dist/cli/commands/watch.js +0 -160
- package/dist/cli/commands/watch.js.map +0 -1
- package/dist/cli/index.d.ts +0 -17
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -104
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/utils/client.d.ts +0 -70
- package/dist/cli/utils/client.d.ts.map +0 -1
- package/dist/cli/utils/client.js +0 -240
- package/dist/cli/utils/client.js.map +0 -1
- package/dist/cli/utils/config.d.ts +0 -91
- package/dist/cli/utils/config.d.ts.map +0 -1
- package/dist/cli/utils/config.js +0 -240
- package/dist/cli/utils/config.js.map +0 -1
- package/dist/cli/utils/output.d.ts +0 -174
- package/dist/cli/utils/output.d.ts.map +0 -1
- package/dist/cli/utils/output.js +0 -380
- package/dist/cli/utils/output.js.map +0 -1
- package/dist/level0/Provider.d.ts +0 -106
- package/dist/level0/Provider.d.ts.map +0 -1
- package/dist/level0/Provider.js +0 -10
- package/dist/level0/Provider.js.map +0 -1
- package/dist/level0/ServiceDirectory.d.ts +0 -74
- package/dist/level0/ServiceDirectory.d.ts.map +0 -1
- package/dist/level0/ServiceDirectory.js +0 -122
- package/dist/level0/ServiceDirectory.js.map +0 -1
- package/dist/level0/index.d.ts +0 -10
- package/dist/level0/index.d.ts.map +0 -1
- package/dist/level0/index.js +0 -15
- package/dist/level0/index.js.map +0 -1
- package/dist/level0/provide.d.ts +0 -51
- package/dist/level0/provide.d.ts.map +0 -1
- package/dist/level0/provide.js +0 -113
- package/dist/level0/provide.js.map +0 -1
- package/dist/level0/request.d.ts +0 -53
- package/dist/level0/request.d.ts.map +0 -1
- package/dist/level0/request.js +0 -462
- package/dist/level0/request.js.map +0 -1
- package/dist/level1/Agent.d.ts +0 -472
- package/dist/level1/Agent.d.ts.map +0 -1
- package/dist/level1/Agent.js +0 -1091
- package/dist/level1/Agent.js.map +0 -1
- package/dist/level1/index.d.ts +0 -10
- package/dist/level1/index.d.ts.map +0 -1
- package/dist/level1/index.js +0 -30
- package/dist/level1/index.js.map +0 -1
- package/dist/level1/pricing/PriceCalculator.d.ts +0 -62
- package/dist/level1/pricing/PriceCalculator.d.ts.map +0 -1
- package/dist/level1/pricing/PriceCalculator.js +0 -237
- package/dist/level1/pricing/PriceCalculator.js.map +0 -1
- package/dist/level1/pricing/PricingStrategy.d.ts +0 -179
- package/dist/level1/pricing/PricingStrategy.d.ts.map +0 -1
- package/dist/level1/pricing/PricingStrategy.js +0 -11
- package/dist/level1/pricing/PricingStrategy.js.map +0 -1
- package/dist/level1/types/Job.d.ts +0 -166
- package/dist/level1/types/Job.d.ts.map +0 -1
- package/dist/level1/types/Job.js +0 -11
- package/dist/level1/types/Job.js.map +0 -1
- package/dist/level1/types/Options.d.ts +0 -258
- package/dist/level1/types/Options.d.ts.map +0 -1
- package/dist/level1/types/Options.js +0 -8
- package/dist/level1/types/Options.js.map +0 -1
- package/dist/level1/types/index.d.ts +0 -8
- package/dist/level1/types/index.d.ts.map +0 -1
- package/dist/level1/types/index.js +0 -8
- package/dist/level1/types/index.js.map +0 -1
- package/dist/protocol/AgentRegistry.d.ts +0 -177
- package/dist/protocol/AgentRegistry.d.ts.map +0 -1
- package/dist/protocol/AgentRegistry.js +0 -449
- package/dist/protocol/AgentRegistry.js.map +0 -1
- package/dist/protocol/DIDManager.d.ts +0 -289
- package/dist/protocol/DIDManager.d.ts.map +0 -1
- package/dist/protocol/DIDManager.js +0 -481
- package/dist/protocol/DIDManager.js.map +0 -1
- package/dist/protocol/DIDResolver.d.ts +0 -236
- package/dist/protocol/DIDResolver.d.ts.map +0 -1
- package/dist/protocol/DIDResolver.js +0 -495
- package/dist/protocol/DIDResolver.js.map +0 -1
- package/dist/runtime/BlockchainRuntime.d.ts +0 -360
- package/dist/runtime/BlockchainRuntime.d.ts.map +0 -1
- package/dist/runtime/BlockchainRuntime.js +0 -767
- package/dist/runtime/BlockchainRuntime.js.map +0 -1
- package/dist/runtime/IACTPRuntime.d.ts +0 -271
- package/dist/runtime/IACTPRuntime.d.ts.map +0 -1
- package/dist/runtime/IACTPRuntime.js +0 -15
- package/dist/runtime/IACTPRuntime.js.map +0 -1
- package/dist/runtime/MockRuntime.d.ts +0 -445
- package/dist/runtime/MockRuntime.d.ts.map +0 -1
- package/dist/runtime/MockRuntime.js +0 -1065
- package/dist/runtime/MockRuntime.js.map +0 -1
- package/dist/runtime/MockStateManager.d.ts +0 -233
- package/dist/runtime/MockStateManager.d.ts.map +0 -1
- package/dist/runtime/MockStateManager.js +0 -533
- package/dist/runtime/MockStateManager.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -14
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -42
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/types/MockState.d.ts +0 -167
- package/dist/runtime/types/MockState.d.ts.map +0 -1
- package/dist/runtime/types/MockState.js +0 -43
- package/dist/runtime/types/MockState.js.map +0 -1
- package/dist/types/agent.d.ts +0 -76
- package/dist/types/agent.d.ts.map +0 -1
- package/dist/types/agent.js +0 -8
- package/dist/types/agent.js.map +0 -1
- package/dist/types/did.d.ts +0 -192
- package/dist/types/did.d.ts.map +0 -1
- package/dist/types/did.js +0 -38
- package/dist/types/did.js.map +0 -1
- package/dist/utils/ErrorRecoveryGuide.d.ts +0 -125
- package/dist/utils/ErrorRecoveryGuide.d.ts.map +0 -1
- package/dist/utils/ErrorRecoveryGuide.js +0 -579
- package/dist/utils/ErrorRecoveryGuide.js.map +0 -1
- package/dist/utils/Helpers.d.ts +0 -453
- package/dist/utils/Helpers.d.ts.map +0 -1
- package/dist/utils/Helpers.js +0 -623
- package/dist/utils/Helpers.js.map +0 -1
- package/dist/utils/Logger.d.ts +0 -195
- package/dist/utils/Logger.d.ts.map +0 -1
- package/dist/utils/Logger.js +0 -382
- package/dist/utils/Logger.js.map +0 -1
- package/dist/utils/RateLimiter.d.ts +0 -253
- package/dist/utils/RateLimiter.d.ts.map +0 -1
- package/dist/utils/RateLimiter.js +0 -424
- package/dist/utils/RateLimiter.js.map +0 -1
- package/dist/utils/SDKLifecycle.d.ts +0 -156
- package/dist/utils/SDKLifecycle.d.ts.map +0 -1
- package/dist/utils/SDKLifecycle.js +0 -347
- package/dist/utils/SDKLifecycle.js.map +0 -1
- package/dist/utils/SecureNonce.d.ts +0 -57
- package/dist/utils/SecureNonce.d.ts.map +0 -1
- package/dist/utils/SecureNonce.js +0 -80
- package/dist/utils/SecureNonce.js.map +0 -1
- package/dist/utils/Semaphore.d.ts +0 -123
- package/dist/utils/Semaphore.d.ts.map +0 -1
- package/dist/utils/Semaphore.js +0 -247
- package/dist/utils/Semaphore.js.map +0 -1
- package/dist/utils/UsedAttestationTracker.d.ts +0 -167
- package/dist/utils/UsedAttestationTracker.d.ts.map +0 -1
- package/dist/utils/UsedAttestationTracker.js +0 -309
- package/dist/utils/UsedAttestationTracker.js.map +0 -1
- package/dist/utils/fsSafe.d.ts +0 -14
- package/dist/utils/fsSafe.d.ts.map +0 -1
- package/dist/utils/fsSafe.js +0 -89
- package/dist/utils/fsSafe.js.map +0 -1
- package/dist/utils/index.d.ts +0 -15
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -51
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/security.d.ts +0 -147
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -391
- package/dist/utils/security.js.map +0 -1
- package/src/abi/AgentRegistry.json +0 -782
- package/src/abi/IdentityRegistry.json +0 -316
- package/src/adapters/BaseAdapter.ts +0 -473
- package/src/adapters/BeginnerAdapter.ts +0 -232
- package/src/adapters/IntermediateAdapter.ts +0 -316
- package/src/adapters/index.ts +0 -25
- package/src/cli/commands/balance.ts +0 -110
- package/src/cli/commands/batch.ts +0 -487
- package/src/cli/commands/config.ts +0 -231
- package/src/cli/commands/init.ts +0 -161
- package/src/cli/commands/mint.ts +0 -116
- package/src/cli/commands/pay.ts +0 -113
- package/src/cli/commands/simulate.ts +0 -345
- package/src/cli/commands/time.ts +0 -303
- package/src/cli/commands/tx.ts +0 -448
- package/src/cli/commands/watch.ts +0 -211
- package/src/cli/index.ts +0 -116
- package/src/cli/utils/client.ts +0 -249
- package/src/cli/utils/config.ts +0 -282
- package/src/cli/utils/output.ts +0 -465
- package/src/level0/Provider.ts +0 -117
- package/src/level0/ServiceDirectory.ts +0 -131
- package/src/level0/index.ts +0 -10
- package/src/level0/provide.ts +0 -131
- package/src/level0/request.ts +0 -494
- package/src/level1/Agent.ts +0 -1432
- package/src/level1/index.ts +0 -10
- package/src/level1/pricing/PriceCalculator.ts +0 -255
- package/src/level1/pricing/PricingStrategy.ts +0 -198
- package/src/level1/types/Job.ts +0 -179
- package/src/level1/types/Options.ts +0 -291
- package/src/level1/types/index.ts +0 -8
- package/src/protocol/AgentRegistry.ts +0 -559
- package/src/protocol/DIDManager.ts +0 -629
- package/src/protocol/DIDResolver.ts +0 -554
- package/src/runtime/BlockchainRuntime.ts +0 -993
- package/src/runtime/IACTPRuntime.ts +0 -284
- package/src/runtime/MockRuntime.ts +0 -1244
- package/src/runtime/MockStateManager.ts +0 -576
- package/src/runtime/index.ts +0 -25
- package/src/runtime/types/MockState.ts +0 -227
- package/src/types/agent.ts +0 -79
- package/src/types/did.ts +0 -223
- package/src/utils/ErrorRecoveryGuide.ts +0 -675
- package/src/utils/Helpers.ts +0 -688
- package/src/utils/Logger.ts +0 -484
- package/src/utils/RateLimiter.ts +0 -534
- package/src/utils/SDKLifecycle.ts +0 -416
- package/src/utils/SecureNonce.ts +0 -78
- package/src/utils/Semaphore.ts +0 -276
- package/src/utils/UsedAttestationTracker.ts +0 -387
- package/src/utils/fsSafe.ts +0 -75
- package/src/utils/index.ts +0 -80
- package/src/utils/security.ts +0 -418
|
@@ -20,19 +20,15 @@ interface GasOptions {
|
|
|
20
20
|
/**
|
|
21
21
|
* EscrowVault - Escrow contract wrapper
|
|
22
22
|
*
|
|
23
|
-
* IMPORTANT:
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* This module provides:
|
|
28
|
-
* - Helper methods for USDC approvals (requester → EscrowVault allowance)
|
|
29
|
-
* - Read-only access to escrow state (`escrows()` / `remaining()`)
|
|
23
|
+
* IMPORTANT: Per AIP-3 specification, escrow creation happens atomically
|
|
24
|
+
* inside ACTPKernel.linkEscrow(). This module provides read-only access
|
|
25
|
+
* to escrow state and helper methods for USDC approvals.
|
|
30
26
|
*
|
|
31
27
|
* Workflow (per AIP-3):
|
|
32
28
|
* 1. Consumer approves USDC to EscrowVault address (use approveToken)
|
|
33
29
|
* 2. Consumer calls ACTPKernel.linkEscrow(txId, escrowVault, escrowId)
|
|
34
|
-
* 3. Kernel internally calls
|
|
35
|
-
* 4. Escrow pulls USDC from
|
|
30
|
+
* 3. Kernel internally calls EscrowVault.createEscrow() (onlyKernel modifier)
|
|
31
|
+
* 4. Escrow pulls USDC from consumer and auto-transitions to COMMITTED
|
|
36
32
|
*
|
|
37
33
|
* Reference: AIP-3 §3.2 (Escrow Linking Workflow), lines 258-336
|
|
38
34
|
*/
|
|
@@ -56,6 +52,7 @@ export class EscrowVault {
|
|
|
56
52
|
*/
|
|
57
53
|
private getGasBufferMultiplier(operation: string): number {
|
|
58
54
|
const buffers: Record<string, number> = {
|
|
55
|
+
'releaseEscrow': 1.30, // 30% - Multi-recipient disbursement
|
|
59
56
|
'approveToken': 1.20 // 20% - Standard ERC20 approval
|
|
60
57
|
};
|
|
61
58
|
|
|
@@ -65,35 +62,12 @@ export class EscrowVault {
|
|
|
65
62
|
/**
|
|
66
63
|
* Build transaction options with gas settings and estimated gas
|
|
67
64
|
* V6 Enhancement: Dynamic buffer based on operation type
|
|
68
|
-
*
|
|
69
|
-
* SECURITY FIX (NEW-C-1): Gas estimation manipulation attack protection
|
|
70
|
-
* - Enforces minimum gas floor regardless of estimate
|
|
71
|
-
* - Uses safe BigInt arithmetic with overflow detection
|
|
72
65
|
*/
|
|
73
66
|
private buildTxOptions(estimatedGas: bigint, operation: string = 'default'): any {
|
|
74
|
-
// SECURITY FIX (NEW-C-1): Minimum gas floor to prevent manipulation
|
|
75
|
-
// Malicious contracts could return artificially low gas estimates
|
|
76
|
-
const MIN_GAS_FLOOR = 100000n;
|
|
77
|
-
const safeEstimate = estimatedGas > MIN_GAS_FLOOR ? estimatedGas : MIN_GAS_FLOOR;
|
|
78
|
-
|
|
79
67
|
const bufferMultiplier = this.getGasBufferMultiplier(operation);
|
|
80
68
|
|
|
81
|
-
// SECURITY FIX (NEW-H-1): Safe BigInt arithmetic with overflow check
|
|
82
|
-
// Use 10000 denominator to avoid floating point precision issues
|
|
83
|
-
const bufferNumerator = BigInt(Math.floor(bufferMultiplier * 10000));
|
|
84
|
-
const bufferDenominator = 10000n;
|
|
85
|
-
const gasLimit = (safeEstimate * bufferNumerator) / bufferDenominator;
|
|
86
|
-
|
|
87
|
-
// Overflow detection: result should always be >= original estimate
|
|
88
|
-
if (gasLimit < safeEstimate) {
|
|
89
|
-
throw new Error(
|
|
90
|
-
`Gas calculation overflow detected for operation ${operation}. ` +
|
|
91
|
-
`Estimate: ${safeEstimate}, Buffer: ${bufferMultiplier}x, Result: ${gasLimit}`
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
69
|
const options: any = {
|
|
96
|
-
gasLimit
|
|
70
|
+
gasLimit: (estimatedGas * BigInt(Math.round(bufferMultiplier * 100))) / 100n
|
|
97
71
|
};
|
|
98
72
|
|
|
99
73
|
if (this.gasSettings?.maxFeePerGas) {
|
|
@@ -113,18 +87,6 @@ export class EscrowVault {
|
|
|
113
87
|
return this.address;
|
|
114
88
|
}
|
|
115
89
|
|
|
116
|
-
/**
|
|
117
|
-
* Get the underlying ethers Contract instance.
|
|
118
|
-
*
|
|
119
|
-
* SECURITY FIX (C-3): Provides public access to contract for EventMonitor
|
|
120
|
-
* instead of accessing private field via bracket notation.
|
|
121
|
-
*
|
|
122
|
-
* @returns ethers Contract instance
|
|
123
|
-
*/
|
|
124
|
-
getContract(): Contract {
|
|
125
|
-
return this.contract;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
90
|
/**
|
|
129
91
|
* Approve USDC token for escrow creation
|
|
130
92
|
*
|
|
@@ -189,48 +151,68 @@ export class EscrowVault {
|
|
|
189
151
|
* Get escrow details
|
|
190
152
|
*/
|
|
191
153
|
async getEscrow(escrowId: string): Promise<Escrow> {
|
|
192
|
-
validateTxId(escrowId, 'escrowId');
|
|
193
154
|
const escrowData = await this.contract.escrows(escrowId);
|
|
194
155
|
|
|
195
156
|
return {
|
|
196
157
|
escrowId,
|
|
197
|
-
|
|
198
|
-
|
|
158
|
+
kernel: escrowData.kernel,
|
|
159
|
+
txId: escrowData.txId,
|
|
160
|
+
token: escrowData.token,
|
|
199
161
|
amount: escrowData.amount,
|
|
200
|
-
|
|
201
|
-
|
|
162
|
+
beneficiary: escrowData.beneficiary,
|
|
163
|
+
createdAt: 0, // Not exposed in minimal ABI
|
|
164
|
+
released: escrowData.released
|
|
202
165
|
};
|
|
203
166
|
}
|
|
204
167
|
|
|
205
168
|
/**
|
|
206
|
-
* Get escrow
|
|
169
|
+
* Get escrow balance
|
|
207
170
|
*/
|
|
208
171
|
async getEscrowBalance(escrowId: string): Promise<bigint> {
|
|
209
|
-
|
|
210
|
-
return
|
|
172
|
+
const escrow = await this.getEscrow(escrowId);
|
|
173
|
+
return escrow.amount;
|
|
211
174
|
}
|
|
212
175
|
|
|
213
176
|
/**
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
* Payouts/refunds are executed by ACTPKernel (on-chain) as part of state transitions.
|
|
217
|
-
* EscrowVault disbursement methods are `onlyKernel` and cannot be called by EOAs.
|
|
218
|
-
*
|
|
219
|
-
* Use:
|
|
220
|
-
* - `BlockchainRuntime.releaseEscrow(txId, attestationUID?)` (recommended)
|
|
221
|
-
* - or `ACTPKernel.transitionState(txId, State.SETTLED, proof)` (advanced)
|
|
177
|
+
* Release escrow to recipients
|
|
178
|
+
* Note: Only callable by authorized kernel
|
|
222
179
|
*/
|
|
223
180
|
async releaseEscrow(
|
|
224
181
|
escrowId: string,
|
|
225
|
-
|
|
226
|
-
|
|
182
|
+
recipients: string[],
|
|
183
|
+
amounts: bigint[]
|
|
227
184
|
): Promise<void> {
|
|
185
|
+
// Input validation
|
|
228
186
|
validateTxId(escrowId, 'escrowId');
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
187
|
+
|
|
188
|
+
if (recipients.length !== amounts.length) {
|
|
189
|
+
throw new ValidationError('recipients/amounts', 'Recipients and amounts length mismatch');
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (recipients.length === 0) {
|
|
193
|
+
throw new ValidationError('recipients', 'Must provide at least one recipient');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Validate each recipient and amount
|
|
197
|
+
recipients.forEach((recipient, i) => {
|
|
198
|
+
validateAddress(recipient, `recipients[${i}]`);
|
|
199
|
+
validateAmount(amounts[i], `amounts[${i}]`);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
// ethers v6: use getFunction()
|
|
204
|
+
const disburseFunc = this.contract.getFunction('disburse');
|
|
205
|
+
|
|
206
|
+
// Estimate gas with safety buffer (30% for multi-recipient disbursement)
|
|
207
|
+
const estimatedGas = await disburseFunc.estimateGas(escrowId, recipients, amounts);
|
|
208
|
+
const txOptions = this.buildTxOptions(estimatedGas, 'releaseEscrow');
|
|
209
|
+
|
|
210
|
+
const tx = await disburseFunc(escrowId, recipients, amounts, txOptions);
|
|
211
|
+
|
|
212
|
+
await tx.wait();
|
|
213
|
+
} catch (error: any) {
|
|
214
|
+
throw new TransactionRevertedError(error.transactionHash, error.reason || error.message);
|
|
215
|
+
}
|
|
234
216
|
}
|
|
235
217
|
|
|
236
218
|
/**
|
|
@@ -3,12 +3,6 @@ import { State, Transaction } from '../types';
|
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* EventMonitor - Listen to blockchain events
|
|
6
|
-
*
|
|
7
|
-
* SECURITY FIX (EVENT-MONITOR): Corrected event parameter order to match ABI.
|
|
8
|
-
* Per ACTPKernel.json, TransactionCreated signature is:
|
|
9
|
-
* (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
10
|
-
*
|
|
11
|
-
* Previous code had requester/provider swapped which caused wrong filter results.
|
|
12
6
|
*/
|
|
13
7
|
export class EventMonitor {
|
|
14
8
|
constructor(
|
|
@@ -61,29 +55,18 @@ export class EventMonitor {
|
|
|
61
55
|
|
|
62
56
|
/**
|
|
63
57
|
* Get all transactions for an address
|
|
64
|
-
*
|
|
65
|
-
* SECURITY FIX (EVENT-MONITOR): Corrected filter parameter order.
|
|
66
|
-
* Per ACTPKernel.json ABI, TransactionCreated event signature is:
|
|
67
|
-
* (bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
68
|
-
*
|
|
69
|
-
* Filter order: TransactionCreated(txId, requester, provider)
|
|
70
|
-
* - To filter by requester: (null, address, null)
|
|
71
|
-
* - To filter by provider: (null, null, address)
|
|
72
|
-
*
|
|
73
|
-
* SECURITY FIX (EVENT-MONITOR): Use getTransaction() instead of transactions()
|
|
74
|
-
* The kernel contract exposes getTransaction(bytes32) not transactions(bytes32).
|
|
58
|
+
* Fixed: Correct filter parameters (txId, provider, requester, amount)
|
|
75
59
|
*/
|
|
76
60
|
async getTransactionHistory(
|
|
77
61
|
address: string,
|
|
78
62
|
role: 'requester' | 'provider' = 'requester'
|
|
79
63
|
): Promise<Transaction[]> {
|
|
80
|
-
// TransactionCreated event signature
|
|
81
|
-
//
|
|
82
|
-
// Filter format: TransactionCreated(txId, requester, provider)
|
|
64
|
+
// TransactionCreated event signature: (bytes32 indexed txId, address indexed provider, address indexed requester, uint256 amount)
|
|
65
|
+
// Filter format: TransactionCreated(txId, provider, requester)
|
|
83
66
|
const filter =
|
|
84
67
|
role === 'requester'
|
|
85
|
-
? this.kernelContract.filters.TransactionCreated(null,
|
|
86
|
-
: this.kernelContract.filters.TransactionCreated(null,
|
|
68
|
+
? this.kernelContract.filters.TransactionCreated(null, null, address) // Match requester
|
|
69
|
+
: this.kernelContract.filters.TransactionCreated(null, address, null); // Match provider
|
|
87
70
|
|
|
88
71
|
const events = await this.kernelContract.queryFilter(filter);
|
|
89
72
|
|
|
@@ -94,28 +77,20 @@ export class EventMonitor {
|
|
|
94
77
|
throw new Error('Event does not contain args (not an EventLog)');
|
|
95
78
|
}
|
|
96
79
|
const txId = (event as EventLog).args?.transactionId;
|
|
97
|
-
|
|
98
|
-
// SECURITY FIX: Use getTransaction() - the actual ABI function
|
|
99
|
-
// Previous code called transactions(txId) which doesn't exist in ABI
|
|
100
|
-
const txData = await this.kernelContract.getTransaction(txId);
|
|
80
|
+
const txData = await this.kernelContract.transactions(txId);
|
|
101
81
|
|
|
102
82
|
return {
|
|
103
|
-
txId: txData.transactionId
|
|
83
|
+
txId: txData.transactionId,
|
|
104
84
|
requester: txData.requester,
|
|
105
85
|
provider: txData.provider,
|
|
106
86
|
amount: txData.amount,
|
|
107
|
-
state:
|
|
87
|
+
state: txData.state as State,
|
|
108
88
|
createdAt: Number(txData.createdAt),
|
|
109
|
-
updatedAt: Number(txData.updatedAt),
|
|
110
89
|
deadline: Number(txData.deadline),
|
|
111
90
|
disputeWindow: Number(txData.disputeWindow),
|
|
112
91
|
escrowContract: txData.escrowContract,
|
|
113
92
|
escrowId: txData.escrowId,
|
|
114
|
-
|
|
115
|
-
attestationUID: txData.attestationUID,
|
|
116
|
-
// Use metadata field (quote hash for QUOTED state) if available, fallback to serviceHash
|
|
117
|
-
metadata: txData.metadata || txData.serviceHash,
|
|
118
|
-
platformFeeBpsLocked: Number(txData.platformFeeBpsLocked)
|
|
93
|
+
metadata: txData.serviceHash
|
|
119
94
|
};
|
|
120
95
|
})
|
|
121
96
|
);
|
|
@@ -123,25 +98,21 @@ export class EventMonitor {
|
|
|
123
98
|
|
|
124
99
|
/**
|
|
125
100
|
* Subscribe to transaction creation events
|
|
126
|
-
*
|
|
127
|
-
* SECURITY FIX (EVENT-MONITOR): Corrected event parameter order.
|
|
128
|
-
* Per ACTPKernel.json ABI:
|
|
129
|
-
* TransactionCreated(bytes32 indexed transactionId, address indexed requester, address indexed provider, uint256 amount, bytes32 serviceHash)
|
|
101
|
+
* Fixed: Correct event parameter order (txId, provider, requester, amount)
|
|
130
102
|
*/
|
|
131
103
|
onTransactionCreated(
|
|
132
|
-
callback: (tx: { txId: string;
|
|
104
|
+
callback: (tx: { txId: string; provider: string; requester: string; amount: bigint }) => void
|
|
133
105
|
): () => void {
|
|
134
106
|
const filter = this.kernelContract.filters.TransactionCreated();
|
|
135
107
|
|
|
136
|
-
// Event signature
|
|
108
|
+
// Event signature: TransactionCreated(bytes32 indexed txId, address indexed provider, address indexed requester, uint256 amount)
|
|
137
109
|
const listener = async (
|
|
138
110
|
txId: string,
|
|
139
|
-
requester: string,
|
|
140
111
|
provider: string,
|
|
141
|
-
|
|
142
|
-
|
|
112
|
+
requester: string,
|
|
113
|
+
amount: bigint
|
|
143
114
|
) => {
|
|
144
|
-
callback({ txId,
|
|
115
|
+
callback({ txId, provider, requester, amount });
|
|
145
116
|
};
|
|
146
117
|
|
|
147
118
|
this.kernelContract.on(filter, listener);
|
|
@@ -32,79 +32,15 @@ interface SignerWithTypedData extends Signer {
|
|
|
32
32
|
* Reference: Yellow Paper §11.4.2
|
|
33
33
|
*
|
|
34
34
|
* V4 Security Enhancement: Optional nonce replay protection via ReceivedNonceTracker
|
|
35
|
-
*
|
|
36
|
-
* IMPORTANT: Use MessageSigner.create() factory method to ensure domain is initialized.
|
|
37
35
|
*/
|
|
38
36
|
export class MessageSigner {
|
|
39
37
|
private domain: EIP712Domain | null = null;
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
* SECURITY FIX (H-5): Private constructor - MUST use MessageSigner.create() factory method
|
|
43
|
-
*
|
|
44
|
-
* This ensures EIP-712 domain is ALWAYS initialized before use (prevents race conditions).
|
|
45
|
-
* Direct construction would allow calling sign/verify without domain initialization.
|
|
46
|
-
*/
|
|
47
|
-
private constructor(
|
|
39
|
+
constructor(
|
|
48
40
|
private readonly signer: Signer,
|
|
49
41
|
private readonly nonceTracker?: IReceivedNonceTracker
|
|
50
42
|
) {}
|
|
51
43
|
|
|
52
|
-
/**
|
|
53
|
-
* SECURITY FIX (H-4): Factory method to create MessageSigner with guaranteed domain initialization
|
|
54
|
-
*
|
|
55
|
-
* This factory ensures the EIP-712 domain is always properly initialized before use.
|
|
56
|
-
* Prevents the common bug of calling sign/verify without initializing domain first.
|
|
57
|
-
*
|
|
58
|
-
* @param signer - Ethers signer for signing messages
|
|
59
|
-
* @param kernelAddress - Address of ACTP Kernel contract (for domain separation)
|
|
60
|
-
* @param options - Optional configuration (chainId, nonceTracker)
|
|
61
|
-
* @returns Promise resolving to initialized MessageSigner
|
|
62
|
-
*
|
|
63
|
-
* @example
|
|
64
|
-
* ```typescript
|
|
65
|
-
* const messageSigner = await MessageSigner.create(
|
|
66
|
-
* signer,
|
|
67
|
-
* KERNEL_ADDRESS,
|
|
68
|
-
* { chainId: 84532 }
|
|
69
|
-
* );
|
|
70
|
-
* const signature = await messageSigner.signMessage(message);
|
|
71
|
-
* ```
|
|
72
|
-
*/
|
|
73
|
-
static async create(
|
|
74
|
-
signer: Signer,
|
|
75
|
-
kernelAddress: string,
|
|
76
|
-
options?: {
|
|
77
|
-
chainId?: number;
|
|
78
|
-
nonceTracker?: IReceivedNonceTracker;
|
|
79
|
-
}
|
|
80
|
-
): Promise<MessageSigner> {
|
|
81
|
-
const messageSigner = new MessageSigner(signer, options?.nonceTracker);
|
|
82
|
-
await messageSigner.initDomain(kernelAddress, options?.chainId);
|
|
83
|
-
return messageSigner;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Check if domain is initialized
|
|
88
|
-
* @returns true if domain has been initialized
|
|
89
|
-
*/
|
|
90
|
-
isDomainInitialized(): boolean {
|
|
91
|
-
return this.domain !== null;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Get the current domain (throws if not initialized)
|
|
96
|
-
* @returns Current EIP-712 domain
|
|
97
|
-
* @throws Error if domain not initialized
|
|
98
|
-
*/
|
|
99
|
-
getDomain(): EIP712Domain {
|
|
100
|
-
if (!this.domain) {
|
|
101
|
-
throw new Error(
|
|
102
|
-
'Domain not initialized. Use MessageSigner.create() factory or call initDomain() first.'
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
return this.domain;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
44
|
/**
|
|
109
45
|
* Initialize EIP-712 domain (must be called before signing)
|
|
110
46
|
* @param kernelAddress - Address of ACTP Kernel contract
|
|
@@ -131,10 +67,8 @@ export class MessageSigner {
|
|
|
131
67
|
}
|
|
132
68
|
}
|
|
133
69
|
|
|
134
|
-
// SECURITY FIX (H-6): Standardize domain name to 'AGIRAILS' for brand consistency
|
|
135
|
-
// Note: This change requires coordination with any existing signed messages
|
|
136
70
|
this.domain = {
|
|
137
|
-
name: '
|
|
71
|
+
name: 'ACTP',
|
|
138
72
|
version: '1.0',
|
|
139
73
|
chainId: resolvedChainId,
|
|
140
74
|
verifyingContract: kernelAddress
|
|
@@ -144,55 +78,17 @@ export class MessageSigner {
|
|
|
144
78
|
/**
|
|
145
79
|
* Sign ACTP message using EIP-712 typed data
|
|
146
80
|
* Uses ECDSA (secp256k1) with domain separation per Yellow Paper §11.4.2
|
|
147
|
-
*
|
|
148
|
-
* SECURITY FIX (H-3): Validates nonce format and warns about sequential nonces
|
|
149
|
-
*
|
|
81
|
+
*
|
|
150
82
|
* Generic ACTPMessage format (backward compatible).
|
|
151
83
|
* For strict typed AIP messages, use signQuoteRequest/signQuoteResponse/signDeliveryProof
|
|
152
84
|
*/
|
|
153
85
|
async signMessage(message: ACTPMessage): Promise<string> {
|
|
154
86
|
if (!this.domain) {
|
|
155
|
-
throw new Error(
|
|
156
|
-
'Domain not initialized. Use MessageSigner.create() factory or call initDomain() first.'
|
|
157
|
-
);
|
|
87
|
+
throw new Error('Domain not initialized. Call initDomain() first.');
|
|
158
88
|
}
|
|
159
89
|
|
|
160
90
|
const { type, version, from, to, timestamp, nonce, signature, ...payload } = message;
|
|
161
91
|
|
|
162
|
-
// SECURITY FIX (H-3): Validate nonce format (must be bytes32)
|
|
163
|
-
if (!nonce || !/^0x[a-fA-F0-9]{64}$/.test(nonce)) {
|
|
164
|
-
throw new Error(
|
|
165
|
-
`Invalid nonce format: "${nonce}". ` +
|
|
166
|
-
`Nonce MUST be a bytes32 hex string (0x + 64 hex chars). ` +
|
|
167
|
-
`Use SecureNonce.generateSecureNonce() to generate cryptographically secure nonces. ` +
|
|
168
|
-
`Never use sequential integers (1, 2, 3...) or timestamps as nonces.`
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// SECURITY FIX (H-3): Warn about sequential nonces (low entropy)
|
|
173
|
-
// Sequential nonces like 0x0000...0001, 0x0000...0002 are weak
|
|
174
|
-
// Check if nonce has low entropy (e.g., last 8 bytes are zero, or all same digits)
|
|
175
|
-
const nonceValue = BigInt(nonce);
|
|
176
|
-
if (nonceValue < 0xFFFFFFFFn) {
|
|
177
|
-
// Nonce is suspiciously small (< 4 billion = likely sequential)
|
|
178
|
-
console.warn(
|
|
179
|
-
`[SECURITY WARNING] Nonce ${nonce} appears to be sequential (value < 2^32). ` +
|
|
180
|
-
`This makes replay attacks easier. ` +
|
|
181
|
-
`Use SecureNonce.generateSecureNonce() for cryptographically secure random nonces.`
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// Check if nonce has all same digits (e.g., 0x111...111 or 0x000...000)
|
|
186
|
-
const hexDigits = nonce.slice(2); // Remove '0x'
|
|
187
|
-
const firstDigit = hexDigits[0];
|
|
188
|
-
if (hexDigits.split('').every(d => d === firstDigit)) {
|
|
189
|
-
console.warn(
|
|
190
|
-
`[SECURITY WARNING] Nonce ${nonce} has low entropy (all digits are '${firstDigit}'). ` +
|
|
191
|
-
`This is NOT cryptographically secure. ` +
|
|
192
|
-
`Use SecureNonce.generateSecureNonce() instead.`
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
92
|
// Generic ACTPMessage with payload encoding (backward compatible)
|
|
197
93
|
const abiCoder = AbiCoder.defaultAbiCoder();
|
|
198
94
|
const payloadBytes = abiCoder.encode(
|
|
@@ -225,9 +121,7 @@ export class MessageSigner {
|
|
|
225
121
|
*/
|
|
226
122
|
async signQuoteRequest(data: QuoteRequestData): Promise<string> {
|
|
227
123
|
if (!this.domain) {
|
|
228
|
-
throw new Error(
|
|
229
|
-
'Domain not initialized. Use MessageSigner.create() factory or call initDomain() first.'
|
|
230
|
-
);
|
|
124
|
+
throw new Error('Domain not initialized. Call initDomain() first.');
|
|
231
125
|
}
|
|
232
126
|
|
|
233
127
|
const messageTypes = getMessageTypes('quote.request');
|
|
@@ -240,9 +134,7 @@ export class MessageSigner {
|
|
|
240
134
|
*/
|
|
241
135
|
async signQuoteResponse(data: QuoteResponseData): Promise<string> {
|
|
242
136
|
if (!this.domain) {
|
|
243
|
-
throw new Error(
|
|
244
|
-
'Domain not initialized. Use MessageSigner.create() factory or call initDomain() first.'
|
|
245
|
-
);
|
|
137
|
+
throw new Error('Domain not initialized. Call initDomain() first.');
|
|
246
138
|
}
|
|
247
139
|
|
|
248
140
|
const messageTypes = getMessageTypes('quote.response');
|
|
@@ -255,9 +147,7 @@ export class MessageSigner {
|
|
|
255
147
|
*/
|
|
256
148
|
async signDeliveryProof(data: DeliveryProofData): Promise<string> {
|
|
257
149
|
if (!this.domain) {
|
|
258
|
-
throw new Error(
|
|
259
|
-
'Domain not initialized. Use MessageSigner.create() factory or call initDomain() first.'
|
|
260
|
-
);
|
|
150
|
+
throw new Error('Domain not initialized. Call initDomain() first.');
|
|
261
151
|
}
|
|
262
152
|
|
|
263
153
|
const messageTypes = getMessageTypes('delivery.proof');
|
|
@@ -281,9 +171,7 @@ export class MessageSigner {
|
|
|
281
171
|
*/
|
|
282
172
|
async verifySignature(message: ACTPMessage, signature: string): Promise<boolean> {
|
|
283
173
|
if (!this.domain) {
|
|
284
|
-
throw new Error(
|
|
285
|
-
'Domain not initialized. Use MessageSigner.create() factory or call initDomain() first.'
|
|
286
|
-
);
|
|
174
|
+
throw new Error('Domain not initialized. Call initDomain() first.');
|
|
287
175
|
}
|
|
288
176
|
|
|
289
177
|
const { type, version, from, to, timestamp, nonce, signature: _, ...payload } = message;
|
|
@@ -420,97 +308,29 @@ export class MessageSigner {
|
|
|
420
308
|
|
|
421
309
|
/**
|
|
422
310
|
* Convert DID to Ethereum address
|
|
423
|
-
*
|
|
424
|
-
* SECURITY FIX (DID-FORMAT): Handles both DID formats:
|
|
425
|
-
* - Legacy: did:ethr:<address>
|
|
426
|
-
* - Canonical (EIP-3770): did:ethr:<chainId>:<address>
|
|
427
|
-
*
|
|
428
|
-
* Examples:
|
|
429
|
-
* - "did:ethr:0x1234...abcd" → "0x1234...abcd"
|
|
430
|
-
* - "did:ethr:84532:0x1234...abcd" → "0x1234...abcd"
|
|
431
|
-
* - "0x1234...abcd" → "0x1234...abcd" (raw address passthrough)
|
|
311
|
+
* MVP: Simple did:ethr → address conversion
|
|
432
312
|
*/
|
|
433
313
|
private didToAddress(did: string): string {
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
if (did.startsWith(DID_PREFIX)) {
|
|
437
|
-
const remainder = did.slice(DID_PREFIX.length);
|
|
438
|
-
|
|
439
|
-
// Check if it's canonical format: did:ethr:<chainId>:<address>
|
|
440
|
-
// chainId is numeric, address starts with 0x
|
|
441
|
-
const parts = remainder.split(':');
|
|
442
|
-
|
|
443
|
-
if (parts.length === 2) {
|
|
444
|
-
// Canonical format: did:ethr:<chainId>:<address>
|
|
445
|
-
const [chainIdStr, address] = parts;
|
|
446
|
-
const chainId = parseInt(chainIdStr, 10);
|
|
447
|
-
|
|
448
|
-
if (isNaN(chainId)) {
|
|
449
|
-
throw new Error(
|
|
450
|
-
`Invalid DID format: ${did}. ` +
|
|
451
|
-
`Expected did:ethr:<chainId>:<address> but chainId "${chainIdStr}" is not a number.`
|
|
452
|
-
);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
if (!ethers.isAddress(address)) {
|
|
456
|
-
throw new Error(
|
|
457
|
-
`Invalid DID format: ${did}. ` +
|
|
458
|
-
`Expected did:ethr:<chainId>:<address> but "${address}" is not a valid Ethereum address.`
|
|
459
|
-
);
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// SECURITY: Optionally validate chainId matches domain chainId
|
|
463
|
-
// This prevents cross-chain replay attacks where a message signed for one chain
|
|
464
|
-
// is replayed on another. For now, we just extract the address but log a warning.
|
|
465
|
-
if (this.domain && this.domain.chainId !== chainId) {
|
|
466
|
-
console.warn(
|
|
467
|
-
`[SECURITY WARNING] DID chainId (${chainId}) does not match domain chainId (${this.domain.chainId}). ` +
|
|
468
|
-
`This could indicate a cross-chain replay attempt. DID: ${did}`
|
|
469
|
-
);
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
return address;
|
|
473
|
-
} else if (parts.length === 1 && ethers.isAddress(parts[0])) {
|
|
474
|
-
// Legacy format: did:ethr:<address>
|
|
475
|
-
return parts[0];
|
|
476
|
-
} else {
|
|
477
|
-
throw new Error(
|
|
478
|
-
`Invalid DID format: ${did}. ` +
|
|
479
|
-
`Expected did:ethr:<address> or did:ethr:<chainId>:<address>.`
|
|
480
|
-
);
|
|
481
|
-
}
|
|
314
|
+
if (did.startsWith('did:ethr:')) {
|
|
315
|
+
return did.replace('did:ethr:', '');
|
|
482
316
|
}
|
|
483
317
|
|
|
484
|
-
// If already an address
|
|
318
|
+
// If already an address, return as-is
|
|
485
319
|
if (ethers.isAddress(did)) {
|
|
486
320
|
return did;
|
|
487
321
|
}
|
|
488
322
|
|
|
489
|
-
throw new Error(
|
|
490
|
-
`Invalid DID format: ${did}. ` +
|
|
491
|
-
`Expected Ethereum address (0x...) or DID (did:ethr:...).`
|
|
492
|
-
);
|
|
323
|
+
throw new Error(`Invalid DID format: ${did}`);
|
|
493
324
|
}
|
|
494
325
|
|
|
495
326
|
/**
|
|
496
327
|
* Convert Ethereum address to DID
|
|
497
|
-
*
|
|
498
|
-
* SECURITY FIX (DID-FORMAT): Now generates canonical DID format
|
|
499
|
-
* with chainId when domain is initialized: did:ethr:<chainId>:<address>
|
|
500
|
-
*
|
|
501
|
-
* Falls back to legacy format if domain not initialized.
|
|
502
328
|
*/
|
|
503
329
|
addressToDID(address: string): string {
|
|
504
330
|
if (!ethers.isAddress(address)) {
|
|
505
331
|
throw new Error(`Invalid Ethereum address: ${address}`);
|
|
506
332
|
}
|
|
507
333
|
|
|
508
|
-
// Use canonical format with chainId if domain is initialized
|
|
509
|
-
if (this.domain && this.domain.chainId) {
|
|
510
|
-
return `did:ethr:${this.domain.chainId}:${address}`;
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
// Fallback to legacy format (backward compatible)
|
|
514
334
|
return `did:ethr:${address}`;
|
|
515
335
|
}
|
|
516
336
|
}
|