@layerzerolabs/protocol-stellar-v2 0.2.8

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 (265) hide show
  1. package/.turbo/turbo-build.log +727 -0
  2. package/.turbo/turbo-lint.log +158 -0
  3. package/.turbo/turbo-test.log +796 -0
  4. package/Cargo.lock +2237 -0
  5. package/Cargo.toml +63 -0
  6. package/clippy.toml +7 -0
  7. package/contracts/common-macros/Cargo.toml +20 -0
  8. package/contracts/common-macros/src/error.rs +53 -0
  9. package/contracts/common-macros/src/event.rs +16 -0
  10. package/contracts/common-macros/src/lib.rs +255 -0
  11. package/contracts/common-macros/src/ownable.rs +63 -0
  12. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +310 -0
  13. package/contracts/common-macros/src/storage.rs +439 -0
  14. package/contracts/common-macros/src/tests.rs +287 -0
  15. package/contracts/common-macros/src/ttl_configurable.rs +60 -0
  16. package/contracts/endpoint-v2/ARCHITECTURE.md +233 -0
  17. package/contracts/endpoint-v2/Cargo.toml +30 -0
  18. package/contracts/endpoint-v2/src/constants.rs +52 -0
  19. package/contracts/endpoint-v2/src/endpoint_v2.rs +305 -0
  20. package/contracts/endpoint-v2/src/errors.rs +29 -0
  21. package/contracts/endpoint-v2/src/events.rs +207 -0
  22. package/contracts/endpoint-v2/src/interfaces/layerzero_composer.rs +26 -0
  23. package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +170 -0
  24. package/contracts/endpoint-v2/src/interfaces/layerzero_receiver.rs +43 -0
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +62 -0
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +220 -0
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +121 -0
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +63 -0
  29. package/contracts/endpoint-v2/src/interfaces/mod.rs +17 -0
  30. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +70 -0
  31. package/contracts/endpoint-v2/src/lib.rs +22 -0
  32. package/contracts/endpoint-v2/src/message_lib_manager.rs +315 -0
  33. package/contracts/endpoint-v2/src/messaging_channel.rs +218 -0
  34. package/contracts/endpoint-v2/src/messaging_composer.rs +76 -0
  35. package/contracts/endpoint-v2/src/storage.rs +78 -0
  36. package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +131 -0
  37. package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +237 -0
  38. package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +42 -0
  39. package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +76 -0
  40. package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +211 -0
  41. package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +18 -0
  42. package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +10 -0
  43. package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +10 -0
  44. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +424 -0
  45. package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +144 -0
  46. package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +72 -0
  47. package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +29 -0
  48. package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +513 -0
  49. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +43 -0
  50. package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +27 -0
  51. package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +30 -0
  52. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +202 -0
  53. package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +59 -0
  54. package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +172 -0
  55. package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +23 -0
  56. package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +10 -0
  57. package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +131 -0
  58. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +35 -0
  59. package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +28 -0
  60. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +79 -0
  61. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +246 -0
  62. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +285 -0
  63. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +180 -0
  64. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +405 -0
  65. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +80 -0
  66. package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +131 -0
  67. package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +358 -0
  68. package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +316 -0
  69. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +288 -0
  70. package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +316 -0
  71. package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +388 -0
  72. package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +307 -0
  73. package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +10 -0
  74. package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +239 -0
  75. package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +324 -0
  76. package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +242 -0
  77. package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +232 -0
  78. package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +212 -0
  79. package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +213 -0
  80. package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +269 -0
  81. package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
  82. package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +173 -0
  83. package/contracts/endpoint-v2/src/tests/mock.rs +132 -0
  84. package/contracts/endpoint-v2/src/tests/mod.rs +12 -0
  85. package/contracts/endpoint-v2/src/tests/util/build_payload.rs +126 -0
  86. package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +82 -0
  87. package/contracts/endpoint-v2/src/tests/util/keccak256.rs +115 -0
  88. package/contracts/endpoint-v2/src/tests/util/mod.rs +3 -0
  89. package/contracts/endpoint-v2/src/util.rs +52 -0
  90. package/contracts/message-libs/Cargo.toml +12 -0
  91. package/contracts/message-libs/block-message-lib/Cargo.toml +19 -0
  92. package/contracts/message-libs/block-message-lib/src/lib.rs +70 -0
  93. package/contracts/message-libs/lib.rs +2 -0
  94. package/contracts/message-libs/message-lib-common/Cargo.toml +24 -0
  95. package/contracts/message-libs/message-lib-common/src/errors.rs +20 -0
  96. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +55 -0
  97. package/contracts/message-libs/message-lib-common/src/interfaces/executor.rs +46 -0
  98. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +7 -0
  99. package/contracts/message-libs/message-lib-common/src/interfaces/treasury.rs +17 -0
  100. package/contracts/message-libs/message-lib-common/src/lib.rs +14 -0
  101. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +99 -0
  102. package/contracts/message-libs/message-lib-common/src/testing_utils.rs +27 -0
  103. package/contracts/message-libs/message-lib-common/src/tests/mod.rs +2 -0
  104. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +162 -0
  105. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +319 -0
  106. package/contracts/message-libs/message-lib-common/src/worker_options.rs +190 -0
  107. package/contracts/message-libs/simple-message-lib/Cargo.toml +26 -0
  108. package/contracts/message-libs/simple-message-lib/src/errors.rs +11 -0
  109. package/contracts/message-libs/simple-message-lib/src/lib.rs +14 -0
  110. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +136 -0
  111. package/contracts/message-libs/simple-message-lib/src/storage.rs +27 -0
  112. package/contracts/message-libs/simple-message-lib/src/test.rs +280 -0
  113. package/contracts/message-libs/treasury/Cargo.toml +27 -0
  114. package/contracts/message-libs/treasury/src/errors.rs +10 -0
  115. package/contracts/message-libs/treasury/src/events.rs +28 -0
  116. package/contracts/message-libs/treasury/src/interfaces/mod.rs +3 -0
  117. package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +20 -0
  118. package/contracts/message-libs/treasury/src/lib.rs +20 -0
  119. package/contracts/message-libs/treasury/src/storage.rs +18 -0
  120. package/contracts/message-libs/treasury/src/tests/mod.rs +2 -0
  121. package/contracts/message-libs/treasury/src/tests/setup.rs +112 -0
  122. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +562 -0
  123. package/contracts/message-libs/treasury/src/treasury.rs +140 -0
  124. package/contracts/message-libs/uln-302/Cargo.toml +28 -0
  125. package/contracts/message-libs/uln-302/src/config_validation.rs +173 -0
  126. package/contracts/message-libs/uln-302/src/errors.rs +29 -0
  127. package/contracts/message-libs/uln-302/src/events.rs +72 -0
  128. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +5 -0
  129. package/contracts/message-libs/uln-302/src/interfaces/receive.rs +82 -0
  130. package/contracts/message-libs/uln-302/src/interfaces/send.rs +159 -0
  131. package/contracts/message-libs/uln-302/src/lib.rs +20 -0
  132. package/contracts/message-libs/uln-302/src/receive.rs +199 -0
  133. package/contracts/message-libs/uln-302/src/send.rs +349 -0
  134. package/contracts/message-libs/uln-302/src/storage.rs +47 -0
  135. package/contracts/message-libs/uln-302/src/tests/config/mod.rs +2 -0
  136. package/contracts/message-libs/uln-302/src/tests/config/oapp_uln_config.rs +291 -0
  137. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +163 -0
  138. package/contracts/message-libs/uln-302/src/tests/mod.rs +7 -0
  139. package/contracts/message-libs/uln-302/src/tests/receive_uln302/commit_verification.rs +183 -0
  140. package/contracts/message-libs/uln-302/src/tests/receive_uln302/confirmations.rs +128 -0
  141. package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +104 -0
  142. package/contracts/message-libs/uln-302/src/tests/receive_uln302/mod.rs +66 -0
  143. package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +79 -0
  144. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +463 -0
  145. package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +173 -0
  146. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +132 -0
  147. package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +117 -0
  148. package/contracts/message-libs/uln-302/src/tests/send_uln302/mod.rs +6 -0
  149. package/contracts/message-libs/uln-302/src/tests/send_uln302/quote.rs +586 -0
  150. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +834 -0
  151. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +95 -0
  152. package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +80 -0
  153. package/contracts/message-libs/uln-302/src/tests/setup.rs +268 -0
  154. package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +47 -0
  155. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +51 -0
  156. package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +51 -0
  157. package/contracts/message-libs/uln-302/src/tests/uln302/get_oapp_executor_config.rs +48 -0
  158. package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +4 -0
  159. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +998 -0
  160. package/contracts/message-libs/uln-302/src/uln302.rs +117 -0
  161. package/contracts/oapp-macros/Cargo.toml +21 -0
  162. package/contracts/oapp-macros/src/lib.rs +408 -0
  163. package/contracts/oapp-macros/src/oapp_core.rs +49 -0
  164. package/contracts/oapp-macros/src/oapp_full.rs +15 -0
  165. package/contracts/oapp-macros/src/oapp_options_type3.rs +46 -0
  166. package/contracts/oapp-macros/src/oapp_receiver.rs +67 -0
  167. package/contracts/oapp-macros/src/oapp_sender.rs +23 -0
  168. package/contracts/oapp-macros/src/util.rs +103 -0
  169. package/contracts/oapp-macros/tests/test_macros.rs +522 -0
  170. package/contracts/oapps/Cargo.toml +12 -0
  171. package/contracts/oapps/counter/Cargo.toml +24 -0
  172. package/contracts/oapps/counter/integration_tests/mod.rs +3 -0
  173. package/contracts/oapps/counter/integration_tests/setup.rs +201 -0
  174. package/contracts/oapps/counter/integration_tests/test_with_sml.rs +166 -0
  175. package/contracts/oapps/counter/integration_tests/utils.rs +144 -0
  176. package/contracts/oapps/counter/src/codec.rs +63 -0
  177. package/contracts/oapps/counter/src/counter.rs +235 -0
  178. package/contracts/oapps/counter/src/errors.rs +9 -0
  179. package/contracts/oapps/counter/src/lib.rs +16 -0
  180. package/contracts/oapps/counter/src/options.rs +30 -0
  181. package/contracts/oapps/counter/src/storage.rs +33 -0
  182. package/contracts/oapps/counter/src/tests/mod.rs +37 -0
  183. package/contracts/oapps/counter/src/tests/test_codec.rs +64 -0
  184. package/contracts/oapps/counter/src/tests/test_counter.rs +390 -0
  185. package/contracts/oapps/counter/src/u256_ext.rs +21 -0
  186. package/contracts/oapps/lib.rs +2 -0
  187. package/contracts/oapps/oapp/Cargo.toml +21 -0
  188. package/contracts/oapps/oapp/src/errors.rs +9 -0
  189. package/contracts/oapps/oapp/src/lib.rs +10 -0
  190. package/contracts/oapps/oapp/src/oapp_core.rs +92 -0
  191. package/contracts/oapps/oapp/src/oapp_options_type3.rs +89 -0
  192. package/contracts/oapps/oapp/src/oapp_receiver.rs +72 -0
  193. package/contracts/oapps/oapp/src/oapp_sender.rs +66 -0
  194. package/contracts/oapps/oapp/src/tests/mod.rs +4 -0
  195. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +162 -0
  196. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +180 -0
  197. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +157 -0
  198. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +283 -0
  199. package/contracts/utils/Cargo.toml +21 -0
  200. package/contracts/utils/src/buffer_reader.rs +143 -0
  201. package/contracts/utils/src/buffer_writer.rs +117 -0
  202. package/contracts/utils/src/bytes_ext.rs +19 -0
  203. package/contracts/utils/src/errors.rs +30 -0
  204. package/contracts/utils/src/lib.rs +15 -0
  205. package/contracts/utils/src/option_ext.rs +38 -0
  206. package/contracts/utils/src/ownable.rs +88 -0
  207. package/contracts/utils/src/testing_utils.rs +100 -0
  208. package/contracts/utils/src/tests/buffer_reader.rs +1006 -0
  209. package/contracts/utils/src/tests/buffer_writer.rs +330 -0
  210. package/contracts/utils/src/tests/bytes_ext.rs +77 -0
  211. package/contracts/utils/src/tests/mod.rs +4 -0
  212. package/contracts/utils/src/tests/ownable.rs +149 -0
  213. package/contracts/utils/src/ttl.rs +164 -0
  214. package/contracts/workers/Cargo.toml +13 -0
  215. package/contracts/workers/executor/Cargo.toml +26 -0
  216. package/contracts/workers/executor/src/events.rs +22 -0
  217. package/contracts/workers/executor/src/executor.rs +347 -0
  218. package/contracts/workers/executor/src/interfaces/executor.rs +40 -0
  219. package/contracts/workers/executor/src/interfaces/mod.rs +5 -0
  220. package/contracts/workers/executor/src/interfaces/types.rs +51 -0
  221. package/contracts/workers/executor/src/lib.rs +10 -0
  222. package/contracts/workers/executor/src/storage.rs +23 -0
  223. package/contracts/workers/lib.rs +2 -0
  224. package/contracts/workers/worker-common/Cargo.toml +18 -0
  225. package/contracts/workers/worker-common/src/constants.rs +17 -0
  226. package/contracts/workers/worker-common/src/errors.rs +6 -0
  227. package/contracts/workers/worker-common/src/events.rs +34 -0
  228. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +35 -0
  229. package/contracts/workers/worker-common/src/interfaces/mod.rs +7 -0
  230. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +40 -0
  231. package/contracts/workers/worker-common/src/interfaces/worker.rs +60 -0
  232. package/contracts/workers/worker-common/src/lib.rs +19 -0
  233. package/contracts/workers/worker-common/src/storage.rs +32 -0
  234. package/contracts/workers/worker-common/src/worker_common.rs +166 -0
  235. package/package.json +25 -0
  236. package/rust-toolchain.toml +4 -0
  237. package/rustfmt.toml +17 -0
  238. package/sdk/.turbo/turbo-build.log +4 -0
  239. package/sdk/dist/generated/bml.d.ts +452 -0
  240. package/sdk/dist/generated/bml.js +72 -0
  241. package/sdk/dist/generated/counter.d.ts +824 -0
  242. package/sdk/dist/generated/counter.js +125 -0
  243. package/sdk/dist/generated/endpoint.d.ts +1676 -0
  244. package/sdk/dist/generated/endpoint.js +216 -0
  245. package/sdk/dist/generated/sml.d.ts +810 -0
  246. package/sdk/dist/generated/sml.js +132 -0
  247. package/sdk/dist/generated/uln302.d.ts +1227 -0
  248. package/sdk/dist/generated/uln302.js +185 -0
  249. package/sdk/dist/index.d.ts +5 -0
  250. package/sdk/dist/index.js +5 -0
  251. package/sdk/node_modules/.bin/tsc +21 -0
  252. package/sdk/node_modules/.bin/tsserver +21 -0
  253. package/sdk/node_modules/.bin/vitest +21 -0
  254. package/sdk/node_modules/.bin/zx +21 -0
  255. package/sdk/package.json +40 -0
  256. package/sdk/src/index.ts +5 -0
  257. package/sdk/test/index.test.ts +271 -0
  258. package/sdk/test/suites/constants.ts +13 -0
  259. package/sdk/test/suites/deploy.ts +277 -0
  260. package/sdk/test/suites/localnet.ts +42 -0
  261. package/sdk/test/suites/scan.ts +189 -0
  262. package/sdk/tsconfig.json +106 -0
  263. package/tools/ts-bindings-gen/Cargo.toml +14 -0
  264. package/tools/ts-bindings-gen/src/main.rs +147 -0
  265. package/turbo.json +12 -0
@@ -0,0 +1,136 @@
1
+ use crate::{errors::SimpleMessageLibError, storage::SmlStorage};
2
+ use common_macros::ttl_configurable;
3
+ use endpoint_v2::{
4
+ FeeRecipient, FeesAndPacket, IMessageLib, ISendLib, LayerZeroEndpointV2Client, MessageLibType, MessageLibVersion,
5
+ MessagingFee, Origin, OutboundPacket, SetConfigParam,
6
+ };
7
+ use message_lib_common::packet_codec_v1;
8
+ use soroban_sdk::{
9
+ address_payload::AddressPayload, assert_with_error, contract, contractimpl, panic_with_error, vec, Address, Bytes,
10
+ BytesN, Env, Vec,
11
+ };
12
+ use utils::ownable::Ownable;
13
+
14
+ #[contract]
15
+ #[ttl_configurable]
16
+ pub struct SimpleMessageLib;
17
+
18
+ #[contractimpl]
19
+ impl SimpleMessageLib {
20
+ pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address, fee_recipient: &Address) {
21
+ let endpoint_client = LayerZeroEndpointV2Client::new(env, endpoint);
22
+ let local_eid = endpoint_client.eid();
23
+
24
+ SmlStorage::set_endpoint(env, endpoint);
25
+ SmlStorage::set_local_eid(env, &local_eid);
26
+ SmlStorage::set_zro_fee(env, &99_i128);
27
+ SmlStorage::set_native_fee(env, &100_i128);
28
+ SmlStorage::set_fee_recipient(env, fee_recipient);
29
+ SmlStorage::set_whitelisted_caller(env, owner);
30
+ Self::__init_owner(env, owner);
31
+ }
32
+
33
+ pub fn validate_packet(env: Env, caller: Address, header_bytes: Bytes, payload_hash: BytesN<32>) {
34
+ caller.require_auth();
35
+ assert_with_error!(
36
+ env,
37
+ Some(caller) == SmlStorage::whitelisted_caller(&env),
38
+ SimpleMessageLibError::OnlyWhitelistedCaller
39
+ );
40
+
41
+ let header = packet_codec_v1::decode_packet_header(&env, &header_bytes);
42
+ let origin = Origin { src_eid: header.src_eid, sender: header.sender, nonce: header.nonce };
43
+
44
+ let receiver = Address::from_payload(&env, AddressPayload::ContractIdHash(header.receiver)); // Enforce receiver is a contract address
45
+ Self::endpoint_client(&env).verify(&env.current_contract_address(), &origin, &receiver, &payload_hash);
46
+ }
47
+
48
+ // === View Functions ===
49
+
50
+ pub fn fee_recipient(env: &Env) -> Address {
51
+ SmlStorage::fee_recipient(env).unwrap()
52
+ }
53
+
54
+ pub fn native_fee(env: &Env) -> i128 {
55
+ SmlStorage::native_fee(env).unwrap()
56
+ }
57
+
58
+ pub fn zro_fee(env: &Env) -> i128 {
59
+ SmlStorage::zro_fee(env).unwrap()
60
+ }
61
+
62
+ pub fn whitelisted_caller(env: &Env) -> Address {
63
+ SmlStorage::whitelisted_caller(env).unwrap()
64
+ }
65
+
66
+ pub fn endpoint(env: &Env) -> Address {
67
+ SmlStorage::endpoint(env).unwrap()
68
+ }
69
+
70
+ pub fn eid(env: &Env) -> u32 {
71
+ SmlStorage::local_eid(env).unwrap()
72
+ }
73
+
74
+ pub fn treasury(env: &Env) -> Address {
75
+ SmlStorage::treasury(env).unwrap()
76
+ }
77
+
78
+ // ==== Internal helpers ====
79
+
80
+ fn require_endpoint_auth(env: &Env) {
81
+ Self::endpoint(env).require_auth();
82
+ }
83
+
84
+ fn endpoint_client(env: &Env) -> LayerZeroEndpointV2Client<'_> {
85
+ LayerZeroEndpointV2Client::new(env, &Self::endpoint(env))
86
+ }
87
+ }
88
+
89
+ #[contractimpl]
90
+ impl IMessageLib for SimpleMessageLib {
91
+ fn get_config(env: &Env, _eid: u32, _oapp: &Address, _config_type: u32) -> Bytes {
92
+ panic_with_error!(env, SimpleMessageLibError::NotImplemented);
93
+ }
94
+
95
+ fn is_supported_eid(_env: &Env, _eid: u32) -> bool {
96
+ true
97
+ }
98
+
99
+ fn message_lib_type(_env: &Env) -> MessageLibType {
100
+ MessageLibType::SendAndReceive
101
+ }
102
+
103
+ fn set_config(env: &Env, _oapp: &Address, _param: &Vec<SetConfigParam>) {
104
+ panic_with_error!(env, SimpleMessageLibError::NotImplemented);
105
+ }
106
+
107
+ fn version(_env: &Env) -> MessageLibVersion {
108
+ MessageLibVersion { major: 0, minor: 0, endpoint_version: 2 }
109
+ }
110
+ }
111
+
112
+ #[contractimpl]
113
+ impl ISendLib for SimpleMessageLib {
114
+ fn quote(env: &Env, _packet: &OutboundPacket, _options: &Bytes, pay_in_zro: bool) -> MessagingFee {
115
+ MessagingFee { native_fee: Self::native_fee(env), zro_fee: if pay_in_zro { Self::zro_fee(env) } else { 0 } }
116
+ }
117
+
118
+ fn send(env: &Env, packet: &OutboundPacket, _options: &Bytes, pay_in_zro: bool) -> FeesAndPacket {
119
+ Self::require_endpoint_auth(env);
120
+
121
+ let native_fee_recipients =
122
+ vec![env, FeeRecipient { address: Self::fee_recipient(env), amount: Self::native_fee(env) }];
123
+
124
+ let mut zro_fee_recipients = vec![env];
125
+ if pay_in_zro {
126
+ zro_fee_recipients
127
+ .push_back(FeeRecipient { address: Self::fee_recipient(env), amount: Self::zro_fee(env) });
128
+ }
129
+
130
+ FeesAndPacket {
131
+ native_fee_recipients,
132
+ zro_fee_recipients,
133
+ encoded_packet: packet_codec_v1::encode_packet(env, packet),
134
+ }
135
+ }
136
+ }
@@ -0,0 +1,27 @@
1
+ use common_macros::storage;
2
+ use soroban_sdk::Address;
3
+ use utils::ttl::DefaultTtlConfigProvider;
4
+
5
+ #[storage(DefaultTtlConfigProvider)]
6
+ pub enum SmlStorage {
7
+ #[instance(Address)]
8
+ Endpoint,
9
+
10
+ #[instance(Address)]
11
+ Treasury,
12
+
13
+ #[instance(u32)]
14
+ LocalEID,
15
+
16
+ #[instance(i128)]
17
+ NativeFee,
18
+
19
+ #[instance(i128)]
20
+ ZROFee,
21
+
22
+ #[instance(Address)]
23
+ FeeRecipient,
24
+
25
+ #[instance(Address)]
26
+ WhitelistedCaller,
27
+ }
@@ -0,0 +1,280 @@
1
+ use endpoint_v2::{LayerZeroEndpointV2Client, OutboundPacket};
2
+ use message_lib_common::packet_codec_v1;
3
+ use soroban_sdk::{
4
+ contract, contractimpl, symbol_short,
5
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
6
+ Address, Bytes, Env, IntoVal,
7
+ };
8
+
9
+ use crate::simple_message_lib::{SimpleMessageLib, SimpleMessageLibClient};
10
+
11
+ #[contract]
12
+ pub struct MockEndpoint;
13
+
14
+ #[contractimpl]
15
+ impl MockEndpoint {
16
+ pub fn __constructor(env: Env, native_token: Address) {
17
+ env.storage().instance().set(&symbol_short!("ntk"), &native_token);
18
+ }
19
+
20
+ pub fn eid(_env: Env) -> u32 {
21
+ 1
22
+ }
23
+
24
+ pub fn native_token(env: Env) -> Address {
25
+ env.storage().instance().get(&symbol_short!("ntk")).unwrap()
26
+ }
27
+
28
+ pub fn zro(env: Env) -> Option<Address> {
29
+ env.storage().instance().get(&symbol_short!("zro")).unwrap_or(None)
30
+ }
31
+
32
+ pub fn set_zro(env: Env, zro: Address) {
33
+ env.storage().instance().set(&symbol_short!("zro"), &zro);
34
+ }
35
+ }
36
+
37
+ struct TestSetup<'a> {
38
+ env: Env,
39
+ owner: Address,
40
+ fee_recipient: Address,
41
+ endpoint: LayerZeroEndpointV2Client<'a>,
42
+ sml: SimpleMessageLibClient<'a>,
43
+ }
44
+
45
+ fn setup<'a>() -> TestSetup<'a> {
46
+ let env = Env::default();
47
+ let owner = Address::generate(&env);
48
+ let fee_recipient = Address::generate(&env);
49
+
50
+ let native_token = env.register_stellar_asset_contract_v2(owner.clone());
51
+
52
+ let endpoint = env.register(MockEndpoint, (&native_token.address(),));
53
+ let endpoint_client = LayerZeroEndpointV2Client::new(&env, &endpoint);
54
+ let sml_address = env.register(SimpleMessageLib, (&owner, &endpoint, &fee_recipient));
55
+ let sml = SimpleMessageLibClient::new(&env, &sml_address);
56
+ TestSetup { env, owner, fee_recipient, endpoint: endpoint_client, sml }
57
+ }
58
+
59
+ fn create_packet(env: &Env) -> OutboundPacket {
60
+ OutboundPacket {
61
+ nonce: 1,
62
+ src_eid: 2,
63
+ sender: Address::generate(env),
64
+ dst_eid: 3,
65
+ receiver: soroban_sdk::BytesN::from_array(env, &[0u8; 32]),
66
+ guid: soroban_sdk::BytesN::from_array(env, &[0u8; 32]),
67
+ message: soroban_sdk::Bytes::from_array(env, b"test"),
68
+ }
69
+ }
70
+
71
+ #[test]
72
+ fn test_quote() {
73
+ let TestSetup { env, sml, endpoint, .. } = setup();
74
+
75
+ let packet = OutboundPacket {
76
+ nonce: 1,
77
+ src_eid: 2,
78
+ sender: Address::generate(&env),
79
+ dst_eid: 3,
80
+ receiver: soroban_sdk::BytesN::from_array(&env, &[0u8; 32]),
81
+ guid: soroban_sdk::BytesN::from_array(&env, &[0u8; 32]),
82
+ message: soroban_sdk::Bytes::from_array(&env, b"test"),
83
+ };
84
+ let options = soroban_sdk::Bytes::new(&env);
85
+ let pay_in_zro = false;
86
+
87
+ env.mock_auths(&[MockAuth {
88
+ address: &endpoint.address,
89
+ invoke: &MockAuthInvoke {
90
+ contract: &sml.address,
91
+ fn_name: "quote",
92
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
93
+ sub_invokes: &[],
94
+ },
95
+ }]);
96
+
97
+ let fee = sml.quote(&packet, &options, &pay_in_zro);
98
+ assert_eq!(fee.native_fee, 100);
99
+ assert_eq!(fee.zro_fee, 0);
100
+ }
101
+
102
+ #[test]
103
+ fn test_send() {
104
+ let TestSetup { env, sml, endpoint, .. } = setup();
105
+
106
+ let packet = OutboundPacket {
107
+ nonce: 1,
108
+ src_eid: 2,
109
+ sender: Address::generate(&env),
110
+ dst_eid: 3,
111
+ receiver: soroban_sdk::BytesN::from_array(&env, &[0u8; 32]),
112
+ guid: soroban_sdk::BytesN::from_array(&env, &[0u8; 32]),
113
+ message: soroban_sdk::Bytes::from_array(&env, b"test"),
114
+ };
115
+ let options = soroban_sdk::Bytes::new(&env);
116
+ let pay_in_zro = false;
117
+
118
+ env.mock_auths(&[MockAuth {
119
+ address: &endpoint.address,
120
+ invoke: &MockAuthInvoke {
121
+ contract: &sml.address,
122
+ fn_name: "send",
123
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
124
+ sub_invokes: &[],
125
+ },
126
+ }]);
127
+
128
+ let send_result = sml.send(&packet, &options, &pay_in_zro);
129
+ assert_eq!(send_result.native_fee_recipients.len(), 1);
130
+ assert_eq!(send_result.native_fee_recipients.get(0).unwrap().amount, 100);
131
+ assert_eq!(send_result.zro_fee_recipients.len(), 0);
132
+ assert_eq!(send_result.encoded_packet, packet_codec_v1::encode_packet(&env, &packet));
133
+ }
134
+
135
+ #[test]
136
+ fn test_fee_recipient() {
137
+ let TestSetup { sml, fee_recipient, .. } = setup();
138
+
139
+ // Verify fee recipient is set correctly from constructor
140
+ let recipient = sml.fee_recipient();
141
+ assert_eq!(recipient, fee_recipient);
142
+ }
143
+
144
+ #[test]
145
+ fn test_send_returns_native_fee_recipient() {
146
+ let TestSetup { env, sml, endpoint, fee_recipient, .. } = setup();
147
+
148
+ let packet = create_packet(&env);
149
+ let options = Bytes::new(&env);
150
+ let pay_in_zro = false;
151
+
152
+ env.mock_auths(&[MockAuth {
153
+ address: &endpoint.address,
154
+ invoke: &MockAuthInvoke {
155
+ contract: &sml.address,
156
+ fn_name: "send",
157
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
158
+ sub_invokes: &[],
159
+ },
160
+ }]);
161
+
162
+ let send_result = sml.send(&packet, &options, &pay_in_zro);
163
+
164
+ // Should only have native fee recipient
165
+ assert_eq!(send_result.native_fee_recipients.len(), 1);
166
+ assert_eq!(send_result.zro_fee_recipients.len(), 0);
167
+
168
+ let native_recipient = send_result.native_fee_recipients.get(0).unwrap();
169
+ assert_eq!(native_recipient.address, fee_recipient);
170
+ assert_eq!(native_recipient.amount, 100); // native_fee from setup
171
+ }
172
+
173
+ #[test]
174
+ fn test_send_returns_both_fee_recipients_with_zro() {
175
+ let TestSetup { env, sml, endpoint, owner, fee_recipient } = setup();
176
+
177
+ // Set up ZRO token
178
+ let zro = env.register_stellar_asset_contract_v2(owner.clone());
179
+ let zro_address = zro.address();
180
+ env.mock_auths(&[MockAuth {
181
+ address: &owner,
182
+ invoke: &MockAuthInvoke {
183
+ contract: &endpoint.address,
184
+ fn_name: "set_zro",
185
+ args: (&zro_address,).into_val(&env),
186
+ sub_invokes: &[],
187
+ },
188
+ }]);
189
+ endpoint.set_zro(&zro_address);
190
+
191
+ let packet = create_packet(&env);
192
+ let options = Bytes::new(&env);
193
+ let pay_in_zro = true;
194
+
195
+ env.mock_auths(&[MockAuth {
196
+ address: &endpoint.address,
197
+ invoke: &MockAuthInvoke {
198
+ contract: &sml.address,
199
+ fn_name: "send",
200
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
201
+ sub_invokes: &[],
202
+ },
203
+ }]);
204
+
205
+ let send_result = sml.send(&packet, &options, &pay_in_zro);
206
+
207
+ // Should have both native and ZRO fee recipients
208
+ assert_eq!(send_result.native_fee_recipients.len(), 1);
209
+ assert_eq!(send_result.zro_fee_recipients.len(), 1);
210
+
211
+ let native_recipient = send_result.native_fee_recipients.get(0).unwrap();
212
+ assert_eq!(native_recipient.address, fee_recipient);
213
+ assert_eq!(native_recipient.amount, 100); // native_fee
214
+
215
+ let zro_recipient = send_result.zro_fee_recipients.get(0).unwrap();
216
+ assert_eq!(zro_recipient.address, fee_recipient);
217
+ assert_eq!(zro_recipient.amount, 99); // zro_fee from setup
218
+ }
219
+
220
+ #[test]
221
+ fn test_native_fee() {
222
+ let TestSetup { sml, .. } = setup();
223
+
224
+ let native_fee = sml.native_fee();
225
+ assert_eq!(native_fee, 100);
226
+ }
227
+
228
+ #[test]
229
+ fn test_zro_fee() {
230
+ let TestSetup { sml, .. } = setup();
231
+
232
+ let zro_fee = sml.zro_fee();
233
+ assert_eq!(zro_fee, 99);
234
+ }
235
+
236
+ #[test]
237
+ fn test_quote_with_native_fee_only() {
238
+ let TestSetup { env, sml, endpoint, .. } = setup();
239
+
240
+ let packet = create_packet(&env);
241
+ let options = Bytes::new(&env);
242
+ let pay_in_zro = false;
243
+
244
+ env.mock_auths(&[MockAuth {
245
+ address: &endpoint.address,
246
+ invoke: &MockAuthInvoke {
247
+ contract: &sml.address,
248
+ fn_name: "quote",
249
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
250
+ sub_invokes: &[],
251
+ },
252
+ }]);
253
+
254
+ let fee = sml.quote(&packet, &options, &pay_in_zro);
255
+ assert_eq!(fee.native_fee, 100);
256
+ assert_eq!(fee.zro_fee, 0);
257
+ }
258
+
259
+ #[test]
260
+ fn test_quote_with_zro_fee() {
261
+ let TestSetup { env, sml, endpoint, .. } = setup();
262
+
263
+ let packet = create_packet(&env);
264
+ let options = Bytes::new(&env);
265
+ let pay_in_zro = true;
266
+
267
+ env.mock_auths(&[MockAuth {
268
+ address: &endpoint.address,
269
+ invoke: &MockAuthInvoke {
270
+ contract: &sml.address,
271
+ fn_name: "quote",
272
+ args: (&packet, &options, &pay_in_zro).into_val(&env),
273
+ sub_invokes: &[],
274
+ },
275
+ }]);
276
+
277
+ let fee = sml.quote(&packet, &options, &pay_in_zro);
278
+ assert_eq!(fee.native_fee, 100);
279
+ assert_eq!(fee.zro_fee, 99);
280
+ }
@@ -0,0 +1,27 @@
1
+ [package]
2
+ name = "treasury"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+ license.workspace = true
6
+ publish = false
7
+
8
+ [lib]
9
+ crate-type = ["cdylib", "rlib"]
10
+ doctest = false
11
+
12
+ [features]
13
+ library = []
14
+ testutils = []
15
+
16
+ [dependencies]
17
+ cfg-if = { workspace = true }
18
+ soroban-sdk = { workspace = true }
19
+ common-macros = { workspace = true }
20
+ utils = { workspace = true }
21
+ endpoint-v2 = { workspace = true, features = ["library"] }
22
+ message-lib-common = { workspace = true }
23
+
24
+ [dev-dependencies]
25
+ soroban-sdk = { workspace = true, features = ["testutils"] }
26
+ utils = { workspace = true, features = ["testutils"] }
27
+ insta = { workspace = true }
@@ -0,0 +1,10 @@
1
+ use common_macros::contract_error;
2
+
3
+ #[contract_error]
4
+ pub enum TreasuryError {
5
+ InvalidNativeFeeBp,
6
+ InvalidTotalNativeFee,
7
+ InvalidZROFee,
8
+ InvalidZROFeeLib,
9
+ ZROFeeLibNotSet,
10
+ }
@@ -0,0 +1,28 @@
1
+ use common_macros::event;
2
+ use soroban_sdk::Address;
3
+
4
+ /// Emitted when the native fee basis points is updated.
5
+ #[event]
6
+ pub struct NativeFeeBpSet {
7
+ pub native_fee_bp: u32,
8
+ }
9
+
10
+ /// Emitted when fee collection is enabled or disabled.
11
+ #[event]
12
+ pub struct FeeEnabledSet {
13
+ pub fee_enabled: bool,
14
+ }
15
+
16
+ /// Emitted when the ZRO fee library is set or removed.
17
+ #[event]
18
+ pub struct ZROFeeLibSet {
19
+ pub zro_fee_lib: Option<Address>,
20
+ }
21
+
22
+ /// Emitted when a token (including native XLM) is withdrawn from the contract.
23
+ #[event]
24
+ pub struct TokenWithdrawn {
25
+ pub token: Address,
26
+ pub to: Address,
27
+ pub amount: i128,
28
+ }
@@ -0,0 +1,3 @@
1
+ mod zro_fee_lib;
2
+
3
+ pub use zro_fee_lib::*;
@@ -0,0 +1,20 @@
1
+ use soroban_sdk::{contractclient, Address, Env};
2
+
3
+ /// Interface for ZRO token fee library.
4
+ ///
5
+ /// The ZRO token fee library calculates treasury fees when paying in ZRO tokens.
6
+ /// This allows for custom fee calculation logic when users opt to pay fees in ZRO.
7
+ #[contractclient(name = "ZROFeeLibClient")]
8
+ pub trait IZROFeeLib {
9
+ /// Get the treasury fee in ZRO tokens based on the worker fee.
10
+ ///
11
+ /// # Arguments
12
+ /// * `sender` - The sender OApp address
13
+ /// * `dst_eid` - The destination endpoint ID
14
+ /// * `worker_fee` - The worker fee
15
+ /// * `native_treasury_fee` - The treasury fee in native tokens
16
+ ///
17
+ /// # Returns
18
+ /// The amount of ZRO tokens to be paid
19
+ fn get_fee(env: &Env, sender: &Address, dst_eid: u32, worker_fee: i128, native_treasury_fee: i128) -> i128;
20
+ }
@@ -0,0 +1,20 @@
1
+ #![no_std]
2
+
3
+ mod interfaces;
4
+
5
+ pub use interfaces::*;
6
+
7
+ cfg_if::cfg_if! {
8
+ // Include implementation when NOT in library mode, OR when testutils is enabled (for tests)
9
+ if #[cfg(any(not(feature = "library"), feature = "testutils"))] {
10
+ mod errors;
11
+ mod events;
12
+ mod storage;
13
+ mod treasury;
14
+
15
+ pub use treasury::{Treasury, TreasuryClient};
16
+ }
17
+ }
18
+
19
+ #[cfg(test)]
20
+ mod tests;
@@ -0,0 +1,18 @@
1
+ use common_macros::storage;
2
+ use soroban_sdk::Address;
3
+ use utils::ttl::DefaultTtlConfigProvider;
4
+
5
+ #[storage(DefaultTtlConfigProvider)]
6
+ pub enum TreasuryStorage {
7
+ /// Native fee in basis points (0-10000, where 10000 = 100%)
8
+ #[instance(u32)]
9
+ NativeFeeBp,
10
+
11
+ /// Global toggle for all fee collection
12
+ #[instance(bool)]
13
+ FeeEnabled,
14
+
15
+ /// Address of the ZRO token fee library contract for custom fee calculations
16
+ #[instance(Address)]
17
+ ZROFeeLib,
18
+ }
@@ -0,0 +1,2 @@
1
+ mod setup;
2
+ mod treasury_tests;
@@ -0,0 +1,112 @@
1
+ use soroban_sdk::{
2
+ contract, contractimpl,
3
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
4
+ token, Address, Env, IntoVal, Val, Vec,
5
+ };
6
+
7
+ use crate::treasury::{Treasury, TreasuryClient};
8
+
9
+ // === Test Constants ===
10
+
11
+ pub const BPS_DENOMINATOR: u32 = 10000;
12
+
13
+ // === Dummy Contract for creating valid addresses ===
14
+
15
+ /// A minimal dummy contract used to create valid contract addresses in tests.
16
+ /// This is needed because `Address::generate()` creates addresses that don't
17
+ /// pass the `.exists()` check in Soroban.
18
+ #[contract]
19
+ pub struct DummyContract;
20
+
21
+ #[contractimpl]
22
+ impl DummyContract {
23
+ pub fn __constructor(_env: &Env) {}
24
+ }
25
+
26
+ /// Test setup struct following the pattern from endpoint-v2 and uln-302
27
+ pub struct TestSetup<'a> {
28
+ pub env: Env,
29
+ pub owner: Address,
30
+ pub treasury: TreasuryClient<'a>,
31
+ }
32
+
33
+ /// Creates a new test setup with a deployed treasury contract
34
+ pub fn setup<'a>() -> TestSetup<'a> {
35
+ let env = Env::default();
36
+ let owner = Address::generate(&env);
37
+
38
+ let treasury = env.register(Treasury, (&owner,));
39
+ let treasury_client = TreasuryClient::new(&env, &treasury);
40
+
41
+ TestSetup { env, owner, treasury: treasury_client }
42
+ }
43
+
44
+ impl<'a> TestSetup<'a> {
45
+ /// Helper to mock owner auth for treasury operations
46
+ pub fn mock_owner_auth<T: IntoVal<Env, Vec<Val>>>(&self, fn_name: &str, args: T) {
47
+ self.env.mock_auths(&[MockAuth {
48
+ address: &self.owner,
49
+ invoke: &MockAuthInvoke {
50
+ contract: &self.treasury.address,
51
+ fn_name,
52
+ args: args.into_val(&self.env),
53
+ sub_invokes: &[],
54
+ },
55
+ }]);
56
+ }
57
+
58
+ /// Helper to mock auth for any address (for testing unauthorized access)
59
+ pub fn mock_auth<T: IntoVal<Env, Vec<Val>>>(&self, address: &Address, fn_name: &str, args: T) {
60
+ self.env.mock_auths(&[MockAuth {
61
+ address,
62
+ invoke: &MockAuthInvoke {
63
+ contract: &self.treasury.address,
64
+ fn_name,
65
+ args: args.into_val(&self.env),
66
+ sub_invokes: &[],
67
+ },
68
+ }]);
69
+ }
70
+
71
+ /// Creates a valid contract address by registering a dummy contract.
72
+ /// Use this instead of `Address::generate()` when the address needs to pass `.exists()` check.
73
+ pub fn create_contract_address(&self) -> Address {
74
+ self.env.register(DummyContract, ())
75
+ }
76
+
77
+ /// Configure treasury with native fee basis points and enable fees
78
+ pub fn configure_treasury(&self, native_fee_bp: u32) {
79
+ self.mock_owner_auth("set_native_fee_bp", (&native_fee_bp,));
80
+ self.treasury.set_native_fee_bp(&native_fee_bp);
81
+
82
+ self.mock_owner_auth("set_fee_enabled", (&true,));
83
+ self.treasury.set_fee_enabled(&true);
84
+ }
85
+
86
+ /// Deploys a test token contract and returns its address
87
+ pub fn deploy_test_token(&self) -> Address {
88
+ self.env.register_stellar_asset_contract_v2(self.owner.clone()).address()
89
+ }
90
+
91
+ /// Mints tokens to a specified address
92
+ pub fn mint_tokens(&self, token: &Address, to: &Address, amount: i128) {
93
+ let token_admin = token::StellarAssetClient::new(&self.env, token);
94
+ // Mock authorization for the mint operation
95
+ self.env.mock_auths(&[MockAuth {
96
+ address: &self.owner,
97
+ invoke: &MockAuthInvoke {
98
+ contract: token,
99
+ fn_name: "mint",
100
+ args: (to, &amount).into_val(&self.env),
101
+ sub_invokes: &[],
102
+ },
103
+ }]);
104
+ token_admin.mint(to, &amount);
105
+ }
106
+
107
+ /// Gets the token balance of an address
108
+ pub fn get_token_balance(&self, token: &Address, address: &Address) -> i128 {
109
+ let token_client = token::Client::new(&self.env, token);
110
+ token_client.balance(address)
111
+ }
112
+ }