@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.
Files changed (405) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +116 -108
  3. package/bin/actp +10 -0
  4. package/dist/ACTPClient.d.ts +456 -33
  5. package/dist/ACTPClient.d.ts.map +1 -1
  6. package/dist/ACTPClient.js +477 -93
  7. package/dist/ACTPClient.js.map +1 -1
  8. package/dist/abi/AgentRegistry.json +782 -0
  9. package/dist/abi/EscrowVault.json +106 -38
  10. package/dist/abi/IdentityRegistry.json +316 -0
  11. package/dist/adapters/BaseAdapter.d.ts +231 -0
  12. package/dist/adapters/BaseAdapter.d.ts.map +1 -0
  13. package/dist/adapters/BaseAdapter.js +393 -0
  14. package/dist/adapters/BaseAdapter.js.map +1 -0
  15. package/dist/adapters/BeginnerAdapter.d.ts +152 -0
  16. package/dist/adapters/BeginnerAdapter.d.ts.map +1 -0
  17. package/dist/adapters/BeginnerAdapter.js +168 -0
  18. package/dist/adapters/BeginnerAdapter.js.map +1 -0
  19. package/dist/adapters/IntermediateAdapter.d.ts +211 -0
  20. package/dist/adapters/IntermediateAdapter.d.ts.map +1 -0
  21. package/dist/adapters/IntermediateAdapter.js +260 -0
  22. package/dist/adapters/IntermediateAdapter.js.map +1 -0
  23. package/dist/adapters/index.d.ts +15 -0
  24. package/dist/adapters/index.d.ts.map +1 -0
  25. package/dist/adapters/index.js +26 -0
  26. package/dist/adapters/index.js.map +1 -0
  27. package/dist/builders/DeliveryProofBuilder.d.ts +60 -1
  28. package/dist/builders/DeliveryProofBuilder.d.ts.map +1 -1
  29. package/dist/builders/DeliveryProofBuilder.js +81 -5
  30. package/dist/builders/DeliveryProofBuilder.js.map +1 -1
  31. package/dist/builders/QuoteBuilder.d.ts +101 -0
  32. package/dist/builders/QuoteBuilder.d.ts.map +1 -1
  33. package/dist/builders/QuoteBuilder.js +120 -3
  34. package/dist/builders/QuoteBuilder.js.map +1 -1
  35. package/dist/builders/index.d.ts +4 -0
  36. package/dist/builders/index.d.ts.map +1 -1
  37. package/dist/builders/index.js +4 -0
  38. package/dist/builders/index.js.map +1 -1
  39. package/dist/cli/commands/balance.d.ts +13 -0
  40. package/dist/cli/commands/balance.d.ts.map +1 -0
  41. package/dist/cli/commands/balance.js +89 -0
  42. package/dist/cli/commands/balance.js.map +1 -0
  43. package/dist/cli/commands/batch.d.ts +24 -0
  44. package/dist/cli/commands/batch.d.ts.map +1 -0
  45. package/dist/cli/commands/batch.js +424 -0
  46. package/dist/cli/commands/batch.js.map +1 -0
  47. package/dist/cli/commands/config.d.ts +13 -0
  48. package/dist/cli/commands/config.d.ts.map +1 -0
  49. package/dist/cli/commands/config.js +192 -0
  50. package/dist/cli/commands/config.js.map +1 -0
  51. package/dist/cli/commands/init.d.ts +19 -0
  52. package/dist/cli/commands/init.d.ts.map +1 -0
  53. package/dist/cli/commands/init.js +143 -0
  54. package/dist/cli/commands/init.js.map +1 -0
  55. package/dist/cli/commands/mint.d.ts +13 -0
  56. package/dist/cli/commands/mint.d.ts.map +1 -0
  57. package/dist/cli/commands/mint.js +91 -0
  58. package/dist/cli/commands/mint.js.map +1 -0
  59. package/dist/cli/commands/pay.d.ts +18 -0
  60. package/dist/cli/commands/pay.d.ts.map +1 -0
  61. package/dist/cli/commands/pay.js +87 -0
  62. package/dist/cli/commands/pay.js.map +1 -0
  63. package/dist/cli/commands/simulate.d.ts +32 -0
  64. package/dist/cli/commands/simulate.d.ts.map +1 -0
  65. package/dist/cli/commands/simulate.js +290 -0
  66. package/dist/cli/commands/simulate.js.map +1 -0
  67. package/dist/cli/commands/time.d.ts +29 -0
  68. package/dist/cli/commands/time.d.ts.map +1 -0
  69. package/dist/cli/commands/time.js +252 -0
  70. package/dist/cli/commands/time.js.map +1 -0
  71. package/dist/cli/commands/tx.d.ts +16 -0
  72. package/dist/cli/commands/tx.d.ts.map +1 -0
  73. package/dist/cli/commands/tx.js +379 -0
  74. package/dist/cli/commands/tx.js.map +1 -0
  75. package/dist/cli/commands/watch.d.ts +20 -0
  76. package/dist/cli/commands/watch.d.ts.map +1 -0
  77. package/dist/cli/commands/watch.js +160 -0
  78. package/dist/cli/commands/watch.js.map +1 -0
  79. package/dist/cli/index.d.ts +17 -0
  80. package/dist/cli/index.d.ts.map +1 -0
  81. package/dist/cli/index.js +104 -0
  82. package/dist/cli/index.js.map +1 -0
  83. package/dist/cli/utils/client.d.ts +70 -0
  84. package/dist/cli/utils/client.d.ts.map +1 -0
  85. package/dist/cli/utils/client.js +240 -0
  86. package/dist/cli/utils/client.js.map +1 -0
  87. package/dist/cli/utils/config.d.ts +91 -0
  88. package/dist/cli/utils/config.d.ts.map +1 -0
  89. package/dist/cli/utils/config.js +240 -0
  90. package/dist/cli/utils/config.js.map +1 -0
  91. package/dist/cli/utils/output.d.ts +174 -0
  92. package/dist/cli/utils/output.d.ts.map +1 -0
  93. package/dist/cli/utils/output.js +380 -0
  94. package/dist/cli/utils/output.js.map +1 -0
  95. package/dist/config/networks.d.ts +28 -0
  96. package/dist/config/networks.d.ts.map +1 -1
  97. package/dist/config/networks.js +60 -12
  98. package/dist/config/networks.js.map +1 -1
  99. package/dist/errors/index.d.ts +165 -2
  100. package/dist/errors/index.d.ts.map +1 -1
  101. package/dist/errors/index.js +260 -2
  102. package/dist/errors/index.js.map +1 -1
  103. package/dist/index.d.ts +61 -13
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +141 -36
  106. package/dist/index.js.map +1 -1
  107. package/dist/level0/Provider.d.ts +106 -0
  108. package/dist/level0/Provider.d.ts.map +1 -0
  109. package/dist/level0/Provider.js +10 -0
  110. package/dist/level0/Provider.js.map +1 -0
  111. package/dist/level0/ServiceDirectory.d.ts +74 -0
  112. package/dist/level0/ServiceDirectory.d.ts.map +1 -0
  113. package/dist/level0/ServiceDirectory.js +122 -0
  114. package/dist/level0/ServiceDirectory.js.map +1 -0
  115. package/dist/level0/index.d.ts +10 -0
  116. package/dist/level0/index.d.ts.map +1 -0
  117. package/dist/level0/index.js +15 -0
  118. package/dist/level0/index.js.map +1 -0
  119. package/dist/level0/provide.d.ts +51 -0
  120. package/dist/level0/provide.d.ts.map +1 -0
  121. package/dist/level0/provide.js +113 -0
  122. package/dist/level0/provide.js.map +1 -0
  123. package/dist/level0/request.d.ts +53 -0
  124. package/dist/level0/request.d.ts.map +1 -0
  125. package/dist/level0/request.js +462 -0
  126. package/dist/level0/request.js.map +1 -0
  127. package/dist/level1/Agent.d.ts +472 -0
  128. package/dist/level1/Agent.d.ts.map +1 -0
  129. package/dist/level1/Agent.js +1091 -0
  130. package/dist/level1/Agent.js.map +1 -0
  131. package/dist/level1/index.d.ts +10 -0
  132. package/dist/level1/index.d.ts.map +1 -0
  133. package/dist/level1/index.js +30 -0
  134. package/dist/level1/index.js.map +1 -0
  135. package/dist/level1/pricing/PriceCalculator.d.ts +62 -0
  136. package/dist/level1/pricing/PriceCalculator.d.ts.map +1 -0
  137. package/dist/level1/pricing/PriceCalculator.js +237 -0
  138. package/dist/level1/pricing/PriceCalculator.js.map +1 -0
  139. package/dist/level1/pricing/PricingStrategy.d.ts +179 -0
  140. package/dist/level1/pricing/PricingStrategy.d.ts.map +1 -0
  141. package/dist/level1/pricing/PricingStrategy.js +11 -0
  142. package/dist/level1/pricing/PricingStrategy.js.map +1 -0
  143. package/dist/level1/types/Job.d.ts +166 -0
  144. package/dist/level1/types/Job.d.ts.map +1 -0
  145. package/dist/level1/types/Job.js +11 -0
  146. package/dist/level1/types/Job.js.map +1 -0
  147. package/dist/level1/types/Options.d.ts +258 -0
  148. package/dist/level1/types/Options.d.ts.map +1 -0
  149. package/dist/level1/types/Options.js +8 -0
  150. package/dist/level1/types/Options.js.map +1 -0
  151. package/dist/level1/types/index.d.ts +8 -0
  152. package/dist/level1/types/index.d.ts.map +1 -0
  153. package/dist/level1/types/index.js +8 -0
  154. package/dist/level1/types/index.js.map +1 -0
  155. package/dist/protocol/ACTPKernel.d.ts +229 -2
  156. package/dist/protocol/ACTPKernel.d.ts.map +1 -1
  157. package/dist/protocol/ACTPKernel.js +367 -33
  158. package/dist/protocol/ACTPKernel.js.map +1 -1
  159. package/dist/protocol/AgentRegistry.d.ts +177 -0
  160. package/dist/protocol/AgentRegistry.d.ts.map +1 -0
  161. package/dist/protocol/AgentRegistry.js +449 -0
  162. package/dist/protocol/AgentRegistry.js.map +1 -0
  163. package/dist/protocol/DIDManager.d.ts +289 -0
  164. package/dist/protocol/DIDManager.d.ts.map +1 -0
  165. package/dist/protocol/DIDManager.js +481 -0
  166. package/dist/protocol/DIDManager.js.map +1 -0
  167. package/dist/protocol/DIDResolver.d.ts +236 -0
  168. package/dist/protocol/DIDResolver.d.ts.map +1 -0
  169. package/dist/protocol/DIDResolver.js +495 -0
  170. package/dist/protocol/DIDResolver.js.map +1 -0
  171. package/dist/protocol/EASHelper.d.ts +57 -2
  172. package/dist/protocol/EASHelper.d.ts.map +1 -1
  173. package/dist/protocol/EASHelper.js +230 -37
  174. package/dist/protocol/EASHelper.js.map +1 -1
  175. package/dist/protocol/EscrowVault.d.ts +93 -2
  176. package/dist/protocol/EscrowVault.d.ts.map +1 -1
  177. package/dist/protocol/EscrowVault.js +122 -33
  178. package/dist/protocol/EscrowVault.js.map +1 -1
  179. package/dist/protocol/EventMonitor.d.ts +45 -1
  180. package/dist/protocol/EventMonitor.d.ts.map +1 -1
  181. package/dist/protocol/EventMonitor.js +64 -8
  182. package/dist/protocol/EventMonitor.js.map +1 -1
  183. package/dist/protocol/MessageSigner.d.ts +116 -2
  184. package/dist/protocol/MessageSigner.d.ts.map +1 -1
  185. package/dist/protocol/MessageSigner.js +215 -9
  186. package/dist/protocol/MessageSigner.js.map +1 -1
  187. package/dist/protocol/ProofGenerator.d.ts +93 -0
  188. package/dist/protocol/ProofGenerator.d.ts.map +1 -1
  189. package/dist/protocol/ProofGenerator.js +194 -9
  190. package/dist/protocol/ProofGenerator.js.map +1 -1
  191. package/dist/protocol/QuoteBuilder.d.ts +8 -0
  192. package/dist/protocol/QuoteBuilder.d.ts.map +1 -1
  193. package/dist/protocol/QuoteBuilder.js +8 -0
  194. package/dist/protocol/QuoteBuilder.js.map +1 -1
  195. package/dist/runtime/BlockchainRuntime.d.ts +360 -0
  196. package/dist/runtime/BlockchainRuntime.d.ts.map +1 -0
  197. package/dist/runtime/BlockchainRuntime.js +767 -0
  198. package/dist/runtime/BlockchainRuntime.js.map +1 -0
  199. package/dist/runtime/IACTPRuntime.d.ts +271 -0
  200. package/dist/runtime/IACTPRuntime.d.ts.map +1 -0
  201. package/dist/runtime/IACTPRuntime.js +15 -0
  202. package/dist/runtime/IACTPRuntime.js.map +1 -0
  203. package/dist/runtime/MockRuntime.d.ts +445 -0
  204. package/dist/runtime/MockRuntime.d.ts.map +1 -0
  205. package/dist/runtime/MockRuntime.js +1065 -0
  206. package/dist/runtime/MockRuntime.js.map +1 -0
  207. package/dist/runtime/MockStateManager.d.ts +233 -0
  208. package/dist/runtime/MockStateManager.d.ts.map +1 -0
  209. package/dist/runtime/MockStateManager.js +533 -0
  210. package/dist/runtime/MockStateManager.js.map +1 -0
  211. package/dist/runtime/index.d.ts +14 -0
  212. package/dist/runtime/index.d.ts.map +1 -0
  213. package/dist/runtime/index.js +42 -0
  214. package/dist/runtime/index.js.map +1 -0
  215. package/dist/runtime/types/MockState.d.ts +167 -0
  216. package/dist/runtime/types/MockState.d.ts.map +1 -0
  217. package/dist/runtime/types/MockState.js +43 -0
  218. package/dist/runtime/types/MockState.js.map +1 -0
  219. package/dist/types/agent.d.ts +76 -0
  220. package/dist/types/agent.d.ts.map +1 -0
  221. package/dist/types/agent.js +8 -0
  222. package/dist/types/agent.js.map +1 -0
  223. package/dist/types/did.d.ts +192 -0
  224. package/dist/types/did.d.ts.map +1 -0
  225. package/dist/types/did.js +38 -0
  226. package/dist/types/did.js.map +1 -0
  227. package/dist/types/eip712.d.ts +34 -0
  228. package/dist/types/eip712.d.ts.map +1 -1
  229. package/dist/types/eip712.js +31 -5
  230. package/dist/types/eip712.js.map +1 -1
  231. package/dist/types/escrow.d.ts +17 -10
  232. package/dist/types/escrow.d.ts.map +1 -1
  233. package/dist/types/index.d.ts +5 -0
  234. package/dist/types/index.d.ts.map +1 -1
  235. package/dist/types/index.js +8 -0
  236. package/dist/types/index.js.map +1 -1
  237. package/dist/types/message.d.ts +32 -0
  238. package/dist/types/message.d.ts.map +1 -1
  239. package/dist/types/message.js +4 -0
  240. package/dist/types/message.js.map +1 -1
  241. package/dist/types/state.d.ts +28 -0
  242. package/dist/types/state.d.ts.map +1 -1
  243. package/dist/types/state.js +37 -6
  244. package/dist/types/state.js.map +1 -1
  245. package/dist/types/transaction.d.ts +17 -0
  246. package/dist/types/transaction.d.ts.map +1 -1
  247. package/dist/utils/ErrorRecoveryGuide.d.ts +125 -0
  248. package/dist/utils/ErrorRecoveryGuide.d.ts.map +1 -0
  249. package/dist/utils/ErrorRecoveryGuide.js +579 -0
  250. package/dist/utils/ErrorRecoveryGuide.js.map +1 -0
  251. package/dist/utils/Helpers.d.ts +453 -0
  252. package/dist/utils/Helpers.d.ts.map +1 -0
  253. package/dist/utils/Helpers.js +623 -0
  254. package/dist/utils/Helpers.js.map +1 -0
  255. package/dist/utils/IPFSClient.d.ts +113 -0
  256. package/dist/utils/IPFSClient.d.ts.map +1 -1
  257. package/dist/utils/IPFSClient.js +128 -7
  258. package/dist/utils/IPFSClient.js.map +1 -1
  259. package/dist/utils/Logger.d.ts +195 -0
  260. package/dist/utils/Logger.d.ts.map +1 -0
  261. package/dist/utils/Logger.js +382 -0
  262. package/dist/utils/Logger.js.map +1 -0
  263. package/dist/utils/NonceManager.d.ts +234 -1
  264. package/dist/utils/NonceManager.d.ts.map +1 -1
  265. package/dist/utils/NonceManager.js +372 -7
  266. package/dist/utils/NonceManager.js.map +1 -1
  267. package/dist/utils/RateLimiter.d.ts +253 -0
  268. package/dist/utils/RateLimiter.d.ts.map +1 -0
  269. package/dist/utils/RateLimiter.js +424 -0
  270. package/dist/utils/RateLimiter.js.map +1 -0
  271. package/dist/utils/ReceivedNonceTracker.d.ts +175 -0
  272. package/dist/utils/ReceivedNonceTracker.d.ts.map +1 -1
  273. package/dist/utils/ReceivedNonceTracker.js +261 -5
  274. package/dist/utils/ReceivedNonceTracker.js.map +1 -1
  275. package/dist/utils/SDKLifecycle.d.ts +156 -0
  276. package/dist/utils/SDKLifecycle.d.ts.map +1 -0
  277. package/dist/utils/SDKLifecycle.js +347 -0
  278. package/dist/utils/SDKLifecycle.js.map +1 -0
  279. package/dist/utils/SecureNonce.d.ts +57 -0
  280. package/dist/utils/SecureNonce.d.ts.map +1 -0
  281. package/dist/utils/SecureNonce.js +80 -0
  282. package/dist/utils/SecureNonce.js.map +1 -0
  283. package/dist/utils/Semaphore.d.ts +123 -0
  284. package/dist/utils/Semaphore.d.ts.map +1 -0
  285. package/dist/utils/Semaphore.js +247 -0
  286. package/dist/utils/Semaphore.js.map +1 -0
  287. package/dist/utils/UsedAttestationTracker.d.ts +167 -0
  288. package/dist/utils/UsedAttestationTracker.d.ts.map +1 -0
  289. package/dist/utils/UsedAttestationTracker.js +309 -0
  290. package/dist/utils/UsedAttestationTracker.js.map +1 -0
  291. package/dist/utils/canonicalJson.d.ts +22 -0
  292. package/dist/utils/canonicalJson.d.ts.map +1 -1
  293. package/dist/utils/canonicalJson.js +26 -3
  294. package/dist/utils/canonicalJson.js.map +1 -1
  295. package/dist/utils/computeTypeHash.d.ts +14 -0
  296. package/dist/utils/computeTypeHash.d.ts.map +1 -1
  297. package/dist/utils/computeTypeHash.js +19 -2
  298. package/dist/utils/computeTypeHash.js.map +1 -1
  299. package/dist/utils/fsSafe.d.ts +14 -0
  300. package/dist/utils/fsSafe.d.ts.map +1 -0
  301. package/dist/utils/fsSafe.js +89 -0
  302. package/dist/utils/fsSafe.js.map +1 -0
  303. package/dist/utils/index.d.ts +15 -0
  304. package/dist/utils/index.d.ts.map +1 -0
  305. package/dist/utils/index.js +51 -0
  306. package/dist/utils/index.js.map +1 -0
  307. package/dist/utils/security.d.ts +147 -0
  308. package/dist/utils/security.d.ts.map +1 -0
  309. package/dist/utils/security.js +391 -0
  310. package/dist/utils/security.js.map +1 -0
  311. package/dist/utils/validation.d.ts +40 -0
  312. package/dist/utils/validation.d.ts.map +1 -1
  313. package/dist/utils/validation.js +184 -7
  314. package/dist/utils/validation.js.map +1 -1
  315. package/package.json +54 -37
  316. package/src/ACTPClient.ts +692 -178
  317. package/src/abi/AgentRegistry.json +782 -0
  318. package/src/abi/EscrowVault.json +106 -38
  319. package/src/abi/IdentityRegistry.json +316 -0
  320. package/src/adapters/BaseAdapter.ts +473 -0
  321. package/src/adapters/BeginnerAdapter.ts +232 -0
  322. package/src/adapters/IntermediateAdapter.ts +316 -0
  323. package/src/adapters/index.ts +25 -0
  324. package/src/builders/DeliveryProofBuilder.ts +3 -2
  325. package/src/cli/commands/balance.ts +110 -0
  326. package/src/cli/commands/batch.ts +487 -0
  327. package/src/cli/commands/config.ts +231 -0
  328. package/src/cli/commands/init.ts +161 -0
  329. package/src/cli/commands/mint.ts +116 -0
  330. package/src/cli/commands/pay.ts +113 -0
  331. package/src/cli/commands/simulate.ts +345 -0
  332. package/src/cli/commands/time.ts +303 -0
  333. package/src/cli/commands/tx.ts +448 -0
  334. package/src/cli/commands/watch.ts +211 -0
  335. package/src/cli/index.ts +116 -0
  336. package/src/cli/utils/client.ts +249 -0
  337. package/src/cli/utils/config.ts +282 -0
  338. package/src/cli/utils/output.ts +465 -0
  339. package/src/config/networks.ts +32 -9
  340. package/src/errors/index.ts +298 -1
  341. package/src/index.ts +207 -71
  342. package/src/level0/Provider.ts +117 -0
  343. package/src/level0/ServiceDirectory.ts +131 -0
  344. package/src/level0/index.ts +10 -0
  345. package/src/level0/provide.ts +131 -0
  346. package/src/level0/request.ts +494 -0
  347. package/src/level1/Agent.ts +1432 -0
  348. package/src/level1/index.ts +10 -0
  349. package/src/level1/pricing/PriceCalculator.ts +255 -0
  350. package/src/level1/pricing/PricingStrategy.ts +198 -0
  351. package/src/level1/types/Job.ts +179 -0
  352. package/src/level1/types/Options.ts +291 -0
  353. package/src/level1/types/index.ts +8 -0
  354. package/src/protocol/ACTPKernel.ts +175 -23
  355. package/src/protocol/AgentRegistry.ts +559 -0
  356. package/src/protocol/DIDManager.ts +629 -0
  357. package/src/protocol/DIDResolver.ts +554 -0
  358. package/src/protocol/EASHelper.ts +230 -46
  359. package/src/protocol/EscrowVault.ts +68 -50
  360. package/src/protocol/EventMonitor.ts +44 -15
  361. package/src/protocol/MessageSigner.ts +193 -13
  362. package/src/protocol/ProofGenerator.ts +223 -4
  363. package/src/runtime/BlockchainRuntime.ts +993 -0
  364. package/src/runtime/IACTPRuntime.ts +284 -0
  365. package/src/runtime/MockRuntime.ts +1244 -0
  366. package/src/runtime/MockStateManager.ts +576 -0
  367. package/src/runtime/index.ts +25 -0
  368. package/src/runtime/types/MockState.ts +227 -0
  369. package/src/types/agent.ts +79 -0
  370. package/src/types/did.ts +223 -0
  371. package/src/types/escrow.ts +12 -11
  372. package/src/types/index.ts +5 -1
  373. package/src/types/state.ts +12 -3
  374. package/src/types/transaction.ts +4 -1
  375. package/src/utils/ErrorRecoveryGuide.ts +675 -0
  376. package/src/utils/Helpers.ts +688 -0
  377. package/src/utils/IPFSClient.ts +122 -5
  378. package/src/utils/Logger.ts +484 -0
  379. package/src/utils/NonceManager.ts +305 -8
  380. package/src/utils/RateLimiter.ts +534 -0
  381. package/src/utils/ReceivedNonceTracker.ts +170 -0
  382. package/src/utils/SDKLifecycle.ts +416 -0
  383. package/src/utils/SecureNonce.ts +78 -0
  384. package/src/utils/Semaphore.ts +276 -0
  385. package/src/utils/UsedAttestationTracker.ts +387 -0
  386. package/src/utils/fsSafe.ts +75 -0
  387. package/src/utils/index.ts +80 -0
  388. package/src/utils/security.ts +418 -0
  389. package/src/utils/validation.ts +164 -0
  390. package/src/__tests__/ProofGenerator.test.ts +0 -124
  391. package/src/__tests__/QuoteBuilder.test.ts +0 -516
  392. package/src/__tests__/StateMachine.test.ts +0 -82
  393. package/src/__tests__/builders/DeliveryProofBuilder.test.ts +0 -581
  394. package/src/__tests__/integration/ACTPClient.test.ts +0 -263
  395. package/src/__tests__/integration.test.ts +0 -289
  396. package/src/__tests__/protocol/EASHelper.test.ts +0 -472
  397. package/src/__tests__/protocol/EventMonitor.test.ts +0 -382
  398. package/src/__tests__/security/ACTPKernel.security.test.ts +0 -1167
  399. package/src/__tests__/security/EscrowVault.security.test.ts +0 -570
  400. package/src/__tests__/security/MessageSigner.security.test.ts +0 -286
  401. package/src/__tests__/security/NonceReplay.security.test.ts +0 -501
  402. package/src/__tests__/security/validation.security.test.ts +0 -376
  403. package/src/__tests__/utils/IPFSClient.test.ts +0 -262
  404. package/src/__tests__/utils/NonceManager.test.ts +0 -205
  405. package/src/__tests__/utils/canonicalJson.test.ts +0 -153
@@ -2,7 +2,21 @@
2
2
  * Nonce Manager Implementation
3
3
  * Tracks nonces per DID + message type for AIP-4 delivery proofs
4
4
  * Reference: AIP-4 §3.2 (nonce field requirement)
5
+ *
6
+ * SECURITY FIXES:
7
+ * - C-2: Added atomic nonce allocation with locking
8
+ * - H-1: Added persistent nonce storage option
9
+ * - H-5: Added nonce upper bound validation
10
+ */
11
+
12
+ import { assertSafeFileForRead, ensureSafeDir, ensureSafeFile } from './fsSafe';
13
+
14
+ /**
15
+ * Maximum allowed nonce value.
16
+ * SECURITY FIX (H-5): Prevents nonce overflow attacks.
17
+ * Using Number.MAX_SAFE_INTEGER (2^53 - 1) to ensure safe JavaScript integer operations.
5
18
  */
19
+ export const MAX_NONCE_VALUE = Number.MAX_SAFE_INTEGER;
6
20
 
7
21
  /**
8
22
  * Nonce Manager Interface (from DeliveryProofBuilder)
@@ -40,6 +54,10 @@ export interface NonceManager {
40
54
  * In-Memory Nonce Manager
41
55
  * Simple implementation using Map for per-message-type nonce tracking
42
56
  *
57
+ * SECURITY FIXES:
58
+ * - C-2: Added atomic getAndIncrementNonce() to prevent race conditions
59
+ * - H-5: Added nonce upper bound validation
60
+ *
43
61
  * ⚠️ WARNING: Nonces are lost on process restart. For production:
44
62
  * - Use persistent storage (Redis, PostgreSQL, etc.)
45
63
  * - Implement nonce recovery from blockchain events
@@ -47,6 +65,9 @@ export interface NonceManager {
47
65
  */
48
66
  export class InMemoryNonceManager implements NonceManager {
49
67
  private nonces: Map<string, number> = new Map();
68
+ // SECURITY FIX (C-2): Mutex for atomic nonce operations
69
+ // Store both the promise and its resolver for proper lock release
70
+ private locks: Map<string, { promise: Promise<void>; resolve: () => void }> = new Map();
50
71
 
51
72
  /**
52
73
  * Create in-memory nonce manager
@@ -55,11 +76,58 @@ export class InMemoryNonceManager implements NonceManager {
55
76
  constructor(initialNonces?: Record<string, number>) {
56
77
  if (initialNonces) {
57
78
  Object.entries(initialNonces).forEach(([messageType, nonce]) => {
79
+ // SECURITY FIX (H-5): Validate initial nonces
80
+ if (nonce > MAX_NONCE_VALUE) {
81
+ throw new Error(
82
+ `Initial nonce ${nonce} for ${messageType} exceeds maximum allowed value ${MAX_NONCE_VALUE}`
83
+ );
84
+ }
58
85
  this.nonces.set(messageType, nonce);
59
86
  });
60
87
  }
61
88
  }
62
89
 
90
+ /**
91
+ * SECURITY FIX (C-2 + DEADLOCK-FIX): Acquire lock for message type
92
+ * Ensures atomic nonce operations.
93
+ *
94
+ * FIXED: Previous implementation had a deadlock bug where:
95
+ * - The resolver was stored in a closure but never accessible to releaseLock()
96
+ * - releaseLock() just deleted the entry without resolving waiting Promises
97
+ *
98
+ * New implementation stores both promise AND resolver together.
99
+ */
100
+ private async acquireLock(messageType: string): Promise<void> {
101
+ // Wait for any existing lock to be released
102
+ while (this.locks.has(messageType)) {
103
+ const existingLock = this.locks.get(messageType);
104
+ if (existingLock) {
105
+ await existingLock.promise;
106
+ }
107
+ }
108
+
109
+ // Create new lock with stored resolver
110
+ let resolver: () => void = () => {};
111
+ const lockPromise = new Promise<void>((resolve) => {
112
+ resolver = resolve;
113
+ });
114
+ this.locks.set(messageType, { promise: lockPromise, resolve: resolver });
115
+ }
116
+
117
+ /**
118
+ * SECURITY FIX (C-2 + DEADLOCK-FIX): Release lock for message type
119
+ *
120
+ * FIXED: Now properly resolves the Promise before deleting,
121
+ * so any waiting acquireLock() calls can proceed.
122
+ */
123
+ private releaseLock(messageType: string): void {
124
+ const lock = this.locks.get(messageType);
125
+ if (lock) {
126
+ lock.resolve(); // Resolve the promise first
127
+ this.locks.delete(messageType); // Then delete the entry
128
+ }
129
+ }
130
+
63
131
  /**
64
132
  * Get next nonce for message type
65
133
  * @param messageType - Message type identifier
@@ -67,7 +135,44 @@ export class InMemoryNonceManager implements NonceManager {
67
135
  */
68
136
  getNextNonce(messageType: string): number {
69
137
  const current = this.nonces.get(messageType) || 0;
70
- return current + 1;
138
+ const next = current + 1;
139
+
140
+ // SECURITY FIX (H-5): Check upper bound
141
+ if (next > MAX_NONCE_VALUE) {
142
+ throw new Error(
143
+ `Nonce overflow: next nonce ${next} exceeds maximum allowed value ${MAX_NONCE_VALUE}. ` +
144
+ `Consider resetting nonces or using a larger storage type.`
145
+ );
146
+ }
147
+
148
+ return next;
149
+ }
150
+
151
+ /**
152
+ * SECURITY FIX (C-2): Atomic get-and-increment nonce
153
+ * Returns the next nonce and records it atomically to prevent race conditions.
154
+ *
155
+ * @param messageType - Message type identifier
156
+ * @returns Atomically allocated nonce
157
+ */
158
+ async getAndIncrementNonce(messageType: string): Promise<number> {
159
+ await this.acquireLock(messageType);
160
+ try {
161
+ const current = this.nonces.get(messageType) || 0;
162
+ const next = current + 1;
163
+
164
+ // SECURITY FIX (H-5): Check upper bound
165
+ if (next > MAX_NONCE_VALUE) {
166
+ throw new Error(
167
+ `Nonce overflow: next nonce ${next} exceeds maximum allowed value ${MAX_NONCE_VALUE}`
168
+ );
169
+ }
170
+
171
+ this.nonces.set(messageType, next);
172
+ return next;
173
+ } finally {
174
+ this.releaseLock(messageType);
175
+ }
71
176
  }
72
177
 
73
178
  /**
@@ -78,6 +183,13 @@ export class InMemoryNonceManager implements NonceManager {
78
183
  recordNonce(messageType: string, nonce: number): void {
79
184
  const current = this.nonces.get(messageType) || 0;
80
185
 
186
+ // SECURITY FIX (H-5): Check upper bound
187
+ if (nonce > MAX_NONCE_VALUE) {
188
+ throw new Error(
189
+ `Nonce ${nonce} exceeds maximum allowed value ${MAX_NONCE_VALUE}`
190
+ );
191
+ }
192
+
81
193
  // Ensure monotonic increase
82
194
  if (nonce <= current) {
83
195
  throw new Error(
@@ -276,18 +388,203 @@ export class DIDScopedNonceManager implements NonceManager {
276
388
  }
277
389
  }
278
390
 
391
+ /**
392
+ * File-based Nonce Manager for Persistent Storage
393
+ *
394
+ * SECURITY FIX (H-1): Persists nonces to disk to survive process restarts.
395
+ * SECURITY FIX (NEW-H-4): File locking to prevent concurrent write corruption.
396
+ * Uses atomic file writes (temp file + rename) for crash safety.
397
+ *
398
+ * @module utils/NonceManager
399
+ */
400
+ export class FileBasedNonceManager implements NonceManager {
401
+ private inMemory: InMemoryNonceManager;
402
+ private filePath: string;
403
+ private fs: typeof import('fs');
404
+ private path: typeof import('path');
405
+ private lockfile: typeof import('proper-lockfile');
406
+
407
+ /**
408
+ * Create file-based nonce manager
409
+ * @param stateDirectory - Directory to store nonces file
410
+ */
411
+ constructor(stateDirectory: string) {
412
+ this.fs = require('fs');
413
+ this.path = require('path');
414
+ // SECURITY FIX (NEW-H-4): File locking to prevent race conditions
415
+ this.lockfile = require('proper-lockfile');
416
+
417
+ // Ensure .actp directory exists
418
+ const actpDir = this.path.join(stateDirectory, '.actp');
419
+ ensureSafeDir(actpDir, 0o755);
420
+
421
+ this.filePath = this.path.join(actpDir, 'nonces.json');
422
+
423
+ // Load existing nonces
424
+ const initialNonces = this.loadFromFile();
425
+ this.inMemory = new InMemoryNonceManager(initialNonces);
426
+ }
427
+
428
+ /**
429
+ * Load nonces from file
430
+ */
431
+ private loadFromFile(): Record<string, number> | undefined {
432
+ if (!this.fs.existsSync(this.filePath)) {
433
+ return undefined;
434
+ }
435
+
436
+ try {
437
+ // SECURITY: Refuse to read from symlinked nonce files
438
+ assertSafeFileForRead(this.filePath);
439
+
440
+ const MAX_NONCE_FILE_SIZE = 5 * 1024 * 1024; // 5MB
441
+ const st = this.fs.statSync(this.filePath);
442
+ if (st.size > MAX_NONCE_FILE_SIZE) {
443
+ throw new Error(
444
+ `nonces.json exceeds ${MAX_NONCE_FILE_SIZE / 1024 / 1024}MB limit: ${this.filePath}`
445
+ );
446
+ }
447
+
448
+ const data = JSON.parse(this.fs.readFileSync(this.filePath, 'utf-8'));
449
+ return data as Record<string, number>;
450
+ } catch (e: any) {
451
+ // Fail closed: nonce resets can enable replay.
452
+ throw new Error(
453
+ `Failed to parse nonces.json (replay protection would be weakened). ` +
454
+ `Fix/delete the file: ${this.filePath}. Error: ${e?.message || String(e)}`
455
+ );
456
+ }
457
+ }
458
+
459
+ /**
460
+ * Save nonces to file atomically with file locking
461
+ *
462
+ * SECURITY FIX (NEW-H-4): File locking prevents concurrent write corruption
463
+ */
464
+ private async saveToFile(): Promise<void> {
465
+ const data = this.inMemory.getAllNonces();
466
+ const tempPath = `${this.filePath}.tmp`;
467
+
468
+ // SECURITY FIX: Ensure file exists before locking (proper-lockfile requirement)
469
+ ensureSafeFile(this.filePath, '{}', 0o644);
470
+
471
+ // SECURITY FIX (NEW-H-4): Acquire file lock before writing
472
+ let release: (() => Promise<void>) | null = null;
473
+ try {
474
+ release = await this.lockfile.lock(this.filePath, {
475
+ stale: 10000, // Lock expires after 10 seconds if process crashes
476
+ retries: {
477
+ retries: 5,
478
+ minTimeout: 100,
479
+ maxTimeout: 500
480
+ }
481
+ });
482
+
483
+ // Atomic write: temp file + rename
484
+ if (this.fs.existsSync(tempPath)) {
485
+ this.fs.unlinkSync(tempPath);
486
+ }
487
+ this.fs.writeFileSync(tempPath, JSON.stringify(data, null, 2), {
488
+ encoding: 'utf-8',
489
+ mode: 0o644,
490
+ flag: 'wx'
491
+ });
492
+ this.fs.renameSync(tempPath, this.filePath);
493
+ } catch (error) {
494
+ // Clean up temp file on error
495
+ if (this.fs.existsSync(tempPath)) {
496
+ try {
497
+ this.fs.unlinkSync(tempPath);
498
+ } catch {
499
+ // Ignore cleanup errors
500
+ }
501
+ }
502
+ throw error;
503
+ } finally {
504
+ if (release) {
505
+ await release();
506
+ }
507
+ }
508
+ }
509
+
510
+ getNextNonce(messageType: string): number {
511
+ return this.inMemory.getNextNonce(messageType);
512
+ }
513
+
514
+ /**
515
+ * Atomic get and increment with persistence
516
+ */
517
+ async getAndIncrementNonce(messageType: string): Promise<number> {
518
+ const nonce = await this.inMemory.getAndIncrementNonce(messageType);
519
+ // SECURITY FIX (NEW-H-4): saveToFile is now async
520
+ await this.saveToFile();
521
+ return nonce;
522
+ }
523
+
524
+ recordNonce(messageType: string, nonce: number): void {
525
+ this.inMemory.recordNonce(messageType, nonce);
526
+ // Fire-and-forget to maintain sync interface
527
+ this.saveToFile().catch((err) => {
528
+ console.error('Failed to save nonce manager state:', err);
529
+ });
530
+ }
531
+
532
+ getCurrentNonce(messageType: string): number {
533
+ return this.inMemory.getCurrentNonce(messageType);
534
+ }
535
+
536
+ resetNonce(messageType: string): void {
537
+ this.inMemory.resetNonce(messageType);
538
+ // Fire-and-forget to maintain sync interface
539
+ this.saveToFile().catch((err) => {
540
+ console.error('Failed to save nonce manager state:', err);
541
+ });
542
+ }
543
+
544
+ getAllNonces(): Record<string, number> {
545
+ return this.inMemory.getAllNonces();
546
+ }
547
+
548
+ clearAll(): void {
549
+ this.inMemory.clearAll();
550
+ if (this.fs.existsSync(this.filePath)) {
551
+ this.fs.unlinkSync(this.filePath);
552
+ }
553
+ }
554
+ }
555
+
279
556
  /**
280
557
  * Create nonce manager based on environment
281
- * @param did - Optional DID for scoped tracking
282
- * @param initialNonces - Optional initial nonces
558
+ * @param options - Configuration options
283
559
  * @returns NonceManager instance
560
+ *
561
+ * @example
562
+ * ```typescript
563
+ * // In-memory (default)
564
+ * const manager = createNonceManager();
565
+ *
566
+ * // DID-scoped
567
+ * const manager = createNonceManager({ did: 'did:ethr:0x...' });
568
+ *
569
+ * // Persistent (survives restarts)
570
+ * const manager = createNonceManager({ stateDirectory: '/path/to/project' });
571
+ * ```
284
572
  */
285
573
  export function createNonceManager(
286
- did?: string,
287
- initialNonces?: Record<string, number>
574
+ options?: {
575
+ did?: string;
576
+ initialNonces?: Record<string, number>;
577
+ stateDirectory?: string;
578
+ }
288
579
  ): NonceManager {
289
- if (did) {
290
- return new DIDScopedNonceManager(did, initialNonces);
580
+ // SECURITY FIX (H-1): Support persistent storage
581
+ if (options?.stateDirectory) {
582
+ return new FileBasedNonceManager(options.stateDirectory);
291
583
  }
292
- return new InMemoryNonceManager(initialNonces);
584
+
585
+ if (options?.did) {
586
+ return new DIDScopedNonceManager(options.did, options?.initialNonces);
587
+ }
588
+
589
+ return new InMemoryNonceManager(options?.initialNonces);
293
590
  }