@layerzerolabs/protocol-stellar-v2 0.2.19 → 0.2.21

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 (249) hide show
  1. package/.turbo/turbo-build.log +795 -791
  2. package/.turbo/turbo-lint.log +325 -155
  3. package/.turbo/turbo-test.log +1398 -1277
  4. package/Cargo.lock +122 -111
  5. package/Cargo.toml +32 -16
  6. package/contracts/common-macros/Cargo.toml +7 -7
  7. package/contracts/common-macros/src/auth.rs +18 -37
  8. package/contracts/common-macros/src/contract_ttl.rs +18 -7
  9. package/contracts/common-macros/src/lib.rs +31 -14
  10. package/contracts/common-macros/src/lz_contract.rs +38 -7
  11. package/contracts/common-macros/src/storage.rs +251 -292
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +6 -12
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +12 -17
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +2 -7
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +20 -14
  18. package/contracts/common-macros/src/tests/upgradeable.rs +26 -4
  19. package/contracts/common-macros/src/ttl_configurable.rs +2 -10
  20. package/contracts/common-macros/src/ttl_extendable.rs +2 -10
  21. package/contracts/common-macros/src/upgradeable.rs +61 -26
  22. package/contracts/common-macros/src/utils.rs +0 -9
  23. package/contracts/endpoint-v2/src/lib.rs +3 -2
  24. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +2 -2
  25. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +3 -3
  26. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +4 -4
  27. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +17 -5
  28. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  29. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +2 -2
  30. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +2 -2
  31. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +6 -6
  32. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +67 -37
  33. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +5 -5
  34. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +44 -54
  35. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +7 -7
  36. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +8 -8
  37. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +3 -3
  38. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +4 -4
  39. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +3 -3
  40. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +2 -2
  41. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +3 -3
  42. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +2 -2
  43. package/contracts/layerzero-views/Cargo.toml +0 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +1 -13
  45. package/contracts/macro-integration-tests/Cargo.toml +5 -15
  46. package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +48 -0
  47. package/contracts/macro-integration-tests/tests/runtime/oapp/oapp_core.rs +170 -0
  48. package/contracts/macro-integration-tests/tests/runtime/oapp/options_type3.rs +154 -0
  49. package/contracts/macro-integration-tests/tests/runtime/oapp/receiver.rs +338 -0
  50. package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +435 -0
  51. package/contracts/macro-integration-tests/tests/runtime.rs +1 -0
  52. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.rs +8 -0
  53. package/contracts/macro-integration-tests/tests/ui/oapp/fail/custom_wrong_value.stderr +5 -0
  54. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +8 -0
  55. package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +71 -0
  56. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.rs +10 -0
  57. package/contracts/macro-integration-tests/tests/ui/oapp/fail/non_struct_input.stderr +5 -0
  58. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.rs +8 -0
  59. package/contracts/macro-integration-tests/tests/ui/oapp/fail/unknown_custom_option.stderr +5 -0
  60. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.rs +8 -0
  61. package/contracts/macro-integration-tests/tests/ui/oapp/fail/wrong_key.stderr +5 -0
  62. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +38 -0
  63. package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +96 -0
  64. package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +64 -0
  65. package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +46 -0
  66. package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_auth_missing_env.stderr +8 -0
  67. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +1 -1
  68. package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_auth_env_param_variants.rs +1 -1
  69. package/contracts/macro-integration-tests/tests/ui_oapp.rs +11 -0
  70. package/contracts/message-libs/message-lib-common/Cargo.toml +0 -1
  71. package/contracts/message-libs/message-lib-common/src/errors.rs +1 -1
  72. package/contracts/message-libs/treasury/Cargo.toml +0 -2
  73. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +2 -2
  74. package/contracts/message-libs/uln-302/src/events.rs +4 -0
  75. package/contracts/message-libs/uln-302/src/send_uln.rs +22 -6
  76. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +2 -2
  77. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +2 -2
  78. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +2 -2
  79. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +2 -2
  80. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +2 -2
  81. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +21 -67
  82. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
  83. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +2 -2
  84. package/contracts/oapps/counter/Cargo.toml +5 -6
  85. package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
  86. package/contracts/oapps/counter/integration_tests/utils.rs +19 -12
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/interfaces/mod.rs +3 -0
  89. package/contracts/oapps/oapp/src/interfaces/oapp_msg_inspector.rs +47 -0
  90. package/contracts/oapps/oapp/src/lib.rs +1 -0
  91. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +4 -4
  92. package/contracts/oapps/oapp/src/oapp_core.rs +5 -5
  93. package/contracts/oapps/oapp/src/oapp_options_type3.rs +12 -4
  94. package/contracts/oapps/oapp/src/oapp_receiver.rs +14 -9
  95. package/contracts/oapps/oapp/src/tests/mod.rs +4 -4
  96. package/contracts/oapps/oapp/src/tests/oapp_core.rs +223 -0
  97. package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +240 -0
  98. package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +381 -0
  99. package/contracts/oapps/oapp/src/tests/oapp_sender.rs +569 -0
  100. package/contracts/oapps/oapp-macros/Cargo.toml +8 -4
  101. package/contracts/oapps/oapp-macros/src/generators.rs +9 -34
  102. package/contracts/oapps/oapp-macros/src/lib.rs +3 -0
  103. package/contracts/oapps/oapp-macros/src/tests/mod.rs +2 -0
  104. package/contracts/oapps/oapp-macros/src/tests/oapp.rs +88 -0
  105. package/contracts/oapps/oapp-macros/src/tests/parse_custom_impls.rs +86 -0
  106. package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +103 -0
  107. package/contracts/oapps/oft/integration-tests/utils.rs +28 -8
  108. package/contracts/oapps/oft/src/extensions/oft_fee.rs +153 -75
  109. package/contracts/oapps/oft/src/extensions/pausable.rs +61 -12
  110. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +198 -134
  111. package/contracts/oapps/oft/src/oft.rs +45 -50
  112. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
  113. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +4 -26
  114. package/contracts/oapps/oft-core/Cargo.toml +1 -4
  115. package/contracts/oapps/oft-core/integration-tests/setup.rs +3 -3
  116. package/contracts/oapps/oft-core/integration-tests/utils.rs +21 -3
  117. package/contracts/oapps/oft-core/src/errors.rs +3 -2
  118. package/contracts/oapps/oft-core/src/events.rs +6 -0
  119. package/contracts/oapps/oft-core/src/lib.rs +1 -1
  120. package/contracts/oapps/oft-core/src/oft_core.rs +341 -246
  121. package/contracts/oapps/oft-core/src/storage.rs +7 -3
  122. package/contracts/oapps/oft-core/src/tests/mod.rs +1 -0
  123. package/contracts/oapps/oft-core/src/tests/test_decimals.rs +37 -2
  124. package/contracts/oapps/oft-core/src/tests/test_lz_receive.rs +2 -2
  125. package/contracts/oapps/oft-core/src/tests/test_msg_inspector.rs +323 -0
  126. package/contracts/oapps/oft-core/src/tests/test_send.rs +2 -2
  127. package/contracts/oapps/oft-core/src/tests/test_utils.rs +61 -16
  128. package/contracts/upgrader/src/lib.rs +30 -57
  129. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  130. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  131. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  132. package/contracts/utils/Cargo.toml +0 -1
  133. package/contracts/utils/src/buffer_reader.rs +1 -0
  134. package/contracts/utils/src/errors.rs +4 -2
  135. package/contracts/utils/src/multisig.rs +17 -8
  136. package/contracts/utils/src/ownable.rs +6 -6
  137. package/contracts/utils/src/testing_utils.rs +124 -54
  138. package/contracts/utils/src/tests/multisig.rs +12 -12
  139. package/contracts/utils/src/tests/ownable.rs +6 -6
  140. package/contracts/utils/src/tests/testing_utils.rs +50 -167
  141. package/contracts/utils/src/tests/ttl_configurable.rs +5 -5
  142. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  143. package/contracts/utils/src/ttl_configurable.rs +13 -7
  144. package/contracts/utils/src/upgradeable.rs +48 -23
  145. package/contracts/workers/dvn/Cargo.toml +6 -6
  146. package/contracts/workers/dvn/src/auth.rs +12 -42
  147. package/contracts/workers/dvn/src/dvn.rs +15 -40
  148. package/contracts/workers/dvn/src/errors.rs +0 -1
  149. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  150. package/contracts/workers/dvn/src/lib.rs +4 -3
  151. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  152. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  153. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  154. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  155. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  156. package/contracts/workers/dvn-fee-lib/Cargo.toml +2 -2
  157. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +38 -22
  158. package/contracts/workers/dvn-fee-lib/src/lib.rs +12 -2
  159. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +17 -16
  160. package/contracts/workers/executor/Cargo.toml +4 -0
  161. package/contracts/workers/executor/src/executor.rs +15 -36
  162. package/contracts/workers/executor/src/lib.rs +2 -2
  163. package/contracts/workers/executor/src/tests/auth.rs +394 -0
  164. package/contracts/workers/executor/src/tests/executor.rs +410 -0
  165. package/contracts/workers/executor/src/tests/mod.rs +3 -0
  166. package/contracts/workers/executor/src/tests/setup.rs +250 -0
  167. package/contracts/workers/executor-fee-lib/Cargo.toml +7 -1
  168. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +62 -15
  169. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  170. package/contracts/workers/executor-fee-lib/src/lib.rs +11 -2
  171. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  172. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  173. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  174. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  175. package/contracts/workers/executor-helper/Cargo.toml +0 -1
  176. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  177. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  178. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  179. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  180. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  181. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  182. package/contracts/workers/price-feed/Cargo.toml +7 -1
  183. package/contracts/workers/price-feed/src/events.rs +1 -1
  184. package/contracts/workers/price-feed/src/lib.rs +12 -4
  185. package/contracts/workers/price-feed/src/price_feed.rs +5 -21
  186. package/contracts/workers/price-feed/src/storage.rs +1 -1
  187. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  188. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  189. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  190. package/contracts/workers/price-feed/src/types.rs +1 -1
  191. package/contracts/workers/worker/src/errors.rs +1 -4
  192. package/contracts/workers/worker/src/lib.rs +0 -2
  193. package/contracts/workers/worker/src/storage.rs +32 -29
  194. package/contracts/workers/worker/src/tests/setup.rs +2 -8
  195. package/contracts/workers/worker/src/tests/worker.rs +96 -74
  196. package/contracts/workers/worker/src/worker.rs +75 -75
  197. package/docs/error-spec.md +55 -0
  198. package/docs/layerzero-v2-on-stellar.md +447 -0
  199. package/docs/oapp-guide.md +212 -0
  200. package/docs/oft-guide.md +314 -0
  201. package/package.json +3 -3
  202. package/sdk/.turbo/turbo-test.log +268 -263
  203. package/sdk/dist/generated/bml.d.ts +12 -4
  204. package/sdk/dist/generated/bml.js +9 -7
  205. package/sdk/dist/generated/counter.d.ts +306 -298
  206. package/sdk/dist/generated/counter.js +48 -46
  207. package/sdk/dist/generated/dvn.d.ts +450 -411
  208. package/sdk/dist/generated/dvn.js +66 -64
  209. package/sdk/dist/generated/dvn_fee_lib.d.ts +294 -338
  210. package/sdk/dist/generated/dvn_fee_lib.js +33 -64
  211. package/sdk/dist/generated/endpoint.d.ts +108 -100
  212. package/sdk/dist/generated/endpoint.js +21 -19
  213. package/sdk/dist/generated/executor.d.ts +414 -370
  214. package/sdk/dist/generated/executor.js +58 -55
  215. package/sdk/dist/generated/executor_fee_lib.d.ts +333 -377
  216. package/sdk/dist/generated/executor_fee_lib.js +34 -65
  217. package/sdk/dist/generated/executor_helper.d.ts +26 -190
  218. package/sdk/dist/generated/executor_helper.js +23 -28
  219. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  220. package/sdk/dist/generated/layerzero_view.js +294 -0
  221. package/sdk/dist/generated/oft.d.ts +408 -385
  222. package/sdk/dist/generated/oft.js +89 -92
  223. package/sdk/dist/generated/price_feed.d.ts +385 -429
  224. package/sdk/dist/generated/price_feed.js +50 -81
  225. package/sdk/dist/generated/sml.d.ts +108 -100
  226. package/sdk/dist/generated/sml.js +21 -19
  227. package/sdk/dist/generated/treasury.d.ts +108 -100
  228. package/sdk/dist/generated/treasury.js +21 -19
  229. package/sdk/dist/generated/uln302.d.ts +108 -100
  230. package/sdk/dist/generated/uln302.js +23 -21
  231. package/sdk/dist/generated/upgrader.d.ts +189 -18
  232. package/sdk/dist/generated/upgrader.js +84 -4
  233. package/sdk/dist/index.d.ts +1 -0
  234. package/sdk/dist/index.js +2 -0
  235. package/sdk/package.json +1 -1
  236. package/sdk/src/index.ts +3 -0
  237. package/sdk/test/oft-sml.test.ts +4 -4
  238. package/sdk/test/suites/localnet.ts +84 -20
  239. package/sdk/test/upgrader.test.ts +2 -3
  240. package/tools/ts-bindings-gen/src/main.rs +2 -1
  241. package/contracts/ERROR_SPEC.md +0 -44
  242. package/contracts/endpoint-v2/ARCHITECTURE.md +0 -233
  243. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -175
  244. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -212
  245. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -153
  246. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -294
  247. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  248. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  249. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -0,0 +1,96 @@
1
+ // UI (trybuild) test: each single-trait `custom` option compiles.
2
+ //
3
+ // These are merged into one file to reduce test count while still covering:
4
+ // - `custom = [core]`
5
+ // - `custom = [sender]`
6
+ // - `custom = [receiver]`
7
+ // - `custom = [options_type3]`
8
+
9
+ use endpoint_v2::Origin;
10
+ use oapp::oapp_core::OAppCore;
11
+ use oapp::oapp_options_type3::OAppOptionsType3;
12
+ use oapp::oapp_receiver::{LzReceiveInternal, OAppReceiver};
13
+ use oapp::oapp_sender::OAppSenderInternal;
14
+ use oapp_macros::oapp;
15
+ use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
16
+
17
+ #[oapp(custom = [core])]
18
+ pub struct MyOAppCustomCore;
19
+
20
+ impl LzReceiveInternal for MyOAppCustomCore {
21
+ fn __lz_receive(
22
+ _env: &Env,
23
+ _origin: &Origin,
24
+ _guid: &BytesN<32>,
25
+ _message: &Bytes,
26
+ _extra_data: &Bytes,
27
+ _executor: &Address,
28
+ _value: i128,
29
+ ) {
30
+ }
31
+ }
32
+
33
+ #[contractimpl(contracttrait)]
34
+ impl OAppCore for MyOAppCustomCore {
35
+ fn oapp_version(_env: &Env) -> (u64, u64) {
36
+ (9, 9)
37
+ }
38
+ }
39
+
40
+ #[oapp(custom = [sender])]
41
+ pub struct MyOAppCustomSender;
42
+
43
+ impl LzReceiveInternal for MyOAppCustomSender {
44
+ fn __lz_receive(
45
+ _env: &Env,
46
+ _origin: &Origin,
47
+ _guid: &BytesN<32>,
48
+ _message: &Bytes,
49
+ _extra_data: &Bytes,
50
+ _executor: &Address,
51
+ _value: i128,
52
+ ) {
53
+ }
54
+ }
55
+
56
+ impl OAppSenderInternal for MyOAppCustomSender {}
57
+
58
+ #[oapp(custom = [receiver])]
59
+ pub struct MyOAppCustomReceiver;
60
+
61
+ impl LzReceiveInternal for MyOAppCustomReceiver {
62
+ fn __lz_receive(
63
+ _env: &Env,
64
+ _origin: &Origin,
65
+ _guid: &BytesN<32>,
66
+ _message: &Bytes,
67
+ _extra_data: &Bytes,
68
+ _executor: &Address,
69
+ _value: i128,
70
+ ) {
71
+ }
72
+ }
73
+
74
+ #[contractimpl(contracttrait)]
75
+ impl OAppReceiver for MyOAppCustomReceiver {}
76
+
77
+ #[oapp(custom = [options_type3])]
78
+ pub struct MyOAppCustomOptionsType3;
79
+
80
+ impl LzReceiveInternal for MyOAppCustomOptionsType3 {
81
+ fn __lz_receive(
82
+ _env: &Env,
83
+ _origin: &Origin,
84
+ _guid: &BytesN<32>,
85
+ _message: &Bytes,
86
+ _extra_data: &Bytes,
87
+ _executor: &Address,
88
+ _value: i128,
89
+ ) {
90
+ }
91
+ }
92
+
93
+ #[contractimpl(contracttrait)]
94
+ impl OAppOptionsType3 for MyOAppCustomOptionsType3 {}
95
+
96
+ fn main() {}
@@ -0,0 +1,64 @@
1
+ // UI (trybuild) test: minimal `#[oapp]` usage compiles.
2
+ //
3
+ // Purpose:
4
+ // - Verifies `#[oapp]` applies `#[common_macros::lz_contract]` and generates default
5
+ // contract-trait implementations for `OAppCore`, `OAppReceiver`, and `OAppOptionsType3`.
6
+ // - Verifies the user must implement `LzReceiveInternal` and that the implementation is usable.
7
+
8
+ use endpoint_v2::Origin;
9
+ use oapp::oapp_receiver::LzReceiveInternal;
10
+ use oapp_macros::oapp;
11
+ use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
12
+
13
+ #[oapp]
14
+ pub struct MyOApp;
15
+
16
+ impl LzReceiveInternal for MyOApp {
17
+ fn __lz_receive(
18
+ _env: &Env,
19
+ _origin: &Origin,
20
+ _guid: &BytesN<32>,
21
+ _message: &Bytes,
22
+ _extra_data: &Bytes,
23
+ _executor: &Address,
24
+ _value: i128,
25
+ ) {
26
+ // No-op.
27
+ }
28
+ }
29
+
30
+ #[contractimpl]
31
+ impl MyOApp {
32
+ pub fn init(env: Env, owner: Address, endpoint: Address) {
33
+ // `lz_contract` (applied by `#[oapp]`) provides ownable helpers.
34
+ Self::init_owner(&env, &owner);
35
+ oapp::oapp_core::OAppCoreStorage::set_endpoint(&env, &endpoint);
36
+
37
+ // Type-check: the trait impls exist.
38
+ let _ = <Self as oapp::oapp_core::OAppCore>::oapp_version(&env);
39
+ let _ = <Self as oapp::oapp_receiver::OAppReceiver>::next_nonce(
40
+ &env,
41
+ 1,
42
+ &BytesN::<32>::from_array(&env, &[0u8; 32]),
43
+ );
44
+ }
45
+ }
46
+
47
+ #[oapp(custom = [])]
48
+ pub struct MyOAppCustomEmpty;
49
+
50
+ impl LzReceiveInternal for MyOAppCustomEmpty {
51
+ fn __lz_receive(
52
+ _env: &Env,
53
+ _origin: &Origin,
54
+ _guid: &BytesN<32>,
55
+ _message: &Bytes,
56
+ _extra_data: &Bytes,
57
+ _executor: &Address,
58
+ _value: i128,
59
+ ) {
60
+ // No-op.
61
+ }
62
+ }
63
+
64
+ fn main() {}
@@ -0,0 +1,46 @@
1
+ // UI (trybuild) test: `#[oapp]` preserves struct attributes + fields.
2
+
3
+ use endpoint_v2::Origin;
4
+ use oapp::oapp_receiver::LzReceiveInternal;
5
+ use oapp_macros::oapp;
6
+ use soroban_sdk::{Address, Bytes, BytesN, Env};
7
+
8
+ #[oapp]
9
+ #[derive(Clone, Debug)]
10
+ pub struct MyOApp {
11
+ pub x: u32,
12
+ }
13
+
14
+ impl LzReceiveInternal for MyOApp {
15
+ fn __lz_receive(
16
+ _env: &Env,
17
+ _origin: &Origin,
18
+ _guid: &BytesN<32>,
19
+ _message: &Bytes,
20
+ _extra_data: &Bytes,
21
+ _executor: &Address,
22
+ _value: i128,
23
+ ) {
24
+ }
25
+ }
26
+
27
+ #[oapp]
28
+ pub struct MyOAppTuple(u32, bool);
29
+
30
+ impl LzReceiveInternal for MyOAppTuple {
31
+ fn __lz_receive(
32
+ _env: &Env,
33
+ _origin: &Origin,
34
+ _guid: &BytesN<32>,
35
+ _message: &Bytes,
36
+ _extra_data: &Bytes,
37
+ _executor: &Address,
38
+ _value: i128,
39
+ ) {
40
+ }
41
+ }
42
+
43
+ fn main() {
44
+ // Ensure tuple fields are preserved by macro expansion.
45
+ let _ = MyOAppTuple(1, true);
46
+ }
@@ -6,6 +6,14 @@ error: custom attribute panicked
6
6
  |
7
7
  = help: message: function must have an Env argument
8
8
 
9
+ warning: unused import: `Address`
10
+ --> tests/ui/ownable/fail/only_auth_missing_env.rs:7:43
11
+ |
12
+ 7 | use soroban_sdk::{contract, contractimpl, Address};
13
+ | ^^^^^^^
14
+ |
15
+ = note: `#[warn(unused_imports)]` on by default
16
+
9
17
  error[E0599]: no function or associated item named `bad` found for struct `MyContract` in the current scope
10
18
  --> tests/ui/ownable/fail/only_auth_missing_env.rs:17:12
11
19
  |
@@ -4,7 +4,7 @@
4
4
  // - Ensures a downstream crate can use the generated `Ownable` trait impl via a fully-qualified path
5
5
  // without importing `utils::ownable::Ownable` into scope.
6
6
 
7
- use soroban_sdk::{contract, contractimpl, Address, Env};
7
+ use soroban_sdk::{contract, contractimpl, Env};
8
8
 
9
9
  #[contract]
10
10
  #[common_macros::ownable]
@@ -5,7 +5,7 @@
5
5
  // even when `Env` is not the first parameter.
6
6
  // - Uses `&Env` forms to match the most common `require_auth` signature shape.
7
7
 
8
- use soroban_sdk::{contract, Address, Env};
8
+ use soroban_sdk::{contract, Env};
9
9
 
10
10
  #[contract]
11
11
  #[common_macros::ownable]
@@ -0,0 +1,11 @@
1
+ #[test]
2
+ fn ui_oapp() {
3
+ // Important: set this before trybuild::TestCases::new() so each shard has
4
+ // its own trybuild project directory + lock + artifacts.
5
+ let target_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("target/trybuild-shards/ui_oapp");
6
+ std::env::set_var("CARGO_TARGET_DIR", target_dir.as_os_str());
7
+
8
+ let t = trybuild::TestCases::new();
9
+ t.pass("tests/ui/oapp/**/pass/*.rs");
10
+ t.compile_fail("tests/ui/oapp/**/fail/*.rs");
11
+ }
@@ -12,7 +12,6 @@ doctest = false
12
12
  testutils = []
13
13
 
14
14
  [dependencies]
15
- cfg-if = "1.0"
16
15
  soroban-sdk = { workspace = true }
17
16
  # workspace dependencies
18
17
  utils = { workspace = true }
@@ -1,7 +1,7 @@
1
1
  use common_macros::contract_error;
2
2
 
3
3
  // Message Lib Common error codes: 1100-1199
4
- // See ERROR_SPEC.md for allocation rules
4
+ // See docs/error-spec.md for allocation rules
5
5
 
6
6
  /// PacketCodecV1Error: 1100-1109
7
7
  #[contract_error]
@@ -18,10 +18,8 @@ cfg-if = { workspace = true }
18
18
  soroban-sdk = { workspace = true }
19
19
  common-macros = { workspace = true }
20
20
  utils = { workspace = true }
21
- endpoint-v2 = { workspace = true, features = ["library"] }
22
21
  message-lib-common = { workspace = true }
23
22
 
24
23
  [dev-dependencies]
25
24
  soroban-sdk = { workspace = true, features = ["testutils"] }
26
25
  utils = { workspace = true, features = ["testutils"] }
27
- insta = { workspace = true }
@@ -455,14 +455,14 @@ fn test_withdraw_token_events_emitted() {
455
455
  setup.mint_tokens(&token, &setup.treasury.address, amount);
456
456
 
457
457
  // Count events before withdrawal
458
- let events_before = setup.env.events().all().len();
458
+ let events_before = setup.env.events().all().events().len();
459
459
 
460
460
  // Withdraw tokens and check that events are emitted
461
461
  setup.mock_owner_auth("withdraw_token", (&token, &recipient, &amount));
462
462
  setup.treasury.withdraw_token(&token, &recipient, &amount);
463
463
 
464
464
  // Verify that new events were published
465
- let events_after = setup.env.events().all().len();
465
+ let events_after = setup.env.events().all().events().len();
466
466
  assert!(events_after > events_before, "TokenWithdrawn event should be emitted");
467
467
  }
468
468
 
@@ -58,12 +58,16 @@ pub struct DefaultReceiveUlnConfigsSet {
58
58
  pub struct ExecutorFeePaid {
59
59
  #[topic]
60
60
  pub executor: Address,
61
+ #[topic]
62
+ pub guid: BytesN<32>,
61
63
  pub fee: FeeRecipient,
62
64
  }
63
65
 
64
66
  #[contractevent]
65
67
  #[derive(Clone, Debug, Eq, PartialEq)]
66
68
  pub struct DVNFeePaid {
69
+ #[topic]
70
+ pub guid: BytesN<32>,
67
71
  pub dvns: Vec<Address>,
68
72
  pub fees: Vec<FeeRecipient>,
69
73
  }
@@ -63,12 +63,25 @@ impl ISendLib for Uln302 {
63
63
  prepare_packet_and_options(env, packet, options);
64
64
 
65
65
  // Executor fee
66
- let executor_fee_recipient =
67
- Self::assign_executor(env, &packet.sender, packet.dst_eid, packet.message.len(), &executor_options);
66
+ let executor_fee_recipient = Self::assign_executor(
67
+ env,
68
+ &packet.guid,
69
+ &packet.sender,
70
+ packet.dst_eid,
71
+ packet.message.len(),
72
+ &executor_options,
73
+ );
68
74
 
69
75
  // DVNs fees
70
- let dvns_fee_recipients =
71
- Self::assign_dvns(env, &packet.sender, packet.dst_eid, &packet_header, &payload_hash, &dvn_options);
76
+ let dvns_fee_recipients = Self::assign_dvns(
77
+ env,
78
+ &packet.guid,
79
+ &packet.sender,
80
+ packet.dst_eid,
81
+ &packet_header,
82
+ &payload_hash,
83
+ &dvn_options,
84
+ );
72
85
 
73
86
  // Collect all worker fees
74
87
  let mut native_fee_recipients = vec![env, executor_fee_recipient];
@@ -257,6 +270,7 @@ impl Uln302 {
257
270
  /// Assigns an executor job and returns the fee recipient.
258
271
  fn assign_executor(
259
272
  env: &Env,
273
+ guid: &BytesN<32>,
260
274
  sender: &Address,
261
275
  dst_eid: u32,
262
276
  message_length: u32,
@@ -270,13 +284,15 @@ impl Uln302 {
270
284
  let recipient =
271
285
  executor_client.assign_job(&env.current_contract_address(), sender, &dst_eid, &message_length, options);
272
286
 
273
- ExecutorFeePaid { executor: executor_client.address.clone(), fee: recipient.clone() }.publish(env);
287
+ ExecutorFeePaid { guid: guid.clone(), executor: executor_client.address.clone(), fee: recipient.clone() }
288
+ .publish(env);
274
289
  recipient
275
290
  }
276
291
 
277
292
  /// Assigns DVN jobs and returns fee recipients for all DVNs.
278
293
  fn assign_dvns(
279
294
  env: &Env,
295
+ guid: &BytesN<32>,
280
296
  sender: &Address,
281
297
  dst_eid: u32,
282
298
  packet_header: &Bytes,
@@ -305,7 +321,7 @@ impl Uln302 {
305
321
  dvns.push_back(dvn_addr);
306
322
  }
307
323
 
308
- DVNFeePaid { dvns, fees: fees.clone() }.publish(env);
324
+ DVNFeePaid { guid: guid.clone(), dvns, fees: fees.clone() }.publish(env);
309
325
  fees
310
326
  }
311
327
  }
@@ -8,7 +8,7 @@ use crate::{
8
8
  };
9
9
  use endpoint_v2::SetConfigParam;
10
10
  use soroban_sdk::{log, testutils::Address as _, vec, xdr::ToXdr, Address, Env};
11
- use utils::testing_utils::assert_event;
11
+ use utils::testing_utils::assert_eq_event;
12
12
 
13
13
  #[test]
14
14
  fn test_effective_receive_uln_config_with_default_only() {
@@ -57,7 +57,7 @@ fn test_effective_receive_uln_config_with_custom_config() {
57
57
  endpoint.set_config(&Address::generate(&env), &oapp, &uln302.address, &params);
58
58
 
59
59
  // Assert ReceiveUlnConfigSet event was published immediately after the setter
60
- assert_event(
60
+ assert_eq_event(
61
61
  &env,
62
62
  &uln302.address,
63
63
  ReceiveUlnConfigSet { config: custom_config.clone(), receiver: oapp.clone(), src_eid: eid },
@@ -9,7 +9,7 @@ use soroban_sdk::{
9
9
  testutils::{MockAuth, MockAuthInvoke},
10
10
  vec, IntoVal,
11
11
  };
12
- use utils::testing_utils::assert_event;
12
+ use utils::testing_utils::assert_eq_event;
13
13
 
14
14
  #[test]
15
15
  fn test_set_default_receive_uln_configs() {
@@ -33,7 +33,7 @@ fn test_set_default_receive_uln_configs() {
33
33
  uln302.set_default_receive_uln_configs(&oapp_receive_uln_configs);
34
34
 
35
35
  // Assert DefaultReceiveUlnConfigSet event was published with all params
36
- assert_event(&env, &uln302.address, DefaultReceiveUlnConfigsSet { params: oapp_receive_uln_configs.clone() });
36
+ assert_eq_event(&env, &uln302.address, DefaultReceiveUlnConfigsSet { params: oapp_receive_uln_configs.clone() });
37
37
 
38
38
  let uln302_receive_client = ReceiveUln302Client::new(&env, &uln302.address);
39
39
  for config in oapp_receive_uln_configs.clone() {
@@ -2,7 +2,7 @@ use soroban_sdk::{
2
2
  testutils::{Address as _, MockAuth, MockAuthInvoke},
3
3
  Address, IntoVal,
4
4
  };
5
- use utils::testing_utils::assert_event;
5
+ use utils::testing_utils::assert_eq_event;
6
6
 
7
7
  use crate::{
8
8
  events::PayloadVerified,
@@ -165,7 +165,7 @@ fn test_verify_emits_event() {
165
165
  receive_client.verify(&dvn, &packet_header, &payload_hash, &CONFIRMATIONS);
166
166
 
167
167
  // Verify PayloadVerified event was emitted
168
- assert_event(
168
+ assert_eq_event(
169
169
  &env,
170
170
  &uln302.address,
171
171
  PayloadVerified { dvn, header: packet_header, proof_hash: payload_hash, confirmations: CONFIRMATIONS },
@@ -8,7 +8,7 @@ use crate::{
8
8
  };
9
9
  use endpoint_v2::SetConfigParam;
10
10
  use soroban_sdk::{log, testutils::Address as _, vec, xdr::ToXdr, Address, Env};
11
- use utils::testing_utils::assert_event;
11
+ use utils::testing_utils::assert_eq_event;
12
12
 
13
13
  #[test]
14
14
  fn test_effective_executor_config_with_default_only() {
@@ -57,7 +57,7 @@ fn test_effective_executor_config_with_custom_executor() {
57
57
 
58
58
  // Assert ExecutorConfigSet event was published immediately after the setter
59
59
 
60
- assert_event(
60
+ assert_eq_event(
61
61
  &setup.env,
62
62
  &setup.uln302.address,
63
63
  ExecutorConfigSet { config: custom_config.clone(), dst_eid: eid, sender: oapp.clone() },
@@ -9,7 +9,7 @@ use crate::{
9
9
  };
10
10
  use endpoint_v2::SetConfigParam;
11
11
  use soroban_sdk::{log, testutils::Address as _, vec, xdr::ToXdr, Address, Env};
12
- use utils::testing_utils::assert_event;
12
+ use utils::testing_utils::assert_eq_event;
13
13
 
14
14
  #[test]
15
15
  fn test_effective_send_uln_config_with_default_only() {
@@ -65,7 +65,7 @@ fn test_effective_send_uln_config_with_custom_config() {
65
65
  endpoint.set_config(&Address::generate(&env), &oapp, &uln302.address, &params);
66
66
 
67
67
  // Assert SendUlnConfigSet event was published immediately after the setter
68
- assert_event(
68
+ assert_eq_event(
69
69
  &env,
70
70
  &uln302.address,
71
71
  SendUlnConfigSet { config: custom_config.clone(), dst_eid: eid, sender: oapp.clone() },
@@ -14,7 +14,7 @@ use soroban_sdk::{
14
14
  vec, Bytes, BytesN, IntoVal,
15
15
  };
16
16
  use soroban_sdk::{Address, Env, Vec};
17
- use utils::testing_utils::{assert_events, IntoExpectedEvent};
17
+ use utils::testing_utils::assert_eq_events;
18
18
 
19
19
  // Note that all the hot paths and assertions are covered in the quote test so here we only test the events emittance
20
20
  #[test]
@@ -72,14 +72,12 @@ fn test_send_events_emittance() {
72
72
  let send_result = setup.uln302.send(&packet, &options, &pay_in_zro);
73
73
  let native_fee_recipients = &send_result.native_fee_recipients;
74
74
  let zro_fee_recipients = &send_result.zro_fee_recipients;
75
- assert_events(
75
+ assert_eq_events(
76
76
  &setup.env,
77
77
  &setup.uln302.address,
78
78
  &[
79
- ExecutorFeePaid { executor: executor.clone(), fee: native_fee_recipients.get(0).unwrap().clone() }
80
- .expected(&setup.env),
81
- DVNFeePaid { dvns: dvns.slice(0..2).clone(), fees: native_fee_recipients.slice(1..3).clone() }
82
- .expected(&setup.env),
79
+ &ExecutorFeePaid { guid: packet.guid.clone(),executor: executor.clone(), fee: native_fee_recipients.get(0).unwrap().clone() },
80
+ &DVNFeePaid { guid: packet.guid.clone(),dvns: dvns.slice(0..2).clone(), fees: native_fee_recipients.slice(1..3).clone() },
83
81
  ],
84
82
  );
85
83
 
@@ -92,17 +90,11 @@ fn test_send_events_emittance() {
92
90
  );
93
91
  assert_eq!(
94
92
  native_fee_recipients.get(1).unwrap(),
95
- FeeRecipient {
96
- amount: DVN_FEE[0],
97
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
98
- }
93
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
99
94
  );
100
95
  assert_eq!(
101
96
  native_fee_recipients.get(2).unwrap(),
102
- FeeRecipient {
103
- amount: DVN_FEE[1],
104
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
105
- }
97
+ FeeRecipient { amount: DVN_FEE[1], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient() }
106
98
  );
107
99
  assert_eq!(
108
100
  native_fee_recipients.get(3).unwrap(),
@@ -168,14 +160,12 @@ fn test_send_events_emittance_with_zro() {
168
160
  let native_fee_recipients = &send_result.native_fee_recipients;
169
161
  let zro_fee_recipients = &send_result.zro_fee_recipients;
170
162
 
171
- assert_events(
163
+ assert_eq_events(
172
164
  &setup.env,
173
165
  &setup.uln302.address,
174
166
  &[
175
- ExecutorFeePaid { executor: executor.clone(), fee: native_fee_recipients.get(0).unwrap().clone() }
176
- .expected(&setup.env),
177
- DVNFeePaid { dvns: dvns.slice(0..2).clone(), fees: native_fee_recipients.slice(1..3).clone() }
178
- .expected(&setup.env),
167
+ &ExecutorFeePaid { guid: packet.guid.clone(), executor: executor.clone(), fee: native_fee_recipients.get(0).unwrap().clone() },
168
+ &DVNFeePaid { guid: packet.guid.clone(), dvns: dvns.slice(0..2).clone(), fees: native_fee_recipients.slice(1..3).clone() },
179
169
  ],
180
170
  );
181
171
 
@@ -188,17 +178,11 @@ fn test_send_events_emittance_with_zro() {
188
178
  );
189
179
  assert_eq!(
190
180
  native_fee_recipients.get(1).unwrap(),
191
- FeeRecipient {
192
- amount: DVN_FEE[0],
193
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
194
- }
181
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
195
182
  );
196
183
  assert_eq!(
197
184
  native_fee_recipients.get(2).unwrap(),
198
- FeeRecipient {
199
- amount: DVN_FEE[1],
200
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
201
- }
185
+ FeeRecipient { amount: DVN_FEE[1], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient() }
202
186
  );
203
187
  assert_eq!(
204
188
  zro_fee_recipients.get(0).unwrap(),
@@ -264,10 +248,7 @@ fn test_send_single_dvn() {
264
248
  );
265
249
  assert_eq!(
266
250
  native_fee_recipients.get(1).unwrap(),
267
- FeeRecipient {
268
- amount: DVN_FEE[0],
269
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
270
- }
251
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
271
252
  );
272
253
  assert_eq!(
273
254
  native_fee_recipients.get(2).unwrap(),
@@ -378,17 +359,11 @@ fn test_send_multiple_dvns() {
378
359
  );
379
360
  assert_eq!(
380
361
  native_fee_recipients.get(1).unwrap(),
381
- FeeRecipient {
382
- amount: DVN_FEE[0],
383
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
384
- }
362
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
385
363
  );
386
364
  assert_eq!(
387
365
  native_fee_recipients.get(2).unwrap(),
388
- FeeRecipient {
389
- amount: DVN_FEE[1],
390
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
391
- }
366
+ FeeRecipient { amount: DVN_FEE[1], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient() }
392
367
  );
393
368
  assert_eq!(
394
369
  native_fee_recipients.get(3).unwrap(),
@@ -454,10 +429,7 @@ fn test_send_with_only_optional_dvns() {
454
429
  );
455
430
  assert_eq!(
456
431
  native_fee_recipients.get(1).unwrap(),
457
- FeeRecipient {
458
- amount: DVN_FEE[0],
459
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
460
- }
432
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
461
433
  );
462
434
  assert_eq!(
463
435
  native_fee_recipients.get(2).unwrap(),
@@ -628,17 +600,11 @@ fn test_send_with_missing_dvn_options() {
628
600
  );
629
601
  assert_eq!(
630
602
  native_fee_recipients.get(1).unwrap(),
631
- FeeRecipient {
632
- amount: DVN_FEE[0],
633
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
634
- }
603
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
635
604
  );
636
605
  assert_eq!(
637
606
  native_fee_recipients.get(2).unwrap(),
638
- FeeRecipient {
639
- amount: DVN_FEE[1],
640
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
641
- }
607
+ FeeRecipient { amount: DVN_FEE[1], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient() }
642
608
  );
643
609
  assert_eq!(
644
610
  native_fee_recipients.get(3).unwrap(),
@@ -703,10 +669,7 @@ fn test_send_with_missing_executor_options() {
703
669
  );
704
670
  assert_eq!(
705
671
  native_fee_recipients.get(1).unwrap(),
706
- FeeRecipient {
707
- amount: DVN_FEE[0],
708
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
709
- }
672
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
710
673
  );
711
674
  assert_eq!(
712
675
  native_fee_recipients.get(2).unwrap(),
@@ -804,26 +767,17 @@ fn test_send_derives_from_quote() {
804
767
  // DVN 0 (first required)
805
768
  assert_eq!(
806
769
  native_fee_recipients.get(1).unwrap(),
807
- FeeRecipient {
808
- amount: DVN_FEE[0],
809
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient()
810
- }
770
+ FeeRecipient { amount: DVN_FEE[0], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(0)).recipient() }
811
771
  );
812
772
  // DVN 1 (second required)
813
773
  assert_eq!(
814
774
  native_fee_recipients.get(2).unwrap(),
815
- FeeRecipient {
816
- amount: DVN_FEE[1],
817
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient()
818
- }
775
+ FeeRecipient { amount: DVN_FEE[1], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(1)).recipient() }
819
776
  );
820
777
  // DVN 2 (optional)
821
778
  assert_eq!(
822
779
  native_fee_recipients.get(3).unwrap(),
823
- FeeRecipient {
824
- amount: DVN_FEE[2],
825
- to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(2)).recipient()
826
- }
780
+ FeeRecipient { amount: DVN_FEE[2], to: DummyDVNClient::new(&setup.env, &dvns.get_unchecked(2)).recipient() }
827
781
  );
828
782
 
829
783
  // Treasury fee is last