@hyperlane-xyz/sdk 41.3.1 → 43.0.0

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 (324) hide show
  1. package/dist/ccip/consts.d.ts.map +1 -1
  2. package/dist/ccip/consts.js +20 -0
  3. package/dist/ccip/consts.js.map +1 -1
  4. package/dist/consts/multisigIsm.d.ts.map +1 -1
  5. package/dist/consts/multisigIsm.js +32 -0
  6. package/dist/consts/multisigIsm.js.map +1 -1
  7. package/dist/contracts/contracts.d.ts.map +1 -1
  8. package/dist/contracts/contracts.js +15 -0
  9. package/dist/contracts/contracts.js.map +1 -1
  10. package/dist/contracts/contracts.test.d.ts +2 -0
  11. package/dist/contracts/contracts.test.d.ts.map +1 -0
  12. package/dist/contracts/contracts.test.js +88 -0
  13. package/dist/contracts/contracts.test.js.map +1 -0
  14. package/dist/core/types.d.ts +48 -4158
  15. package/dist/core/types.d.ts.map +1 -1
  16. package/dist/core/types.js +21 -3
  17. package/dist/core/types.js.map +1 -1
  18. package/dist/core/types.test.js +58 -0
  19. package/dist/core/types.test.js.map +1 -1
  20. package/dist/deploy/HyperlaneDeployer.js +1 -1
  21. package/dist/deploy/proxy.d.ts +8 -40
  22. package/dist/deploy/proxy.d.ts.map +1 -1
  23. package/dist/deploy/proxy.js +4 -4
  24. package/dist/deploy/proxy.js.map +1 -1
  25. package/dist/deploy/types.d.ts +1 -19
  26. package/dist/deploy/types.d.ts.map +1 -1
  27. package/dist/deploy/warp.d.ts +119 -3
  28. package/dist/deploy/warp.d.ts.map +1 -1
  29. package/dist/deploy/warp.js +696 -33
  30. package/dist/deploy/warp.js.map +1 -1
  31. package/dist/deploy/warp.test.d.ts +2 -0
  32. package/dist/deploy/warp.test.d.ts.map +1 -0
  33. package/dist/deploy/warp.test.js +358 -0
  34. package/dist/deploy/warp.test.js.map +1 -0
  35. package/dist/deploy/warpHybridPlan.d.ts +104 -0
  36. package/dist/deploy/warpHybridPlan.d.ts.map +1 -0
  37. package/dist/deploy/warpHybridPlan.js +178 -0
  38. package/dist/deploy/warpHybridPlan.js.map +1 -0
  39. package/dist/deploy/warpHybridPlan.test.d.ts +2 -0
  40. package/dist/deploy/warpHybridPlan.test.d.ts.map +1 -0
  41. package/dist/deploy/warpHybridPlan.test.js +141 -0
  42. package/dist/deploy/warpHybridPlan.test.js.map +1 -0
  43. package/dist/fee/EvmTokenFeeDeployer.d.ts.map +1 -1
  44. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js +68 -0
  45. package/dist/fee/EvmTokenFeeDeployer.hardhat-test.js.map +1 -1
  46. package/dist/fee/EvmTokenFeeDeployer.js +18 -10
  47. package/dist/fee/EvmTokenFeeDeployer.js.map +1 -1
  48. package/dist/fee/EvmTokenFeeModule.d.ts.map +1 -1
  49. package/dist/fee/EvmTokenFeeModule.hardhat-test.js +18 -8
  50. package/dist/fee/EvmTokenFeeModule.hardhat-test.js.map +1 -1
  51. package/dist/fee/EvmTokenFeeModule.js +8 -1
  52. package/dist/fee/EvmTokenFeeModule.js.map +1 -1
  53. package/dist/fee/EvmTokenFeeReader.d.ts +2 -2
  54. package/dist/fee/EvmTokenFeeReader.d.ts.map +1 -1
  55. package/dist/fee/EvmTokenFeeReader.js.map +1 -1
  56. package/dist/fee/feeConfigMapping.d.ts.map +1 -1
  57. package/dist/fee/feeConfigMapping.js +1 -0
  58. package/dist/fee/feeConfigMapping.js.map +1 -1
  59. package/dist/fee/types.d.ts +147 -646
  60. package/dist/fee/types.d.ts.map +1 -1
  61. package/dist/fee/types.js +26 -17
  62. package/dist/fee/types.js.map +1 -1
  63. package/dist/fork/types.d.ts +125 -1924
  64. package/dist/fork/types.d.ts.map +1 -1
  65. package/dist/fork/types.js +3 -3
  66. package/dist/fork/types.js.map +1 -1
  67. package/dist/gas/oracle/types.d.ts +5 -56
  68. package/dist/gas/oracle/types.d.ts.map +1 -1
  69. package/dist/hook/EvmHookModule.d.ts +1 -1
  70. package/dist/hook/EvmHookModule.d.ts.map +1 -1
  71. package/dist/hook/EvmHookModule.hardhat-test.js +12 -1
  72. package/dist/hook/EvmHookModule.hardhat-test.js.map +1 -1
  73. package/dist/hook/EvmHookModule.js +19 -3
  74. package/dist/hook/EvmHookModule.js.map +1 -1
  75. package/dist/hook/EvmHookReader.d.ts +10 -0
  76. package/dist/hook/EvmHookReader.d.ts.map +1 -1
  77. package/dist/hook/EvmHookReader.js +92 -11
  78. package/dist/hook/EvmHookReader.js.map +1 -1
  79. package/dist/hook/EvmHookReader.test.js +155 -1
  80. package/dist/hook/EvmHookReader.test.js.map +1 -1
  81. package/dist/hook/HyperlaneHookDeployer.d.ts +12 -0
  82. package/dist/hook/HyperlaneHookDeployer.d.ts.map +1 -1
  83. package/dist/hook/HyperlaneHookDeployer.hardhat-test.d.ts +2 -0
  84. package/dist/hook/HyperlaneHookDeployer.hardhat-test.d.ts.map +1 -0
  85. package/dist/hook/HyperlaneHookDeployer.hardhat-test.js +322 -0
  86. package/dist/hook/HyperlaneHookDeployer.hardhat-test.js.map +1 -0
  87. package/dist/hook/HyperlaneHookDeployer.js +262 -5
  88. package/dist/hook/HyperlaneHookDeployer.js.map +1 -1
  89. package/dist/hook/types.d.ts +72 -2223
  90. package/dist/hook/types.d.ts.map +1 -1
  91. package/dist/hook/types.js +66 -10
  92. package/dist/hook/types.js.map +1 -1
  93. package/dist/hook/types.test.js +21 -1
  94. package/dist/hook/types.test.js.map +1 -1
  95. package/dist/hook/updates.d.ts +1 -0
  96. package/dist/hook/updates.d.ts.map +1 -1
  97. package/dist/hook/updates.js +2 -2
  98. package/dist/hook/updates.js.map +1 -1
  99. package/dist/hook/utils.d.ts +28 -1
  100. package/dist/hook/utils.d.ts.map +1 -1
  101. package/dist/hook/utils.js +89 -0
  102. package/dist/hook/utils.js.map +1 -1
  103. package/dist/ica/types.d.ts +35 -1570
  104. package/dist/ica/types.d.ts.map +1 -1
  105. package/dist/ica/types.js +1 -1
  106. package/dist/ica/types.js.map +1 -1
  107. package/dist/index.d.ts +7 -6
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +7 -6
  110. package/dist/index.js.map +1 -1
  111. package/dist/ism/EvmIsmModule.d.ts +29 -3
  112. package/dist/ism/EvmIsmModule.d.ts.map +1 -1
  113. package/dist/ism/EvmIsmModule.hardhat-test.js +512 -3
  114. package/dist/ism/EvmIsmModule.hardhat-test.js.map +1 -1
  115. package/dist/ism/EvmIsmModule.js +239 -21
  116. package/dist/ism/EvmIsmModule.js.map +1 -1
  117. package/dist/ism/EvmIsmReader.d.ts.map +1 -1
  118. package/dist/ism/EvmIsmReader.js +77 -1
  119. package/dist/ism/EvmIsmReader.js.map +1 -1
  120. package/dist/ism/EvmIsmReader.test.js +245 -4
  121. package/dist/ism/EvmIsmReader.test.js.map +1 -1
  122. package/dist/ism/HyperlaneIsmFactory.d.ts +17 -5
  123. package/dist/ism/HyperlaneIsmFactory.d.ts.map +1 -1
  124. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js +431 -4
  125. package/dist/ism/HyperlaneIsmFactory.hardhat-test.js.map +1 -1
  126. package/dist/ism/HyperlaneIsmFactory.js +121 -11
  127. package/dist/ism/HyperlaneIsmFactory.js.map +1 -1
  128. package/dist/ism/delayedFlow.d.ts +31 -0
  129. package/dist/ism/delayedFlow.d.ts.map +1 -0
  130. package/dist/ism/delayedFlow.js +33 -0
  131. package/dist/ism/delayedFlow.js.map +1 -0
  132. package/dist/ism/types.d.ts +86 -237
  133. package/dist/ism/types.d.ts.map +1 -1
  134. package/dist/ism/types.js +270 -20
  135. package/dist/ism/types.js.map +1 -1
  136. package/dist/ism/types.test.js +433 -1
  137. package/dist/ism/types.test.js.map +1 -1
  138. package/dist/ism/utils.d.ts.map +1 -1
  139. package/dist/ism/utils.js +113 -3
  140. package/dist/ism/utils.js.map +1 -1
  141. package/dist/ism/utils.test.js +44 -0
  142. package/dist/ism/utils.test.js.map +1 -1
  143. package/dist/metadata/agentConfig.d.ts +537 -10384
  144. package/dist/metadata/agentConfig.d.ts.map +1 -1
  145. package/dist/metadata/agentConfig.js +14 -16
  146. package/dist/metadata/agentConfig.js.map +1 -1
  147. package/dist/metadata/chainMetadataTypes.d.ts +70 -4678
  148. package/dist/metadata/chainMetadataTypes.d.ts.map +1 -1
  149. package/dist/metadata/chainMetadataTypes.js +5 -5
  150. package/dist/metadata/chainMetadataTypes.js.map +1 -1
  151. package/dist/metadata/customZodTypes.d.ts +5 -5
  152. package/dist/metadata/customZodTypes.d.ts.map +1 -1
  153. package/dist/metadata/customZodTypes.js +4 -5
  154. package/dist/metadata/customZodTypes.js.map +1 -1
  155. package/dist/metadata/deploymentArtifacts.d.ts +1 -13
  156. package/dist/metadata/deploymentArtifacts.d.ts.map +1 -1
  157. package/dist/metadata/matchingList.d.ts +12 -40
  158. package/dist/metadata/matchingList.d.ts.map +1 -1
  159. package/dist/metadata/warpRouteConfig.d.ts +8 -114
  160. package/dist/metadata/warpRouteConfig.d.ts.map +1 -1
  161. package/dist/metadata/warpRouteConfig.js +3 -3
  162. package/dist/metadata/warpRouteConfig.js.map +1 -1
  163. package/dist/middleware/account/InterchainAccount.d.ts.map +1 -1
  164. package/dist/middleware/account/InterchainAccount.js +12 -8
  165. package/dist/middleware/account/InterchainAccount.js.map +1 -1
  166. package/dist/middleware/account/InterchainAccount.test.js +22 -3
  167. package/dist/middleware/account/InterchainAccount.test.js.map +1 -1
  168. package/dist/middleware/account/icaCalls.d.ts +13 -145
  169. package/dist/middleware/account/icaCalls.d.ts.map +1 -1
  170. package/dist/middleware/account/types.d.ts +11 -105
  171. package/dist/middleware/account/types.d.ts.map +1 -1
  172. package/dist/predicate/PredicateApiClient.d.ts +1 -11
  173. package/dist/predicate/PredicateApiClient.d.ts.map +1 -1
  174. package/dist/providers/MultiProvider.d.ts.map +1 -1
  175. package/dist/providers/MultiProvider.js +3 -2
  176. package/dist/providers/MultiProvider.js.map +1 -1
  177. package/dist/providers/MultiProviderAdapter.d.ts +3 -3
  178. package/dist/providers/MultiProviderAdapter.d.ts.map +1 -1
  179. package/dist/providers/MultiProviderAdapter.js +2 -1
  180. package/dist/providers/MultiProviderAdapter.js.map +1 -1
  181. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.d.ts.map +1 -1
  182. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.js +4 -0
  183. package/dist/providers/SmartProvider/HyperlaneJsonRpcProvider.js.map +1 -1
  184. package/dist/providers/transactionFeeEstimators.d.ts +16 -9
  185. package/dist/providers/transactionFeeEstimators.d.ts.map +1 -1
  186. package/dist/providers/transactionFeeEstimators.js +66 -17
  187. package/dist/providers/transactionFeeEstimators.js.map +1 -1
  188. package/dist/providers/transactionFeeEstimators.test.js +153 -1
  189. package/dist/providers/transactionFeeEstimators.test.js.map +1 -1
  190. package/dist/providers/transactions/submitter/builder/types.d.ts +13 -280
  191. package/dist/providers/transactions/submitter/builder/types.d.ts.map +1 -1
  192. package/dist/providers/transactions/submitter/builder/types.js +2 -4
  193. package/dist/providers/transactions/submitter/builder/types.js.map +1 -1
  194. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.d.ts +2 -0
  195. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.d.ts.map +1 -1
  196. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.js +15 -7
  197. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.js.map +1 -1
  198. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.d.ts +2 -0
  199. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.d.ts.map +1 -0
  200. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.js +145 -0
  201. package/dist/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.js.map +1 -0
  202. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.d.ts +14 -1
  203. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.d.ts.map +1 -1
  204. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.js +46 -5
  205. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.js.map +1 -1
  206. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.d.ts +2 -0
  207. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.d.ts.map +1 -0
  208. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.js +125 -0
  209. package/dist/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.js.map +1 -0
  210. package/dist/providers/transactions/submitter/ethersV5/types.d.ts +30 -102
  211. package/dist/providers/transactions/submitter/ethersV5/types.d.ts.map +1 -1
  212. package/dist/providers/transactions/submitter/ethersV5/types.js +3 -21
  213. package/dist/providers/transactions/submitter/ethersV5/types.js.map +1 -1
  214. package/dist/providers/transactions/submitter/types.d.ts +5 -51
  215. package/dist/providers/transactions/submitter/types.d.ts.map +1 -1
  216. package/dist/providers/transactions/types.d.ts +1 -9
  217. package/dist/providers/transactions/types.d.ts.map +1 -1
  218. package/dist/router/HyperlaneRouterDeployer.d.ts +3 -1
  219. package/dist/router/HyperlaneRouterDeployer.d.ts.map +1 -1
  220. package/dist/router/HyperlaneRouterDeployer.js +4 -2
  221. package/dist/router/HyperlaneRouterDeployer.js.map +1 -1
  222. package/dist/router/types.d.ts +33 -1824
  223. package/dist/router/types.d.ts.map +1 -1
  224. package/dist/router/types.js +4 -4
  225. package/dist/router/types.js.map +1 -1
  226. package/dist/rpc/evm/EvmEventLogsReader.d.ts +19 -27
  227. package/dist/rpc/evm/EvmEventLogsReader.d.ts.map +1 -1
  228. package/dist/rpc/evm/EvmEventLogsReader.js +23 -0
  229. package/dist/rpc/evm/EvmEventLogsReader.js.map +1 -1
  230. package/dist/rpc/evm/EvmEventLogsReader.test.js +53 -1
  231. package/dist/rpc/evm/EvmEventLogsReader.test.js.map +1 -1
  232. package/dist/signers/turnkeyClient.d.ts +1 -15
  233. package/dist/signers/turnkeyClient.d.ts.map +1 -1
  234. package/dist/test/testUtils.d.ts +1 -1
  235. package/dist/test/testUtils.d.ts.map +1 -1
  236. package/dist/test/testUtils.js +17 -0
  237. package/dist/test/testUtils.js.map +1 -1
  238. package/dist/test/testUtils.test.d.ts +2 -0
  239. package/dist/test/testUtils.test.d.ts.map +1 -0
  240. package/dist/test/testUtils.test.js +28 -0
  241. package/dist/test/testUtils.test.js.map +1 -0
  242. package/dist/timelock/types.d.ts +8 -32
  243. package/dist/timelock/types.d.ts.map +1 -1
  244. package/dist/token/EvmWarpModule.d.ts +44 -8
  245. package/dist/token/EvmWarpModule.d.ts.map +1 -1
  246. package/dist/token/EvmWarpModule.hardhat-test.js +574 -4
  247. package/dist/token/EvmWarpModule.hardhat-test.js.map +1 -1
  248. package/dist/token/EvmWarpModule.js +237 -25
  249. package/dist/token/EvmWarpModule.js.map +1 -1
  250. package/dist/token/EvmWarpRouteReader.d.ts.map +1 -1
  251. package/dist/token/EvmWarpRouteReader.js +36 -19
  252. package/dist/token/EvmWarpRouteReader.js.map +1 -1
  253. package/dist/token/EvmWarpRouteReader.test.js +219 -2
  254. package/dist/token/EvmWarpRouteReader.test.js.map +1 -1
  255. package/dist/token/EvmXERC20Reader.d.ts +9 -21
  256. package/dist/token/EvmXERC20Reader.d.ts.map +1 -1
  257. package/dist/token/EvmXERC20Reader.js +24 -48
  258. package/dist/token/EvmXERC20Reader.js.map +1 -1
  259. package/dist/token/EvmXERC20Reader.test.js +97 -0
  260. package/dist/token/EvmXERC20Reader.test.js.map +1 -1
  261. package/dist/token/ITokenMetadata.d.ts +12 -130
  262. package/dist/token/ITokenMetadata.d.ts.map +1 -1
  263. package/dist/token/ITokenMetadata.js +2 -2
  264. package/dist/token/ITokenMetadata.js.map +1 -1
  265. package/dist/token/TokenConnection.d.ts +3 -35
  266. package/dist/token/TokenConnection.d.ts.map +1 -1
  267. package/dist/token/configUtils.d.ts +17 -7
  268. package/dist/token/configUtils.d.ts.map +1 -1
  269. package/dist/token/configUtils.js +124 -0
  270. package/dist/token/configUtils.js.map +1 -1
  271. package/dist/token/configUtils.test.js +212 -11
  272. package/dist/token/configUtils.test.js.map +1 -1
  273. package/dist/token/deploy.d.ts +3 -1
  274. package/dist/token/deploy.d.ts.map +1 -1
  275. package/dist/token/deploy.hardhat-test.js +617 -6
  276. package/dist/token/deploy.hardhat-test.js.map +1 -1
  277. package/dist/token/deploy.js +25 -6
  278. package/dist/token/deploy.js.map +1 -1
  279. package/dist/token/types.d.ts +4373 -25929
  280. package/dist/token/types.d.ts.map +1 -1
  281. package/dist/token/types.js +10 -12
  282. package/dist/token/types.js.map +1 -1
  283. package/dist/token/types.test.js +48 -0
  284. package/dist/token/types.test.js.map +1 -1
  285. package/dist/token/warpCheck.d.ts.map +1 -1
  286. package/dist/token/warpCheck.js +36 -1
  287. package/dist/token/warpCheck.js.map +1 -1
  288. package/dist/token/xerc20-abi.d.ts +31 -0
  289. package/dist/token/xerc20-abi.d.ts.map +1 -1
  290. package/dist/token/xerc20-abi.js +40 -0
  291. package/dist/token/xerc20-abi.js.map +1 -1
  292. package/dist/token/xerc20-limits.d.ts +63 -0
  293. package/dist/token/xerc20-limits.d.ts.map +1 -0
  294. package/dist/token/xerc20-limits.js +80 -0
  295. package/dist/token/xerc20-limits.js.map +1 -0
  296. package/dist/token/xerc20.d.ts +30 -1
  297. package/dist/token/xerc20.d.ts.map +1 -1
  298. package/dist/token/xerc20.js +137 -54
  299. package/dist/token/xerc20.js.map +1 -1
  300. package/dist/token/xerc20.test.js +461 -169
  301. package/dist/token/xerc20.test.js.map +1 -1
  302. package/dist/types.d.ts +6 -36
  303. package/dist/types.d.ts.map +1 -1
  304. package/dist/types.js +1 -1
  305. package/dist/types.js.map +1 -1
  306. package/dist/utils/cosmos.d.ts +113 -844
  307. package/dist/utils/cosmos.d.ts.map +1 -1
  308. package/dist/utils/cosmos.js +50 -91
  309. package/dist/utils/cosmos.js.map +1 -1
  310. package/dist/utils/ism.d.ts +167 -1
  311. package/dist/utils/ism.d.ts.map +1 -1
  312. package/dist/utils/ism.js +412 -2
  313. package/dist/utils/ism.js.map +1 -1
  314. package/dist/utils/ism.test.d.ts +2 -0
  315. package/dist/utils/ism.test.d.ts.map +1 -0
  316. package/dist/utils/ism.test.js +372 -0
  317. package/dist/utils/ism.test.js.map +1 -0
  318. package/dist/utils/schemas.d.ts +3 -3
  319. package/dist/utils/schemas.d.ts.map +1 -1
  320. package/dist/utils/schemas.js +2 -1
  321. package/dist/utils/schemas.js.map +1 -1
  322. package/dist/warp/types.d.ts +25 -367
  323. package/dist/warp/types.d.ts.map +1 -1
  324. package/package.json +11 -11
@@ -1,3 +1,4 @@
1
+ import { generateTypedData } from '@safe-global/protocol-kit';
1
2
  import { assert, retryAsync, rootLogger } from '@hyperlane-xyz/utils';
2
3
  import { SAFE_API_BASE_RETRY_MS, SAFE_API_RETRIES, canProposeSafeTransactions, getSafe, getSafeService, } from '../../../../utils/gnosisSafe.js';
3
4
  import { TxSubmitterType } from '../TxSubmitterTypes.js';
@@ -29,11 +30,7 @@ export class EV5GnosisSafeTxSubmitter {
29
30
  const signerAddress = await signer.getAddress();
30
31
  const authorized = await canProposeSafeTransactions(signerAddress, chain, multiProvider, safeAddress);
31
32
  assert(authorized, `Signer ${signerAddress} is not an authorized Safe Proposer for ${safeAddress}`);
32
- const safeSignerKey = 'privateKey' in signer
33
- ? signer.privateKey
34
- : undefined;
35
- assert(safeSignerKey, 'Signer must have a private key to propose Safe transactions');
36
- const { safe, safeService } = await EV5GnosisSafeTxSubmitter.initSafeAndService(chain, multiProvider, safeAddress, safeSignerKey);
33
+ const { safe, safeService } = await EV5GnosisSafeTxSubmitter.initSafeAndService(chain, multiProvider, safeAddress);
37
34
  return new EV5GnosisSafeTxSubmitter(multiProvider, props, safe, safeService);
38
35
  }
39
36
  async getNextNonce() {
@@ -67,8 +64,8 @@ export class EV5GnosisSafeTxSubmitter {
67
64
  async proposeSafeTransaction(safeTransaction) {
68
65
  const safeTxHash = await this.safe.getTransactionHash(safeTransaction);
69
66
  const senderAddress = await this.multiProvider.getSignerAddress(this.props.chain);
70
- const safeSignature = await this.safe.signTypedData(safeTransaction);
71
- const senderSignature = safeSignature.data;
67
+ const signer = this.multiProvider.getSigner(this.props.chain);
68
+ const senderSignature = await signSafeTransactionWithSigner(this.safe, safeTransaction, signer);
72
69
  this.logger.info(`Submitting transaction proposal to ${this.props.safeAddress} on ${this.props.chain}: ${safeTxHash}`);
73
70
  return retryAsync(() => this.safeService.proposeTransaction({
74
71
  safeAddress: this.props.safeAddress,
@@ -79,4 +76,15 @@ export class EV5GnosisSafeTxSubmitter {
79
76
  }), SAFE_API_RETRIES, SAFE_API_BASE_RETRY_MS);
80
77
  }
81
78
  }
79
+ export async function signSafeTransactionWithSigner(safe, safeTransaction, signer) {
80
+ assert('_signTypedData' in signer && typeof signer._signTypedData === 'function', 'Signer must support EIP-712 typed-data signing to propose Safe transactions');
81
+ const typedData = generateTypedData({
82
+ safeAddress: await safe.getAddress(),
83
+ safeVersion: safe.getContractVersion(),
84
+ chainId: await safe.getChainId(),
85
+ data: safeTransaction.data,
86
+ });
87
+ assert(typedData.primaryType === 'SafeTx', 'Expected Safe transaction typed data');
88
+ return signer._signTypedData(typedData.domain, { SafeTx: typedData.types.SafeTx }, typedData.message);
89
+ }
82
90
  //# sourceMappingURL=EV5GnosisSafeTxSubmitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EV5GnosisSafeTxSubmitter.js","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EV5GnosisSafeTxSubmitter.js","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EV5GnosisSafeTxSubmitter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EV5GnosisSafeTxSubmitter.test.d.ts","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,145 @@
1
+ import Safe, { EthSafeTransaction } from '@safe-global/protocol-kit';
2
+ import { OperationType } from '@safe-global/types-kit';
3
+ import { expect } from 'chai';
4
+ import { Signer, Wallet, ethers } from 'ethers';
5
+ import { ProtocolType } from '@hyperlane-xyz/utils';
6
+ import { MultiProvider } from '../../../MultiProvider.js';
7
+ import { EV5GnosisSafeTxSubmitter, signSafeTransactionWithSigner, } from './EV5GnosisSafeTxSubmitter.js';
8
+ class HttpStyleTypedDataSigner extends Signer {
9
+ wallet;
10
+ typedDataCalls = 0;
11
+ lastSignature;
12
+ constructor(wallet) {
13
+ super();
14
+ this.wallet = wallet;
15
+ }
16
+ getAddress() {
17
+ return this.wallet.getAddress();
18
+ }
19
+ signMessage() {
20
+ throw new Error('not implemented');
21
+ }
22
+ signTransaction() {
23
+ throw new Error('not implemented');
24
+ }
25
+ connect() {
26
+ return this;
27
+ }
28
+ async _signTypedData(domain, types, value) {
29
+ this.typedDataCalls += 1;
30
+ this.lastSignature = await this.wallet._signTypedData(domain, types, value);
31
+ return this.lastSignature;
32
+ }
33
+ }
34
+ describe('signSafeTransactionWithSigner', () => {
35
+ const wallet = Wallet.createRandom();
36
+ const privateKey = wallet.privateKey;
37
+ const contractAddress = '0x0000000000000000000000000000000000000001';
38
+ const safeVersion = '1.4.1';
39
+ const chainId = 31337n;
40
+ const transaction = new EthSafeTransaction({
41
+ to: '0x0000000000000000000000000000000000000002',
42
+ value: '3',
43
+ data: '0x12345678',
44
+ operation: OperationType.Call,
45
+ safeTxGas: '0',
46
+ baseGas: '0',
47
+ gasPrice: '0',
48
+ gasToken: '0x0000000000000000000000000000000000000000',
49
+ refundReceiver: '0x0000000000000000000000000000000000000000',
50
+ nonce: 7,
51
+ });
52
+ async function createLocalSignerSafe() {
53
+ // Safe only calls proxyCreationCode while initializing a predicted
54
+ // account. The mocked chain still exercises Protocol Kit's real local
55
+ // signer and Safe.signTypedData implementation.
56
+ const encodedProxyCreationCode = ethers.utils.defaultAbiCoder.encode(['bytes'], ['0x00']);
57
+ const provider = {
58
+ async request({ method }) {
59
+ switch (method) {
60
+ case 'eth_chainId':
61
+ return `0x${chainId.toString(16)}`;
62
+ case 'eth_getCode':
63
+ return '0x01';
64
+ case 'eth_call':
65
+ return encodedProxyCreationCode;
66
+ case 'eth_getTransactionCount':
67
+ return '0x0';
68
+ default:
69
+ throw new Error(`Unexpected test RPC method ${method}`);
70
+ }
71
+ },
72
+ };
73
+ const contractNetwork = {
74
+ safeSingletonAddress: contractAddress,
75
+ safeProxyFactoryAddress: contractAddress,
76
+ multiSendAddress: contractAddress,
77
+ multiSendCallOnlyAddress: contractAddress,
78
+ fallbackHandlerAddress: contractAddress,
79
+ signMessageLibAddress: contractAddress,
80
+ createCallAddress: contractAddress,
81
+ simulateTxAccessorAddress: contractAddress,
82
+ };
83
+ // @ts-expect-error protocol-kit exposes its default class directly at runtime.
84
+ return Safe.init({
85
+ provider,
86
+ signer: privateKey,
87
+ predictedSafe: {
88
+ safeAccountConfig: { owners: [wallet.address], threshold: 1 },
89
+ safeDeploymentConfig: { safeVersion },
90
+ },
91
+ contractNetworks: { [chainId.toString()]: contractNetwork },
92
+ });
93
+ }
94
+ it('matches Protocol Kit local-key signing byte-for-byte', async () => {
95
+ const safe = await createLocalSignerSafe();
96
+ const expected = (await safe.signTypedData(transaction)).data;
97
+ expect(await signSafeTransactionWithSigner(safe, transaction, wallet)).to.equal(expected);
98
+ });
99
+ it('rejects signers without typed-data support', async () => {
100
+ const safe = await createLocalSignerSafe();
101
+ const signer = Object.create(wallet);
102
+ Object.defineProperty(signer, '_signTypedData', { value: undefined });
103
+ let error;
104
+ try {
105
+ await signSafeTransactionWithSigner(safe, transaction, signer);
106
+ }
107
+ catch (caught) {
108
+ error = caught instanceof Error ? caught : new Error(String(caught));
109
+ }
110
+ expect(error?.message).to.include('must support EIP-712');
111
+ });
112
+ it('proposes the exact signature from an external typed-data signer', async () => {
113
+ const safe = await createLocalSignerSafe();
114
+ const signer = new HttpStyleTypedDataSigner(wallet);
115
+ const multiProvider = new MultiProvider({
116
+ test: {
117
+ chainId: Number(chainId),
118
+ domainId: Number(chainId),
119
+ name: 'test',
120
+ protocol: ProtocolType.Ethereum,
121
+ rpcUrls: [{ http: 'http://127.0.0.1:8545' }],
122
+ },
123
+ });
124
+ multiProvider.setSigner('test', signer);
125
+ let proposal;
126
+ const safeService = Object.create(null);
127
+ safeService.getNextNonce = async () => '11';
128
+ safeService.proposeTransaction = async (value) => {
129
+ proposal = value;
130
+ };
131
+ const submitter = new EV5GnosisSafeTxSubmitter(multiProvider, { chain: 'test', safeAddress: await safe.getAddress() }, safe, safeService);
132
+ await submitter.submit({
133
+ chainId: Number(chainId),
134
+ to: transaction.data.to,
135
+ value: ethers.BigNumber.from(transaction.data.value),
136
+ data: transaction.data.data,
137
+ });
138
+ expect(signer.typedDataCalls).to.equal(1);
139
+ expect(proposal).to.not.equal(undefined);
140
+ expect(proposal?.senderAddress).to.equal(wallet.address);
141
+ expect(proposal?.senderSignature).to.equal(signer.lastSignature);
142
+ expect(proposal?.safeAddress).to.equal(await safe.getAddress());
143
+ });
144
+ });
145
+ //# sourceMappingURL=EV5GnosisSafeTxSubmitter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EV5GnosisSafeTxSubmitter.test.js","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5GnosisSafeTxSubmitter.test.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,29 @@
1
1
  import { TransactionReceipt } from '@ethersproject/providers';
2
+ import { Signer } from 'ethers';
2
3
  import { Logger } from 'pino';
3
4
  import { MultiProvider } from '../../../MultiProvider.js';
4
5
  import { AnnotatedEV5Transaction } from '../../../ProviderType.js';
5
6
  import { TxSubmitterType } from '../TxSubmitterTypes.js';
6
7
  import { EV5TxSubmitterInterface } from './EV5TxSubmitterInterface.js';
7
8
  import { EV5JsonRpcTxSubmitterProps } from './types.js';
9
+ export interface EV5SubmittedTransaction {
10
+ transactionHash: string;
11
+ receipt?: TransactionReceipt;
12
+ }
13
+ /** Retains irreversible progress when a sequential batch fails. */
14
+ export declare class EV5JsonRpcSubmissionError extends Error {
15
+ readonly submittedTransactions: EV5SubmittedTransaction[];
16
+ readonly cause: unknown;
17
+ readonly name = "EV5JsonRpcSubmissionError";
18
+ constructor(message: string, submittedTransactions: EV5SubmittedTransaction[], cause: unknown);
19
+ }
8
20
  export declare class EV5JsonRpcTxSubmitter implements EV5TxSubmitterInterface {
9
21
  readonly multiProvider: MultiProvider;
10
22
  readonly props: EV5JsonRpcTxSubmitterProps;
23
+ readonly signer?: Signer | undefined;
11
24
  readonly txSubmitterType: TxSubmitterType;
12
25
  protected readonly logger: Logger;
13
- constructor(multiProvider: MultiProvider, props: EV5JsonRpcTxSubmitterProps);
26
+ constructor(multiProvider: MultiProvider, props: EV5JsonRpcTxSubmitterProps, signer?: Signer | undefined);
14
27
  submit(...txs: AnnotatedEV5Transaction[]): Promise<TransactionReceipt[]>;
15
28
  }
16
29
  //# sourceMappingURL=EV5JsonRpcTxSubmitter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EV5JsonRpcTxSubmitter.d.ts","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,qBAAsB,YAAW,uBAAuB;aAQjD,aAAa,EAAE,aAAa;aAC5B,KAAK,EAAE,0BAA0B;IARnD,SAAgB,eAAe,EAAE,eAAe,CAA4B;IAE5E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAE9B;IAEH,YACkB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,0BAA0B,EAC/C;IAES,MAAM,CACjB,GAAG,GAAG,EAAE,uBAAuB,EAAE,GAChC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmB/B;CACF"}
1
+ {"version":3,"file":"EV5JsonRpcTxSubmitter.d.ts","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAmB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED,mEAAmE;AACnE,qBAAa,yBAA0B,SAAQ,KAAK;aAKhC,qBAAqB,EAAE,uBAAuB,EAAE;aAChD,KAAK,EAAE,OAAO;IALhC,QAAQ,CAAC,IAAI,+BAA+B;IAE5C,YACE,OAAO,EAAE,MAAM,EACC,qBAAqB,EAAE,uBAAuB,EAAE,EAChD,KAAK,EAAE,OAAO,EAG/B;CACF;AAED,qBAAa,qBAAsB,YAAW,uBAAuB;aAQjD,aAAa,EAAE,aAAa;aAC5B,KAAK,EAAE,0BAA0B;aACjC,MAAM,CAAC,EAAE,MAAM;IATjC,SAAgB,eAAe,EAAE,eAAe,CAA4B;IAE5E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAE9B;IAEH,YACkB,aAAa,EAAE,aAAa,EAC5B,KAAK,EAAE,0BAA0B,EACjC,MAAM,CAAC,EAAE,MAAM,YAAA,EAC7B;IAES,MAAM,CACjB,GAAG,GAAG,EAAE,uBAAuB,EAAE,GAChC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA8D/B;CACF"}
@@ -1,25 +1,66 @@
1
- import { assert, rootLogger } from '@hyperlane-xyz/utils';
1
+ import { assert, formatError, rootLogger } from '@hyperlane-xyz/utils';
2
2
  import { TxSubmitterType } from '../TxSubmitterTypes.js';
3
+ /** Retains irreversible progress when a sequential batch fails. */
4
+ export class EV5JsonRpcSubmissionError extends Error {
5
+ submittedTransactions;
6
+ cause;
7
+ name = 'EV5JsonRpcSubmissionError';
8
+ constructor(message, submittedTransactions, cause) {
9
+ super(message);
10
+ this.submittedTransactions = submittedTransactions;
11
+ this.cause = cause;
12
+ }
13
+ }
3
14
  export class EV5JsonRpcTxSubmitter {
4
15
  multiProvider;
5
16
  props;
17
+ signer;
6
18
  txSubmitterType = TxSubmitterType.JSON_RPC;
7
19
  logger = rootLogger.child({
8
20
  module: 'json-rpc-submitter',
9
21
  });
10
- constructor(multiProvider, props) {
22
+ constructor(multiProvider, props, signer) {
11
23
  this.multiProvider = multiProvider;
12
24
  this.props = props;
25
+ this.signer = signer;
13
26
  }
14
27
  async submit(...txs) {
15
28
  const receipts = [];
29
+ const submittedTransactions = [];
16
30
  const submitterChainId = this.multiProvider.getChainId(this.props.chain);
31
+ // Validate the entire batch before the first irreversible broadcast.
17
32
  for (const tx of txs) {
18
33
  assert(tx.chainId, 'Invalid PopulatedTransaction: Missing chainId field');
19
34
  assert(tx.chainId === submitterChainId, `Transaction chainId ${tx.chainId} does not match submitter chainId ${submitterChainId}`);
20
- const receipt = await this.multiProvider.sendTransaction(this.props.chain, tx);
21
- this.logger.debug(`Submitted PopulatedTransaction on ${this.props.chain}: ${receipt.transactionHash}`);
22
- receipts.push(receipt);
35
+ }
36
+ const provider = this.multiProvider.getProvider(this.props.chain);
37
+ const signer = this.signer
38
+ ? this.signer.provider === provider
39
+ ? this.signer
40
+ : this.signer.connect(provider)
41
+ : this.multiProvider.getSigner(this.props.chain);
42
+ const signerAddress = await signer.getAddress();
43
+ for (const tx of txs) {
44
+ try {
45
+ const { annotation, ...populatedTx } = tx;
46
+ if (annotation)
47
+ this.logger.info(annotation);
48
+ const txRequest = await this.multiProvider.prepareTx(this.props.chain, populatedTx, signerAddress);
49
+ const response = await signer.sendTransaction(txRequest);
50
+ const submittedTransaction = {
51
+ transactionHash: response.hash,
52
+ };
53
+ submittedTransactions.push(submittedTransaction);
54
+ this.logger.info(`Sent tx ${response.hash}`);
55
+ const receipt = await this.multiProvider.handleTx(this.props.chain, response);
56
+ submittedTransaction.receipt = receipt;
57
+ assert(receipt.status === 1, `Transaction ${receipt.transactionHash} reverted`);
58
+ this.logger.debug(`Submitted PopulatedTransaction on ${this.props.chain}: ${receipt.transactionHash}`);
59
+ receipts.push(receipt);
60
+ }
61
+ catch (error) {
62
+ throw new EV5JsonRpcSubmissionError(`Failed to submit JSON-RPC transaction batch on ${this.props.chain}: ${formatError(error)}`, submittedTransactions, error);
63
+ }
23
64
  }
24
65
  return receipts;
25
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EV5JsonRpcTxSubmitter.js","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAI1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAKzD,MAAM,OAAO,qBAAqB;IAQd,aAAa;IACb,KAAK;IARP,eAAe,GAAoB,eAAe,CAAC,QAAQ,CAAC;IAEzD,MAAM,GAAW,UAAU,CAAC,KAAK,CAAC;QACnD,MAAM,EAAE,oBAAoB;KAC7B,CAAC,CAAC;IAEH,YACkB,aAA4B,EAC5B,KAAiC;6BADjC,aAAa;qBACb,KAAK;IACpB,CAAC;IAEG,KAAK,CAAC,MAAM,CACjB,GAAG,GAA8B;QAEjC,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzE,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,qDAAqD,CAAC,CAAC;YAC1E,MAAM,CACJ,EAAE,CAAC,OAAO,KAAK,gBAAgB,EAC/B,uBAAuB,EAAE,CAAC,OAAO,qCAAqC,gBAAgB,EAAE,CACzF,CAAC;YACF,MAAM,OAAO,GAAoB,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CACvE,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,EAAE,CACH,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,qCAAqC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,eAAe,EAAE,CACpF,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
1
+ {"version":3,"file":"EV5JsonRpcTxSubmitter.js","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAUzD,mEAAmE;AACnE,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAKhC,qBAAqB;IACrB,KAAK;IALd,IAAI,GAAG,2BAA2B,CAAC;IAE5C,YACE,OAAe,EACC,qBAAgD,EAChD,KAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;qCAHC,qBAAqB;qBACrB,KAAK;IAGvB,CAAC;CACF;AAED,MAAM,OAAO,qBAAqB;IAQd,aAAa;IACb,KAAK;IACL,MAAM;IATR,eAAe,GAAoB,eAAe,CAAC,QAAQ,CAAC;IAEzD,MAAM,GAAW,UAAU,CAAC,KAAK,CAAC;QACnD,MAAM,EAAE,oBAAoB;KAC7B,CAAC,CAAC;IAEH,YACkB,aAA4B,EAC5B,KAAiC,EACjC,MAAe;6BAFf,aAAa;qBACb,KAAK;sBACL,MAAM;IACrB,CAAC;IAEG,KAAK,CAAC,MAAM,CACjB,GAAG,GAA8B;QAEjC,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAC1C,MAAM,qBAAqB,GAA8B,EAAE,CAAC;QAC5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEzE,qEAAqE;QACrE,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,qDAAqD,CAAC,CAAC;YAC1E,MAAM,CACJ,EAAE,CAAC,OAAO,KAAK,gBAAgB,EAC/B,uBAAuB,EAAE,CAAC,OAAO,qCAAqC,gBAAgB,EAAE,CACzF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;YACxB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBACjC,CAAC,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YACjC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAEhD,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,EAAE,GAAG,EAAE,CAAC;gBAC1C,IAAI,UAAU;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAE7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAClD,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,WAAW,EACX,aAAa,CACd,CAAC;gBACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBACzD,MAAM,oBAAoB,GAA4B;oBACpD,eAAe,EAAE,QAAQ,CAAC,IAAI;iBAC/B,CAAC;gBACF,qBAAqB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;gBAE7C,MAAM,OAAO,GAAoB,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAChE,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,QAAQ,CACT,CAAC;gBACF,oBAAoB,CAAC,OAAO,GAAG,OAAO,CAAC;gBACvC,MAAM,CACJ,OAAO,CAAC,MAAM,KAAK,CAAC,EACpB,eAAe,OAAO,CAAC,eAAe,WAAW,CAClD,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,qCAAqC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,eAAe,EAAE,CACpF,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,yBAAyB,CACjC,kDAAkD,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,EAC3F,qBAAqB,EACrB,KAAK,CACN,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=EV5JsonRpcTxSubmitter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EV5JsonRpcTxSubmitter.test.d.ts","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ import { expect } from 'chai';
2
+ import { Wallet, providers, } from 'ethers';
3
+ import sinon from 'sinon';
4
+ import { TestChainName } from '../../../../consts/testChains.js';
5
+ import { randomAddress } from '../../../../test/testUtils.js';
6
+ import { MultiProvider } from '../../../MultiProvider.js';
7
+ import { EV5JsonRpcSubmissionError, EV5JsonRpcTxSubmitter, } from './EV5JsonRpcTxSubmitter.js';
8
+ describe('EV5JsonRpcTxSubmitter', () => {
9
+ const chain = TestChainName.test1;
10
+ const chainId = 9913371;
11
+ const props = { type: 'jsonRpc', chain };
12
+ const tx = { chainId, to: randomAddress() };
13
+ let multiProvider;
14
+ let mainSigner;
15
+ let explicitSigner;
16
+ let connectedExplicitSigner;
17
+ let prepareTx;
18
+ beforeEach(() => {
19
+ const provider = new providers.JsonRpcProvider('http://127.0.0.1:8545');
20
+ mainSigner = Wallet.createRandom().connect(provider);
21
+ explicitSigner = Wallet.createRandom();
22
+ connectedExplicitSigner = explicitSigner.connect(provider);
23
+ multiProvider = MultiProvider.createTestMultiProvider({
24
+ signer: mainSigner,
25
+ provider,
26
+ });
27
+ sinon.stub(explicitSigner, 'connect').returns(connectedExplicitSigner);
28
+ prepareTx = sinon
29
+ .stub(multiProvider, 'prepareTx')
30
+ .callsFake(async (_, request) => request);
31
+ });
32
+ afterEach(() => sinon.restore());
33
+ it('uses an explicit signer instead of the MultiProvider signer', async () => {
34
+ const response = transactionResponse('0x01');
35
+ const receipt = transactionReceipt('0x01', 1);
36
+ const explicitSend = sinon
37
+ .stub(connectedExplicitSigner, 'sendTransaction')
38
+ .resolves(response);
39
+ const mainSend = sinon.stub(mainSigner, 'sendTransaction');
40
+ sinon.stub(multiProvider, 'handleTx').resolves(receipt);
41
+ const submitter = new EV5JsonRpcTxSubmitter(multiProvider, props, explicitSigner);
42
+ expect(await submitter.submit(tx)).to.deep.equal([receipt]);
43
+ expect(explicitSend.calledOnce).to.equal(true);
44
+ expect(mainSend.called).to.equal(false);
45
+ expect(prepareTx.calledWith(chain, sinon.match.object, explicitSigner.address)).to.equal(true);
46
+ });
47
+ it('uses the MultiProvider signer when no explicit signer is supplied', async () => {
48
+ const response = transactionResponse('0x02');
49
+ const receipt = transactionReceipt('0x02', 1);
50
+ const mainSend = sinon
51
+ .stub(mainSigner, 'sendTransaction')
52
+ .resolves(response);
53
+ sinon.stub(multiProvider, 'handleTx').resolves(receipt);
54
+ const submitter = new EV5JsonRpcTxSubmitter(multiProvider, props);
55
+ expect(await submitter.submit(tx)).to.deep.equal([receipt]);
56
+ expect(mainSend.calledOnce).to.equal(true);
57
+ expect(prepareTx.calledWith(chain, sinon.match.object, mainSigner.address)).to.equal(true);
58
+ });
59
+ it('validates the complete batch before broadcasting', async () => {
60
+ const explicitSend = sinon.stub(connectedExplicitSigner, 'sendTransaction');
61
+ const submitter = new EV5JsonRpcTxSubmitter(multiProvider, props, explicitSigner);
62
+ let error;
63
+ try {
64
+ await submitter.submit(tx, { ...tx, chainId: chainId + 1 });
65
+ }
66
+ catch (caught) {
67
+ error = caught instanceof Error ? caught : new Error(String(caught));
68
+ }
69
+ expect(error?.message).to.include('does not match submitter chainId');
70
+ expect(explicitSend.called).to.equal(false);
71
+ });
72
+ it('retains confirmed receipts and a pending hash on partial failure', async () => {
73
+ const firstResponse = transactionResponse('0x03');
74
+ const secondResponse = transactionResponse('0x04');
75
+ const firstReceipt = transactionReceipt('0x03', 1);
76
+ sinon
77
+ .stub(connectedExplicitSigner, 'sendTransaction')
78
+ .onFirstCall()
79
+ .resolves(firstResponse)
80
+ .onSecondCall()
81
+ .resolves(secondResponse);
82
+ sinon
83
+ .stub(multiProvider, 'handleTx')
84
+ .onFirstCall()
85
+ .resolves(firstReceipt)
86
+ .onSecondCall()
87
+ .rejects(new Error('confirmation timeout'));
88
+ const error = await captureSubmissionError(new EV5JsonRpcTxSubmitter(multiProvider, props, explicitSigner).submit(tx, tx));
89
+ expect(error.submittedTransactions).to.deep.equal([
90
+ { transactionHash: firstResponse.hash, receipt: firstReceipt },
91
+ { transactionHash: secondResponse.hash },
92
+ ]);
93
+ });
94
+ it('retains a reverted receipt', async () => {
95
+ const response = transactionResponse('0x05');
96
+ const receipt = transactionReceipt('0x05', 0);
97
+ sinon.stub(connectedExplicitSigner, 'sendTransaction').resolves(response);
98
+ sinon.stub(multiProvider, 'handleTx').resolves(receipt);
99
+ const error = await captureSubmissionError(new EV5JsonRpcTxSubmitter(multiProvider, props, explicitSigner).submit(tx));
100
+ expect(error.message).to.include(`Transaction ${response.hash} reverted`);
101
+ expect(error.submittedTransactions).to.deep.equal([
102
+ { transactionHash: response.hash, receipt },
103
+ ]);
104
+ });
105
+ });
106
+ async function captureSubmissionError(submission) {
107
+ try {
108
+ await submission;
109
+ }
110
+ catch (error) {
111
+ if (error instanceof EV5JsonRpcSubmissionError)
112
+ return error;
113
+ throw error;
114
+ }
115
+ throw new Error('Expected submission to fail');
116
+ }
117
+ function transactionResponse(hash) {
118
+ // CAST: minimal ethers response test double; only hash is read before handleTx.
119
+ return { hash };
120
+ }
121
+ function transactionReceipt(hash, status) {
122
+ // CAST: minimal ethers receipt test double; only hash/status are inspected.
123
+ return { transactionHash: hash, status };
124
+ }
125
+ //# sourceMappingURL=EV5JsonRpcTxSubmitter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EV5JsonRpcTxSubmitter.test.js","sourceRoot":"","sources":["../../../../../src/providers/transactions/submitter/ethersV5/EV5JsonRpcTxSubmitter.test.ts"],"names":[],"mappings":"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"}