tapimo 0.15.1 → 0.18.1

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 (709) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +893 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +70 -70
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +529 -76
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
@@ -0,0 +1,306 @@
1
+ import { Hex } from 'ox'
2
+ import { encodeAbiParameters, keccak256, parseAbiParameters, stringToHex } from 'viem'
3
+ import { describe, expect, test } from 'vitest'
4
+
5
+ import * as LegacyMeshDelivery from './legacyMeshDelivery.js'
6
+
7
+ const amount = 1_000_000n
8
+ const composer = '0x759BA420bF1ded1765F18C2DC3Fc57A1964A2Ad1'
9
+ const destinationOft = '0xaf37E8B6C9ED7f6318979f56Fc287d76c30847ff'
10
+ const endpoint = '0x1a44076050125825900e736c501f859c50fE728c'
11
+ const hubAdapter = '0x77652d5aba086137b595875263fc200182919b92'
12
+ const hubOft = '0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92'
13
+ const guid = `0x${'11'.repeat(32)}` as const
14
+ const onwardGuid = `0x${'22'.repeat(32)}` as const
15
+ const otherGuid = `0x${'33'.repeat(32)}` as const
16
+ const recipient = `0x${'44'.repeat(20)}` as const
17
+ const otherRecipient = `0x${'55'.repeat(20)}` as const
18
+
19
+ describe('verifyComposerOutcome', () => {
20
+ test.each(['SendFailed', 'DecodeFailed'] as const)(
21
+ 'requires operator recovery after %s',
22
+ (terminal) => {
23
+ expect(outcome(fixture.logs({ terminal }).slice(2))).toMatchInlineSnapshot(`
24
+ {
25
+ "statusReason": {
26
+ "code": "manual_recovery_required",
27
+ "message": "The Arbitrum composer failed to forward the transfer. Operator recovery is required.",
28
+ },
29
+ "type": "action-required",
30
+ }
31
+ `)
32
+ },
33
+ )
34
+
35
+ test('requires Tron repayment verification after an adapter refund', () => {
36
+ expect(outcome(fixture.logs({ oft: hubAdapter, terminal: 'Refunded' }).slice(2)))
37
+ .toMatchInlineSnapshot(`
38
+ {
39
+ "statusReason": {
40
+ "code": "manual_recovery_required",
41
+ "message": "The Arbitrum composer initiated a refund. Operator verification of Tron repayment is required.",
42
+ },
43
+ "type": "action-required",
44
+ }
45
+ `)
46
+ })
47
+
48
+ test.each(['SendFailed', 'DecodeFailed', 'Refunded'] as const)(
49
+ 'rejects forged %s emitters',
50
+ (terminal) => {
51
+ const logs = fixture
52
+ .logs({
53
+ oft: terminal === 'Refunded' ? hubAdapter : hubOft,
54
+ terminal,
55
+ })
56
+ .slice(2)
57
+ logs[0] = { ...logs[0]!, address: otherRecipient }
58
+ expect(outcome(logs)).toMatchInlineSnapshot(`
59
+ {
60
+ "type": "invalid",
61
+ }
62
+ `)
63
+ },
64
+ )
65
+
66
+ test.each(['SendFailed', 'DecodeFailed', 'Refunded'] as const)(
67
+ 'rejects %s for a different GUID or OFT',
68
+ (terminal) => {
69
+ for (const options of [
70
+ { oft: terminal === 'Refunded' ? hubOft : hubAdapter },
71
+ { oft: terminal === 'Refunded' ? hubAdapter : hubOft, sourceGuid: otherGuid },
72
+ ] as const)
73
+ expect(outcome(fixture.logs({ ...options, terminal }).slice(2))).toMatchInlineSnapshot(`
74
+ {
75
+ "type": "invalid",
76
+ }
77
+ `)
78
+ },
79
+ )
80
+
81
+ test('uses the successful retry after an earlier failed composition', () => {
82
+ const failed = fixture.logs({ terminal: 'SendFailed' }).slice(2)
83
+ const retried = fixture.logs({ offset: 3, terminal: 'Retried' })
84
+ expect(outcome([...failed, ...retried])).toMatchInlineSnapshot(`
85
+ {
86
+ "guid": "0x2222222222222222222222222222222222222222222222222222222222222222",
87
+ "type": "found",
88
+ }
89
+ `)
90
+ })
91
+
92
+ test('uses the later refund outcome even when input logs are unordered', () => {
93
+ const failed = fixture.logs({ terminal: 'SendFailed' }).slice(2)
94
+ const refund = fixture.logs({ offset: 3, oft: hubAdapter, terminal: 'Refunded' }).slice(2)
95
+ expect(outcome([...refund, ...failed])).toMatchInlineSnapshot(`
96
+ {
97
+ "statusReason": {
98
+ "code": "manual_recovery_required",
99
+ "message": "The Arbitrum composer initiated a refund. Operator verification of Tron repayment is required.",
100
+ },
101
+ "type": "action-required",
102
+ }
103
+ `)
104
+ })
105
+ })
106
+
107
+ function outcome(logs: LegacyMeshDelivery.verifyForwarding.Options['logs']) {
108
+ return LegacyMeshDelivery.verifyComposerOutcome({ amount, guid, logs, recipient })
109
+ }
110
+
111
+ describe('verifyForwarding', () => {
112
+ test('correlates the source GUID with its distinct onward GUID', () => {
113
+ expect(verify(fixture.logs())).toMatchInlineSnapshot(`
114
+ {
115
+ "guid": "0x2222222222222222222222222222222222222222222222222222222222222222",
116
+ "type": "found",
117
+ }
118
+ `)
119
+ })
120
+
121
+ test('recognizes successful retries', () => {
122
+ expect(verify(fixture.logs({ terminal: 'Retried' })).type).toMatchInlineSnapshot('"found"')
123
+ })
124
+
125
+ test.each(['SendFailed', 'Refunded', 'DecodeFailed'] as const)(
126
+ 'does not mistake %s for onward delivery',
127
+ (terminal) => {
128
+ expect(verify(fixture.logs({ terminal }))).toMatchInlineSnapshot(`
129
+ {
130
+ "type": "invalid",
131
+ }
132
+ `)
133
+ },
134
+ )
135
+
136
+ test.each([
137
+ ['packet GUID', { packetGuid: otherGuid }],
138
+ ['recipient', { recipient: otherRecipient }],
139
+ ['destination peer', { receiver: otherRecipient }],
140
+ ['amount', { amount: amount + 1n }],
141
+ ] as const)('rejects a different %s in the packet', (_, options) => {
142
+ expect(verify(fixture.logs(options))).toMatchInlineSnapshot(`
143
+ {
144
+ "type": "invalid",
145
+ }
146
+ `)
147
+ })
148
+
149
+ test('rejects truncated or composed packets', () => {
150
+ for (const packet of [
151
+ Hex.slice(fixture.packet(), 0, 121),
152
+ Hex.concat(fixture.packet(), '0x00'),
153
+ ])
154
+ expect(verify(fixture.logs({ packet })).type).toMatchInlineSnapshot('"invalid"')
155
+ })
156
+
157
+ test('rejects an OFTSent event with a different amount', () => {
158
+ const logs = fixture.logs()
159
+ logs[1] = {
160
+ ...logs[1]!,
161
+ data: encodeAbiParameters(parseAbiParameters('uint32,uint256,uint256'), [
162
+ 30410,
163
+ amount,
164
+ amount - 1n,
165
+ ]),
166
+ }
167
+ expect(verify(logs).type).toMatchInlineSnapshot('"invalid"')
168
+ })
169
+
170
+ test('rejects forged OFT and endpoint emitters', () => {
171
+ for (const index of [0, 1]) {
172
+ const logs = fixture.logs()
173
+ logs[index] = { ...logs[index]!, address: otherRecipient }
174
+ expect(verify(logs).type).toMatchInlineSnapshot('"invalid"')
175
+ }
176
+ })
177
+
178
+ test('requires one unambiguous onward send before the composer terminal', () => {
179
+ const logs = fixture.logs()
180
+ logs.splice(2, 0, { ...logs[1]!, logIndex: 2 })
181
+ logs[3] = { ...logs[3]!, logIndex: 3 }
182
+ expect(verify(logs).type).toMatchInlineSnapshot('"invalid"')
183
+ })
184
+
185
+ test('does not reuse evidence across batched composer boundaries', () => {
186
+ const prior = fixture.logs({ sourceGuid: otherGuid })
187
+ const current = fixture.logs({ offset: 3 })
188
+ expect(verify([...prior, ...current]).type).toMatchInlineSnapshot('"found"')
189
+ expect(verify([...prior, current[2]!]).type).toMatchInlineSnapshot('"invalid"')
190
+ expect(verify([...prior, ...current.slice(1)]).type).toMatchInlineSnapshot('"invalid"')
191
+ })
192
+
193
+ test('permits a retry after a failed composition in the same receipt', () => {
194
+ const failed = fixture.logs({ terminal: 'SendFailed' }).slice(2)
195
+ expect(
196
+ verify([...failed, ...fixture.logs({ offset: 3, terminal: 'Retried' })]).type,
197
+ ).toMatchInlineSnapshot('"found"')
198
+ })
199
+ })
200
+
201
+ function verify(logs: LegacyMeshDelivery.verifyForwarding.Options['logs']) {
202
+ return LegacyMeshDelivery.verifyForwarding({ amount, guid, logs, recipient })
203
+ }
204
+
205
+ namespace fixture {
206
+ export function packet(options: packet.Options = {}) {
207
+ return Hex.concat(
208
+ Hex.fromNumber(1, { size: 1 }),
209
+ Hex.fromNumber(1, { size: 8 }),
210
+ Hex.fromNumber(30110, { size: 4 }),
211
+ Hex.padLeft(hubOft, 32),
212
+ Hex.fromNumber(30410, { size: 4 }),
213
+ Hex.padLeft(options.receiver ?? destinationOft, 32),
214
+ options.packetGuid ?? onwardGuid,
215
+ Hex.padLeft(options.recipient ?? recipient, 32),
216
+ Hex.fromNumber(options.amount ?? amount, { size: 8 }),
217
+ )
218
+ }
219
+
220
+ export declare namespace packet {
221
+ type Options = {
222
+ amount?: bigint | undefined
223
+ packetGuid?: Hex.Hex | undefined
224
+ receiver?: Hex.Hex | undefined
225
+ recipient?: Hex.Hex | undefined
226
+ }
227
+ }
228
+
229
+ export function logs(options: logs.Options = {}) {
230
+ const offset = options.offset ?? 0
231
+ const terminal = options.terminal ?? 'Sent'
232
+ return [
233
+ log({
234
+ address: endpoint,
235
+ data: encodeAbiParameters(parseAbiParameters('bytes,bytes,address'), [
236
+ options.packet ?? packet(options),
237
+ '0x',
238
+ endpoint,
239
+ ]),
240
+ logIndex: offset,
241
+ topics: [keccak256(stringToHex('PacketSent(bytes,bytes,address)'))],
242
+ }),
243
+ log({
244
+ address: hubOft,
245
+ data: encodeAbiParameters(parseAbiParameters('uint32,uint256,uint256'), [
246
+ 30410,
247
+ amount,
248
+ amount,
249
+ ]),
250
+ logIndex: offset + 1,
251
+ topics: [
252
+ keccak256(stringToHex('OFTSent(bytes32,uint32,address,uint256,uint256)')),
253
+ onwardGuid,
254
+ Hex.padLeft(composer, 32),
255
+ ],
256
+ }),
257
+ log({
258
+ address: composer,
259
+ data:
260
+ terminal === 'DecodeFailed'
261
+ ? encodeAbiParameters(parseAbiParameters('bytes'), ['0x'])
262
+ : '0x',
263
+ logIndex: offset + 2,
264
+ topics: [
265
+ keccak256(
266
+ stringToHex(
267
+ `${terminal}(bytes32,address${terminal === 'DecodeFailed' ? ',bytes' : ''})`,
268
+ ),
269
+ ),
270
+ options.sourceGuid ?? guid,
271
+ Hex.padLeft(options.oft ?? hubOft, 32),
272
+ ],
273
+ }),
274
+ ]
275
+ }
276
+
277
+ export declare namespace logs {
278
+ type Options = packet.Options & {
279
+ offset?: number | undefined
280
+ oft?: Hex.Hex | undefined
281
+ packet?: Hex.Hex | undefined
282
+ sourceGuid?: Hex.Hex | undefined
283
+ terminal?: 'DecodeFailed' | 'Refunded' | 'Retried' | 'SendFailed' | 'Sent' | undefined
284
+ }
285
+ }
286
+
287
+ function log(options: log.Options): LegacyMeshDelivery.verifyForwarding.Options['logs'][number] {
288
+ return {
289
+ ...options,
290
+ blockHash: otherGuid,
291
+ blockNumber: 1n,
292
+ removed: false,
293
+ transactionHash: otherGuid,
294
+ transactionIndex: 0,
295
+ }
296
+ }
297
+
298
+ declare namespace log {
299
+ type Options = {
300
+ address: Hex.Hex
301
+ data: Hex.Hex
302
+ logIndex: number
303
+ topics: [Hex.Hex, ...Hex.Hex[]]
304
+ }
305
+ }
306
+ }
@@ -0,0 +1,320 @@
1
+ import { AbiEvent, Address, Hex } from 'ox'
2
+ import {
3
+ parseEventLogs,
4
+ publicActions,
5
+ TransactionReceiptNotFoundError,
6
+ type TransactionReceipt,
7
+ } from 'viem'
8
+ import * as z from 'zod/mini'
9
+
10
+ import * as Schema from '../../Schema.js'
11
+ import * as Viem from '../../Viem.js'
12
+ import type * as Chain from '../Chain.js'
13
+ import type * as RoutesProvider from '../Provider.js'
14
+
15
+ // Canonical deployments: https://docs.usdt0.to/api/deployments.
16
+ const composer = '0x759BA420bF1ded1765F18C2DC3Fc57A1964A2Ad1'
17
+ const hubAdapter = '0x77652d5aba086137b595875263fc200182919b92'
18
+ const hubOft = '0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92'
19
+ const hubEndpoint = '0x1a44076050125825900e736c501f859c50fE728c'
20
+ const destinationOft = '0xaf37E8B6C9ED7f6318979f56Fc287d76c30847ff'
21
+ const destinationToken = '0x20C00000000000000000000014f22CA97301EB73'
22
+ const maximumLogBlockRange = 10_000n
23
+ const zeroAddress = '0x0000000000000000000000000000000000000000'
24
+ const sent = AbiEvent.from('event Sent(bytes32 indexed guid, address indexed oft)')
25
+ const retried = AbiEvent.from('event Retried(bytes32 indexed guid, address indexed oft)')
26
+ const refunded = AbiEvent.from('event Refunded(bytes32 indexed guid, address indexed oft)')
27
+ const sendFailed = AbiEvent.from('event SendFailed(bytes32 indexed guid, address indexed oft)')
28
+ const decodeFailed = AbiEvent.from(
29
+ 'event DecodeFailed(bytes32 indexed guid, address indexed oft, bytes message)',
30
+ )
31
+ const oftSent = AbiEvent.from(
32
+ 'event OFTSent(bytes32 indexed guid, uint32 dstEid, address indexed fromAddress, uint256 amountSentLD, uint256 amountReceivedLD)',
33
+ )
34
+ const oftReceived = AbiEvent.from(
35
+ 'event OFTReceived(bytes32 indexed guid, uint32 srcEid, address indexed toAddress, uint256 amountReceivedLD)',
36
+ )
37
+ const packetSent = AbiEvent.from(
38
+ 'event PacketSent(bytes encodedPayload, bytes options, address sendLibrary)',
39
+ )
40
+ const transferEvent = AbiEvent.from(
41
+ 'event Transfer(address indexed from, address indexed to, uint256 value)',
42
+ )
43
+ const stateSchema = z.object({
44
+ destinationBlockNumber: z.string().check(z.regex(/^\d+$/)),
45
+ hubBlockNumber: z.string().check(z.regex(/^\d+$/)),
46
+ legacyMesh: z.object({
47
+ amount: z.string().check(z.regex(/^[1-9]\d*$/)),
48
+ guid: Schema.Hash,
49
+ }),
50
+ })
51
+
52
+ /** Verifies both the Arbitrum forwarding evidence and the final Tempo token delivery. */
53
+ export async function verifyDestinationDelivery(
54
+ options: verifyDestinationDelivery.Options,
55
+ ): Promise<RoutesProvider.verifyDestinationDelivery.ReturnType> {
56
+ const { destinationChain, transfer } = options
57
+ const state = stateSchema.safeParse(options.providerState)
58
+ if (
59
+ !state.success ||
60
+ destinationChain.id !== 'eip155:4217' ||
61
+ destinationChain.kind !== 'evm' ||
62
+ !Address.validate(transfer.recipient, { strict: false }) ||
63
+ !Address.validate(transfer.destinationToken.address, { strict: false }) ||
64
+ !Address.isEqual(transfer.destinationToken.address as Address.Address, destinationToken) ||
65
+ transfer.destinationAmount?.baseUnits !== state.data.legacyMesh.amount
66
+ )
67
+ return { type: 'invalid' }
68
+
69
+ const { destinationBlockNumber, hubBlockNumber, legacyMesh } = state.data
70
+ const fetch = options.fetch ?? globalThis.fetch
71
+ const hub = Viem.createEvmClient({
72
+ chainId: 42161,
73
+ fetch,
74
+ signal: options.signal,
75
+ urls: options.hubRpcUrls ?? ['https://arb1.arbitrum.io/rpc'],
76
+ }).extend(publicActions)
77
+ const destination = Viem.createEvmClient({
78
+ chainId: 4217,
79
+ fetch,
80
+ signal: options.signal,
81
+ urls: options.resolveRpcUrls?.(destinationChain) ?? destinationChain.rpcUrls,
82
+ }).extend(publicActions)
83
+ const [hubChainId, destinationChainId, hubHead, destinationHead] = await Promise.all([
84
+ hub.getChainId(),
85
+ destination.getChainId(),
86
+ hub.getBlock({ blockTag: 'finalized', includeTransactions: false }),
87
+ destination.getBlock({ blockTag: 'latest', includeTransactions: false }),
88
+ ])
89
+ if (hubChainId !== 42161 || destinationChainId !== 4217) return { type: 'invalid' }
90
+ const amount = BigInt(legacyMesh.amount)
91
+ const recipient = transfer.recipient as Address.Address
92
+ const forwarding = await (async () => {
93
+ // Search newest finalized events first so a later retry supersedes an earlier failure.
94
+ for (
95
+ let toBlock = hubHead.number;
96
+ toBlock >= BigInt(hubBlockNumber);
97
+ toBlock -= maximumLogBlockRange
98
+ ) {
99
+ const start = toBlock - maximumLogBlockRange + 1n
100
+ const logs = await hub.getLogs({
101
+ address: composer,
102
+ events: [sent, retried, refunded, sendFailed, decodeFailed],
103
+ fromBlock: start < BigInt(hubBlockNumber) ? BigInt(hubBlockNumber) : start,
104
+ strict: true,
105
+ toBlock,
106
+ })
107
+ const match = logs
108
+ .filter(({ args }) => Hex.isEqual(args.guid, legacyMesh.guid))
109
+ .sort((a, b) => {
110
+ if (a.blockNumber === b.blockNumber) return b.logIndex - a.logIndex
111
+ return a.blockNumber > b.blockNumber ? -1 : 1
112
+ })[0]
113
+ if (!match) continue
114
+ const receipt = await hub
115
+ .getTransactionReceipt({ hash: match.transactionHash })
116
+ .catch((cause) => {
117
+ if (cause instanceof TransactionReceiptNotFoundError) return undefined
118
+ throw cause
119
+ })
120
+ if (!receipt) return { type: 'pending' as const }
121
+ if (
122
+ receipt.status !== 'success' ||
123
+ receipt.blockNumber > hubHead.number ||
124
+ receipt.blockHash !== match.blockHash
125
+ )
126
+ return { type: 'invalid' as const }
127
+
128
+ return verifyComposerOutcome({ amount, guid: legacyMesh.guid, logs: receipt.logs, recipient })
129
+ }
130
+ return { type: 'pending' as const }
131
+ })()
132
+ if (forwarding.type !== 'found') return forwarding
133
+
134
+ for (
135
+ let fromBlock = BigInt(destinationBlockNumber);
136
+ fromBlock <= destinationHead.number;
137
+ fromBlock += maximumLogBlockRange
138
+ ) {
139
+ const end = fromBlock + maximumLogBlockRange - 1n
140
+ const logs = await destination.getLogs({
141
+ address: destinationOft,
142
+ args: { guid: forwarding.guid },
143
+ event: oftReceived,
144
+ fromBlock,
145
+ strict: true,
146
+ toBlock: end > destinationHead.number ? destinationHead.number : end,
147
+ })
148
+ if (logs.length > 1) return { type: 'invalid' }
149
+ const match = logs[0]
150
+ if (!match) continue
151
+ if (
152
+ match.args.srcEid !== 30110 ||
153
+ !Address.isEqual(match.args.toAddress, recipient) ||
154
+ match.args.amountReceivedLD !== amount
155
+ )
156
+ return { type: 'invalid' }
157
+ const receipt = await destination
158
+ .getTransactionReceipt({ hash: match.transactionHash })
159
+ .catch((cause) => {
160
+ if (cause instanceof TransactionReceiptNotFoundError) return undefined
161
+ throw cause
162
+ })
163
+ if (!receipt) return { type: 'pending' }
164
+ if (
165
+ receipt.status !== 'success' ||
166
+ receipt.blockNumber > destinationHead.number ||
167
+ receipt.blockHash !== match.blockHash
168
+ )
169
+ return { type: 'invalid' }
170
+ const received = parseEventLogs({
171
+ abi: [oftReceived],
172
+ logs: receipt.logs,
173
+ strict: true,
174
+ }).filter(
175
+ ({ address, args }) =>
176
+ Address.isEqual(address, destinationOft) &&
177
+ Hex.isEqual(args.guid, forwarding.guid) &&
178
+ args.srcEid === 30110 &&
179
+ Address.isEqual(args.toAddress, recipient) &&
180
+ args.amountReceivedLD === amount,
181
+ )
182
+ const transfers = parseEventLogs({
183
+ abi: [transferEvent],
184
+ logs: receipt.logs,
185
+ strict: true,
186
+ }).filter(
187
+ ({ address, args }) =>
188
+ Address.isEqual(address, destinationToken) &&
189
+ Address.isEqual(args.from, zeroAddress) &&
190
+ Address.isEqual(args.to, recipient) &&
191
+ args.value === amount,
192
+ )
193
+ if (received.length !== 1 || transfers.length !== 1) return { type: 'invalid' }
194
+ return { transactionHash: receipt.transactionHash, type: 'verified' }
195
+ }
196
+ return { type: 'pending' }
197
+ }
198
+
199
+ export declare namespace verifyDestinationDelivery {
200
+ /** Transfer evidence and read-only RPC configuration for both delivery hops. */
201
+ type Options = RoutesProvider.verifyDestinationDelivery.Parameters & {
202
+ /** Fetch implementation for chain RPC requests. */
203
+ fetch?: RoutesProvider.Fetch | undefined
204
+ /** Arbitrum RPC endpoints used to verify forwarding. */
205
+ hubRpcUrls?: readonly string[] | undefined
206
+ /** RPC endpoints for the configured destination chain. */
207
+ resolveRpcUrls?: ((chain: Chain.Chain) => readonly string[]) | undefined
208
+ /** Cancellation signal for RPC requests. */
209
+ signal?: AbortSignal | undefined
210
+ }
211
+ }
212
+
213
+ /** Classifies the latest composer outcome without treating an initiated refund as completed repayment. */
214
+ export function verifyComposerOutcome(options: verifyComposerOutcome.Options) {
215
+ const terminal = parseEventLogs({
216
+ abi: [sent, retried, refunded, sendFailed, decodeFailed],
217
+ logs: [...options.logs],
218
+ strict: true,
219
+ })
220
+ .filter(
221
+ ({ address, args }) =>
222
+ Address.isEqual(address, composer) && Hex.isEqual(args.guid, options.guid),
223
+ )
224
+ .sort((a, b) => b.logIndex - a.logIndex)[0]
225
+ if (
226
+ !terminal ||
227
+ !Address.isEqual(terminal.args.oft, terminal.eventName === 'Refunded' ? hubAdapter : hubOft)
228
+ )
229
+ return { type: 'invalid' as const }
230
+ if (terminal.eventName === 'Sent' || terminal.eventName === 'Retried')
231
+ return verifyForwarding(options)
232
+
233
+ // Refunded proves the reverse send started, not that Tron repayment settled.
234
+ return {
235
+ statusReason: {
236
+ code: 'manual_recovery_required' as const,
237
+ message:
238
+ terminal.eventName === 'Refunded'
239
+ ? 'The Arbitrum composer initiated a refund. Operator verification of Tron repayment is required.'
240
+ : 'The Arbitrum composer failed to forward the transfer. Operator recovery is required.',
241
+ },
242
+ type: 'action-required' as const,
243
+ }
244
+ }
245
+
246
+ export declare namespace verifyComposerOutcome {
247
+ /** Canonical composer receipt logs and the registered transfer terms. */
248
+ type Options = verifyForwarding.Options
249
+ }
250
+
251
+ /** Correlates a source GUID with its exact onward packet inside a composer transaction. */
252
+ export function verifyForwarding(options: verifyForwarding.Options) {
253
+ // Composer emits the source GUID after its nested OFT send; retries emit Retried instead of Sent.
254
+ const terminals = parseEventLogs({
255
+ abi: [sent, retried, refunded, sendFailed, decodeFailed],
256
+ logs: [...options.logs],
257
+ strict: true,
258
+ }).filter(({ address }) => Address.isEqual(address, composer))
259
+ const matches = terminals.filter(
260
+ ({ args, eventName }) =>
261
+ Hex.isEqual(args.guid, options.guid) && (eventName === 'Sent' || eventName === 'Retried'),
262
+ )
263
+ const terminal = matches[0]
264
+ if (matches.length !== 1 || !terminal || !Address.isEqual(terminal.args.oft, hubOft))
265
+ return { type: 'invalid' as const }
266
+ const previous =
267
+ terminals.filter(({ logIndex }) => logIndex < terminal.logIndex).at(-1)?.logIndex ?? -1
268
+ const segment = options.logs.filter(
269
+ ({ logIndex }) => logIndex > previous && logIndex < terminal.logIndex,
270
+ )
271
+ const sends = parseEventLogs({ abi: [oftSent], logs: segment, strict: true }).filter(
272
+ ({ address, args }) =>
273
+ Address.isEqual(address, hubOft) && Address.isEqual(args.fromAddress, composer),
274
+ )
275
+ const send = sends[0]
276
+ if (
277
+ sends.length !== 1 ||
278
+ !send ||
279
+ send.args.dstEid !== 30410 ||
280
+ send.args.amountSentLD !== options.amount ||
281
+ send.args.amountReceivedLD !== options.amount
282
+ )
283
+ return { type: 'invalid' as const }
284
+ const guid = send.args.guid
285
+ // PacketV1's 113-byte header precedes recipient bytes32 and amountSD uint64. USDT0 local and shared amounts both use six decimals.
286
+ const packets = parseEventLogs({ abi: [packetSent], logs: segment, strict: true }).filter(
287
+ ({ address, args, logIndex }) => {
288
+ const packet = args.encodedPayload
289
+ return (
290
+ Address.isEqual(address, hubEndpoint) &&
291
+ logIndex < send.logIndex &&
292
+ Hex.size(packet) === 153 &&
293
+ Hex.toNumber(Hex.slice(packet, 0, 1)) === 1 &&
294
+ Hex.toNumber(Hex.slice(packet, 9, 13)) === 30110 &&
295
+ Hex.isEqual(Hex.slice(packet, 13, 45), Hex.padLeft(hubOft, 32)) &&
296
+ Hex.toNumber(Hex.slice(packet, 45, 49)) === 30410 &&
297
+ Hex.isEqual(Hex.slice(packet, 49, 81), Hex.padLeft(destinationOft, 32)) &&
298
+ Hex.isEqual(Hex.slice(packet, 81, 113), guid) &&
299
+ Hex.isEqual(Hex.slice(packet, 113, 145), Hex.padLeft(options.recipient, 32)) &&
300
+ Hex.toBigInt(Hex.slice(packet, 145, 153)) === options.amount
301
+ )
302
+ },
303
+ )
304
+ if (packets.length !== 1) return { type: 'invalid' as const }
305
+ return { guid, type: 'found' as const }
306
+ }
307
+
308
+ export declare namespace verifyForwarding {
309
+ /** Confirmed source terms and raw receipt logs. */
310
+ type Options = {
311
+ /** Exact amount forwarded, in six-decimal USDT units. */
312
+ amount: bigint
313
+ /** GUID emitted on the original source chain. */
314
+ guid: Hex.Hex
315
+ /** Included Arbitrum transaction logs in execution order. */
316
+ logs: readonly TransactionReceipt['logs'][number][]
317
+ /** Final Tempo beneficiary. */
318
+ recipient: Address.Address
319
+ }
320
+ }