@layerzerolabs/protocol-stellar-v2 0.2.15 → 0.2.19

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 (262) hide show
  1. package/.turbo/turbo-build.log +365 -297
  2. package/.turbo/turbo-lint.log +142 -110
  3. package/.turbo/turbo-test.log +1273 -1222
  4. package/Cargo.lock +20 -5
  5. package/Cargo.toml +4 -1
  6. package/contracts/ERROR_SPEC.md +44 -0
  7. package/contracts/common-macros/src/auth.rs +113 -0
  8. package/contracts/common-macros/src/contract_ttl.rs +84 -0
  9. package/contracts/common-macros/src/lib.rs +181 -30
  10. package/contracts/common-macros/src/lz_contract.rs +83 -0
  11. package/contracts/common-macros/src/tests/{ownable.rs → auth.rs} +48 -15
  12. package/contracts/common-macros/src/tests/contract_ttl.rs +662 -0
  13. package/contracts/common-macros/src/tests/mod.rs +2 -2
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_multisig_code.snap +20 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__auth__snapshot_generated_ownable_code.snap +24 -0
  16. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap → common_macros__tests__auth__snapshot_only_auth_preserves_function_signature.snap} +4 -4
  17. package/contracts/common-macros/src/tests/snapshots/{common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap → common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap} +3 -3
  18. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contracttrait_code.snap +69 -0
  19. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +7 -21
  20. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +2 -2
  21. package/contracts/common-macros/src/ttl_configurable.rs +19 -34
  22. package/contracts/common-macros/src/ttl_extendable.rs +36 -0
  23. package/contracts/common-macros/src/upgradeable.rs +5 -5
  24. package/contracts/common-macros/src/utils.rs +9 -0
  25. package/contracts/endpoint-v2/src/constants.rs +4 -4
  26. package/contracts/endpoint-v2/src/endpoint_v2.rs +38 -40
  27. package/contracts/endpoint-v2/src/errors.rs +4 -3
  28. package/contracts/endpoint-v2/src/events.rs +1 -1
  29. package/contracts/endpoint-v2/src/message_lib_manager.rs +18 -5
  30. package/contracts/endpoint-v2/src/messaging_channel.rs +11 -1
  31. package/contracts/endpoint-v2/src/messaging_composer.rs +11 -1
  32. package/contracts/endpoint-v2/src/storage.rs +1 -1
  33. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +3 -3
  34. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +1 -1
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +2 -2
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +3 -3
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +4 -4
  38. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +3 -3
  39. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +1 -1
  40. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +3 -3
  41. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +1 -1
  42. package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +4 -4
  43. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +1 -1
  44. package/contracts/layerzero-views/src/layerzero_view.rs +3 -6
  45. package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +2 -2
  46. package/contracts/macro-integration-tests/tests/runtime/ownable/{only_owner_guard.rs → only_auth_guard.rs} +1 -1
  47. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +1 -1
  48. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +1 -1
  49. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +0 -1
  50. package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.rs → only_auth_missing_env.rs} +3 -3
  51. package/contracts/macro-integration-tests/tests/ui/ownable/fail/{only_owner_missing_env.stderr → only_auth_missing_env.stderr} +4 -4
  52. package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +2 -3
  53. package/contracts/macro-integration-tests/tests/ui/ownable/pass/{only_owner_env_param_variants.rs → only_auth_env_param_variants.rs} +9 -9
  54. package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +6 -6
  55. package/contracts/message-libs/message-lib-common/src/errors.rs +7 -2
  56. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +3 -3
  57. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +1 -2
  58. package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +1 -2
  59. package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +9 -9
  60. package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +1 -1
  61. package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +1 -1
  62. package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +2 -2
  63. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +7 -9
  64. package/contracts/message-libs/treasury/src/errors.rs +2 -2
  65. package/contracts/message-libs/treasury/src/events.rs +1 -1
  66. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +2 -2
  67. package/contracts/message-libs/treasury/src/storage.rs +1 -1
  68. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +1 -1
  69. package/contracts/message-libs/treasury/src/treasury.rs +14 -16
  70. package/contracts/message-libs/uln-302/src/receive_uln.rs +13 -2
  71. package/contracts/message-libs/uln-302/src/send_uln.rs +24 -4
  72. package/contracts/message-libs/uln-302/src/uln302.rs +6 -24
  73. package/contracts/oapps/counter/Cargo.toml +14 -1
  74. package/contracts/oapps/counter/integration_tests/mod.rs +4 -1
  75. package/contracts/oapps/counter/integration_tests/{setup.rs → setup_sml.rs} +48 -80
  76. package/contracts/oapps/counter/integration_tests/setup_uln.rs +997 -0
  77. package/contracts/oapps/counter/integration_tests/signing.rs +62 -0
  78. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +24 -55
  79. package/contracts/oapps/counter/integration_tests/test_with_uln.rs +314 -0
  80. package/contracts/oapps/counter/integration_tests/utils.rs +196 -53
  81. package/contracts/oapps/counter/src/counter.rs +67 -43
  82. package/contracts/oapps/counter/src/tests/mod.rs +0 -13
  83. package/contracts/oapps/counter/src/tests/test_counter.rs +5 -7
  84. package/contracts/oapps/oapp/src/errors.rs +5 -1
  85. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +93 -78
  86. package/contracts/oapps/oapp/src/oapp_core.rs +36 -21
  87. package/contracts/oapps/oapp/src/oapp_options_type3.rs +48 -12
  88. package/contracts/oapps/oapp/src/oapp_receiver.rs +106 -41
  89. package/contracts/oapps/oapp/src/oapp_sender.rs +26 -34
  90. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +9 -8
  91. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +25 -17
  92. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +7 -7
  93. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +14 -15
  94. package/contracts/oapps/oapp-macros/src/generators.rs +128 -0
  95. package/contracts/oapps/oapp-macros/src/lib.rs +113 -56
  96. package/contracts/oapps/oft/Cargo.toml +10 -7
  97. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
  98. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
  99. package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
  100. package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
  101. package/contracts/oapps/oft/integration-tests/setup.rs +29 -110
  102. package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
  103. package/contracts/oapps/oft/src/extensions/oft_fee.rs +13 -14
  104. package/contracts/oapps/oft/src/extensions/pausable.rs +4 -4
  105. package/contracts/oapps/oft/src/extensions/rate_limiter.rs +5 -5
  106. package/contracts/oapps/oft/src/lib.rs +11 -13
  107. package/contracts/oapps/oft/src/oft.rs +147 -225
  108. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -13
  109. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +31 -14
  110. package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
  111. package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
  112. package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
  113. package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +129 -30
  114. package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
  115. package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
  116. package/contracts/oapps/oft-core/src/errors.rs +13 -0
  117. package/contracts/oapps/oft-core/src/lib.rs +18 -0
  118. package/contracts/oapps/oft-core/src/oft_core.rs +439 -0
  119. package/contracts/oapps/{oft → oft-core}/src/storage.rs +2 -0
  120. package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
  121. package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +2 -2
  122. package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
  123. package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -5
  124. package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
  125. package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +78 -37
  126. package/contracts/oapps/oft-core/src/types.rs +58 -0
  127. package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
  128. package/contracts/upgrader/src/lib.rs +4 -4
  129. package/contracts/utils/src/auth.rs +44 -0
  130. package/contracts/utils/src/errors.rs +31 -5
  131. package/contracts/utils/src/lib.rs +3 -0
  132. package/contracts/utils/src/multisig.rs +211 -0
  133. package/contracts/utils/src/ownable.rs +137 -13
  134. package/contracts/utils/src/tests/buffer_reader.rs +6 -6
  135. package/contracts/utils/src/tests/buffer_writer.rs +6 -6
  136. package/contracts/utils/src/tests/bytes_ext.rs +2 -4
  137. package/contracts/utils/src/tests/mod.rs +1 -0
  138. package/contracts/utils/src/tests/multisig.rs +731 -0
  139. package/contracts/utils/src/tests/option_ext.rs +2 -5
  140. package/contracts/utils/src/tests/ownable.rs +456 -7
  141. package/contracts/utils/src/tests/ttl_configurable.rs +27 -16
  142. package/contracts/utils/src/tests/upgradeable.rs +4 -2
  143. package/contracts/utils/src/ttl_configurable.rs +23 -8
  144. package/contracts/utils/src/ttl_extendable.rs +27 -0
  145. package/contracts/utils/src/upgradeable.rs +2 -0
  146. package/contracts/workers/dvn/Cargo.toml +1 -1
  147. package/contracts/workers/dvn/src/auth.rs +7 -7
  148. package/contracts/workers/dvn/src/dvn.rs +10 -38
  149. package/contracts/workers/dvn/src/errors.rs +0 -7
  150. package/contracts/workers/dvn/src/events.rs +1 -14
  151. package/contracts/workers/dvn/src/interfaces/dvn.rs +2 -2
  152. package/contracts/workers/dvn/src/interfaces/mod.rs +0 -2
  153. package/contracts/workers/dvn/src/storage.rs +3 -13
  154. package/contracts/workers/dvn/src/tests/auth.rs +4 -4
  155. package/contracts/workers/dvn/src/tests/dvn.rs +1 -2
  156. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +7 -8
  157. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +11 -8
  158. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +11 -12
  159. package/contracts/workers/dvn/src/tests/setup.rs +5 -5
  160. package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
  161. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -6
  162. package/contracts/workers/executor/src/auth.rs +80 -16
  163. package/contracts/workers/executor/src/executor.rs +5 -31
  164. package/contracts/workers/executor/src/storage.rs +2 -9
  165. package/contracts/workers/executor-fee-lib/Cargo.toml +1 -1
  166. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +3 -6
  167. package/contracts/workers/executor-helper/Cargo.toml +1 -1
  168. package/contracts/workers/executor-helper/src/executor_helper.rs +53 -73
  169. package/contracts/workers/price-feed/Cargo.toml +1 -1
  170. package/contracts/workers/price-feed/src/price_feed.rs +7 -10
  171. package/contracts/workers/worker/src/errors.rs +4 -0
  172. package/contracts/workers/worker/src/tests/worker.rs +7 -6
  173. package/contracts/workers/worker/src/worker.rs +20 -16
  174. package/package.json +7 -5
  175. package/sdk/.turbo/turbo-build.log +1 -0
  176. package/sdk/.turbo/turbo-test.log +1019 -0
  177. package/sdk/dist/generated/bml.d.ts +95 -8
  178. package/sdk/dist/generated/bml.js +95 -36
  179. package/sdk/dist/generated/counter.d.ts +289 -44
  180. package/sdk/dist/generated/counter.js +119 -49
  181. package/sdk/dist/generated/dvn.d.ts +312 -229
  182. package/sdk/dist/generated/dvn.js +144 -83
  183. package/sdk/dist/generated/dvn_fee_lib.d.ts +258 -63
  184. package/sdk/dist/generated/dvn_fee_lib.js +95 -26
  185. package/sdk/dist/generated/endpoint.d.ts +219 -24
  186. package/sdk/dist/generated/endpoint.js +108 -41
  187. package/sdk/dist/generated/executor.d.ts +239 -87
  188. package/sdk/dist/generated/executor.js +135 -63
  189. package/sdk/dist/generated/executor_fee_lib.d.ts +278 -74
  190. package/sdk/dist/generated/executor_fee_lib.js +135 -59
  191. package/sdk/dist/generated/executor_helper.d.ts +163 -21
  192. package/sdk/dist/generated/executor_helper.js +124 -52
  193. package/sdk/dist/generated/oft.d.ts +1842 -0
  194. package/sdk/dist/generated/oft.js +345 -0
  195. package/sdk/dist/generated/price_feed.d.ts +258 -63
  196. package/sdk/dist/generated/price_feed.js +95 -26
  197. package/sdk/dist/generated/sml.d.ts +235 -34
  198. package/sdk/dist/generated/sml.js +126 -53
  199. package/sdk/dist/generated/treasury.d.ts +1016 -0
  200. package/sdk/dist/generated/treasury.js +248 -0
  201. package/sdk/dist/generated/uln302.d.ts +235 -34
  202. package/sdk/dist/generated/uln302.js +126 -53
  203. package/sdk/dist/generated/upgrader.d.ts +17 -2
  204. package/sdk/dist/generated/upgrader.js +19 -1
  205. package/sdk/dist/index.d.ts +2 -1
  206. package/sdk/dist/index.js +2 -1
  207. package/sdk/package.json +6 -3
  208. package/sdk/src/index.ts +2 -1
  209. package/sdk/test/counter-sml.test.ts +376 -0
  210. package/sdk/test/counter-uln.test.ts +493 -0
  211. package/sdk/test/{oft.test.ts → oft-sml.test.ts} +196 -321
  212. package/sdk/test/suites/constants.ts +22 -2
  213. package/sdk/test/suites/globalSetup.ts +450 -0
  214. package/sdk/test/suites/localnet.ts +23 -6
  215. package/sdk/test/upgrader.test.ts +7 -16
  216. package/sdk/test/utils.ts +558 -85
  217. package/sdk/turbo.json +8 -0
  218. package/sdk/vitest.config.ts +21 -0
  219. package/tools/ts-bindings-gen/Cargo.toml +2 -0
  220. package/tools/ts-bindings-gen/src/main.rs +52 -4
  221. package/contracts/common-macros/src/contract_impl.rs +0 -52
  222. package/contracts/common-macros/src/ownable.rs +0 -41
  223. package/contracts/common-macros/src/tests/contract_impl.rs +0 -386
  224. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +0 -12
  225. package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +0 -50
  226. package/contracts/oapps/oapp-macros/src/oapp_core.rs +0 -41
  227. package/contracts/oapps/oapp-macros/src/oapp_full.rs +0 -21
  228. package/contracts/oapps/oapp-macros/src/oapp_options_type3.rs +0 -31
  229. package/contracts/oapps/oapp-macros/src/oapp_receiver.rs +0 -48
  230. package/contracts/oapps/oapp-macros/src/oapp_sender.rs +0 -21
  231. package/contracts/oapps/oapp-macros/src/util.rs +0 -107
  232. package/contracts/oapps/oft/src/constants.rs +0 -5
  233. package/contracts/oapps/oft/src/default_oft_impl.rs +0 -152
  234. package/contracts/oapps/oft/src/errors.rs +0 -8
  235. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
  236. package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
  237. package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
  238. package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -903
  239. package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -749
  240. package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -432
  241. package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1078
  242. package/contracts/oapps/oft/src/types.rs +0 -38
  243. package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
  244. package/contracts/oapps/oft-std/src/lib.rs +0 -16
  245. package/contracts/oapps/oft-std/src/oft.rs +0 -156
  246. package/contracts/workers/dvn/src/interfaces/multisig.rs +0 -56
  247. package/contracts/workers/dvn/src/multisig.rs +0 -157
  248. package/sdk/dist/generated/oft_std.d.ts +0 -1544
  249. package/sdk/dist/generated/oft_std.js +0 -271
  250. package/sdk/test/index.test.ts +0 -375
  251. /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
  252. /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
  253. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
  254. /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
  255. /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
  256. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
  257. /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
  258. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
  259. /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
  260. /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
  261. /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
  262. /package/sdk/test/suites/{testUpgradeable.ts → dummyContractClient.ts} +0 -0
@@ -1,9 +1,6 @@
1
+ use crate::{errors::OwnableError, option_ext::OptionExt, tests::test_helper::assert_panics_contains};
1
2
  use soroban_sdk::Env;
2
3
 
3
- use crate::{errors::OwnableError, option_ext::OptionExt};
4
-
5
- use crate::tests::test_helper::assert_panics_contains;
6
-
7
4
  #[test]
8
5
  fn unwrap_or_panic_some_returns_value() {
9
6
  let env = Env::default();
@@ -13,7 +10,7 @@ fn unwrap_or_panic_some_returns_value() {
13
10
 
14
11
  #[test]
15
12
  fn unwrap_or_panic_none_panics_with_error() {
16
- const EXPECTED: &str = "Error(Contract, #1301)";
13
+ const EXPECTED: &str = "Error(Contract, #1034)"; // OwnerNotSet
17
14
  assert_panics_contains("none unwrap_or_panic", EXPECTED, || {
18
15
  let env = Env::default();
19
16
  let _got: u32 = None::<u32>.unwrap_or_panic(&env, OwnableError::OwnerNotSet);
@@ -1,5 +1,11 @@
1
1
  use crate::{
2
- ownable::{self, Ownable, OwnableInitializer, OwnableStorage, OwnershipRenounced, OwnershipTransferred},
2
+ auth::Auth,
3
+ errors::OwnableError,
4
+ option_ext::OptionExt,
5
+ ownable::{
6
+ self, Ownable, OwnableInitializer, OwnableStorage, OwnershipRenounced, OwnershipTransferred,
7
+ OwnershipTransferring,
8
+ },
3
9
  testing_utils::assert_event,
4
10
  };
5
11
  use soroban_sdk::{
@@ -35,6 +41,14 @@ impl Contract {
35
41
  }
36
42
  }
37
43
 
44
+ /// Auth implementation for the test contract - uses stored owner as authorizer.
45
+ #[contractimpl]
46
+ impl Auth for Contract {
47
+ fn authorizer(env: &Env) -> Address {
48
+ <Self as Ownable>::owner(env).unwrap_or_panic(env, OwnableError::OwnerNotSet)
49
+ }
50
+ }
51
+
38
52
  #[contractimpl(contracttrait)]
39
53
  impl Ownable for Contract {}
40
54
  impl OwnableInitializer for Contract {}
@@ -76,7 +90,7 @@ fn auth_non_owner_cannot_call() {
76
90
  }
77
91
 
78
92
  #[test]
79
- #[should_panic(expected = "Error(Contract, #1301)")]
93
+ #[should_panic(expected = "Error(Contract, #1034)")] // OwnerNotSet
80
94
  fn auth_require_owner_when_no_owner_set() {
81
95
  let env = Env::default();
82
96
  let owner = Address::generate(&env);
@@ -98,7 +112,7 @@ fn auth_require_owner_when_no_owner_set() {
98
112
  }
99
113
 
100
114
  // ============================================
101
- // transfer: Transfer ownership tests
115
+ // transfer: Single-step transfer ownership tests
102
116
  // ============================================
103
117
 
104
118
  #[test]
@@ -154,7 +168,7 @@ fn transfer_ownership_to_same_owner() {
154
168
  }
155
169
 
156
170
  #[test]
157
- #[should_panic(expected = "Error(Contract, #1301)")]
171
+ #[should_panic(expected = "Error(Contract, #1034)")] // OwnerNotSet
158
172
  fn transfer_after_renounce_fails() {
159
173
  let env = Env::default();
160
174
  let owner = Address::generate(&env);
@@ -188,6 +202,343 @@ fn transfer_after_renounce_fails() {
188
202
  client.transfer_ownership(&new_owner);
189
203
  }
190
204
 
205
+ #[test]
206
+ #[should_panic(expected = "Error(Contract, #1035)")] // TransferInProgress
207
+ fn transfer_ownership_blocked_during_2step() {
208
+ let env = Env::default();
209
+ let owner = Address::generate(&env);
210
+ let new_owner = Address::generate(&env);
211
+ let another_owner = Address::generate(&env);
212
+
213
+ let contract = env.register(Contract, (&owner,));
214
+ let client = ContractClient::new(&env, &contract);
215
+
216
+ let ttl = 1000u32;
217
+
218
+ // Initiate 2-step transfer
219
+ env.mock_auths(&[MockAuth {
220
+ address: &owner,
221
+ invoke: &MockAuthInvoke {
222
+ contract: &contract,
223
+ args: (&new_owner, ttl).into_val(&env),
224
+ fn_name: "propose_ownership_transfer",
225
+ sub_invokes: &[],
226
+ },
227
+ }]);
228
+ client.propose_ownership_transfer(&new_owner, &ttl);
229
+
230
+ // Try single-step transfer - should fail
231
+ env.mock_auths(&[MockAuth {
232
+ address: &owner,
233
+ invoke: &MockAuthInvoke {
234
+ contract: &contract,
235
+ args: (&another_owner,).into_val(&env),
236
+ fn_name: "transfer_ownership",
237
+ sub_invokes: &[],
238
+ },
239
+ }]);
240
+ client.transfer_ownership(&another_owner);
241
+ }
242
+
243
+ // ============================================
244
+ // transfer_2step: Two-step transfer ownership tests
245
+ // ============================================
246
+
247
+ #[test]
248
+ fn propose_ownership_transfer_initiate_and_accept() {
249
+ let env = Env::default();
250
+ let owner = Address::generate(&env);
251
+ let new_owner = Address::generate(&env);
252
+
253
+ let contract = env.register(Contract, (&owner,));
254
+ let client = ContractClient::new(&env, &contract);
255
+
256
+ let ttl = 1000u32;
257
+
258
+ assert_eq!(client.owner(), Some(owner.clone()));
259
+ assert_eq!(client.pending_owner(), None);
260
+
261
+ // Step 1: Initiate transfer
262
+ env.mock_auths(&[MockAuth {
263
+ address: &owner,
264
+ invoke: &MockAuthInvoke {
265
+ contract: &contract,
266
+ args: (&new_owner, ttl).into_val(&env),
267
+ fn_name: "propose_ownership_transfer",
268
+ sub_invokes: &[],
269
+ },
270
+ }]);
271
+ client.propose_ownership_transfer(&new_owner, &ttl);
272
+
273
+ assert_event(
274
+ &env,
275
+ &contract,
276
+ OwnershipTransferring { old_owner: owner.clone(), new_owner: new_owner.clone(), ttl },
277
+ );
278
+ assert_eq!(client.owner(), Some(owner.clone())); // Still old owner
279
+ assert_eq!(client.pending_owner(), Some(new_owner.clone()));
280
+
281
+ // Step 2: Accept transfer
282
+ env.mock_auths(&[MockAuth {
283
+ address: &new_owner,
284
+ invoke: &MockAuthInvoke {
285
+ contract: &contract,
286
+ args: ().into_val(&env),
287
+ fn_name: "accept_ownership",
288
+ sub_invokes: &[],
289
+ },
290
+ }]);
291
+ client.accept_ownership();
292
+
293
+ assert_event(&env, &contract, OwnershipTransferred { old_owner: owner, new_owner: new_owner.clone() });
294
+ assert_eq!(client.owner(), Some(new_owner)); // Now new owner
295
+ assert_eq!(client.pending_owner(), None);
296
+ }
297
+
298
+ #[test]
299
+ fn propose_ownership_transfer_cancel() {
300
+ let env = Env::default();
301
+ let owner = Address::generate(&env);
302
+ let new_owner = Address::generate(&env);
303
+
304
+ let contract = env.register(Contract, (&owner,));
305
+ let client = ContractClient::new(&env, &contract);
306
+
307
+ let ttl = 1000u32;
308
+
309
+ // Initiate transfer
310
+ env.mock_auths(&[MockAuth {
311
+ address: &owner,
312
+ invoke: &MockAuthInvoke {
313
+ contract: &contract,
314
+ args: (&new_owner, ttl).into_val(&env),
315
+ fn_name: "propose_ownership_transfer",
316
+ sub_invokes: &[],
317
+ },
318
+ }]);
319
+ client.propose_ownership_transfer(&new_owner, &ttl);
320
+
321
+ assert_eq!(client.pending_owner(), Some(new_owner.clone()));
322
+
323
+ // Cancel transfer (ttl = 0)
324
+ env.mock_auths(&[MockAuth {
325
+ address: &owner,
326
+ invoke: &MockAuthInvoke {
327
+ contract: &contract,
328
+ args: (&new_owner, 0u32).into_val(&env),
329
+ fn_name: "propose_ownership_transfer",
330
+ sub_invokes: &[],
331
+ },
332
+ }]);
333
+ client.propose_ownership_transfer(&new_owner, &0u32);
334
+
335
+ // No event emitted on cancel (matching OpenZeppelin behavior)
336
+ assert_eq!(client.owner(), Some(owner)); // Still old owner
337
+ assert_eq!(client.pending_owner(), None);
338
+ }
339
+
340
+ #[test]
341
+ #[should_panic(expected = "Error(Contract, #1032)")] // NoPendingTransfer
342
+ fn propose_ownership_transfer_cancel_no_pending_fails() {
343
+ let env = Env::default();
344
+ let owner = Address::generate(&env);
345
+ let new_owner = Address::generate(&env);
346
+
347
+ let contract = env.register(Contract, (&owner,));
348
+ let client = ContractClient::new(&env, &contract);
349
+
350
+ // Try to cancel when no transfer is pending
351
+ env.mock_auths(&[MockAuth {
352
+ address: &owner,
353
+ invoke: &MockAuthInvoke {
354
+ contract: &contract,
355
+ args: (&new_owner, 0u32).into_val(&env),
356
+ fn_name: "propose_ownership_transfer",
357
+ sub_invokes: &[],
358
+ },
359
+ }]);
360
+ client.propose_ownership_transfer(&new_owner, &0u32);
361
+ }
362
+
363
+ #[test]
364
+ #[should_panic(expected = "Error(Contract, #1030)")] // InvalidPendingOwner
365
+ fn propose_ownership_transfer_cancel_wrong_address_fails() {
366
+ let env = Env::default();
367
+ let owner = Address::generate(&env);
368
+ let new_owner = Address::generate(&env);
369
+ let wrong_owner = Address::generate(&env);
370
+
371
+ let contract = env.register(Contract, (&owner,));
372
+ let client = ContractClient::new(&env, &contract);
373
+
374
+ let ttl = 1000u32;
375
+
376
+ // Initiate transfer
377
+ env.mock_auths(&[MockAuth {
378
+ address: &owner,
379
+ invoke: &MockAuthInvoke {
380
+ contract: &contract,
381
+ args: (&new_owner, ttl).into_val(&env),
382
+ fn_name: "propose_ownership_transfer",
383
+ sub_invokes: &[],
384
+ },
385
+ }]);
386
+ client.propose_ownership_transfer(&new_owner, &ttl);
387
+
388
+ // Try to cancel with wrong address
389
+ env.mock_auths(&[MockAuth {
390
+ address: &owner,
391
+ invoke: &MockAuthInvoke {
392
+ contract: &contract,
393
+ args: (&wrong_owner, 0u32).into_val(&env),
394
+ fn_name: "propose_ownership_transfer",
395
+ sub_invokes: &[],
396
+ },
397
+ }]);
398
+ client.propose_ownership_transfer(&wrong_owner, &0u32);
399
+ }
400
+
401
+ #[test]
402
+ #[should_panic(expected = "Error(Contract, #1031)")] // InvalidTtl
403
+ fn propose_ownership_transfer_invalid_ttl_exceeds_max_fails() {
404
+ let env = Env::default();
405
+ let owner = Address::generate(&env);
406
+ let new_owner = Address::generate(&env);
407
+
408
+ let contract = env.register(Contract, (&owner,));
409
+ let client = ContractClient::new(&env, &contract);
410
+
411
+ // TTL that would exceed max_live_until_ledger
412
+ let ttl = u32::MAX;
413
+
414
+ env.mock_auths(&[MockAuth {
415
+ address: &owner,
416
+ invoke: &MockAuthInvoke {
417
+ contract: &contract,
418
+ args: (&new_owner, ttl).into_val(&env),
419
+ fn_name: "propose_ownership_transfer",
420
+ sub_invokes: &[],
421
+ },
422
+ }]);
423
+ client.propose_ownership_transfer(&new_owner, &ttl);
424
+ }
425
+
426
+ #[test]
427
+ #[should_panic(expected = "Error(Contract, #1032)")] // NoPendingTransfer
428
+ fn accept_ownership_no_pending_fails() {
429
+ let env = Env::default();
430
+ let owner = Address::generate(&env);
431
+ let new_owner = Address::generate(&env);
432
+
433
+ let contract = env.register(Contract, (&owner,));
434
+ let client = ContractClient::new(&env, &contract);
435
+
436
+ // Try to accept when no transfer is pending
437
+ env.mock_auths(&[MockAuth {
438
+ address: &new_owner,
439
+ invoke: &MockAuthInvoke {
440
+ contract: &contract,
441
+ args: ().into_val(&env),
442
+ fn_name: "accept_ownership",
443
+ sub_invokes: &[],
444
+ },
445
+ }]);
446
+ client.accept_ownership();
447
+ }
448
+
449
+ #[test]
450
+ #[should_panic(expected = "Error(Auth, InvalidAction)")]
451
+ fn accept_ownership_wrong_address_fails() {
452
+ let env = Env::default();
453
+ let owner = Address::generate(&env);
454
+ let new_owner = Address::generate(&env);
455
+ let wrong_owner = Address::generate(&env);
456
+
457
+ let contract = env.register(Contract, (&owner,));
458
+ let client = ContractClient::new(&env, &contract);
459
+
460
+ let ttl = 1000u32;
461
+
462
+ // Initiate transfer
463
+ env.mock_auths(&[MockAuth {
464
+ address: &owner,
465
+ invoke: &MockAuthInvoke {
466
+ contract: &contract,
467
+ args: (&new_owner, ttl).into_val(&env),
468
+ fn_name: "propose_ownership_transfer",
469
+ sub_invokes: &[],
470
+ },
471
+ }]);
472
+ client.propose_ownership_transfer(&new_owner, &ttl);
473
+
474
+ // Try to accept with wrong address
475
+ env.mock_auths(&[MockAuth {
476
+ address: &wrong_owner,
477
+ invoke: &MockAuthInvoke {
478
+ contract: &contract,
479
+ args: ().into_val(&env),
480
+ fn_name: "accept_ownership",
481
+ sub_invokes: &[],
482
+ },
483
+ }]);
484
+ client.accept_ownership();
485
+ }
486
+
487
+ #[test]
488
+ fn propose_ownership_transfer_override_pending() {
489
+ let env = Env::default();
490
+ let owner = Address::generate(&env);
491
+ let new_owner1 = Address::generate(&env);
492
+ let new_owner2 = Address::generate(&env);
493
+
494
+ let contract = env.register(Contract, (&owner,));
495
+ let client = ContractClient::new(&env, &contract);
496
+
497
+ let ttl = 1000u32;
498
+
499
+ // Initiate first transfer
500
+ env.mock_auths(&[MockAuth {
501
+ address: &owner,
502
+ invoke: &MockAuthInvoke {
503
+ contract: &contract,
504
+ args: (&new_owner1, ttl).into_val(&env),
505
+ fn_name: "propose_ownership_transfer",
506
+ sub_invokes: &[],
507
+ },
508
+ }]);
509
+ client.propose_ownership_transfer(&new_owner1, &ttl);
510
+
511
+ assert_eq!(client.pending_owner(), Some(new_owner1.clone()));
512
+
513
+ // Override with second transfer (allowed - replaces pending)
514
+ env.mock_auths(&[MockAuth {
515
+ address: &owner,
516
+ invoke: &MockAuthInvoke {
517
+ contract: &contract,
518
+ args: (&new_owner2, ttl).into_val(&env),
519
+ fn_name: "propose_ownership_transfer",
520
+ sub_invokes: &[],
521
+ },
522
+ }]);
523
+ client.propose_ownership_transfer(&new_owner2, &ttl);
524
+
525
+ assert_eq!(client.pending_owner(), Some(new_owner2.clone()));
526
+
527
+ // new_owner2 can accept
528
+ env.mock_auths(&[MockAuth {
529
+ address: &new_owner2,
530
+ invoke: &MockAuthInvoke {
531
+ contract: &contract,
532
+ args: ().into_val(&env),
533
+ fn_name: "accept_ownership",
534
+ sub_invokes: &[],
535
+ },
536
+ }]);
537
+ client.accept_ownership();
538
+
539
+ assert_eq!(client.owner(), Some(new_owner2));
540
+ }
541
+
191
542
  // ============================================
192
543
  // renounce: Renounce ownership tests
193
544
  // ============================================
@@ -218,7 +569,7 @@ fn renounce_ownership_with_event() {
218
569
  }
219
570
 
220
571
  #[test]
221
- #[should_panic(expected = "Error(Contract, #1301)")]
572
+ #[should_panic(expected = "Error(Contract, #1034)")] // OwnerNotSet
222
573
  fn renounce_after_renounce_fails() {
223
574
  let env = Env::default();
224
575
  let owner = Address::generate(&env);
@@ -251,6 +602,43 @@ fn renounce_after_renounce_fails() {
251
602
  client.renounce_ownership();
252
603
  }
253
604
 
605
+ #[test]
606
+ #[should_panic(expected = "Error(Contract, #1035)")] // TransferInProgress
607
+ fn renounce_blocked_during_2step_transfer() {
608
+ let env = Env::default();
609
+ let owner = Address::generate(&env);
610
+ let new_owner = Address::generate(&env);
611
+
612
+ let contract = env.register(Contract, (&owner,));
613
+ let client = ContractClient::new(&env, &contract);
614
+
615
+ let ttl = 1000u32;
616
+
617
+ // Initiate 2-step transfer
618
+ env.mock_auths(&[MockAuth {
619
+ address: &owner,
620
+ invoke: &MockAuthInvoke {
621
+ contract: &contract,
622
+ args: (&new_owner, ttl).into_val(&env),
623
+ fn_name: "propose_ownership_transfer",
624
+ sub_invokes: &[],
625
+ },
626
+ }]);
627
+ client.propose_ownership_transfer(&new_owner, &ttl);
628
+
629
+ // Try to renounce - should fail
630
+ env.mock_auths(&[MockAuth {
631
+ address: &owner,
632
+ invoke: &MockAuthInvoke {
633
+ contract: &contract,
634
+ args: ().into_val(&env),
635
+ fn_name: "renounce_ownership",
636
+ sub_invokes: &[],
637
+ },
638
+ }]);
639
+ client.renounce_ownership();
640
+ }
641
+
254
642
  // ============================================
255
643
  // chain: Ownership chain tests
256
644
  // ============================================
@@ -292,12 +680,73 @@ fn chain_new_owner_can_transfer() {
292
680
  assert_eq!(client.owner(), Some(third_owner));
293
681
  }
294
682
 
683
+ #[test]
684
+ fn chain_new_owner_can_transfer_2step() {
685
+ let env = Env::default();
686
+ let owner = Address::generate(&env);
687
+ let new_owner = Address::generate(&env);
688
+ let third_owner = Address::generate(&env);
689
+
690
+ let contract = env.register(Contract, (&owner,));
691
+ let client = ContractClient::new(&env, &contract);
692
+
693
+ let ttl = 1000u32;
694
+
695
+ // 2-step transfer to new_owner
696
+ env.mock_auths(&[MockAuth {
697
+ address: &owner,
698
+ invoke: &MockAuthInvoke {
699
+ contract: &contract,
700
+ args: (&new_owner, ttl).into_val(&env),
701
+ fn_name: "propose_ownership_transfer",
702
+ sub_invokes: &[],
703
+ },
704
+ }]);
705
+ client.propose_ownership_transfer(&new_owner, &ttl);
706
+
707
+ env.mock_auths(&[MockAuth {
708
+ address: &new_owner,
709
+ invoke: &MockAuthInvoke {
710
+ contract: &contract,
711
+ args: ().into_val(&env),
712
+ fn_name: "accept_ownership",
713
+ sub_invokes: &[],
714
+ },
715
+ }]);
716
+ client.accept_ownership();
717
+
718
+ // new_owner can now do another 2-step transfer
719
+ env.mock_auths(&[MockAuth {
720
+ address: &new_owner,
721
+ invoke: &MockAuthInvoke {
722
+ contract: &contract,
723
+ args: (&third_owner, ttl).into_val(&env),
724
+ fn_name: "propose_ownership_transfer",
725
+ sub_invokes: &[],
726
+ },
727
+ }]);
728
+ client.propose_ownership_transfer(&third_owner, &ttl);
729
+
730
+ env.mock_auths(&[MockAuth {
731
+ address: &third_owner,
732
+ invoke: &MockAuthInvoke {
733
+ contract: &contract,
734
+ args: ().into_val(&env),
735
+ fn_name: "accept_ownership",
736
+ sub_invokes: &[],
737
+ },
738
+ }]);
739
+ client.accept_ownership();
740
+
741
+ assert_eq!(client.owner(), Some(third_owner));
742
+ }
743
+
295
744
  // ============================================
296
745
  // init: DefaultOwnable::init_owner tests
297
746
  // ============================================
298
747
 
299
748
  #[test]
300
- #[should_panic(expected = "Error(Contract, #1300)")]
749
+ #[should_panic(expected = "Error(Contract, #1033)")] // OwnerAlreadySet
301
750
  fn reinit_owner_fails() {
302
751
  let env = Env::default();
303
752
  let owner = Address::generate(&env);
@@ -334,7 +783,7 @@ fn enforce_owner_auth_returns_owner() {
334
783
  }
335
784
 
336
785
  #[test]
337
- #[should_panic(expected = "Error(Contract, #1301)")]
786
+ #[should_panic(expected = "Error(Contract, #1034)")] // OwnerNotSet
338
787
  fn enforce_owner_auth_no_owner_set_fails() {
339
788
  let env = Env::default();
340
789
  let owner = Address::generate(&env);
@@ -1,10 +1,14 @@
1
1
  extern crate std;
2
2
 
3
- use crate::errors::TtlConfigurableError;
4
- use crate::ownable::OwnableInitializer;
5
- use crate::testing_utils::assert_event;
6
- use crate::ttl_configurable::{
7
- TtlConfig, TtlConfigStorage, TtlConfigsFrozen, TtlConfigsSet, TtlConfigurable, LEDGERS_PER_DAY, MAX_TTL,
3
+ use crate::{
4
+ auth::Auth,
5
+ errors::{OwnableError, TtlConfigurableError},
6
+ option_ext::OptionExt,
7
+ ownable::{Ownable, OwnableInitializer},
8
+ testing_utils::assert_event,
9
+ ttl_configurable::{
10
+ TtlConfig, TtlConfigStorage, TtlConfigsFrozen, TtlConfigsSet, TtlConfigurable, LEDGERS_PER_DAY, MAX_TTL,
11
+ },
8
12
  };
9
13
  use soroban_sdk::{
10
14
  contract, contractimpl,
@@ -90,11 +94,18 @@ impl TtlTestContract {
90
94
  }
91
95
  }
92
96
 
93
- // Enable the default `TtlConfigurable` implementation (which requires `Ownable`) on the test contract.
97
+ // Enable the default `TtlConfigurable` implementation (which requires `Auth`) on the test contract.
94
98
  //
95
99
  // Note: use plain Rust `impl` (not `#[contractimpl(contracttrait)]`) to avoid generating
96
- // duplicate Soroban contract entrypoints that would collide with this test contracts helpers.
97
- impl crate::ownable::Ownable for TtlTestContract {}
100
+ // duplicate Soroban contract entrypoints that would collide with this test contract's helpers.
101
+
102
+ /// Auth implementation for test contract - uses the stored owner as authorizer.
103
+ impl Auth for TtlTestContract {
104
+ fn authorizer(env: &soroban_sdk::Env) -> Address {
105
+ <Self as Ownable>::owner(env).unwrap_or_panic(env, OwnableError::OwnerNotSet)
106
+ }
107
+ }
108
+ impl Ownable for TtlTestContract {}
98
109
  impl OwnableInitializer for TtlTestContract {}
99
110
  impl TtlConfigurable for TtlTestContract {}
100
111
 
@@ -369,7 +380,7 @@ fn test_default_ttl_configurable_freeze() {
369
380
  }
370
381
 
371
382
  #[test]
372
- #[should_panic(expected = "Error(Contract, #1201)")]
383
+ #[should_panic(expected = "Error(Contract, #1021)")] // TtlConfigFrozen
373
384
  fn test_default_ttl_configurable_set_when_frozen() {
374
385
  let (env, contract_id, owner, client) = setup_contract();
375
386
 
@@ -382,7 +393,7 @@ fn test_default_ttl_configurable_set_when_frozen() {
382
393
  }
383
394
 
384
395
  #[test]
385
- #[should_panic(expected = "Error(Contract, #1202)")]
396
+ #[should_panic(expected = "Error(Contract, #1022)")] // TtlConfigAlreadyFrozen
386
397
  fn test_default_ttl_configurable_freeze_when_already_frozen() {
387
398
  let (env, contract_id, owner, client) = setup_contract();
388
399
 
@@ -412,7 +423,7 @@ fn test_default_ttl_configurable_freeze_wrong_signer_fails() {
412
423
  }
413
424
 
414
425
  #[test]
415
- #[should_panic(expected = "Error(Contract, #1301)")]
426
+ #[should_panic(expected = "Error(Contract, #1034)")] // OwnerNotSet
416
427
  fn test_default_ttl_configurable_freeze_when_owner_not_set() {
417
428
  let env = Env::default();
418
429
  let contract_id = env.register(TtlTestContract, ());
@@ -430,7 +441,7 @@ fn test_default_ttl_configurable_freeze_when_owner_not_set() {
430
441
  // ============================================
431
442
 
432
443
  #[test]
433
- #[should_panic(expected = "Error(Contract, #1200)")]
444
+ #[should_panic(expected = "Error(Contract, #1020)")] // InvalidTtlConfig
434
445
  fn test_default_ttl_configurable_invalid_instance_config() {
435
446
  let (env, contract_id, owner, client) = setup_contract();
436
447
  // threshold > extend_to is invalid
@@ -441,7 +452,7 @@ fn test_default_ttl_configurable_invalid_instance_config() {
441
452
  }
442
453
 
443
454
  #[test]
444
- #[should_panic(expected = "Error(Contract, #1200)")]
455
+ #[should_panic(expected = "Error(Contract, #1020)")] // InvalidTtlConfig
445
456
  fn test_default_ttl_configurable_invalid_persistent_config() {
446
457
  let (env, contract_id, owner, client) = setup_contract();
447
458
  let invalid_cfg = TtlConfig::new(5000, 4000);
@@ -451,7 +462,7 @@ fn test_default_ttl_configurable_invalid_persistent_config() {
451
462
  }
452
463
 
453
464
  #[test]
454
- #[should_panic(expected = "Error(Contract, #1200)")]
465
+ #[should_panic(expected = "Error(Contract, #1020)")] // InvalidTtlConfig
455
466
  fn test_default_ttl_configurable_exceeds_max_ttl() {
456
467
  let (env, contract_id, owner, client) = setup_contract();
457
468
  let invalid_cfg = TtlConfig::new(1000, MAX_TTL + 1);
@@ -518,7 +529,7 @@ fn test_default_ttl_configurable_set_wrong_signer_fails() {
518
529
  }
519
530
 
520
531
  #[test]
521
- #[should_panic(expected = "Error(Contract, #1301)")]
532
+ #[should_panic(expected = "Error(Contract, #1034)")] // OwnerNotSet
522
533
  fn test_default_ttl_configurable_set_when_owner_not_set() {
523
534
  let env = Env::default();
524
535
  let contract_id = env.register(TtlTestContract, ());
@@ -534,7 +545,7 @@ fn test_default_ttl_configurable_set_when_owner_not_set() {
534
545
  }
535
546
 
536
547
  #[test]
537
- #[should_panic(expected = "Error(Contract, #1200)")]
548
+ #[should_panic(expected = "Error(Contract, #1020)")] // InvalidTtlConfig
538
549
  fn test_default_ttl_configurable_exceeds_effective_max_ttl() {
539
550
  let (env, contract_id, owner, client) = setup_contract();
540
551
 
@@ -256,7 +256,7 @@ fn test_migrate_success() {
256
256
  }
257
257
 
258
258
  #[test]
259
- #[should_panic(expected = "Error(Contract, #1500)")]
259
+ #[should_panic(expected = "Error(Contract, #1050)")] // MigrationNotAllowed
260
260
  fn test_migrate_fail_without_upgrade() {
261
261
  let env = Env::default();
262
262
  let contract_id = env.register(DummyContract, ());
@@ -271,14 +271,16 @@ fn test_migrate_fail_without_upgrade() {
271
271
  // Integration test: upgrade then migrate
272
272
  // ============================================
273
273
 
274
+ // TODO (ken): change error code to 1050 and fix test
274
275
  #[test]
275
- #[should_panic(expected = "Error(Contract, #1500)")]
276
+ #[should_panic(expected = "Error(Contract, #1500)")] // MigrationNotAllowed (TEST_WASM uses old error code)
276
277
  fn test_cannot_migrate_twice_without_upgrade() {
277
278
  let env = Env::default();
278
279
  let contract_id = env.register(DummyContract, ());
279
280
  let client = DummyContractClient::new(&env, &contract_id);
280
281
 
281
282
  // First upgrade and migrate with valid WASM
283
+ // Note: TEST_WASM is a pre-compiled contract with old error codes (1500 instead of 1050)
282
284
  let wasm_hash = env.deployer().upload_contract_wasm(Bytes::from_slice(&env, TEST_WASM));
283
285
  client.upgrade(&wasm_hash);
284
286
  client.migrate(&());