@recoillink/sdk 0.0.0-stage → 45.0.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 (1823) hide show
  1. package/LICENSE.md +193 -0
  2. package/README.md +30 -2
  3. package/dist/app/HyperlaneApp.d.ts +13 -0
  4. package/dist/app/HyperlaneApp.d.ts.map +1 -0
  5. package/dist/app/HyperlaneApp.js +22 -0
  6. package/dist/app/HyperlaneApp.js.map +1 -0
  7. package/dist/app/MultiProtocolApp.d.ts +93 -0
  8. package/dist/app/MultiProtocolApp.d.ts.map +1 -0
  9. package/dist/app/MultiProtocolApp.js +144 -0
  10. package/dist/app/MultiProtocolApp.js.map +1 -0
  11. package/dist/app/MultiProtocolApp.test.d.ts +2 -0
  12. package/dist/app/MultiProtocolApp.test.d.ts.map +1 -0
  13. package/dist/app/MultiProtocolApp.test.js +28 -0
  14. package/dist/app/MultiProtocolApp.test.js.map +1 -0
  15. package/dist/aws/s3.d.ts +22 -0
  16. package/dist/aws/s3.d.ts.map +1 -0
  17. package/dist/aws/s3.js +69 -0
  18. package/dist/aws/s3.js.map +1 -0
  19. package/dist/aws/validator.d.ts +22 -0
  20. package/dist/aws/validator.d.ts.map +1 -0
  21. package/dist/aws/validator.js +99 -0
  22. package/dist/aws/validator.js.map +1 -0
  23. package/dist/block-explorer/etherscan.d.ts +142 -0
  24. package/dist/block-explorer/etherscan.d.ts.map +1 -0
  25. package/dist/block-explorer/etherscan.js +307 -0
  26. package/dist/block-explorer/etherscan.js.map +1 -0
  27. package/dist/block-explorer/etherscan.test.d.ts +2 -0
  28. package/dist/block-explorer/etherscan.test.d.ts.map +1 -0
  29. package/dist/block-explorer/etherscan.test.js +359 -0
  30. package/dist/block-explorer/etherscan.test.js.map +1 -0
  31. package/dist/block-explorer/testFixtures.d.ts +8 -0
  32. package/dist/block-explorer/testFixtures.d.ts.map +1 -0
  33. package/dist/block-explorer/testFixtures.js +18 -0
  34. package/dist/block-explorer/testFixtures.js.map +1 -0
  35. package/dist/block-explorer/utils.d.ts +11 -0
  36. package/dist/block-explorer/utils.d.ts.map +1 -0
  37. package/dist/block-explorer/utils.js +32 -0
  38. package/dist/block-explorer/utils.js.map +1 -0
  39. package/dist/ccip/HyperlaneCCIPDeployer.d.ts +18 -0
  40. package/dist/ccip/HyperlaneCCIPDeployer.d.ts.map +1 -0
  41. package/dist/ccip/HyperlaneCCIPDeployer.js +122 -0
  42. package/dist/ccip/HyperlaneCCIPDeployer.js.map +1 -0
  43. package/dist/ccip/consts.d.ts +24 -0
  44. package/dist/ccip/consts.d.ts.map +1 -0
  45. package/dist/ccip/consts.js +491 -0
  46. package/dist/ccip/consts.js.map +1 -0
  47. package/dist/ccip/utils.d.ts +46 -0
  48. package/dist/ccip/utils.d.ts.map +1 -0
  49. package/dist/ccip/utils.js +95 -0
  50. package/dist/ccip/utils.js.map +1 -0
  51. package/dist/consts/bytecode.d.ts +14 -0
  52. package/dist/consts/bytecode.d.ts.map +1 -0
  53. package/dist/consts/bytecode.js +15 -0
  54. package/dist/consts/bytecode.js.map +1 -0
  55. package/dist/consts/concurrency.d.ts +2 -0
  56. package/dist/consts/concurrency.d.ts.map +1 -0
  57. package/dist/consts/concurrency.js +2 -0
  58. package/dist/consts/concurrency.js.map +1 -0
  59. package/dist/consts/igp.d.ts +12 -0
  60. package/dist/consts/igp.d.ts.map +1 -0
  61. package/dist/consts/igp.js +40 -0
  62. package/dist/consts/igp.js.map +1 -0
  63. package/dist/consts/mailbox.d.ts +2 -0
  64. package/dist/consts/mailbox.d.ts.map +1 -0
  65. package/dist/consts/mailbox.js +3 -0
  66. package/dist/consts/mailbox.js.map +1 -0
  67. package/dist/consts/multisigIsm.d.ts +5 -0
  68. package/dist/consts/multisigIsm.d.ts.map +1 -0
  69. package/dist/consts/multisigIsm.js +847 -0
  70. package/dist/consts/multisigIsm.js.map +1 -0
  71. package/dist/consts/multisigIsm.test.d.ts +2 -0
  72. package/dist/consts/multisigIsm.test.d.ts.map +1 -0
  73. package/dist/consts/multisigIsm.test.js +40 -0
  74. package/dist/consts/multisigIsm.test.js.map +1 -0
  75. package/dist/consts/multisigIsmVerifyCosts.d.ts +210 -0
  76. package/dist/consts/multisigIsmVerifyCosts.d.ts.map +1 -0
  77. package/dist/consts/multisigIsmVerifyCosts.js +210 -0
  78. package/dist/consts/multisigIsmVerifyCosts.js.map +1 -0
  79. package/dist/consts/numbers.d.ts +2 -0
  80. package/dist/consts/numbers.d.ts.map +1 -0
  81. package/dist/consts/numbers.js +3 -0
  82. package/dist/consts/numbers.js.map +1 -0
  83. package/dist/consts/recoilLinkFees.d.ts +6 -0
  84. package/dist/consts/recoilLinkFees.d.ts.map +1 -0
  85. package/dist/consts/recoilLinkFees.js +17 -0
  86. package/dist/consts/recoilLinkFees.js.map +1 -0
  87. package/dist/consts/registry.d.ts +2 -0
  88. package/dist/consts/registry.d.ts.map +1 -0
  89. package/dist/consts/registry.js +5 -0
  90. package/dist/consts/registry.js.map +1 -0
  91. package/dist/consts/sealevel.d.ts +7 -0
  92. package/dist/consts/sealevel.d.ts.map +1 -0
  93. package/dist/consts/sealevel.js +8 -0
  94. package/dist/consts/sealevel.js.map +1 -0
  95. package/dist/consts/testChains.d.ts +30 -0
  96. package/dist/consts/testChains.d.ts.map +1 -0
  97. package/dist/consts/testChains.js +244 -0
  98. package/dist/consts/testChains.js.map +1 -0
  99. package/dist/contracts/contracts.d.ts +40 -0
  100. package/dist/contracts/contracts.d.ts.map +1 -0
  101. package/dist/contracts/contracts.hardhat-test.d.ts +2 -0
  102. package/dist/contracts/contracts.hardhat-test.d.ts.map +1 -0
  103. package/dist/contracts/contracts.hardhat-test.js +34 -0
  104. package/dist/contracts/contracts.hardhat-test.js.map +1 -0
  105. package/dist/contracts/contracts.js +201 -0
  106. package/dist/contracts/contracts.js.map +1 -0
  107. package/dist/contracts/contracts.test.d.ts +2 -0
  108. package/dist/contracts/contracts.test.d.ts.map +1 -0
  109. package/dist/contracts/contracts.test.js +88 -0
  110. package/dist/contracts/contracts.test.js.map +1 -0
  111. package/dist/contracts/types.d.ts +18 -0
  112. package/dist/contracts/types.d.ts.map +1 -0
  113. package/dist/contracts/types.js +2 -0
  114. package/dist/contracts/types.js.map +1 -0
  115. package/dist/core/AbstractHyperlaneModule.d.ts +18 -0
  116. package/dist/core/AbstractHyperlaneModule.d.ts.map +1 -0
  117. package/dist/core/AbstractHyperlaneModule.js +10 -0
  118. package/dist/core/AbstractHyperlaneModule.js.map +1 -0
  119. package/dist/core/CoreDeployer.hardhat-test.d.ts +2 -0
  120. package/dist/core/CoreDeployer.hardhat-test.d.ts.map +1 -0
  121. package/dist/core/CoreDeployer.hardhat-test.js +234 -0
  122. package/dist/core/CoreDeployer.hardhat-test.js.map +1 -0
  123. package/dist/core/EvmCoreModule.d.ts +119 -0
  124. package/dist/core/EvmCoreModule.d.ts.map +1 -0
  125. package/dist/core/EvmCoreModule.hardhat-test.d.ts +2 -0
  126. package/dist/core/EvmCoreModule.hardhat-test.d.ts.map +1 -0
  127. package/dist/core/EvmCoreModule.hardhat-test.js +364 -0
  128. package/dist/core/EvmCoreModule.hardhat-test.js.map +1 -0
  129. package/dist/core/EvmCoreModule.js +339 -0
  130. package/dist/core/EvmCoreModule.js.map +1 -0
  131. package/dist/core/EvmCoreReader.d.ts +38 -0
  132. package/dist/core/EvmCoreReader.d.ts.map +1 -0
  133. package/dist/core/EvmCoreReader.js +92 -0
  134. package/dist/core/EvmCoreReader.js.map +1 -0
  135. package/dist/core/EvmIcaModule.d.ts +43 -0
  136. package/dist/core/EvmIcaModule.d.ts.map +1 -0
  137. package/dist/core/EvmIcaModule.hardhat-test.d.ts +2 -0
  138. package/dist/core/EvmIcaModule.hardhat-test.d.ts.map +1 -0
  139. package/dist/core/EvmIcaModule.hardhat-test.js +211 -0
  140. package/dist/core/EvmIcaModule.hardhat-test.js.map +1 -0
  141. package/dist/core/EvmIcaModule.js +143 -0
  142. package/dist/core/EvmIcaModule.js.map +1 -0
  143. package/dist/core/HyperlaneCore.d.ts +78 -0
  144. package/dist/core/HyperlaneCore.d.ts.map +1 -0
  145. package/dist/core/HyperlaneCore.js +296 -0
  146. package/dist/core/HyperlaneCore.js.map +1 -0
  147. package/dist/core/HyperlaneCore.test.d.ts +2 -0
  148. package/dist/core/HyperlaneCore.test.d.ts.map +1 -0
  149. package/dist/core/HyperlaneCore.test.js +12 -0
  150. package/dist/core/HyperlaneCore.test.js.map +1 -0
  151. package/dist/core/HyperlaneCoreChecker.d.ts +18 -0
  152. package/dist/core/HyperlaneCoreChecker.d.ts.map +1 -0
  153. package/dist/core/HyperlaneCoreChecker.js +171 -0
  154. package/dist/core/HyperlaneCoreChecker.js.map +1 -0
  155. package/dist/core/HyperlaneCoreDeployer.d.ts +36 -0
  156. package/dist/core/HyperlaneCoreDeployer.d.ts.map +1 -0
  157. package/dist/core/HyperlaneCoreDeployer.js +162 -0
  158. package/dist/core/HyperlaneCoreDeployer.js.map +1 -0
  159. package/dist/core/MultiProtocolCore.d.ts +21 -0
  160. package/dist/core/MultiProtocolCore.d.ts.map +1 -0
  161. package/dist/core/MultiProtocolCore.js +49 -0
  162. package/dist/core/MultiProtocolCore.js.map +1 -0
  163. package/dist/core/MultiProtocolCore.test.d.ts +2 -0
  164. package/dist/core/MultiProtocolCore.test.d.ts.map +1 -0
  165. package/dist/core/MultiProtocolCore.test.js +27 -0
  166. package/dist/core/MultiProtocolCore.test.js.map +1 -0
  167. package/dist/core/TestCoreApp.d.ts +17 -0
  168. package/dist/core/TestCoreApp.d.ts.map +1 -0
  169. package/dist/core/TestCoreApp.js +49 -0
  170. package/dist/core/TestCoreApp.js.map +1 -0
  171. package/dist/core/TestCoreDeployer.d.ts +10 -0
  172. package/dist/core/TestCoreDeployer.d.ts.map +1 -0
  173. package/dist/core/TestCoreDeployer.js +13 -0
  174. package/dist/core/TestCoreDeployer.js.map +1 -0
  175. package/dist/core/TestRecipientDeployer.d.ts +22 -0
  176. package/dist/core/TestRecipientDeployer.d.ts.map +1 -0
  177. package/dist/core/TestRecipientDeployer.js +30 -0
  178. package/dist/core/TestRecipientDeployer.js.map +1 -0
  179. package/dist/core/adapters/AleoCoreAdapter.d.ts +23 -0
  180. package/dist/core/adapters/AleoCoreAdapter.d.ts.map +1 -0
  181. package/dist/core/adapters/AleoCoreAdapter.js +72 -0
  182. package/dist/core/adapters/AleoCoreAdapter.js.map +1 -0
  183. package/dist/core/adapters/CosmNativeCoreAdapter.d.ts +23 -0
  184. package/dist/core/adapters/CosmNativeCoreAdapter.d.ts.map +1 -0
  185. package/dist/core/adapters/CosmNativeCoreAdapter.js +65 -0
  186. package/dist/core/adapters/CosmNativeCoreAdapter.js.map +1 -0
  187. package/dist/core/adapters/CosmWasmCoreAdapter.d.ts +40 -0
  188. package/dist/core/adapters/CosmWasmCoreAdapter.d.ts.map +1 -0
  189. package/dist/core/adapters/CosmWasmCoreAdapter.js +145 -0
  190. package/dist/core/adapters/CosmWasmCoreAdapter.js.map +1 -0
  191. package/dist/core/adapters/CosmWasmCoreAdapter.test.d.ts +2 -0
  192. package/dist/core/adapters/CosmWasmCoreAdapter.test.d.ts.map +1 -0
  193. package/dist/core/adapters/CosmWasmCoreAdapter.test.js +31 -0
  194. package/dist/core/adapters/CosmWasmCoreAdapter.test.js.map +1 -0
  195. package/dist/core/adapters/CosmWasmIgpAdapter.d.ts +27 -0
  196. package/dist/core/adapters/CosmWasmIgpAdapter.d.ts.map +1 -0
  197. package/dist/core/adapters/CosmWasmIgpAdapter.js +92 -0
  198. package/dist/core/adapters/CosmWasmIgpAdapter.js.map +1 -0
  199. package/dist/core/adapters/EvmCoreAdapter.d.ts +25 -0
  200. package/dist/core/adapters/EvmCoreAdapter.d.ts.map +1 -0
  201. package/dist/core/adapters/EvmCoreAdapter.js +44 -0
  202. package/dist/core/adapters/EvmCoreAdapter.js.map +1 -0
  203. package/dist/core/adapters/RadixCoreAdapter.d.ts +23 -0
  204. package/dist/core/adapters/RadixCoreAdapter.d.ts.map +1 -0
  205. package/dist/core/adapters/RadixCoreAdapter.js +58 -0
  206. package/dist/core/adapters/RadixCoreAdapter.js.map +1 -0
  207. package/dist/core/adapters/SealevelCoreAdapter.d.ts +56 -0
  208. package/dist/core/adapters/SealevelCoreAdapter.d.ts.map +1 -0
  209. package/dist/core/adapters/SealevelCoreAdapter.js +191 -0
  210. package/dist/core/adapters/SealevelCoreAdapter.js.map +1 -0
  211. package/dist/core/adapters/SealevelCoreAdapter.test.d.ts +2 -0
  212. package/dist/core/adapters/SealevelCoreAdapter.test.d.ts.map +1 -0
  213. package/dist/core/adapters/SealevelCoreAdapter.test.js +33 -0
  214. package/dist/core/adapters/SealevelCoreAdapter.test.js.map +1 -0
  215. package/dist/core/adapters/StarknetCoreAdapter.d.ts +23 -0
  216. package/dist/core/adapters/StarknetCoreAdapter.d.ts.map +1 -0
  217. package/dist/core/adapters/StarknetCoreAdapter.js +70 -0
  218. package/dist/core/adapters/StarknetCoreAdapter.js.map +1 -0
  219. package/dist/core/adapters/types.d.ts +19 -0
  220. package/dist/core/adapters/types.d.ts.map +1 -0
  221. package/dist/core/adapters/types.js +2 -0
  222. package/dist/core/adapters/types.js.map +1 -0
  223. package/dist/core/contracts.d.ts +15 -0
  224. package/dist/core/contracts.d.ts.map +1 -0
  225. package/dist/core/contracts.js +13 -0
  226. package/dist/core/contracts.js.map +1 -0
  227. package/dist/core/events.d.ts +4 -0
  228. package/dist/core/events.d.ts.map +1 -0
  229. package/dist/core/events.js +2 -0
  230. package/dist/core/events.js.map +1 -0
  231. package/dist/core/testHyperlaneDeploy.hardhat-test.d.ts +3 -0
  232. package/dist/core/testHyperlaneDeploy.hardhat-test.d.ts.map +1 -0
  233. package/dist/core/testHyperlaneDeploy.hardhat-test.js +56 -0
  234. package/dist/core/testHyperlaneDeploy.hardhat-test.js.map +1 -0
  235. package/dist/core/types.d.ts +173 -0
  236. package/dist/core/types.d.ts.map +1 -0
  237. package/dist/core/types.js +118 -0
  238. package/dist/core/types.js.map +1 -0
  239. package/dist/core/types.test.d.ts +2 -0
  240. package/dist/core/types.test.d.ts.map +1 -0
  241. package/dist/core/types.test.js +205 -0
  242. package/dist/core/types.test.js.map +1 -0
  243. package/dist/cw-types/Cw20Base.types.d.ts +198 -0
  244. package/dist/cw-types/Cw20Base.types.d.ts.map +1 -0
  245. package/dist/cw-types/Cw20Base.types.js +7 -0
  246. package/dist/cw-types/Cw20Base.types.js.map +1 -0
  247. package/dist/cw-types/HookAggregate.types.d.ts +79 -0
  248. package/dist/cw-types/HookAggregate.types.d.ts.map +1 -0
  249. package/dist/cw-types/HookAggregate.types.js +7 -0
  250. package/dist/cw-types/HookAggregate.types.js.map +1 -0
  251. package/dist/cw-types/HookMerkle.types.d.ts +163 -0
  252. package/dist/cw-types/HookMerkle.types.d.ts.map +1 -0
  253. package/dist/cw-types/HookMerkle.types.js +7 -0
  254. package/dist/cw-types/HookMerkle.types.js.map +1 -0
  255. package/dist/cw-types/HookPausable.types.d.ts +82 -0
  256. package/dist/cw-types/HookPausable.types.d.ts.map +1 -0
  257. package/dist/cw-types/HookPausable.types.js +7 -0
  258. package/dist/cw-types/HookPausable.types.js.map +1 -0
  259. package/dist/cw-types/HookRouting.types.d.ts +109 -0
  260. package/dist/cw-types/HookRouting.types.d.ts.map +1 -0
  261. package/dist/cw-types/HookRouting.types.js +7 -0
  262. package/dist/cw-types/HookRouting.types.js.map +1 -0
  263. package/dist/cw-types/HookRoutingCustom.types.d.ts +149 -0
  264. package/dist/cw-types/HookRoutingCustom.types.d.ts.map +1 -0
  265. package/dist/cw-types/HookRoutingCustom.types.js +7 -0
  266. package/dist/cw-types/HookRoutingCustom.types.js.map +1 -0
  267. package/dist/cw-types/HookRoutingFallback.types.d.ts +113 -0
  268. package/dist/cw-types/HookRoutingFallback.types.d.ts.map +1 -0
  269. package/dist/cw-types/HookRoutingFallback.types.js +7 -0
  270. package/dist/cw-types/HookRoutingFallback.types.js.map +1 -0
  271. package/dist/cw-types/Igp.types.d.ts +184 -0
  272. package/dist/cw-types/Igp.types.d.ts.map +1 -0
  273. package/dist/cw-types/Igp.types.js +7 -0
  274. package/dist/cw-types/Igp.types.js.map +1 -0
  275. package/dist/cw-types/IgpOracle.types.d.ts +61 -0
  276. package/dist/cw-types/IgpOracle.types.d.ts.map +1 -0
  277. package/dist/cw-types/IgpOracle.types.js +7 -0
  278. package/dist/cw-types/IgpOracle.types.js.map +1 -0
  279. package/dist/cw-types/IsmAggregate.types.d.ts +76 -0
  280. package/dist/cw-types/IsmAggregate.types.d.ts.map +1 -0
  281. package/dist/cw-types/IsmAggregate.types.js +7 -0
  282. package/dist/cw-types/IsmAggregate.types.js.map +1 -0
  283. package/dist/cw-types/IsmMultisig.types.d.ts +102 -0
  284. package/dist/cw-types/IsmMultisig.types.d.ts.map +1 -0
  285. package/dist/cw-types/IsmMultisig.types.js +7 -0
  286. package/dist/cw-types/IsmMultisig.types.js.map +1 -0
  287. package/dist/cw-types/IsmRouting.types.d.ts +81 -0
  288. package/dist/cw-types/IsmRouting.types.d.ts.map +1 -0
  289. package/dist/cw-types/IsmRouting.types.js +7 -0
  290. package/dist/cw-types/IsmRouting.types.js.map +1 -0
  291. package/dist/cw-types/Mailbox.types.d.ts +131 -0
  292. package/dist/cw-types/Mailbox.types.d.ts.map +1 -0
  293. package/dist/cw-types/Mailbox.types.js +7 -0
  294. package/dist/cw-types/Mailbox.types.js.map +1 -0
  295. package/dist/cw-types/ValidatorAnnounce.types.d.ts +31 -0
  296. package/dist/cw-types/ValidatorAnnounce.types.d.ts.map +1 -0
  297. package/dist/cw-types/ValidatorAnnounce.types.js +7 -0
  298. package/dist/cw-types/ValidatorAnnounce.types.js.map +1 -0
  299. package/dist/cw-types/WarpCw20.types.d.ts +217 -0
  300. package/dist/cw-types/WarpCw20.types.d.ts.map +1 -0
  301. package/dist/cw-types/WarpCw20.types.js +7 -0
  302. package/dist/cw-types/WarpCw20.types.js.map +1 -0
  303. package/dist/cw-types/WarpNative.types.d.ts +197 -0
  304. package/dist/cw-types/WarpNative.types.d.ts.map +1 -0
  305. package/dist/cw-types/WarpNative.types.js +7 -0
  306. package/dist/cw-types/WarpNative.types.js.map +1 -0
  307. package/dist/deploy/HyperlaneAppChecker.d.ts +32 -0
  308. package/dist/deploy/HyperlaneAppChecker.d.ts.map +1 -0
  309. package/dist/deploy/HyperlaneAppChecker.js +220 -0
  310. package/dist/deploy/HyperlaneAppChecker.js.map +1 -0
  311. package/dist/deploy/HyperlaneDeployer.d.ts +83 -0
  312. package/dist/deploy/HyperlaneDeployer.d.ts.map +1 -0
  313. package/dist/deploy/HyperlaneDeployer.js +434 -0
  314. package/dist/deploy/HyperlaneDeployer.js.map +1 -0
  315. package/dist/deploy/HyperlaneProxyFactoryDeployer.d.ts +11 -0
  316. package/dist/deploy/HyperlaneProxyFactoryDeployer.d.ts.map +1 -0
  317. package/dist/deploy/HyperlaneProxyFactoryDeployer.js +48 -0
  318. package/dist/deploy/HyperlaneProxyFactoryDeployer.js.map +1 -0
  319. package/dist/deploy/contracts.d.ts +16 -0
  320. package/dist/deploy/contracts.d.ts.map +1 -0
  321. package/dist/deploy/contracts.js +25 -0
  322. package/dist/deploy/contracts.js.map +1 -0
  323. package/dist/deploy/proxy.d.ts +52 -0
  324. package/dist/deploy/proxy.d.ts.map +1 -0
  325. package/dist/deploy/proxy.js +153 -0
  326. package/dist/deploy/proxy.js.map +1 -0
  327. package/dist/deploy/proxy.test.d.ts +2 -0
  328. package/dist/deploy/proxy.test.d.ts.map +1 -0
  329. package/dist/deploy/proxy.test.js +168 -0
  330. package/dist/deploy/proxy.test.js.map +1 -0
  331. package/dist/deploy/proxyFactoryUtils.d.ts +7 -0
  332. package/dist/deploy/proxyFactoryUtils.d.ts.map +1 -0
  333. package/dist/deploy/proxyFactoryUtils.js +12 -0
  334. package/dist/deploy/proxyFactoryUtils.js.map +1 -0
  335. package/dist/deploy/types.d.ts +69 -0
  336. package/dist/deploy/types.d.ts.map +1 -0
  337. package/dist/deploy/types.js +22 -0
  338. package/dist/deploy/types.js.map +1 -0
  339. package/dist/deploy/utils.d.ts +15 -0
  340. package/dist/deploy/utils.d.ts.map +1 -0
  341. package/dist/deploy/utils.js +28 -0
  342. package/dist/deploy/utils.js.map +1 -0
  343. package/dist/deploy/verify/BaseContractVerifier.d.ts +23 -0
  344. package/dist/deploy/verify/BaseContractVerifier.d.ts.map +1 -0
  345. package/dist/deploy/verify/BaseContractVerifier.js +128 -0
  346. package/dist/deploy/verify/BaseContractVerifier.js.map +1 -0
  347. package/dist/deploy/verify/ContractVerifier.d.ts +30 -0
  348. package/dist/deploy/verify/ContractVerifier.d.ts.map +1 -0
  349. package/dist/deploy/verify/ContractVerifier.js +125 -0
  350. package/dist/deploy/verify/ContractVerifier.js.map +1 -0
  351. package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts +15 -0
  352. package/dist/deploy/verify/PostDeploymentContractVerifier.d.ts.map +1 -0
  353. package/dist/deploy/verify/PostDeploymentContractVerifier.js +45 -0
  354. package/dist/deploy/verify/PostDeploymentContractVerifier.js.map +1 -0
  355. package/dist/deploy/verify/ZKSyncContractVerifier.d.ts +50 -0
  356. package/dist/deploy/verify/ZKSyncContractVerifier.d.ts.map +1 -0
  357. package/dist/deploy/verify/ZKSyncContractVerifier.js +99 -0
  358. package/dist/deploy/verify/ZKSyncContractVerifier.js.map +1 -0
  359. package/dist/deploy/verify/types.d.ts +47 -0
  360. package/dist/deploy/verify/types.d.ts.map +1 -0
  361. package/dist/deploy/verify/types.js +7 -0
  362. package/dist/deploy/verify/types.js.map +1 -0
  363. package/dist/deploy/verify/utils.d.ts +81 -0
  364. package/dist/deploy/verify/utils.d.ts.map +1 -0
  365. package/dist/deploy/verify/utils.js +208 -0
  366. package/dist/deploy/verify/utils.js.map +1 -0
  367. package/dist/deploy/verify/utils.test.d.ts +2 -0
  368. package/dist/deploy/verify/utils.test.d.ts.map +1 -0
  369. package/dist/deploy/verify/utils.test.js +49 -0
  370. package/dist/deploy/verify/utils.test.js.map +1 -0
  371. package/dist/deploy/warp.d.ts +150 -0
  372. package/dist/deploy/warp.d.ts.map +1 -0
  373. package/dist/deploy/warp.js +1280 -0
  374. package/dist/deploy/warp.js.map +1 -0
  375. package/dist/deploy/warp.test.d.ts +2 -0
  376. package/dist/deploy/warp.test.d.ts.map +1 -0
  377. package/dist/deploy/warp.test.js +419 -0
  378. package/dist/deploy/warp.test.js.map +1 -0
  379. package/dist/deploy/warpHybridPlan.d.ts +104 -0
  380. package/dist/deploy/warpHybridPlan.d.ts.map +1 -0
  381. package/dist/deploy/warpHybridPlan.js +178 -0
  382. package/dist/deploy/warpHybridPlan.js.map +1 -0
  383. package/dist/deploy/warpHybridPlan.test.d.ts +2 -0
  384. package/dist/deploy/warpHybridPlan.test.d.ts.map +1 -0
  385. package/dist/deploy/warpHybridPlan.test.js +141 -0
  386. package/dist/deploy/warpHybridPlan.test.js.map +1 -0
  387. package/dist/fee/EvmTokenFeeDeployer.d.ts +20 -0
  388. package/dist/fee/EvmTokenFeeDeployer.d.ts.map +1 -0
  389. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.d.ts +2 -0
  390. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.d.ts.map +1 -0
  391. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js +353 -0
  392. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js.map +1 -0
  393. package/dist/fee/EvmTokenFeeDeployer.js +143 -0
  394. package/dist/fee/EvmTokenFeeDeployer.js.map +1 -0
  395. package/dist/fee/EvmTokenFeeModule.d.ts +63 -0
  396. package/dist/fee/EvmTokenFeeModule.d.ts.map +1 -0
  397. package/dist/fee/EvmTokenFeeModule.hardhat-test.d.ts +2 -0
  398. package/dist/fee/EvmTokenFeeModule.hardhat-test.d.ts.map +1 -0
  399. package/dist/fee/EvmTokenFeeModule.hardhat-test.js +942 -0
  400. package/dist/fee/EvmTokenFeeModule.hardhat-test.js.map +1 -0
  401. package/dist/fee/EvmTokenFeeModule.js +583 -0
  402. package/dist/fee/EvmTokenFeeModule.js.map +1 -0
  403. package/dist/fee/EvmTokenFeeReader.d.ts +38 -0
  404. package/dist/fee/EvmTokenFeeReader.d.ts.map +1 -0
  405. package/dist/fee/EvmTokenFeeReader.hardhat-test.d.ts +4 -0
  406. package/dist/fee/EvmTokenFeeReader.hardhat-test.d.ts.map +1 -0
  407. package/dist/fee/EvmTokenFeeReader.hardhat-test.js +371 -0
  408. package/dist/fee/EvmTokenFeeReader.hardhat-test.js.map +1 -0
  409. package/dist/fee/EvmTokenFeeReader.js +200 -0
  410. package/dist/fee/EvmTokenFeeReader.js.map +1 -0
  411. package/dist/fee/contracts.d.ts +11 -0
  412. package/dist/fee/contracts.d.ts.map +1 -0
  413. package/dist/fee/contracts.js +11 -0
  414. package/dist/fee/contracts.js.map +1 -0
  415. package/dist/fee/crossCollateralUtils.d.ts +8 -0
  416. package/dist/fee/crossCollateralUtils.d.ts.map +1 -0
  417. package/dist/fee/crossCollateralUtils.js +49 -0
  418. package/dist/fee/crossCollateralUtils.js.map +1 -0
  419. package/dist/fee/feeConfigMapping.d.ts +9 -0
  420. package/dist/fee/feeConfigMapping.d.ts.map +1 -0
  421. package/dist/fee/feeConfigMapping.js +87 -0
  422. package/dist/fee/feeConfigMapping.js.map +1 -0
  423. package/dist/fee/feeConfigMapping.test.d.ts +2 -0
  424. package/dist/fee/feeConfigMapping.test.d.ts.map +1 -0
  425. package/dist/fee/feeConfigMapping.test.js +204 -0
  426. package/dist/fee/feeConfigMapping.test.js.map +1 -0
  427. package/dist/fee/types.d.ts +295 -0
  428. package/dist/fee/types.d.ts.map +1 -0
  429. package/dist/fee/types.js +238 -0
  430. package/dist/fee/types.js.map +1 -0
  431. package/dist/fee/types.test.d.ts +2 -0
  432. package/dist/fee/types.test.d.ts.map +1 -0
  433. package/dist/fee/types.test.js +204 -0
  434. package/dist/fee/types.test.js.map +1 -0
  435. package/dist/fee/utils.d.ts +9 -0
  436. package/dist/fee/utils.d.ts.map +1 -0
  437. package/dist/fee/utils.js +9 -0
  438. package/dist/fee/utils.js.map +1 -0
  439. package/dist/fee/utils.test.d.ts +2 -0
  440. package/dist/fee/utils.test.d.ts.map +1 -0
  441. package/dist/fee/utils.test.js +54 -0
  442. package/dist/fee/utils.test.js.map +1 -0
  443. package/dist/fork/types.d.ts +354 -0
  444. package/dist/fork/types.d.ts.map +1 -0
  445. package/dist/fork/types.js +142 -0
  446. package/dist/fork/types.js.map +1 -0
  447. package/dist/gas/HyperlaneIgp.d.ts +53 -0
  448. package/dist/gas/HyperlaneIgp.d.ts.map +1 -0
  449. package/dist/gas/HyperlaneIgp.js +64 -0
  450. package/dist/gas/HyperlaneIgp.js.map +1 -0
  451. package/dist/gas/HyperlaneIgpChecker.d.ts +13 -0
  452. package/dist/gas/HyperlaneIgpChecker.d.ts.map +1 -0
  453. package/dist/gas/HyperlaneIgpChecker.js +162 -0
  454. package/dist/gas/HyperlaneIgpChecker.js.map +1 -0
  455. package/dist/gas/HyperlaneIgpDeployer.d.ts +32 -0
  456. package/dist/gas/HyperlaneIgpDeployer.d.ts.map +1 -0
  457. package/dist/gas/HyperlaneIgpDeployer.js +248 -0
  458. package/dist/gas/HyperlaneIgpDeployer.js.map +1 -0
  459. package/dist/gas/adapters/SealevelIgpAdapter.d.ts +93 -0
  460. package/dist/gas/adapters/SealevelIgpAdapter.d.ts.map +1 -0
  461. package/dist/gas/adapters/SealevelIgpAdapter.js +294 -0
  462. package/dist/gas/adapters/SealevelIgpAdapter.js.map +1 -0
  463. package/dist/gas/adapters/SealevelIgpAdapter.test.d.ts +2 -0
  464. package/dist/gas/adapters/SealevelIgpAdapter.test.d.ts.map +1 -0
  465. package/dist/gas/adapters/SealevelIgpAdapter.test.js +189 -0
  466. package/dist/gas/adapters/SealevelIgpAdapter.test.js.map +1 -0
  467. package/dist/gas/adapters/serialization.d.ts +180 -0
  468. package/dist/gas/adapters/serialization.d.ts.map +1 -0
  469. package/dist/gas/adapters/serialization.js +409 -0
  470. package/dist/gas/adapters/serialization.js.map +1 -0
  471. package/dist/gas/adapters/serialization.test.d.ts +2 -0
  472. package/dist/gas/adapters/serialization.test.d.ts.map +1 -0
  473. package/dist/gas/adapters/serialization.test.js +87 -0
  474. package/dist/gas/adapters/serialization.test.js.map +1 -0
  475. package/dist/gas/contracts.d.ts +8 -0
  476. package/dist/gas/contracts.d.ts.map +1 -0
  477. package/dist/gas/contracts.js +7 -0
  478. package/dist/gas/contracts.js.map +1 -0
  479. package/dist/gas/oracle/configure-gas-oracles.hardhat-test.d.ts +2 -0
  480. package/dist/gas/oracle/configure-gas-oracles.hardhat-test.d.ts.map +1 -0
  481. package/dist/gas/oracle/configure-gas-oracles.hardhat-test.js +82 -0
  482. package/dist/gas/oracle/configure-gas-oracles.hardhat-test.js.map +1 -0
  483. package/dist/gas/oracle/types.d.ts +42 -0
  484. package/dist/gas/oracle/types.d.ts.map +1 -0
  485. package/dist/gas/oracle/types.js +45 -0
  486. package/dist/gas/oracle/types.js.map +1 -0
  487. package/dist/gas/token-prices.d.ts +58 -0
  488. package/dist/gas/token-prices.d.ts.map +1 -0
  489. package/dist/gas/token-prices.js +199 -0
  490. package/dist/gas/token-prices.js.map +1 -0
  491. package/dist/gas/token-prices.test.d.ts +2 -0
  492. package/dist/gas/token-prices.test.d.ts.map +1 -0
  493. package/dist/gas/token-prices.test.js +96 -0
  494. package/dist/gas/token-prices.test.js.map +1 -0
  495. package/dist/gas/types.d.ts +50 -0
  496. package/dist/gas/types.d.ts.map +1 -0
  497. package/dist/gas/types.js +26 -0
  498. package/dist/gas/types.js.map +1 -0
  499. package/dist/gas/utils.d.ts +34 -0
  500. package/dist/gas/utils.d.ts.map +1 -0
  501. package/dist/gas/utils.js +246 -0
  502. package/dist/gas/utils.js.map +1 -0
  503. package/dist/gas/utils.test.d.ts +2 -0
  504. package/dist/gas/utils.test.d.ts.map +1 -0
  505. package/dist/gas/utils.test.js +132 -0
  506. package/dist/gas/utils.test.js.map +1 -0
  507. package/dist/gcp/storage.d.ts +28 -0
  508. package/dist/gcp/storage.d.ts.map +1 -0
  509. package/dist/gcp/storage.js +88 -0
  510. package/dist/gcp/storage.js.map +1 -0
  511. package/dist/gcp/validator.d.ts +22 -0
  512. package/dist/gcp/validator.d.ts.map +1 -0
  513. package/dist/gcp/validator.js +107 -0
  514. package/dist/gcp/validator.js.map +1 -0
  515. package/dist/hook/EvmHookModule.d.ts +161 -0
  516. package/dist/hook/EvmHookModule.d.ts.map +1 -0
  517. package/dist/hook/EvmHookModule.hardhat-test.d.ts +2 -0
  518. package/dist/hook/EvmHookModule.hardhat-test.d.ts.map +1 -0
  519. package/dist/hook/EvmHookModule.hardhat-test.js +1004 -0
  520. package/dist/hook/EvmHookModule.hardhat-test.js.map +1 -0
  521. package/dist/hook/EvmHookModule.js +932 -0
  522. package/dist/hook/EvmHookModule.js.map +1 -0
  523. package/dist/hook/EvmHookReader.d.ts +81 -0
  524. package/dist/hook/EvmHookReader.d.ts.map +1 -0
  525. package/dist/hook/EvmHookReader.js +630 -0
  526. package/dist/hook/EvmHookReader.js.map +1 -0
  527. package/dist/hook/EvmHookReader.test.d.ts +2 -0
  528. package/dist/hook/EvmHookReader.test.d.ts.map +1 -0
  529. package/dist/hook/EvmHookReader.test.js +647 -0
  530. package/dist/hook/EvmHookReader.test.js.map +1 -0
  531. package/dist/hook/HyperlaneHookDeployer.d.ts +70 -0
  532. package/dist/hook/HyperlaneHookDeployer.d.ts.map +1 -0
  533. package/dist/hook/HyperlaneHookDeployer.hardhat-test.d.ts +2 -0
  534. package/dist/hook/HyperlaneHookDeployer.hardhat-test.d.ts.map +1 -0
  535. package/dist/hook/HyperlaneHookDeployer.hardhat-test.js +322 -0
  536. package/dist/hook/HyperlaneHookDeployer.hardhat-test.js.map +1 -0
  537. package/dist/hook/HyperlaneHookDeployer.js +538 -0
  538. package/dist/hook/HyperlaneHookDeployer.js.map +1 -0
  539. package/dist/hook/contracts.d.ts +20 -0
  540. package/dist/hook/contracts.d.ts.map +1 -0
  541. package/dist/hook/contracts.js +18 -0
  542. package/dist/hook/contracts.js.map +1 -0
  543. package/dist/hook/types.d.ts +262 -0
  544. package/dist/hook/types.d.ts.map +1 -0
  545. package/dist/hook/types.js +341 -0
  546. package/dist/hook/types.js.map +1 -0
  547. package/dist/hook/types.test.d.ts +2 -0
  548. package/dist/hook/types.test.d.ts.map +1 -0
  549. package/dist/hook/types.test.js +227 -0
  550. package/dist/hook/types.test.js.map +1 -0
  551. package/dist/hook/updates.d.ts +33 -0
  552. package/dist/hook/updates.d.ts.map +1 -0
  553. package/dist/hook/updates.js +35 -0
  554. package/dist/hook/updates.js.map +1 -0
  555. package/dist/hook/utils.d.ts +58 -0
  556. package/dist/hook/utils.d.ts.map +1 -0
  557. package/dist/hook/utils.hardhat-test.d.ts +2 -0
  558. package/dist/hook/utils.hardhat-test.d.ts.map +1 -0
  559. package/dist/hook/utils.hardhat-test.js +119 -0
  560. package/dist/hook/utils.hardhat-test.js.map +1 -0
  561. package/dist/hook/utils.js +157 -0
  562. package/dist/hook/utils.js.map +1 -0
  563. package/dist/ica/EvmIcaReader.d.ts +7 -0
  564. package/dist/ica/EvmIcaReader.d.ts.map +1 -0
  565. package/dist/ica/EvmIcaReader.hardhat-test.d.ts +2 -0
  566. package/dist/ica/EvmIcaReader.hardhat-test.d.ts.map +1 -0
  567. package/dist/ica/EvmIcaReader.hardhat-test.js +39 -0
  568. package/dist/ica/EvmIcaReader.hardhat-test.js.map +1 -0
  569. package/dist/ica/EvmIcaReader.js +32 -0
  570. package/dist/ica/EvmIcaReader.js.map +1 -0
  571. package/dist/ica/types.d.ts +88 -0
  572. package/dist/ica/types.d.ts.map +1 -0
  573. package/dist/ica/types.js +36 -0
  574. package/dist/ica/types.js.map +1 -0
  575. package/dist/index.d.ts +215 -0
  576. package/dist/index.d.ts.map +1 -0
  577. package/dist/index.js +199 -0
  578. package/dist/index.js.map +1 -0
  579. package/dist/ism/EvmIsmModule.d.ts +106 -0
  580. package/dist/ism/EvmIsmModule.d.ts.map +1 -0
  581. package/dist/ism/EvmIsmModule.hardhat-test.d.ts +2 -0
  582. package/dist/ism/EvmIsmModule.hardhat-test.d.ts.map +1 -0
  583. package/dist/ism/EvmIsmModule.hardhat-test.js +1279 -0
  584. package/dist/ism/EvmIsmModule.hardhat-test.js.map +1 -0
  585. package/dist/ism/EvmIsmModule.js +709 -0
  586. package/dist/ism/EvmIsmModule.js.map +1 -0
  587. package/dist/ism/EvmIsmModule.test.d.ts +2 -0
  588. package/dist/ism/EvmIsmModule.test.d.ts.map +1 -0
  589. package/dist/ism/EvmIsmModule.test.js +309 -0
  590. package/dist/ism/EvmIsmModule.test.js.map +1 -0
  591. package/dist/ism/EvmIsmReader.d.ts +55 -0
  592. package/dist/ism/EvmIsmReader.d.ts.map +1 -0
  593. package/dist/ism/EvmIsmReader.js +555 -0
  594. package/dist/ism/EvmIsmReader.js.map +1 -0
  595. package/dist/ism/EvmIsmReader.test.d.ts +2 -0
  596. package/dist/ism/EvmIsmReader.test.d.ts.map +1 -0
  597. package/dist/ism/EvmIsmReader.test.js +931 -0
  598. package/dist/ism/EvmIsmReader.test.js.map +1 -0
  599. package/dist/ism/HyperlaneIsmFactory.d.ts +129 -0
  600. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -0
  601. package/dist/ism/HyperlaneIsmFactory.hardhat-test.d.ts +2 -0
  602. package/dist/ism/HyperlaneIsmFactory.hardhat-test.d.ts.map +1 -0
  603. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +1228 -0
  604. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -0
  605. package/dist/ism/HyperlaneIsmFactory.js +867 -0
  606. package/dist/ism/HyperlaneIsmFactory.js.map +1 -0
  607. package/dist/ism/HyperlaneIsmFactory.test.d.ts +2 -0
  608. package/dist/ism/HyperlaneIsmFactory.test.d.ts.map +1 -0
  609. package/dist/ism/HyperlaneIsmFactory.test.js +98 -0
  610. package/dist/ism/HyperlaneIsmFactory.test.js.map +1 -0
  611. package/dist/ism/adapters/CosmWasmMultisigAdapter.d.ts +24 -0
  612. package/dist/ism/adapters/CosmWasmMultisigAdapter.d.ts.map +1 -0
  613. package/dist/ism/adapters/CosmWasmMultisigAdapter.js +74 -0
  614. package/dist/ism/adapters/CosmWasmMultisigAdapter.js.map +1 -0
  615. package/dist/ism/adapters/SealevelMultisigAdapter.d.ts +59 -0
  616. package/dist/ism/adapters/SealevelMultisigAdapter.d.ts.map +1 -0
  617. package/dist/ism/adapters/SealevelMultisigAdapter.js +133 -0
  618. package/dist/ism/adapters/SealevelMultisigAdapter.js.map +1 -0
  619. package/dist/ism/blacklist.d.ts +62 -0
  620. package/dist/ism/blacklist.d.ts.map +1 -0
  621. package/dist/ism/blacklist.js +98 -0
  622. package/dist/ism/blacklist.js.map +1 -0
  623. package/dist/ism/delayedFlow.d.ts +31 -0
  624. package/dist/ism/delayedFlow.d.ts.map +1 -0
  625. package/dist/ism/delayedFlow.js +33 -0
  626. package/dist/ism/delayedFlow.js.map +1 -0
  627. package/dist/ism/multisig.d.ts +6 -0
  628. package/dist/ism/multisig.d.ts.map +1 -0
  629. package/dist/ism/multisig.js +25 -0
  630. package/dist/ism/multisig.js.map +1 -0
  631. package/dist/ism/serialization.d.ts +74 -0
  632. package/dist/ism/serialization.d.ts.map +1 -0
  633. package/dist/ism/serialization.js +177 -0
  634. package/dist/ism/serialization.js.map +1 -0
  635. package/dist/ism/types.d.ts +384 -0
  636. package/dist/ism/types.d.ts.map +1 -0
  637. package/dist/ism/types.js +876 -0
  638. package/dist/ism/types.js.map +1 -0
  639. package/dist/ism/types.test.d.ts +2 -0
  640. package/dist/ism/types.test.d.ts.map +1 -0
  641. package/dist/ism/types.test.js +1269 -0
  642. package/dist/ism/types.test.js.map +1 -0
  643. package/dist/ism/utils.d.ts +44 -0
  644. package/dist/ism/utils.d.ts.map +1 -0
  645. package/dist/ism/utils.js +603 -0
  646. package/dist/ism/utils.js.map +1 -0
  647. package/dist/ism/utils.test.d.ts +2 -0
  648. package/dist/ism/utils.test.d.ts.map +1 -0
  649. package/dist/ism/utils.test.js +144 -0
  650. package/dist/ism/utils.test.js.map +1 -0
  651. package/dist/mailbox/serialization.d.ts +41 -0
  652. package/dist/mailbox/serialization.d.ts.map +1 -0
  653. package/dist/mailbox/serialization.js +104 -0
  654. package/dist/mailbox/serialization.js.map +1 -0
  655. package/dist/metadata/ChainMetadataManager.d.ts +233 -0
  656. package/dist/metadata/ChainMetadataManager.d.ts.map +1 -0
  657. package/dist/metadata/ChainMetadataManager.js +424 -0
  658. package/dist/metadata/ChainMetadataManager.js.map +1 -0
  659. package/dist/metadata/ChainMetadataManager.test.d.ts +2 -0
  660. package/dist/metadata/ChainMetadataManager.test.d.ts.map +1 -0
  661. package/dist/metadata/ChainMetadataManager.test.js +233 -0
  662. package/dist/metadata/ChainMetadataManager.test.js.map +1 -0
  663. package/dist/metadata/ChainMetadataResolver.d.ts +14 -0
  664. package/dist/metadata/ChainMetadataResolver.d.ts.map +1 -0
  665. package/dist/metadata/ChainMetadataResolver.js +57 -0
  666. package/dist/metadata/ChainMetadataResolver.js.map +1 -0
  667. package/dist/metadata/ChainMetadataResolver.test.d.ts +2 -0
  668. package/dist/metadata/ChainMetadataResolver.test.d.ts.map +1 -0
  669. package/dist/metadata/ChainMetadataResolver.test.js +87 -0
  670. package/dist/metadata/ChainMetadataResolver.test.js.map +1 -0
  671. package/dist/metadata/agentConfig.d.ts +1529 -0
  672. package/dist/metadata/agentConfig.d.ts.map +1 -0
  673. package/dist/metadata/agentConfig.js +750 -0
  674. package/dist/metadata/agentConfig.js.map +1 -0
  675. package/dist/metadata/agentConfig.test.d.ts +2 -0
  676. package/dist/metadata/agentConfig.test.d.ts.map +1 -0
  677. package/dist/metadata/agentConfig.test.js +457 -0
  678. package/dist/metadata/agentConfig.test.js.map +1 -0
  679. package/dist/metadata/blockExplorer.d.ts +11 -0
  680. package/dist/metadata/blockExplorer.d.ts.map +1 -0
  681. package/dist/metadata/blockExplorer.js +123 -0
  682. package/dist/metadata/blockExplorer.js.map +1 -0
  683. package/dist/metadata/blockExplorer.test.d.ts +2 -0
  684. package/dist/metadata/blockExplorer.test.d.ts.map +1 -0
  685. package/dist/metadata/blockExplorer.test.js +326 -0
  686. package/dist/metadata/blockExplorer.test.js.map +1 -0
  687. package/dist/metadata/chainIdUtils.d.ts +8 -0
  688. package/dist/metadata/chainIdUtils.d.ts.map +1 -0
  689. package/dist/metadata/chainIdUtils.js +33 -0
  690. package/dist/metadata/chainIdUtils.js.map +1 -0
  691. package/dist/metadata/chainIdUtils.test.d.ts +2 -0
  692. package/dist/metadata/chainIdUtils.test.d.ts.map +1 -0
  693. package/dist/metadata/chainIdUtils.test.js +45 -0
  694. package/dist/metadata/chainIdUtils.test.js.map +1 -0
  695. package/dist/metadata/chainMetadata.test.d.ts +2 -0
  696. package/dist/metadata/chainMetadata.test.d.ts.map +1 -0
  697. package/dist/metadata/chainMetadata.test.js +130 -0
  698. package/dist/metadata/chainMetadata.test.js.map +1 -0
  699. package/dist/metadata/chainMetadataConversion.d.ts +11 -0
  700. package/dist/metadata/chainMetadataConversion.d.ts.map +1 -0
  701. package/dist/metadata/chainMetadataConversion.js +119 -0
  702. package/dist/metadata/chainMetadataConversion.js.map +1 -0
  703. package/dist/metadata/chainMetadataTypes.d.ts +338 -0
  704. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -0
  705. package/dist/metadata/chainMetadataTypes.js +373 -0
  706. package/dist/metadata/chainMetadataTypes.js.map +1 -0
  707. package/dist/metadata/customZodTypes.d.ts +44 -0
  708. package/dist/metadata/customZodTypes.d.ts.map +1 -0
  709. package/dist/metadata/customZodTypes.js +65 -0
  710. package/dist/metadata/customZodTypes.js.map +1 -0
  711. package/dist/metadata/deploymentArtifacts.d.ts +10 -0
  712. package/dist/metadata/deploymentArtifacts.d.ts.map +1 -0
  713. package/dist/metadata/deploymentArtifacts.js +10 -0
  714. package/dist/metadata/deploymentArtifacts.js.map +1 -0
  715. package/dist/metadata/forwardCompatibleEnum.test.d.ts +2 -0
  716. package/dist/metadata/forwardCompatibleEnum.test.d.ts.map +1 -0
  717. package/dist/metadata/forwardCompatibleEnum.test.js +299 -0
  718. package/dist/metadata/forwardCompatibleEnum.test.js.map +1 -0
  719. package/dist/metadata/matchingList.d.ts +25 -0
  720. package/dist/metadata/matchingList.d.ts.map +1 -0
  721. package/dist/metadata/matchingList.js +22 -0
  722. package/dist/metadata/matchingList.js.map +1 -0
  723. package/dist/metadata/warpRouteConfig.d.ts +83 -0
  724. package/dist/metadata/warpRouteConfig.d.ts.map +1 -0
  725. package/dist/metadata/warpRouteConfig.js +22 -0
  726. package/dist/metadata/warpRouteConfig.js.map +1 -0
  727. package/dist/middleware/account/InterchainAccount.d.ts +47 -0
  728. package/dist/middleware/account/InterchainAccount.d.ts.map +1 -0
  729. package/dist/middleware/account/InterchainAccount.js +324 -0
  730. package/dist/middleware/account/InterchainAccount.js.map +1 -0
  731. package/dist/middleware/account/InterchainAccount.test.d.ts +2 -0
  732. package/dist/middleware/account/InterchainAccount.test.d.ts.map +1 -0
  733. package/dist/middleware/account/InterchainAccount.test.js +733 -0
  734. package/dist/middleware/account/InterchainAccount.test.js.map +1 -0
  735. package/dist/middleware/account/InterchainAccountChecker.d.ts +7 -0
  736. package/dist/middleware/account/InterchainAccountChecker.d.ts.map +1 -0
  737. package/dist/middleware/account/InterchainAccountChecker.js +4 -0
  738. package/dist/middleware/account/InterchainAccountChecker.js.map +1 -0
  739. package/dist/middleware/account/InterchainAccountDeployer.d.ts +14 -0
  740. package/dist/middleware/account/InterchainAccountDeployer.d.ts.map +1 -0
  741. package/dist/middleware/account/InterchainAccountDeployer.js +68 -0
  742. package/dist/middleware/account/InterchainAccountDeployer.js.map +1 -0
  743. package/dist/middleware/account/accounts.hardhat-test.d.ts +2 -0
  744. package/dist/middleware/account/accounts.hardhat-test.d.ts.map +1 -0
  745. package/dist/middleware/account/accounts.hardhat-test.js +240 -0
  746. package/dist/middleware/account/accounts.hardhat-test.js.map +1 -0
  747. package/dist/middleware/account/contracts.d.ts +6 -0
  748. package/dist/middleware/account/contracts.d.ts.map +1 -0
  749. package/dist/middleware/account/contracts.js +5 -0
  750. package/dist/middleware/account/contracts.js.map +1 -0
  751. package/dist/middleware/account/icaCalls.d.ts +78 -0
  752. package/dist/middleware/account/icaCalls.d.ts.map +1 -0
  753. package/dist/middleware/account/icaCalls.js +75 -0
  754. package/dist/middleware/account/icaCalls.js.map +1 -0
  755. package/dist/middleware/account/types.d.ts +40 -0
  756. package/dist/middleware/account/types.d.ts.map +1 -0
  757. package/dist/middleware/account/types.js +25 -0
  758. package/dist/middleware/account/types.js.map +1 -0
  759. package/dist/middleware/query/InterchainQuery.d.ts +10 -0
  760. package/dist/middleware/query/InterchainQuery.d.ts.map +1 -0
  761. package/dist/middleware/query/InterchainQuery.js +13 -0
  762. package/dist/middleware/query/InterchainQuery.js.map +1 -0
  763. package/dist/middleware/query/InterchainQueryChecker.d.ts +7 -0
  764. package/dist/middleware/query/InterchainQueryChecker.d.ts.map +1 -0
  765. package/dist/middleware/query/InterchainQueryChecker.js +4 -0
  766. package/dist/middleware/query/InterchainQueryChecker.js.map +1 -0
  767. package/dist/middleware/query/InterchainQueryDeployer.d.ts +17 -0
  768. package/dist/middleware/query/InterchainQueryDeployer.d.ts.map +1 -0
  769. package/dist/middleware/query/InterchainQueryDeployer.js +35 -0
  770. package/dist/middleware/query/InterchainQueryDeployer.js.map +1 -0
  771. package/dist/middleware/query/contracts.d.ts +8 -0
  772. package/dist/middleware/query/contracts.d.ts.map +1 -0
  773. package/dist/middleware/query/contracts.js +7 -0
  774. package/dist/middleware/query/contracts.js.map +1 -0
  775. package/dist/middleware/query/queries.hardhat-test.d.ts +2 -0
  776. package/dist/middleware/query/queries.hardhat-test.d.ts.map +1 -0
  777. package/dist/middleware/query/queries.hardhat-test.js +70 -0
  778. package/dist/middleware/query/queries.hardhat-test.js.map +1 -0
  779. package/dist/predicate/PredicateApiClient.d.ts +35 -0
  780. package/dist/predicate/PredicateApiClient.d.ts.map +1 -0
  781. package/dist/predicate/PredicateApiClient.js +66 -0
  782. package/dist/predicate/PredicateApiClient.js.map +1 -0
  783. package/dist/predicate/PredicateApiClient.test.d.ts +2 -0
  784. package/dist/predicate/PredicateApiClient.test.d.ts.map +1 -0
  785. package/dist/predicate/PredicateApiClient.test.js +108 -0
  786. package/dist/predicate/PredicateApiClient.test.js.map +1 -0
  787. package/dist/predicate/PredicateDeployer.d.ts +56 -0
  788. package/dist/predicate/PredicateDeployer.d.ts.map +1 -0
  789. package/dist/predicate/PredicateDeployer.hardhat-test.d.ts +2 -0
  790. package/dist/predicate/PredicateDeployer.hardhat-test.d.ts.map +1 -0
  791. package/dist/predicate/PredicateDeployer.hardhat-test.js +209 -0
  792. package/dist/predicate/PredicateDeployer.hardhat-test.js.map +1 -0
  793. package/dist/predicate/PredicateDeployer.js +218 -0
  794. package/dist/predicate/PredicateDeployer.js.map +1 -0
  795. package/dist/providers/MinimalProviderRegistry.d.ts +41 -0
  796. package/dist/providers/MinimalProviderRegistry.d.ts.map +1 -0
  797. package/dist/providers/MinimalProviderRegistry.js +122 -0
  798. package/dist/providers/MinimalProviderRegistry.js.map +1 -0
  799. package/dist/providers/MultiProtocolProvider.d.ts +23 -0
  800. package/dist/providers/MultiProtocolProvider.d.ts.map +1 -0
  801. package/dist/providers/MultiProtocolProvider.js +64 -0
  802. package/dist/providers/MultiProtocolProvider.js.map +1 -0
  803. package/dist/providers/MultiProtocolProvider.test.d.ts +2 -0
  804. package/dist/providers/MultiProtocolProvider.test.d.ts.map +1 -0
  805. package/dist/providers/MultiProtocolProvider.test.js +126 -0
  806. package/dist/providers/MultiProtocolProvider.test.js.map +1 -0
  807. package/dist/providers/MultiProvider.d.ts +196 -0
  808. package/dist/providers/MultiProvider.d.ts.map +1 -0
  809. package/dist/providers/MultiProvider.js +553 -0
  810. package/dist/providers/MultiProvider.js.map +1 -0
  811. package/dist/providers/MultiProvider.test.d.ts +2 -0
  812. package/dist/providers/MultiProvider.test.d.ts.map +1 -0
  813. package/dist/providers/MultiProvider.test.js +357 -0
  814. package/dist/providers/MultiProvider.test.js.map +1 -0
  815. package/dist/providers/MultiProviderAdapter.d.ts +61 -0
  816. package/dist/providers/MultiProviderAdapter.d.ts.map +1 -0
  817. package/dist/providers/MultiProviderAdapter.js +164 -0
  818. package/dist/providers/MultiProviderAdapter.js.map +1 -0
  819. package/dist/providers/ProviderType.d.ts +319 -0
  820. package/dist/providers/ProviderType.d.ts.map +1 -0
  821. package/dist/providers/ProviderType.js +27 -0
  822. package/dist/providers/ProviderType.js.map +1 -0
  823. package/dist/providers/SeismicSigner.d.ts +78 -0
  824. package/dist/providers/SeismicSigner.d.ts.map +1 -0
  825. package/dist/providers/SeismicSigner.js +265 -0
  826. package/dist/providers/SeismicSigner.js.map +1 -0
  827. package/dist/providers/SeismicSigner.test.d.ts +2 -0
  828. package/dist/providers/SeismicSigner.test.d.ts.map +1 -0
  829. package/dist/providers/SeismicSigner.test.js +561 -0
  830. package/dist/providers/SeismicSigner.test.js.map +1 -0
  831. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.d.ts +25 -0
  832. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.d.ts.map +1 -0
  833. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js +139 -0
  834. package/dist/providers/SmartProvider/HyperlaneEtherscanProvider.js.map +1 -0
  835. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.d.ts +61 -0
  836. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.d.ts.map +1 -0
  837. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.js +248 -0
  838. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.js.map +1 -0
  839. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.d.ts +2 -0
  840. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.d.ts.map +1 -0
  841. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.js +516 -0
  842. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.test.js.map +1 -0
  843. package/dist/providers/SmartProvider/ProviderMethods.d.ts +24 -0
  844. package/dist/providers/SmartProvider/ProviderMethods.d.ts.map +1 -0
  845. package/dist/providers/SmartProvider/ProviderMethods.js +32 -0
  846. package/dist/providers/SmartProvider/ProviderMethods.js.map +1 -0
  847. package/dist/providers/SmartProvider/SmartProvider.d.ts +58 -0
  848. package/dist/providers/SmartProvider/SmartProvider.d.ts.map +1 -0
  849. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts +2 -0
  850. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.d.ts.map +1 -0
  851. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js +164 -0
  852. package/dist/providers/SmartProvider/SmartProvider.emptyResponse.test.js.map +1 -0
  853. package/dist/providers/SmartProvider/SmartProvider.foundry-test.d.ts +2 -0
  854. package/dist/providers/SmartProvider/SmartProvider.foundry-test.d.ts.map +1 -0
  855. package/dist/providers/SmartProvider/SmartProvider.foundry-test.js +173 -0
  856. package/dist/providers/SmartProvider/SmartProvider.foundry-test.js.map +1 -0
  857. package/dist/providers/SmartProvider/SmartProvider.js +560 -0
  858. package/dist/providers/SmartProvider/SmartProvider.js.map +1 -0
  859. package/dist/providers/SmartProvider/SmartProvider.rawRead.test.d.ts +2 -0
  860. package/dist/providers/SmartProvider/SmartProvider.rawRead.test.d.ts.map +1 -0
  861. package/dist/providers/SmartProvider/SmartProvider.rawRead.test.js +90 -0
  862. package/dist/providers/SmartProvider/SmartProvider.rawRead.test.js.map +1 -0
  863. package/dist/providers/SmartProvider/SmartProvider.test.d.ts +2 -0
  864. package/dist/providers/SmartProvider/SmartProvider.test.d.ts.map +1 -0
  865. package/dist/providers/SmartProvider/SmartProvider.test.js +1119 -0
  866. package/dist/providers/SmartProvider/SmartProvider.test.js.map +1 -0
  867. package/dist/providers/SmartProvider/jsonRpcError.d.ts +13 -0
  868. package/dist/providers/SmartProvider/jsonRpcError.d.ts.map +1 -0
  869. package/dist/providers/SmartProvider/jsonRpcError.js +86 -0
  870. package/dist/providers/SmartProvider/jsonRpcError.js.map +1 -0
  871. package/dist/providers/SmartProvider/jsonRpcError.test.d.ts +2 -0
  872. package/dist/providers/SmartProvider/jsonRpcError.test.d.ts.map +1 -0
  873. package/dist/providers/SmartProvider/jsonRpcError.test.js +46 -0
  874. package/dist/providers/SmartProvider/jsonRpcError.test.js.map +1 -0
  875. package/dist/providers/SmartProvider/logFilters.d.ts +10 -0
  876. package/dist/providers/SmartProvider/logFilters.d.ts.map +1 -0
  877. package/dist/providers/SmartProvider/logFilters.js +31 -0
  878. package/dist/providers/SmartProvider/logFilters.js.map +1 -0
  879. package/dist/providers/SmartProvider/types.d.ts +50 -0
  880. package/dist/providers/SmartProvider/types.d.ts.map +1 -0
  881. package/dist/providers/SmartProvider/types.js +7 -0
  882. package/dist/providers/SmartProvider/types.js.map +1 -0
  883. package/dist/providers/builders/aleo.browser.d.ts +13 -0
  884. package/dist/providers/builders/aleo.browser.d.ts.map +1 -0
  885. package/dist/providers/builders/aleo.browser.js +54 -0
  886. package/dist/providers/builders/aleo.browser.js.map +1 -0
  887. package/dist/providers/builders/aleo.d.ts +4 -0
  888. package/dist/providers/builders/aleo.d.ts.map +1 -0
  889. package/dist/providers/builders/aleo.js +7 -0
  890. package/dist/providers/builders/aleo.js.map +1 -0
  891. package/dist/providers/builders/aleo.test.d.ts +2 -0
  892. package/dist/providers/builders/aleo.test.d.ts.map +1 -0
  893. package/dist/providers/builders/aleo.test.js +99 -0
  894. package/dist/providers/builders/aleo.test.js.map +1 -0
  895. package/dist/providers/builders/cosmos.d.ts +6 -0
  896. package/dist/providers/builders/cosmos.d.ts.map +1 -0
  897. package/dist/providers/builders/cosmos.js +30 -0
  898. package/dist/providers/builders/cosmos.js.map +1 -0
  899. package/dist/providers/builders/ethersV5.d.ts +7 -0
  900. package/dist/providers/builders/ethersV5.d.ts.map +1 -0
  901. package/dist/providers/builders/ethersV5.js +38 -0
  902. package/dist/providers/builders/ethersV5.js.map +1 -0
  903. package/dist/providers/builders/ethersV5.test.d.ts +2 -0
  904. package/dist/providers/builders/ethersV5.test.d.ts.map +1 -0
  905. package/dist/providers/builders/ethersV5.test.js +77 -0
  906. package/dist/providers/builders/ethersV5.test.js.map +1 -0
  907. package/dist/providers/builders/radix.browser.d.ts +19 -0
  908. package/dist/providers/builders/radix.browser.d.ts.map +1 -0
  909. package/dist/providers/builders/radix.browser.js +47 -0
  910. package/dist/providers/builders/radix.browser.js.map +1 -0
  911. package/dist/providers/builders/radix.d.ts +4 -0
  912. package/dist/providers/builders/radix.d.ts.map +1 -0
  913. package/dist/providers/builders/radix.gateway.test.d.ts +2 -0
  914. package/dist/providers/builders/radix.gateway.test.d.ts.map +1 -0
  915. package/dist/providers/builders/radix.gateway.test.js +39 -0
  916. package/dist/providers/builders/radix.gateway.test.js.map +1 -0
  917. package/dist/providers/builders/radix.js +17 -0
  918. package/dist/providers/builders/radix.js.map +1 -0
  919. package/dist/providers/builders/radix.test.d.ts +2 -0
  920. package/dist/providers/builders/radix.test.d.ts.map +1 -0
  921. package/dist/providers/builders/radix.test.js +82 -0
  922. package/dist/providers/builders/radix.test.js.map +1 -0
  923. package/dist/providers/builders/solana.d.ts +4 -0
  924. package/dist/providers/builders/solana.d.ts.map +1 -0
  925. package/dist/providers/builders/solana.js +12 -0
  926. package/dist/providers/builders/solana.js.map +1 -0
  927. package/dist/providers/builders/starknet.d.ts +4 -0
  928. package/dist/providers/builders/starknet.d.ts.map +1 -0
  929. package/dist/providers/builders/starknet.js +20 -0
  930. package/dist/providers/builders/starknet.js.map +1 -0
  931. package/dist/providers/builders/tron.d.ts +10 -0
  932. package/dist/providers/builders/tron.d.ts.map +1 -0
  933. package/dist/providers/builders/tron.js +21 -0
  934. package/dist/providers/builders/tron.js.map +1 -0
  935. package/dist/providers/builders/types.d.ts +6 -0
  936. package/dist/providers/builders/types.d.ts.map +1 -0
  937. package/dist/providers/builders/types.js +2 -0
  938. package/dist/providers/builders/types.js.map +1 -0
  939. package/dist/providers/builders/viem.d.ts +4 -0
  940. package/dist/providers/builders/viem.d.ts.map +1 -0
  941. package/dist/providers/builders/viem.js +25 -0
  942. package/dist/providers/builders/viem.js.map +1 -0
  943. package/dist/providers/builders/zksync.d.ts +7 -0
  944. package/dist/providers/builders/zksync.d.ts.map +1 -0
  945. package/dist/providers/builders/zksync.js +14 -0
  946. package/dist/providers/builders/zksync.js.map +1 -0
  947. package/dist/providers/defaultProviderBuilderMaps.d.ts +7 -0
  948. package/dist/providers/defaultProviderBuilderMaps.d.ts.map +1 -0
  949. package/dist/providers/defaultProviderBuilderMaps.js +36 -0
  950. package/dist/providers/defaultProviderBuilderMaps.js.map +1 -0
  951. package/dist/providers/explorerHealthTest.d.ts +4 -0
  952. package/dist/providers/explorerHealthTest.d.ts.map +1 -0
  953. package/dist/providers/explorerHealthTest.js +53 -0
  954. package/dist/providers/explorerHealthTest.js.map +1 -0
  955. package/dist/providers/providerBuilders.d.ts +12 -0
  956. package/dist/providers/providerBuilders.d.ts.map +1 -0
  957. package/dist/providers/providerBuilders.js +11 -0
  958. package/dist/providers/providerBuilders.js.map +1 -0
  959. package/dist/providers/rpcHealthTest.d.ts +11 -0
  960. package/dist/providers/rpcHealthTest.d.ts.map +1 -0
  961. package/dist/providers/rpcHealthTest.js +104 -0
  962. package/dist/providers/rpcHealthTest.js.map +1 -0
  963. package/dist/providers/runtime/evm.d.ts +3 -0
  964. package/dist/providers/runtime/evm.d.ts.map +1 -0
  965. package/dist/providers/runtime/evm.js +11 -0
  966. package/dist/providers/runtime/evm.js.map +1 -0
  967. package/dist/providers/runtime/evmLike.d.ts +3 -0
  968. package/dist/providers/runtime/evmLike.d.ts.map +1 -0
  969. package/dist/providers/runtime/evmLike.js +7 -0
  970. package/dist/providers/runtime/evmLike.js.map +1 -0
  971. package/dist/providers/runtime/evmLike.test.d.ts +2 -0
  972. package/dist/providers/runtime/evmLike.test.d.ts.map +1 -0
  973. package/dist/providers/runtime/evmLike.test.js +22 -0
  974. package/dist/providers/runtime/evmLike.test.js.map +1 -0
  975. package/dist/providers/runtime/tron.d.ts +3 -0
  976. package/dist/providers/runtime/tron.d.ts.map +1 -0
  977. package/dist/providers/runtime/tron.js +6 -0
  978. package/dist/providers/runtime/tron.js.map +1 -0
  979. package/dist/providers/transactionFeeEstimators.d.ts +79 -0
  980. package/dist/providers/transactionFeeEstimators.d.ts.map +1 -0
  981. package/dist/providers/transactionFeeEstimators.js +317 -0
  982. package/dist/providers/transactionFeeEstimators.js.map +1 -0
  983. package/dist/providers/transactionFeeEstimators.test.d.ts +2 -0
  984. package/dist/providers/transactionFeeEstimators.test.d.ts.map +1 -0
  985. package/dist/providers/transactionFeeEstimators.test.js +394 -0
  986. package/dist/providers/transactionFeeEstimators.test.js.map +1 -0
  987. package/dist/providers/transactions/submitter/IcaTxSubmitter.d.ts +25 -0
  988. package/dist/providers/transactions/submitter/IcaTxSubmitter.d.ts.map +1 -0
  989. package/dist/providers/transactions/submitter/IcaTxSubmitter.js +113 -0
  990. package/dist/providers/transactions/submitter/IcaTxSubmitter.js.map +1 -0
  991. package/dist/providers/transactions/submitter/IcaTxSubmitter.test.d.ts +2 -0
  992. package/dist/providers/transactions/submitter/IcaTxSubmitter.test.d.ts.map +1 -0
  993. package/dist/providers/transactions/submitter/IcaTxSubmitter.test.js +122 -0
  994. package/dist/providers/transactions/submitter/IcaTxSubmitter.test.js.map +1 -0
  995. package/dist/providers/transactions/submitter/TxSubmitterInterface.d.ts +19 -0
  996. package/dist/providers/transactions/submitter/TxSubmitterInterface.d.ts.map +1 -0
  997. package/dist/providers/transactions/submitter/TxSubmitterInterface.js +2 -0
  998. package/dist/providers/transactions/submitter/TxSubmitterInterface.js.map +1 -0
  999. package/dist/providers/transactions/submitter/TxSubmitterTypes.d.ts +9 -0
  1000. package/dist/providers/transactions/submitter/TxSubmitterTypes.d.ts.map +1 -0
  1001. package/dist/providers/transactions/submitter/TxSubmitterTypes.js +10 -0
  1002. package/dist/providers/transactions/submitter/TxSubmitterTypes.js.map +1 -0
  1003. package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.d.ts +39 -0
  1004. package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.d.ts.map +1 -0
  1005. package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.js +48 -0
  1006. package/dist/providers/transactions/submitter/builder/TxSubmitterBuilder.js.map +1 -0
  1007. package/dist/providers/transactions/submitter/builder/types.d.ts +69 -0
  1008. package/dist/providers/transactions/submitter/builder/types.d.ts.map +1 -0
  1009. package/dist/providers/transactions/submitter/builder/types.js +94 -0
  1010. package/dist/providers/transactions/submitter/builder/types.js.map +1 -0
  1011. package/dist/providers/transactions/submitter/builder/types.test.d.ts +2 -0
  1012. package/dist/providers/transactions/submitter/builder/types.test.d.ts.map +1 -0
  1013. package/dist/providers/transactions/submitter/builder/types.test.js +314 -0
  1014. package/dist/providers/transactions/submitter/builder/types.test.js.map +1 -0
  1015. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.d.ts +33 -0
  1016. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.d.ts.map +1 -0
  1017. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.js +43 -0
  1018. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxBuilder.js.map +1 -0
  1019. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.d.ts +31 -0
  1020. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.d.ts.map +1 -0
  1021. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.js +90 -0
  1022. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.js.map +1 -0
  1023. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.d.ts +2 -0
  1024. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.d.ts.map +1 -0
  1025. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.js +145 -0
  1026. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.js.map +1 -0
  1027. package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.d.ts +15 -0
  1028. package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.d.ts.map +1 -0
  1029. package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.js +26 -0
  1030. package/dist/providers/transactions/submitter/ethersV5/EV5ImpersonatedAccountTxSubmitter.js.map +1 -0
  1031. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.d.ts +29 -0
  1032. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.d.ts.map +1 -0
  1033. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.js +68 -0
  1034. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.js.map +1 -0
  1035. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.d.ts +2 -0
  1036. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.d.ts.map +1 -0
  1037. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.js +125 -0
  1038. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.js.map +1 -0
  1039. package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.d.ts +22 -0
  1040. package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.d.ts.map +1 -0
  1041. package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.js +85 -0
  1042. package/dist/providers/transactions/submitter/ethersV5/EV5TimelockSubmitter.js.map +1 -0
  1043. package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.d.ts +10 -0
  1044. package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.d.ts.map +1 -0
  1045. package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.js +2 -0
  1046. package/dist/providers/transactions/submitter/ethersV5/EV5TxSubmitterInterface.js.map +1 -0
  1047. package/dist/providers/transactions/submitter/ethersV5/types.d.ts +104 -0
  1048. package/dist/providers/transactions/submitter/ethersV5/types.d.ts.map +1 -0
  1049. package/dist/providers/transactions/submitter/ethersV5/types.js +72 -0
  1050. package/dist/providers/transactions/submitter/ethersV5/types.js.map +1 -0
  1051. package/dist/providers/transactions/submitter/ethersV5/types.test.d.ts +2 -0
  1052. package/dist/providers/transactions/submitter/ethersV5/types.test.d.ts.map +1 -0
  1053. package/dist/providers/transactions/submitter/ethersV5/types.test.js +57 -0
  1054. package/dist/providers/transactions/submitter/ethersV5/types.test.js.map +1 -0
  1055. package/dist/providers/transactions/submitter/submitterBuilderGetter.d.ts +31 -0
  1056. package/dist/providers/transactions/submitter/submitterBuilderGetter.d.ts.map +1 -0
  1057. package/dist/providers/transactions/submitter/submitterBuilderGetter.js +97 -0
  1058. package/dist/providers/transactions/submitter/submitterBuilderGetter.js.map +1 -0
  1059. package/dist/providers/transactions/submitter/submitterBuilderGetter.test.d.ts +2 -0
  1060. package/dist/providers/transactions/submitter/submitterBuilderGetter.test.d.ts.map +1 -0
  1061. package/dist/providers/transactions/submitter/submitterBuilderGetter.test.js +38 -0
  1062. package/dist/providers/transactions/submitter/submitterBuilderGetter.test.js.map +1 -0
  1063. package/dist/providers/transactions/submitter/types.d.ts +37 -0
  1064. package/dist/providers/transactions/submitter/types.d.ts.map +1 -0
  1065. package/dist/providers/transactions/submitter/types.js +3 -0
  1066. package/dist/providers/transactions/submitter/types.js.map +1 -0
  1067. package/dist/providers/transactions/types.d.ts +9 -0
  1068. package/dist/providers/transactions/types.d.ts.map +1 -0
  1069. package/dist/providers/transactions/types.js +9 -0
  1070. package/dist/providers/transactions/types.js.map +1 -0
  1071. package/dist/providers/transactions/types.test.d.ts +2 -0
  1072. package/dist/providers/transactions/types.test.d.ts.map +1 -0
  1073. package/dist/providers/transactions/types.test.js +37 -0
  1074. package/dist/providers/transactions/types.test.js.map +1 -0
  1075. package/dist/quote/Eip712Signable.d.ts +25 -0
  1076. package/dist/quote/Eip712Signable.d.ts.map +1 -0
  1077. package/dist/quote/Eip712Signable.js +27 -0
  1078. package/dist/quote/Eip712Signable.js.map +1 -0
  1079. package/dist/quote/EvmPrivateKeyQuoteSigner.d.ts +15 -0
  1080. package/dist/quote/EvmPrivateKeyQuoteSigner.d.ts.map +1 -0
  1081. package/dist/quote/EvmPrivateKeyQuoteSigner.js +24 -0
  1082. package/dist/quote/EvmPrivateKeyQuoteSigner.js.map +1 -0
  1083. package/dist/quote/EvmPrivateKeyQuoteSigner.test.d.ts +2 -0
  1084. package/dist/quote/EvmPrivateKeyQuoteSigner.test.d.ts.map +1 -0
  1085. package/dist/quote/EvmPrivateKeyQuoteSigner.test.js +23 -0
  1086. package/dist/quote/EvmPrivateKeyQuoteSigner.test.js.map +1 -0
  1087. package/dist/quote/EvmQuoteArtifactManager.d.ts +20 -0
  1088. package/dist/quote/EvmQuoteArtifactManager.d.ts.map +1 -0
  1089. package/dist/quote/EvmQuoteArtifactManager.js +32 -0
  1090. package/dist/quote/EvmQuoteArtifactManager.js.map +1 -0
  1091. package/dist/quote/EvmQuoteReader.d.ts +24 -0
  1092. package/dist/quote/EvmQuoteReader.d.ts.map +1 -0
  1093. package/dist/quote/EvmQuoteReader.hardhat-test.d.ts +2 -0
  1094. package/dist/quote/EvmQuoteReader.hardhat-test.d.ts.map +1 -0
  1095. package/dist/quote/EvmQuoteReader.hardhat-test.js +157 -0
  1096. package/dist/quote/EvmQuoteReader.hardhat-test.js.map +1 -0
  1097. package/dist/quote/EvmQuoteReader.js +91 -0
  1098. package/dist/quote/EvmQuoteReader.js.map +1 -0
  1099. package/dist/quote/EvmQuoteWriter.d.ts +16 -0
  1100. package/dist/quote/EvmQuoteWriter.d.ts.map +1 -0
  1101. package/dist/quote/EvmQuoteWriter.hardhat-test.d.ts +2 -0
  1102. package/dist/quote/EvmQuoteWriter.hardhat-test.d.ts.map +1 -0
  1103. package/dist/quote/EvmQuoteWriter.hardhat-test.js +238 -0
  1104. package/dist/quote/EvmQuoteWriter.hardhat-test.js.map +1 -0
  1105. package/dist/quote/EvmQuoteWriter.js +55 -0
  1106. package/dist/quote/EvmQuoteWriter.js.map +1 -0
  1107. package/dist/quote/WarpSignedQuoteEip712.d.ts +22 -0
  1108. package/dist/quote/WarpSignedQuoteEip712.d.ts.map +1 -0
  1109. package/dist/quote/WarpSignedQuoteEip712.js +48 -0
  1110. package/dist/quote/WarpSignedQuoteEip712.js.map +1 -0
  1111. package/dist/quoted-calls/EvmQuotedTransferProvider.d.ts +63 -0
  1112. package/dist/quoted-calls/EvmQuotedTransferProvider.d.ts.map +1 -0
  1113. package/dist/quoted-calls/EvmQuotedTransferProvider.js +207 -0
  1114. package/dist/quoted-calls/EvmQuotedTransferProvider.js.map +1 -0
  1115. package/dist/quoted-calls/QuotedTransferProvider.d.ts +50 -0
  1116. package/dist/quoted-calls/QuotedTransferProvider.d.ts.map +1 -0
  1117. package/dist/quoted-calls/QuotedTransferProvider.js +2 -0
  1118. package/dist/quoted-calls/QuotedTransferProvider.js.map +1 -0
  1119. package/dist/quoted-calls/SealevelQuotedTransferProvider.d.ts +89 -0
  1120. package/dist/quoted-calls/SealevelQuotedTransferProvider.d.ts.map +1 -0
  1121. package/dist/quoted-calls/SealevelQuotedTransferProvider.js +472 -0
  1122. package/dist/quoted-calls/SealevelQuotedTransferProvider.js.map +1 -0
  1123. package/dist/quoted-calls/SealevelQuotedTransferProvider.test.d.ts +2 -0
  1124. package/dist/quoted-calls/SealevelQuotedTransferProvider.test.d.ts.map +1 -0
  1125. package/dist/quoted-calls/SealevelQuotedTransferProvider.test.js +502 -0
  1126. package/dist/quoted-calls/SealevelQuotedTransferProvider.test.js.map +1 -0
  1127. package/dist/quoted-calls/assertHex.d.ts +6 -0
  1128. package/dist/quoted-calls/assertHex.d.ts.map +1 -0
  1129. package/dist/quoted-calls/assertHex.js +13 -0
  1130. package/dist/quoted-calls/assertHex.js.map +1 -0
  1131. package/dist/quoted-calls/builder.d.ts +52 -0
  1132. package/dist/quoted-calls/builder.d.ts.map +1 -0
  1133. package/dist/quoted-calls/builder.js +161 -0
  1134. package/dist/quoted-calls/builder.js.map +1 -0
  1135. package/dist/quoted-calls/builder.test.d.ts +2 -0
  1136. package/dist/quoted-calls/builder.test.d.ts.map +1 -0
  1137. package/dist/quoted-calls/builder.test.js +193 -0
  1138. package/dist/quoted-calls/builder.test.js.map +1 -0
  1139. package/dist/quoted-calls/client.d.ts +69 -0
  1140. package/dist/quoted-calls/client.d.ts.map +1 -0
  1141. package/dist/quoted-calls/client.js +205 -0
  1142. package/dist/quoted-calls/client.js.map +1 -0
  1143. package/dist/quoted-calls/client.v2.test.d.ts +2 -0
  1144. package/dist/quoted-calls/client.v2.test.d.ts.map +1 -0
  1145. package/dist/quoted-calls/client.v2.test.js +346 -0
  1146. package/dist/quoted-calls/client.v2.test.js.map +1 -0
  1147. package/dist/quoted-calls/codec.d.ts +94 -0
  1148. package/dist/quoted-calls/codec.d.ts.map +1 -0
  1149. package/dist/quoted-calls/codec.js +223 -0
  1150. package/dist/quoted-calls/codec.js.map +1 -0
  1151. package/dist/quoted-calls/codec.test.d.ts +2 -0
  1152. package/dist/quoted-calls/codec.test.d.ts.map +1 -0
  1153. package/dist/quoted-calls/codec.test.js +307 -0
  1154. package/dist/quoted-calls/codec.test.js.map +1 -0
  1155. package/dist/quoted-calls/composeSealevelTx.d.ts +26 -0
  1156. package/dist/quoted-calls/composeSealevelTx.d.ts.map +1 -0
  1157. package/dist/quoted-calls/composeSealevelTx.js +45 -0
  1158. package/dist/quoted-calls/composeSealevelTx.js.map +1 -0
  1159. package/dist/quoted-calls/svmDecoder.d.ts +51 -0
  1160. package/dist/quoted-calls/svmDecoder.d.ts.map +1 -0
  1161. package/dist/quoted-calls/svmDecoder.js +26 -0
  1162. package/dist/quoted-calls/svmDecoder.js.map +1 -0
  1163. package/dist/quoted-calls/svmDecoder.test.d.ts +2 -0
  1164. package/dist/quoted-calls/svmDecoder.test.d.ts.map +1 -0
  1165. package/dist/quoted-calls/svmDecoder.test.js +56 -0
  1166. package/dist/quoted-calls/svmDecoder.test.js.map +1 -0
  1167. package/dist/quoted-calls/types.d.ts +176 -0
  1168. package/dist/quoted-calls/types.d.ts.map +1 -0
  1169. package/dist/quoted-calls/types.js +56 -0
  1170. package/dist/quoted-calls/types.js.map +1 -0
  1171. package/dist/router/EvmRouterReader.d.ts +18 -0
  1172. package/dist/router/EvmRouterReader.d.ts.map +1 -0
  1173. package/dist/router/EvmRouterReader.js +60 -0
  1174. package/dist/router/EvmRouterReader.js.map +1 -0
  1175. package/dist/router/GasRouterDeployer.d.ts +11 -0
  1176. package/dist/router/GasRouterDeployer.d.ts.map +1 -0
  1177. package/dist/router/GasRouterDeployer.js +25 -0
  1178. package/dist/router/GasRouterDeployer.js.map +1 -0
  1179. package/dist/router/HyperlaneRouterChecker.d.ts +19 -0
  1180. package/dist/router/HyperlaneRouterChecker.d.ts.map +1 -0
  1181. package/dist/router/HyperlaneRouterChecker.js +157 -0
  1182. package/dist/router/HyperlaneRouterChecker.js.map +1 -0
  1183. package/dist/router/HyperlaneRouterDeployer.d.ts +18 -0
  1184. package/dist/router/HyperlaneRouterDeployer.d.ts.map +1 -0
  1185. package/dist/router/HyperlaneRouterDeployer.js +88 -0
  1186. package/dist/router/HyperlaneRouterDeployer.js.map +1 -0
  1187. package/dist/router/MultiProtocolRouterApps.d.ts +20 -0
  1188. package/dist/router/MultiProtocolRouterApps.d.ts.map +1 -0
  1189. package/dist/router/MultiProtocolRouterApps.js +43 -0
  1190. package/dist/router/MultiProtocolRouterApps.js.map +1 -0
  1191. package/dist/router/MultiProtocolRouterApps.test.d.ts +2 -0
  1192. package/dist/router/MultiProtocolRouterApps.test.d.ts.map +1 -0
  1193. package/dist/router/MultiProtocolRouterApps.test.js +22 -0
  1194. package/dist/router/MultiProtocolRouterApps.test.js.map +1 -0
  1195. package/dist/router/ProxiedRouterChecker.d.ts +12 -0
  1196. package/dist/router/ProxiedRouterChecker.d.ts.map +1 -0
  1197. package/dist/router/ProxiedRouterChecker.js +34 -0
  1198. package/dist/router/ProxiedRouterChecker.js.map +1 -0
  1199. package/dist/router/ProxiedRouterDeployer.d.ts +35 -0
  1200. package/dist/router/ProxiedRouterDeployer.d.ts.map +1 -0
  1201. package/dist/router/ProxiedRouterDeployer.js +58 -0
  1202. package/dist/router/ProxiedRouterDeployer.js.map +1 -0
  1203. package/dist/router/RouterApps.d.ts +22 -0
  1204. package/dist/router/RouterApps.d.ts.map +1 -0
  1205. package/dist/router/RouterApps.js +39 -0
  1206. package/dist/router/RouterApps.js.map +1 -0
  1207. package/dist/router/adapters/EvmRouterAdapter.d.ts +30 -0
  1208. package/dist/router/adapters/EvmRouterAdapter.d.ts.map +1 -0
  1209. package/dist/router/adapters/EvmRouterAdapter.js +46 -0
  1210. package/dist/router/adapters/EvmRouterAdapter.js.map +1 -0
  1211. package/dist/router/adapters/SealevelRouterAdapter.d.ts +35 -0
  1212. package/dist/router/adapters/SealevelRouterAdapter.d.ts.map +1 -0
  1213. package/dist/router/adapters/SealevelRouterAdapter.js +56 -0
  1214. package/dist/router/adapters/SealevelRouterAdapter.js.map +1 -0
  1215. package/dist/router/adapters/types.d.ts +17 -0
  1216. package/dist/router/adapters/types.d.ts.map +1 -0
  1217. package/dist/router/adapters/types.js +2 -0
  1218. package/dist/router/adapters/types.js.map +1 -0
  1219. package/dist/router/types.d.ts +139 -0
  1220. package/dist/router/types.d.ts.map +1 -0
  1221. package/dist/router/types.js +62 -0
  1222. package/dist/router/types.js.map +1 -0
  1223. package/dist/router/types.test.d.ts +2 -0
  1224. package/dist/router/types.test.d.ts.map +1 -0
  1225. package/dist/router/types.test.js +108 -0
  1226. package/dist/router/types.test.js.map +1 -0
  1227. package/dist/rpc/evm/EvmEventLogsReader.d.ts +91 -0
  1228. package/dist/rpc/evm/EvmEventLogsReader.d.ts.map +1 -0
  1229. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.d.ts +2 -0
  1230. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.d.ts.map +1 -0
  1231. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js +640 -0
  1232. package/dist/rpc/evm/EvmEventLogsReader.hardhat-test.js.map +1 -0
  1233. package/dist/rpc/evm/EvmEventLogsReader.js +246 -0
  1234. package/dist/rpc/evm/EvmEventLogsReader.js.map +1 -0
  1235. package/dist/rpc/evm/EvmEventLogsReader.test.d.ts +2 -0
  1236. package/dist/rpc/evm/EvmEventLogsReader.test.d.ts.map +1 -0
  1237. package/dist/rpc/evm/EvmEventLogsReader.test.js +139 -0
  1238. package/dist/rpc/evm/EvmEventLogsReader.test.js.map +1 -0
  1239. package/dist/rpc/evm/types.d.ts +11 -0
  1240. package/dist/rpc/evm/types.d.ts.map +1 -0
  1241. package/dist/rpc/evm/types.js +2 -0
  1242. package/dist/rpc/evm/types.js.map +1 -0
  1243. package/dist/rpc/evm/utils.d.ts +75 -0
  1244. package/dist/rpc/evm/utils.d.ts.map +1 -0
  1245. package/dist/rpc/evm/utils.hardhat-test.d.ts +2 -0
  1246. package/dist/rpc/evm/utils.hardhat-test.d.ts.map +1 -0
  1247. package/dist/rpc/evm/utils.hardhat-test.js +457 -0
  1248. package/dist/rpc/evm/utils.hardhat-test.js.map +1 -0
  1249. package/dist/rpc/evm/utils.js +338 -0
  1250. package/dist/rpc/evm/utils.js.map +1 -0
  1251. package/dist/rpc/evm/utils.test.d.ts +2 -0
  1252. package/dist/rpc/evm/utils.test.d.ts.map +1 -0
  1253. package/dist/rpc/evm/utils.test.js +636 -0
  1254. package/dist/rpc/evm/utils.test.js.map +1 -0
  1255. package/dist/signers/cosmos/cosmjs.d.ts +17 -0
  1256. package/dist/signers/cosmos/cosmjs.d.ts.map +1 -0
  1257. package/dist/signers/cosmos/cosmjs.js +39 -0
  1258. package/dist/signers/cosmos/cosmjs.js.map +1 -0
  1259. package/dist/signers/evm/ethersv5.d.ts +14 -0
  1260. package/dist/signers/evm/ethersv5.d.ts.map +1 -0
  1261. package/dist/signers/evm/ethersv5.js +36 -0
  1262. package/dist/signers/evm/ethersv5.js.map +1 -0
  1263. package/dist/signers/evm/turnkey.d.ts +91 -0
  1264. package/dist/signers/evm/turnkey.d.ts.map +1 -0
  1265. package/dist/signers/evm/turnkey.js +269 -0
  1266. package/dist/signers/evm/turnkey.js.map +1 -0
  1267. package/dist/signers/evm/turnkey.test.d.ts +2 -0
  1268. package/dist/signers/evm/turnkey.test.d.ts.map +1 -0
  1269. package/dist/signers/evm/turnkey.test.js +240 -0
  1270. package/dist/signers/evm/turnkey.test.js.map +1 -0
  1271. package/dist/signers/radix/radix-toolkit.d.ts +16 -0
  1272. package/dist/signers/radix/radix-toolkit.d.ts.map +1 -0
  1273. package/dist/signers/radix/radix-toolkit.js +34 -0
  1274. package/dist/signers/radix/radix-toolkit.js.map +1 -0
  1275. package/dist/signers/signers.d.ts +17 -0
  1276. package/dist/signers/signers.d.ts.map +1 -0
  1277. package/dist/signers/signers.js +26 -0
  1278. package/dist/signers/signers.js.map +1 -0
  1279. package/dist/signers/starknet/starknetjs.d.ts +14 -0
  1280. package/dist/signers/starknet/starknetjs.d.ts.map +1 -0
  1281. package/dist/signers/starknet/starknetjs.js +38 -0
  1282. package/dist/signers/starknet/starknetjs.js.map +1 -0
  1283. package/dist/signers/svm/solana-web3js.d.ts +89 -0
  1284. package/dist/signers/svm/solana-web3js.d.ts.map +1 -0
  1285. package/dist/signers/svm/solana-web3js.js +247 -0
  1286. package/dist/signers/svm/solana-web3js.js.map +1 -0
  1287. package/dist/signers/svm/solana-web3js.test.d.ts +2 -0
  1288. package/dist/signers/svm/solana-web3js.test.d.ts.map +1 -0
  1289. package/dist/signers/svm/solana-web3js.test.js +61 -0
  1290. package/dist/signers/svm/solana-web3js.test.js.map +1 -0
  1291. package/dist/signers/svm/turnkey.d.ts +49 -0
  1292. package/dist/signers/svm/turnkey.d.ts.map +1 -0
  1293. package/dist/signers/svm/turnkey.js +80 -0
  1294. package/dist/signers/svm/turnkey.js.map +1 -0
  1295. package/dist/signers/turnkeyClient.d.ts +72 -0
  1296. package/dist/signers/turnkeyClient.d.ts.map +1 -0
  1297. package/dist/signers/turnkeyClient.js +121 -0
  1298. package/dist/signers/turnkeyClient.js.map +1 -0
  1299. package/dist/signers/types.d.ts +8 -0
  1300. package/dist/signers/types.d.ts.map +1 -0
  1301. package/dist/signers/types.js +2 -0
  1302. package/dist/signers/types.js.map +1 -0
  1303. package/dist/test/contractDouble.d.ts +8 -0
  1304. package/dist/test/contractDouble.d.ts.map +1 -0
  1305. package/dist/test/contractDouble.js +12 -0
  1306. package/dist/test/contractDouble.js.map +1 -0
  1307. package/dist/test/contractStubs.d.ts +8 -0
  1308. package/dist/test/contractStubs.d.ts.map +1 -0
  1309. package/dist/test/contractStubs.js +15 -0
  1310. package/dist/test/contractStubs.js.map +1 -0
  1311. package/dist/test/errors.d.ts +34 -0
  1312. package/dist/test/errors.d.ts.map +1 -0
  1313. package/dist/test/errors.js +46 -0
  1314. package/dist/test/errors.js.map +1 -0
  1315. package/dist/test/fixtures/warp-route-replay/record.d.ts +2 -0
  1316. package/dist/test/fixtures/warp-route-replay/record.d.ts.map +1 -0
  1317. package/dist/test/fixtures/warp-route-replay/record.js +32 -0
  1318. package/dist/test/fixtures/warp-route-replay/record.js.map +1 -0
  1319. package/dist/test/multiProviderStubs.d.ts +9 -0
  1320. package/dist/test/multiProviderStubs.d.ts.map +1 -0
  1321. package/dist/test/multiProviderStubs.js +31 -0
  1322. package/dist/test/multiProviderStubs.js.map +1 -0
  1323. package/dist/test/replayRpc.d.ts +82 -0
  1324. package/dist/test/replayRpc.d.ts.map +1 -0
  1325. package/dist/test/replayRpc.js +331 -0
  1326. package/dist/test/replayRpc.js.map +1 -0
  1327. package/dist/test/replayScenarios.d.ts +19 -0
  1328. package/dist/test/replayScenarios.d.ts.map +1 -0
  1329. package/dist/test/replayScenarios.js +89 -0
  1330. package/dist/test/replayScenarios.js.map +1 -0
  1331. package/dist/test/testUtils.d.ts +32 -0
  1332. package/dist/test/testUtils.d.ts.map +1 -0
  1333. package/dist/test/testUtils.js +408 -0
  1334. package/dist/test/testUtils.js.map +1 -0
  1335. package/dist/test/testUtils.test.d.ts +2 -0
  1336. package/dist/test/testUtils.test.d.ts.map +1 -0
  1337. package/dist/test/testUtils.test.js +28 -0
  1338. package/dist/test/testUtils.test.js.map +1 -0
  1339. package/dist/timelock/evm/EvmTimelockDeployer.d.ts +12 -0
  1340. package/dist/timelock/evm/EvmTimelockDeployer.d.ts.map +1 -0
  1341. package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.d.ts +2 -0
  1342. package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.d.ts.map +1 -0
  1343. package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.js +210 -0
  1344. package/dist/timelock/evm/EvmTimelockDeployer.hardhat-test.js.map +1 -0
  1345. package/dist/timelock/evm/EvmTimelockDeployer.js +68 -0
  1346. package/dist/timelock/evm/EvmTimelockDeployer.js.map +1 -0
  1347. package/dist/timelock/evm/EvmTimelockReader.d.ts +32 -0
  1348. package/dist/timelock/evm/EvmTimelockReader.d.ts.map +1 -0
  1349. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.d.ts +2 -0
  1350. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.d.ts.map +1 -0
  1351. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js +889 -0
  1352. package/dist/timelock/evm/EvmTimelockReader.hardhat-test.js.map +1 -0
  1353. package/dist/timelock/evm/EvmTimelockReader.js +171 -0
  1354. package/dist/timelock/evm/EvmTimelockReader.js.map +1 -0
  1355. package/dist/timelock/evm/constants.d.ts +6 -0
  1356. package/dist/timelock/evm/constants.d.ts.map +1 -0
  1357. package/dist/timelock/evm/constants.js +7 -0
  1358. package/dist/timelock/evm/constants.js.map +1 -0
  1359. package/dist/timelock/evm/contracts.d.ts +6 -0
  1360. package/dist/timelock/evm/contracts.d.ts.map +1 -0
  1361. package/dist/timelock/evm/contracts.js +5 -0
  1362. package/dist/timelock/evm/contracts.js.map +1 -0
  1363. package/dist/timelock/evm/errors.d.ts +2 -0
  1364. package/dist/timelock/evm/errors.d.ts.map +1 -0
  1365. package/dist/timelock/evm/errors.js +19 -0
  1366. package/dist/timelock/evm/errors.js.map +1 -0
  1367. package/dist/timelock/evm/errors.test.d.ts +2 -0
  1368. package/dist/timelock/evm/errors.test.d.ts.map +1 -0
  1369. package/dist/timelock/evm/errors.test.js +33 -0
  1370. package/dist/timelock/evm/errors.test.js.map +1 -0
  1371. package/dist/timelock/evm/utils.d.ts +4 -0
  1372. package/dist/timelock/evm/utils.d.ts.map +1 -0
  1373. package/dist/timelock/evm/utils.js +11 -0
  1374. package/dist/timelock/evm/utils.js.map +1 -0
  1375. package/dist/timelock/types.d.ts +29 -0
  1376. package/dist/timelock/types.d.ts.map +1 -0
  1377. package/dist/timelock/types.js +11 -0
  1378. package/dist/timelock/types.js.map +1 -0
  1379. package/dist/token/EvmWarpModule.d.ts +301 -0
  1380. package/dist/token/EvmWarpModule.d.ts.map +1 -0
  1381. package/dist/token/EvmWarpModule.hardhat-test.d.ts +2 -0
  1382. package/dist/token/EvmWarpModule.hardhat-test.d.ts.map +1 -0
  1383. package/dist/token/EvmWarpModule.hardhat-test.js +3143 -0
  1384. package/dist/token/EvmWarpModule.hardhat-test.js.map +1 -0
  1385. package/dist/token/EvmWarpModule.js +1800 -0
  1386. package/dist/token/EvmWarpModule.js.map +1 -0
  1387. package/dist/token/EvmWarpModule.test.d.ts +2 -0
  1388. package/dist/token/EvmWarpModule.test.d.ts.map +1 -0
  1389. package/dist/token/EvmWarpModule.test.js +471 -0
  1390. package/dist/token/EvmWarpModule.test.js.map +1 -0
  1391. package/dist/token/EvmWarpRouteReader.d.ts +135 -0
  1392. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -0
  1393. package/dist/token/EvmWarpRouteReader.hardhat-test.d.ts +2 -0
  1394. package/dist/token/EvmWarpRouteReader.hardhat-test.d.ts.map +1 -0
  1395. package/dist/token/EvmWarpRouteReader.hardhat-test.js +1357 -0
  1396. package/dist/token/EvmWarpRouteReader.hardhat-test.js.map +1 -0
  1397. package/dist/token/EvmWarpRouteReader.js +1292 -0
  1398. package/dist/token/EvmWarpRouteReader.js.map +1 -0
  1399. package/dist/token/EvmWarpRouteReader.replay.test.d.ts +2 -0
  1400. package/dist/token/EvmWarpRouteReader.replay.test.d.ts.map +1 -0
  1401. package/dist/token/EvmWarpRouteReader.replay.test.js +392 -0
  1402. package/dist/token/EvmWarpRouteReader.replay.test.js.map +1 -0
  1403. package/dist/token/EvmWarpRouteReader.test.d.ts +2 -0
  1404. package/dist/token/EvmWarpRouteReader.test.d.ts.map +1 -0
  1405. package/dist/token/EvmWarpRouteReader.test.js +783 -0
  1406. package/dist/token/EvmWarpRouteReader.test.js.map +1 -0
  1407. package/dist/token/EvmXERC20Module.d.ts +105 -0
  1408. package/dist/token/EvmXERC20Module.d.ts.map +1 -0
  1409. package/dist/token/EvmXERC20Module.js +277 -0
  1410. package/dist/token/EvmXERC20Module.js.map +1 -0
  1411. package/dist/token/EvmXERC20Module.test.d.ts +2 -0
  1412. package/dist/token/EvmXERC20Module.test.d.ts.map +1 -0
  1413. package/dist/token/EvmXERC20Module.test.js +464 -0
  1414. package/dist/token/EvmXERC20Module.test.js.map +1 -0
  1415. package/dist/token/EvmXERC20Reader.d.ts +58 -0
  1416. package/dist/token/EvmXERC20Reader.d.ts.map +1 -0
  1417. package/dist/token/EvmXERC20Reader.js +122 -0
  1418. package/dist/token/EvmXERC20Reader.js.map +1 -0
  1419. package/dist/token/EvmXERC20Reader.test.d.ts +2 -0
  1420. package/dist/token/EvmXERC20Reader.test.d.ts.map +1 -0
  1421. package/dist/token/EvmXERC20Reader.test.js +333 -0
  1422. package/dist/token/EvmXERC20Reader.test.js.map +1 -0
  1423. package/dist/token/IToken.d.ts +21 -0
  1424. package/dist/token/IToken.d.ts.map +1 -0
  1425. package/dist/token/IToken.js +2 -0
  1426. package/dist/token/IToken.js.map +1 -0
  1427. package/dist/token/ITokenMetadata.d.ts +90 -0
  1428. package/dist/token/ITokenMetadata.d.ts.map +1 -0
  1429. package/dist/token/ITokenMetadata.js +53 -0
  1430. package/dist/token/ITokenMetadata.js.map +1 -0
  1431. package/dist/token/Token.d.ts +47 -0
  1432. package/dist/token/Token.d.ts.map +1 -0
  1433. package/dist/token/Token.js +231 -0
  1434. package/dist/token/Token.js.map +1 -0
  1435. package/dist/token/Token.test.d.ts +2 -0
  1436. package/dist/token/Token.test.d.ts.map +1 -0
  1437. package/dist/token/Token.test.js +579 -0
  1438. package/dist/token/Token.test.js.map +1 -0
  1439. package/dist/token/TokenAmount.d.ts +12 -0
  1440. package/dist/token/TokenAmount.d.ts.map +1 -0
  1441. package/dist/token/TokenAmount.js +22 -0
  1442. package/dist/token/TokenAmount.js.map +1 -0
  1443. package/dist/token/TokenAmount.test.d.ts +2 -0
  1444. package/dist/token/TokenAmount.test.d.ts.map +1 -0
  1445. package/dist/token/TokenAmount.test.js +38 -0
  1446. package/dist/token/TokenAmount.test.js.map +1 -0
  1447. package/dist/token/TokenConnection.d.ts +55 -0
  1448. package/dist/token/TokenConnection.d.ts.map +1 -0
  1449. package/dist/token/TokenConnection.js +44 -0
  1450. package/dist/token/TokenConnection.js.map +1 -0
  1451. package/dist/token/TokenConnection.test.d.ts +2 -0
  1452. package/dist/token/TokenConnection.test.d.ts.map +1 -0
  1453. package/dist/token/TokenConnection.test.js +17 -0
  1454. package/dist/token/TokenConnection.test.js.map +1 -0
  1455. package/dist/token/TokenMetadata.d.ts +43 -0
  1456. package/dist/token/TokenMetadata.d.ts.map +1 -0
  1457. package/dist/token/TokenMetadata.js +121 -0
  1458. package/dist/token/TokenMetadata.js.map +1 -0
  1459. package/dist/token/TokenMetadataMap.d.ts +15 -0
  1460. package/dist/token/TokenMetadataMap.d.ts.map +1 -0
  1461. package/dist/token/TokenMetadataMap.js +56 -0
  1462. package/dist/token/TokenMetadataMap.js.map +1 -0
  1463. package/dist/token/TokenStandard.d.ts +108 -0
  1464. package/dist/token/TokenStandard.d.ts.map +1 -0
  1465. package/dist/token/TokenStandard.js +470 -0
  1466. package/dist/token/TokenStandard.js.map +1 -0
  1467. package/dist/token/adapters/AleoTokenAdapter.d.ts +60 -0
  1468. package/dist/token/adapters/AleoTokenAdapter.d.ts.map +1 -0
  1469. package/dist/token/adapters/AleoTokenAdapter.js +190 -0
  1470. package/dist/token/adapters/AleoTokenAdapter.js.map +1 -0
  1471. package/dist/token/adapters/CosmWasmTokenAdapter.d.ts +114 -0
  1472. package/dist/token/adapters/CosmWasmTokenAdapter.d.ts.map +1 -0
  1473. package/dist/token/adapters/CosmWasmTokenAdapter.js +332 -0
  1474. package/dist/token/adapters/CosmWasmTokenAdapter.js.map +1 -0
  1475. package/dist/token/adapters/CosmWasmTokenAdapter.test.d.ts +14 -0
  1476. package/dist/token/adapters/CosmWasmTokenAdapter.test.d.ts.map +1 -0
  1477. package/dist/token/adapters/CosmWasmTokenAdapter.test.js +283 -0
  1478. package/dist/token/adapters/CosmWasmTokenAdapter.test.js.map +1 -0
  1479. package/dist/token/adapters/CosmosModuleTokenAdapter.d.ts +54 -0
  1480. package/dist/token/adapters/CosmosModuleTokenAdapter.d.ts.map +1 -0
  1481. package/dist/token/adapters/CosmosModuleTokenAdapter.js +189 -0
  1482. package/dist/token/adapters/CosmosModuleTokenAdapter.js.map +1 -0
  1483. package/dist/token/adapters/CosmosTokenAdapter.d.ts +74 -0
  1484. package/dist/token/adapters/CosmosTokenAdapter.d.ts.map +1 -0
  1485. package/dist/token/adapters/CosmosTokenAdapter.js +192 -0
  1486. package/dist/token/adapters/CosmosTokenAdapter.js.map +1 -0
  1487. package/dist/token/adapters/EvmCrossCollateralAdapter.d.ts +39 -0
  1488. package/dist/token/adapters/EvmCrossCollateralAdapter.d.ts.map +1 -0
  1489. package/dist/token/adapters/EvmCrossCollateralAdapter.js +85 -0
  1490. package/dist/token/adapters/EvmCrossCollateralAdapter.js.map +1 -0
  1491. package/dist/token/adapters/EvmCrossCollateralAdapter.test.d.ts +2 -0
  1492. package/dist/token/adapters/EvmCrossCollateralAdapter.test.d.ts.map +1 -0
  1493. package/dist/token/adapters/EvmCrossCollateralAdapter.test.js +155 -0
  1494. package/dist/token/adapters/EvmCrossCollateralAdapter.test.js.map +1 -0
  1495. package/dist/token/adapters/EvmHypSyntheticAdapter.test.d.ts +2 -0
  1496. package/dist/token/adapters/EvmHypSyntheticAdapter.test.d.ts.map +1 -0
  1497. package/dist/token/adapters/EvmHypSyntheticAdapter.test.js +96 -0
  1498. package/dist/token/adapters/EvmHypSyntheticAdapter.test.js.map +1 -0
  1499. package/dist/token/adapters/EvmTokenAdapter.d.ts +303 -0
  1500. package/dist/token/adapters/EvmTokenAdapter.d.ts.map +1 -0
  1501. package/dist/token/adapters/EvmTokenAdapter.js +899 -0
  1502. package/dist/token/adapters/EvmTokenAdapter.js.map +1 -0
  1503. package/dist/token/adapters/EvmTokenAdapter.seismic.test.d.ts +2 -0
  1504. package/dist/token/adapters/EvmTokenAdapter.seismic.test.d.ts.map +1 -0
  1505. package/dist/token/adapters/EvmTokenAdapter.seismic.test.js +125 -0
  1506. package/dist/token/adapters/EvmTokenAdapter.seismic.test.js.map +1 -0
  1507. package/dist/token/adapters/EvmTokenAdapter.test.d.ts +2 -0
  1508. package/dist/token/adapters/EvmTokenAdapter.test.d.ts.map +1 -0
  1509. package/dist/token/adapters/EvmTokenAdapter.test.js +73 -0
  1510. package/dist/token/adapters/EvmTokenAdapter.test.js.map +1 -0
  1511. package/dist/token/adapters/ITokenAdapter.d.ts +129 -0
  1512. package/dist/token/adapters/ITokenAdapter.d.ts.map +1 -0
  1513. package/dist/token/adapters/ITokenAdapter.js +15 -0
  1514. package/dist/token/adapters/ITokenAdapter.js.map +1 -0
  1515. package/dist/token/adapters/M0PortalLiteTokenAdapter.d.ts +22 -0
  1516. package/dist/token/adapters/M0PortalLiteTokenAdapter.d.ts.map +1 -0
  1517. package/dist/token/adapters/M0PortalLiteTokenAdapter.js +90 -0
  1518. package/dist/token/adapters/M0PortalLiteTokenAdapter.js.map +1 -0
  1519. package/dist/token/adapters/M0PortalTokenAdapter.d.ts +22 -0
  1520. package/dist/token/adapters/M0PortalTokenAdapter.d.ts.map +1 -0
  1521. package/dist/token/adapters/M0PortalTokenAdapter.js +95 -0
  1522. package/dist/token/adapters/M0PortalTokenAdapter.js.map +1 -0
  1523. package/dist/token/adapters/M0PortalTokenAdapter.test.d.ts +2 -0
  1524. package/dist/token/adapters/M0PortalTokenAdapter.test.d.ts.map +1 -0
  1525. package/dist/token/adapters/M0PortalTokenAdapter.test.js +94 -0
  1526. package/dist/token/adapters/M0PortalTokenAdapter.test.js.map +1 -0
  1527. package/dist/token/adapters/RadixTokenAdapter.d.ts +55 -0
  1528. package/dist/token/adapters/RadixTokenAdapter.d.ts.map +1 -0
  1529. package/dist/token/adapters/RadixTokenAdapter.js +190 -0
  1530. package/dist/token/adapters/RadixTokenAdapter.js.map +1 -0
  1531. package/dist/token/adapters/SealevelCrossCollateralAdapter.d.ts +64 -0
  1532. package/dist/token/adapters/SealevelCrossCollateralAdapter.d.ts.map +1 -0
  1533. package/dist/token/adapters/SealevelCrossCollateralAdapter.js +474 -0
  1534. package/dist/token/adapters/SealevelCrossCollateralAdapter.js.map +1 -0
  1535. package/dist/token/adapters/SealevelCrossCollateralAdapter.test.d.ts +2 -0
  1536. package/dist/token/adapters/SealevelCrossCollateralAdapter.test.d.ts.map +1 -0
  1537. package/dist/token/adapters/SealevelCrossCollateralAdapter.test.js +138 -0
  1538. package/dist/token/adapters/SealevelCrossCollateralAdapter.test.js.map +1 -0
  1539. package/dist/token/adapters/SealevelHypTokenAdapter.test.d.ts +2 -0
  1540. package/dist/token/adapters/SealevelHypTokenAdapter.test.d.ts.map +1 -0
  1541. package/dist/token/adapters/SealevelHypTokenAdapter.test.js +136 -0
  1542. package/dist/token/adapters/SealevelHypTokenAdapter.test.js.map +1 -0
  1543. package/dist/token/adapters/SealevelTokenAdapter.d.ts +288 -0
  1544. package/dist/token/adapters/SealevelTokenAdapter.d.ts.map +1 -0
  1545. package/dist/token/adapters/SealevelTokenAdapter.js +1019 -0
  1546. package/dist/token/adapters/SealevelTokenAdapter.js.map +1 -0
  1547. package/dist/token/adapters/StarknetTokenAdapter.d.ts +107 -0
  1548. package/dist/token/adapters/StarknetTokenAdapter.d.ts.map +1 -0
  1549. package/dist/token/adapters/StarknetTokenAdapter.js +273 -0
  1550. package/dist/token/adapters/StarknetTokenAdapter.js.map +1 -0
  1551. package/dist/token/adapters/aleoHyp.d.ts +7 -0
  1552. package/dist/token/adapters/aleoHyp.d.ts.map +1 -0
  1553. package/dist/token/adapters/aleoHyp.js +26 -0
  1554. package/dist/token/adapters/aleoHyp.js.map +1 -0
  1555. package/dist/token/adapters/cosmosHyp.d.ts +7 -0
  1556. package/dist/token/adapters/cosmosHyp.d.ts.map +1 -0
  1557. package/dist/token/adapters/cosmosHyp.js +40 -0
  1558. package/dist/token/adapters/cosmosHyp.js.map +1 -0
  1559. package/dist/token/adapters/evmHyp.d.ts +7 -0
  1560. package/dist/token/adapters/evmHyp.d.ts.map +1 -0
  1561. package/dist/token/adapters/evmHyp.js +21 -0
  1562. package/dist/token/adapters/evmHyp.js.map +1 -0
  1563. package/dist/token/adapters/evmLikeHyp.d.ts +20 -0
  1564. package/dist/token/adapters/evmLikeHyp.d.ts.map +1 -0
  1565. package/dist/token/adapters/evmLikeHyp.js +67 -0
  1566. package/dist/token/adapters/evmLikeHyp.js.map +1 -0
  1567. package/dist/token/adapters/hypTokenAdapterUtils.d.ts +15 -0
  1568. package/dist/token/adapters/hypTokenAdapterUtils.d.ts.map +1 -0
  1569. package/dist/token/adapters/hypTokenAdapterUtils.js +9 -0
  1570. package/dist/token/adapters/hypTokenAdapterUtils.js.map +1 -0
  1571. package/dist/token/adapters/radixHyp.d.ts +7 -0
  1572. package/dist/token/adapters/radixHyp.d.ts.map +1 -0
  1573. package/dist/token/adapters/radixHyp.js +22 -0
  1574. package/dist/token/adapters/radixHyp.js.map +1 -0
  1575. package/dist/token/adapters/sealevelFee.d.ts +206 -0
  1576. package/dist/token/adapters/sealevelFee.d.ts.map +1 -0
  1577. package/dist/token/adapters/sealevelFee.js +515 -0
  1578. package/dist/token/adapters/sealevelFee.js.map +1 -0
  1579. package/dist/token/adapters/sealevelFee.test.d.ts +2 -0
  1580. package/dist/token/adapters/sealevelFee.test.d.ts.map +1 -0
  1581. package/dist/token/adapters/sealevelFee.test.js +246 -0
  1582. package/dist/token/adapters/sealevelFee.test.js.map +1 -0
  1583. package/dist/token/adapters/sealevelHyp.d.ts +8 -0
  1584. package/dist/token/adapters/sealevelHyp.d.ts.map +1 -0
  1585. package/dist/token/adapters/sealevelHyp.js +52 -0
  1586. package/dist/token/adapters/sealevelHyp.js.map +1 -0
  1587. package/dist/token/adapters/serialization.d.ts +234 -0
  1588. package/dist/token/adapters/serialization.d.ts.map +1 -0
  1589. package/dist/token/adapters/serialization.js +580 -0
  1590. package/dist/token/adapters/serialization.js.map +1 -0
  1591. package/dist/token/adapters/serialization.test.d.ts +2 -0
  1592. package/dist/token/adapters/serialization.test.d.ts.map +1 -0
  1593. package/dist/token/adapters/serialization.test.js +55 -0
  1594. package/dist/token/adapters/serialization.test.js.map +1 -0
  1595. package/dist/token/adapters/starknetHyp.d.ts +7 -0
  1596. package/dist/token/adapters/starknetHyp.d.ts.map +1 -0
  1597. package/dist/token/adapters/starknetHyp.js +35 -0
  1598. package/dist/token/adapters/starknetHyp.js.map +1 -0
  1599. package/dist/token/adapters/tronHyp.d.ts +7 -0
  1600. package/dist/token/adapters/tronHyp.d.ts.map +1 -0
  1601. package/dist/token/adapters/tronHyp.js +21 -0
  1602. package/dist/token/adapters/tronHyp.js.map +1 -0
  1603. package/dist/token/adapters/utils.d.ts +7 -0
  1604. package/dist/token/adapters/utils.d.ts.map +1 -0
  1605. package/dist/token/adapters/utils.js +4 -0
  1606. package/dist/token/adapters/utils.js.map +1 -0
  1607. package/dist/token/cctp.d.ts +10 -0
  1608. package/dist/token/cctp.d.ts.map +1 -0
  1609. package/dist/token/cctp.js +13 -0
  1610. package/dist/token/cctp.js.map +1 -0
  1611. package/dist/token/cctp.test.d.ts +2 -0
  1612. package/dist/token/cctp.test.d.ts.map +1 -0
  1613. package/dist/token/cctp.test.js +48 -0
  1614. package/dist/token/cctp.test.js.map +1 -0
  1615. package/dist/token/config.d.ts +61 -0
  1616. package/dist/token/config.d.ts.map +1 -0
  1617. package/dist/token/config.js +79 -0
  1618. package/dist/token/config.js.map +1 -0
  1619. package/dist/token/configUtils.d.ts +106 -0
  1620. package/dist/token/configUtils.d.ts.map +1 -0
  1621. package/dist/token/configUtils.js +735 -0
  1622. package/dist/token/configUtils.js.map +1 -0
  1623. package/dist/token/configUtils.test.d.ts +2 -0
  1624. package/dist/token/configUtils.test.d.ts.map +1 -0
  1625. package/dist/token/configUtils.test.js +1313 -0
  1626. package/dist/token/configUtils.test.js.map +1 -0
  1627. package/dist/token/contracts.d.ts +64 -0
  1628. package/dist/token/contracts.d.ts.map +1 -0
  1629. package/dist/token/contracts.js +68 -0
  1630. package/dist/token/contracts.js.map +1 -0
  1631. package/dist/token/deploy.d.ts +56 -0
  1632. package/dist/token/deploy.d.ts.map +1 -0
  1633. package/dist/token/deploy.hardhat-test.d.ts +2 -0
  1634. package/dist/token/deploy.hardhat-test.d.ts.map +1 -0
  1635. package/dist/token/deploy.hardhat-test.js +1397 -0
  1636. package/dist/token/deploy.hardhat-test.js.map +1 -0
  1637. package/dist/token/deploy.js +698 -0
  1638. package/dist/token/deploy.js.map +1 -0
  1639. package/dist/token/nativeTokenMetadata.d.ts +4 -0
  1640. package/dist/token/nativeTokenMetadata.d.ts.map +1 -0
  1641. package/dist/token/nativeTokenMetadata.js +50 -0
  1642. package/dist/token/nativeTokenMetadata.js.map +1 -0
  1643. package/dist/token/sealevel/metadata.d.ts +33 -0
  1644. package/dist/token/sealevel/metadata.d.ts.map +1 -0
  1645. package/dist/token/sealevel/metadata.js +90 -0
  1646. package/dist/token/sealevel/metadata.js.map +1 -0
  1647. package/dist/token/tokenMetadataUtils.d.ts +7 -0
  1648. package/dist/token/tokenMetadataUtils.d.ts.map +1 -0
  1649. package/dist/token/tokenMetadataUtils.js +109 -0
  1650. package/dist/token/tokenMetadataUtils.js.map +1 -0
  1651. package/dist/token/types.d.ts +9384 -0
  1652. package/dist/token/types.d.ts.map +1 -0
  1653. package/dist/token/types.js +613 -0
  1654. package/dist/token/types.js.map +1 -0
  1655. package/dist/token/types.test.d.ts +2 -0
  1656. package/dist/token/types.test.d.ts.map +1 -0
  1657. package/dist/token/types.test.js +529 -0
  1658. package/dist/token/types.test.js.map +1 -0
  1659. package/dist/token/warpCheck.d.ts +75 -0
  1660. package/dist/token/warpCheck.d.ts.map +1 -0
  1661. package/dist/token/warpCheck.js +1003 -0
  1662. package/dist/token/warpCheck.js.map +1 -0
  1663. package/dist/token/warpCheck.test.d.ts +2 -0
  1664. package/dist/token/warpCheck.test.d.ts.map +1 -0
  1665. package/dist/token/warpCheck.test.js +947 -0
  1666. package/dist/token/warpCheck.test.js.map +1 -0
  1667. package/dist/token/xerc20-abi.d.ts +58 -0
  1668. package/dist/token/xerc20-abi.d.ts.map +1 -0
  1669. package/dist/token/xerc20-abi.js +77 -0
  1670. package/dist/token/xerc20-abi.js.map +1 -0
  1671. package/dist/token/xerc20-limits.d.ts +63 -0
  1672. package/dist/token/xerc20-limits.d.ts.map +1 -0
  1673. package/dist/token/xerc20-limits.js +80 -0
  1674. package/dist/token/xerc20-limits.js.map +1 -0
  1675. package/dist/token/xerc20.d.ts +93 -0
  1676. package/dist/token/xerc20.d.ts.map +1 -0
  1677. package/dist/token/xerc20.js +355 -0
  1678. package/dist/token/xerc20.js.map +1 -0
  1679. package/dist/token/xerc20.test.d.ts +2 -0
  1680. package/dist/token/xerc20.test.d.ts.map +1 -0
  1681. package/dist/token/xerc20.test.js +728 -0
  1682. package/dist/token/xerc20.test.js.map +1 -0
  1683. package/dist/types.d.ts +47 -0
  1684. package/dist/types.d.ts.map +1 -0
  1685. package/dist/types.js +18 -0
  1686. package/dist/types.js.map +1 -0
  1687. package/dist/utils/HyperlaneReader.d.ts +17 -0
  1688. package/dist/utils/HyperlaneReader.d.ts.map +1 -0
  1689. package/dist/utils/HyperlaneReader.js +22 -0
  1690. package/dist/utils/HyperlaneReader.js.map +1 -0
  1691. package/dist/utils/MultiGeneric.d.ts +26 -0
  1692. package/dist/utils/MultiGeneric.d.ts.map +1 -0
  1693. package/dist/utils/MultiGeneric.js +55 -0
  1694. package/dist/utils/MultiGeneric.js.map +1 -0
  1695. package/dist/utils/contract.d.ts +60 -0
  1696. package/dist/utils/contract.d.ts.map +1 -0
  1697. package/dist/utils/contract.js +231 -0
  1698. package/dist/utils/contract.js.map +1 -0
  1699. package/dist/utils/contract.test.d.ts +2 -0
  1700. package/dist/utils/contract.test.d.ts.map +1 -0
  1701. package/dist/utils/contract.test.js +551 -0
  1702. package/dist/utils/contract.test.js.map +1 -0
  1703. package/dist/utils/contract.transport.test.d.ts +2 -0
  1704. package/dist/utils/contract.transport.test.d.ts.map +1 -0
  1705. package/dist/utils/contract.transport.test.js +145 -0
  1706. package/dist/utils/contract.transport.test.js.map +1 -0
  1707. package/dist/utils/cosmos.d.ts +391 -0
  1708. package/dist/utils/cosmos.d.ts.map +1 -0
  1709. package/dist/utils/cosmos.js +424 -0
  1710. package/dist/utils/cosmos.js.map +1 -0
  1711. package/dist/utils/decimals.d.ts +53 -0
  1712. package/dist/utils/decimals.d.ts.map +1 -0
  1713. package/dist/utils/decimals.js +131 -0
  1714. package/dist/utils/decimals.js.map +1 -0
  1715. package/dist/utils/decimals.test.d.ts +2 -0
  1716. package/dist/utils/decimals.test.d.ts.map +1 -0
  1717. package/dist/utils/decimals.test.js +526 -0
  1718. package/dist/utils/decimals.test.js.map +1 -0
  1719. package/dist/utils/filter.d.ts +3 -0
  1720. package/dist/utils/filter.d.ts.map +1 -0
  1721. package/dist/utils/filter.js +9 -0
  1722. package/dist/utils/filter.js.map +1 -0
  1723. package/dist/utils/fork.d.ts +55 -0
  1724. package/dist/utils/fork.d.ts.map +1 -0
  1725. package/dist/utils/fork.js +119 -0
  1726. package/dist/utils/fork.js.map +1 -0
  1727. package/dist/utils/gas.d.ts +30 -0
  1728. package/dist/utils/gas.d.ts.map +1 -0
  1729. package/dist/utils/gas.js +35 -0
  1730. package/dist/utils/gas.js.map +1 -0
  1731. package/dist/utils/gnosisSafe.d.ts +21 -0
  1732. package/dist/utils/gnosisSafe.d.ts.map +1 -0
  1733. package/dist/utils/gnosisSafe.js +193 -0
  1734. package/dist/utils/gnosisSafe.js.map +1 -0
  1735. package/dist/utils/gnosisSafe.test.d.ts +2 -0
  1736. package/dist/utils/gnosisSafe.test.d.ts.map +1 -0
  1737. package/dist/utils/gnosisSafe.test.js +78 -0
  1738. package/dist/utils/gnosisSafe.test.js.map +1 -0
  1739. package/dist/utils/ism.d.ts +193 -0
  1740. package/dist/utils/ism.d.ts.map +1 -0
  1741. package/dist/utils/ism.js +611 -0
  1742. package/dist/utils/ism.js.map +1 -0
  1743. package/dist/utils/ism.test.d.ts +2 -0
  1744. package/dist/utils/ism.test.d.ts.map +1 -0
  1745. package/dist/utils/ism.test.js +445 -0
  1746. package/dist/utils/ism.test.js.map +1 -0
  1747. package/dist/utils/logUtils.d.ts +4 -0
  1748. package/dist/utils/logUtils.d.ts.map +1 -0
  1749. package/dist/utils/logUtils.js +13 -0
  1750. package/dist/utils/logUtils.js.map +1 -0
  1751. package/dist/utils/numbers.d.ts +11 -0
  1752. package/dist/utils/numbers.d.ts.map +1 -0
  1753. package/dist/utils/numbers.js +36 -0
  1754. package/dist/utils/numbers.js.map +1 -0
  1755. package/dist/utils/numbers.test.d.ts +2 -0
  1756. package/dist/utils/numbers.test.d.ts.map +1 -0
  1757. package/dist/utils/numbers.test.js +80 -0
  1758. package/dist/utils/numbers.test.js.map +1 -0
  1759. package/dist/utils/provider.d.ts +6 -0
  1760. package/dist/utils/provider.d.ts.map +1 -0
  1761. package/dist/utils/provider.js +36 -0
  1762. package/dist/utils/provider.js.map +1 -0
  1763. package/dist/utils/schemas.d.ts +4 -0
  1764. package/dist/utils/schemas.d.ts.map +1 -0
  1765. package/dist/utils/schemas.js +15 -0
  1766. package/dist/utils/schemas.js.map +1 -0
  1767. package/dist/utils/schemas.test.d.ts +2 -0
  1768. package/dist/utils/schemas.test.d.ts.map +1 -0
  1769. package/dist/utils/schemas.test.js +33 -0
  1770. package/dist/utils/schemas.test.js.map +1 -0
  1771. package/dist/utils/sealevelSerialization.d.ts +50 -0
  1772. package/dist/utils/sealevelSerialization.d.ts.map +1 -0
  1773. package/dist/utils/sealevelSerialization.js +85 -0
  1774. package/dist/utils/sealevelSerialization.js.map +1 -0
  1775. package/dist/utils/starknet.d.ts +35 -0
  1776. package/dist/utils/starknet.d.ts.map +1 -0
  1777. package/dist/utils/starknet.js +89 -0
  1778. package/dist/utils/starknet.js.map +1 -0
  1779. package/dist/utils/transactions.d.ts +12 -0
  1780. package/dist/utils/transactions.d.ts.map +1 -0
  1781. package/dist/utils/transactions.js +17 -0
  1782. package/dist/utils/transactions.js.map +1 -0
  1783. package/dist/utils/validator.d.ts +5 -0
  1784. package/dist/utils/validator.d.ts.map +1 -0
  1785. package/dist/utils/validator.js +18 -0
  1786. package/dist/utils/validator.js.map +1 -0
  1787. package/dist/utils/zksync.d.ts +8 -0
  1788. package/dist/utils/zksync.d.ts.map +1 -0
  1789. package/dist/utils/zksync.js +24 -0
  1790. package/dist/utils/zksync.js.map +1 -0
  1791. package/dist/warp/WarpCore.d.ts +286 -0
  1792. package/dist/warp/WarpCore.d.ts.map +1 -0
  1793. package/dist/warp/WarpCore.js +1144 -0
  1794. package/dist/warp/WarpCore.js.map +1 -0
  1795. package/dist/warp/WarpCore.test.d.ts +2 -0
  1796. package/dist/warp/WarpCore.test.d.ts.map +1 -0
  1797. package/dist/warp/WarpCore.test.js +1823 -0
  1798. package/dist/warp/WarpCore.test.js.map +1 -0
  1799. package/dist/warp/read.d.ts +19 -0
  1800. package/dist/warp/read.d.ts.map +1 -0
  1801. package/dist/warp/read.js +34 -0
  1802. package/dist/warp/read.js.map +1 -0
  1803. package/dist/warp/read.test.d.ts +2 -0
  1804. package/dist/warp/read.test.d.ts.map +1 -0
  1805. package/dist/warp/read.test.js +56 -0
  1806. package/dist/warp/read.test.js.map +1 -0
  1807. package/dist/warp/resolveDestinationToken.d.ts +23 -0
  1808. package/dist/warp/resolveDestinationToken.d.ts.map +1 -0
  1809. package/dist/warp/resolveDestinationToken.js +31 -0
  1810. package/dist/warp/resolveDestinationToken.js.map +1 -0
  1811. package/dist/warp/types.d.ts +122 -0
  1812. package/dist/warp/types.d.ts.map +1 -0
  1813. package/dist/warp/types.js +52 -0
  1814. package/dist/warp/types.js.map +1 -0
  1815. package/dist/warp/types.test.d.ts +2 -0
  1816. package/dist/warp/types.test.d.ts.map +1 -0
  1817. package/dist/warp/types.test.js +81 -0
  1818. package/dist/warp/types.test.js.map +1 -0
  1819. package/dist/zksync/ZKSyncDeployer.d.ts +59 -0
  1820. package/dist/zksync/ZKSyncDeployer.d.ts.map +1 -0
  1821. package/dist/zksync/ZKSyncDeployer.js +132 -0
  1822. package/dist/zksync/ZKSyncDeployer.js.map +1 -0
  1823. package/package.json +259 -3
@@ -0,0 +1,3143 @@
1
+ import chai from 'chai';
2
+ import chaiAsPromised from 'chai-as-promised';
3
+ import { ethers } from 'ethers';
4
+ import hre from 'hardhat';
5
+ import sinon from 'sinon';
6
+ import { CONTRACTS_PACKAGE_VERSION, CrossCollateralRoutingFee__factory, CrossCollateralRouter__factory, DelayedFlowRouterHookIsm__factory, ERC20Test__factory, ERC4626Test__factory, GasRouter__factory, HypERC20__factory, HypERC4626Collateral__factory, HypNative__factory, HypXERC20__factory, LinearFee__factory, MailboxClient__factory, Mailbox__factory, MockEverclearAdapter__factory, MovableCollateralRouter__factory, StaticAggregationIsm__factory, TokenBridgeCctpV2__factory, TokenRouter__factory, XERC20Test__factory, } from '@recoillink/core';
7
+ import { HookType, IsmType, TestChainName, TokenFeeType, proxyAdmin, proxyImplementation, serializeContracts, } from '@recoillink/sdk';
8
+ import { addressToBytes32, assert, deepCopy, eqAddress, isZeroishAddress, normalizeAddressEvm, objMap, randomInt, } from '@recoillink/utils';
9
+ import { TestCoreDeployer } from '../core/TestCoreDeployer.js';
10
+ import { HyperlaneProxyFactoryDeployer } from '../deploy/HyperlaneProxyFactoryDeployer.js';
11
+ import { deriveDelayedFlowEnrollmentTargets } from '../deploy/warp.js';
12
+ import { EvmIsmModule } from '../ism/EvmIsmModule.js';
13
+ import { HyperlaneIsmFactory } from '../ism/HyperlaneIsmFactory.js';
14
+ import { MultiProvider } from '../providers/MultiProvider.js';
15
+ import { randomAddress } from '../test/testUtils.js';
16
+ import { collectHybridIsmNodes, normalizeConfig } from '../utils/ism.js';
17
+ import { EvmTokenFeeModule } from '../fee/EvmTokenFeeModule.js';
18
+ import { DEFAULT_ROUTER_KEY } from '../fee/types.js';
19
+ import { EvmWarpModule, MAX_LEGACY_BRIDGE_APPROVAL_VERSION, } from './EvmWarpModule.js';
20
+ import { TokenType, isMovableCollateralTokenType, } from './config.js';
21
+ import { HypTokenRouterConfigSchema, derivedHookAddress, isEverclearTokenBridgeConfig, isMovableCollateralTokenConfig, } from './types.js';
22
+ chai.use(chaiAsPromised);
23
+ const { expect } = chai;
24
+ const routerInstallIndex = (txs, router, fn) => {
25
+ const sighash = MailboxClient__factory.createInterface().getSighash(fn);
26
+ return txs.findIndex((tx) => !!tx.to &&
27
+ eqAddress(tx.to, router) &&
28
+ !!tx.data &&
29
+ tx.data.startsWith(sighash));
30
+ };
31
+ const randomRemoteRouters = (n) => {
32
+ const routers = {};
33
+ for (let domain = 0; domain < n; domain++) {
34
+ routers[domain] = {
35
+ address: randomAddress(),
36
+ };
37
+ }
38
+ return routers;
39
+ };
40
+ describe('EvmWarpModule', async () => {
41
+ const TOKEN_NAME = 'fake';
42
+ const TOKEN_SUPPLY = '100000000000000000000';
43
+ const TOKEN_DECIMALS = 18;
44
+ const chain = TestChainName.test4;
45
+ const domainId = 31337;
46
+ let mailbox;
47
+ let ismAddress;
48
+ let ismFactory;
49
+ let factories;
50
+ let ismFactoryAddresses;
51
+ let erc20Factory;
52
+ let vaultFactory;
53
+ let vault;
54
+ let token;
55
+ let feeToken;
56
+ let everclearBridgeAdapterMockFactory;
57
+ let everclearBridgeAdapterMock;
58
+ let signer;
59
+ let multiProvider;
60
+ let coreApp;
61
+ let routerConfigMap;
62
+ let baseConfig;
63
+ async function validateCoreValues(deployedToken) {
64
+ expect(await deployedToken.mailbox()).to.equal(mailbox.address);
65
+ expect(await deployedToken.owner()).to.equal(signer.address);
66
+ }
67
+ async function sendTxs(txs) {
68
+ for (const tx of txs) {
69
+ await multiProvider.sendTransaction(chain, tx);
70
+ }
71
+ }
72
+ before(async () => {
73
+ [signer] = await hre.ethers.getSigners();
74
+ multiProvider = MultiProvider.createTestMultiProvider({ signer });
75
+ const ismFactoryDeployer = new HyperlaneProxyFactoryDeployer(multiProvider);
76
+ factories = await ismFactoryDeployer.deploy(multiProvider.mapKnownChains(() => ({})));
77
+ ismFactoryAddresses = serializeContracts(factories[chain]);
78
+ ismFactory = new HyperlaneIsmFactory(factories, multiProvider);
79
+ coreApp = await new TestCoreDeployer(multiProvider, ismFactory).deployApp();
80
+ routerConfigMap = coreApp.getRouterConfig(signer.address);
81
+ erc20Factory = new ERC20Test__factory(signer);
82
+ token = await erc20Factory.deploy(TOKEN_NAME, TOKEN_NAME, TOKEN_SUPPLY, TOKEN_DECIMALS);
83
+ feeToken = await erc20Factory.deploy(TOKEN_NAME, TOKEN_NAME, TOKEN_SUPPLY, TOKEN_DECIMALS);
84
+ vaultFactory = new ERC4626Test__factory(signer);
85
+ vault = await vaultFactory.deploy(token.address, TOKEN_NAME, TOKEN_NAME);
86
+ baseConfig = routerConfigMap[chain];
87
+ mailbox = Mailbox__factory.connect(baseConfig.mailbox, signer);
88
+ ismAddress = await mailbox.defaultIsm();
89
+ everclearBridgeAdapterMockFactory = new MockEverclearAdapter__factory(signer);
90
+ everclearBridgeAdapterMock =
91
+ await everclearBridgeAdapterMockFactory.deploy();
92
+ });
93
+ const movableCollateralTypes = Object.values(TokenType).filter((t) => isMovableCollateralTokenType(t) &&
94
+ // CrossCollateralRouter contract too large for hardhat; covered by forge tests
95
+ t !== TokenType.crossCollateral);
96
+ const everclearTokenBridgeTypes = [
97
+ TokenType.ethEverclear,
98
+ TokenType.collateralEverclear,
99
+ ];
100
+ const assertAllowedRebalancers = async (evmERC20WarpModule, expectedRebalancers) => {
101
+ const currentConfig = await evmERC20WarpModule.read();
102
+ if (isMovableCollateralTokenConfig(currentConfig)) {
103
+ const currentRebalancers = Array.from(currentConfig.allowedRebalancers ?? []);
104
+ expect(currentRebalancers.length).to.equal(expectedRebalancers.length);
105
+ currentRebalancers.forEach((rebalancer, idx) => expect(eqAddress(rebalancer, expectedRebalancers[idx])).to.be.true);
106
+ }
107
+ };
108
+ const getMovableTokenConfig = (allowedRebalancers = []) => {
109
+ return {
110
+ [TokenType.collateral]: {
111
+ ...baseConfig,
112
+ type: TokenType.collateral,
113
+ token: token.address,
114
+ allowedRebalancers,
115
+ },
116
+ [TokenType.native]: {
117
+ ...baseConfig,
118
+ type: TokenType.native,
119
+ allowedRebalancers,
120
+ },
121
+ [TokenType.nativeScaled]: {
122
+ ...baseConfig,
123
+ type: TokenType.nativeScaled,
124
+ allowedRebalancers,
125
+ },
126
+ [TokenType.crossCollateral]: {
127
+ ...baseConfig,
128
+ type: TokenType.crossCollateral,
129
+ token: token.address,
130
+ allowedRebalancers,
131
+ },
132
+ };
133
+ };
134
+ const getEverclearTokenBridgeTokenConfig = () => {
135
+ const chainId = multiProvider.getChainId(chain);
136
+ const everclearFeeParams = {
137
+ [chainId]: {
138
+ deadline: Date.now(),
139
+ fee: randomInt(1000),
140
+ signature: '0x',
141
+ },
142
+ };
143
+ // Need to "enroll" otherwise the fee won't be set
144
+ const remoteRouters = {
145
+ [chainId]: {
146
+ address: randomAddress(),
147
+ },
148
+ };
149
+ return {
150
+ [TokenType.collateralEverclear]: {
151
+ type: TokenType.collateralEverclear,
152
+ token: token.address,
153
+ ...baseConfig,
154
+ everclearBridgeAddress: everclearBridgeAdapterMock.address,
155
+ everclearFeeParams,
156
+ outputAssets: {},
157
+ remoteRouters,
158
+ },
159
+ [TokenType.ethEverclear]: {
160
+ type: TokenType.ethEverclear,
161
+ wethAddress: token.address,
162
+ ...baseConfig,
163
+ everclearBridgeAddress: everclearBridgeAdapterMock.address,
164
+ everclearFeeParams,
165
+ outputAssets: {},
166
+ remoteRouters,
167
+ },
168
+ };
169
+ };
170
+ it('should create with a collateral config', async () => {
171
+ const config = {
172
+ ...baseConfig,
173
+ type: TokenType.collateral,
174
+ token: token.address,
175
+ };
176
+ // Deploy using WarpModule
177
+ const evmERC20WarpModule = await EvmWarpModule.create({
178
+ chain,
179
+ config,
180
+ multiProvider,
181
+ proxyFactoryFactories: ismFactoryAddresses,
182
+ });
183
+ // Let's derive it's onchain token type
184
+ const { deployedTokenRoute } = evmERC20WarpModule.serialize();
185
+ const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
186
+ expect(tokenType).to.equal(TokenType.collateral);
187
+ });
188
+ it('should create with a collateral vault config', async () => {
189
+ const config = {
190
+ type: TokenType.collateralVault,
191
+ token: vault.address,
192
+ ...baseConfig,
193
+ };
194
+ // Deploy using WarpModule
195
+ const evmERC20WarpModule = await EvmWarpModule.create({
196
+ chain,
197
+ config,
198
+ multiProvider,
199
+ proxyFactoryFactories: ismFactoryAddresses,
200
+ });
201
+ // Let's derive it's onchain token type
202
+ const { deployedTokenRoute } = evmERC20WarpModule.serialize();
203
+ const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
204
+ expect(tokenType).to.equal(TokenType.collateralVault);
205
+ // Validate onchain token values
206
+ const collateralVaultContract = HypERC4626Collateral__factory.connect(deployedTokenRoute, signer);
207
+ await validateCoreValues(collateralVaultContract);
208
+ expect(await collateralVaultContract.vault()).to.equal(vault.address);
209
+ expect(await collateralVaultContract.wrappedToken()).to.equal(token.address);
210
+ });
211
+ it('should create with a synthetic config', async () => {
212
+ const config = {
213
+ ...baseConfig,
214
+ type: TokenType.synthetic,
215
+ name: TOKEN_NAME,
216
+ symbol: TOKEN_NAME,
217
+ decimals: TOKEN_DECIMALS,
218
+ initialSupply: TOKEN_SUPPLY,
219
+ };
220
+ // Deploy using WarpModule
221
+ const evmERC20WarpModule = await EvmWarpModule.create({
222
+ chain,
223
+ config,
224
+ multiProvider,
225
+ proxyFactoryFactories: ismFactoryAddresses,
226
+ });
227
+ // Let's derive it's onchain token type
228
+ const { deployedTokenRoute } = evmERC20WarpModule.serialize();
229
+ const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
230
+ expect(tokenType).to.equal(TokenType.synthetic);
231
+ // Validate onchain token values
232
+ const syntheticContract = HypERC20__factory.connect(deployedTokenRoute, signer);
233
+ await validateCoreValues(syntheticContract);
234
+ expect(await syntheticContract.name()).to.equal(TOKEN_NAME);
235
+ expect(await syntheticContract.symbol()).to.equal(TOKEN_NAME);
236
+ expect(await syntheticContract.decimals()).to.equal(TOKEN_DECIMALS);
237
+ expect(await syntheticContract.totalSupply()).to.equal(TOKEN_SUPPLY);
238
+ });
239
+ it('should create with a native config', async () => {
240
+ const config = {
241
+ type: TokenType.native,
242
+ ...baseConfig,
243
+ };
244
+ // Deploy using WarpModule
245
+ const evmERC20WarpModule = await EvmWarpModule.create({
246
+ chain,
247
+ config,
248
+ multiProvider,
249
+ proxyFactoryFactories: ismFactoryAddresses,
250
+ });
251
+ // Let's derive it's onchain token type
252
+ const { deployedTokenRoute } = evmERC20WarpModule.serialize();
253
+ const tokenType = await evmERC20WarpModule.reader.deriveTokenType(deployedTokenRoute);
254
+ expect(tokenType).to.equal(TokenType.native);
255
+ // Validate onchain token values
256
+ const nativeContract = HypNative__factory.connect(deployedTokenRoute, signer);
257
+ await validateCoreValues(nativeContract);
258
+ });
259
+ it('should create with remote routers', async () => {
260
+ const numOfRouters = Math.floor(Math.random() * 10);
261
+ const config = {
262
+ ...baseConfig,
263
+ type: TokenType.native,
264
+ remoteRouters: randomRemoteRouters(numOfRouters),
265
+ };
266
+ // Deploy using WarpModule
267
+ const evmERC20WarpModule = await EvmWarpModule.create({
268
+ chain,
269
+ config,
270
+ multiProvider,
271
+ proxyFactoryFactories: ismFactoryAddresses,
272
+ });
273
+ const { remoteRouters } = await evmERC20WarpModule.read();
274
+ expect(Object.keys(remoteRouters).length).to.equal(numOfRouters);
275
+ });
276
+ for (const tokenType of movableCollateralTypes) {
277
+ it(`should deploy the token with rebalancers when the token is of type "${tokenType}"`, async () => {
278
+ const rebalancers = new Set([randomAddress(), randomAddress()]);
279
+ const expectedRebalancers = Array.from(rebalancers);
280
+ const config = deepCopy(getMovableTokenConfig(expectedRebalancers)[tokenType]);
281
+ const evmERC20WarpModule = await EvmWarpModule.create({
282
+ chain,
283
+ config,
284
+ multiProvider,
285
+ proxyFactoryFactories: ismFactoryAddresses,
286
+ });
287
+ await assertAllowedRebalancers(evmERC20WarpModule, expectedRebalancers);
288
+ });
289
+ }
290
+ for (const tokenType of everclearTokenBridgeTypes) {
291
+ it(`should create ${tokenType} token`, async () => {
292
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
293
+ // Deploy using WarpModule
294
+ const evmERC20WarpModule = await EvmWarpModule.create({
295
+ chain,
296
+ config,
297
+ multiProvider,
298
+ proxyFactoryFactories: ismFactoryAddresses,
299
+ });
300
+ const currentConfig = await evmERC20WarpModule.read();
301
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
302
+ expect(currentConfig.everclearBridgeAddress).to.deep.equal(config.everclearBridgeAddress);
303
+ expect(currentConfig.everclearFeeParams).to.deep.equal(config.everclearFeeParams);
304
+ });
305
+ it(`should deploy with multiple output assets and fee setting when the token is of type ${tokenType}`, async () => {
306
+ const baseConfig = getEverclearTokenBridgeTokenConfig()[tokenType];
307
+ const domainId1 = randomInt(100, 10);
308
+ const domainId2 = randomInt(1000, 100);
309
+ const updatedConfig = {
310
+ ...baseConfig,
311
+ remoteRouters: {
312
+ [domainId1]: {
313
+ address: randomAddress(),
314
+ },
315
+ [domainId2]: {
316
+ address: randomAddress(),
317
+ },
318
+ },
319
+ everclearFeeParams: {
320
+ [domainId1]: {
321
+ signature: '0x10',
322
+ deadline: Date.now(),
323
+ fee: randomInt(100),
324
+ },
325
+ [domainId2]: {
326
+ signature: '0x10',
327
+ deadline: Date.now(),
328
+ fee: randomInt(100),
329
+ },
330
+ },
331
+ outputAssets: {
332
+ [domainId1]: addressToBytes32(randomAddress()),
333
+ [domainId2]: addressToBytes32(randomAddress()),
334
+ },
335
+ };
336
+ // Deploy using WarpModule
337
+ const evmERC20WarpModule = await EvmWarpModule.create({
338
+ chain,
339
+ config: updatedConfig,
340
+ multiProvider,
341
+ proxyFactoryFactories: ismFactoryAddresses,
342
+ });
343
+ const currentConfig = await evmERC20WarpModule.read();
344
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
345
+ expect(currentConfig.everclearBridgeAddress).to.deep.equal(updatedConfig.everclearBridgeAddress);
346
+ expect(currentConfig.everclearFeeParams).to.deep.equal(updatedConfig.everclearFeeParams);
347
+ expect(currentConfig.outputAssets).to.deep.equal(updatedConfig.outputAssets);
348
+ });
349
+ }
350
+ describe(EvmWarpModule.prototype.update.name, async () => {
351
+ const owner = randomAddress();
352
+ const ismConfigToUpdate = [
353
+ {
354
+ type: IsmType.TRUSTED_RELAYER,
355
+ relayer: owner,
356
+ },
357
+ {
358
+ type: IsmType.FALLBACK_ROUTING,
359
+ owner: owner,
360
+ domains: {},
361
+ },
362
+ {
363
+ type: IsmType.PAUSABLE,
364
+ owner: owner,
365
+ paused: false,
366
+ },
367
+ ethers.constants.AddressZero,
368
+ ];
369
+ const hookConfigToUpdate = [
370
+ {
371
+ type: HookType.PROTOCOL_FEE,
372
+ beneficiary: owner,
373
+ owner: owner,
374
+ maxProtocolFee: '1337',
375
+ protocolFee: '1337',
376
+ },
377
+ {
378
+ type: HookType.INTERCHAIN_GAS_PAYMASTER,
379
+ owner: owner,
380
+ beneficiary: owner,
381
+ oracleKey: owner,
382
+ overhead: {},
383
+ oracleConfig: {},
384
+ },
385
+ {
386
+ type: HookType.MERKLE_TREE,
387
+ },
388
+ ];
389
+ for (const interchainSecurityModule of ismConfigToUpdate) {
390
+ it(`should deploy and set a new Ism (${typeof interchainSecurityModule === 'string' ? interchainSecurityModule : interchainSecurityModule.type})`, async () => {
391
+ const config = {
392
+ ...baseConfig,
393
+ type: TokenType.native,
394
+ interchainSecurityModule: ismAddress,
395
+ };
396
+ // Deploy using WarpModule
397
+ const evmERC20WarpModule = await EvmWarpModule.create({
398
+ chain,
399
+ config,
400
+ multiProvider,
401
+ proxyFactoryFactories: ismFactoryAddresses,
402
+ });
403
+ const actualConfig = await evmERC20WarpModule.read();
404
+ const expectedConfig = {
405
+ ...actualConfig,
406
+ interchainSecurityModule,
407
+ };
408
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
409
+ const updatedConfig = normalizeConfig((await evmERC20WarpModule.read()).interchainSecurityModule);
410
+ expect(updatedConfig).to.deep.equal(interchainSecurityModule);
411
+ });
412
+ }
413
+ it('should not deploy and set a new Ism if the config is the same', async () => {
414
+ const config = {
415
+ ...baseConfig,
416
+ type: TokenType.native,
417
+ interchainSecurityModule: ismAddress,
418
+ };
419
+ // Deploy using WarpModule
420
+ const evmERC20WarpModule = await EvmWarpModule.create({
421
+ chain,
422
+ config,
423
+ multiProvider,
424
+ proxyFactoryFactories: ismFactoryAddresses,
425
+ });
426
+ const actualConfig = await evmERC20WarpModule.read();
427
+ const owner = randomAddress();
428
+ const interchainSecurityModule = {
429
+ type: IsmType.PAUSABLE,
430
+ owner,
431
+ paused: false,
432
+ };
433
+ const expectedConfig = {
434
+ ...actualConfig,
435
+ interchainSecurityModule,
436
+ };
437
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
438
+ const updatedConfig = normalizeConfig((await evmERC20WarpModule.read()).interchainSecurityModule);
439
+ expect(updatedConfig).to.deep.equal(interchainSecurityModule);
440
+ // Deploy with the same config
441
+ const txs = await evmERC20WarpModule.update(expectedConfig);
442
+ expect(txs.length).to.equal(0);
443
+ });
444
+ it('should update and set a new Hook based on config', async () => {
445
+ const config = {
446
+ ...baseConfig,
447
+ type: TokenType.native,
448
+ };
449
+ // Deploy using WarpModule
450
+ const evmERC20WarpModule = await EvmWarpModule.create({
451
+ chain,
452
+ config,
453
+ multiProvider,
454
+ proxyFactoryFactories: ismFactoryAddresses,
455
+ });
456
+ const actualConfig = await evmERC20WarpModule.read();
457
+ for (const hook of hookConfigToUpdate) {
458
+ const expectedConfig = {
459
+ ...actualConfig,
460
+ hook,
461
+ };
462
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
463
+ const updatedConfig = await evmERC20WarpModule.read();
464
+ expect(normalizeConfig(updatedConfig.hook)).to.deep.equal(hook);
465
+ }
466
+ });
467
+ // The batch is submitted sequentially with no rollback, so a failure
468
+ // between the two installs is a state the route can be left in. Installing
469
+ // the hook first leaves the previous ISM verifying inbound messages;
470
+ // installing the ISM first can leave a hybrid hook/ISM gating delivery with
471
+ // nothing driving its postDispatch, which strands every message dispatched
472
+ // in that window.
473
+ it('installs the hook before the ISM when both change', async () => {
474
+ const evmERC20WarpModule = await EvmWarpModule.create({
475
+ chain,
476
+ config: {
477
+ ...baseConfig,
478
+ type: TokenType.native,
479
+ interchainSecurityModule: ismAddress,
480
+ },
481
+ multiProvider,
482
+ proxyFactoryFactories: ismFactoryAddresses,
483
+ });
484
+ const { deployedTokenRoute } = evmERC20WarpModule.serialize();
485
+ const expectedConfig = {
486
+ ...(await evmERC20WarpModule.read()),
487
+ interchainSecurityModule: {
488
+ type: IsmType.PAUSABLE,
489
+ owner: signer.address,
490
+ paused: false,
491
+ },
492
+ hook: { type: HookType.MERKLE_TREE },
493
+ };
494
+ const txs = await evmERC20WarpModule.update(expectedConfig);
495
+ const hookIndex = routerInstallIndex(txs, deployedTokenRoute, 'setHook');
496
+ const ismIndex = routerInstallIndex(txs, deployedTokenRoute, 'setInterchainSecurityModule');
497
+ expect(hookIndex).to.be.greaterThan(-1);
498
+ expect(ismIndex).to.be.greaterThan(-1);
499
+ expect(hookIndex).to.be.lessThan(ismIndex);
500
+ });
501
+ it('should set new deployed hook mailbox to WarpConfig.owner', async () => {
502
+ const config = {
503
+ ...baseConfig,
504
+ type: TokenType.native,
505
+ };
506
+ // Deploy using WarpModule
507
+ const evmERC20WarpModule = await EvmWarpModule.create({
508
+ chain,
509
+ config,
510
+ multiProvider,
511
+ proxyFactoryFactories: ismFactoryAddresses,
512
+ });
513
+ const actualConfig = await evmERC20WarpModule.read();
514
+ const expectedConfig = {
515
+ ...actualConfig,
516
+ hook: hookConfigToUpdate.find((c) => c.type === HookType.MERKLE_TREE),
517
+ };
518
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
519
+ const updatedConfig = await evmERC20WarpModule.read();
520
+ const hook = MailboxClient__factory.connect(derivedHookAddress(updatedConfig), multiProvider.getProvider(chain));
521
+ expect(await hook.mailbox()).to.equal(expectedConfig.mailbox);
522
+ });
523
+ it("should set Proxied Hook's proxyAdmins to WarpConfig.proxyAdmin", async () => {
524
+ const config = {
525
+ ...baseConfig,
526
+ type: TokenType.native,
527
+ };
528
+ // Deploy using WarpModule
529
+ const evmERC20WarpModule = await EvmWarpModule.create({
530
+ chain,
531
+ config,
532
+ multiProvider,
533
+ proxyFactoryFactories: ismFactoryAddresses,
534
+ });
535
+ const actualConfig = await evmERC20WarpModule.read();
536
+ const expectedConfig = {
537
+ ...actualConfig,
538
+ hook: hookConfigToUpdate.find((c) => c.type === HookType.INTERCHAIN_GAS_PAYMASTER),
539
+ };
540
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
541
+ const updatedConfig = await evmERC20WarpModule.read();
542
+ expect(await proxyAdmin(multiProvider.getProvider(chain), derivedHookAddress(updatedConfig))).to.equal(expectedConfig.proxyAdmin?.address);
543
+ });
544
+ it('should update a mutable Ism', async () => {
545
+ const ismConfig = {
546
+ type: IsmType.ROUTING,
547
+ owner: signer.address,
548
+ domains: {
549
+ '1': ismAddress,
550
+ },
551
+ };
552
+ const ism = await EvmIsmModule.create({
553
+ chain,
554
+ multiProvider,
555
+ config: ismConfig,
556
+ proxyFactoryFactories: ismFactoryAddresses,
557
+ mailbox: mailbox.address,
558
+ });
559
+ const { deployedIsm } = ism.serialize();
560
+ // Deploy using WarpModule
561
+ const config = {
562
+ ...baseConfig,
563
+ type: TokenType.native,
564
+ interchainSecurityModule: deployedIsm,
565
+ };
566
+ const evmERC20WarpModule = await EvmWarpModule.create({
567
+ chain,
568
+ config,
569
+ multiProvider,
570
+ proxyFactoryFactories: ismFactoryAddresses,
571
+ });
572
+ const actualConfig = await evmERC20WarpModule.read();
573
+ const expectedConfig = {
574
+ ...actualConfig,
575
+ interchainSecurityModule: {
576
+ type: IsmType.ROUTING,
577
+ owner: randomAddress(),
578
+ domains: {
579
+ test2: { type: IsmType.TEST_ISM },
580
+ },
581
+ },
582
+ };
583
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
584
+ const updatedConfig = normalizeConfig((await evmERC20WarpModule.read()).interchainSecurityModule);
585
+ expect(updatedConfig).to.deep.equal(expectedConfig.interchainSecurityModule);
586
+ });
587
+ it('should enroll connected routers', async () => {
588
+ const config = {
589
+ ...baseConfig,
590
+ type: TokenType.native,
591
+ ismFactoryAddresses,
592
+ };
593
+ // Deploy using WarpModule
594
+ const evmERC20WarpModule = await EvmWarpModule.create({
595
+ chain,
596
+ config: {
597
+ ...config,
598
+ interchainSecurityModule: ismAddress,
599
+ },
600
+ multiProvider,
601
+ proxyFactoryFactories: ismFactoryAddresses,
602
+ });
603
+ const numOfRouters = randomInt(10, 0);
604
+ await sendTxs(await evmERC20WarpModule.update({
605
+ ...config,
606
+ remoteRouters: randomRemoteRouters(numOfRouters),
607
+ }));
608
+ const updatedConfig = await evmERC20WarpModule.read();
609
+ expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(numOfRouters);
610
+ });
611
+ it('should unenroll connected routers', async () => {
612
+ const config = {
613
+ ...baseConfig,
614
+ type: TokenType.native,
615
+ ismFactoryAddresses,
616
+ };
617
+ // Deploy using WarpModule
618
+ const evmERC20WarpModule = await EvmWarpModule.create({
619
+ chain,
620
+ config: {
621
+ ...config,
622
+ interchainSecurityModule: ismAddress,
623
+ },
624
+ multiProvider,
625
+ proxyFactoryFactories: ismFactoryAddresses,
626
+ });
627
+ const numOfRouters = randomInt(10, 0);
628
+ await sendTxs(await evmERC20WarpModule.update({
629
+ ...config,
630
+ remoteRouters: randomRemoteRouters(numOfRouters),
631
+ }));
632
+ // Read config & delete remoteRouters
633
+ const existingConfig = await evmERC20WarpModule.read();
634
+ for (let i = 0; i < numOfRouters; i++) {
635
+ delete existingConfig.remoteRouters?.[i.toString()];
636
+ // Also remove corresponding destinationGas entry to stay consistent
637
+ if (existingConfig.destinationGas) {
638
+ delete existingConfig.destinationGas[i.toString()];
639
+ }
640
+ await sendTxs(await evmERC20WarpModule.update(existingConfig));
641
+ const updatedConfig = await evmERC20WarpModule.read();
642
+ expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(numOfRouters - (i + 1));
643
+ }
644
+ });
645
+ it('should replace an enrollment if they are new one different, if the config lengths are the same', async () => {
646
+ const config = {
647
+ ...baseConfig,
648
+ type: TokenType.native,
649
+ ismFactoryAddresses,
650
+ };
651
+ // Deploy using WarpModule
652
+ const evmERC20WarpModule = await EvmWarpModule.create({
653
+ chain,
654
+ config: {
655
+ ...config,
656
+ interchainSecurityModule: ismAddress,
657
+ },
658
+ multiProvider,
659
+ proxyFactoryFactories: ismFactoryAddresses,
660
+ });
661
+ const remoteRouters = randomRemoteRouters(1);
662
+ await sendTxs(await evmERC20WarpModule.update({
663
+ ...config,
664
+ remoteRouters,
665
+ }));
666
+ let updatedConfig = await evmERC20WarpModule.read();
667
+ expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(1);
668
+ // Try to extend with the same remoteRouters
669
+ let txs = await evmERC20WarpModule.update({
670
+ ...config,
671
+ remoteRouters,
672
+ });
673
+ expect(txs.length).to.equal(0);
674
+ await sendTxs(txs);
675
+ // Try to extend with the different remoteRouters, but same length
676
+ const extendedRemoteRouter = {
677
+ 3: {
678
+ address: randomAddress(),
679
+ },
680
+ };
681
+ txs = await evmERC20WarpModule.update({
682
+ ...config,
683
+ remoteRouters: extendedRemoteRouter,
684
+ });
685
+ expect(txs.length).to.equal(2);
686
+ await sendTxs(txs);
687
+ updatedConfig = await evmERC20WarpModule.read();
688
+ expect(Object.keys(updatedConfig.remoteRouters).length).to.be.equal(1);
689
+ expect(updatedConfig.remoteRouters?.['3'].address.toLowerCase()).to.be.eq(addressToBytes32(extendedRemoteRouter['3'].address));
690
+ });
691
+ it('normalizes chain-name crossCollateralRouters keys for multicollateral enroll/unenroll txs', async () => {
692
+ const destinationDomain = multiProvider.getDomainId(TestChainName.test2);
693
+ const keepRouterAddress = '0x1111111111111111111111111111111111111111';
694
+ const keepRouter = addressToBytes32(keepRouterAddress);
695
+ const addRouterAddress = '0x2222222222222222222222222222222222222222';
696
+ const addRouter = addressToBytes32(addRouterAddress);
697
+ const removeRouterAddress = '0x3333333333333333333333333333333333333333';
698
+ const removeRouter = addressToBytes32(removeRouterAddress);
699
+ const module = new EvmWarpModule(multiProvider, {
700
+ chain,
701
+ config: {
702
+ ...baseConfig,
703
+ type: TokenType.crossCollateral,
704
+ token: token.address,
705
+ },
706
+ addresses: {
707
+ deployedTokenRoute: randomAddress(),
708
+ },
709
+ });
710
+ const actualConfig = {
711
+ ...baseConfig,
712
+ type: TokenType.crossCollateral,
713
+ token: token.address,
714
+ crossCollateralRouters: {
715
+ [destinationDomain]: [keepRouter, removeRouter],
716
+ },
717
+ };
718
+ const expectedConfig = {
719
+ ...baseConfig,
720
+ type: TokenType.crossCollateral,
721
+ token: token.address,
722
+ crossCollateralRouters: {
723
+ [TestChainName.test2]: [keepRouterAddress.toUpperCase(), addRouter],
724
+ },
725
+ };
726
+ const enrollTxs = module.createEnrollCrossCollateralRoutersTxs(actualConfig, expectedConfig);
727
+ expect(enrollTxs.length).to.equal(1);
728
+ const [enrollDomains, enrollRouters] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('enrollCrossCollateralRouters', enrollTxs[0].data);
729
+ expect(enrollDomains.map(Number)).to.deep.equal([destinationDomain]);
730
+ expect(enrollRouters[0].toLowerCase()).to.equal(addRouter.toLowerCase());
731
+ const unenrollTxs = module.createUnenrollCrossCollateralRoutersTxs(actualConfig, expectedConfig);
732
+ expect(unenrollTxs.length).to.equal(1);
733
+ const [unenrollDomains, unenrollRouters] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('unenrollCrossCollateralRouters', unenrollTxs[0].data);
734
+ expect(unenrollDomains.map(Number)).to.deep.equal([destinationDomain]);
735
+ expect(unenrollRouters[0].toLowerCase()).to.equal(removeRouter.toLowerCase());
736
+ });
737
+ it('unenrolls all crossCollateralRouters when expected config omits crossCollateralRouters', async () => {
738
+ const destinationDomain = multiProvider.getDomainId(TestChainName.test2);
739
+ const routerOne = addressToBytes32('0x3333333333333333333333333333333333333333');
740
+ const routerTwo = addressToBytes32('0x4444444444444444444444444444444444444444');
741
+ const module = new EvmWarpModule(multiProvider, {
742
+ chain,
743
+ config: {
744
+ ...baseConfig,
745
+ type: TokenType.crossCollateral,
746
+ token: token.address,
747
+ },
748
+ addresses: {
749
+ deployedTokenRoute: randomAddress(),
750
+ },
751
+ });
752
+ const actualConfig = {
753
+ ...baseConfig,
754
+ type: TokenType.crossCollateral,
755
+ token: token.address,
756
+ crossCollateralRouters: {
757
+ [destinationDomain]: [routerOne, routerTwo],
758
+ },
759
+ };
760
+ const expectedConfig = {
761
+ ...baseConfig,
762
+ type: TokenType.crossCollateral,
763
+ token: token.address,
764
+ };
765
+ const unenrollTxs = module.createUnenrollCrossCollateralRoutersTxs(actualConfig, expectedConfig);
766
+ expect(unenrollTxs.length).to.equal(1);
767
+ const [unenrollDomains, unenrollRouters] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('unenrollCrossCollateralRouters', unenrollTxs[0].data);
768
+ expect(unenrollDomains.map(Number)).to.deep.equal([
769
+ destinationDomain,
770
+ destinationDomain,
771
+ ]);
772
+ expect(unenrollRouters.map((router) => router.toLowerCase()).sort()).to.deep.equal([routerOne.toLowerCase(), routerTwo.toLowerCase()].sort());
773
+ });
774
+ it('preserves canonical bytes32 rebalance targets and recipients', () => {
775
+ const localDomain = multiProvider.getDomainId(chain);
776
+ const target = addressToBytes32('0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
777
+ const recipient = addressToBytes32('0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
778
+ const module = new EvmWarpModule(multiProvider, {
779
+ chain,
780
+ config: {
781
+ ...baseConfig,
782
+ type: TokenType.crossCollateral,
783
+ token: token.address,
784
+ },
785
+ addresses: {
786
+ ...ismFactoryAddresses,
787
+ deployedTokenRoute: randomAddress(),
788
+ },
789
+ });
790
+ const actualConfig = {
791
+ ...baseConfig,
792
+ hook: ethers.constants.AddressZero,
793
+ interchainSecurityModule: ethers.constants.AddressZero,
794
+ type: TokenType.crossCollateral,
795
+ token: token.address,
796
+ tokenFee: undefined,
797
+ rebalanceTargets: {},
798
+ rebalanceRecipients: {},
799
+ };
800
+ const expectedConfig = {
801
+ ...baseConfig,
802
+ type: TokenType.crossCollateral,
803
+ token: token.address,
804
+ rebalanceTargets: { [localDomain]: [target] },
805
+ rebalanceRecipients: { [localDomain]: recipient },
806
+ };
807
+ const [targetTx] = module.createAddRebalanceTargetsUpdateTxs(actualConfig, expectedConfig);
808
+ assert(targetTx.data, 'Expected rebalance target calldata');
809
+ const [, decodedTarget] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('addRebalanceTarget(uint32,bytes32)', targetTx.data);
810
+ expect(decodedTarget.toLowerCase()).to.equal(target);
811
+ const [recipientTx] = module.createSetRecipientsUpdateTxs(actualConfig, expectedConfig);
812
+ assert(recipientTx.data, 'Expected rebalance recipient calldata');
813
+ const [, decodedRecipient] = CrossCollateralRouter__factory.createInterface().decodeFunctionData('setRecipient(uint32,bytes32)', recipientTx.data);
814
+ expect(decodedRecipient.toLowerCase()).to.equal(recipient);
815
+ });
816
+ it('rejects rebalance domains that cannot be read back', () => {
817
+ const localDomain = multiProvider.getDomainId(chain);
818
+ const unknownDomain = localDomain + 1000;
819
+ const module = new EvmWarpModule(multiProvider, {
820
+ chain,
821
+ config: {
822
+ ...baseConfig,
823
+ type: TokenType.crossCollateral,
824
+ token: token.address,
825
+ },
826
+ addresses: {
827
+ ...ismFactoryAddresses,
828
+ deployedTokenRoute: randomAddress(),
829
+ },
830
+ });
831
+ const actualConfig = {
832
+ ...baseConfig,
833
+ hook: ethers.constants.AddressZero,
834
+ interchainSecurityModule: ethers.constants.AddressZero,
835
+ type: TokenType.crossCollateral,
836
+ token: token.address,
837
+ tokenFee: undefined,
838
+ };
839
+ const expectedConfig = {
840
+ ...baseConfig,
841
+ type: TokenType.crossCollateral,
842
+ token: token.address,
843
+ rebalanceTargets: {
844
+ [unknownDomain]: [addressToBytes32(randomAddress())],
845
+ },
846
+ };
847
+ expect(() => module.createAddRebalanceTargetsUpdateTxs(actualConfig, expectedConfig)).to.throw(`Rebalance domain ${unknownDomain}`);
848
+ });
849
+ it('removes stale rebalance config when expected fields are omitted', () => {
850
+ const localDomain = multiProvider.getDomainId(chain);
851
+ const target = addressToBytes32(randomAddress());
852
+ const recipient = addressToBytes32(randomAddress());
853
+ const module = new EvmWarpModule(multiProvider, {
854
+ chain,
855
+ config: {
856
+ ...baseConfig,
857
+ type: TokenType.crossCollateral,
858
+ token: token.address,
859
+ },
860
+ addresses: {
861
+ ...ismFactoryAddresses,
862
+ deployedTokenRoute: randomAddress(),
863
+ },
864
+ });
865
+ const actualConfig = {
866
+ ...baseConfig,
867
+ hook: ethers.constants.AddressZero,
868
+ interchainSecurityModule: ethers.constants.AddressZero,
869
+ type: TokenType.crossCollateral,
870
+ token: token.address,
871
+ tokenFee: undefined,
872
+ rebalanceTargets: { [localDomain]: [target] },
873
+ rebalanceRecipients: { [localDomain]: recipient },
874
+ };
875
+ const expectedConfig = {
876
+ ...baseConfig,
877
+ type: TokenType.crossCollateral,
878
+ token: token.address,
879
+ };
880
+ expect(module.createRemoveRebalanceTargetsTxs(actualConfig, expectedConfig)).to.have.length(1);
881
+ expect(module.createRemoveRecipientsTxs(actualConfig, expectedConfig)).to.have.length(1);
882
+ });
883
+ it('includes MC crossCollateralRouters domains in destination gas txs', async () => {
884
+ const destinationDomain = multiProvider.getDomainId(TestChainName.test2);
885
+ const enrolledRouter = addressToBytes32('0x4444444444444444444444444444444444444444');
886
+ const module = new EvmWarpModule(multiProvider, {
887
+ chain,
888
+ config: {
889
+ ...baseConfig,
890
+ type: TokenType.crossCollateral,
891
+ token: token.address,
892
+ },
893
+ addresses: {
894
+ deployedTokenRoute: randomAddress(),
895
+ },
896
+ });
897
+ const actualConfig = {
898
+ ...baseConfig,
899
+ type: TokenType.crossCollateral,
900
+ token: token.address,
901
+ destinationGas: {},
902
+ crossCollateralRouters: {
903
+ [destinationDomain]: [enrolledRouter],
904
+ },
905
+ };
906
+ // Config has destinationGas for test2, but no remoteRouters — only crossCollateralRouters
907
+ const expectedConfig = {
908
+ ...baseConfig,
909
+ type: TokenType.crossCollateral,
910
+ token: token.address,
911
+ crossCollateralRouters: {
912
+ [TestChainName.test2]: [enrolledRouter],
913
+ },
914
+ destinationGas: {
915
+ [TestChainName.test2]: '200000',
916
+ },
917
+ };
918
+ const gasTxs = module.createSetDestinationGasUpdateTxs(actualConfig, expectedConfig);
919
+ // Should produce a tx (not throw) even without remoteRouters
920
+ expect(gasTxs.length).to.equal(1);
921
+ // Should use standard setDestinationGas (MC overrides _setDestinationGas)
922
+ const gasRouterIface = GasRouter__factory.createInterface();
923
+ const decoded = gasRouterIface.decodeFunctionData('setDestinationGas((uint32,uint256)[])', gasTxs[0].data);
924
+ expect(decoded[0].length).to.equal(1);
925
+ expect(decoded[0][0].domain).to.equal(destinationDomain);
926
+ expect(decoded[0][0].gas.toString()).to.equal('200000');
927
+ });
928
+ it('throws when destinationGas set but no remoteRouters or crossCollateralRouters', async () => {
929
+ const module = new EvmWarpModule(multiProvider, {
930
+ chain,
931
+ config: {
932
+ ...baseConfig,
933
+ type: TokenType.collateral,
934
+ token: token.address,
935
+ },
936
+ addresses: {
937
+ deployedTokenRoute: randomAddress(),
938
+ },
939
+ });
940
+ const actualConfig = {
941
+ ...baseConfig,
942
+ type: TokenType.collateral,
943
+ token: token.address,
944
+ destinationGas: {},
945
+ };
946
+ const expectedConfig = {
947
+ ...baseConfig,
948
+ type: TokenType.collateral,
949
+ token: token.address,
950
+ destinationGas: {
951
+ [TestChainName.test2]: '200000',
952
+ },
953
+ };
954
+ expect(() => module.createSetDestinationGasUpdateTxs(actualConfig, expectedConfig)).to.throw(/remoteRouters and crossCollateralRouters are empty/);
955
+ });
956
+ it('should update the owner only if they are different', async () => {
957
+ const config = {
958
+ ...baseConfig,
959
+ type: TokenType.native,
960
+ ismFactoryAddresses,
961
+ };
962
+ const owner = signer.address.toLowerCase();
963
+ const evmERC20WarpModule = await EvmWarpModule.create({
964
+ chain,
965
+ config: {
966
+ ...config,
967
+ interchainSecurityModule: ismAddress,
968
+ },
969
+ multiProvider,
970
+ proxyFactoryFactories: ismFactoryAddresses,
971
+ });
972
+ const currentConfig = await evmERC20WarpModule.read();
973
+ expect(currentConfig.owner.toLowerCase()).to.equal(owner);
974
+ const newOwner = randomAddress();
975
+ await sendTxs(await evmERC20WarpModule.update({
976
+ ...config,
977
+ owner: newOwner,
978
+ }));
979
+ const latestConfig = normalizeConfig(await evmERC20WarpModule.read());
980
+ expect(latestConfig.owner).to.equal(newOwner);
981
+ // No op if the same owner
982
+ const txs = await evmERC20WarpModule.update({
983
+ ...config,
984
+ owner: newOwner,
985
+ });
986
+ expect(txs.length).to.equal(0);
987
+ });
988
+ it('should update the ProxyAdmin owner only if they are different', async () => {
989
+ const config = {
990
+ ...baseConfig,
991
+ type: TokenType.native,
992
+ };
993
+ const owner = signer.address.toLowerCase();
994
+ const evmERC20WarpModule = await EvmWarpModule.create({
995
+ chain,
996
+ config: {
997
+ ...config,
998
+ interchainSecurityModule: ismAddress,
999
+ },
1000
+ multiProvider,
1001
+ proxyFactoryFactories: ismFactoryAddresses,
1002
+ });
1003
+ const currentConfig = await evmERC20WarpModule.read();
1004
+ expect(currentConfig.proxyAdmin?.owner.toLowerCase()).to.equal(owner);
1005
+ const newOwner = randomAddress();
1006
+ const updatedWarpCoreConfig = {
1007
+ ...config,
1008
+ proxyAdmin: {
1009
+ address: currentConfig.proxyAdmin.address,
1010
+ owner: newOwner,
1011
+ },
1012
+ };
1013
+ await sendTxs(await evmERC20WarpModule.update(updatedWarpCoreConfig));
1014
+ const latestConfig = normalizeConfig(await evmERC20WarpModule.read());
1015
+ expect(latestConfig.proxyAdmin?.owner).to.equal(newOwner);
1016
+ // Sanity check to be sure that the owner of the warp route token has not been updated if not changed
1017
+ expect(latestConfig.owner).to.equal(owner);
1018
+ // No op if the same owner
1019
+ const txs = await evmERC20WarpModule.update(updatedWarpCoreConfig);
1020
+ expect(txs.length).to.equal(0);
1021
+ });
1022
+ it('should reuse a configured ProxyAdmin timelock', async () => {
1023
+ const config = {
1024
+ ...baseConfig,
1025
+ type: TokenType.native,
1026
+ };
1027
+ const evmWarpModule = await EvmWarpModule.create({
1028
+ chain,
1029
+ config: {
1030
+ ...config,
1031
+ interchainSecurityModule: ismAddress,
1032
+ },
1033
+ multiProvider,
1034
+ proxyFactoryFactories: ismFactoryAddresses,
1035
+ });
1036
+ const timelockConfig = {
1037
+ delay: 259_200,
1038
+ roles: {
1039
+ proposer: signer.address,
1040
+ executor: signer.address,
1041
+ },
1042
+ };
1043
+ const firstUpdate = await evmWarpModule.updateSplit({
1044
+ ...config,
1045
+ timelock: timelockConfig,
1046
+ });
1047
+ expect(firstUpdate.ownershipTxs.length).to.equal(1);
1048
+ await sendTxs(firstUpdate.ownershipTxs);
1049
+ const secondUpdate = await evmWarpModule.updateSplit({
1050
+ ...config,
1051
+ timelock: timelockConfig,
1052
+ });
1053
+ expect(secondUpdate.txs).to.be.empty;
1054
+ expect(secondUpdate.feeTxs).to.be.empty;
1055
+ expect(secondUpdate.ownershipTxs).to.be.empty;
1056
+ });
1057
+ it('should update the destination gas', async () => {
1058
+ const domain = 3;
1059
+ const config = {
1060
+ ...baseConfig,
1061
+ type: TokenType.native,
1062
+ remoteRouters: {
1063
+ [domain]: {
1064
+ address: randomAddress(),
1065
+ },
1066
+ },
1067
+ };
1068
+ // Deploy using WarpModule
1069
+ const evmERC20WarpModule = await EvmWarpModule.create({
1070
+ chain,
1071
+ config: {
1072
+ ...config,
1073
+ },
1074
+ multiProvider,
1075
+ proxyFactoryFactories: ismFactoryAddresses,
1076
+ });
1077
+ await sendTxs(await evmERC20WarpModule.update({
1078
+ ...config,
1079
+ destinationGas: {
1080
+ [domain]: '5000',
1081
+ },
1082
+ }));
1083
+ const updatedConfig = await evmERC20WarpModule.read();
1084
+ expect(Object.keys(updatedConfig.destinationGas).length).to.be.equal(1);
1085
+ expect(updatedConfig.destinationGas[domain]).to.equal('5000');
1086
+ });
1087
+ it('should update the feeHook', async () => {
1088
+ const config = {
1089
+ ...baseConfig,
1090
+ type: TokenType.synthetic,
1091
+ name: TOKEN_NAME,
1092
+ symbol: TOKEN_NAME,
1093
+ decimals: TOKEN_DECIMALS,
1094
+ };
1095
+ const evmERC20WarpModule = await EvmWarpModule.create({
1096
+ chain,
1097
+ config,
1098
+ multiProvider,
1099
+ proxyFactoryFactories: ismFactoryAddresses,
1100
+ });
1101
+ // Verify no feeHook initially
1102
+ const initialConfig = await evmERC20WarpModule.read();
1103
+ expect(initialConfig.feeHook).to.be.undefined;
1104
+ // Set feeHook to a random address
1105
+ const feeHookAddress = randomAddress();
1106
+ const txs = await evmERC20WarpModule.update({
1107
+ ...config,
1108
+ feeHook: feeHookAddress,
1109
+ });
1110
+ expect(txs.length).to.equal(1);
1111
+ await sendTxs(txs);
1112
+ // Verify feeHook was set
1113
+ const updatedConfig = await evmERC20WarpModule.read();
1114
+ assert(updatedConfig.feeHook != null, 'feeHook should be set');
1115
+ expect(eqAddress(updatedConfig.feeHook, feeHookAddress)).to.be.true;
1116
+ });
1117
+ for (const tokenType of movableCollateralTypes) {
1118
+ it(`should add a new rebalancer on the deployed token if it is of type "${tokenType}"`, async () => {
1119
+ const initialRebalancer = randomAddress();
1120
+ const config = deepCopy(getMovableTokenConfig([initialRebalancer])[tokenType]);
1121
+ const evmERC20WarpModule = await EvmWarpModule.create({
1122
+ chain,
1123
+ config,
1124
+ multiProvider,
1125
+ proxyFactoryFactories: ismFactoryAddresses,
1126
+ });
1127
+ const expectedRebalancers = [initialRebalancer, randomAddress()];
1128
+ const txs = await evmERC20WarpModule.update({
1129
+ ...config,
1130
+ allowedRebalancers: expectedRebalancers,
1131
+ });
1132
+ expect(txs.length).to.equal(1);
1133
+ await sendTxs(txs);
1134
+ await assertAllowedRebalancers(evmERC20WarpModule, expectedRebalancers);
1135
+ });
1136
+ it(`should remove a rebalancer on the deployed token if the token is of type "${tokenType}"`, async () => {
1137
+ const rebalancerToKeep = randomAddress();
1138
+ const expectedRebalancers = [rebalancerToKeep];
1139
+ const rebalancers = new Set([rebalancerToKeep, randomAddress()]);
1140
+ const config = deepCopy(getMovableTokenConfig(Array.from(rebalancers))[tokenType]);
1141
+ const evmERC20WarpModule = await EvmWarpModule.create({
1142
+ chain,
1143
+ config,
1144
+ multiProvider,
1145
+ proxyFactoryFactories: ismFactoryAddresses,
1146
+ });
1147
+ const txs = await evmERC20WarpModule.update({
1148
+ ...config,
1149
+ allowedRebalancers: expectedRebalancers,
1150
+ });
1151
+ expect(txs.length).to.equal(1);
1152
+ await sendTxs(txs);
1153
+ await assertAllowedRebalancers(evmERC20WarpModule, expectedRebalancers);
1154
+ });
1155
+ it(`should not generate rebalancer update transactions if the address is in a different casing when token is of type "${tokenType}"`, async () => {
1156
+ const rebalancerToKeep = randomAddress();
1157
+ const config = deepCopy(getMovableTokenConfig([rebalancerToKeep.toLowerCase()])[tokenType]);
1158
+ const evmERC20WarpModule = await EvmWarpModule.create({
1159
+ chain,
1160
+ config,
1161
+ multiProvider,
1162
+ proxyFactoryFactories: ismFactoryAddresses,
1163
+ });
1164
+ const txs = await evmERC20WarpModule.update({
1165
+ ...config,
1166
+ allowedRebalancers: [rebalancerToKeep],
1167
+ });
1168
+ expect(txs.length).to.equal(0);
1169
+ });
1170
+ it(`should add the specified addresses as rebalancing bridges for tokens of type "${tokenType}"`, async () => {
1171
+ const movableTokenConfigs = getMovableTokenConfig();
1172
+ const config = {
1173
+ ...movableTokenConfigs[tokenType],
1174
+ remoteRouters: {
1175
+ [domainId]: {
1176
+ address: randomAddress(),
1177
+ },
1178
+ },
1179
+ };
1180
+ const allowedBridgeToAdd = normalizeAddressEvm(randomAddress());
1181
+ const evmERC20WarpModule = await EvmWarpModule.create({
1182
+ chain,
1183
+ config,
1184
+ multiProvider,
1185
+ proxyFactoryFactories: ismFactoryAddresses,
1186
+ });
1187
+ // Spoof a new (post-legacy) impl so `approvedTokens` are ignored: the new
1188
+ // router grants allowances per rebalance, so only the addBridge tx is emitted.
1189
+ const versionStub = sinon
1190
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1191
+ .resolves('12.0.0');
1192
+ const txs = await evmERC20WarpModule.update(HypTokenRouterConfigSchema.parse({
1193
+ ...config,
1194
+ allowedRebalancingBridges: {
1195
+ [domainId]: [
1196
+ {
1197
+ bridge: allowedBridgeToAdd,
1198
+ approvedTokens: [feeToken.address],
1199
+ },
1200
+ ],
1201
+ },
1202
+ }));
1203
+ versionStub.restore();
1204
+ expect(txs.length).to.equal(1);
1205
+ await sendTxs(txs);
1206
+ const warpTokenInstance = MovableCollateralRouter__factory.connect(evmERC20WarpModule.serialize().deployedTokenRoute, signer);
1207
+ const check = await warpTokenInstance.callStatic.allowedBridges(domainId);
1208
+ expect(check[0]).to.eql(allowedBridgeToAdd);
1209
+ const allowance = await feeToken.callStatic.allowance(evmERC20WarpModule.serialize().deployedTokenRoute, allowedBridgeToAdd);
1210
+ expect(allowance.toBigInt()).to.equal(0n);
1211
+ });
1212
+ it(`should remove rebalancing bridges for tokens of type "${tokenType}"`, async () => {
1213
+ const allowedBridgeToAdd = normalizeAddressEvm(randomAddress());
1214
+ const config = HypTokenRouterConfigSchema.parse({
1215
+ ...getMovableTokenConfig()[tokenType],
1216
+ remoteRouters: {
1217
+ [domainId]: {
1218
+ address: randomAddress(),
1219
+ },
1220
+ },
1221
+ allowedRebalancingBridges: {
1222
+ [domainId]: [
1223
+ {
1224
+ bridge: allowedBridgeToAdd,
1225
+ },
1226
+ ],
1227
+ },
1228
+ });
1229
+ const evmERC20WarpModule = await EvmWarpModule.create({
1230
+ chain,
1231
+ config,
1232
+ multiProvider,
1233
+ proxyFactoryFactories: ismFactoryAddresses,
1234
+ });
1235
+ const txs = await evmERC20WarpModule.update(HypTokenRouterConfigSchema.parse({
1236
+ ...config,
1237
+ allowedRebalancingBridges: {
1238
+ [domainId]: [],
1239
+ },
1240
+ }));
1241
+ // 1 tx to remove the bridge
1242
+ expect(txs.length).to.equal(1);
1243
+ await sendTxs(txs);
1244
+ const warpTokenInstance = MovableCollateralRouter__factory.connect(evmERC20WarpModule.serialize().deployedTokenRoute, signer);
1245
+ const allowedBridges = await warpTokenInstance.callStatic.allowedBridges(domainId);
1246
+ expect(allowedBridges).to.be.empty;
1247
+ });
1248
+ // Only collateral routes back the router with an ERC20 that could carry a
1249
+ // legacy standing allowance; native routes never had approvals.
1250
+ if (tokenType === TokenType.collateral) {
1251
+ // Plants a legacy type(uint256).max standing allowance from the router to
1252
+ // `bridge`, mimicking the pre-upgrade on-chain state left by `_addBridge`
1253
+ // (collateral token) or the legacy approvedTokens grant path (any token).
1254
+ const plantLegacyAllowance = async (router, bridge, erc20 = token) => {
1255
+ await hre.network.provider.request({
1256
+ method: 'hardhat_impersonateAccount',
1257
+ params: [router],
1258
+ });
1259
+ await hre.network.provider.request({
1260
+ method: 'hardhat_setBalance',
1261
+ params: [router, '0xDE0B6B3A7640000'],
1262
+ });
1263
+ const routerSigner = hre.ethers.provider.getSigner(router);
1264
+ await erc20
1265
+ .connect(routerSigner)
1266
+ .approve(bridge, ethers.constants.MaxUint256);
1267
+ await hre.network.provider.request({
1268
+ method: 'hardhat_stopImpersonatingAccount',
1269
+ params: [router],
1270
+ });
1271
+ };
1272
+ it(`should revoke a legacy standing bridge allowance during an in-place upgrade for a route of type "${tokenType}"`, async () => {
1273
+ const allowedBridge = normalizeAddressEvm(randomAddress());
1274
+ const config = HypTokenRouterConfigSchema.parse({
1275
+ ...getMovableTokenConfig()[tokenType],
1276
+ remoteRouters: {
1277
+ [domainId]: {
1278
+ address: randomAddress(),
1279
+ },
1280
+ },
1281
+ allowedRebalancingBridges: {
1282
+ [domainId]: [
1283
+ {
1284
+ bridge: allowedBridge,
1285
+ },
1286
+ ],
1287
+ },
1288
+ });
1289
+ const evmERC20WarpModule = await EvmWarpModule.create({
1290
+ chain,
1291
+ config,
1292
+ multiProvider,
1293
+ proxyFactoryFactories: ismFactoryAddresses,
1294
+ });
1295
+ const router = evmERC20WarpModule.serialize().deployedTokenRoute;
1296
+ await plantLegacyAllowance(router, allowedBridge);
1297
+ expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(ethers.constants.MaxUint256.toBigInt());
1298
+ // Spoof an old (pre-revoke-semantics) impl so update() generates an
1299
+ // upgrade tx and the revoke gate opens. fetchScale is stubbed because
1300
+ // old contracts (< 11.0.0) default scale to 1.
1301
+ const versionStub = sinon
1302
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1303
+ .resolves('11.3.0');
1304
+ const scaleStub = sinon
1305
+ .stub(evmERC20WarpModule.reader, 'fetchScale')
1306
+ .resolves(undefined);
1307
+ const txs = await evmERC20WarpModule.update({
1308
+ ...config,
1309
+ contractVersion: CONTRACTS_PACKAGE_VERSION,
1310
+ });
1311
+ await sendTxs(txs);
1312
+ versionStub.restore();
1313
+ scaleStub.restore();
1314
+ // The revoke runs against the new impl after the upgrade tx.
1315
+ expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
1316
+ });
1317
+ it(`should revoke a legacy approvedTokens allowance during an in-place upgrade for a route of type "${tokenType}"`, async () => {
1318
+ const allowedBridge = normalizeAddressEvm(randomAddress());
1319
+ const config = HypTokenRouterConfigSchema.parse({
1320
+ ...getMovableTokenConfig()[tokenType],
1321
+ remoteRouters: {
1322
+ [domainId]: {
1323
+ address: randomAddress(),
1324
+ },
1325
+ },
1326
+ allowedRebalancingBridges: {
1327
+ [domainId]: [
1328
+ {
1329
+ bridge: allowedBridge,
1330
+ approvedTokens: [feeToken.address],
1331
+ },
1332
+ ],
1333
+ },
1334
+ });
1335
+ const evmERC20WarpModule = await EvmWarpModule.create({
1336
+ chain,
1337
+ config,
1338
+ multiProvider,
1339
+ proxyFactoryFactories: ismFactoryAddresses,
1340
+ });
1341
+ const router = evmERC20WarpModule.serialize().deployedTokenRoute;
1342
+ // Plant legacy max allowances on BOTH the collateral token and the
1343
+ // approvedToken, mimicking the pre-upgrade grants for a remaining bridge.
1344
+ await plantLegacyAllowance(router, allowedBridge);
1345
+ await plantLegacyAllowance(router, allowedBridge, feeToken);
1346
+ // Spoof an old impl so update() generates an upgrade and the revoke gate opens.
1347
+ const versionStub = sinon
1348
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1349
+ .resolves('11.3.0');
1350
+ const scaleStub = sinon
1351
+ .stub(evmERC20WarpModule.reader, 'fetchScale')
1352
+ .resolves(undefined);
1353
+ const txs = await evmERC20WarpModule.update({
1354
+ ...config,
1355
+ contractVersion: CONTRACTS_PACKAGE_VERSION,
1356
+ });
1357
+ await sendTxs(txs);
1358
+ versionStub.restore();
1359
+ scaleStub.restore();
1360
+ // Both the collateral and the approvedToken allowance are cleared post-upgrade.
1361
+ expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
1362
+ expect((await feeToken.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
1363
+ });
1364
+ it(`should not emit a revoke tx when no upgrade is generated for a route of type "${tokenType}"`, async () => {
1365
+ const allowedBridge = normalizeAddressEvm(randomAddress());
1366
+ const config = HypTokenRouterConfigSchema.parse({
1367
+ ...getMovableTokenConfig()[tokenType],
1368
+ remoteRouters: {
1369
+ [domainId]: {
1370
+ address: randomAddress(),
1371
+ },
1372
+ },
1373
+ allowedRebalancingBridges: {
1374
+ [domainId]: [
1375
+ {
1376
+ bridge: allowedBridge,
1377
+ },
1378
+ ],
1379
+ },
1380
+ });
1381
+ const evmERC20WarpModule = await EvmWarpModule.create({
1382
+ chain,
1383
+ config,
1384
+ multiProvider,
1385
+ proxyFactoryFactories: ismFactoryAddresses,
1386
+ });
1387
+ const router = evmERC20WarpModule.serialize().deployedTokenRoute;
1388
+ // Plant a legacy allowance so a stray revoke would be visible.
1389
+ await plantLegacyAllowance(router, allowedBridge);
1390
+ // Keep the fixture on a legacy version. With no contractVersion bump,
1391
+ // update() generates no upgrade tx and the revoke gate stays closed.
1392
+ const versionStub = sinon
1393
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1394
+ .resolves(MAX_LEGACY_BRIDGE_APPROVAL_VERSION);
1395
+ const txs = await evmERC20WarpModule.update(config);
1396
+ await sendTxs(txs);
1397
+ versionStub.restore();
1398
+ // The legacy allowance is untouched (revoke must run only post-upgrade).
1399
+ expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(ethers.constants.MaxUint256.toBigInt());
1400
+ });
1401
+ it(`should revoke a stale allowance on an already-upgraded impl with no scheduled upgrade for a route of type "${tokenType}"`, async () => {
1402
+ const allowedBridge = normalizeAddressEvm(randomAddress());
1403
+ const config = HypTokenRouterConfigSchema.parse({
1404
+ ...getMovableTokenConfig()[tokenType],
1405
+ remoteRouters: {
1406
+ [domainId]: {
1407
+ address: randomAddress(),
1408
+ },
1409
+ },
1410
+ allowedRebalancingBridges: {
1411
+ [domainId]: [
1412
+ {
1413
+ bridge: allowedBridge,
1414
+ },
1415
+ ],
1416
+ },
1417
+ });
1418
+ const evmERC20WarpModule = await EvmWarpModule.create({
1419
+ chain,
1420
+ config,
1421
+ multiProvider,
1422
+ proxyFactoryFactories: ismFactoryAddresses,
1423
+ });
1424
+ const router = evmERC20WarpModule.serialize().deployedTokenRoute;
1425
+ // A stale legacy allowance left by a prior run that upgraded the impl but
1426
+ // whose revoke txs never executed.
1427
+ await plantLegacyAllowance(router, allowedBridge);
1428
+ // Spoof the on-chain version above the legacy bound (already upgraded).
1429
+ const versionStub = sinon
1430
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1431
+ .resolves('12.0.0');
1432
+ const scaleStub = sinon
1433
+ .stub(evmERC20WarpModule.reader, 'fetchScale')
1434
+ .resolves(undefined);
1435
+ const actualConfig = await evmERC20WarpModule.read();
1436
+ versionStub.restore();
1437
+ scaleStub.restore();
1438
+ // No upgrade scheduled this run, but the stale allowance must still be
1439
+ // cleaned up — the revoke runs against the already-new impl. This keeps
1440
+ // cleanup retryable after a partially-executed upgrade.
1441
+ const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, config, false);
1442
+ expect(revokeTxs.length).to.equal(1);
1443
+ await sendTxs(revokeTxs);
1444
+ expect((await token.callStatic.allowance(router, allowedBridge)).toBigInt()).to.equal(0n);
1445
+ });
1446
+ it(`should not emit a revoke tx on an already-upgraded impl with no stale allowance for a route of type "${tokenType}"`, async () => {
1447
+ const allowedBridge = normalizeAddressEvm(randomAddress());
1448
+ const config = HypTokenRouterConfigSchema.parse({
1449
+ ...getMovableTokenConfig()[tokenType],
1450
+ remoteRouters: {
1451
+ [domainId]: {
1452
+ address: randomAddress(),
1453
+ },
1454
+ },
1455
+ allowedRebalancingBridges: {
1456
+ [domainId]: [
1457
+ {
1458
+ bridge: allowedBridge,
1459
+ },
1460
+ ],
1461
+ },
1462
+ });
1463
+ const evmERC20WarpModule = await EvmWarpModule.create({
1464
+ chain,
1465
+ config,
1466
+ multiProvider,
1467
+ proxyFactoryFactories: ismFactoryAddresses,
1468
+ });
1469
+ // No allowance is planted: a clean already-upgraded router has nothing
1470
+ // stale, so the non-zero allowance filter emits no revoke tx.
1471
+ const versionStub = sinon
1472
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1473
+ .resolves('12.0.0');
1474
+ const scaleStub = sinon
1475
+ .stub(evmERC20WarpModule.reader, 'fetchScale')
1476
+ .resolves(undefined);
1477
+ const actualConfig = await evmERC20WarpModule.read();
1478
+ versionStub.restore();
1479
+ scaleStub.restore();
1480
+ const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, config, false);
1481
+ expect(revokeTxs).to.be.empty;
1482
+ });
1483
+ it(`should not emit a revoke tx for a removed bridge (handled on-chain by _removeBridge) for a route of type "${tokenType}"`, async () => {
1484
+ const removedBridge = normalizeAddressEvm(randomAddress());
1485
+ const config = HypTokenRouterConfigSchema.parse({
1486
+ ...getMovableTokenConfig()[tokenType],
1487
+ remoteRouters: {
1488
+ [domainId]: {
1489
+ address: randomAddress(),
1490
+ },
1491
+ },
1492
+ allowedRebalancingBridges: {
1493
+ [domainId]: [
1494
+ {
1495
+ bridge: removedBridge,
1496
+ },
1497
+ ],
1498
+ },
1499
+ });
1500
+ const evmERC20WarpModule = await EvmWarpModule.create({
1501
+ chain,
1502
+ config,
1503
+ multiProvider,
1504
+ proxyFactoryFactories: ismFactoryAddresses,
1505
+ });
1506
+ const router = evmERC20WarpModule.serialize().deployedTokenRoute;
1507
+ // Give the bridge a legacy standing allowance so a stray revoke would be visible.
1508
+ await plantLegacyAllowance(router, removedBridge);
1509
+ // The bridge is dropped from the expected config: _removeBridge revokes it
1510
+ // on-chain, so this method must not emit a revoke tx for it (intersection
1511
+ // of actual and expected allowlisted bridges is empty).
1512
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
1513
+ ...config,
1514
+ allowedRebalancingBridges: {
1515
+ [domainId]: [],
1516
+ },
1517
+ });
1518
+ const actualConfig = await evmERC20WarpModule.read();
1519
+ const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, true);
1520
+ expect(revokeTxs).to.be.empty;
1521
+ });
1522
+ it(`should not emit a revoke tx for a newly-added bridge for a route of type "${tokenType}"`, async () => {
1523
+ const config = HypTokenRouterConfigSchema.parse({
1524
+ ...getMovableTokenConfig()[tokenType],
1525
+ remoteRouters: {
1526
+ [domainId]: {
1527
+ address: randomAddress(),
1528
+ },
1529
+ },
1530
+ allowedRebalancingBridges: {
1531
+ [domainId]: [],
1532
+ },
1533
+ });
1534
+ const evmERC20WarpModule = await EvmWarpModule.create({
1535
+ chain,
1536
+ config,
1537
+ multiProvider,
1538
+ proxyFactoryFactories: ismFactoryAddresses,
1539
+ });
1540
+ // A bridge present in expected but not in actual is brand new; it never held
1541
+ // a legacy allowance, so no revoke tx should be emitted for it.
1542
+ const addedBridge = normalizeAddressEvm(randomAddress());
1543
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
1544
+ ...config,
1545
+ allowedRebalancingBridges: {
1546
+ [domainId]: [
1547
+ {
1548
+ bridge: addedBridge,
1549
+ },
1550
+ ],
1551
+ },
1552
+ });
1553
+ const actualConfig = await evmERC20WarpModule.read();
1554
+ const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, true);
1555
+ expect(revokeTxs).to.be.empty;
1556
+ });
1557
+ it(`should revoke a stale allowance for a bridge moved between domains for a route of type "${tokenType}"`, async () => {
1558
+ const movedBridge = normalizeAddressEvm(randomAddress());
1559
+ const config = HypTokenRouterConfigSchema.parse({
1560
+ ...getMovableTokenConfig()[tokenType],
1561
+ remoteRouters: {
1562
+ [domainId]: {
1563
+ address: randomAddress(),
1564
+ },
1565
+ },
1566
+ allowedRebalancingBridges: {
1567
+ [domainId]: [
1568
+ {
1569
+ bridge: movedBridge,
1570
+ approvedTokens: [feeToken.address],
1571
+ },
1572
+ ],
1573
+ },
1574
+ });
1575
+ const evmERC20WarpModule = await EvmWarpModule.create({
1576
+ chain,
1577
+ config,
1578
+ multiProvider,
1579
+ proxyFactoryFactories: ismFactoryAddresses,
1580
+ });
1581
+ const router = evmERC20WarpModule.serialize().deployedTokenRoute;
1582
+ // Legacy allowances on both the collateral and the approvedToken.
1583
+ await plantLegacyAllowance(router, movedBridge);
1584
+ await plantLegacyAllowance(router, movedBridge, feeToken);
1585
+ // Expected config keeps the same bridge but on a different domain. ERC20
1586
+ // allowances are (router, bridge) and domain-agnostic, so the stale
1587
+ // allowance must still be revoked despite the move.
1588
+ const otherChain = TestChainName.test2;
1589
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
1590
+ ...config,
1591
+ remoteRouters: {
1592
+ [domainId]: {
1593
+ address: randomAddress(),
1594
+ },
1595
+ [otherChain]: {
1596
+ address: randomAddress(),
1597
+ },
1598
+ },
1599
+ allowedRebalancingBridges: {
1600
+ [otherChain]: [
1601
+ {
1602
+ bridge: movedBridge,
1603
+ approvedTokens: [feeToken.address],
1604
+ },
1605
+ ],
1606
+ },
1607
+ });
1608
+ const actualConfig = await evmERC20WarpModule.read();
1609
+ const revokeTxs = await evmERC20WarpModule.createRevokeStaleBridgeAllowancesTxs(actualConfig, expectedConfig, true);
1610
+ const revokedTokens = revokeTxs.map((tx) => {
1611
+ assert(tx.data, 'expected revoke calldata');
1612
+ const [revokedToken] = MovableCollateralRouter__factory.createInterface().decodeFunctionData('approveTokenForBridge(address,address)', tx.data);
1613
+ return normalizeAddressEvm(revokedToken);
1614
+ });
1615
+ expect(revokedTokens).to.have.members([
1616
+ normalizeAddressEvm(token.address),
1617
+ normalizeAddressEvm(feeToken.address),
1618
+ ]);
1619
+ });
1620
+ it(`should emit an approval tx for approvedTokens on a legacy router for a route of type "${tokenType}"`, async () => {
1621
+ const allowedBridge = normalizeAddressEvm(randomAddress());
1622
+ const config = HypTokenRouterConfigSchema.parse({
1623
+ ...getMovableTokenConfig()[tokenType],
1624
+ remoteRouters: {
1625
+ [domainId]: {
1626
+ address: randomAddress(),
1627
+ },
1628
+ },
1629
+ allowedRebalancingBridges: {
1630
+ [domainId]: [
1631
+ {
1632
+ bridge: allowedBridge,
1633
+ approvedTokens: [feeToken.address],
1634
+ },
1635
+ ],
1636
+ },
1637
+ });
1638
+ const evmERC20WarpModule = await EvmWarpModule.create({
1639
+ chain,
1640
+ config,
1641
+ multiProvider,
1642
+ proxyFactoryFactories: ismFactoryAddresses,
1643
+ });
1644
+ // Spoof a legacy impl so `approveTokenForBridge` still grants max. The
1645
+ // emitted tx isn't executed here: the real (new-semantics) impl would
1646
+ // revoke instead of grant, so we assert on the SDK's intent — the grant
1647
+ // selector targeting the configured token and bridge.
1648
+ const versionStub = sinon
1649
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
1650
+ .resolves('11.3.0');
1651
+ const scaleStub = sinon
1652
+ .stub(evmERC20WarpModule.reader, 'fetchScale')
1653
+ .resolves(undefined);
1654
+ const actualConfig = await evmERC20WarpModule.read();
1655
+ versionStub.restore();
1656
+ scaleStub.restore();
1657
+ const approvalTxs = await evmERC20WarpModule.getAllowedBridgesApprovalTxs(actualConfig, config);
1658
+ expect(approvalTxs.length).to.equal(1);
1659
+ expect(approvalTxs[0].to).to.equal(evmERC20WarpModule.serialize().deployedTokenRoute);
1660
+ assert(approvalTxs[0].data, 'expected approval calldata');
1661
+ const [token, bridge] = MovableCollateralRouter__factory.createInterface().decodeFunctionData('approveTokenForBridge(address,address)', approvalTxs[0].data);
1662
+ expect(eqAddress(token, feeToken.address)).to.be.true;
1663
+ expect(eqAddress(bridge, allowedBridge)).to.be.true;
1664
+ });
1665
+ }
1666
+ it(`should not generate update transactions for the allowed rebalancing bridges if the address is in a different casing when token is of type "${tokenType}"`, async () => {
1667
+ const movableTokenConfigs = getMovableTokenConfig();
1668
+ const allowedBridgeToAdd = normalizeAddressEvm(randomAddress());
1669
+ const config = HypTokenRouterConfigSchema.parse({
1670
+ ...movableTokenConfigs[tokenType],
1671
+ remoteRouters: {
1672
+ [domainId]: {
1673
+ address: randomAddress(),
1674
+ },
1675
+ },
1676
+ allowedRebalancingBridges: {
1677
+ [domainId]: [
1678
+ {
1679
+ bridge: allowedBridgeToAdd,
1680
+ },
1681
+ ],
1682
+ },
1683
+ });
1684
+ const evmERC20WarpModule = await EvmWarpModule.create({
1685
+ chain,
1686
+ config,
1687
+ multiProvider,
1688
+ proxyFactoryFactories: ismFactoryAddresses,
1689
+ });
1690
+ const txs = await evmERC20WarpModule.update(HypTokenRouterConfigSchema.parse({
1691
+ ...config,
1692
+ allowedRebalancingBridges: {
1693
+ [domainId]: [
1694
+ {
1695
+ bridge: allowedBridgeToAdd.toLowerCase(),
1696
+ },
1697
+ ],
1698
+ },
1699
+ }));
1700
+ expect(txs.length).to.equal(0);
1701
+ });
1702
+ it(`should add and remove a bridge on the deployed token if it is of type "${tokenType}" and the router map uses chain names instead of domainIds`, async () => {
1703
+ const bridges = [randomAddress(), randomAddress()];
1704
+ const remoteRouter = randomAddress();
1705
+ const config = deepCopy(getMovableTokenConfig()[tokenType]);
1706
+ const evmERC20WarpModule = await EvmWarpModule.create({
1707
+ chain,
1708
+ config: {
1709
+ ...config,
1710
+ remoteRouters: {
1711
+ [domainId]: {
1712
+ address: remoteRouter,
1713
+ },
1714
+ },
1715
+ },
1716
+ multiProvider,
1717
+ proxyFactoryFactories: ismFactoryAddresses,
1718
+ });
1719
+ let testCase = 0;
1720
+ for (const bridge of bridges) {
1721
+ const expectedNumOfTxs = testCase === 0 ? 1 : 2;
1722
+ const txs = await evmERC20WarpModule.update({
1723
+ ...config,
1724
+ allowedRebalancingBridges: {
1725
+ [chain]: [{ bridge }],
1726
+ },
1727
+ });
1728
+ expect(txs.length).to.equal(expectedNumOfTxs);
1729
+ await sendTxs(txs);
1730
+ const currentConfig = await evmERC20WarpModule.read();
1731
+ assert(isMovableCollateralTokenConfig(currentConfig), '');
1732
+ const [bridgeConfig] = Object.values(currentConfig.allowedRebalancingBridges ?? {});
1733
+ expect(bridgeConfig).to.exist;
1734
+ expect(bridgeConfig.length).to.eql(1);
1735
+ expect(eqAddress(bridgeConfig[0].bridge, bridge)).to.be.true;
1736
+ testCase++;
1737
+ }
1738
+ });
1739
+ }
1740
+ for (const tokenType of everclearTokenBridgeTypes) {
1741
+ it(`should add destination outputAssets if the token is of type ${tokenType}`, async () => {
1742
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1743
+ const evmERC20WarpModule = await EvmWarpModule.create({
1744
+ chain,
1745
+ config,
1746
+ multiProvider,
1747
+ proxyFactoryFactories: ismFactoryAddresses,
1748
+ });
1749
+ const remoteToken = randomAddress();
1750
+ const txs = await evmERC20WarpModule.update({
1751
+ ...config,
1752
+ outputAssets: {
1753
+ [domainId]: remoteToken,
1754
+ },
1755
+ });
1756
+ expect(txs.length).to.equal(1);
1757
+ await sendTxs(txs);
1758
+ const currentConfig = await evmERC20WarpModule.read();
1759
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1760
+ expect(currentConfig.outputAssets[domainId]).to.equal(addressToBytes32(remoteToken));
1761
+ });
1762
+ it(`should overwrite a destination outputAssets if the token is of type ${tokenType} and a destination token already exists for the given destination`, async () => {
1763
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1764
+ const evmERC20WarpModule = await EvmWarpModule.create({
1765
+ chain,
1766
+ config: {
1767
+ ...config,
1768
+ outputAssets: {
1769
+ [domainId]: randomAddress(),
1770
+ },
1771
+ },
1772
+ multiProvider,
1773
+ proxyFactoryFactories: ismFactoryAddresses,
1774
+ });
1775
+ const expectedRemoteOutputToken = randomAddress();
1776
+ const txs = await evmERC20WarpModule.update({
1777
+ ...config,
1778
+ outputAssets: {
1779
+ [domainId]: expectedRemoteOutputToken,
1780
+ },
1781
+ });
1782
+ expect(txs.length).to.equal(1);
1783
+ await sendTxs(txs);
1784
+ const currentConfig = await evmERC20WarpModule.read();
1785
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1786
+ expect(currentConfig.outputAssets[domainId]).to.equal(addressToBytes32(expectedRemoteOutputToken));
1787
+ });
1788
+ it(`should remove destination outputAssets if the token is of type ${tokenType} and a config is set`, async () => {
1789
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1790
+ const evmERC20WarpModule = await EvmWarpModule.create({
1791
+ chain,
1792
+ config: {
1793
+ ...config,
1794
+ outputAssets: {
1795
+ [domainId]: randomAddress(),
1796
+ },
1797
+ },
1798
+ multiProvider,
1799
+ proxyFactoryFactories: ismFactoryAddresses,
1800
+ });
1801
+ const txs = await evmERC20WarpModule.update({
1802
+ ...config,
1803
+ outputAssets: {},
1804
+ });
1805
+ expect(txs.length).to.equal(1);
1806
+ await sendTxs(txs);
1807
+ const currentConfig = await evmERC20WarpModule.read();
1808
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1809
+ expect(currentConfig.outputAssets).to.deep.equal({});
1810
+ });
1811
+ it(`should remove 1 outputAsset and leave the others if the token is of type ${tokenType}`, async () => {
1812
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1813
+ const numOfRouters = randomInt(10, 0);
1814
+ const remoteRoutersToKeep = randomRemoteRouters(numOfRouters);
1815
+ const initialRemoteRouters = {
1816
+ [domainId]: {
1817
+ address: randomAddress(),
1818
+ },
1819
+ ...remoteRoutersToKeep,
1820
+ };
1821
+ const outputAssetsToKeep = objMap(remoteRoutersToKeep, (_domainId, _) => randomAddress());
1822
+ const expectedOutputAssets = objMap(outputAssetsToKeep, (_domainId, address) => addressToBytes32(address));
1823
+ const initialOutputAddresses = {
1824
+ [domainId]: randomAddress(),
1825
+ ...outputAssetsToKeep,
1826
+ };
1827
+ const evmERC20WarpModule = await EvmWarpModule.create({
1828
+ chain,
1829
+ config: {
1830
+ ...config,
1831
+ remoteRouters: initialRemoteRouters,
1832
+ outputAssets: initialOutputAddresses,
1833
+ },
1834
+ multiProvider,
1835
+ proxyFactoryFactories: ismFactoryAddresses,
1836
+ });
1837
+ const txs = await evmERC20WarpModule.update({
1838
+ ...config,
1839
+ remoteRouters: initialRemoteRouters,
1840
+ outputAssets: outputAssetsToKeep,
1841
+ });
1842
+ expect(txs.length).to.equal(1);
1843
+ await sendTxs(txs);
1844
+ const currentConfig = await evmERC20WarpModule.read();
1845
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1846
+ expect(currentConfig.outputAssets).to.deep.equal(expectedOutputAssets);
1847
+ });
1848
+ it(`should update the fee params if the token is of type ${tokenType}`, async () => {
1849
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1850
+ const evmERC20WarpModule = await EvmWarpModule.create({
1851
+ chain,
1852
+ config,
1853
+ multiProvider,
1854
+ proxyFactoryFactories: ismFactoryAddresses,
1855
+ });
1856
+ const expectedEverclearFeeParams = {
1857
+ [domainId]: {
1858
+ deadline: Date.now(),
1859
+ fee: randomInt(100000000, 100),
1860
+ signature: '0x42',
1861
+ },
1862
+ };
1863
+ const txs = await evmERC20WarpModule.update({
1864
+ ...config,
1865
+ everclearFeeParams: expectedEverclearFeeParams,
1866
+ });
1867
+ expect(txs.length).to.equal(1);
1868
+ await sendTxs(txs);
1869
+ const currentConfig = await evmERC20WarpModule.read();
1870
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1871
+ expect(currentConfig.everclearFeeParams).to.deep.equal(expectedEverclearFeeParams);
1872
+ });
1873
+ it(`should not generate any update transactions for the fee params if the config did not change and the token is of type ${tokenType}`, async () => {
1874
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1875
+ const expectedEverclearFeeParams = config.everclearFeeParams;
1876
+ const evmERC20WarpModule = await EvmWarpModule.create({
1877
+ chain,
1878
+ config,
1879
+ multiProvider,
1880
+ proxyFactoryFactories: ismFactoryAddresses,
1881
+ });
1882
+ const txs = await evmERC20WarpModule.update(config);
1883
+ expect(txs.length).to.equal(0);
1884
+ const currentConfig = await evmERC20WarpModule.read();
1885
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1886
+ expect(currentConfig.everclearFeeParams).to.deep.equal(expectedEverclearFeeParams);
1887
+ });
1888
+ it(`should remove everclear fee params if the token is of type ${tokenType}`, async () => {
1889
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1890
+ const evmERC20WarpModule = await EvmWarpModule.create({
1891
+ chain,
1892
+ config,
1893
+ multiProvider,
1894
+ proxyFactoryFactories: ismFactoryAddresses,
1895
+ });
1896
+ // Remove the fee params for the enrolled domain
1897
+ const txs = await evmERC20WarpModule.update({
1898
+ ...config,
1899
+ everclearFeeParams: {},
1900
+ });
1901
+ expect(txs.length).to.equal(1);
1902
+ await sendTxs(txs);
1903
+ const currentConfig = await evmERC20WarpModule.read();
1904
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1905
+ expect(currentConfig.everclearFeeParams).to.deep.equal({});
1906
+ });
1907
+ it(`should remove 1 everclear fee param and leave the others if the token is of type ${tokenType}`, async () => {
1908
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1909
+ const numOfRouters = randomInt(10, 0);
1910
+ const remoteRoutersToKeep = randomRemoteRouters(numOfRouters);
1911
+ const initialRemoteRouters = {
1912
+ [domainId]: {
1913
+ address: randomAddress(),
1914
+ },
1915
+ ...remoteRoutersToKeep,
1916
+ };
1917
+ const feeParamsToKeep = objMap(remoteRoutersToKeep, (_domainId, _) => ({
1918
+ deadline: Date.now(),
1919
+ fee: randomInt(1000),
1920
+ signature: '0x',
1921
+ }));
1922
+ const initialFeeParams = {
1923
+ [domainId]: {
1924
+ deadline: Date.now(),
1925
+ fee: randomInt(1000),
1926
+ signature: '0x',
1927
+ },
1928
+ ...feeParamsToKeep,
1929
+ };
1930
+ const evmERC20WarpModule = await EvmWarpModule.create({
1931
+ chain,
1932
+ config: {
1933
+ ...config,
1934
+ remoteRouters: initialRemoteRouters,
1935
+ everclearFeeParams: initialFeeParams,
1936
+ },
1937
+ multiProvider,
1938
+ proxyFactoryFactories: ismFactoryAddresses,
1939
+ });
1940
+ const txs = await evmERC20WarpModule.update({
1941
+ ...config,
1942
+ remoteRouters: initialRemoteRouters,
1943
+ everclearFeeParams: feeParamsToKeep,
1944
+ });
1945
+ expect(txs.length).to.equal(1);
1946
+ await sendTxs(txs);
1947
+ const currentConfig = await evmERC20WarpModule.read();
1948
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
1949
+ expect(currentConfig.everclearFeeParams).to.deep.equal(feeParamsToKeep);
1950
+ });
1951
+ it(`should remove all everclear fee params except for explicitly kept domains if the token is of type ${tokenType}`, async () => {
1952
+ const config = getEverclearTokenBridgeTokenConfig()[tokenType];
1953
+ const domainId1 = randomInt(100, 10);
1954
+ const domainId2 = randomInt(1000, 100);
1955
+ const domainId3 = randomInt(10000, 1000);
1956
+ const initialRemoteRouters = {
1957
+ [domainId1]: {
1958
+ address: randomAddress(),
1959
+ },
1960
+ [domainId2]: {
1961
+ address: randomAddress(),
1962
+ },
1963
+ [domainId3]: {
1964
+ address: randomAddress(),
1965
+ },
1966
+ };
1967
+ const initialFeeParams = {
1968
+ [domainId1]: {
1969
+ deadline: Date.now(),
1970
+ fee: randomInt(1000),
1971
+ signature: '0x10',
1972
+ },
1973
+ [domainId2]: {
1974
+ deadline: Date.now(),
1975
+ fee: randomInt(1000),
1976
+ signature: '0x20',
1977
+ },
1978
+ [domainId3]: {
1979
+ deadline: Date.now(),
1980
+ fee: randomInt(1000),
1981
+ signature: '0x30',
1982
+ },
1983
+ };
1984
+ const evmERC20WarpModule = await EvmWarpModule.create({
1985
+ chain,
1986
+ config: {
1987
+ ...config,
1988
+ remoteRouters: initialRemoteRouters,
1989
+ everclearFeeParams: initialFeeParams,
1990
+ },
1991
+ multiProvider,
1992
+ proxyFactoryFactories: ismFactoryAddresses,
1993
+ });
1994
+ // Keep only domainId2
1995
+ const expectedFeeParams = {
1996
+ [domainId2]: initialFeeParams[domainId2],
1997
+ };
1998
+ const txs = await evmERC20WarpModule.update({
1999
+ ...config,
2000
+ remoteRouters: initialRemoteRouters,
2001
+ everclearFeeParams: expectedFeeParams,
2002
+ });
2003
+ expect(txs.length).to.equal(2);
2004
+ await sendTxs(txs);
2005
+ const currentConfig = await evmERC20WarpModule.read();
2006
+ assert(isEverclearTokenBridgeConfig(currentConfig), `Expected token of type ${tokenType}`);
2007
+ expect(currentConfig.everclearFeeParams).to.deep.equal(expectedFeeParams);
2008
+ });
2009
+ }
2010
+ it('Should deploy and upgrade a new warp route', async () => {
2011
+ const domain = 3;
2012
+ const config = {
2013
+ ...baseConfig,
2014
+ type: TokenType.collateral,
2015
+ token: token.address,
2016
+ remoteRouters: {
2017
+ [domain]: {
2018
+ address: randomAddress(),
2019
+ },
2020
+ },
2021
+ };
2022
+ // Deploy using WarpModule
2023
+ const evmERC20WarpModule = await EvmWarpModule.create({
2024
+ chain,
2025
+ config: {
2026
+ ...config,
2027
+ },
2028
+ multiProvider,
2029
+ proxyFactoryFactories: ismFactoryAddresses,
2030
+ });
2031
+ const { deployedTokenRoute } = evmERC20WarpModule.serialize();
2032
+ // Get original implementation address
2033
+ const origImpl = await proxyImplementation(multiProvider.getProvider(chain), deployedTokenRoute);
2034
+ // I need package_VERSION to return an old version in the `read` call performed in update
2035
+ const versionStub = sinon
2036
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
2037
+ .resolves('6.0.0');
2038
+ // Also stub fetchScale to avoid version mismatch when reading scale
2039
+ // For old contracts (< 11.0.0), scale would default to 1
2040
+ const scaleStub = sinon
2041
+ .stub(evmERC20WarpModule.reader, 'fetchScale')
2042
+ .resolves(undefined);
2043
+ // In update, we do a check see if the package version is old
2044
+ // If it is, we deploy a new implementation and run upgradeTo
2045
+ await sendTxs(await evmERC20WarpModule.update({
2046
+ ...config,
2047
+ contractVersion: CONTRACTS_PACKAGE_VERSION,
2048
+ }));
2049
+ versionStub.restore();
2050
+ scaleStub.restore();
2051
+ const updatedConfig = await evmERC20WarpModule.read();
2052
+ // Assert
2053
+ expect(updatedConfig.contractVersion).to.eq(CONTRACTS_PACKAGE_VERSION);
2054
+ const newImpl = await proxyImplementation(multiProvider.getProvider(chain), deployedTokenRoute);
2055
+ expect(origImpl).to.not.eq(newImpl);
2056
+ });
2057
+ it('Should not upgrade if the contract version is lower than the actual version', async () => {
2058
+ const domain = 3;
2059
+ const config = {
2060
+ ...baseConfig,
2061
+ type: TokenType.collateral,
2062
+ token: token.address,
2063
+ remoteRouters: {
2064
+ [domain]: {
2065
+ address: randomAddress(),
2066
+ },
2067
+ },
2068
+ };
2069
+ // Deploy using WarpModule
2070
+ const evmERC20WarpModule = await EvmWarpModule.create({
2071
+ chain,
2072
+ config: {
2073
+ ...config,
2074
+ },
2075
+ multiProvider,
2076
+ proxyFactoryFactories: ismFactoryAddresses,
2077
+ });
2078
+ // Return a really high version
2079
+ const reallyHighVersion = '10000.0.0';
2080
+ const versionStub = sinon
2081
+ .stub(evmERC20WarpModule.reader, 'fetchPackageVersion')
2082
+ .resolves(reallyHighVersion);
2083
+ // This will throw an error
2084
+ await expect(evmERC20WarpModule.update({
2085
+ ...config,
2086
+ contractVersion: CONTRACTS_PACKAGE_VERSION,
2087
+ })).to.be.rejectedWith(`Expected contract version ${CONTRACTS_PACKAGE_VERSION} is lower than actual contract version ${reallyHighVersion}`);
2088
+ versionStub.restore();
2089
+ const updatedConfig = await evmERC20WarpModule.read();
2090
+ // Assert
2091
+ expect(updatedConfig.contractVersion).to.eq(CONTRACTS_PACKAGE_VERSION);
2092
+ });
2093
+ it('should deploy a new fee if one does not exist', async () => {
2094
+ const config = {
2095
+ ...baseConfig,
2096
+ type: TokenType.native,
2097
+ };
2098
+ // Deploy using WarpModule
2099
+ const evmERC20WarpModule = await EvmWarpModule.create({
2100
+ chain,
2101
+ config,
2102
+ multiProvider,
2103
+ proxyFactoryFactories: ismFactoryAddresses,
2104
+ });
2105
+ const actualConfig = await evmERC20WarpModule.read();
2106
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
2107
+ ...actualConfig,
2108
+ tokenFee: {
2109
+ type: TokenFeeType.LinearFee,
2110
+ maxFee: 1000000000,
2111
+ halfAmount: 500000000,
2112
+ },
2113
+ });
2114
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
2115
+ const updatedConfig = await evmERC20WarpModule.read();
2116
+ expect(updatedConfig.tokenFee?.type).to.equal(expectedConfig.tokenFee?.type);
2117
+ });
2118
+ it('should not generate setFeeRecipient tx when fee recipient is unchanged (idempotency)', async () => {
2119
+ const config = {
2120
+ ...baseConfig,
2121
+ type: TokenType.native,
2122
+ };
2123
+ const evmERC20WarpModule = await EvmWarpModule.create({
2124
+ chain,
2125
+ config,
2126
+ multiProvider,
2127
+ proxyFactoryFactories: ismFactoryAddresses,
2128
+ });
2129
+ const tokenFeeConfig = {
2130
+ type: TokenFeeType.LinearFee,
2131
+ maxFee: 1000000000,
2132
+ halfAmount: 500000000,
2133
+ };
2134
+ const actualConfig = await evmERC20WarpModule.read();
2135
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
2136
+ ...actualConfig,
2137
+ tokenFee: tokenFeeConfig,
2138
+ });
2139
+ const firstTxs = await evmERC20WarpModule.update(expectedConfig);
2140
+ const SET_FEE_RECIPIENT_SELECTOR = '0xe74b981b';
2141
+ const firstSetFeeRecipientTxs = firstTxs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
2142
+ expect(firstSetFeeRecipientTxs.length).to.equal(1);
2143
+ await sendTxs(firstTxs);
2144
+ const secondTxs = await evmERC20WarpModule.update(expectedConfig);
2145
+ const secondSetFeeRecipientTxs = secondTxs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
2146
+ expect(secondSetFeeRecipientTxs.length, 'setFeeRecipient should not be called when fee recipient is unchanged').to.equal(0);
2147
+ });
2148
+ it('should generate setFeeRecipient tx when fee recipient changes', async () => {
2149
+ const config = {
2150
+ ...baseConfig,
2151
+ type: TokenType.native,
2152
+ };
2153
+ const evmERC20WarpModule = await EvmWarpModule.create({
2154
+ chain,
2155
+ config,
2156
+ multiProvider,
2157
+ proxyFactoryFactories: ismFactoryAddresses,
2158
+ });
2159
+ const actualConfig = await evmERC20WarpModule.read();
2160
+ const firstFeeConfig = HypTokenRouterConfigSchema.parse({
2161
+ ...actualConfig,
2162
+ tokenFee: {
2163
+ type: TokenFeeType.LinearFee,
2164
+ maxFee: 1000000000,
2165
+ halfAmount: 500000000,
2166
+ },
2167
+ });
2168
+ await sendTxs(await evmERC20WarpModule.update(firstFeeConfig));
2169
+ const updatedConfig = await evmERC20WarpModule.read();
2170
+ const secondFeeConfig = HypTokenRouterConfigSchema.parse({
2171
+ ...updatedConfig,
2172
+ tokenFee: {
2173
+ type: TokenFeeType.LinearFee,
2174
+ maxFee: 2000000000,
2175
+ halfAmount: 1000000000,
2176
+ },
2177
+ });
2178
+ const txs = await evmERC20WarpModule.update(secondFeeConfig);
2179
+ const SET_FEE_RECIPIENT_SELECTOR = '0xe74b981b';
2180
+ const setFeeRecipientTxs = txs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
2181
+ expect(setFeeRecipientTxs.length, 'setFeeRecipient should be called when fee contract address changes').to.equal(1);
2182
+ });
2183
+ it('should deploy and update OffchainQuotedLinearFee via warp apply', async () => {
2184
+ const config = {
2185
+ ...baseConfig,
2186
+ type: TokenType.native,
2187
+ };
2188
+ const evmERC20WarpModule = await EvmWarpModule.create({
2189
+ chain,
2190
+ config,
2191
+ multiProvider,
2192
+ proxyFactoryFactories: ismFactoryAddresses,
2193
+ });
2194
+ const actualConfig = await evmERC20WarpModule.read();
2195
+ const signerAddress = await multiProvider.getSignerAddress(chain);
2196
+ // Deploy with OffchainQuotedLinearFee
2197
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
2198
+ ...actualConfig,
2199
+ tokenFee: {
2200
+ type: TokenFeeType.OffchainQuotedLinearFee,
2201
+ maxFee: 1000000000,
2202
+ halfAmount: 500000000,
2203
+ quoteSigners: [signerAddress],
2204
+ },
2205
+ });
2206
+ await sendTxs(await evmERC20WarpModule.update(expectedConfig));
2207
+ const updatedConfig = await evmERC20WarpModule.read();
2208
+ expect(updatedConfig.tokenFee?.type).to.equal(TokenFeeType.OffchainQuotedLinearFee);
2209
+ // Update signers without redeploying
2210
+ const [, otherSigner] = await hre.ethers.getSigners();
2211
+ const updatedFeeConfig = HypTokenRouterConfigSchema.parse({
2212
+ ...updatedConfig,
2213
+ tokenFee: {
2214
+ type: TokenFeeType.OffchainQuotedLinearFee,
2215
+ maxFee: 1000000000,
2216
+ halfAmount: 500000000,
2217
+ quoteSigners: [signerAddress, otherSigner.address],
2218
+ },
2219
+ });
2220
+ const signerUpdateTxs = await evmERC20WarpModule.update(updatedFeeConfig);
2221
+ // 1 tx to add signer (no setFeeRecipient since address unchanged)
2222
+ expect(signerUpdateTxs.length).to.equal(1);
2223
+ await sendTxs(signerUpdateTxs);
2224
+ const finalConfig = await evmERC20WarpModule.read();
2225
+ expect(finalConfig.tokenFee?.type).to.equal(TokenFeeType.OffchainQuotedLinearFee);
2226
+ if (finalConfig.tokenFee?.type === TokenFeeType.OffchainQuotedLinearFee) {
2227
+ expect(finalConfig.tokenFee.quoteSigners).to.have.lengthOf(2);
2228
+ }
2229
+ });
2230
+ describe('xERC20 token fee', () => {
2231
+ const SET_FEE_RECIPIENT_SELECTOR = '0xe74b981b';
2232
+ // The default test4 metadata configures an Etherscan explorer, which the
2233
+ // xERC20 reader would call to derive extra-lockbox configs on every
2234
+ // read(). Strip it on a scoped MultiProvider so lockbox derivation
2235
+ // early-returns []; XERC20Test has no extra lockboxes anyway.
2236
+ let xerc20MultiProvider;
2237
+ before(() => {
2238
+ xerc20MultiProvider = MultiProvider.createTestMultiProvider({ signer });
2239
+ xerc20MultiProvider.metadata[chain] = {
2240
+ ...xerc20MultiProvider.getChainMetadata(chain),
2241
+ blockExplorers: [],
2242
+ };
2243
+ });
2244
+ // Deploys a fresh xERC20 warp route so each test starts with no fee.
2245
+ // XERC20Test grants unlimited mint/burn limits to any bridge, so no
2246
+ // limit-granting is required to exercise the fee-setting path.
2247
+ async function deployXERC20Route() {
2248
+ const xerc20 = await new XERC20Test__factory(signer).deploy(TOKEN_NAME, TOKEN_NAME, TOKEN_SUPPLY, TOKEN_DECIMALS);
2249
+ const config = {
2250
+ ...baseConfig,
2251
+ type: TokenType.XERC20,
2252
+ token: xerc20.address,
2253
+ };
2254
+ const warpModule = await EvmWarpModule.create({
2255
+ chain,
2256
+ config,
2257
+ multiProvider: xerc20MultiProvider,
2258
+ proxyFactoryFactories: ismFactoryAddresses,
2259
+ });
2260
+ return { warpModule, xerc20 };
2261
+ }
2262
+ // LinearFee = min(maxFee, (amount * maxFee) / (2 * halfAmount)).
2263
+ function expectedLinearFee(maxFee, halfAmount, amount) {
2264
+ const uncapped = (amount * maxFee) / (2n * halfAmount);
2265
+ return uncapped > maxFee ? maxFee : uncapped;
2266
+ }
2267
+ // Reads the deployed LinearFee contract wired to the router and asserts
2268
+ // its on-chain params. Critically verifies fee.token() == router.token(),
2269
+ // the exact invariant the router enforces at transfer time
2270
+ // ("FungibleTokenRouter: fee must match token").
2271
+ async function assertOnchainLinearFee(warpModule, expected) {
2272
+ const { deployedTokenRoute } = warpModule.serialize();
2273
+ const router = HypXERC20__factory.connect(deployedTokenRoute, signer);
2274
+ const feeRecipient = await router.feeRecipient();
2275
+ expect(eqAddress(feeRecipient, ethers.constants.AddressZero)).to.be
2276
+ .false;
2277
+ const fee = LinearFee__factory.connect(feeRecipient, signer);
2278
+ expect(eqAddress(await fee.token(), await router.token())).to.be.true;
2279
+ expect((await fee.maxFee()).toBigInt()).to.equal(expected.maxFee);
2280
+ expect((await fee.halfAmount()).toBigInt()).to.equal(expected.halfAmount);
2281
+ }
2282
+ it('charges the resolved token when quoting a fee-bearing transfer', async () => {
2283
+ const { warpModule } = await deployXERC20Route();
2284
+ const maxFee = 1000000000n;
2285
+ const halfAmount = 500000000n;
2286
+ const actualConfig = await warpModule.read();
2287
+ const feeConfig = HypTokenRouterConfigSchema.parse({
2288
+ ...actualConfig,
2289
+ tokenFee: {
2290
+ type: TokenFeeType.LinearFee,
2291
+ maxFee: maxFee.toString(),
2292
+ halfAmount: halfAmount.toString(),
2293
+ },
2294
+ });
2295
+ await sendTxs(await warpModule.update(feeConfig));
2296
+ await assertOnchainLinearFee(warpModule, { maxFee, halfAmount });
2297
+ const { deployedTokenRoute } = warpModule.serialize();
2298
+ const router = HypXERC20__factory.connect(deployedTokenRoute, signer);
2299
+ const fee = LinearFee__factory.connect(await router.feeRecipient(), signer);
2300
+ // Quote a transfer through the deployed fee contract: fee token must be
2301
+ // the router token and the amount must match the LinearFee formula.
2302
+ const amount = halfAmount; // fee = maxFee / 2
2303
+ const quotes = await fee.quoteTransferRemote(1, addressToBytes32(signer.address), amount);
2304
+ expect(quotes.length).to.equal(1);
2305
+ expect(eqAddress(quotes[0].token, await router.token())).to.be.true;
2306
+ const expected = expectedLinearFee(maxFee, halfAmount, amount);
2307
+ expect(quotes[0].amount.toBigInt()).to.equal(expected);
2308
+ expect(expected > 0n, 'expected a non-zero fee').to.be.true;
2309
+ });
2310
+ it('should set a LinearFee on an xERC20 route via warp apply', async () => {
2311
+ const { warpModule } = await deployXERC20Route();
2312
+ const actualConfig = await warpModule.read();
2313
+ expect(actualConfig.tokenFee).to.be.undefined;
2314
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
2315
+ ...actualConfig,
2316
+ tokenFee: {
2317
+ type: TokenFeeType.LinearFee,
2318
+ maxFee: 1000000000,
2319
+ halfAmount: 500000000,
2320
+ },
2321
+ });
2322
+ const txs = await warpModule.update(expectedConfig);
2323
+ const setFeeRecipientTxs = txs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
2324
+ expect(setFeeRecipientTxs.length).to.equal(1);
2325
+ await sendTxs(txs);
2326
+ const updatedConfig = await warpModule.read();
2327
+ expect(updatedConfig.tokenFee?.type).to.equal(TokenFeeType.LinearFee);
2328
+ });
2329
+ it('should update the fee on an xERC20 route', async () => {
2330
+ const { warpModule } = await deployXERC20Route();
2331
+ const actualConfig = await warpModule.read();
2332
+ const firstFeeConfig = HypTokenRouterConfigSchema.parse({
2333
+ ...actualConfig,
2334
+ tokenFee: {
2335
+ type: TokenFeeType.LinearFee,
2336
+ maxFee: 1000000000,
2337
+ halfAmount: 500000000,
2338
+ },
2339
+ });
2340
+ await sendTxs(await warpModule.update(firstFeeConfig));
2341
+ const afterFirst = await warpModule.read();
2342
+ assert(afterFirst.tokenFee?.type === TokenFeeType.LinearFee, 'LinearFee');
2343
+ const secondFeeConfig = HypTokenRouterConfigSchema.parse({
2344
+ ...afterFirst,
2345
+ tokenFee: {
2346
+ type: TokenFeeType.LinearFee,
2347
+ maxFee: 2000000000,
2348
+ halfAmount: 1000000000,
2349
+ },
2350
+ });
2351
+ const txs = await warpModule.update(secondFeeConfig);
2352
+ // Immutable fee contract is redeployed on change, so the router must be
2353
+ // repointed at the new fee contract via setFeeRecipient.
2354
+ const setFeeRecipientTxs = txs.filter((tx) => tx.data?.startsWith(SET_FEE_RECIPIENT_SELECTOR));
2355
+ expect(setFeeRecipientTxs.length).to.equal(1);
2356
+ await sendTxs(txs);
2357
+ const finalConfig = await warpModule.read();
2358
+ expect(finalConfig.tokenFee?.type).to.equal(TokenFeeType.LinearFee);
2359
+ // Assert the updated amounts and token are live on-chain, not just the
2360
+ // fee type. Confirms the new fee contract was wired with the new params.
2361
+ await assertOnchainLinearFee(warpModule, {
2362
+ maxFee: 2000000000n,
2363
+ halfAmount: 1000000000n,
2364
+ });
2365
+ });
2366
+ it('should set and update OffchainQuotedLinearFee on an xERC20 route', async () => {
2367
+ const { warpModule } = await deployXERC20Route();
2368
+ const signerAddress = await xerc20MultiProvider.getSignerAddress(chain);
2369
+ const actualConfig = await warpModule.read();
2370
+ const expectedConfig = HypTokenRouterConfigSchema.parse({
2371
+ ...actualConfig,
2372
+ tokenFee: {
2373
+ type: TokenFeeType.OffchainQuotedLinearFee,
2374
+ maxFee: 1000000000,
2375
+ halfAmount: 500000000,
2376
+ quoteSigners: [signerAddress],
2377
+ },
2378
+ });
2379
+ await sendTxs(await warpModule.update(expectedConfig));
2380
+ const updatedConfig = await warpModule.read();
2381
+ expect(updatedConfig.tokenFee?.type).to.equal(TokenFeeType.OffchainQuotedLinearFee);
2382
+ const [, otherSigner] = await hre.ethers.getSigners();
2383
+ const updatedFeeConfig = HypTokenRouterConfigSchema.parse({
2384
+ ...updatedConfig,
2385
+ tokenFee: {
2386
+ type: TokenFeeType.OffchainQuotedLinearFee,
2387
+ maxFee: 1000000000,
2388
+ halfAmount: 500000000,
2389
+ quoteSigners: [signerAddress, otherSigner.address],
2390
+ },
2391
+ });
2392
+ const signerUpdateTxs = await warpModule.update(updatedFeeConfig);
2393
+ // Only add the new signer; fee contract address is unchanged so no
2394
+ // setFeeRecipient tx.
2395
+ expect(signerUpdateTxs.length).to.equal(1);
2396
+ await sendTxs(signerUpdateTxs);
2397
+ const finalConfig = await warpModule.read();
2398
+ assert(finalConfig.tokenFee?.type === TokenFeeType.OffchainQuotedLinearFee, 'OffchainQuotedLinearFee');
2399
+ expect(finalConfig.tokenFee.quoteSigners).to.have.lengthOf(2);
2400
+ });
2401
+ });
2402
+ it('clears orphan CCR fee pointer without explicit tokenReaderParams (CLI path)', async () => {
2403
+ // Simulates the production CLI path: EvmWarpModule.update() → createTokenFeeUpdateTxs()
2404
+ // called without explicit tokenReaderParams. The fix derives crossCollateralRouters hints
2405
+ // from actualConfig.crossCollateralRouters so orphan on-chain pointers are detected.
2406
+ // 1. Deploy a CCR fee contract and wire a stale router key to a sub-fee
2407
+ const ccrFactory = new CrossCollateralRoutingFee__factory(signer);
2408
+ const ccrf = await ccrFactory.deploy(signer.address);
2409
+ await ccrf.deployed();
2410
+ const linearFeeConfig = await EvmTokenFeeModule.expandConfig({
2411
+ multiProvider,
2412
+ chainName: chain,
2413
+ config: {
2414
+ type: TokenFeeType.LinearFee,
2415
+ token: token.address,
2416
+ owner: signer.address,
2417
+ bps: 100,
2418
+ },
2419
+ });
2420
+ const staleSubFeeModule = await EvmTokenFeeModule.create({
2421
+ multiProvider,
2422
+ chain,
2423
+ config: linearFeeConfig,
2424
+ });
2425
+ const staleSubFeeAddress = staleSubFeeModule.serialize().deployedFee;
2426
+ const routingDomain = multiProvider.getDomainId(chain);
2427
+ const staleRouterKey = hre.ethers.utils.hexZeroPad(signer.address, 32);
2428
+ await ccrf.setCrossCollateralRouterFeeContracts([routingDomain], [staleRouterKey], [staleSubFeeAddress]);
2429
+ // 2. Build an EvmWarpModule with a fake token route address (not needed for this code path)
2430
+ const warpModule = new EvmWarpModule(multiProvider, {
2431
+ chain,
2432
+ config: {
2433
+ ...baseConfig,
2434
+ type: TokenType.crossCollateral,
2435
+ token: token.address,
2436
+ },
2437
+ addresses: {
2438
+ deployedTokenRoute: randomAddress(),
2439
+ ...ismFactoryAddresses,
2440
+ },
2441
+ });
2442
+ // 3. actualConfig: CCR token with the stale router enrolled in crossCollateralRouters
2443
+ const actualConfig = {
2444
+ ...baseConfig,
2445
+ type: TokenType.crossCollateral,
2446
+ token: token.address,
2447
+ crossCollateralRouters: {
2448
+ [routingDomain]: [staleRouterKey],
2449
+ },
2450
+ tokenFee: {
2451
+ type: TokenFeeType.CrossCollateralRoutingFee,
2452
+ owner: signer.address,
2453
+ address: ccrf.address,
2454
+ feeContracts: {},
2455
+ },
2456
+ };
2457
+ // 4. expectedConfig: CCR fee with only DEFAULT_ROUTER_KEY (stale key removed)
2458
+ const expectedConfig = {
2459
+ ...baseConfig,
2460
+ type: TokenType.crossCollateral,
2461
+ token: token.address,
2462
+ tokenFee: {
2463
+ type: TokenFeeType.CrossCollateralRoutingFee,
2464
+ owner: signer.address,
2465
+ feeContracts: {
2466
+ [chain]: {
2467
+ [DEFAULT_ROUTER_KEY]: {
2468
+ ...linearFeeConfig,
2469
+ },
2470
+ },
2471
+ },
2472
+ },
2473
+ };
2474
+ // 5. Call createTokenFeeUpdateTxs WITHOUT explicit tokenReaderParams
2475
+ const txs = await warpModule.createTokenFeeUpdateTxs(actualConfig, expectedConfig);
2476
+ // Must include a clearing tx for the stale router key
2477
+ const clearTx = txs.find((tx) => tx.annotation?.includes('Clearing removed CrossCollateralRoutingFee'));
2478
+ expect(clearTx, 'expected orphan clearing tx').to.not.be.undefined;
2479
+ // Verify the tx encodes AddressZero for the stale key
2480
+ const iface = CrossCollateralRoutingFee__factory.createInterface();
2481
+ const decoded = iface.decodeFunctionData('setCrossCollateralRouterFeeContracts', clearTx.data);
2482
+ expect(decoded[1].map((k) => k.toLowerCase())).to.deep.equal([
2483
+ staleRouterKey.toLowerCase(),
2484
+ ]);
2485
+ expect(decoded[2]).to.deep.equal([hre.ethers.constants.AddressZero]);
2486
+ });
2487
+ });
2488
+ describe('createSetMaxFeePpmTxs', () => {
2489
+ const ROUTE_ADDRESS = '0x1111111111111111111111111111111111111111';
2490
+ const TOKEN_ADDRESS = '0x2222222222222222222222222222222222222222';
2491
+ const MESSENGER_ADDRESS = '0x3333333333333333333333333333333333333333';
2492
+ const TRANSMITTER_ADDRESS = '0x4444444444444444444444444444444444444444';
2493
+ let warpModule;
2494
+ before(() => {
2495
+ warpModule = new EvmWarpModule(multiProvider, {
2496
+ chain,
2497
+ config: {},
2498
+ addresses: {
2499
+ deployedTokenRoute: ROUTE_ADDRESS,
2500
+ ...ismFactoryAddresses,
2501
+ },
2502
+ });
2503
+ });
2504
+ const makeCctpV2Config = (maxFeeBps, overrides) => ({
2505
+ ...baseConfig,
2506
+ type: TokenType.collateralCctp,
2507
+ token: TOKEN_ADDRESS,
2508
+ tokenMessenger: MESSENGER_ADDRESS,
2509
+ messageTransmitter: TRANSMITTER_ADDRESS,
2510
+ cctpVersion: 'V2',
2511
+ urls: ['https://fake-cctp-url.com'],
2512
+ maxFeeBps,
2513
+ ...overrides,
2514
+ });
2515
+ it('returns empty when expectedConfig is not CCTP', () => {
2516
+ const actual = makeCctpV2Config(100);
2517
+ const expected = {
2518
+ ...baseConfig,
2519
+ type: TokenType.collateral,
2520
+ token: TOKEN_ADDRESS,
2521
+ };
2522
+ expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
2523
+ });
2524
+ it('returns empty when cctpVersion is V1', () => {
2525
+ const actual = makeCctpV2Config(100);
2526
+ const expected = makeCctpV2Config(200, { cctpVersion: 'V1' });
2527
+ expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
2528
+ });
2529
+ it('returns empty when maxFeeBps is undefined', () => {
2530
+ const actual = makeCctpV2Config(100);
2531
+ const expected = makeCctpV2Config(undefined);
2532
+ expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
2533
+ });
2534
+ it('returns empty when actual matches expected', () => {
2535
+ const actual = makeCctpV2Config(1.3);
2536
+ const expected = makeCctpV2Config(1.3);
2537
+ expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
2538
+ });
2539
+ it('returns setMaxFeePpm tx when fee differs', () => {
2540
+ const actual = makeCctpV2Config(1);
2541
+ const expected = makeCctpV2Config(1.3);
2542
+ const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
2543
+ expect(txs).to.have.length(1);
2544
+ expect(txs[0].to).to.equal(ROUTE_ADDRESS);
2545
+ expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [130]));
2546
+ });
2547
+ it('converts fractional bps to ppm correctly', () => {
2548
+ const actual = makeCctpV2Config(0);
2549
+ const expected = makeCctpV2Config(1.5);
2550
+ const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
2551
+ expect(txs).to.have.length(1);
2552
+ expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [150]));
2553
+ });
2554
+ it('emits setMaxFeePpm when upgrading across PPM storage boundary even if values match', () => {
2555
+ const actual = makeCctpV2Config(1.3, {
2556
+ contractVersion: '10.1.0',
2557
+ });
2558
+ const expected = makeCctpV2Config(1.3, {
2559
+ contractVersion: '10.2.0',
2560
+ });
2561
+ const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
2562
+ expect(txs).to.have.length(1);
2563
+ expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [130]));
2564
+ });
2565
+ it('skips setMaxFeePpm when both versions are above PPM boundary and values match', () => {
2566
+ const actual = makeCctpV2Config(1.3, {
2567
+ contractVersion: '10.2.0',
2568
+ });
2569
+ const expected = makeCctpV2Config(1.3, {
2570
+ contractVersion: '10.3.0',
2571
+ });
2572
+ expect(warpModule.createSetMaxFeePpmTxs(actual, expected)).to.deep.equal([]);
2573
+ });
2574
+ it('returns tx when actual has no maxFeeBps', () => {
2575
+ const actual = {
2576
+ ...baseConfig,
2577
+ type: TokenType.collateral,
2578
+ token: TOKEN_ADDRESS,
2579
+ };
2580
+ const expected = makeCctpV2Config(2);
2581
+ const txs = warpModule.createSetMaxFeePpmTxs(actual, expected);
2582
+ expect(txs).to.have.length(1);
2583
+ expect(txs[0].data).to.equal(TokenBridgeCctpV2__factory.createInterface().encodeFunctionData('setMaxFeePpm', [200]));
2584
+ });
2585
+ });
2586
+ describe('hybrid hook/ISM updates', () => {
2587
+ // Mirrors the shape `warp apply` produces: the hybrid must be composed
2588
+ // under an authenticating ISM, and expandWarpDeployConfig defaults the
2589
+ // expected hook to the hybrid node when the user leaves `hook` unset.
2590
+ function delayedFlowNode(owner, maxDelay = 3600) {
2591
+ return {
2592
+ type: IsmType.DELAYED_FLOW_ROUTER,
2593
+ thresholdBps: 10000,
2594
+ maxDelay,
2595
+ duration: 86400n,
2596
+ owner,
2597
+ };
2598
+ }
2599
+ // Hook-side view of the same contract (same type string by design), which
2600
+ // is what expandWarpDeployConfig puts in the expected `hook` field.
2601
+ function delayedFlowHookNode(owner, maxDelay = 3600) {
2602
+ return {
2603
+ type: HookType.DELAYED_FLOW_ROUTER,
2604
+ thresholdBps: 10000,
2605
+ maxDelay,
2606
+ duration: 86400n,
2607
+ owner,
2608
+ };
2609
+ }
2610
+ // Hook-side view of the OTHER hybrid: same family, different contract.
2611
+ function netFlowHookNode(owner) {
2612
+ return {
2613
+ type: HookType.NET_FLOW_RATE_LIMITED,
2614
+ thresholdBps: 5000,
2615
+ duration: 86400n,
2616
+ owner,
2617
+ };
2618
+ }
2619
+ function delayedFlowIsm(owner, maxDelay = 3600) {
2620
+ return {
2621
+ type: IsmType.AGGREGATION,
2622
+ threshold: 2,
2623
+ modules: [
2624
+ { type: IsmType.TRUSTED_RELAYER, relayer: owner },
2625
+ delayedFlowNode(owner, maxDelay),
2626
+ ],
2627
+ };
2628
+ }
2629
+ // ISM-side view of the OTHER hybrid, with the same parameters as
2630
+ // netFlowHookNode so the pair describes one instance.
2631
+ function netFlowIsm(owner) {
2632
+ return {
2633
+ type: IsmType.AGGREGATION,
2634
+ threshold: 2,
2635
+ modules: [
2636
+ { type: IsmType.TRUSTED_RELAYER, relayer: owner },
2637
+ {
2638
+ type: IsmType.NET_FLOW_RATE_LIMITED,
2639
+ thresholdBps: 5000,
2640
+ duration: 86400n,
2641
+ owner,
2642
+ },
2643
+ ],
2644
+ };
2645
+ }
2646
+ // A route that exists without any hybrid: the starting point for
2647
+ // "user adds a DFR to an existing route".
2648
+ async function createPlainRoute() {
2649
+ return EvmWarpModule.create({
2650
+ chain,
2651
+ config: {
2652
+ ...baseConfig,
2653
+ type: TokenType.collateral,
2654
+ token: token.address,
2655
+ interchainSecurityModule: ismAddress,
2656
+ },
2657
+ multiProvider,
2658
+ proxyFactoryFactories: ismFactoryAddresses,
2659
+ });
2660
+ }
2661
+ it('adds a hybrid hook/ISM to an existing route, wiring it as ISM and hook', async () => {
2662
+ const warpModule = await createPlainRoute();
2663
+ const { deployedTokenRoute } = warpModule.serialize();
2664
+ const expectedConfig = {
2665
+ ...(await warpModule.read()),
2666
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2667
+ hook: delayedFlowHookNode(signer.address),
2668
+ };
2669
+ const txs = await warpModule.update(expectedConfig);
2670
+ await sendTxs(txs);
2671
+ const client = MailboxClient__factory.connect(deployedTokenRoute, multiProvider.getProvider(chain));
2672
+ const installedIsm = await client.interchainSecurityModule();
2673
+ const installedHook = await client.hook();
2674
+ expect(isZeroishAddress(installedHook)).to.be.false;
2675
+ // the hook is the DFR paired with this router...
2676
+ const dfr = DelayedFlowRouterHookIsm__factory.connect(installedHook, multiProvider.getProvider(chain));
2677
+ expect(eqAddress(await dfr.warpRouter(), deployedTokenRoute)).to.be.true;
2678
+ expect(await dfr.maxDelay()).to.equal(3600);
2679
+ // ...and the same instance is a member of the installed aggregation ISM
2680
+ const aggregation = StaticAggregationIsm__factory.connect(installedIsm, multiProvider.getProvider(chain));
2681
+ const [modules] = await aggregation.modulesAndThreshold(ethers.constants.AddressZero);
2682
+ expect(modules.map((m) => m.toLowerCase())).to.include(installedHook.toLowerCase());
2683
+ });
2684
+ // A DFR installed as the ISM before it is the hook refuses every inbound
2685
+ // message (`readyAt == 0`) while nothing sends the preverification, and no
2686
+ // later run can preverify an already-dispatched message: the reverse order
2687
+ // only leaves the previous ISM in charge for the rest of the batch.
2688
+ it('wires the hybrid as the hook before installing it as the ISM', async () => {
2689
+ const warpModule = await createPlainRoute();
2690
+ const { deployedTokenRoute } = warpModule.serialize();
2691
+ const expectedConfig = {
2692
+ ...(await warpModule.read()),
2693
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2694
+ hook: delayedFlowHookNode(signer.address),
2695
+ };
2696
+ const txs = await warpModule.update(expectedConfig);
2697
+ const hookIndex = routerInstallIndex(txs, deployedTokenRoute, 'setHook');
2698
+ const ismIndex = routerInstallIndex(txs, deployedTokenRoute, 'setInterchainSecurityModule');
2699
+ expect(hookIndex).to.be.greaterThan(-1);
2700
+ expect(ismIndex).to.be.greaterThan(-1);
2701
+ expect(hookIndex).to.be.lessThan(ismIndex);
2702
+ });
2703
+ it('removes the hybrid ISM before removing its hook', async () => {
2704
+ const warpModule = await createPlainRoute();
2705
+ const { deployedTokenRoute } = warpModule.serialize();
2706
+ const hybridConfig = {
2707
+ ...(await warpModule.read()),
2708
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2709
+ hook: delayedFlowHookNode(signer.address),
2710
+ };
2711
+ await sendTxs(await warpModule.update(hybridConfig));
2712
+ const client = MailboxClient__factory.connect(deployedTokenRoute, multiProvider.getProvider(chain));
2713
+ const installedHook = await client.hook();
2714
+ const removalConfig = {
2715
+ ...(await warpModule.read()),
2716
+ interchainSecurityModule: ethers.constants.AddressZero,
2717
+ hook: ethers.constants.AddressZero,
2718
+ };
2719
+ const txs = await warpModule.update(removalConfig);
2720
+ const hookIndex = routerInstallIndex(txs, deployedTokenRoute, 'setHook');
2721
+ const ismIndex = routerInstallIndex(txs, deployedTokenRoute, 'setInterchainSecurityModule');
2722
+ expect(ismIndex).to.be.greaterThan(-1);
2723
+ expect(hookIndex).to.be.greaterThan(-1);
2724
+ expect(ismIndex).to.be.lessThan(hookIndex);
2725
+ // If submission stops at this boundary, inbound verification is already
2726
+ // back on the mailbox default while origins may harmlessly send an extra
2727
+ // preverification until their hook-removal phase executes.
2728
+ await sendTxs(txs.slice(0, hookIndex));
2729
+ expect(await client.interchainSecurityModule()).to.equal(ethers.constants.AddressZero);
2730
+ expect(await client.hook()).to.equal(installedHook);
2731
+ await sendTxs(txs.slice(hookIndex));
2732
+ expect(await client.hook()).to.equal(ethers.constants.AddressZero);
2733
+ });
2734
+ it('rejects a hybrid config that also sets a predicateWrapper', async () => {
2735
+ const warpModule = await createPlainRoute();
2736
+ const actualConfig = await warpModule.read();
2737
+ assert(actualConfig.type === TokenType.collateral, 'Expected a collateral warp router config');
2738
+ const expectedConfig = {
2739
+ ...actualConfig,
2740
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2741
+ hook: delayedFlowHookNode(signer.address),
2742
+ predicateWrapper: {
2743
+ predicateRegistry: randomAddress(),
2744
+ policyId: 'test-policy',
2745
+ owner: signer.address,
2746
+ },
2747
+ };
2748
+ // Both want the router's hook slot; silently dropping either would
2749
+ // remove a policy hook or the flow limiter from the dispatch path.
2750
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('both must own');
2751
+ });
2752
+ it('rejects a hybrid added to a router type it cannot meter', async () => {
2753
+ const warpModule = await createPlainRoute();
2754
+ // collateralVault is not an LpCollateralRouter, so localCollateral()
2755
+ // reverts: the DFR would deploy fine and then brick every dispatch and
2756
+ // delivery. The deploy path rejects this; apply must too.
2757
+ const expectedConfig = {
2758
+ ...(await warpModule.read()),
2759
+ type: TokenType.collateralVault,
2760
+ token: token.address,
2761
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2762
+ hook: delayedFlowHookNode(signer.address),
2763
+ };
2764
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('cannot meter');
2765
+ });
2766
+ it('rejects an unsupported hybrid config without deploying the ISM', async () => {
2767
+ const warpModule = await createPlainRoute();
2768
+ // The config-only guards used to run after the ISM step, so a rejected
2769
+ // apply had already paid for (and orphaned) a fresh hybrid instance.
2770
+ const deploySpy = sinon.spy(warpModule, 'deployOrUpdateIsm');
2771
+ const expectedConfig = {
2772
+ ...(await warpModule.read()),
2773
+ type: TokenType.collateralVault,
2774
+ token: token.address,
2775
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2776
+ hook: delayedFlowHookNode(signer.address),
2777
+ };
2778
+ try {
2779
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('cannot meter');
2780
+ expect(deploySpy.called).to.be.false;
2781
+ }
2782
+ finally {
2783
+ deploySpy.restore();
2784
+ }
2785
+ });
2786
+ it('rejects a hybrid ISM tree pointed at a different hook', async () => {
2787
+ const warpModule = await createPlainRoute();
2788
+ // A read -> edit -> apply round trip that keeps an explicit non-hybrid
2789
+ // hook (e.g. an IGP) while adding a DFR to the ISM tree. Without a
2790
+ // guard the ISM deploys and is installed, but the hybrid never becomes
2791
+ // the router's hook, so it can never preverify: every delivery from
2792
+ // this chain would revert forever while `warp check` still converges.
2793
+ const nonHybridHook = await mailbox.defaultHook();
2794
+ const expectedConfig = {
2795
+ ...(await warpModule.read()),
2796
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2797
+ hook: nonHybridHook,
2798
+ };
2799
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith("not in the 'hook' tree");
2800
+ });
2801
+ it('rejects a hook node of a different hybrid type than the ISM tree installs', async () => {
2802
+ const warpModule = await createPlainRoute();
2803
+ // The ISM tree installs a DELAYED_FLOW instance while `hook` declares a
2804
+ // NET_FLOW one. Only the tree's own instance is ever wired, so the
2805
+ // declared hook would be silently ignored and the route would stay
2806
+ // permanently divergent from the config the operator wrote.
2807
+ const expectedConfig = {
2808
+ ...(await warpModule.read()),
2809
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2810
+ hook: netFlowHookNode(signer.address),
2811
+ };
2812
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('is declared differently on the two surfaces');
2813
+ });
2814
+ it('ignores derived address metadata when hybrid declarations match', async () => {
2815
+ const warpModule = await createPlainRoute();
2816
+ // `address` is reader output, not declarative identity. Ignoring stale
2817
+ // metadata lets read -> edit -> apply replace a hybrid whose parameters
2818
+ // changed while the two config surfaces still describe the same target.
2819
+ const foreignInstanceHook = {
2820
+ type: HookType.DELAYED_FLOW_ROUTER,
2821
+ thresholdBps: 10000,
2822
+ maxDelay: 3600,
2823
+ duration: 86400n,
2824
+ owner: signer.address,
2825
+ address: randomAddress(),
2826
+ };
2827
+ const expectedConfig = {
2828
+ ...(await warpModule.read()),
2829
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2830
+ hook: foreignInstanceHook,
2831
+ };
2832
+ await expect(warpModule.update(expectedConfig)).to.be.fulfilled;
2833
+ });
2834
+ it('explains a router whose ISM tree has no hybrid instance during enrollment', async () => {
2835
+ const warpModule = await createPlainRoute();
2836
+ const { deployedTokenRoute } = warpModule.serialize();
2837
+ // No hybrid was ever wired, so the enrollment pass cannot resolve a
2838
+ // DelayedFlowRouterHookIsm from the router's ISM tree.
2839
+ const deployConfig = {
2840
+ [chain]: {
2841
+ ...baseConfig,
2842
+ type: TokenType.collateral,
2843
+ token: token.address,
2844
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2845
+ },
2846
+ };
2847
+ await expect(deriveDelayedFlowEnrollmentTargets(multiProvider, deployConfig, {
2848
+ [chain]: deployedTokenRoute,
2849
+ })).to.be.rejectedWith('no instance was resolved');
2850
+ });
2851
+ it('rejects a NetFlowRateLimitedHookIsm as a delayed-flow enrollment target', async () => {
2852
+ const warpModule = await createPlainRoute();
2853
+ const { deployedTokenRoute } = warpModule.serialize();
2854
+ // Wire the OTHER hybrid as the router's hook and ISM.
2855
+ await sendTxs(await warpModule.update({
2856
+ ...(await warpModule.read()),
2857
+ interchainSecurityModule: netFlowIsm(signer.address),
2858
+ hook: netFlowHookNode(signer.address),
2859
+ }));
2860
+ // Both hybrids expose warpRouter() and both are paired with this router,
2861
+ // so a warpRouter()-only probe returns the NetFlow instance as a
2862
+ // DELAYED_FLOW_ROUTER enrollment target and pairs the wrong contract.
2863
+ const deployConfig = {
2864
+ [chain]: {
2865
+ ...baseConfig,
2866
+ type: TokenType.collateral,
2867
+ token: token.address,
2868
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2869
+ },
2870
+ };
2871
+ await expect(deriveDelayedFlowEnrollmentTargets(multiProvider, deployConfig, {
2872
+ [chain]: deployedTokenRoute,
2873
+ })).to.be.rejectedWith('does not expose maxDelay()');
2874
+ });
2875
+ it('converges to zero transactions once the hybrid is wired', async () => {
2876
+ const warpModule = await createPlainRoute();
2877
+ const expectedConfig = {
2878
+ ...(await warpModule.read()),
2879
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2880
+ hook: delayedFlowHookNode(signer.address),
2881
+ };
2882
+ await sendTxs(await warpModule.update(expectedConfig));
2883
+ // second apply of the same config must be a no-op
2884
+ expect(await warpModule.update(expectedConfig)).to.deep.equal([]);
2885
+ });
2886
+ it('round-trips a delayed-flow hybrid nested in an aggregation hook', async () => {
2887
+ const warpModule = await createPlainRoute();
2888
+ const expectedConfig = {
2889
+ ...(await warpModule.read()),
2890
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2891
+ hook: {
2892
+ type: HookType.AGGREGATION,
2893
+ hooks: [
2894
+ delayedFlowHookNode(signer.address),
2895
+ { type: HookType.MERKLE_TREE },
2896
+ ],
2897
+ },
2898
+ };
2899
+ await sendTxs(await warpModule.update(expectedConfig));
2900
+ const readConfig = await warpModule.read();
2901
+ assert(typeof readConfig.hook === 'object' &&
2902
+ readConfig.hook.type === HookType.AGGREGATION, 'Expected the aggregation hook to round-trip');
2903
+ expect(readConfig.hook.hooks.some((hook) => typeof hook === 'object' &&
2904
+ hook.type === HookType.DELAYED_FLOW_ROUTER)).to.be.true;
2905
+ const { deployedTokenRoute } = warpModule.serialize();
2906
+ const deployConfig = {
2907
+ [chain]: {
2908
+ ...baseConfig,
2909
+ type: TokenType.collateral,
2910
+ token: token.address,
2911
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2912
+ },
2913
+ };
2914
+ const targets = await deriveDelayedFlowEnrollmentTargets(multiProvider, deployConfig, { [chain]: deployedTokenRoute });
2915
+ const delayedHook = readConfig.hook.hooks.find((hook) => typeof hook === 'object' &&
2916
+ hook.type === HookType.DELAYED_FLOW_ROUTER);
2917
+ assert(delayedHook &&
2918
+ typeof delayedHook === 'object' &&
2919
+ 'address' in delayedHook, 'Expected the delayed-flow hook address');
2920
+ expect(targets[chain].ismAddress).to.equal(delayedHook.address);
2921
+ expect(await warpModule.update(readConfig)).to.deep.equal([]);
2922
+ });
2923
+ it('rejects an aggregated hybrid when warp apply would retain an existing fee hook', async () => {
2924
+ const warpModule = await createPlainRoute();
2925
+ const feeHook = randomAddress();
2926
+ await sendTxs(await warpModule.update({
2927
+ ...(await warpModule.read()),
2928
+ feeHook,
2929
+ }));
2930
+ const actualConfig = await warpModule.read();
2931
+ expect(actualConfig.feeHook && eqAddress(actualConfig.feeHook, feeHook)).to.equal(true);
2932
+ const expectedConfig = {
2933
+ ...actualConfig,
2934
+ // Omission means "leave unchanged" during warp apply.
2935
+ feeHook: undefined,
2936
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2937
+ hook: {
2938
+ type: HookType.AGGREGATION,
2939
+ hooks: [
2940
+ delayedFlowHookNode(signer.address),
2941
+ { type: HookType.MERKLE_TREE },
2942
+ ],
2943
+ },
2944
+ tokenFee: {
2945
+ type: TokenFeeType.LinearFee,
2946
+ owner: signer.address,
2947
+ bps: 100,
2948
+ },
2949
+ };
2950
+ const nonceBefore = await signer.getTransactionCount();
2951
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('cannot be combined with non-zero feeHook');
2952
+ await expect(warpModule.update({
2953
+ ...expectedConfig,
2954
+ feeHook: ethers.constants.AddressZero,
2955
+ })).to.be.rejectedWith('while clearing existing feeHook');
2956
+ expect(await signer.getTransactionCount()).to.equal(nonceBefore);
2957
+ });
2958
+ it('requires fee-hook clearing before replacing or recomposing an installed delayed-flow hook', async () => {
2959
+ const warpModule = await createPlainRoute();
2960
+ const initialConfig = {
2961
+ ...(await warpModule.read()),
2962
+ interchainSecurityModule: delayedFlowIsm(signer.address),
2963
+ hook: delayedFlowHookNode(signer.address),
2964
+ };
2965
+ await sendTxs(await warpModule.update(initialConfig));
2966
+ const { deployedTokenRoute } = warpModule.serialize();
2967
+ const feeHook = randomAddress();
2968
+ await TokenRouter__factory.connect(deployedTokenRoute, signer).setFeeHook(feeHook);
2969
+ const actualConfig = await warpModule.read();
2970
+ assert(typeof actualConfig.hook === 'object' &&
2971
+ actualConfig.hook.type === HookType.DELAYED_FLOW_ROUTER, 'Expected an installed delayed-flow hook');
2972
+ const nonceBefore = await signer.getTransactionCount();
2973
+ await expect(warpModule.update({
2974
+ ...actualConfig,
2975
+ feeHook: ethers.constants.AddressZero,
2976
+ interchainSecurityModule: delayedFlowIsm(signer.address, 7200),
2977
+ hook: delayedFlowHookNode(signer.address, 7200),
2978
+ })).to.be.rejectedWith('introduce, replace, or recompose');
2979
+ await expect(warpModule.update({
2980
+ ...actualConfig,
2981
+ feeHook: ethers.constants.AddressZero,
2982
+ hook: {
2983
+ type: HookType.AGGREGATION,
2984
+ hooks: [actualConfig.hook, { type: HookType.MERKLE_TREE }],
2985
+ },
2986
+ })).to.be.rejectedWith('introduce, replace, or recompose');
2987
+ expect(await signer.getTransactionCount()).to.equal(nonceBefore);
2988
+ const clearTxs = await warpModule.update({
2989
+ ...actualConfig,
2990
+ feeHook: ethers.constants.AddressZero,
2991
+ });
2992
+ expect(clearTxs.some((tx) => tx.data?.startsWith(MailboxClient__factory.createInterface().getSighash('setHook')) ?? false)).to.equal(false);
2993
+ await sendTxs(clearTxs);
2994
+ expect((await warpModule.read()).feeHook).to.equal(undefined);
2995
+ });
2996
+ it('rejects an existing hybrid owned separately from its router', async () => {
2997
+ const warpModule = await createPlainRoute();
2998
+ const { deployedTokenRoute } = warpModule.serialize();
2999
+ const expectedConfig = {
3000
+ ...(await warpModule.read()),
3001
+ interchainSecurityModule: delayedFlowIsm(signer.address),
3002
+ hook: delayedFlowHookNode(signer.address),
3003
+ };
3004
+ await sendTxs(await warpModule.update(expectedConfig));
3005
+ const client = MailboxClient__factory.connect(deployedTokenRoute, multiProvider.getProvider(chain));
3006
+ const hybrid = DelayedFlowRouterHookIsm__factory.connect(await client.hook(), signer);
3007
+ const separateOwner = randomAddress();
3008
+ await hybrid.transferOwnership(separateOwner);
3009
+ await expect(warpModule.update(expectedConfig)).to.be.rejectedWith('is owned by');
3010
+ });
3011
+ it('hands a replacement hybrid and its router to the new owner last', async () => {
3012
+ const warpModule = await createPlainRoute();
3013
+ const initialConfig = {
3014
+ ...(await warpModule.read()),
3015
+ interchainSecurityModule: delayedFlowIsm(signer.address),
3016
+ hook: delayedFlowHookNode(signer.address),
3017
+ };
3018
+ await sendTxs(await warpModule.update(initialConfig));
3019
+ const newOwner = randomAddress();
3020
+ const expectedConfig = {
3021
+ ...(await warpModule.read()),
3022
+ owner: newOwner,
3023
+ interchainSecurityModule: delayedFlowIsm(newOwner, 7200),
3024
+ hook: delayedFlowHookNode(newOwner, 7200),
3025
+ };
3026
+ const phases = await warpModule.updatePhases(expectedConfig);
3027
+ expect(phases.ownershipTxs).to.have.length(2);
3028
+ await sendTxs([
3029
+ ...phases.upgradeTxs,
3030
+ ...phases.instanceTxs,
3031
+ ...phases.hookTxs,
3032
+ ...phases.ismTxs,
3033
+ ...phases.txs,
3034
+ ...phases.feeTxs,
3035
+ ...phases.ownershipTxs,
3036
+ ]);
3037
+ const actual = await warpModule.read();
3038
+ expect(eqAddress(actual.owner, newOwner)).to.be.true;
3039
+ const hybrid = collectHybridIsmNodes(actual.interchainSecurityModule)[0];
3040
+ assert(hybrid.type === IsmType.DELAYED_FLOW_ROUTER, 'Expected delayed-flow hybrid');
3041
+ expect(hybrid.owner && eqAddress(hybrid.owner, newOwner)).to.be.true;
3042
+ expect(hybrid.maxDelay).to.equal(7200);
3043
+ });
3044
+ it('returns hybrid instance mutations before installation and ownership', async () => {
3045
+ const warpModule = await createPlainRoute();
3046
+ const initialConfig = {
3047
+ ...(await warpModule.read()),
3048
+ interchainSecurityModule: delayedFlowIsm(signer.address),
3049
+ hook: delayedFlowHookNode(signer.address),
3050
+ };
3051
+ await sendTxs(await warpModule.update(initialConfig));
3052
+ const instanceTx = {
3053
+ chainId: Number(multiProvider.getChainId(chain)),
3054
+ to: randomAddress(),
3055
+ data: '0x1234',
3056
+ };
3057
+ const updateStub = sinon
3058
+ .stub(EvmIsmModule.prototype, 'updateDeployedInstance')
3059
+ .resolves([instanceTx]);
3060
+ try {
3061
+ const currentConfig = await warpModule.read();
3062
+ const currentHybrid = collectHybridIsmNodes(currentConfig.interchainSecurityModule)[0];
3063
+ assert(currentHybrid && 'address' in currentHybrid, 'Expected an installed delayed-flow hybrid');
3064
+ const targetConfig = {
3065
+ ...currentConfig,
3066
+ interchainSecurityModule: delayedFlowIsm(signer.address),
3067
+ hook: delayedFlowHookNode(signer.address),
3068
+ };
3069
+ const phases = await warpModule.updatePhases(targetConfig);
3070
+ expect(updateStub.calledOnce).to.be.true;
3071
+ expect(phases.instanceTxs).to.deep.equal([instanceTx]);
3072
+ expect(phases.ownershipTxs).not.to.include(instanceTx);
3073
+ }
3074
+ finally {
3075
+ updateStub.restore();
3076
+ }
3077
+ });
3078
+ it('resumes after hybrid ownership transfers but router ownership does not', async () => {
3079
+ const warpModule = await createPlainRoute();
3080
+ const initialConfig = {
3081
+ ...(await warpModule.read()),
3082
+ interchainSecurityModule: delayedFlowIsm(signer.address),
3083
+ hook: delayedFlowHookNode(signer.address),
3084
+ };
3085
+ await sendTxs(await warpModule.update(initialConfig));
3086
+ const newOwner = randomAddress();
3087
+ const expectedConfig = {
3088
+ ...(await warpModule.read()),
3089
+ owner: newOwner,
3090
+ interchainSecurityModule: delayedFlowIsm(newOwner),
3091
+ hook: delayedFlowHookNode(newOwner),
3092
+ };
3093
+ const interruptedPhases = await warpModule.updatePhases(expectedConfig);
3094
+ expect(interruptedPhases.ownershipTxs).to.have.length(2);
3095
+ await sendTxs([interruptedPhases.ownershipTxs[0]]);
3096
+ const nonceBeforeRejectedChange = await signer.getTransactionCount();
3097
+ await expect(warpModule.updatePhases({
3098
+ ...expectedConfig,
3099
+ interchainSecurityModule: delayedFlowIsm(newOwner, 7200),
3100
+ hook: delayedFlowHookNode(newOwner, 7200),
3101
+ })).to.be.rejectedWith('was already transferred to the target owner');
3102
+ expect(await signer.getTransactionCount()).to.equal(nonceBeforeRejectedChange);
3103
+ const resumedPhases = await warpModule.updatePhases(expectedConfig);
3104
+ expect(resumedPhases.ownershipTxs).to.have.length(1);
3105
+ await sendTxs(resumedPhases.ownershipTxs);
3106
+ const actual = await warpModule.read();
3107
+ expect(eqAddress(actual.owner, newOwner)).to.be.true;
3108
+ const hybrid = collectHybridIsmNodes(actual.interchainSecurityModule)[0];
3109
+ assert(hybrid.type === IsmType.DELAYED_FLOW_ROUTER, 'Expected delayed-flow hybrid');
3110
+ expect(hybrid.owner && eqAddress(hybrid.owner, newOwner)).to.be.true;
3111
+ });
3112
+ });
3113
+ describe('createHookUpdateTxs', () => {
3114
+ const ROUTE_ADDRESS = '0x1111111111111111111111111111111111111111';
3115
+ const TOKEN_ADDRESS = '0x2222222222222222222222222222222222222222';
3116
+ let warpModule;
3117
+ before(() => {
3118
+ warpModule = new EvmWarpModule(multiProvider, {
3119
+ chain,
3120
+ config: {},
3121
+ addresses: {
3122
+ deployedTokenRoute: ROUTE_ADDRESS,
3123
+ ...ismFactoryAddresses,
3124
+ },
3125
+ });
3126
+ });
3127
+ it('returns empty when expected hook is AddressZero', async () => {
3128
+ const actual = {
3129
+ ...baseConfig,
3130
+ type: TokenType.collateral,
3131
+ token: TOKEN_ADDRESS,
3132
+ };
3133
+ const expected = {
3134
+ ...baseConfig,
3135
+ type: TokenType.collateral,
3136
+ token: TOKEN_ADDRESS,
3137
+ hook: ethers.constants.AddressZero,
3138
+ };
3139
+ expect(await warpModule.createHookUpdateTxs(actual, expected)).to.deep.equal([]);
3140
+ });
3141
+ });
3142
+ });
3143
+ //# sourceMappingURL=EvmWarpModule.hardhat-test.js.map