viem 2.56.8 → 2.57.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 (359) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +0 -1
  3. package/_cjs/actions/index.js +5 -3
  4. package/_cjs/actions/index.js.map +1 -1
  5. package/_cjs/actions/public/getStorageValues.js +17 -0
  6. package/_cjs/actions/public/getStorageValues.js.map +1 -0
  7. package/_cjs/actions/public/simulateBlocks.js +2 -0
  8. package/_cjs/actions/public/simulateBlocks.js.map +1 -1
  9. package/_cjs/actions/public/waitForTransactionReceipt.js +12 -1
  10. package/_cjs/actions/public/waitForTransactionReceipt.js.map +1 -1
  11. package/_cjs/chains/definitions/blockdag.js +23 -0
  12. package/_cjs/chains/definitions/blockdag.js.map +1 -0
  13. package/_cjs/chains/definitions/candyChain.js +29 -0
  14. package/_cjs/chains/definitions/candyChain.js.map +1 -0
  15. package/_cjs/chains/definitions/creditCoin3Devnet.js +6 -0
  16. package/_cjs/chains/definitions/creditCoin3Devnet.js.map +1 -1
  17. package/_cjs/chains/definitions/creditCoin3Mainnet.js +6 -0
  18. package/_cjs/chains/definitions/creditCoin3Mainnet.js.map +1 -1
  19. package/_cjs/chains/definitions/creditCoin3Testnet.js +6 -0
  20. package/_cjs/chains/definitions/creditCoin3Testnet.js.map +1 -1
  21. package/_cjs/chains/definitions/kortana.js +23 -0
  22. package/_cjs/chains/definitions/kortana.js.map +1 -0
  23. package/_cjs/chains/definitions/rabbitChainTestnet.js +24 -0
  24. package/_cjs/chains/definitions/rabbitChainTestnet.js.map +1 -0
  25. package/_cjs/chains/index.js +22 -14
  26. package/_cjs/chains/index.js.map +1 -1
  27. package/_cjs/clients/createClientResolver.js +45 -0
  28. package/_cjs/clients/createClientResolver.js.map +1 -0
  29. package/_cjs/clients/decorators/public.js +2 -0
  30. package/_cjs/clients/decorators/public.js.map +1 -1
  31. package/_cjs/errors/version.js +1 -1
  32. package/_cjs/index.js +13 -9
  33. package/_cjs/index.js.map +1 -1
  34. package/_cjs/op-stack/actions/getGame.js +1 -1
  35. package/_cjs/op-stack/actions/getGame.js.map +1 -1
  36. package/_cjs/op-stack/actions/getGames.js +1 -1
  37. package/_cjs/op-stack/actions/getGames.js.map +1 -1
  38. package/_cjs/op-stack/actions/getTimeToNextGame.js +1 -1
  39. package/_cjs/op-stack/actions/getTimeToNextGame.js.map +1 -1
  40. package/_cjs/op-stack/actions/getTimeToNextL2Output.js +1 -1
  41. package/_cjs/op-stack/actions/getTimeToNextL2Output.js.map +1 -1
  42. package/_cjs/tempo/Abis.js +1211 -32
  43. package/_cjs/tempo/Abis.js.map +1 -1
  44. package/_cjs/tempo/Addresses.js +2 -1
  45. package/_cjs/tempo/Addresses.js.map +1 -1
  46. package/_cjs/tempo/Client.js +2 -10
  47. package/_cjs/tempo/Client.js.map +1 -1
  48. package/_cjs/tempo/Decorator.js +12 -0
  49. package/_cjs/tempo/Decorator.js.map +1 -1
  50. package/_cjs/tempo/ExecutionError.js +290 -0
  51. package/_cjs/tempo/ExecutionError.js.map +1 -0
  52. package/_cjs/tempo/Relay.js +88 -0
  53. package/_cjs/tempo/Relay.js.map +1 -0
  54. package/_cjs/tempo/Selectors.js +7 -4
  55. package/_cjs/tempo/Selectors.js.map +1 -1
  56. package/_cjs/tempo/Transaction.js.map +1 -1
  57. package/_cjs/tempo/Transport.js +21 -12
  58. package/_cjs/tempo/Transport.js.map +1 -1
  59. package/_cjs/tempo/actions/index.js +2 -1
  60. package/_cjs/tempo/actions/index.js.map +1 -1
  61. package/_cjs/tempo/actions/propAmm.js +349 -0
  62. package/_cjs/tempo/actions/propAmm.js.map +1 -0
  63. package/_cjs/tempo/chainConfig.js +3 -0
  64. package/_cjs/tempo/chainConfig.js.map +1 -1
  65. package/_cjs/tempo/index.js +3 -3
  66. package/_cjs/tempo/index.js.map +1 -1
  67. package/_cjs/tempo/internal/relay/cache.js +74 -0
  68. package/_cjs/tempo/internal/relay/cache.js.map +1 -0
  69. package/_cjs/tempo/internal/relay/deadline.js +35 -0
  70. package/_cjs/tempo/internal/relay/deadline.js.map +1 -0
  71. package/_cjs/tempo/internal/relay/error.js +102 -0
  72. package/_cjs/tempo/internal/relay/error.js.map +1 -0
  73. package/_cjs/tempo/internal/relay/feePayer.js +426 -0
  74. package/_cjs/tempo/internal/relay/feePayer.js.map +1 -0
  75. package/_cjs/tempo/internal/relay/feeToken.js +143 -0
  76. package/_cjs/tempo/internal/relay/feeToken.js.map +1 -0
  77. package/_cjs/tempo/{Multisig.js → internal/relay/multisig.js} +132 -122
  78. package/_cjs/tempo/internal/relay/multisig.js.map +1 -0
  79. package/_cjs/tempo/internal/relay/plugin.js +13 -0
  80. package/_cjs/tempo/internal/relay/plugin.js.map +1 -0
  81. package/_cjs/tempo/internal/relay/preflight.js +58 -0
  82. package/_cjs/tempo/internal/relay/preflight.js.map +1 -0
  83. package/_cjs/tempo/internal/relay/request.js +319 -0
  84. package/_cjs/tempo/internal/relay/request.js.map +1 -0
  85. package/_cjs/tempo/internal/relay/simulate.js +267 -0
  86. package/_cjs/tempo/internal/relay/simulate.js.map +1 -0
  87. package/_cjs/tempo/internal/relay/utils.js +174 -0
  88. package/_cjs/tempo/internal/relay/utils.js.map +1 -0
  89. package/_cjs/tempo/internal/relay/virtualAddress.js +78 -0
  90. package/_cjs/tempo/internal/relay/virtualAddress.js.map +1 -0
  91. package/_cjs/tempo/internal/relay.js +139 -0
  92. package/_cjs/tempo/internal/relay.js.map +1 -0
  93. package/_cjs/tempo/multisig/Config.js +0 -2
  94. package/_cjs/tempo/multisig/Config.js.map +1 -1
  95. package/_cjs/tempo/multisig/Operation.js +1 -2
  96. package/_cjs/tempo/multisig/Operation.js.map +1 -1
  97. package/_cjs/tokens/definitions/eurc.js +1 -0
  98. package/_cjs/tokens/definitions/eurc.js.map +1 -1
  99. package/_cjs/tokens/definitions/usdc.js +1 -0
  100. package/_cjs/tokens/definitions/usdc.js.map +1 -1
  101. package/_cjs/utils/siwe/parseSiweMessage.js +3 -3
  102. package/_cjs/utils/siwe/parseSiweMessage.js.map +1 -1
  103. package/_esm/actions/index.js +1 -0
  104. package/_esm/actions/index.js.map +1 -1
  105. package/_esm/actions/public/getStorageValues.js +39 -0
  106. package/_esm/actions/public/getStorageValues.js.map +1 -0
  107. package/_esm/actions/public/simulateBlocks.js +4 -0
  108. package/_esm/actions/public/simulateBlocks.js.map +1 -1
  109. package/_esm/actions/public/waitForTransactionReceipt.js +15 -1
  110. package/_esm/actions/public/waitForTransactionReceipt.js.map +1 -1
  111. package/_esm/chains/definitions/blockdag.js +20 -0
  112. package/_esm/chains/definitions/blockdag.js.map +1 -0
  113. package/_esm/chains/definitions/candyChain.js +26 -0
  114. package/_esm/chains/definitions/candyChain.js.map +1 -0
  115. package/_esm/chains/definitions/creditCoin3Devnet.js +6 -0
  116. package/_esm/chains/definitions/creditCoin3Devnet.js.map +1 -1
  117. package/_esm/chains/definitions/creditCoin3Mainnet.js +6 -0
  118. package/_esm/chains/definitions/creditCoin3Mainnet.js.map +1 -1
  119. package/_esm/chains/definitions/creditCoin3Testnet.js +6 -0
  120. package/_esm/chains/definitions/creditCoin3Testnet.js.map +1 -1
  121. package/_esm/chains/definitions/kortana.js +20 -0
  122. package/_esm/chains/definitions/kortana.js.map +1 -0
  123. package/_esm/chains/definitions/rabbitChainTestnet.js +21 -0
  124. package/_esm/chains/definitions/rabbitChainTestnet.js.map +1 -0
  125. package/_esm/chains/index.js +4 -0
  126. package/_esm/chains/index.js.map +1 -1
  127. package/_esm/clients/createClientResolver.js +64 -0
  128. package/_esm/clients/createClientResolver.js.map +1 -0
  129. package/_esm/clients/decorators/public.js +2 -0
  130. package/_esm/clients/decorators/public.js.map +1 -1
  131. package/_esm/errors/version.js +1 -1
  132. package/_esm/index.js +2 -0
  133. package/_esm/index.js.map +1 -1
  134. package/_esm/op-stack/actions/getGame.js +1 -1
  135. package/_esm/op-stack/actions/getGame.js.map +1 -1
  136. package/_esm/op-stack/actions/getGames.js +1 -1
  137. package/_esm/op-stack/actions/getGames.js.map +1 -1
  138. package/_esm/op-stack/actions/getTimeToNextGame.js +2 -2
  139. package/_esm/op-stack/actions/getTimeToNextGame.js.map +1 -1
  140. package/_esm/op-stack/actions/getTimeToNextL2Output.js +2 -2
  141. package/_esm/op-stack/actions/getTimeToNextL2Output.js.map +1 -1
  142. package/_esm/tempo/Abis.js +1214 -34
  143. package/_esm/tempo/Abis.js.map +1 -1
  144. package/_esm/tempo/Addresses.js +2 -0
  145. package/_esm/tempo/Addresses.js.map +1 -1
  146. package/_esm/tempo/Client.js +8 -14
  147. package/_esm/tempo/Client.js.map +1 -1
  148. package/_esm/tempo/Decorator.js +12 -0
  149. package/_esm/tempo/Decorator.js.map +1 -1
  150. package/_esm/tempo/ExecutionError.js +306 -0
  151. package/_esm/tempo/ExecutionError.js.map +1 -0
  152. package/_esm/tempo/Relay.js +170 -0
  153. package/_esm/tempo/Relay.js.map +1 -0
  154. package/_esm/tempo/Selectors.js +6 -3
  155. package/_esm/tempo/Selectors.js.map +1 -1
  156. package/_esm/tempo/Transaction.js.map +1 -1
  157. package/_esm/tempo/Transport.js +21 -46
  158. package/_esm/tempo/Transport.js.map +1 -1
  159. package/_esm/tempo/actions/index.js +1 -0
  160. package/_esm/tempo/actions/index.js.map +1 -1
  161. package/_esm/tempo/actions/propAmm.js +539 -0
  162. package/_esm/tempo/actions/propAmm.js.map +1 -0
  163. package/_esm/tempo/chainConfig.js +4 -0
  164. package/_esm/tempo/chainConfig.js.map +1 -1
  165. package/_esm/tempo/index.js +8 -3
  166. package/_esm/tempo/index.js.map +1 -1
  167. package/_esm/tempo/internal/relay/cache.js +72 -0
  168. package/_esm/tempo/internal/relay/cache.js.map +1 -0
  169. package/_esm/tempo/internal/relay/deadline.js +34 -0
  170. package/_esm/tempo/internal/relay/deadline.js.map +1 -0
  171. package/_esm/tempo/internal/relay/error.js +101 -0
  172. package/_esm/tempo/internal/relay/error.js.map +1 -0
  173. package/_esm/tempo/internal/relay/feePayer.js +442 -0
  174. package/_esm/tempo/internal/relay/feePayer.js.map +1 -0
  175. package/_esm/tempo/internal/relay/feeToken.js +143 -0
  176. package/_esm/tempo/internal/relay/feeToken.js.map +1 -0
  177. package/_esm/tempo/{Multisig.js → internal/relay/multisig.js} +133 -129
  178. package/_esm/tempo/internal/relay/multisig.js.map +1 -0
  179. package/_esm/tempo/internal/relay/plugin.js +10 -0
  180. package/_esm/tempo/internal/relay/plugin.js.map +1 -0
  181. package/_esm/tempo/internal/relay/preflight.js +57 -0
  182. package/_esm/tempo/internal/relay/preflight.js.map +1 -0
  183. package/_esm/tempo/internal/relay/request.js +321 -0
  184. package/_esm/tempo/internal/relay/request.js.map +1 -0
  185. package/_esm/tempo/internal/relay/simulate.js +277 -0
  186. package/_esm/tempo/internal/relay/simulate.js.map +1 -0
  187. package/_esm/tempo/internal/relay/utils.js +174 -0
  188. package/_esm/tempo/internal/relay/utils.js.map +1 -0
  189. package/_esm/tempo/internal/relay/virtualAddress.js +73 -0
  190. package/_esm/tempo/internal/relay/virtualAddress.js.map +1 -0
  191. package/_esm/tempo/internal/relay.js +138 -0
  192. package/_esm/tempo/internal/relay.js.map +1 -0
  193. package/_esm/tempo/multisig/Config.js +2 -1
  194. package/_esm/tempo/multisig/Config.js.map +1 -1
  195. package/_esm/tempo/multisig/Operation.js +1 -1
  196. package/_esm/tempo/multisig/Operation.js.map +1 -1
  197. package/_esm/tokens/definitions/eurc.js +1 -0
  198. package/_esm/tokens/definitions/eurc.js.map +1 -1
  199. package/_esm/tokens/definitions/usdc.js +1 -0
  200. package/_esm/tokens/definitions/usdc.js.map +1 -1
  201. package/_esm/utils/siwe/parseSiweMessage.js +3 -3
  202. package/_esm/utils/siwe/parseSiweMessage.js.map +1 -1
  203. package/_types/actions/index.d.ts +1 -0
  204. package/_types/actions/index.d.ts.map +1 -1
  205. package/_types/actions/public/getStorageValues.d.ts +59 -0
  206. package/_types/actions/public/getStorageValues.d.ts.map +1 -0
  207. package/_types/actions/public/simulateBlocks.d.ts +8 -0
  208. package/_types/actions/public/simulateBlocks.d.ts.map +1 -1
  209. package/_types/actions/public/waitForTransactionReceipt.d.ts.map +1 -1
  210. package/_types/chains/definitions/blockdag.d.ts +51 -0
  211. package/_types/chains/definitions/blockdag.d.ts.map +1 -0
  212. package/_types/chains/definitions/candyChain.d.ts +48 -0
  213. package/_types/chains/definitions/candyChain.d.ts.map +1 -0
  214. package/_types/chains/definitions/creditCoin3Devnet.d.ts +6 -9
  215. package/_types/chains/definitions/creditCoin3Devnet.d.ts.map +1 -1
  216. package/_types/chains/definitions/creditCoin3Mainnet.d.ts +6 -9
  217. package/_types/chains/definitions/creditCoin3Mainnet.d.ts.map +1 -1
  218. package/_types/chains/definitions/creditCoin3Testnet.d.ts +6 -9
  219. package/_types/chains/definitions/creditCoin3Testnet.d.ts.map +1 -1
  220. package/_types/chains/definitions/kortana.d.ts +51 -0
  221. package/_types/chains/definitions/kortana.d.ts.map +1 -0
  222. package/_types/chains/definitions/rabbitChainTestnet.d.ts +51 -0
  223. package/_types/chains/definitions/rabbitChainTestnet.d.ts.map +1 -0
  224. package/_types/chains/index.d.ts +4 -0
  225. package/_types/chains/index.d.ts.map +1 -1
  226. package/_types/clients/createClientResolver.d.ts +76 -0
  227. package/_types/clients/createClientResolver.d.ts.map +1 -0
  228. package/_types/clients/decorators/public.d.ts +11 -0
  229. package/_types/clients/decorators/public.d.ts.map +1 -1
  230. package/_types/errors/version.d.ts +1 -1
  231. package/_types/index.d.ts +3 -0
  232. package/_types/index.d.ts.map +1 -1
  233. package/_types/op-stack/actions/getGame.d.ts.map +1 -1
  234. package/_types/tempo/Abis.d.ts +14686 -9568
  235. package/_types/tempo/Abis.d.ts.map +1 -1
  236. package/_types/tempo/Addresses.d.ts +2 -0
  237. package/_types/tempo/Addresses.d.ts.map +1 -1
  238. package/_types/tempo/Capabilities.d.ts +7 -28
  239. package/_types/tempo/Capabilities.d.ts.map +1 -1
  240. package/_types/tempo/Client.d.ts +6 -15
  241. package/_types/tempo/Client.d.ts.map +1 -1
  242. package/_types/tempo/Decorator.d.ts +205 -1
  243. package/_types/tempo/Decorator.d.ts.map +1 -1
  244. package/_types/tempo/ExecutionError.d.ts +79 -0
  245. package/_types/tempo/ExecutionError.d.ts.map +1 -0
  246. package/_types/tempo/Relay.d.ts +302 -0
  247. package/_types/tempo/Relay.d.ts.map +1 -0
  248. package/_types/tempo/Selectors.d.ts +6 -3
  249. package/_types/tempo/Selectors.d.ts.map +1 -1
  250. package/_types/tempo/Transaction.d.ts +2 -1
  251. package/_types/tempo/Transaction.d.ts.map +1 -1
  252. package/_types/tempo/Transport.d.ts +15 -29
  253. package/_types/tempo/Transport.d.ts.map +1 -1
  254. package/_types/tempo/actions/earn.d.ts +621 -1
  255. package/_types/tempo/actions/earn.d.ts.map +1 -1
  256. package/_types/tempo/actions/index.d.ts +1 -0
  257. package/_types/tempo/actions/index.d.ts.map +1 -1
  258. package/_types/tempo/actions/propAmm.d.ts +2228 -0
  259. package/_types/tempo/actions/propAmm.d.ts.map +1 -0
  260. package/_types/tempo/chainConfig.d.ts.map +1 -1
  261. package/_types/tempo/index.d.ts +8 -3
  262. package/_types/tempo/index.d.ts.map +1 -1
  263. package/_types/tempo/internal/relay/cache.d.ts +9 -0
  264. package/_types/tempo/internal/relay/cache.d.ts.map +1 -0
  265. package/_types/tempo/internal/relay/deadline.d.ts +4 -0
  266. package/_types/tempo/internal/relay/deadline.d.ts.map +1 -0
  267. package/_types/tempo/internal/relay/error.d.ts +47 -0
  268. package/_types/tempo/internal/relay/error.d.ts.map +1 -0
  269. package/_types/tempo/internal/relay/feePayer.d.ts +70 -0
  270. package/_types/tempo/internal/relay/feePayer.d.ts.map +1 -0
  271. package/_types/tempo/internal/relay/feeToken.d.ts +38 -0
  272. package/_types/tempo/internal/relay/feeToken.d.ts.map +1 -0
  273. package/_types/tempo/internal/relay/multisig.d.ts +4 -0
  274. package/_types/tempo/internal/relay/multisig.d.ts.map +1 -0
  275. package/_types/tempo/internal/relay/plugin.d.ts +5 -0
  276. package/_types/tempo/internal/relay/plugin.d.ts.map +1 -0
  277. package/_types/tempo/internal/relay/preflight.d.ts +17 -0
  278. package/_types/tempo/internal/relay/preflight.d.ts.map +1 -0
  279. package/_types/tempo/internal/relay/request.d.ts +16 -0
  280. package/_types/tempo/internal/relay/request.d.ts.map +1 -0
  281. package/_types/tempo/internal/relay/simulate.d.ts +59 -0
  282. package/_types/tempo/internal/relay/simulate.d.ts.map +1 -0
  283. package/_types/tempo/internal/relay/utils.d.ts +294 -0
  284. package/_types/tempo/internal/relay/utils.d.ts.map +1 -0
  285. package/_types/tempo/internal/relay/virtualAddress.d.ts +9 -0
  286. package/_types/tempo/internal/relay/virtualAddress.d.ts.map +1 -0
  287. package/_types/tempo/internal/relay.d.ts +4 -0
  288. package/_types/tempo/internal/relay.d.ts.map +1 -0
  289. package/_types/tempo/multisig/Config.d.ts +0 -13
  290. package/_types/tempo/multisig/Config.d.ts.map +1 -1
  291. package/_types/tempo/multisig/Operation.d.ts +0 -5
  292. package/_types/tempo/multisig/Operation.d.ts.map +1 -1
  293. package/_types/tokens/definitions/eurc.d.ts +1 -0
  294. package/_types/tokens/definitions/eurc.d.ts.map +1 -1
  295. package/_types/tokens/definitions/usdc.d.ts +1 -0
  296. package/_types/tokens/definitions/usdc.d.ts.map +1 -1
  297. package/_types/tokens/sets.d.ts +3 -0
  298. package/_types/tokens/sets.d.ts.map +1 -1
  299. package/_types/types/eip1193.d.ts +20 -0
  300. package/_types/types/eip1193.d.ts.map +1 -1
  301. package/_types/utils/siwe/parseSiweMessage.d.ts.map +1 -1
  302. package/actions/index.ts +6 -0
  303. package/actions/public/getStorageValues.ts +93 -0
  304. package/actions/public/simulateBlocks.ts +13 -0
  305. package/actions/public/waitForTransactionReceipt.ts +16 -2
  306. package/chains/definitions/blockdag.ts +20 -0
  307. package/chains/definitions/candyChain.ts +26 -0
  308. package/chains/definitions/creditCoin3Devnet.ts +6 -0
  309. package/chains/definitions/creditCoin3Mainnet.ts +6 -0
  310. package/chains/definitions/creditCoin3Testnet.ts +6 -0
  311. package/chains/definitions/kortana.ts +20 -0
  312. package/chains/definitions/rabbitChainTestnet.ts +21 -0
  313. package/chains/index.ts +4 -0
  314. package/clients/createClientResolver.ts +191 -0
  315. package/clients/decorators/public.ts +18 -0
  316. package/errors/version.ts +1 -1
  317. package/index.ts +11 -0
  318. package/op-stack/actions/getGame.ts +3 -1
  319. package/op-stack/actions/getGames.ts +1 -1
  320. package/op-stack/actions/getTimeToNextGame.ts +2 -2
  321. package/op-stack/actions/getTimeToNextL2Output.ts +2 -2
  322. package/package.json +1 -1
  323. package/tempo/Abis.ts +1218 -34
  324. package/tempo/Addresses.ts +2 -0
  325. package/tempo/Capabilities.ts +7 -29
  326. package/tempo/Client.ts +8 -38
  327. package/tempo/Decorator.ts +239 -3
  328. package/tempo/ExecutionError.ts +418 -0
  329. package/tempo/Relay.ts +428 -0
  330. package/tempo/Selectors.ts +10 -4
  331. package/tempo/Transaction.ts +2 -1
  332. package/tempo/Transport.ts +69 -60
  333. package/tempo/actions/index.ts +1 -0
  334. package/tempo/actions/propAmm.ts +998 -0
  335. package/tempo/chainConfig.ts +4 -0
  336. package/tempo/index.ts +7 -3
  337. package/tempo/internal/relay/cache.ts +82 -0
  338. package/tempo/internal/relay/deadline.ts +45 -0
  339. package/tempo/internal/relay/error.ts +128 -0
  340. package/tempo/internal/relay/feePayer.ts +692 -0
  341. package/tempo/internal/relay/feeToken.ts +190 -0
  342. package/tempo/{Multisig.ts → internal/relay/multisig.ts} +162 -193
  343. package/tempo/internal/relay/plugin.ts +13 -0
  344. package/tempo/internal/relay/preflight.ts +81 -0
  345. package/tempo/internal/relay/request.ts +391 -0
  346. package/tempo/internal/relay/simulate.ts +367 -0
  347. package/tempo/internal/relay/utils.ts +202 -0
  348. package/tempo/internal/relay/virtualAddress.ts +95 -0
  349. package/tempo/internal/relay.ts +158 -0
  350. package/tempo/multisig/Config.ts +3 -2
  351. package/tempo/multisig/Operation.ts +1 -1
  352. package/tokens/definitions/eurc.ts +1 -0
  353. package/tokens/definitions/usdc.ts +1 -0
  354. package/types/eip1193.ts +20 -0
  355. package/utils/siwe/parseSiweMessage.ts +21 -13
  356. package/_cjs/tempo/Multisig.js.map +0 -1
  357. package/_esm/tempo/Multisig.js.map +0 -1
  358. package/_types/tempo/Multisig.d.ts +0 -37
  359. package/_types/tempo/Multisig.d.ts.map +0 -1
@@ -0,0 +1,190 @@
1
+ import type { Address } from 'abitype'
2
+ import { RpcResponse } from 'ox'
3
+ import type { Client } from '../../../clients/createClient.js'
4
+ import { tokens as tokenSets } from '../../../tokens/sets.js'
5
+ import * as Actions from '../../actions/index.js'
6
+ import type * as Relay from '../../Relay.js'
7
+ import * as Store from './cache.js'
8
+ import * as Preflight from './preflight.js'
9
+ import * as Utils from './utils.js'
10
+ import { extractCalls, getVirtualAddressTargets } from './virtualAddress.js'
11
+
12
+ export function create(): Relay.Plugin {
13
+ return {
14
+ async handleRequest(context, next) {
15
+ const { request } = context
16
+ if (request.method !== 'eth_fillTransaction') return next()
17
+ const parameters = request.params![0] as Record<string, unknown>
18
+ const transaction = Utils.normalizeFillTransactionRequest(parameters)
19
+
20
+ if (transaction.feeToken) {
21
+ context.request = {
22
+ ...request,
23
+ params: [
24
+ Utils.formatFillTransactionRequest(context.client, transaction),
25
+ ],
26
+ }
27
+ return next()
28
+ }
29
+
30
+ const tokens = await context.resolveTokens()
31
+ const candidates = [
32
+ ...tokens,
33
+ ...callTargetTokens(transaction).filter(
34
+ (token) =>
35
+ !tokens.some(
36
+ (candidate) => candidate.toLowerCase() === token.toLowerCase(),
37
+ ),
38
+ ),
39
+ ]
40
+
41
+ const resolved = transaction.feePayer
42
+ ? { feeToken: tokens[0], virtualAddresses: undefined }
43
+ : await resolveFeeToken(context.client, {
44
+ account: transaction.from as Address | undefined,
45
+ feeToken: transaction.feeToken as Address | undefined,
46
+ targets: getVirtualAddressTargets(extractCalls(transaction)),
47
+ tokens: candidates,
48
+ })
49
+
50
+ const { feeToken, virtualAddresses } = resolved
51
+ const selected = { ...transaction, ...(feeToken ? { feeToken } : {}) }
52
+ context.request = {
53
+ ...request,
54
+ params: [Utils.formatFillTransactionRequest(context.client, selected)],
55
+ }
56
+ await next()
57
+ const result = context.result as Relay.Plugin.FillResult
58
+ context.result = {
59
+ ...result,
60
+ // Unsigned sponsored estimates can omit the fee token selected by this plugin.
61
+ tx: {
62
+ ...result.tx,
63
+ ...(!result.tx.feeToken && feeToken ? { feeToken } : {}),
64
+ },
65
+ ...(virtualAddresses
66
+ ? { capabilities: { ...result.capabilities, virtualAddresses } }
67
+ : {}),
68
+ }
69
+ },
70
+ }
71
+ }
72
+
73
+ export async function getDefaultTokens(
74
+ chainId: number,
75
+ ): Promise<readonly Address[]> {
76
+ return tokenSets.tempo.flatMap((token) => {
77
+ const address = (token.addresses as Record<number, Address>)[chainId]
78
+ return address ? [address] : []
79
+ })
80
+ }
81
+
82
+ /** Resolves a funded fee-token candidate. @internal */
83
+ export async function resolveFeeToken(
84
+ client: Client,
85
+ options: resolveFeeToken.Options,
86
+ ) {
87
+ const { feeToken, account, exclude, tokens } = options
88
+ if (feeToken || !account) return { feeToken, virtualAddresses: undefined }
89
+ const candidates = [
90
+ ...new Set(tokens?.map((token) => token.toLowerCase() as Address)),
91
+ ]
92
+ if (candidates.length > 100)
93
+ throw new RpcResponse.InvalidParamsError({
94
+ message: 'Fee-token candidates exceed the limit of 100 tokens.',
95
+ })
96
+ const { preferredToken, preferredBalance, balances, virtualAddresses } =
97
+ await Preflight.read(client, {
98
+ account,
99
+ tokens: candidates,
100
+ targets: options.targets,
101
+ })
102
+ const minimumBalance = options.minimumBalance ?? 1n
103
+ if (
104
+ preferredToken.toLowerCase() !== exclude?.toLowerCase() &&
105
+ preferredBalance >= minimumBalance
106
+ )
107
+ return { feeToken: preferredToken, virtualAddresses }
108
+
109
+ let best: { address: Address; balance: bigint } | undefined
110
+ for (const asset of balances) {
111
+ if (
112
+ asset.balance < minimumBalance ||
113
+ asset.address.toLowerCase() === exclude?.toLowerCase()
114
+ )
115
+ continue
116
+ if (!best || asset.balance > best.balance) best = asset
117
+ }
118
+ return { feeToken: best?.address, virtualAddresses }
119
+ }
120
+
121
+ export declare namespace resolveFeeToken {
122
+ type Options = {
123
+ minimumBalance?: bigint | undefined
124
+ exclude?: Address | undefined
125
+ feeToken?: Address | undefined
126
+ account?: Address | undefined
127
+ tokens?: readonly Address[] | undefined
128
+ targets?: readonly Address[] | undefined
129
+ }
130
+ }
131
+
132
+ /** Includes call-target TIP20 tokens as fee candidates, allowing transfers to pay fees with the transferred token. */
133
+ function callTargetTokens(
134
+ transaction: Record<string, unknown>,
135
+ ): readonly Address[] {
136
+ const calls = transaction.calls as readonly { to?: Address }[] | undefined
137
+ if (!calls) return []
138
+ const out: Address[] = []
139
+ const seen = new Set<string>()
140
+ for (const c of calls) {
141
+ if (!c.to) continue
142
+ const lower = c.to.toLowerCase()
143
+ if (!lower.startsWith('0x20c0')) continue
144
+ if (seen.has(lower)) continue
145
+ seen.add(lower)
146
+ out.push(c.to)
147
+ if (out.length > 100)
148
+ throw new RpcResponse.InvalidParamsError({
149
+ message: 'Fee-token candidates exceed the limit of 100 tokens.',
150
+ })
151
+ }
152
+ return out
153
+ }
154
+
155
+ export async function resolveTokenMetadata(
156
+ client: Client,
157
+ options: resolveTokenMetadata.Options,
158
+ ) {
159
+ const { token, tokenMetadata, store } = options
160
+ const meta =
161
+ tokenMetadata?.[token] ?? tokenMetadata?.[token.toLowerCase() as Address]
162
+ // Tempo simulation metadata covers TIP-20 tokens, whose decimals are always six.
163
+ if (token.toLowerCase().startsWith('0x20c0') && meta)
164
+ return { decimals: 6, symbol: meta.symbol, name: meta.name }
165
+ // TIP-20 metadata (decimals/symbol/name) is immutable per token, so cache
166
+ // long-term. Skips the multicall RPC on cache hits.
167
+ const fetcher = () => Actions.token.getMetadata(client, { token })
168
+ const fallback = store
169
+ ? await Store.memoize(fetcher, {
170
+ key: `tokenMetadata:${client.chain?.id ?? 0}:${token.toLowerCase()}`,
171
+ store,
172
+ ttl: 24 * 60 * 60 * 1000,
173
+ })
174
+ : await fetcher()
175
+ return {
176
+ decimals: fallback.decimals ?? 6,
177
+ symbol: meta?.symbol || fallback.symbol,
178
+ name: meta?.name || fallback.name,
179
+ }
180
+ }
181
+
182
+ export declare namespace resolveTokenMetadata {
183
+ type Options = {
184
+ token: Address
185
+ tokenMetadata?:
186
+ | Record<Address, { name: string; symbol: string; currency: string }>
187
+ | undefined
188
+ store?: Store.Store | undefined
189
+ }
190
+ }
@@ -11,232 +11,201 @@ import {
11
11
  SignatureEnvelope,
12
12
  TxEnvelopeTempo,
13
13
  } from 'ox/tempo'
14
- import { getBlockNumber } from '../actions/public/getBlockNumber.js'
15
- import { createClient } from '../clients/createClient.js'
16
- import { custom } from '../clients/transports/custom.js'
17
- import type { EIP1193RequestOptions } from '../types/eip1193.js'
18
- import { decodeFunctionData } from '../utils/abi/decodeFunctionData.js'
19
- import { isAddressEqual } from '../utils/address/isAddressEqual.js'
20
- import * as Abis from './Abis.js'
21
- import * as Addresses from './Addresses.js'
22
- import { getConfigCommitment } from './actions/multisig.js'
23
- import * as ConfigStore from './multisig/Config.js'
24
- import * as OperationStore from './multisig/Operation.js'
25
- import type * as Store from './Store.js'
26
- import * as Transaction from './Transaction.js'
14
+ import { getBlockNumber } from '../../../actions/public/getBlockNumber.js'
15
+ import { createClient } from '../../../clients/createClient.js'
16
+ import { custom } from '../../../clients/transports/custom.js'
17
+ import { decodeFunctionData } from '../../../utils/abi/decodeFunctionData.js'
18
+ import { isAddressEqual } from '../../../utils/address/isAddressEqual.js'
19
+ import * as Abis from '../../Abis.js'
20
+ import * as Addresses from '../../Addresses.js'
21
+ import { getConfigCommitment } from '../../actions/multisig.js'
22
+ import * as ConfigStore from '../../multisig/Config.js'
23
+ import * as OperationStore from '../../multisig/Operation.js'
24
+ import type * as Relay from '../../Relay.js'
25
+ import type * as Store from '../../Store.js'
26
+ import * as Transaction from '../../Transaction.js'
27
+ import * as Plugin from './plugin.js'
27
28
 
28
29
  const submissionTtl = 30_000
29
30
  const pollingInterval = 100
30
31
 
31
- /**
32
- * Creates an RPC request handler that coordinates native multisig approvals.
33
- *
34
- * @param next - Downstream RPC request handler.
35
- * @param parameters - Handler parameters.
36
- * @returns The multisig-aware RPC request handler.
37
- */
38
- export function handleRequest(
39
- next: handleRequest.Handler,
40
- parameters: handleRequest.Parameters,
41
- ): handleRequest.Handler {
42
- if (!parameters.store.compareAndSet)
32
+ /** Creates middleware for multisig approval coordination. @internal */
33
+ export function create(
34
+ options: Relay.multisig.Options,
35
+ ): Relay.multisig.ReturnType {
36
+ if (!options.store.compareAndSet)
43
37
  throw new RpcResponse.InvalidParamsError({
44
38
  message:
45
39
  'Multisig coordination requires a store with atomic `compareAndSet`.',
46
40
  })
47
- return async (request, requestOptions_) => {
48
- const requestOptions = await resolveRequestOptions({
49
- request,
50
- requestOptions: requestOptions_,
51
- store: parameters.store,
52
- })
53
- const client = createClient({
54
- transport: custom({
55
- request: ({ method, params }, options) =>
56
- next({ method, params }, { ...requestOptions, ...options }),
57
- }),
58
- })
59
-
60
- if (request.method === 'multisig_getConfig') {
61
- const value = request.params?.[0]
62
- const address =
63
- value && typeof value === 'object' && 'address' in value
64
- ? value.address
65
- : undefined
66
- if (
67
- typeof address !== 'string' ||
68
- !Address_.validate(address) ||
69
- Hex.toBigInt(address) === 0n
70
- )
71
- throw new RpcResponse.InvalidParamsError({
72
- message: 'Expected a multisig account address.',
73
- })
74
- const blockNumber = await getBlockNumber(client, { cacheTime: 0 })
75
- const commitment = await getConfigCommitment(client, {
76
- account: address,
77
- blockNumber,
41
+ return Plugin.multisig({
42
+ async handleRequest(context, forward) {
43
+ const { request, options: requestOptions_ } = context
44
+ const requestOptions = await resolveRequestOptions({
45
+ request,
46
+ requestOptions: requestOptions_,
47
+ store: options.store,
78
48
  })
79
- const config = await ConfigStore.read(parameters.store, {
80
- address,
81
- commitment,
49
+ context.options = requestOptions ?? {}
50
+ const next: Relay.handleRequest.Handler = async (request, options) => {
51
+ return context
52
+ .getClient(options?.chainId)
53
+ .request(request as never, options)
54
+ }
55
+ const client = createClient({
56
+ transport: custom(
57
+ {
58
+ request: (request, options) =>
59
+ next(request, { ...requestOptions, ...options }),
60
+ },
61
+ { retryCount: 0 },
62
+ ),
82
63
  })
83
- if (!config) return null
84
- return MultisigConfig.toRpc(config)
85
- }
86
64
 
87
- if (request.method === 'multisig_getOperation') {
88
- const hash = request.params?.[0]
89
- if (typeof hash !== 'string' || !Hash.validate(hash))
90
- throw new RpcResponse.InvalidParamsError({
91
- message: 'Expected a multisig operation hash.',
65
+ if (request.method === 'multisig_getConfig') {
66
+ const value = request.params?.[0]
67
+ const address =
68
+ value && typeof value === 'object' && 'address' in value
69
+ ? value.address
70
+ : undefined
71
+ if (
72
+ typeof address !== 'string' ||
73
+ !Address_.validate(address) ||
74
+ Hex.toBigInt(address) === 0n
75
+ )
76
+ throw new RpcResponse.InvalidParamsError({
77
+ message: 'Expected a multisig account address.',
78
+ })
79
+ const blockNumber = await getBlockNumber(client, { cacheTime: 0 })
80
+ const commitment = await getConfigCommitment(client, {
81
+ account: address,
82
+ blockNumber,
92
83
  })
93
- const operation = await OperationStore.read(parameters.store, hash)
94
- return operation ? MultisigOperation.toRpc(operation) : null
95
- }
84
+ const config = await ConfigStore.read(options.store, {
85
+ address,
86
+ commitment,
87
+ })
88
+ if (!config) return null
89
+ return MultisigConfig.toRpc(config)
90
+ }
96
91
 
97
- if (request.method === 'multisig_approveKeyAuthorization')
98
- return await approveKeyAuthorization({
99
- client,
100
- request,
101
- store: parameters.store,
102
- })
92
+ if (request.method === 'multisig_getOperation') {
93
+ const hash = request.params?.[0]
94
+ if (typeof hash !== 'string' || !Hash.validate(hash))
95
+ throw new RpcResponse.InvalidParamsError({
96
+ message: 'Expected a multisig operation hash.',
97
+ })
98
+ const operation = await OperationStore.read(options.store, hash)
99
+ return operation ? MultisigOperation.toRpc(operation) : null
100
+ }
103
101
 
104
- if (
105
- request.method === 'eth_getTransactionByHash' ||
106
- request.method === 'eth_getTransactionReceipt'
107
- ) {
108
- const hash = request.params?.[0]
109
- if (typeof hash !== 'string' || !Hash.validate(hash))
110
- return await next(request, requestOptions)
111
- const operation = await OperationStore.read(parameters.store, hash)
112
- if (!operation || operation.type !== 'transaction')
113
- return await next(request, requestOptions)
114
- if (request.method === 'eth_getTransactionReceipt') {
115
- if (operation.status === 'pending') return null
102
+ if (request.method === 'multisig_approveKeyAuthorization')
103
+ return await approveKeyAuthorization({
104
+ client,
105
+ request,
106
+ store: options.store,
107
+ })
108
+
109
+ if (
110
+ request.method === 'eth_getTransactionByHash' ||
111
+ request.method === 'eth_getTransactionReceipt'
112
+ ) {
113
+ const hash = request.params?.[0]
114
+ if (typeof hash !== 'string' || !Hash.validate(hash)) return forward()
115
+ const operation = await OperationStore.read(options.store, hash)
116
+ if (!operation || operation.type !== 'transaction') return forward()
117
+ if (request.method === 'eth_getTransactionReceipt') {
118
+ if (operation.status === 'pending') return null
119
+ const transactionHash = await getSubmittedTransactionHash(
120
+ options.store,
121
+ operation,
122
+ )
123
+ if (!transactionHash) return null
124
+ const receipt = await next(
125
+ {
126
+ ...request,
127
+ params: [transactionHash],
128
+ },
129
+ requestOptions,
130
+ )
131
+ if (!receipt || typeof receipt !== 'object') return receipt
132
+ const success =
133
+ operation.status === 'submitting'
134
+ ? await completeSubmission(
135
+ options.store,
136
+ operation,
137
+ transactionHash,
138
+ )
139
+ : operation
140
+ return {
141
+ ...receipt,
142
+ multisig: MultisigOperation.toRpc(success),
143
+ }
144
+ }
145
+ if (operation.status === 'pending')
146
+ return await toTransaction(client, operation)
116
147
  const transactionHash = await getSubmittedTransactionHash(
117
- parameters.store,
148
+ options.store,
118
149
  operation,
119
150
  )
120
- if (!transactionHash) return null
121
- const receipt = await next(
151
+ if (!transactionHash) return await toTransaction(client, operation)
152
+ const transaction = await next(
122
153
  {
123
154
  ...request,
124
155
  params: [transactionHash],
125
156
  },
126
157
  requestOptions,
127
158
  )
128
- if (!receipt || typeof receipt !== 'object') return receipt
159
+ if (!transaction || typeof transaction !== 'object')
160
+ return await toTransaction(client, operation)
129
161
  const success =
130
162
  operation.status === 'submitting'
131
163
  ? await completeSubmission(
132
- parameters.store,
164
+ options.store,
133
165
  operation,
134
166
  transactionHash,
135
167
  )
136
168
  : operation
137
169
  return {
138
- ...receipt,
170
+ ...transaction,
139
171
  multisig: MultisigOperation.toRpc(success),
140
172
  }
141
173
  }
142
- if (operation.status === 'pending')
143
- return await toTransaction(client, operation)
144
- const transactionHash = await getSubmittedTransactionHash(
145
- parameters.store,
146
- operation,
147
- )
148
- if (!transactionHash) return await toTransaction(client, operation)
149
- const transaction = await next(
150
- {
151
- ...request,
152
- params: [transactionHash],
153
- },
154
- requestOptions,
174
+
175
+ if (
176
+ request.method !== 'eth_sendRawTransaction' &&
177
+ request.method !== 'eth_sendRawTransactionSync' &&
178
+ request.method !== 'multisig_approveRawTransaction' &&
179
+ request.method !== 'multisig_approveRawTransactionSync'
155
180
  )
156
- if (!transaction || typeof transaction !== 'object')
157
- return await toTransaction(client, operation)
158
- const success =
159
- operation.status === 'submitting'
160
- ? await completeSubmission(
161
- parameters.store,
162
- operation,
163
- transactionHash,
164
- )
165
- : operation
166
- return {
167
- ...transaction,
168
- multisig: MultisigOperation.toRpc(success),
169
- }
170
- }
181
+ return forward()
171
182
 
172
- if (
173
- request.method !== 'eth_sendRawTransaction' &&
174
- request.method !== 'eth_sendRawTransactionSync' &&
175
- request.method !== 'multisig_approveRawTransaction' &&
176
- request.method !== 'multisig_approveRawTransactionSync'
177
- )
178
- return await next(request, requestOptions)
183
+ const standard =
184
+ request.method === 'eth_sendRawTransaction' ||
185
+ request.method === 'eth_sendRawTransactionSync'
186
+ const serialized = request.params?.[0]
187
+ if (!isSerializedTempoTransaction(serialized)) {
188
+ if (standard) return forward()
189
+ throw new RpcResponse.InvalidParamsError({
190
+ message: 'Expected a serialized Tempo multisig transaction.',
191
+ })
192
+ }
179
193
 
180
- const standard =
181
- request.method === 'eth_sendRawTransaction' ||
182
- request.method === 'eth_sendRawTransactionSync'
183
- const serialized = request.params?.[0]
184
- if (!isSerializedTempoTransaction(serialized)) {
185
- if (standard) return await next(request, requestOptions)
186
- throw new RpcResponse.InvalidParamsError({
187
- message: 'Expected a serialized Tempo multisig transaction.',
194
+ return await submit({
195
+ client,
196
+ method: request.method,
197
+ next,
198
+ request,
199
+ requestOptions,
200
+ serialized,
201
+ store: options.store,
188
202
  })
189
- }
190
-
191
- return await submit({
192
- client,
193
- method: request.method,
194
- next,
195
- request,
196
- requestOptions,
197
- serialized,
198
- store: parameters.store,
199
- })
200
- }
201
- }
202
-
203
- export declare namespace handleRequest {
204
- /** RPC request handler. */
205
- export type Handler = (
206
- request: Request,
207
- options?: RequestOptions | undefined,
208
- ) => Promise<unknown>
209
-
210
- /** RPC request passed to a handler. */
211
- export type Request = {
212
- /** RPC method name. */
213
- method: string
214
- /** RPC method parameters. */
215
- params?: readonly unknown[] | undefined
216
- }
217
-
218
- /** Options for one handled request. */
219
- export type RequestOptions = EIP1193RequestOptions & {
220
- /** Chain selected by the caller or inferred from the multisig request. */
221
- chainId?: number | undefined
222
- }
223
-
224
- /** Parameters for {@link handleRequest}. */
225
- export type Parameters = {
226
- /** Store shared by multisig coordinators. */
227
- store: Store.Atomic
228
- }
229
-
230
- /** Error type for {@link handleRequest}. */
231
- export type ErrorType =
232
- | ConfigStore.InvalidStoreValueError
233
- | OperationStore.InvalidStoreValueError
234
- | OperationStore.StoreConflictError
235
- | RpcResponse.InvalidParamsError
203
+ },
204
+ })
236
205
  }
237
206
 
238
207
  /** Collects approvals and submits a transaction after quorum. @internal */
239
- // biome-ignore lint/correctness/noUnusedVariables: _
208
+ // biome-ignore lint/correctness/noUnusedVariables: declaration merge
240
209
  async function submit(options: submit.Options) {
241
210
  const transaction = (() => {
242
211
  try {
@@ -551,11 +520,11 @@ declare namespace submit {
551
520
  | 'multisig_approveRawTransaction'
552
521
  | 'multisig_approveRawTransactionSync'
553
522
  /** Downstream RPC request handler. */
554
- next: handleRequest.Handler
523
+ next: Relay.handleRequest.Handler
555
524
  /** Original RPC request. */
556
- request: handleRequest.Request
525
+ request: Relay.handleRequest.Request
557
526
  /** Original request overrides. */
558
- requestOptions?: handleRequest.RequestOptions | undefined
527
+ requestOptions?: Relay.handleRequest.RequestOptions | undefined
559
528
  /** Serialized Tempo transaction. */
560
529
  serialized: Hex.Hex
561
530
  /** Shared multisig store. */
@@ -758,7 +727,7 @@ declare namespace approveKeyAuthorization {
758
727
  /** Client used to validate configs. */
759
728
  client: ReturnType<typeof createClient>
760
729
  /** Original RPC request. */
761
- request: handleRequest.Request
730
+ request: Relay.handleRequest.Request
762
731
  /** Shared multisig store. */
763
732
  store: Store.Atomic
764
733
  }
@@ -1240,10 +1209,10 @@ function getTransactionHash(result: unknown): Hex.Hex {
1240
1209
 
1241
1210
  /** Resolves and validates the chain used by a handled request. */
1242
1211
  async function resolveRequestOptions(options: {
1243
- request: handleRequest.Request
1244
- requestOptions?: handleRequest.RequestOptions | undefined
1212
+ request: Relay.handleRequest.Request
1213
+ requestOptions?: Relay.handleRequest.RequestOptions | undefined
1245
1214
  store: Store.Store
1246
- }): Promise<handleRequest.RequestOptions | undefined> {
1215
+ }): Promise<Relay.handleRequest.RequestOptions | undefined> {
1247
1216
  const { request, requestOptions, store } = options
1248
1217
  const chainId_explicit = requestOptions?.chainId
1249
1218
  if (
@@ -1269,7 +1238,7 @@ async function resolveRequestOptions(options: {
1269
1238
 
1270
1239
  /** Resolves a chain from request fields, envelopes, or stored operations. */
1271
1240
  async function resolveRequestChainId(
1272
- request: handleRequest.Request,
1241
+ request: Relay.handleRequest.Request,
1273
1242
  store: Store.Store,
1274
1243
  ) {
1275
1244
  const value = request.params?.[0]
@@ -0,0 +1,13 @@
1
+ import type * as Relay from '../../Relay.js'
2
+
3
+ const multisigPlugins = new WeakSet<Relay.Plugin>()
4
+
5
+ /** Registers the built-in multisig plugin for transport capability detection. */
6
+ export function multisig(plugin: Relay.Plugin): Relay.multisig.ReturnType {
7
+ multisigPlugins.add(plugin)
8
+ return plugin as Relay.multisig.ReturnType
9
+ }
10
+
11
+ export function isMultisig(plugin: Relay.Plugin): boolean {
12
+ return multisigPlugins.has(plugin)
13
+ }