@hashgraphonline/standards-sdk 0.1.190 → 0.1.191

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 (350) hide show
  1. package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  2. package/dist/browser/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  3. package/dist/browser/hcs-25/adapters/index.d.ts +1 -0
  4. package/dist/browser/hcs-25/adapters/index.d.ts.map +1 -1
  5. package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  6. package/dist/browser/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  7. package/dist/browser/hcs-25/collectors/catalog.d.ts +9 -2
  8. package/dist/browser/hcs-25/collectors/catalog.d.ts.map +1 -1
  9. package/dist/browser/hcs-25/collectors/index.d.ts +1 -0
  10. package/dist/browser/hcs-25/collectors/index.d.ts.map +1 -1
  11. package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  12. package/dist/browser/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  13. package/dist/browser/hcs-25/signals/index.d.ts +1 -0
  14. package/dist/browser/hcs-25/signals/index.d.ts.map +1 -1
  15. package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  16. package/dist/browser-root/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  17. package/dist/browser-root/hcs-25/adapters/index.d.ts +1 -0
  18. package/dist/browser-root/hcs-25/adapters/index.d.ts.map +1 -1
  19. package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  20. package/dist/browser-root/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  21. package/dist/browser-root/hcs-25/collectors/catalog.d.ts +9 -2
  22. package/dist/browser-root/hcs-25/collectors/catalog.d.ts.map +1 -1
  23. package/dist/browser-root/hcs-25/collectors/index.d.ts +1 -0
  24. package/dist/browser-root/hcs-25/collectors/index.d.ts.map +1 -1
  25. package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  26. package/dist/browser-root/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  27. package/dist/browser-root/hcs-25/signals/index.d.ts +1 -0
  28. package/dist/browser-root/hcs-25/signals/index.d.ts.map +1 -1
  29. package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  30. package/dist/cjs/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  31. package/dist/cjs/hcs-25/adapters/index.d.ts +1 -0
  32. package/dist/cjs/hcs-25/adapters/index.d.ts.map +1 -1
  33. package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  34. package/dist/cjs/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  35. package/dist/cjs/hcs-25/collectors/catalog.d.ts +9 -2
  36. package/dist/cjs/hcs-25/collectors/catalog.d.ts.map +1 -1
  37. package/dist/cjs/hcs-25/collectors/index.d.ts +1 -0
  38. package/dist/cjs/hcs-25/collectors/index.d.ts.map +1 -1
  39. package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  40. package/dist/cjs/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  41. package/dist/cjs/hcs-25/signals/index.d.ts +1 -0
  42. package/dist/cjs/hcs-25/signals/index.d.ts.map +1 -1
  43. package/dist/cjs/standards-sdk.cjs +1 -1
  44. package/dist/cjs/standards-sdk.cjs.map +1 -1
  45. package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts +22 -0
  46. package/dist/es/hcs-25/adapters/ans-trust-discovery.d.ts.map +1 -0
  47. package/dist/es/hcs-25/adapters/index.d.ts +1 -0
  48. package/dist/es/hcs-25/adapters/index.d.ts.map +1 -1
  49. package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts +32 -0
  50. package/dist/es/hcs-25/collectors/ans-trust-discovery.d.ts.map +1 -0
  51. package/dist/es/hcs-25/collectors/catalog.d.ts +9 -2
  52. package/dist/es/hcs-25/collectors/catalog.d.ts.map +1 -1
  53. package/dist/es/hcs-25/collectors/index.d.ts +1 -0
  54. package/dist/es/hcs-25/collectors/index.d.ts.map +1 -1
  55. package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts +50 -0
  56. package/dist/es/hcs-25/signals/ans-trust-discovery.d.ts.map +1 -0
  57. package/dist/es/hcs-25/signals/index.d.ts +1 -0
  58. package/dist/es/hcs-25/signals/index.d.ts.map +1 -1
  59. package/dist/es/standards-sdk.es.js +78 -71
  60. package/dist/es/standards-sdk.es.js.map +1 -1
  61. package/dist/es/standards-sdk.es101.js +2 -2
  62. package/dist/es/standards-sdk.es103.js +2 -2
  63. package/dist/es/standards-sdk.es104.js +1 -1
  64. package/dist/es/standards-sdk.es106.js +1 -1
  65. package/dist/es/standards-sdk.es108.js +2 -2
  66. package/dist/es/standards-sdk.es11.js +1 -1
  67. package/dist/es/standards-sdk.es110.js +1 -1
  68. package/dist/es/standards-sdk.es111.js +2 -2
  69. package/dist/es/standards-sdk.es115.js +3 -3
  70. package/dist/es/standards-sdk.es116.js +4 -4
  71. package/dist/es/standards-sdk.es12.js +1 -1
  72. package/dist/es/standards-sdk.es120.js +22 -4
  73. package/dist/es/standards-sdk.es120.js.map +1 -1
  74. package/dist/es/standards-sdk.es121.js +15 -12
  75. package/dist/es/standards-sdk.es121.js.map +1 -1
  76. package/dist/es/standards-sdk.es123.js +6 -5
  77. package/dist/es/standards-sdk.es123.js.map +1 -1
  78. package/dist/es/standards-sdk.es124.js +6 -5
  79. package/dist/es/standards-sdk.es124.js.map +1 -1
  80. package/dist/es/standards-sdk.es127.js +6 -5
  81. package/dist/es/standards-sdk.es127.js.map +1 -1
  82. package/dist/es/standards-sdk.es128.js +110 -136
  83. package/dist/es/standards-sdk.es128.js.map +1 -1
  84. package/dist/es/standards-sdk.es129.js +133 -141
  85. package/dist/es/standards-sdk.es129.js.map +1 -1
  86. package/dist/es/standards-sdk.es13.js +1 -1
  87. package/dist/es/standards-sdk.es130.js +135 -345
  88. package/dist/es/standards-sdk.es130.js.map +1 -1
  89. package/dist/es/standards-sdk.es131.js +332 -344
  90. package/dist/es/standards-sdk.es131.js.map +1 -1
  91. package/dist/es/standards-sdk.es132.js +338 -178
  92. package/dist/es/standards-sdk.es132.js.map +1 -1
  93. package/dist/es/standards-sdk.es133.js +200 -196
  94. package/dist/es/standards-sdk.es133.js.map +1 -1
  95. package/dist/es/standards-sdk.es134.js +216 -364
  96. package/dist/es/standards-sdk.es134.js.map +1 -1
  97. package/dist/es/standards-sdk.es135.js +358 -100
  98. package/dist/es/standards-sdk.es135.js.map +1 -1
  99. package/dist/es/standards-sdk.es136.js +91 -220
  100. package/dist/es/standards-sdk.es136.js.map +1 -1
  101. package/dist/es/standards-sdk.es137.js +173 -1250
  102. package/dist/es/standards-sdk.es137.js.map +1 -1
  103. package/dist/es/standards-sdk.es138.js +1295 -98
  104. package/dist/es/standards-sdk.es138.js.map +1 -1
  105. package/dist/es/standards-sdk.es139.js +109 -246
  106. package/dist/es/standards-sdk.es139.js.map +1 -1
  107. package/dist/es/standards-sdk.es14.js +1 -1
  108. package/dist/es/standards-sdk.es140.js +263 -97
  109. package/dist/es/standards-sdk.es140.js.map +1 -1
  110. package/dist/es/standards-sdk.es141.js +107 -248
  111. package/dist/es/standards-sdk.es141.js.map +1 -1
  112. package/dist/es/standards-sdk.es142.js +246 -472
  113. package/dist/es/standards-sdk.es142.js.map +1 -1
  114. package/dist/es/standards-sdk.es143.js +458 -85
  115. package/dist/es/standards-sdk.es143.js.map +1 -1
  116. package/dist/es/standards-sdk.es144.js +96 -151
  117. package/dist/es/standards-sdk.es144.js.map +1 -1
  118. package/dist/es/standards-sdk.es145.js +155 -29
  119. package/dist/es/standards-sdk.es145.js.map +1 -1
  120. package/dist/es/standards-sdk.es146.js +26 -4
  121. package/dist/es/standards-sdk.es146.js.map +1 -1
  122. package/dist/es/standards-sdk.es147.js +10 -180
  123. package/dist/es/standards-sdk.es147.js.map +1 -1
  124. package/dist/es/standards-sdk.es148.js +179 -26
  125. package/dist/es/standards-sdk.es148.js.map +1 -1
  126. package/dist/es/standards-sdk.es149.js +27 -20
  127. package/dist/es/standards-sdk.es149.js.map +1 -1
  128. package/dist/es/standards-sdk.es15.js +1 -1
  129. package/dist/es/standards-sdk.es150.js +18 -156
  130. package/dist/es/standards-sdk.es150.js.map +1 -1
  131. package/dist/es/standards-sdk.es151.js +148 -190
  132. package/dist/es/standards-sdk.es151.js.map +1 -1
  133. package/dist/es/standards-sdk.es152.js +159 -747
  134. package/dist/es/standards-sdk.es152.js.map +1 -1
  135. package/dist/es/standards-sdk.es153.js +786 -9
  136. package/dist/es/standards-sdk.es153.js.map +1 -1
  137. package/dist/es/standards-sdk.es154.js +13 -567
  138. package/dist/es/standards-sdk.es154.js.map +1 -1
  139. package/dist/es/standards-sdk.es155.js +541 -600
  140. package/dist/es/standards-sdk.es155.js.map +1 -1
  141. package/dist/es/standards-sdk.es156.js +625 -12
  142. package/dist/es/standards-sdk.es156.js.map +1 -1
  143. package/dist/es/standards-sdk.es157.js +13 -2
  144. package/dist/es/standards-sdk.es157.js.map +1 -1
  145. package/dist/es/standards-sdk.es158.js +2 -87
  146. package/dist/es/standards-sdk.es158.js.map +1 -1
  147. package/dist/es/standards-sdk.es159.js +84 -37
  148. package/dist/es/standards-sdk.es159.js.map +1 -1
  149. package/dist/es/standards-sdk.es16.js +6 -6
  150. package/dist/es/standards-sdk.es160.js +40 -2
  151. package/dist/es/standards-sdk.es160.js.map +1 -1
  152. package/dist/es/standards-sdk.es161.js +2 -235
  153. package/dist/es/standards-sdk.es161.js.map +1 -1
  154. package/dist/es/standards-sdk.es162.js +204 -1109
  155. package/dist/es/standards-sdk.es162.js.map +1 -1
  156. package/dist/es/standards-sdk.es163.js +1059 -225
  157. package/dist/es/standards-sdk.es163.js.map +1 -1
  158. package/dist/es/standards-sdk.es164.js +303 -419
  159. package/dist/es/standards-sdk.es164.js.map +1 -1
  160. package/dist/es/standards-sdk.es165.js +418 -351
  161. package/dist/es/standards-sdk.es165.js.map +1 -1
  162. package/dist/es/standards-sdk.es166.js +347 -1114
  163. package/dist/es/standards-sdk.es166.js.map +1 -1
  164. package/dist/es/standards-sdk.es167.js +1094 -180
  165. package/dist/es/standards-sdk.es167.js.map +1 -1
  166. package/dist/es/standards-sdk.es168.js +153 -1512
  167. package/dist/es/standards-sdk.es168.js.map +1 -1
  168. package/dist/es/standards-sdk.es169.js +1457 -1056
  169. package/dist/es/standards-sdk.es169.js.map +1 -1
  170. package/dist/es/standards-sdk.es170.js +1163 -14
  171. package/dist/es/standards-sdk.es170.js.map +1 -1
  172. package/dist/es/standards-sdk.es171.js +15 -449
  173. package/dist/es/standards-sdk.es171.js.map +1 -1
  174. package/dist/es/standards-sdk.es172.js +440 -248
  175. package/dist/es/standards-sdk.es172.js.map +1 -1
  176. package/dist/es/standards-sdk.es173.js +259 -4
  177. package/dist/es/standards-sdk.es173.js.map +1 -1
  178. package/dist/es/standards-sdk.es174.js +4 -81
  179. package/dist/es/standards-sdk.es174.js.map +1 -1
  180. package/dist/es/standards-sdk.es175.js +71 -77
  181. package/dist/es/standards-sdk.es175.js.map +1 -1
  182. package/dist/es/standards-sdk.es176.js +80 -53
  183. package/dist/es/standards-sdk.es176.js.map +1 -1
  184. package/dist/es/standards-sdk.es177.js +59 -2546
  185. package/dist/es/standards-sdk.es177.js.map +1 -1
  186. package/dist/es/standards-sdk.es178.js +2547 -159
  187. package/dist/es/standards-sdk.es178.js.map +1 -1
  188. package/dist/es/standards-sdk.es179.js +159 -7
  189. package/dist/es/standards-sdk.es179.js.map +1 -1
  190. package/dist/es/standards-sdk.es18.js +13 -13
  191. package/dist/es/standards-sdk.es180.js +7 -86
  192. package/dist/es/standards-sdk.es180.js.map +1 -1
  193. package/dist/es/standards-sdk.es181.js +65 -44
  194. package/dist/es/standards-sdk.es181.js.map +1 -1
  195. package/dist/es/standards-sdk.es182.js +57 -188
  196. package/dist/es/standards-sdk.es182.js.map +1 -1
  197. package/dist/es/standards-sdk.es183.js +27 -26
  198. package/dist/es/standards-sdk.es183.js.map +1 -1
  199. package/dist/es/standards-sdk.es184.js +191 -53
  200. package/dist/es/standards-sdk.es184.js.map +1 -1
  201. package/dist/es/standards-sdk.es185.js +21 -109
  202. package/dist/es/standards-sdk.es185.js.map +1 -1
  203. package/dist/es/standards-sdk.es186.js +49 -47
  204. package/dist/es/standards-sdk.es186.js.map +1 -1
  205. package/dist/es/standards-sdk.es187.js +89 -205
  206. package/dist/es/standards-sdk.es187.js.map +1 -1
  207. package/dist/es/standards-sdk.es188.js +35 -58
  208. package/dist/es/standards-sdk.es188.js.map +1 -1
  209. package/dist/es/standards-sdk.es189.js +48 -39
  210. package/dist/es/standards-sdk.es189.js.map +1 -1
  211. package/dist/es/standards-sdk.es19.js +10 -10
  212. package/dist/es/standards-sdk.es190.js +218 -48
  213. package/dist/es/standards-sdk.es190.js.map +1 -1
  214. package/dist/es/standards-sdk.es191.js +66 -42
  215. package/dist/es/standards-sdk.es191.js.map +1 -1
  216. package/dist/es/standards-sdk.es192.js +33 -105
  217. package/dist/es/standards-sdk.es192.js.map +1 -1
  218. package/dist/es/standards-sdk.es193.js +49 -43
  219. package/dist/es/standards-sdk.es193.js.map +1 -1
  220. package/dist/es/standards-sdk.es194.js +33 -42
  221. package/dist/es/standards-sdk.es194.js.map +1 -1
  222. package/dist/es/standards-sdk.es195.js +123 -72
  223. package/dist/es/standards-sdk.es195.js.map +1 -1
  224. package/dist/es/standards-sdk.es196.js +58 -75
  225. package/dist/es/standards-sdk.es196.js.map +1 -1
  226. package/dist/es/standards-sdk.es197.js +60 -44
  227. package/dist/es/standards-sdk.es197.js.map +1 -1
  228. package/dist/es/standards-sdk.es198.js +72 -36
  229. package/dist/es/standards-sdk.es198.js.map +1 -1
  230. package/dist/es/standards-sdk.es199.js +75 -30
  231. package/dist/es/standards-sdk.es199.js.map +1 -1
  232. package/dist/es/standards-sdk.es2.js +2 -2
  233. package/dist/es/standards-sdk.es20.js +1 -1
  234. package/dist/es/standards-sdk.es200.js +44 -34
  235. package/dist/es/standards-sdk.es200.js.map +1 -1
  236. package/dist/es/standards-sdk.es201.js +36 -48
  237. package/dist/es/standards-sdk.es201.js.map +1 -1
  238. package/dist/es/standards-sdk.es202.js +30 -138
  239. package/dist/es/standards-sdk.es202.js.map +1 -1
  240. package/dist/es/standards-sdk.es203.js +34 -42
  241. package/dist/es/standards-sdk.es203.js.map +1 -1
  242. package/dist/es/standards-sdk.es204.js +48 -12482
  243. package/dist/es/standards-sdk.es204.js.map +1 -1
  244. package/dist/es/standards-sdk.es205.js +134 -13
  245. package/dist/es/standards-sdk.es205.js.map +1 -1
  246. package/dist/es/standards-sdk.es206.js +36 -50
  247. package/dist/es/standards-sdk.es206.js.map +1 -1
  248. package/dist/es/standards-sdk.es207.js +12449 -78
  249. package/dist/es/standards-sdk.es207.js.map +1 -1
  250. package/dist/es/standards-sdk.es208.js +15 -79
  251. package/dist/es/standards-sdk.es208.js.map +1 -1
  252. package/dist/es/standards-sdk.es209.js +48 -192
  253. package/dist/es/standards-sdk.es209.js.map +1 -1
  254. package/dist/es/standards-sdk.es21.js +1 -1
  255. package/dist/es/standards-sdk.es210.js +90 -651
  256. package/dist/es/standards-sdk.es210.js.map +1 -1
  257. package/dist/es/standards-sdk.es211.js +71 -63
  258. package/dist/es/standards-sdk.es211.js.map +1 -1
  259. package/dist/es/standards-sdk.es212.js +188 -160
  260. package/dist/es/standards-sdk.es212.js.map +1 -1
  261. package/dist/es/standards-sdk.es213.js +65 -314
  262. package/dist/es/standards-sdk.es213.js.map +1 -1
  263. package/dist/es/standards-sdk.es214.js +661 -335
  264. package/dist/es/standards-sdk.es214.js.map +1 -1
  265. package/dist/es/standards-sdk.es215.js +129 -410
  266. package/dist/es/standards-sdk.es215.js.map +1 -1
  267. package/dist/es/standards-sdk.es216.js +200 -209
  268. package/dist/es/standards-sdk.es216.js.map +1 -1
  269. package/dist/es/standards-sdk.es217.js +334 -64
  270. package/dist/es/standards-sdk.es217.js.map +1 -1
  271. package/dist/es/standards-sdk.es218.js +438 -124
  272. package/dist/es/standards-sdk.es218.js.map +1 -1
  273. package/dist/es/standards-sdk.es219.js +310 -496
  274. package/dist/es/standards-sdk.es219.js.map +1 -1
  275. package/dist/es/standards-sdk.es22.js +1 -1
  276. package/dist/es/standards-sdk.es220.js +60 -243
  277. package/dist/es/standards-sdk.es220.js.map +1 -1
  278. package/dist/es/standards-sdk.es221.js +118 -175
  279. package/dist/es/standards-sdk.es221.js.map +1 -1
  280. package/dist/es/standards-sdk.es222.js +465 -67
  281. package/dist/es/standards-sdk.es222.js.map +1 -1
  282. package/dist/es/standards-sdk.es223.js +250 -143
  283. package/dist/es/standards-sdk.es223.js.map +1 -1
  284. package/dist/es/standards-sdk.es224.js +172 -160
  285. package/dist/es/standards-sdk.es224.js.map +1 -1
  286. package/dist/es/standards-sdk.es225.js +65 -630
  287. package/dist/es/standards-sdk.es225.js.map +1 -1
  288. package/dist/es/standards-sdk.es226.js +128 -161
  289. package/dist/es/standards-sdk.es226.js.map +1 -1
  290. package/dist/es/standards-sdk.es227.js +144 -195
  291. package/dist/es/standards-sdk.es227.js.map +1 -1
  292. package/dist/es/standards-sdk.es228.js +668 -223
  293. package/dist/es/standards-sdk.es228.js.map +1 -1
  294. package/dist/es/standards-sdk.es229.js +188 -0
  295. package/dist/es/standards-sdk.es229.js.map +1 -0
  296. package/dist/es/standards-sdk.es23.js +1 -1
  297. package/dist/es/standards-sdk.es230.js +238 -0
  298. package/dist/es/standards-sdk.es230.js.map +1 -0
  299. package/dist/es/standards-sdk.es231.js +242 -0
  300. package/dist/es/standards-sdk.es231.js.map +1 -0
  301. package/dist/es/standards-sdk.es24.js +1 -1
  302. package/dist/es/standards-sdk.es25.js +1 -1
  303. package/dist/es/standards-sdk.es26.js +1 -1
  304. package/dist/es/standards-sdk.es27.js +13 -13
  305. package/dist/es/standards-sdk.es30.js +2 -2
  306. package/dist/es/standards-sdk.es31.js +4 -4
  307. package/dist/es/standards-sdk.es32.js +1 -1
  308. package/dist/es/standards-sdk.es35.js +7 -7
  309. package/dist/es/standards-sdk.es36.js +4 -4
  310. package/dist/es/standards-sdk.es37.js +2 -2
  311. package/dist/es/standards-sdk.es38.js +2 -2
  312. package/dist/es/standards-sdk.es39.js +1 -1
  313. package/dist/es/standards-sdk.es4.js +2 -2
  314. package/dist/es/standards-sdk.es40.js +1 -1
  315. package/dist/es/standards-sdk.es41.js +2 -2
  316. package/dist/es/standards-sdk.es46.js +1 -1
  317. package/dist/es/standards-sdk.es5.js +2 -2
  318. package/dist/es/standards-sdk.es51.js +1 -1
  319. package/dist/es/standards-sdk.es53.js +1 -1
  320. package/dist/es/standards-sdk.es56.js +2 -2
  321. package/dist/es/standards-sdk.es59.js +1 -1
  322. package/dist/es/standards-sdk.es6.js +2 -2
  323. package/dist/es/standards-sdk.es60.js +1 -1
  324. package/dist/es/standards-sdk.es62.js +1 -1
  325. package/dist/es/standards-sdk.es63.js +2 -2
  326. package/dist/es/standards-sdk.es64.js +1 -1
  327. package/dist/es/standards-sdk.es65.js +1 -1
  328. package/dist/es/standards-sdk.es66.js +1 -1
  329. package/dist/es/standards-sdk.es67.js +8 -8
  330. package/dist/es/standards-sdk.es69.js +1 -1
  331. package/dist/es/standards-sdk.es7.js +1 -1
  332. package/dist/es/standards-sdk.es71.js +2 -2
  333. package/dist/es/standards-sdk.es72.js +3 -3
  334. package/dist/es/standards-sdk.es75.js +5 -5
  335. package/dist/es/standards-sdk.es76.js +3 -3
  336. package/dist/es/standards-sdk.es77.js +2 -2
  337. package/dist/es/standards-sdk.es78.js +1 -1
  338. package/dist/es/standards-sdk.es81.js +2 -2
  339. package/dist/es/standards-sdk.es83.js +2 -2
  340. package/dist/es/standards-sdk.es84.js +5 -5
  341. package/dist/es/standards-sdk.es85.js +1 -1
  342. package/dist/es/standards-sdk.es88.js +1 -1
  343. package/dist/es/standards-sdk.es89.js +2 -2
  344. package/dist/es/standards-sdk.es9.js +2 -2
  345. package/dist/es/standards-sdk.es90.js +4 -4
  346. package/dist/es/standards-sdk.es94.js +3 -3
  347. package/dist/es/standards-sdk.es96.js +2 -2
  348. package/dist/es/standards-sdk.es98.js +1 -1
  349. package/dist/es/standards-sdk.es99.js +3 -3
  350. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es134.js","sources":["../../src/hcs-25/collectors/x402-onchain.ts"],"sourcesContent":["import {\n createPublicClient,\n fallback,\n formatUnits,\n getAddress,\n http as httpTransport,\n type Address,\n type Chain,\n} from 'viem';\nimport { base, baseSepolia } from 'viem/chains';\n\n/**\n * Aggregated on-chain x402 payment usage for a `payTo` address.\n */\nexport interface Hcs25X402UsageSummary {\n volume7dUsd: number;\n volume24hUsd: number;\n inboundTrades7d: number;\n outboundTrades7d: number;\n}\n\n/**\n * One UTC day of scanned payment activity.\n */\nexport interface Hcs25X402UsageDailyBucket {\n /** UTC day, `YYYY-MM-DD`. */\n day: string;\n inboundTrades: number;\n outboundTrades: number;\n volumeUsd: number;\n}\n\n/**\n * Incremental scan checkpoint. Stored on the subject record\n * (`metadata.x402UsageCursor`) so subsequent refreshes only scan blocks\n * produced since the last run.\n */\nexport interface Hcs25X402UsageCursor {\n network: string;\n asset: string;\n payTo: string;\n lastScannedBlock: number;\n daily: Hcs25X402UsageDailyBucket[];\n}\n\nexport interface Hcs25X402UsageStateParams {\n /** x402 network identifier (`base` or `base-sepolia`). */\n network: unknown;\n /** Payment asset contract address (e.g. USDC). */\n asset: unknown;\n /** Recipient address whose inbound/outbound transfers are scanned. */\n payTo: unknown;\n /** Previously stored `x402UsageCursor` for incremental refresh. */\n cursor?: unknown;\n}\n\nexport interface Hcs25X402OnchainUsageOptions {\n /** Rolling window in days (1–14). Default 7. */\n days?: number;\n /** Cache TTL applied to per-block/per-contract lookups. Default 30 min. */\n ttlMs?: number;\n /** Retries per RPC call with exponential backoff. Default 2. */\n maxRetries?: number;\n /** getLogs range chunk size in blocks. Default 50000. */\n chunkSizeBlocks?: number;\n /** RPC endpoint overrides per network (replaces the built-in lists). */\n rpcUrls?: Partial<Record<string, readonly string[]>>;\n}\n\nexport interface Hcs25X402UsageStateResult {\n summary: Hcs25X402UsageSummary | null;\n cursor: Hcs25X402UsageCursor | null;\n}\n\ntype X402Network = 'base' | 'base-sepolia';\n\ninterface NetworkConfig {\n chain: Chain;\n rpcUrls: string[];\n usdcAddresses: Set<string>;\n}\n\nconst TRANSFER_EVENT_ABI = [\n {\n type: 'event',\n name: 'Transfer',\n inputs: [\n { indexed: true, name: 'from', type: 'address' },\n { indexed: true, name: 'to', type: 'address' },\n { indexed: false, name: 'value', type: 'uint256' },\n ],\n anonymous: false,\n },\n] as const;\n\nconst DECIMALS_ABI = [\n {\n type: 'function',\n name: 'decimals',\n inputs: [],\n outputs: [{ name: '', type: 'uint8' }],\n stateMutability: 'view',\n },\n] as const;\n\nconst NETWORK_CONFIG: Record<X402Network, NetworkConfig> = {\n base: {\n chain: base,\n rpcUrls: [\n 'https://mainnet.base.org',\n 'https://1rpc.io/base',\n 'https://base.llamarpc.com',\n 'https://base-rpc.publicnode.com',\n ],\n usdcAddresses: new Set(['0x833589fcd6edb6e08f4c7c32d4f71b54bda02913']),\n },\n 'base-sepolia': {\n chain: baseSepolia,\n rpcUrls: [\n 'https://sepolia.base.org',\n 'https://1rpc.io/base-sepolia',\n 'https://base-sepolia-rpc.publicnode.com',\n ],\n usdcAddresses: new Set(['0x036cbd53842c5426634e7929541ec2318f3dcf7e']),\n },\n};\n\nconst toNetwork = (value: unknown): X402Network | null => {\n if (typeof value !== 'string') {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'base') {\n return 'base';\n }\n if (normalized === 'base-sepolia' || normalized === 'basesepolia') {\n return 'base-sepolia';\n }\n return null;\n};\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise(resolve => setTimeout(resolve, ms));\n\nconst round6 = (value: number): number => Math.round(value * 1e6) / 1e6;\n\nconst toDayStringUtc = (timestampMs: number): string => {\n const date = new Date(timestampMs);\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(\n date.getUTCDate(),\n ).padStart(2, '0')}`;\n};\n\ninterface CachedValue<T> {\n value: T;\n expiresAt: number;\n}\n\nconst decimalsCache = new Map<string, CachedValue<number>>();\nconst fromBlockCache = new Map<string, CachedValue<bigint>>();\nconst blockDayCache = new Map<string, CachedValue<string>>();\n\n/**\n * Minimal structural view of a viem `PublicClient` — keeps the scanner's\n * type surface shallow (viem's full client type is too deep for tsc) and\n * makes the client mockable in tests.\n */\nexport interface X402PublicClient {\n chain?: { id?: number } | undefined;\n getBlockNumber(): Promise<bigint>;\n getBlock(params: { blockNumber: bigint }): Promise<{ timestamp: bigint }>;\n getLogs(params: {\n address: Address;\n event: unknown;\n args?: { from?: Address; to?: Address };\n fromBlock: bigint;\n toBlock: bigint;\n }): Promise<\n readonly { blockNumber: bigint | null; args: { value?: bigint } }[]\n >;\n readContract(params: {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n }): Promise<unknown>;\n}\n\ntype PublicClient = X402PublicClient;\n\nasync function withRetries<T>(\n operation: () => Promise<T>,\n maxRetries: number,\n baseDelayMs: number,\n): Promise<T> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= maxRetries; attempt += 1) {\n try {\n return await operation();\n } catch (error) {\n lastError = error;\n if (attempt >= maxRetries) {\n throw error;\n }\n await sleep(baseDelayMs * 2 ** attempt);\n }\n }\n throw lastError;\n}\n\nconst keepRollingDays = (\n buckets: Hcs25X402UsageDailyBucket[],\n keepDays: number,\n): Hcs25X402UsageDailyBucket[] => {\n const keep = new Set<string>();\n const today = toDayStringUtc(Date.now());\n const [year, month, day] = today.split('-').map(v => Number.parseInt(v, 10));\n const baseUtc = Date.UTC(year, month - 1, day);\n for (let offset = 0; offset < keepDays; offset += 1) {\n keep.add(toDayStringUtc(baseUtc - offset * 24 * 60 * 60 * 1000));\n }\n return buckets\n .filter(bucket => keep.has(bucket.day))\n .sort((a, b) => (a.day < b.day ? -1 : a.day > b.day ? 1 : 0))\n .slice(-keepDays);\n};\n\nfunction parseCursor(value: unknown): Hcs25X402UsageCursor | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return null;\n }\n const cursor = value as Partial<Hcs25X402UsageCursor>;\n if (\n typeof cursor.asset !== 'string' ||\n typeof cursor.payTo !== 'string' ||\n typeof cursor.lastScannedBlock !== 'number' ||\n !Number.isFinite(cursor.lastScannedBlock) ||\n cursor.lastScannedBlock < 0 ||\n !Array.isArray(cursor.daily)\n ) {\n return null;\n }\n const network = toNetwork(cursor.network);\n if (!network) {\n return null;\n }\n const daily = cursor.daily\n .filter(\n (entry): entry is Hcs25X402UsageDailyBucket =>\n !!entry &&\n typeof entry === 'object' &&\n typeof entry.day === 'string' &&\n typeof entry.inboundTrades === 'number' &&\n Number.isFinite(entry.inboundTrades) &&\n typeof entry.outboundTrades === 'number' &&\n Number.isFinite(entry.outboundTrades) &&\n typeof entry.volumeUsd === 'number' &&\n Number.isFinite(entry.volumeUsd),\n )\n .map(entry => ({\n day: entry.day,\n inboundTrades: Math.max(0, Math.floor(entry.inboundTrades)),\n outboundTrades: Math.max(0, Math.floor(entry.outboundTrades)),\n volumeUsd: round6(Math.max(0, entry.volumeUsd)),\n }));\n return {\n network,\n asset: cursor.asset,\n payTo: cursor.payTo,\n lastScannedBlock: Math.floor(cursor.lastScannedBlock),\n daily,\n };\n}\n\nasync function resolveDecimals(params: {\n client: PublicClient;\n asset: Address;\n isUsdc: boolean;\n cacheTtlMs: number;\n maxRetries: number;\n}): Promise<number> {\n if (params.isUsdc) {\n return 6;\n }\n const cacheKey = `${params.client.chain?.id ?? 'unknown'}:${params.asset}:decimals`;\n const cached = decimalsCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value;\n }\n const decimals = await withRetries(\n async () => {\n const value = await params.client.readContract({\n address: params.asset,\n abi: DECIMALS_ABI,\n functionName: 'decimals',\n });\n return Number(value);\n },\n params.maxRetries,\n 200,\n );\n const normalized = Number.isFinite(decimals)\n ? Math.max(0, Math.min(255, Math.floor(decimals)))\n : 18;\n decimalsCache.set(cacheKey, {\n value: normalized,\n expiresAt: Date.now() + params.cacheTtlMs,\n });\n return normalized;\n}\n\nasync function estimateFromBlockByTimestamp(params: {\n client: PublicClient;\n targetTimestampSec: bigint;\n cacheKey: string;\n cacheTtlMs: number;\n maxRetries: number;\n}): Promise<bigint> {\n const cached = fromBlockCache.get(params.cacheKey);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value;\n }\n\n const latestBlockNumber = await withRetries(\n () => params.client.getBlockNumber(),\n params.maxRetries,\n 200,\n );\n const latest = await withRetries(\n () => params.client.getBlock({ blockNumber: latestBlockNumber }),\n params.maxRetries,\n 200,\n );\n\n const probeDelta = 5000n;\n const probeBlockNumber =\n latestBlockNumber > probeDelta ? latestBlockNumber - probeDelta : 0n;\n const probe = await withRetries(\n () => params.client.getBlock({ blockNumber: probeBlockNumber }),\n params.maxRetries,\n 200,\n );\n\n const latestTs = BigInt(latest.timestamp);\n const probeTs = BigInt(probe.timestamp);\n const deltaSeconds = latestTs > probeTs ? latestTs - probeTs : 0n;\n const secondsPerBlock =\n deltaSeconds > 0n\n ? Number(deltaSeconds) /\n Number(latestBlockNumber - probeBlockNumber || 1n)\n : 2;\n\n const secondsAgo =\n latestTs > params.targetTimestampSec\n ? latestTs - params.targetTimestampSec\n : 0n;\n const approxBlocksAgo =\n secondsPerBlock > 0\n ? BigInt(Math.ceil(Number(secondsAgo) / secondsPerBlock))\n : 0n;\n const margin = 1000n;\n let low =\n latestBlockNumber > approxBlocksAgo + margin\n ? latestBlockNumber - approxBlocksAgo - margin\n : 0n;\n let high = latestBlockNumber;\n while (low < high) {\n const mid = (low + high) / 2n;\n const block = await withRetries(\n () => params.client.getBlock({ blockNumber: mid }),\n params.maxRetries,\n 200,\n );\n if (BigInt(block.timestamp) >= params.targetTimestampSec) {\n high = mid;\n } else {\n low = mid + 1n;\n }\n }\n\n fromBlockCache.set(params.cacheKey, {\n value: low,\n expiresAt: Date.now() + params.cacheTtlMs,\n });\n return low;\n}\n\nasync function resolveBlockDay(params: {\n client: PublicClient;\n blockNumber: bigint;\n cacheTtlMs: number;\n maxRetries: number;\n}): Promise<string> {\n const cacheKey = `${params.client.chain?.id ?? 'unknown'}:${params.blockNumber.toString()}:day`;\n const cached = blockDayCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value;\n }\n const block = await withRetries(\n () => params.client.getBlock({ blockNumber: params.blockNumber }),\n params.maxRetries,\n 200,\n );\n const day = toDayStringUtc(Number(block.timestamp) * 1000);\n blockDayCache.set(cacheKey, {\n value: day,\n expiresAt: Date.now() + params.cacheTtlMs,\n });\n return day;\n}\n\n/**\n * Scans ERC-20 `Transfer` events to/from `payTo` on the configured x402\n * network and aggregates daily inbound/outbound trade counts and USD\n * volume, resuming from a stored cursor when possible.\n *\n * Ported from Registry Broker's `fetchX402OnchainUsageState`: chunked\n * `getLogs` ranges, per-block day resolution caching, binary-search window\n * estimation, and retry/backoff on RPC failures.\n */\nexport async function fetchX402OnchainUsageState(\n params: Hcs25X402UsageStateParams,\n options: Hcs25X402OnchainUsageOptions = {},\n): Promise<Hcs25X402UsageStateResult> {\n const network = toNetwork(params.network);\n if (!network) {\n return { summary: null, cursor: null };\n }\n const config = NETWORK_CONFIG[network];\n\n if (typeof params.asset !== 'string' || typeof params.payTo !== 'string') {\n return { summary: null, cursor: null };\n }\n let asset: Address;\n let payTo: Address;\n try {\n asset = getAddress(params.asset.trim());\n payTo = getAddress(params.payTo.trim());\n } catch {\n return { summary: null, cursor: null };\n }\n\n const now = Date.now();\n const ttlMs =\n typeof options.ttlMs === 'number' &&\n Number.isFinite(options.ttlMs) &&\n options.ttlMs > 0\n ? options.ttlMs\n : 30 * 60 * 1000;\n const maxRetries =\n typeof options.maxRetries === 'number' &&\n Number.isFinite(options.maxRetries) &&\n options.maxRetries >= 0\n ? Math.floor(options.maxRetries)\n : 2;\n const chunkSizeBlocks =\n typeof options.chunkSizeBlocks === 'number' &&\n Number.isFinite(options.chunkSizeBlocks) &&\n options.chunkSizeBlocks > 0\n ? BigInt(Math.floor(options.chunkSizeBlocks))\n : 50_000n;\n\n const rpcUrls = options.rpcUrls?.[network]?.length\n ? [...options.rpcUrls[network]!]\n : config.rpcUrls;\n const transports = rpcUrls.map(url => httpTransport(url));\n if (transports.length === 0) {\n return { summary: null, cursor: null };\n }\n const client = createPublicClient({\n chain: config.chain,\n transport: transports.length > 1 ? fallback(transports) : transports[0],\n }) as unknown as PublicClient;\n\n const assetLower = asset.toLowerCase();\n const payToLower = payTo.toLowerCase();\n const decimals = await resolveDecimals({\n client,\n asset,\n isUsdc: config.usdcAddresses.has(assetLower),\n cacheTtlMs: ttlMs,\n maxRetries,\n });\n\n const days =\n typeof options.days === 'number' &&\n Number.isFinite(options.days) &&\n options.days > 0\n ? Math.min(14, Math.max(1, Math.floor(options.days)))\n : 7;\n\n const targetTimestampSec = BigInt(\n Math.floor((now - days * 24 * 60 * 60 * 1000) / 1000),\n );\n const windowFromBlock = await estimateFromBlockByTimestamp({\n client,\n targetTimestampSec,\n cacheKey: `${network}:${assetLower}:${payToLower}:fromBlock:${days}`,\n cacheTtlMs: ttlMs,\n maxRetries,\n });\n const toBlock = await client.getBlockNumber();\n\n const parsedCursor = parseCursor(params.cursor);\n const hasMatchingCursor =\n parsedCursor !== null &&\n parsedCursor.network === network &&\n parsedCursor.asset.toLowerCase() === assetLower &&\n parsedCursor.payTo.toLowerCase() === payToLower;\n\n const cursorFromBlock =\n hasMatchingCursor && parsedCursor\n ? BigInt(Math.max(0, parsedCursor.lastScannedBlock + 1))\n : windowFromBlock;\n const fromBlock =\n cursorFromBlock < windowFromBlock ? windowFromBlock : cursorFromBlock;\n const shouldResync = !hasMatchingCursor || cursorFromBlock < windowFromBlock;\n\n const bucketsByDay = new Map<string, Hcs25X402UsageDailyBucket>();\n if (!shouldResync && parsedCursor) {\n for (const bucket of keepRollingDays(parsedCursor.daily, days)) {\n bucketsByDay.set(bucket.day, { ...bucket });\n }\n }\n const ensureBucket = (day: string): Hcs25X402UsageDailyBucket => {\n const existing = bucketsByDay.get(day);\n if (existing) {\n return existing;\n }\n const created: Hcs25X402UsageDailyBucket = {\n day,\n inboundTrades: 0,\n outboundTrades: 0,\n volumeUsd: 0,\n };\n bucketsByDay.set(day, created);\n return created;\n };\n\n const aggregateLogs = async (\n direction: 'inbound' | 'outbound',\n ): Promise<void> => {\n if (toBlock < fromBlock) {\n return;\n }\n for (let start = fromBlock; start <= toBlock; ) {\n const end =\n start + chunkSizeBlocks - 1n <= toBlock\n ? start + chunkSizeBlocks - 1n\n : toBlock;\n const args =\n direction === 'inbound'\n ? ({ to: payTo } as const)\n : ({ from: payTo } as const);\n const logs = await withRetries(\n () =>\n client.getLogs({\n address: asset,\n event: TRANSFER_EVENT_ABI[0],\n args,\n fromBlock: start,\n toBlock: end,\n }),\n maxRetries,\n 200,\n );\n for (const log of logs) {\n const blockNumber = log.blockNumber ?? null;\n if (!blockNumber) {\n continue;\n }\n const value = (log.args as { value?: bigint }).value ?? 0n;\n if (value <= 0n) {\n continue;\n }\n const day = await resolveBlockDay({\n client,\n blockNumber,\n cacheTtlMs: ttlMs,\n maxRetries,\n });\n const bucket = ensureBucket(day);\n if (direction === 'inbound') {\n bucket.inboundTrades += 1;\n } else {\n bucket.outboundTrades += 1;\n }\n const amount = Number.parseFloat(formatUnits(value, decimals));\n if (Number.isFinite(amount) && amount > 0) {\n bucket.volumeUsd = round6(bucket.volumeUsd + amount);\n }\n }\n start = end + 1n;\n }\n };\n\n await aggregateLogs('inbound');\n await aggregateLogs('outbound');\n\n const mergedDaily = keepRollingDays(Array.from(bucketsByDay.values()), days);\n const inboundTrades7d = mergedDaily.reduce(\n (sum, bucket) => sum + bucket.inboundTrades,\n 0,\n );\n const outboundTrades7d = mergedDaily.reduce(\n (sum, bucket) => sum + bucket.outboundTrades,\n 0,\n );\n const volume7dUsd = round6(\n mergedDaily.reduce((sum, bucket) => sum + bucket.volumeUsd, 0),\n );\n const today = toDayStringUtc(now);\n const volume24hUsd = round6(\n mergedDaily\n .filter(bucket => bucket.day === today)\n .reduce((sum, bucket) => sum + bucket.volumeUsd, 0),\n );\n\n const cursor: Hcs25X402UsageCursor = {\n network,\n asset: assetLower,\n payTo: payToLower,\n lastScannedBlock: Number(toBlock),\n daily: mergedDaily,\n };\n\n if (inboundTrades7d + outboundTrades7d <= 0) {\n return { summary: null, cursor };\n }\n\n return {\n summary: {\n volume7dUsd,\n volume24hUsd,\n inboundTrades7d,\n outboundTrades7d,\n },\n cursor,\n };\n}\n"],"names":["httpTransport"],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es134.js","sources":["../../src/hcs-25/collectors/x402.ts"],"sourcesContent":["import type { Hcs25JsonValue, Hcs25Subject } from '../types';\nimport { isJsonObject, readString } from '../signals';\nimport { parseTimestampMs } from './freshness';\nimport { Hcs25CollectorHttpError, isTimeoutError, requestJson } from './http';\nimport type {\n Hcs25CollectContext,\n Hcs25SignalAdapter,\n Hcs25SignalAdapterResult,\n} from './types';\nimport {\n fetchX402OnchainUsageState,\n type Hcs25X402OnchainUsageOptions,\n type Hcs25X402UsageStateParams,\n type Hcs25X402UsageStateResult,\n type Hcs25X402UsageSummary,\n} from './x402-onchain';\n\n/**\n * Pluggable usage-state fetcher (the on-chain scanner by default; inject a\n * stub in tests or a custom implementation for other networks).\n */\nexport type Hcs25X402UsageStateFetcher = (\n params: Hcs25X402UsageStateParams,\n options: Hcs25X402OnchainUsageOptions,\n) => Promise<Hcs25X402UsageStateResult>;\n\n/**\n * Options for the x402 usage signal adapter.\n */\nexport interface Hcs25X402SignalAdapterOptions\n extends Hcs25X402OnchainUsageOptions {\n /**\n * Usage source:\n * - `'onchain'` (default): scans ERC-20 `Transfer` events to/from\n * `metadata.payTo` on the `metadata.network` chain via viem.\n * - a URL template with `{payTo}`/`{asset}`/`{network}` placeholders, or a\n * function returning a URL: queries an HTTP usage indexer instead.\n */\n source?: 'onchain' | string | ((subject: Hcs25Subject) => string | null);\n /**\n * Fully custom usage-state source (e.g. a hosted scanner or a test stub).\n * Overrides `source` when provided.\n */\n fetchUsageState?: Hcs25X402UsageStateFetcher;\n /**\n * Refresh interval applied when the stored `x402UsageStatus` is `ok`.\n * Default 6 hours. The scan is skipped (and the stored summary echoed)\n * while fresh.\n */\n ttlMs?: number;\n /**\n * Refresh interval applied after non-`ok` states. Default 3 hours.\n */\n failureTtlMs?: number;\n /** Per-adapter timeout in milliseconds. */\n timeoutMs?: number;\n appliesTo?: (subject: Hcs25Subject) => boolean;\n}\n\ninterface X402IndexerResponse {\n volume7dUsd?: number;\n volume24hUsd?: number;\n inboundTrades7d?: number;\n outboundTrades7d?: number;\n cursor?: Hcs25JsonValue;\n summary?: {\n volume7dUsd?: number;\n volume24hUsd?: number;\n inboundTrades7d?: number;\n outboundTrades7d?: number;\n };\n}\n\nconst summaryValues = (\n summary: Partial<Hcs25X402UsageSummary> | null,\n): Record<string, Hcs25JsonValue> => ({\n x402UsageSummary: summary\n ? {\n volume7dUsd: summary.volume7dUsd ?? 0,\n volume24hUsd: summary.volume24hUsd ?? 0,\n inboundTrades7d: summary.inboundTrades7d ?? 0,\n outboundTrades7d: summary.outboundTrades7d ?? 0,\n }\n : null,\n});\n\nfunction hasProtocol(subject: Hcs25Subject, wanted: string): boolean {\n const normalized = wanted.toLowerCase();\n const direct = subject.protocol?.toLowerCase();\n if (direct === normalized) {\n return true;\n }\n const metadataProtocol =\n typeof subject.metadata?.protocol === 'string'\n ? subject.metadata.protocol.toLowerCase()\n : null;\n if (metadataProtocol === normalized) {\n return true;\n }\n const list = (subject as { protocols?: unknown }).protocols;\n return (\n Array.isArray(list) &&\n list.some(\n entry => typeof entry === 'string' && entry.toLowerCase() === normalized,\n )\n );\n}\n\nfunction hasX402Config(subject: Hcs25Subject): boolean {\n const metadata = subject.metadata ?? {};\n const configured =\n readString(metadata, 'payTo') !== null &&\n readString(metadata, 'asset') !== null &&\n readString(metadata, 'network') !== null;\n return configured || hasProtocol(subject, 'x402');\n}\n\nfunction readCursor(subject: Hcs25Subject): Hcs25JsonValue | undefined {\n const raw = subject.metadata?.x402UsageCursor;\n return raw === undefined ? undefined : raw;\n}\n\n/**\n * Creates the `x402` signal adapter: scans on-chain x402 payment activity\n * (USD volume + trade counts, chunked `Transfer` log scans resumable via\n * `x402UsageCursor`) or queries a configured HTTP usage indexer, and stores\n * the `x402Usage*` fields per the signal catalog. Fresh `ok` refreshes are\n * skipped per `ttlMs`/`failureTtlMs` unless `context.force` is set.\n */\nexport function createX402SignalAdapter(\n options: Hcs25X402SignalAdapterOptions = {},\n): Hcs25SignalAdapter {\n const source = options.source ?? 'onchain';\n const ttlMs = options.ttlMs ?? 6 * 60 * 60 * 1000;\n const failureTtlMs = options.failureTtlMs ?? 3 * 60 * 60 * 1000;\n\n const fetchUsage: Hcs25X402UsageStateFetcher =\n options.fetchUsageState ?? fetchX402OnchainUsageState;\n const isHttpSource = typeof source === 'string' && source !== 'onchain';\n const isUrlFn = typeof source === 'function';\n\n const collect = async (\n subject: Hcs25Subject,\n context: Hcs25CollectContext,\n ): Promise<Hcs25SignalAdapterResult[]> => {\n const now = context.now.toISOString();\n const metadata = subject.metadata ?? {};\n const payTo = readString(metadata, 'payTo');\n const asset = readString(metadata, 'asset');\n const network = readString(metadata, 'network');\n const cursor = readCursor(subject);\n\n // Freshness gate: skip the scan while stored fields are still fresh and\n // echo the stored summary so provenance keeps the original fetchedAt.\n if (!context.force) {\n const storedStatus = readString(metadata, 'x402UsageStatus');\n const storedUpdatedMs = parseTimestampMs(metadata.x402UsageUpdatedAt);\n if (storedStatus && storedUpdatedMs !== null) {\n const ttl = storedStatus === 'ok' ? ttlMs : failureTtlMs;\n if (context.now.getTime() - storedUpdatedMs < ttl) {\n const storedSummary = isJsonObject(metadata.x402UsageSummary)\n ? (metadata.x402UsageSummary as Record<string, Hcs25JsonValue>)\n : null;\n return [\n {\n signalId: 'x402.usage',\n status: storedStatus === 'ok' ? 'ok' : 'missing',\n value:\n storedSummary && typeof storedSummary.volume7dUsd === 'number'\n ? storedSummary.volume7dUsd\n : null,\n provenance: {\n source: 'x402',\n subjectId: payTo ?? subject.id,\n fetchedAt: metadata.x402UsageUpdatedAt as string,\n },\n },\n ];\n }\n }\n }\n\n if (!options.fetchUsageState && (isHttpSource || isUrlFn)) {\n const resolved = isUrlFn\n ? (source as (s: Hcs25Subject) => string | null)(subject)\n : (source as string)\n .replace('{payTo}', encodeURIComponent(payTo ?? ''))\n .replace('{asset}', encodeURIComponent(asset ?? ''))\n .replace('{network}', encodeURIComponent(network ?? ''));\n const url = typeof resolved === 'string' ? resolved : null;\n\n if (!url) {\n return [{ signalId: 'x402.usage', status: 'missing' }];\n }\n const urlWithCursor =\n cursor && isJsonObject(cursor) && typeof cursor.cursor === 'string'\n ? `${url}${url.includes('?') ? '&' : '?'}cursor=${encodeURIComponent(cursor.cursor)}`\n : url;\n try {\n const data = await requestJson<X402IndexerResponse>(urlWithCursor, {\n fetch: context.fetch,\n timeoutMs: context.timeoutMs,\n signal: context.signal,\n });\n const summary = data.summary ?? data;\n const values: Record<string, Hcs25JsonValue> = {\n x402UsageStatus: 'ok',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'indexer',\n ...summaryValues(summary),\n };\n const nextCursor = data.cursor ?? cursor;\n if (nextCursor !== undefined) {\n values.x402UsageCursor = nextCursor;\n }\n return [\n {\n signalId: 'x402.usage',\n status: 'ok',\n value: summary.volume7dUsd ?? null,\n fields: [{ scope: 'root', values }],\n provenance: {\n source: 'x402',\n sourceUrl: url,\n subjectId: payTo ?? subject.id,\n fetchedAt: now,\n },\n },\n ];\n } catch (error) {\n const missing =\n error instanceof Hcs25CollectorHttpError && error.status === 404;\n const status = missing\n ? 'missing'\n : isTimeoutError(error)\n ? 'timeout'\n : 'error';\n return [\n {\n signalId: 'x402.usage',\n status,\n fields: [\n {\n scope: 'root',\n values: {\n x402UsageStatus: missing ? 'missing' : 'error',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'indexer',\n },\n },\n ],\n },\n ];\n }\n }\n\n // On-chain scan (default, matching the production implementation).\n if (!payTo || !asset || !network) {\n return [\n {\n signalId: 'x402.usage',\n status: 'missing',\n fields: [\n {\n scope: 'root',\n values: {\n x402UsageStatus: 'missing',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'onchain',\n x402UsageSummary: null,\n },\n },\n ],\n },\n ];\n }\n\n try {\n const { summary, cursor: nextCursor } = await fetchUsage(\n { network, asset, payTo, cursor },\n {\n days: options.days,\n ttlMs: options.ttlMs,\n maxRetries: options.maxRetries,\n chunkSizeBlocks: options.chunkSizeBlocks,\n rpcUrls: options.rpcUrls,\n },\n );\n const values: Record<string, Hcs25JsonValue> = {\n x402UsageStatus: summary ? 'ok' : 'missing',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'onchain',\n ...summaryValues(summary),\n };\n if (nextCursor !== null) {\n values.x402UsageCursor = nextCursor as unknown as Hcs25JsonValue;\n } else if (cursor !== undefined) {\n values.x402UsageCursor = cursor;\n }\n return [\n {\n signalId: 'x402.usage',\n status: summary ? 'ok' : 'missing',\n value: summary?.volume7dUsd ?? null,\n fields: [{ scope: 'root', values }],\n provenance: {\n source: 'x402',\n subjectId: payTo,\n fetchedAt: now,\n params: { network, asset, source: 'onchain' },\n },\n },\n ];\n } catch (error) {\n return [\n {\n signalId: 'x402.usage',\n status: isTimeoutError(error) ? 'timeout' : 'error',\n fields: [\n {\n scope: 'root',\n values: {\n x402UsageStatus: 'error',\n x402UsageUpdatedAt: now,\n x402UsageSource: 'onchain',\n x402UsageSummary: null,\n ...(cursor !== undefined ? { x402UsageCursor: cursor } : {}),\n },\n },\n ],\n },\n ];\n }\n };\n\n return {\n id: 'x402',\n produces: ['x402.usage'],\n timeoutMs: options.timeoutMs,\n // On-chain scans need network+asset+payTo; HTTP/custom sources only\n // need a payTo (or the x402 protocol marker) to query.\n appliesTo:\n options.appliesTo ??\n ((subject: Hcs25Subject): boolean => {\n if (hasX402Config(subject)) {\n return true;\n }\n if (\n !isHttpSource &&\n !isUrlFn &&\n options.fetchUsageState === undefined\n ) {\n return false;\n }\n return readString(subject.metadata ?? {}, 'payTo') !== null;\n }),\n collect,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1,124 +1,382 @@
1
- import { readString } from "./standards-sdk.es198.js";
2
- import "./standards-sdk.es182.js";
3
- import "./standards-sdk.es195.js";
4
- import "./standards-sdk.es196.js";
5
- import "./standards-sdk.es197.js";
6
- import { requestJson, Hcs25CollectorHttpError, isTimeoutError } from "./standards-sdk.es122.js";
7
- const DEFAULT_INCLUDED_REGISTRIES = ["virtuals-protocol"];
8
- const METRIC_KEYS = [
9
- "successRate",
10
- "successfulJobCount",
11
- "totalJobCount",
12
- "volume",
13
- "revenue",
14
- "rating"
1
+ import { getAddress, http, createPublicClient, fallback, formatUnits } from "viem";
2
+ import { baseSepolia, base } from "viem/chains";
3
+ const TRANSFER_EVENT_ABI = [
4
+ {
5
+ type: "event",
6
+ name: "Transfer",
7
+ inputs: [
8
+ { indexed: true, name: "from", type: "address" },
9
+ { indexed: true, name: "to", type: "address" },
10
+ { indexed: false, name: "value", type: "uint256" }
11
+ ],
12
+ anonymous: false
13
+ }
14
+ ];
15
+ const DECIMALS_ABI = [
16
+ {
17
+ type: "function",
18
+ name: "decimals",
19
+ inputs: [],
20
+ outputs: [{ name: "", type: "uint8" }],
21
+ stateMutability: "view"
22
+ }
15
23
  ];
16
- function pickMetrics(record) {
17
- if (typeof record !== "object" || record === null) {
24
+ const NETWORK_CONFIG = {
25
+ base: {
26
+ chain: base,
27
+ rpcUrls: [
28
+ "https://mainnet.base.org",
29
+ "https://1rpc.io/base",
30
+ "https://base.llamarpc.com",
31
+ "https://base-rpc.publicnode.com"
32
+ ],
33
+ usdcAddresses: /* @__PURE__ */ new Set(["0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"])
34
+ },
35
+ "base-sepolia": {
36
+ chain: baseSepolia,
37
+ rpcUrls: [
38
+ "https://sepolia.base.org",
39
+ "https://1rpc.io/base-sepolia",
40
+ "https://base-sepolia-rpc.publicnode.com"
41
+ ],
42
+ usdcAddresses: /* @__PURE__ */ new Set(["0x036cbd53842c5426634e7929541ec2318f3dcf7e"])
43
+ }
44
+ };
45
+ const toNetwork = (value) => {
46
+ if (typeof value !== "string") {
18
47
  return null;
19
48
  }
20
- const source = record;
21
- const metrics = {};
22
- let found = false;
23
- for (const key of METRIC_KEYS) {
24
- const value = source[key];
25
- if (typeof value === "number" && Number.isFinite(value)) {
26
- metrics[key] = value;
27
- found = true;
49
+ const normalized = value.trim().toLowerCase();
50
+ if (normalized === "base") {
51
+ return "base";
52
+ }
53
+ if (normalized === "base-sepolia" || normalized === "basesepolia") {
54
+ return "base-sepolia";
55
+ }
56
+ return null;
57
+ };
58
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
59
+ const round6 = (value) => Math.round(value * 1e6) / 1e6;
60
+ const toDayStringUtc = (timestampMs) => {
61
+ const date = new Date(timestampMs);
62
+ return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, "0")}-${String(
63
+ date.getUTCDate()
64
+ ).padStart(2, "0")}`;
65
+ };
66
+ const decimalsCache = /* @__PURE__ */ new Map();
67
+ const fromBlockCache = /* @__PURE__ */ new Map();
68
+ const blockDayCache = /* @__PURE__ */ new Map();
69
+ async function withRetries(operation, maxRetries, baseDelayMs) {
70
+ let lastError;
71
+ for (let attempt = 0; attempt <= maxRetries; attempt += 1) {
72
+ try {
73
+ return await operation();
74
+ } catch (error) {
75
+ lastError = error;
76
+ if (attempt >= maxRetries) {
77
+ throw error;
78
+ }
79
+ await sleep(baseDelayMs * 2 ** attempt);
28
80
  }
29
81
  }
30
- return found ? metrics : null;
82
+ throw lastError;
31
83
  }
32
- function defaultMapResponse(data) {
33
- if (typeof data !== "object" || data === null) {
84
+ const keepRollingDays = (buckets, keepDays) => {
85
+ const keep = /* @__PURE__ */ new Set();
86
+ const today = toDayStringUtc(Date.now());
87
+ const [year, month, day] = today.split("-").map((v) => Number.parseInt(v, 10));
88
+ const baseUtc = Date.UTC(year, month - 1, day);
89
+ for (let offset = 0; offset < keepDays; offset += 1) {
90
+ keep.add(toDayStringUtc(baseUtc - offset * 24 * 60 * 60 * 1e3));
91
+ }
92
+ return buckets.filter((bucket) => keep.has(bucket.day)).sort((a, b) => a.day < b.day ? -1 : a.day > b.day ? 1 : 0).slice(-keepDays);
93
+ };
94
+ function parseCursor(value) {
95
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
96
+ return null;
97
+ }
98
+ const cursor = value;
99
+ if (typeof cursor.asset !== "string" || typeof cursor.payTo !== "string" || typeof cursor.lastScannedBlock !== "number" || !Number.isFinite(cursor.lastScannedBlock) || cursor.lastScannedBlock < 0 || !Array.isArray(cursor.daily)) {
100
+ return null;
101
+ }
102
+ const network = toNetwork(cursor.network);
103
+ if (!network) {
34
104
  return null;
35
105
  }
36
- const root = data;
37
- return pickMetrics(root.metrics) ?? pickMetrics(root.agent) ?? pickMetrics(root);
106
+ const daily = cursor.daily.filter(
107
+ (entry) => !!entry && typeof entry === "object" && typeof entry.day === "string" && typeof entry.inboundTrades === "number" && Number.isFinite(entry.inboundTrades) && typeof entry.outboundTrades === "number" && Number.isFinite(entry.outboundTrades) && typeof entry.volumeUsd === "number" && Number.isFinite(entry.volumeUsd)
108
+ ).map((entry) => ({
109
+ day: entry.day,
110
+ inboundTrades: Math.max(0, Math.floor(entry.inboundTrades)),
111
+ outboundTrades: Math.max(0, Math.floor(entry.outboundTrades)),
112
+ volumeUsd: round6(Math.max(0, entry.volumeUsd))
113
+ }));
114
+ return {
115
+ network,
116
+ asset: cursor.asset,
117
+ payTo: cursor.payTo,
118
+ lastScannedBlock: Math.floor(cursor.lastScannedBlock),
119
+ daily
120
+ };
121
+ }
122
+ async function resolveDecimals(params) {
123
+ if (params.isUsdc) {
124
+ return 6;
125
+ }
126
+ const cacheKey = `${params.client.chain?.id ?? "unknown"}:${params.asset}:decimals`;
127
+ const cached = decimalsCache.get(cacheKey);
128
+ if (cached && cached.expiresAt > Date.now()) {
129
+ return cached.value;
130
+ }
131
+ const decimals = await withRetries(
132
+ async () => {
133
+ const value = await params.client.readContract({
134
+ address: params.asset,
135
+ abi: DECIMALS_ABI,
136
+ functionName: "decimals"
137
+ });
138
+ return Number(value);
139
+ },
140
+ params.maxRetries,
141
+ 200
142
+ );
143
+ const normalized = Number.isFinite(decimals) ? Math.max(0, Math.min(255, Math.floor(decimals))) : 18;
144
+ decimalsCache.set(cacheKey, {
145
+ value: normalized,
146
+ expiresAt: Date.now() + params.cacheTtlMs
147
+ });
148
+ return normalized;
38
149
  }
39
- function resolveAgentAddress(subject) {
40
- const metadata = subject.metadata ?? {};
41
- for (const key of ["nativeId", "address", "uid"]) {
42
- const value = readString(metadata, key);
43
- if (value) {
44
- return value;
150
+ async function estimateFromBlockByTimestamp(params) {
151
+ const cached = fromBlockCache.get(params.cacheKey);
152
+ if (cached && cached.expiresAt > Date.now()) {
153
+ return cached.value;
154
+ }
155
+ const latestBlockNumber = await withRetries(
156
+ () => params.client.getBlockNumber(),
157
+ params.maxRetries,
158
+ 200
159
+ );
160
+ const latest = await withRetries(
161
+ () => params.client.getBlock({ blockNumber: latestBlockNumber }),
162
+ params.maxRetries,
163
+ 200
164
+ );
165
+ const probeDelta = 5000n;
166
+ const probeBlockNumber = latestBlockNumber > probeDelta ? latestBlockNumber - probeDelta : 0n;
167
+ const probe = await withRetries(
168
+ () => params.client.getBlock({ blockNumber: probeBlockNumber }),
169
+ params.maxRetries,
170
+ 200
171
+ );
172
+ const latestTs = BigInt(latest.timestamp);
173
+ const probeTs = BigInt(probe.timestamp);
174
+ const deltaSeconds = latestTs > probeTs ? latestTs - probeTs : 0n;
175
+ const secondsPerBlock = deltaSeconds > 0n ? Number(deltaSeconds) / Number(latestBlockNumber - probeBlockNumber || 1n) : 2;
176
+ const secondsAgo = latestTs > params.targetTimestampSec ? latestTs - params.targetTimestampSec : 0n;
177
+ const approxBlocksAgo = secondsPerBlock > 0 ? BigInt(Math.ceil(Number(secondsAgo) / secondsPerBlock)) : 0n;
178
+ const margin = 1000n;
179
+ let low = latestBlockNumber > approxBlocksAgo + margin ? latestBlockNumber - approxBlocksAgo - margin : 0n;
180
+ let high = latestBlockNumber;
181
+ while (low < high) {
182
+ const mid = (low + high) / 2n;
183
+ const block = await withRetries(
184
+ () => params.client.getBlock({ blockNumber: mid }),
185
+ params.maxRetries,
186
+ 200
187
+ );
188
+ if (BigInt(block.timestamp) >= params.targetTimestampSec) {
189
+ high = mid;
190
+ } else {
191
+ low = mid + 1n;
45
192
  }
46
193
  }
47
- return null;
194
+ fromBlockCache.set(params.cacheKey, {
195
+ value: low,
196
+ expiresAt: Date.now() + params.cacheTtlMs
197
+ });
198
+ return low;
199
+ }
200
+ async function resolveBlockDay(params) {
201
+ const cacheKey = `${params.client.chain?.id ?? "unknown"}:${params.blockNumber.toString()}:day`;
202
+ const cached = blockDayCache.get(cacheKey);
203
+ if (cached && cached.expiresAt > Date.now()) {
204
+ return cached.value;
205
+ }
206
+ const block = await withRetries(
207
+ () => params.client.getBlock({ blockNumber: params.blockNumber }),
208
+ params.maxRetries,
209
+ 200
210
+ );
211
+ const day = toDayStringUtc(Number(block.timestamp) * 1e3);
212
+ blockDayCache.set(cacheKey, {
213
+ value: day,
214
+ expiresAt: Date.now() + params.cacheTtlMs
215
+ });
216
+ return day;
48
217
  }
49
- function createAcpSignalAdapter(options) {
50
- const mapResponse = options.mapResponse ?? defaultMapResponse;
51
- const collect = async (subject, context) => {
52
- const now = context.now.toISOString();
53
- const address = resolveAgentAddress(subject) ?? subject.id;
54
- const url = typeof options.endpoint === "function" ? options.endpoint(subject) : options.endpoint.replace("{address}", encodeURIComponent(address)).replace("{nativeId}", encodeURIComponent(address));
55
- if (!url) {
56
- return [{ signalId: "acp.metrics", status: "missing" }];
218
+ async function fetchX402OnchainUsageState(params, options = {}) {
219
+ const network = toNetwork(params.network);
220
+ if (!network) {
221
+ return { summary: null, cursor: null };
222
+ }
223
+ const config = NETWORK_CONFIG[network];
224
+ if (typeof params.asset !== "string" || typeof params.payTo !== "string") {
225
+ return { summary: null, cursor: null };
226
+ }
227
+ let asset;
228
+ let payTo;
229
+ try {
230
+ asset = getAddress(params.asset.trim());
231
+ payTo = getAddress(params.payTo.trim());
232
+ } catch {
233
+ return { summary: null, cursor: null };
234
+ }
235
+ const now = Date.now();
236
+ const ttlMs = typeof options.ttlMs === "number" && Number.isFinite(options.ttlMs) && options.ttlMs > 0 ? options.ttlMs : 30 * 60 * 1e3;
237
+ const maxRetries = typeof options.maxRetries === "number" && Number.isFinite(options.maxRetries) && options.maxRetries >= 0 ? Math.floor(options.maxRetries) : 2;
238
+ const chunkSizeBlocks = typeof options.chunkSizeBlocks === "number" && Number.isFinite(options.chunkSizeBlocks) && options.chunkSizeBlocks > 0 ? BigInt(Math.floor(options.chunkSizeBlocks)) : 50000n;
239
+ const rpcUrls = options.rpcUrls?.[network]?.length ? [...options.rpcUrls[network]] : config.rpcUrls;
240
+ const transports = rpcUrls.map((url) => http(url));
241
+ if (transports.length === 0) {
242
+ return { summary: null, cursor: null };
243
+ }
244
+ const client = createPublicClient({
245
+ chain: config.chain,
246
+ transport: transports.length > 1 ? fallback(transports) : transports[0]
247
+ });
248
+ const assetLower = asset.toLowerCase();
249
+ const payToLower = payTo.toLowerCase();
250
+ const decimals = await resolveDecimals({
251
+ client,
252
+ asset,
253
+ isUsdc: config.usdcAddresses.has(assetLower),
254
+ cacheTtlMs: ttlMs,
255
+ maxRetries
256
+ });
257
+ const days = typeof options.days === "number" && Number.isFinite(options.days) && options.days > 0 ? Math.min(14, Math.max(1, Math.floor(options.days))) : 7;
258
+ const targetTimestampSec = BigInt(
259
+ Math.floor((now - days * 24 * 60 * 60 * 1e3) / 1e3)
260
+ );
261
+ const windowFromBlock = await estimateFromBlockByTimestamp({
262
+ client,
263
+ targetTimestampSec,
264
+ cacheKey: `${network}:${assetLower}:${payToLower}:fromBlock:${days}`,
265
+ cacheTtlMs: ttlMs,
266
+ maxRetries
267
+ });
268
+ const toBlock = await client.getBlockNumber();
269
+ const parsedCursor = parseCursor(params.cursor);
270
+ const hasMatchingCursor = parsedCursor !== null && parsedCursor.network === network && parsedCursor.asset.toLowerCase() === assetLower && parsedCursor.payTo.toLowerCase() === payToLower;
271
+ const cursorFromBlock = hasMatchingCursor && parsedCursor ? BigInt(Math.max(0, parsedCursor.lastScannedBlock + 1)) : windowFromBlock;
272
+ const fromBlock = cursorFromBlock < windowFromBlock ? windowFromBlock : cursorFromBlock;
273
+ const shouldResync = !hasMatchingCursor || cursorFromBlock < windowFromBlock;
274
+ const bucketsByDay = /* @__PURE__ */ new Map();
275
+ if (!shouldResync && parsedCursor) {
276
+ for (const bucket of keepRollingDays(parsedCursor.daily, days)) {
277
+ bucketsByDay.set(bucket.day, { ...bucket });
57
278
  }
58
- try {
59
- const data = await requestJson(url, {
60
- fetch: context.fetch,
61
- timeoutMs: context.timeoutMs,
62
- signal: context.signal
63
- });
64
- const metrics = mapResponse(data);
65
- if (!metrics) {
66
- return [{ signalId: "acp.metrics", status: "missing" }];
67
- }
68
- const metricsValues = {};
69
- for (const key of METRIC_KEYS) {
70
- const value = metrics[key];
71
- if (value !== void 0) {
72
- metricsValues[key] = value;
279
+ }
280
+ const ensureBucket = (day) => {
281
+ const existing = bucketsByDay.get(day);
282
+ if (existing) {
283
+ return existing;
284
+ }
285
+ const created = {
286
+ day,
287
+ inboundTrades: 0,
288
+ outboundTrades: 0,
289
+ volumeUsd: 0
290
+ };
291
+ bucketsByDay.set(day, created);
292
+ return created;
293
+ };
294
+ const aggregateLogs = async (direction) => {
295
+ if (toBlock < fromBlock) {
296
+ return;
297
+ }
298
+ for (let start = fromBlock; start <= toBlock; ) {
299
+ const end = start + chunkSizeBlocks - 1n <= toBlock ? start + chunkSizeBlocks - 1n : toBlock;
300
+ const args = direction === "inbound" ? { to: payTo } : { from: payTo };
301
+ const logs = await withRetries(
302
+ () => client.getLogs({
303
+ address: asset,
304
+ event: TRANSFER_EVENT_ABI[0],
305
+ args,
306
+ fromBlock: start,
307
+ toBlock: end
308
+ }),
309
+ maxRetries,
310
+ 200
311
+ );
312
+ for (const log of logs) {
313
+ const blockNumber = log.blockNumber ?? null;
314
+ if (!blockNumber) {
315
+ continue;
73
316
  }
74
- }
75
- const rootValues = {};
76
- if (metrics.successRate !== void 0) {
77
- rootValues.successRate = metrics.successRate;
78
- }
79
- if (metrics.successfulJobCount !== void 0) {
80
- rootValues.successfulJobCount = metrics.successfulJobCount;
81
- }
82
- return [
83
- {
84
- signalId: "acp.metrics",
85
- status: "ok",
86
- value: metrics.successRate ?? null,
87
- fields: [
88
- { scope: "metrics", values: metricsValues },
89
- { scope: "root", values: rootValues }
90
- ],
91
- provenance: {
92
- source: "acp",
93
- sourceUrl: url,
94
- subjectId: address,
95
- fetchedAt: now
96
- }
317
+ const value = log.args.value ?? 0n;
318
+ if (value <= 0n) {
319
+ continue;
97
320
  }
98
- ];
99
- } catch (error) {
100
- if (error instanceof Hcs25CollectorHttpError && error.status === 404) {
101
- return [{ signalId: "acp.metrics", status: "missing" }];
102
- }
103
- return [
104
- {
105
- signalId: "acp.metrics",
106
- status: isTimeoutError(error) ? "timeout" : "error"
321
+ const day = await resolveBlockDay({
322
+ client,
323
+ blockNumber,
324
+ cacheTtlMs: ttlMs,
325
+ maxRetries
326
+ });
327
+ const bucket = ensureBucket(day);
328
+ if (direction === "inbound") {
329
+ bucket.inboundTrades += 1;
330
+ } else {
331
+ bucket.outboundTrades += 1;
332
+ }
333
+ const amount = Number.parseFloat(formatUnits(value, decimals));
334
+ if (Number.isFinite(amount) && amount > 0) {
335
+ bucket.volumeUsd = round6(bucket.volumeUsd + amount);
107
336
  }
108
- ];
337
+ }
338
+ start = end + 1n;
109
339
  }
110
340
  };
341
+ await aggregateLogs("inbound");
342
+ await aggregateLogs("outbound");
343
+ const mergedDaily = keepRollingDays(Array.from(bucketsByDay.values()), days);
344
+ const inboundTrades7d = mergedDaily.reduce(
345
+ (sum, bucket) => sum + bucket.inboundTrades,
346
+ 0
347
+ );
348
+ const outboundTrades7d = mergedDaily.reduce(
349
+ (sum, bucket) => sum + bucket.outboundTrades,
350
+ 0
351
+ );
352
+ const volume7dUsd = round6(
353
+ mergedDaily.reduce((sum, bucket) => sum + bucket.volumeUsd, 0)
354
+ );
355
+ const today = toDayStringUtc(now);
356
+ const volume24hUsd = round6(
357
+ mergedDaily.filter((bucket) => bucket.day === today).reduce((sum, bucket) => sum + bucket.volumeUsd, 0)
358
+ );
359
+ const cursor = {
360
+ network,
361
+ asset: assetLower,
362
+ payTo: payToLower,
363
+ lastScannedBlock: Number(toBlock),
364
+ daily: mergedDaily
365
+ };
366
+ if (inboundTrades7d + outboundTrades7d <= 0) {
367
+ return { summary: null, cursor };
368
+ }
111
369
  return {
112
- id: "acp",
113
- produces: ["acp.metrics"],
114
- timeoutMs: options.timeoutMs,
115
- includeRegistries: options.includeRegistries ?? DEFAULT_INCLUDED_REGISTRIES,
116
- excludeRegistries: options.excludeRegistries,
117
- appliesTo: options.appliesTo,
118
- collect
370
+ summary: {
371
+ volume7dUsd,
372
+ volume24hUsd,
373
+ inboundTrades7d,
374
+ outboundTrades7d
375
+ },
376
+ cursor
119
377
  };
120
378
  }
121
379
  export {
122
- createAcpSignalAdapter
380
+ fetchX402OnchainUsageState
123
381
  };
124
382
  //# sourceMappingURL=standards-sdk.es135.js.map