@layerzerolabs/protocol-stellar-v2 0.2.18 → 0.2.20

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 (213) hide show
  1. package/.turbo/turbo-build.log +303 -253
  2. package/.turbo/turbo-lint.log +66 -65
  3. package/.turbo/turbo-test.log +1312 -1282
  4. package/Cargo.lock +21 -8
  5. package/Cargo.toml +2 -0
  6. package/contracts/ERROR_SPEC.md +9 -2
  7. package/contracts/common-macros/src/contract_ttl.rs +18 -7
  8. package/contracts/common-macros/src/lib.rs +4 -4
  9. package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
  10. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
  11. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +7 -12
  12. package/contracts/common-macros/src/upgradeable.rs +15 -21
  13. package/contracts/message-libs/uln-302/src/events.rs +4 -0
  14. package/contracts/message-libs/uln-302/src/send_uln.rs +23 -7
  15. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +38 -64
  16. package/contracts/oapps/counter/Cargo.toml +1 -0
  17. package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
  18. package/contracts/oapps/oapp/src/oapp_receiver.rs +1 -1
  19. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +113 -65
  20. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +111 -82
  21. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +293 -65
  22. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +331 -56
  23. package/contracts/oapps/oft/Cargo.toml +10 -7
  24. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
  25. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
  26. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
  27. package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
  28. package/contracts/oapps/oft/integration-tests/setup.rs +28 -127
  29. package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
  30. package/contracts/oapps/oft/src/extensions/oft_fee.rs +23 -8
  31. package/contracts/oapps/oft/src/extensions/pausable.rs +19 -4
  32. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +52 -28
  33. package/contracts/oapps/oft/src/lib.rs +10 -14
  34. package/contracts/oapps/oft/src/oft.rs +143 -193
  35. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -11
  36. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +12 -14
  37. package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
  38. package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
  39. package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
  40. package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +126 -29
  41. package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
  42. package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
  43. package/contracts/oapps/oft-core/src/lib.rs +18 -0
  44. package/contracts/oapps/oft-core/src/oft_core.rs +479 -0
  45. package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
  46. package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
  47. package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -4
  48. package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
  49. package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +46 -27
  50. package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
  51. package/contracts/upgrader/src/lib.rs +30 -57
  52. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
  53. package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
  54. package/contracts/upgrader/src/tests/test_upgrader.rs +44 -35
  55. package/contracts/utils/src/buffer_reader.rs +1 -0
  56. package/contracts/utils/src/errors.rs +8 -2
  57. package/contracts/utils/src/ownable.rs +125 -3
  58. package/contracts/utils/src/tests/option_ext.rs +1 -1
  59. package/contracts/utils/src/tests/ownable.rs +445 -7
  60. package/contracts/utils/src/tests/ttl_configurable.rs +2 -2
  61. package/contracts/utils/src/tests/upgradeable.rs +372 -175
  62. package/contracts/utils/src/ttl_configurable.rs +3 -3
  63. package/contracts/utils/src/upgradeable.rs +48 -23
  64. package/contracts/workers/dvn/Cargo.toml +1 -0
  65. package/contracts/workers/dvn/src/auth.rs +12 -42
  66. package/contracts/workers/dvn/src/dvn.rs +16 -31
  67. package/contracts/workers/dvn/src/errors.rs +0 -1
  68. package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
  69. package/contracts/workers/dvn/src/lib.rs +4 -3
  70. package/contracts/workers/dvn/src/tests/auth.rs +1 -1
  71. package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
  72. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
  73. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
  74. package/contracts/workers/dvn/src/tests/setup.rs +5 -9
  75. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  76. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -5
  77. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +2 -3
  78. package/contracts/workers/executor/Cargo.toml +1 -0
  79. package/contracts/workers/executor/src/executor.rs +15 -26
  80. package/contracts/workers/executor-fee-lib/Cargo.toml +2 -1
  81. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +63 -5
  82. package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
  83. package/contracts/workers/executor-fee-lib/src/lib.rs +3 -0
  84. package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
  85. package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
  86. package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
  87. package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
  88. package/contracts/workers/executor-helper/src/lib.rs +3 -0
  89. package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
  90. package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
  91. package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
  92. package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
  93. package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
  94. package/contracts/workers/price-feed/Cargo.toml +2 -1
  95. package/contracts/workers/price-feed/src/events.rs +1 -1
  96. package/contracts/workers/price-feed/src/lib.rs +3 -0
  97. package/contracts/workers/price-feed/src/price_feed.rs +6 -12
  98. package/contracts/workers/price-feed/src/storage.rs +1 -1
  99. package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
  100. package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
  101. package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
  102. package/contracts/workers/price-feed/src/types.rs +1 -1
  103. package/contracts/workers/worker/src/errors.rs +0 -3
  104. package/contracts/workers/worker/src/lib.rs +0 -2
  105. package/contracts/workers/worker/src/storage.rs +32 -29
  106. package/contracts/workers/worker/src/tests/setup.rs +1 -7
  107. package/contracts/workers/worker/src/tests/worker.rs +50 -42
  108. package/contracts/workers/worker/src/worker.rs +49 -58
  109. package/package.json +4 -5
  110. package/sdk/.turbo/turbo-test.log +229 -217
  111. package/sdk/dist/generated/bml.d.ts +39 -1
  112. package/sdk/dist/generated/bml.js +33 -8
  113. package/sdk/dist/generated/counter.d.ts +131 -3
  114. package/sdk/dist/generated/counter.js +41 -10
  115. package/sdk/dist/generated/dvn.d.ts +431 -362
  116. package/sdk/dist/generated/dvn.js +80 -55
  117. package/sdk/dist/generated/dvn_fee_lib.d.ts +327 -251
  118. package/sdk/dist/generated/dvn_fee_lib.js +55 -57
  119. package/sdk/dist/generated/endpoint.d.ts +131 -3
  120. package/sdk/dist/generated/endpoint.js +41 -10
  121. package/sdk/dist/generated/executor.d.ts +503 -339
  122. package/sdk/dist/generated/executor.js +80 -48
  123. package/sdk/dist/generated/executor_fee_lib.d.ts +395 -319
  124. package/sdk/dist/generated/executor_fee_lib.js +54 -56
  125. package/sdk/dist/generated/executor_helper.d.ts +53 -187
  126. package/sdk/dist/generated/executor_helper.js +47 -29
  127. package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
  128. package/sdk/dist/generated/layerzero_view.js +294 -0
  129. package/sdk/dist/generated/oft.d.ts +1851 -0
  130. package/sdk/dist/generated/oft.js +347 -0
  131. package/sdk/dist/generated/price_feed.d.ts +329 -253
  132. package/sdk/dist/generated/price_feed.js +55 -57
  133. package/sdk/dist/generated/sml.d.ts +131 -3
  134. package/sdk/dist/generated/sml.js +41 -10
  135. package/sdk/dist/generated/treasury.d.ts +131 -3
  136. package/sdk/dist/generated/treasury.js +41 -10
  137. package/sdk/dist/generated/uln302.d.ts +131 -3
  138. package/sdk/dist/generated/uln302.js +43 -12
  139. package/sdk/dist/generated/upgrader.d.ts +201 -15
  140. package/sdk/dist/generated/upgrader.js +99 -1
  141. package/sdk/dist/index.d.ts +2 -2
  142. package/sdk/dist/index.js +3 -3
  143. package/sdk/package.json +3 -2
  144. package/sdk/src/index.ts +3 -3
  145. package/sdk/test/oft-sml.test.ts +20 -20
  146. package/sdk/test/upgrader.test.ts +2 -3
  147. package/sdk/turbo.json +8 -0
  148. package/tools/ts-bindings-gen/Cargo.toml +2 -0
  149. package/tools/ts-bindings-gen/src/main.rs +53 -5
  150. package/turbo.json +0 -2
  151. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
  152. package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
  153. package/contracts/oapps/oft/src/oft_impl.rs +0 -201
  154. package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
  155. package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -917
  156. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -751
  157. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -434
  158. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1080
  159. package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
  160. package/contracts/oapps/oft-std/src/lib.rs +0 -16
  161. package/contracts/oapps/oft-std/src/oft.rs +0 -174
  162. package/sdk/dist/generated/oft_std.d.ts +0 -1722
  163. package/sdk/dist/generated/oft_std.js +0 -316
  164. package/sdk/dist/wasm/blocked-message-lib.d.ts +0 -1
  165. package/sdk/dist/wasm/blocked-message-lib.js +0 -2
  166. package/sdk/dist/wasm/counter.d.ts +0 -1
  167. package/sdk/dist/wasm/counter.js +0 -2
  168. package/sdk/dist/wasm/dvn-fee-lib.d.ts +0 -1
  169. package/sdk/dist/wasm/dvn-fee-lib.js +0 -2
  170. package/sdk/dist/wasm/dvn.d.ts +0 -1
  171. package/sdk/dist/wasm/dvn.js +0 -2
  172. package/sdk/dist/wasm/endpoint-v2.d.ts +0 -1
  173. package/sdk/dist/wasm/endpoint-v2.js +0 -2
  174. package/sdk/dist/wasm/executor-fee-lib.d.ts +0 -1
  175. package/sdk/dist/wasm/executor-fee-lib.js +0 -2
  176. package/sdk/dist/wasm/executor-helper.d.ts +0 -1
  177. package/sdk/dist/wasm/executor-helper.js +0 -2
  178. package/sdk/dist/wasm/executor.d.ts +0 -1
  179. package/sdk/dist/wasm/executor.js +0 -2
  180. package/sdk/dist/wasm/layerzero-views.d.ts +0 -1
  181. package/sdk/dist/wasm/layerzero-views.js +0 -2
  182. package/sdk/dist/wasm/oft-std.d.ts +0 -1
  183. package/sdk/dist/wasm/oft-std.js +0 -2
  184. package/sdk/dist/wasm/price-feed.d.ts +0 -1
  185. package/sdk/dist/wasm/price-feed.js +0 -2
  186. package/sdk/dist/wasm/simple-message-lib.d.ts +0 -1
  187. package/sdk/dist/wasm/simple-message-lib.js +0 -2
  188. package/sdk/dist/wasm/treasury.d.ts +0 -1
  189. package/sdk/dist/wasm/treasury.js +0 -2
  190. package/sdk/dist/wasm/uln302.d.ts +0 -1
  191. package/sdk/dist/wasm/uln302.js +0 -2
  192. package/sdk/dist/wasm/upgrader.d.ts +0 -1
  193. package/sdk/dist/wasm/upgrader.js +0 -2
  194. package/sdk/dist/wasm.d.ts +0 -15
  195. package/sdk/dist/wasm.js +0 -15
  196. /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
  197. /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
  198. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
  199. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
  200. /package/contracts/oapps/{oft → oft-core}/src/errors.rs +0 -0
  201. /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
  202. /package/contracts/oapps/{oft → oft-core}/src/storage.rs +0 -0
  203. /package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +0 -0
  204. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
  205. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
  206. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
  207. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
  208. /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
  209. /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
  210. /package/contracts/oapps/{oft → oft-core}/src/types.rs +0 -0
  211. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
  212. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
  213. /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
@@ -1,7 +1,7 @@
1
1
  use crate::{self as oapp, oapp_core::PeerSet, oapp_receiver::LzReceiveInternal};
2
2
  use endpoint_v2::Origin;
3
3
  use soroban_sdk::{
4
- contract, contractimpl,
4
+ contract, contractimpl, contracttype,
5
5
  testutils::{Address as _, MockAuth, MockAuthInvoke},
6
6
  Address, Bytes, BytesN, Env, IntoVal,
7
7
  };
@@ -10,10 +10,24 @@ use utils::testing_utils::assert_event;
10
10
  #[contract]
11
11
  pub struct DummyEndpoint;
12
12
 
13
+ #[derive(Clone)]
14
+ #[contracttype]
15
+ enum DummyEndpointDataKey {
16
+ Delegate(Address),
17
+ }
18
+
13
19
  #[contractimpl]
14
20
  impl DummyEndpoint {
15
- pub fn set_delegate(_env: Env, _oapp: &Address, _delegate: &Option<Address>) {
16
- // do nothing
21
+ pub fn set_delegate(env: Env, oapp: &Address, delegate: &Option<Address>) {
22
+ let key = DummyEndpointDataKey::Delegate(oapp.clone());
23
+ match delegate {
24
+ Some(d) => env.storage().persistent().set(&key, d),
25
+ None => env.storage().persistent().remove(&key),
26
+ }
27
+ }
28
+
29
+ pub fn get_delegate(env: Env, oapp: Address) -> Option<Address> {
30
+ env.storage().persistent().get(&DummyEndpointDataKey::Delegate(oapp))
17
31
  }
18
32
  }
19
33
 
@@ -64,97 +78,127 @@ fn setup<'a>() -> TestSetup<'a> {
64
78
  TestSetup { env, owner, endpoint, oapp_client }
65
79
  }
66
80
 
67
- #[test]
68
- fn test_set_peer() {
69
- let TestSetup { env, owner, oapp_client, .. } = setup();
70
-
71
- let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
72
- let test_peer_option = Some(test_peer.clone());
81
+ fn set_peer_with_auth(
82
+ env: &Env,
83
+ signer: &Address,
84
+ oapp_client: &DummyOAppClient<'_>,
85
+ eid: u32,
86
+ peer: &Option<BytesN<32>>,
87
+ ) {
73
88
  env.mock_auths(&[MockAuth {
74
- address: &owner,
89
+ address: signer,
75
90
  invoke: &MockAuthInvoke {
76
91
  contract: &oapp_client.address,
77
92
  fn_name: "set_peer",
78
- args: (&REMOTE_EID, &test_peer_option).into_val(&env),
93
+ args: (&eid, peer).into_val(env),
94
+ sub_invokes: &[],
95
+ },
96
+ }]);
97
+ oapp_client.set_peer(&eid, peer);
98
+ }
99
+
100
+ fn set_delegate_with_auth(env: &Env, signer: &Address, oapp_client: &DummyOAppClient<'_>, delegate: &Option<Address>) {
101
+ env.mock_auths(&[MockAuth {
102
+ address: signer,
103
+ invoke: &MockAuthInvoke {
104
+ contract: &oapp_client.address,
105
+ fn_name: "set_delegate",
106
+ args: (delegate,).into_val(env),
79
107
  sub_invokes: &[],
80
108
  },
81
109
  }]);
82
- oapp_client.set_peer(&REMOTE_EID, &test_peer_option);
110
+ oapp_client.set_delegate(delegate);
111
+ }
83
112
 
84
- // assert event
85
- assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(test_peer.clone()) });
113
+ #[test]
114
+ fn test_constructor_initializes_owner_and_endpoint_and_clears_delegate() {
115
+ let TestSetup { env, owner, endpoint, oapp_client } = setup();
116
+
117
+ // owner initialized via oapp_initialize -> init_owner
118
+ assert_eq!(Some(owner), oapp_client.owner());
86
119
 
87
- // Test getting peer for set eid
88
- let retrieved_peer = oapp_client.peer(&REMOTE_EID);
89
- assert_eq!(Some(test_peer), retrieved_peer);
120
+ // endpoint stored via OAppCoreStorage::set_endpoint
121
+ assert_eq!(endpoint, oapp_client.endpoint());
90
122
 
91
- // Test getting peer for unset eid
92
- let retrieved_peer = oapp_client.peer(&UNSET_EID);
93
- assert_eq!(None, retrieved_peer);
123
+ // delegate set via oapp_initialize(..., &None) -> endpoint.set_delegate(..., None)
124
+ let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
125
+ assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
94
126
  }
95
127
 
96
128
  #[test]
97
- #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
98
- fn test_set_peer_unauthorized() {
99
- let TestSetup { env, oapp_client, .. } = setup();
100
-
101
- let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
102
- oapp_client.set_peer(&REMOTE_EID, &Some(test_peer));
129
+ fn test_oapp_version_defaults_to_zero() {
130
+ let TestSetup { oapp_client, .. } = setup();
131
+ assert_eq!((1, 1), oapp_client.oapp_version());
103
132
  }
104
133
 
105
134
  #[test]
106
- fn test_get_peer_success() {
107
- let TestSetup { env, oapp_client, .. } = setup();
108
- env.mock_all_auths();
135
+ fn test_peer_lifecycle_set_get_update_remove_and_events() {
136
+ let TestSetup { env, owner, oapp_client, .. } = setup();
109
137
 
110
- let test_peer: BytesN<32> = BytesN::from_array(&env, &[1; 32]);
111
- oapp_client.set_peer(&REMOTE_EID, &Some(test_peer.clone()));
138
+ // Unset cases
139
+ assert_eq!(None, oapp_client.peer(&UNSET_EID));
140
+ assert_eq!(None, oapp_client.peer(&REMOTE_EID));
112
141
 
113
- let retrieved_peer = oapp_client.peer(&REMOTE_EID);
114
- assert_eq!(Some(test_peer), retrieved_peer);
115
- }
142
+ // Set peer v1
143
+ let peer_v1: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
144
+ let peer_v1_option = Some(peer_v1.clone());
145
+ set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v1_option);
116
146
 
117
- #[test]
118
- fn test_get_peer_returns_none_for_unset_eid() {
119
- let TestSetup { oapp_client, .. } = setup();
147
+ assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v1.clone()) });
148
+ assert_eq!(Some(peer_v1), oapp_client.peer(&REMOTE_EID));
149
+ assert_eq!(None, oapp_client.peer(&UNSET_EID));
120
150
 
121
- let result = oapp_client.peer(&UNSET_EID);
122
- assert_eq!(result, None);
151
+ // Update to peer v2
152
+ let peer_v2: BytesN<32> = BytesN::from_array(&env, &[2; 32]);
153
+ let peer_v2_option = Some(peer_v2.clone());
154
+ set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v2_option);
155
+
156
+ assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v2.clone()) });
157
+ assert_eq!(Some(peer_v2), oapp_client.peer(&REMOTE_EID));
158
+
159
+ // Remove peer
160
+ let none_peer: Option<BytesN<32>> = None;
161
+ set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &none_peer);
162
+ assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: None });
163
+ assert_eq!(None, oapp_client.peer(&REMOTE_EID));
123
164
  }
124
165
 
125
166
  #[test]
126
- fn test_update_peer() {
167
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
168
+ fn test_set_peer_unauthorized() {
127
169
  let TestSetup { env, oapp_client, .. } = setup();
128
- env.mock_all_auths();
129
170
 
130
- // Set initial peer
131
- let initial_peer: BytesN<32> = BytesN::from_array(&env, &[1; 32]);
132
- oapp_client.set_peer(&REMOTE_EID, &Some(initial_peer));
171
+ let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
172
+ oapp_client.set_peer(&REMOTE_EID, &Some(test_peer));
173
+ }
133
174
 
134
- // Update to new peer
135
- let updated_peer: BytesN<32> = BytesN::from_array(&env, &[2; 32]);
136
- oapp_client.set_peer(&REMOTE_EID, &Some(updated_peer.clone()));
175
+ #[test]
176
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
177
+ fn test_set_peer_non_owner_authorized() {
178
+ let TestSetup { env, owner, oapp_client, .. } = setup();
179
+ let non_owner = Address::generate(&env);
180
+ assert!(non_owner != owner);
137
181
 
138
- let retrieved_peer = oapp_client.peer(&REMOTE_EID);
139
- assert_eq!(Some(updated_peer), retrieved_peer);
182
+ let peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
183
+ let peer_option = Some(peer);
184
+ set_peer_with_auth(&env, &non_owner, &oapp_client, REMOTE_EID, &peer_option);
140
185
  }
141
186
 
142
187
  #[test]
143
- fn test_set_delegate() {
144
- let TestSetup { env, owner, oapp_client, .. } = setup();
188
+ fn test_set_delegate_updates_and_clears_endpoint_delegate() {
189
+ let TestSetup { env, owner, endpoint, oapp_client } = setup();
145
190
 
146
191
  let delegate = Address::generate(&env);
147
192
  let delegate_option = Some(delegate.clone());
148
- env.mock_auths(&[MockAuth {
149
- address: &owner,
150
- invoke: &MockAuthInvoke {
151
- contract: &oapp_client.address,
152
- fn_name: "set_delegate",
153
- args: (&delegate_option,).into_val(&env),
154
- sub_invokes: &[],
155
- },
156
- }]);
157
- oapp_client.set_delegate(&delegate_option);
193
+ set_delegate_with_auth(&env, &owner, &oapp_client, &delegate_option);
194
+
195
+ let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
196
+ assert_eq!(Some(delegate), endpoint_client.get_delegate(&oapp_client.address));
197
+
198
+ // Clear delegate
199
+ let none_delegate: Option<Address> = None;
200
+ set_delegate_with_auth(&env, &owner, &oapp_client, &none_delegate);
201
+ assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
158
202
  }
159
203
 
160
204
  #[test]
@@ -167,9 +211,13 @@ fn test_set_delegate_unauthorized() {
167
211
  }
168
212
 
169
213
  #[test]
170
- fn test_get_endpoint() {
171
- let TestSetup { endpoint, oapp_client, .. } = setup();
214
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
215
+ fn test_set_delegate_non_owner_authorized() {
216
+ let TestSetup { env, owner, oapp_client, .. } = setup();
217
+ let non_owner = Address::generate(&env);
218
+ assert!(non_owner != owner);
172
219
 
173
- let retrieved_endpoint = oapp_client.endpoint();
174
- assert_eq!(endpoint, retrieved_endpoint);
220
+ let delegate = Address::generate(&env);
221
+ let delegate_option = Some(delegate);
222
+ set_delegate_with_auth(&env, &non_owner, &oapp_client, &delegate_option);
175
223
  }
@@ -1,5 +1,6 @@
1
1
  use crate::{
2
2
  self as oapp,
3
+ errors::OAppError,
3
4
  oapp_core::OAppCore,
4
5
  oapp_options_type3::{EnforcedOptionParam, EnforcedOptionSet},
5
6
  oapp_receiver::{LzReceiveInternal, OAppReceiver},
@@ -83,40 +84,82 @@ fn create_valid_options(env: &Env, data: &[u8]) -> Bytes {
83
84
  buffer
84
85
  }
85
86
 
86
- #[test]
87
- fn test_set_and_get_enforced_options() {
88
- let TestSetup { env, owner, oapp_client, .. } = setup();
89
-
90
- // Create enforced options for different eid/msg_type combinations
91
- let options1 = create_valid_options(&env, &[1, 2, 3, 4]);
92
- let options2 = create_valid_options(&env, &[5, 6, 7, 8]);
93
-
94
- let enforced_params = vec![
95
- &env,
96
- EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: options1.clone() },
97
- EnforcedOptionParam { eid: REMOTE_EID_2, msg_type: MSG_TYPE_RECEIVE, options: options2.clone() },
98
- ];
87
+ fn set_enforced_options_with_auth(
88
+ env: &Env,
89
+ signer: &Address,
90
+ oapp_client: &DummyOAppOptionsType3Client<'_>,
91
+ enforced_params: &soroban_sdk::Vec<EnforcedOptionParam>,
92
+ ) {
99
93
  env.mock_auths(&[MockAuth {
100
- address: &owner,
94
+ address: signer,
101
95
  invoke: &MockAuthInvoke {
102
96
  contract: &oapp_client.address,
103
97
  fn_name: "set_enforced_options",
104
- args: (&enforced_params,).into_val(&env),
98
+ args: (enforced_params,).into_val(env),
105
99
  sub_invokes: &[],
106
100
  },
107
101
  }]);
102
+ oapp_client.set_enforced_options(enforced_params);
103
+ }
108
104
 
109
- oapp_client.set_enforced_options(&enforced_params);
105
+ #[test]
106
+ fn test_enforced_options_lifecycle() {
107
+ let TestSetup { env, owner, oapp_client, .. } = setup();
108
+
109
+ // Unset returns empty
110
+ assert_eq!(oapp_client.enforced_options(&999, &999), Bytes::new(&env));
111
+
112
+ // Set enforced options for different eid/msg_type combinations
113
+ let enforced1 = create_valid_options(&env, &[1, 2, 3, 4]);
114
+ let enforced2 = create_valid_options(&env, &[5, 6, 7, 8]);
115
+ let enforced_params = vec![
116
+ &env,
117
+ EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced1.clone() },
118
+ EnforcedOptionParam { eid: REMOTE_EID_2, msg_type: MSG_TYPE_RECEIVE, options: enforced2.clone() },
119
+ ];
120
+ set_enforced_options_with_auth(&env, &owner, &oapp_client, &enforced_params);
110
121
 
111
122
  // assert events
112
123
  assert_event(&env, &oapp_client.address, EnforcedOptionSet { enforced_option_params: enforced_params.clone() });
113
124
 
114
125
  // Verify options were set correctly
115
- let retrieved1 = oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND);
116
- assert_eq!(retrieved1, options1);
126
+ assert_eq!(oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND), enforced1.clone());
127
+ assert_eq!(oapp_client.enforced_options(&REMOTE_EID_2, &MSG_TYPE_RECEIVE), enforced2.clone());
128
+
129
+ // Update enforced options for one combination
130
+ let updated = create_valid_options(&env, &[9, 8, 7, 6, 5]);
131
+ let update_params =
132
+ vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: updated.clone() }];
133
+ set_enforced_options_with_auth(&env, &owner, &oapp_client, &update_params);
134
+ assert_event(&env, &oapp_client.address, EnforcedOptionSet { enforced_option_params: update_params.clone() });
135
+ assert_eq!(oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND), updated);
136
+ }
137
+
138
+ #[test]
139
+ fn test_combine_options() {
140
+ let TestSetup { env, owner, oapp_client, .. } = setup();
141
+
142
+ // combine_options: no enforced -> returns extra (including empty)
143
+ let extra_only = create_valid_options(&env, &[9, 10, 11]);
144
+ assert_eq!(oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_only), extra_only);
145
+
146
+ let empty_extra = Bytes::new(&env);
147
+ assert_eq!(oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &empty_extra), empty_extra);
148
+
149
+ // Set enforced options for the combine tests
150
+ let enforced = create_valid_options(&env, &[1, 2, 3, 4]);
151
+ let enforced_params =
152
+ vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced.clone() }];
153
+ set_enforced_options_with_auth(&env, &owner, &oapp_client, &enforced_params);
117
154
 
118
- let retrieved2 = oapp_client.enforced_options(&REMOTE_EID_2, &MSG_TYPE_RECEIVE);
119
- assert_eq!(retrieved2, options2);
155
+ // combine_options: enforced present -> empty extra returns enforced
156
+ assert_eq!(oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &Bytes::new(&env)), enforced.clone());
157
+
158
+ // combine_options: both present -> enforced + extra(without its 2-byte header)
159
+ let extra: Bytes = create_valid_options(&env, &[4, 5, 6]);
160
+ let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra);
161
+ let expected_combined = create_valid_options(&env, &[1, 2, 3, 4, 4, 5, 6]);
162
+ assert_eq!(combined, expected_combined);
120
163
  }
121
164
 
122
165
  #[test]
@@ -131,82 +174,68 @@ fn test_set_enforced_options_unauthorized() {
131
174
  }
132
175
 
133
176
  #[test]
134
- fn test_combine_options_with_empty_enforced() {
135
- let TestSetup { env, oapp_client, .. } = setup();
136
-
137
- let extra_options = create_valid_options(&env, &[9, 10, 11]);
138
- // When no enforced options are set, should return extra options
139
- let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_options);
140
- assert_eq!(combined, extra_options);
141
- }
177
+ #[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
178
+ fn test_set_enforced_options_non_owner_authorized() {
179
+ let TestSetup { env, owner, oapp_client, .. } = setup();
180
+ let non_owner = Address::generate(&env);
181
+ assert!(non_owner != owner);
142
182
 
143
- #[test]
144
- fn test_combine_options_with_empty_extra() {
145
- let TestSetup { env, oapp_client, .. } = setup();
183
+ let options = create_valid_options(&env, &[1, 2, 3, 4]);
184
+ let enforced_params =
185
+ vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: options.clone() }];
146
186
 
147
- // This test now simply validates that empty extra options return empty result
148
- // when no enforced options are set
149
- let empty_extra = Bytes::new(&env);
150
- let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &empty_extra);
151
- assert_eq!(combined, empty_extra);
187
+ set_enforced_options_with_auth(&env, &non_owner, &oapp_client, &enforced_params);
152
188
  }
153
189
 
154
190
  #[test]
155
- fn test_combine_options_both_present() {
156
- let TestSetup { env, oapp_client, .. } = setup();
157
- env.mock_all_auths();
158
-
159
- let enforced = create_valid_options(&env, &[1, 2, 3]);
160
- oapp_client.set_enforced_options(&vec![
161
- &env,
162
- EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced.clone() },
163
- ]);
191
+ fn test_set_enforced_options_invalid_options_returns_error() {
192
+ let TestSetup { env, owner, oapp_client, .. } = setup();
164
193
 
165
- let extra = create_valid_options(&env, &[4, 5, 6]);
166
- let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra);
194
+ // wrong option type (not 3)
195
+ let mut invalid = Bytes::from_array(&env, &(4u16).to_be_bytes());
196
+ invalid.extend_from_slice(&[1, 2, 3]);
167
197
 
168
- let mut expected_combined = enforced;
169
- expected_combined.append(&extra.slice(2..));
198
+ let enforced_params =
199
+ vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: invalid }];
170
200
 
171
- // Should return extra options when no enforced options exist
172
- assert_eq!(combined, expected_combined);
201
+ env.mock_auths(&[MockAuth {
202
+ address: &owner,
203
+ invoke: &MockAuthInvoke {
204
+ contract: &oapp_client.address,
205
+ fn_name: "set_enforced_options",
206
+ args: (&enforced_params,).into_val(&env),
207
+ sub_invokes: &[],
208
+ },
209
+ }]);
210
+ let result = oapp_client.try_set_enforced_options(&enforced_params);
211
+ assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::InvalidOptions.into());
173
212
  }
174
213
 
175
214
  #[test]
176
- fn test_update_enforced_options() {
177
- let TestSetup { env, oapp_client, .. } = setup();
178
- env.mock_all_auths();
179
-
180
- // Set initial options
181
- let initial_options = create_valid_options(&env, &[1, 2, 3]);
182
- let params = vec![
183
- &env,
184
- EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: initial_options.clone() },
185
- ];
186
- oapp_client.set_enforced_options(&params);
187
-
188
- // Verify initial options
189
- let retrieved = oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND);
190
- assert_eq!(retrieved, initial_options);
191
-
192
- // Update with new options
193
- let updated_options = create_valid_options(&env, &[9, 8, 7, 6, 5]);
194
- let update_params = vec![
195
- &env,
196
- EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: updated_options.clone() },
197
- ];
198
- oapp_client.set_enforced_options(&update_params);
215
+ fn test_combine_options_extra_invalid_type_returns_error_when_enforced_present() {
216
+ let TestSetup { env, owner, oapp_client, .. } = setup();
199
217
 
200
- // Verify options were updated
201
- let retrieved_after_update = oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND);
202
- assert_eq!(retrieved_after_update, updated_options);
218
+ let enforced = create_valid_options(&env, &[1, 2, 3]);
219
+ let params = vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced }];
220
+ set_enforced_options_with_auth(&env, &owner, &oapp_client, &params);
221
+
222
+ // extra has wrong option type (not 3) but len >= 2 -> validated and should panic
223
+ let mut extra_invalid = Bytes::from_array(&env, &(4u16).to_be_bytes());
224
+ extra_invalid.extend_from_slice(&[9, 9, 9]);
225
+ let result = oapp_client.try_combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_invalid);
226
+ assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::InvalidOptions.into());
203
227
  }
204
228
 
205
229
  #[test]
206
- fn test_get_enforced_options_for_unset_combination() {
207
- let TestSetup { env, oapp_client, .. } = setup();
230
+ fn test_combine_options_extra_too_short_returns_error_when_enforced_present() {
231
+ let TestSetup { env, owner, oapp_client, .. } = setup();
232
+
233
+ let enforced = create_valid_options(&env, &[1, 2, 3]);
234
+ let params = vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced }];
235
+ set_enforced_options_with_auth(&env, &owner, &oapp_client, &params);
208
236
 
209
- // Try to get options for an eid/msg_type that hasn't been set
210
- let result = oapp_client.enforced_options(&999, &999);
211
- assert_eq!(result, Bytes::new(&env));
237
+ // extra is non-empty but len < 2 -> should panic
238
+ let extra_too_short = Bytes::from_array(&env, &[1u8]);
239
+ let result = oapp_client.try_combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_too_short);
240
+ assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::InvalidOptions.into());
212
241
  }