@layerzerolabs/protocol-stellar-v2 0.2.8 → 0.2.10

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 (239) hide show
  1. package/.turbo/turbo-build.log +443 -302
  2. package/.turbo/turbo-lint.log +118 -96
  3. package/.turbo/turbo-test.log +853 -731
  4. package/Cargo.lock +120 -37
  5. package/Cargo.toml +8 -5
  6. package/contracts/common-macros/src/contract_impl.rs +44 -0
  7. package/contracts/common-macros/src/lib.rs +86 -40
  8. package/contracts/common-macros/src/ownable.rs +24 -32
  9. package/contracts/common-macros/src/storage.rs +95 -120
  10. package/contracts/common-macros/src/tests/contract_impl.rs +289 -0
  11. package/contracts/common-macros/src/tests/mod.rs +9 -0
  12. package/contracts/common-macros/src/tests/ownable.rs +151 -0
  13. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +85 -0
  14. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +30 -0
  15. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_only_owner_preserves_function_signature.snap +9 -0
  16. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +1072 -0
  17. package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +45 -0
  18. package/contracts/common-macros/src/tests/storage.rs +485 -0
  19. package/contracts/common-macros/src/tests/test_helpers.rs +93 -0
  20. package/contracts/common-macros/src/tests/ttl_configurable.rs +34 -0
  21. package/contracts/common-macros/src/ttl_configurable.rs +31 -14
  22. package/contracts/common-macros/src/utils.rs +27 -0
  23. package/contracts/endpoint-v2/ARCHITECTURE.md +4 -4
  24. package/contracts/endpoint-v2/src/endpoint_v2.rs +18 -15
  25. package/contracts/endpoint-v2/src/interfaces/message_lib.rs +2 -3
  26. package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +5 -3
  27. package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +2 -2
  28. package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +2 -2
  29. package/contracts/endpoint-v2/src/interfaces/send_lib.rs +4 -4
  30. package/contracts/endpoint-v2/src/lib.rs +6 -5
  31. package/contracts/endpoint-v2/src/message_lib_manager.rs +14 -6
  32. package/contracts/endpoint-v2/src/messaging_channel.rs +6 -2
  33. package/contracts/endpoint-v2/src/messaging_composer.rs +6 -2
  34. package/contracts/endpoint-v2/src/storage.rs +10 -7
  35. package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +16 -16
  36. package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +46 -46
  37. package/contracts/endpoint-v2/src/tests/mock.rs +2 -2
  38. package/contracts/endpoint-v2/src/util.rs +8 -2
  39. package/contracts/message-libs/block-message-lib/Cargo.toml +1 -0
  40. package/contracts/message-libs/block-message-lib/src/lib.rs +5 -5
  41. package/contracts/message-libs/message-lib-common/src/errors.rs +8 -8
  42. package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +0 -1
  43. package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +3 -3
  44. package/contracts/message-libs/message-lib-common/src/lib.rs +0 -2
  45. package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +4 -6
  46. package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +2 -2
  47. package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +11 -11
  48. package/contracts/message-libs/message-lib-common/src/worker_options.rs +10 -16
  49. package/contracts/message-libs/simple-message-lib/src/errors.rs +0 -4
  50. package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +49 -34
  51. package/contracts/message-libs/simple-message-lib/src/storage.rs +3 -7
  52. package/contracts/message-libs/simple-message-lib/src/test.rs +3 -3
  53. package/contracts/message-libs/treasury/src/storage.rs +1 -2
  54. package/contracts/message-libs/treasury/src/tests/setup.rs +3 -2
  55. package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +0 -13
  56. package/contracts/message-libs/treasury/src/treasury.rs +18 -21
  57. package/contracts/message-libs/uln-302/Cargo.toml +1 -0
  58. package/contracts/message-libs/uln-302/src/interfaces/mod.rs +4 -4
  59. package/contracts/message-libs/uln-302/src/interfaces/{receive.rs → receive_uln.rs} +3 -3
  60. package/contracts/message-libs/uln-302/src/interfaces/{send.rs → send_uln.rs} +8 -80
  61. package/contracts/message-libs/uln-302/src/lib.rs +5 -4
  62. package/contracts/message-libs/uln-302/src/{receive.rs → receive_uln.rs} +20 -12
  63. package/contracts/message-libs/uln-302/src/{send.rs → send_uln.rs} +19 -13
  64. package/contracts/message-libs/uln-302/src/storage.rs +1 -2
  65. package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +3 -2
  66. package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +30 -30
  67. package/contracts/message-libs/uln-302/src/tests/setup.rs +12 -11
  68. package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +1 -1
  69. package/contracts/message-libs/uln-302/src/{config_validation.rs → types.rs} +79 -11
  70. package/contracts/message-libs/uln-302/src/uln302.rs +15 -10
  71. package/contracts/oapp-macros/Cargo.toml +2 -8
  72. package/contracts/oapp-macros/src/lib.rs +57 -311
  73. package/contracts/oapp-macros/src/oapp_core.rs +23 -32
  74. package/contracts/oapp-macros/src/oapp_full.rs +8 -2
  75. package/contracts/oapp-macros/src/oapp_options_type3.rs +21 -36
  76. package/contracts/oapp-macros/src/oapp_receiver.rs +38 -57
  77. package/contracts/oapp-macros/src/oapp_sender.rs +12 -14
  78. package/contracts/oapp-macros/src/util.rs +14 -10
  79. package/contracts/oapps/counter/Cargo.toml +2 -1
  80. package/contracts/oapps/counter/integration_tests/utils.rs +4 -4
  81. package/contracts/oapps/counter/src/codec.rs +8 -9
  82. package/contracts/oapps/counter/src/counter.rs +156 -147
  83. package/contracts/oapps/counter/src/storage.rs +1 -2
  84. package/contracts/oapps/counter/src/tests/test_codec.rs +5 -5
  85. package/contracts/oapps/counter/src/tests/test_counter.rs +11 -13
  86. package/contracts/oapps/oapp/Cargo.toml +1 -0
  87. package/contracts/oapps/oapp/src/errors.rs +1 -1
  88. package/contracts/oapps/oapp/src/lib.rs +3 -0
  89. package/contracts/oapps/oapp/src/macro_tests/mod.rs +1 -0
  90. package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +312 -0
  91. package/contracts/oapps/oapp/src/oapp_core.rs +52 -53
  92. package/contracts/oapps/oapp/src/oapp_options_type3.rs +18 -28
  93. package/contracts/oapps/oapp/src/oapp_receiver.rs +82 -31
  94. package/contracts/oapps/oapp/src/oapp_sender.rs +55 -13
  95. package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +16 -3
  96. package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +33 -8
  97. package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +6 -9
  98. package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +28 -15
  99. package/contracts/oapps/oft/Cargo.toml +27 -0
  100. package/contracts/oapps/oft/integration-tests/mod.rs +3 -0
  101. package/contracts/oapps/oft/integration-tests/setup.rs +320 -0
  102. package/contracts/oapps/oft/integration-tests/test_with_sml.rs +155 -0
  103. package/contracts/oapps/oft/integration-tests/utils.rs +201 -0
  104. package/contracts/oapps/oft/src/codec/mod.rs +2 -0
  105. package/contracts/oapps/oft/src/codec/oft_compose_msg_codec.rs +55 -0
  106. package/contracts/oapps/oft/src/codec/oft_msg_codec.rs +62 -0
  107. package/contracts/oapps/oft/src/constants.rs +5 -0
  108. package/contracts/oapps/oft/src/errors.rs +8 -0
  109. package/contracts/oapps/oft/src/events.rs +19 -0
  110. package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +23 -0
  111. package/contracts/oapps/oft/src/interfaces/mod.rs +3 -0
  112. package/contracts/oapps/oft/src/lib.rs +22 -0
  113. package/contracts/oapps/oft/src/macro_tests/mod.rs +2 -0
  114. package/contracts/oapps/oft/src/macro_tests/test_all_default.rs +41 -0
  115. package/contracts/oapps/oft/src/macro_tests/test_override.rs +83 -0
  116. package/contracts/oapps/oft/src/oft.rs +320 -0
  117. package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +50 -0
  118. package/contracts/oapps/oft/src/oft_types/mint_burn.rs +50 -0
  119. package/contracts/oapps/oft/src/oft_types/mod.rs +10 -0
  120. package/contracts/oapps/oft/src/storage.rs +11 -0
  121. package/contracts/oapps/oft/src/tests/mod.rs +13 -0
  122. package/contracts/oapps/oft/src/tests/test_decimals.rs +89 -0
  123. package/contracts/oapps/oft/src/tests/test_lz_receive.rs +282 -0
  124. package/contracts/oapps/oft/src/tests/test_oft_compose_msg_codec.rs +68 -0
  125. package/contracts/oapps/oft/src/tests/test_oft_msg_codec.rs +136 -0
  126. package/contracts/oapps/oft/src/tests/test_oft_version.rs +13 -0
  127. package/contracts/oapps/oft/src/tests/test_quote_oft.rs +159 -0
  128. package/contracts/oapps/oft/src/tests/test_quote_send.rs +195 -0
  129. package/contracts/oapps/oft/src/tests/test_resolve_address.rs +37 -0
  130. package/contracts/oapps/oft/src/tests/test_send.rs +915 -0
  131. package/contracts/oapps/oft/src/tests/test_token.rs +47 -0
  132. package/contracts/oapps/oft/src/tests/test_utils.rs +789 -0
  133. package/contracts/oapps/oft/src/types.rs +38 -0
  134. package/contracts/oapps/oft/src/utils.rs +67 -0
  135. package/contracts/oapps/oft-mint-burn/Cargo.toml +26 -0
  136. package/contracts/oapps/oft-mint-burn/src/lib.rs +3 -0
  137. package/contracts/oapps/oft-mint-burn/src/oft.rs +28 -0
  138. package/contracts/oapps/oft-mint-burn/src/tests/mod.rs +1 -0
  139. package/contracts/utils/src/buffer_reader.rs +8 -9
  140. package/contracts/utils/src/buffer_writer.rs +11 -5
  141. package/contracts/utils/src/errors.rs +5 -5
  142. package/contracts/utils/src/ownable.rs +14 -6
  143. package/contracts/utils/src/testing_utils.rs +11 -1
  144. package/contracts/utils/src/tests/buffer_reader.rs +491 -730
  145. package/contracts/utils/src/tests/buffer_writer.rs +336 -148
  146. package/contracts/utils/src/tests/bytes_ext.rs +125 -40
  147. package/contracts/utils/src/tests/mod.rs +3 -0
  148. package/contracts/utils/src/tests/ownable.rs +379 -27
  149. package/contracts/utils/src/tests/test_helper.rs +47 -0
  150. package/contracts/utils/src/tests/testing_utils.rs +555 -0
  151. package/contracts/utils/src/tests/ttl.rs +421 -0
  152. package/contracts/utils/src/ttl.rs +29 -89
  153. package/contracts/workers/dvn/Cargo.toml +31 -0
  154. package/contracts/workers/dvn/src/auth.rs +66 -0
  155. package/contracts/workers/dvn/src/dvn.rs +143 -0
  156. package/contracts/workers/dvn/src/errors.rs +21 -0
  157. package/contracts/workers/dvn/src/events.rs +19 -0
  158. package/contracts/workers/dvn/src/interfaces/dvn.rs +12 -0
  159. package/contracts/workers/dvn/src/interfaces/mod.rs +5 -0
  160. package/contracts/workers/dvn/src/interfaces/multisig.rs +15 -0
  161. package/contracts/workers/dvn/src/lib.rs +24 -0
  162. package/contracts/workers/dvn/src/multisig.rs +127 -0
  163. package/contracts/workers/dvn/src/storage.rs +35 -0
  164. package/contracts/workers/dvn/src/tests/auth.rs +237 -0
  165. package/contracts/workers/dvn/src/tests/dvn.rs +349 -0
  166. package/contracts/workers/dvn/src/tests/key_pair.rs +66 -0
  167. package/contracts/workers/dvn/src/tests/mod.rs +5 -0
  168. package/contracts/workers/dvn/src/tests/multisig/mod.rs +3 -0
  169. package/contracts/workers/dvn/src/tests/multisig/set_signer.rs +133 -0
  170. package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +108 -0
  171. package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +109 -0
  172. package/contracts/workers/dvn/src/tests/setup.rs +109 -0
  173. package/contracts/workers/dvn/src/types.rs +26 -0
  174. package/contracts/workers/dvn-fee-lib/Cargo.toml +24 -0
  175. package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +113 -0
  176. package/contracts/workers/dvn-fee-lib/src/errors.rs +8 -0
  177. package/contracts/workers/dvn-fee-lib/src/lib.rs +17 -0
  178. package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +282 -0
  179. package/contracts/workers/dvn-fee-lib/src/tests/mod.rs +1 -0
  180. package/contracts/workers/executor/Cargo.toml +10 -7
  181. package/contracts/workers/executor/src/errors.rs +8 -0
  182. package/contracts/workers/executor/src/events.rs +4 -7
  183. package/contracts/workers/executor/src/interfaces/executor.rs +72 -22
  184. package/contracts/workers/executor/src/interfaces/mod.rs +0 -2
  185. package/contracts/workers/executor/src/lib.rs +16 -7
  186. package/contracts/workers/executor/src/lz_executor.rs +308 -0
  187. package/contracts/workers/executor/src/storage.rs +24 -16
  188. package/contracts/workers/executor-fee-lib/Cargo.toml +22 -0
  189. package/contracts/workers/executor-fee-lib/src/errors.rs +15 -0
  190. package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +215 -0
  191. package/contracts/workers/executor-fee-lib/src/executor_option.rs +203 -0
  192. package/contracts/workers/executor-fee-lib/src/lib.rs +7 -0
  193. package/contracts/workers/executor-helper/Cargo.toml +29 -0
  194. package/contracts/workers/executor-helper/src/executor_helper.rs +161 -0
  195. package/contracts/workers/executor-helper/src/lib.rs +11 -0
  196. package/contracts/workers/{worker-common → worker}/Cargo.toml +1 -4
  197. package/contracts/workers/worker/src/errors.rs +24 -0
  198. package/contracts/workers/worker/src/events.rs +62 -0
  199. package/contracts/workers/worker/src/interfaces/dvn_fee_lib.rs +75 -0
  200. package/contracts/workers/worker/src/interfaces/executor_fee_lib.rs +84 -0
  201. package/contracts/workers/{worker-common → worker}/src/interfaces/mod.rs +2 -2
  202. package/contracts/workers/worker/src/interfaces/price_feed.rs +85 -0
  203. package/contracts/workers/worker/src/lib.rs +14 -0
  204. package/contracts/workers/worker/src/storage.rs +63 -0
  205. package/contracts/workers/worker/src/worker.rs +459 -0
  206. package/package.json +3 -3
  207. package/sdk/dist/generated/bml.d.ts +88 -17
  208. package/sdk/dist/generated/bml.js +62 -16
  209. package/sdk/dist/generated/counter.d.ts +281 -102
  210. package/sdk/dist/generated/counter.js +93 -41
  211. package/sdk/dist/generated/endpoint.d.ts +128 -105
  212. package/sdk/dist/generated/endpoint.js +47 -45
  213. package/sdk/dist/generated/sml.d.ts +212 -69
  214. package/sdk/dist/generated/sml.js +103 -53
  215. package/sdk/dist/generated/uln302.d.ts +270 -173
  216. package/sdk/dist/generated/uln302.js +112 -64
  217. package/sdk/package.json +11 -11
  218. package/sdk/test/index.test.ts +147 -42
  219. package/sdk/test/suites/constants.ts +7 -3
  220. package/sdk/test/suites/deploy.ts +65 -42
  221. package/sdk/test/suites/localnet.ts +2 -2
  222. package/sdk/test/suites/scan.ts +28 -25
  223. package/sdk/test/utils.ts +199 -0
  224. package/sdk/tsconfig.json +93 -95
  225. package/tools/ts-bindings-gen/src/main.rs +2 -0
  226. package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +0 -310
  227. package/contracts/common-macros/src/tests.rs +0 -287
  228. package/contracts/oapp-macros/tests/test_macros.rs +0 -522
  229. package/contracts/workers/executor/src/executor.rs +0 -347
  230. package/contracts/workers/executor/src/interfaces/types.rs +0 -51
  231. package/contracts/workers/worker-common/src/constants.rs +0 -17
  232. package/contracts/workers/worker-common/src/errors.rs +0 -6
  233. package/contracts/workers/worker-common/src/events.rs +0 -34
  234. package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +0 -35
  235. package/contracts/workers/worker-common/src/interfaces/price_feed.rs +0 -40
  236. package/contracts/workers/worker-common/src/interfaces/worker.rs +0 -60
  237. package/contracts/workers/worker-common/src/lib.rs +0 -19
  238. package/contracts/workers/worker-common/src/storage.rs +0 -32
  239. package/contracts/workers/worker-common/src/worker_common.rs +0 -166
@@ -0,0 +1,320 @@
1
+ //! Integration test setup for OFT.
2
+ //!
3
+ //! This file contains TestOFT contract and test setup utilities.
4
+
5
+ extern crate self as oft;
6
+ extern crate std;
7
+
8
+ use crate::integration_tests::utils::{address_to_peer_bytes32, peer_bytes32_to_address};
9
+ use common_macros::contract_impl;
10
+ use endpoint_v2::{EndpointV2, EndpointV2Client, ILayerZeroComposer};
11
+ use oft::oft::{oft_initialize, OFTClient, OFTInner, OFT};
12
+ use oft::storage::OFTStorage;
13
+ use oft::types::OFTReceipt;
14
+ use simple_message_lib::{SimpleMessageLib, SimpleMessageLibClient};
15
+ use soroban_sdk::contractimpl;
16
+ use soroban_sdk::{
17
+ contract, contracttype, log, symbol_short,
18
+ testutils::{Address as _, MockAuth, MockAuthInvoke},
19
+ token::{StellarAssetClient, TokenClient},
20
+ Address, Bytes, BytesN, Env, IntoVal,
21
+ };
22
+
23
+ // ============================================================================
24
+ // Test OFT Contract
25
+ // ============================================================================
26
+
27
+ #[oapp_macros::oapp]
28
+ pub struct TestOFT;
29
+
30
+ #[contract_impl]
31
+ impl TestOFT {
32
+ pub fn __constructor(env: &Env, token: &Address, owner: &Address, endpoint: &Address, delegate: &Option<Address>) {
33
+ oft_initialize::<Self>(env, owner, token, endpoint, delegate)
34
+ }
35
+ }
36
+
37
+ #[contractimpl(contracttrait)]
38
+ impl OFT for TestOFT {}
39
+
40
+ impl OFTInner for TestOFT {
41
+ fn __debit(env: &Env, sender: &Address, amount_ld: i128, min_amount_ld: i128, dst_eid: u32) -> OFTReceipt {
42
+ // Get the receipt (handles decimal conversion, fees, etc.)
43
+ let receipt = Self::__debit_view(env, amount_ld, min_amount_ld, dst_eid);
44
+ // Actually burn tokens from sender
45
+ StellarAssetClient::new(env, &OFTStorage::token(env).unwrap()).burn(sender, &receipt.amount_sent_ld);
46
+ receipt
47
+ }
48
+
49
+ fn __credit(env: &Env, to: &Address, amount_ld: i128, _src_eid: u32) -> i128 {
50
+ // Actually mint tokens to recipient
51
+ StellarAssetClient::new(env, &OFTStorage::token(env).unwrap()).mint(to, &amount_ld);
52
+ amount_ld
53
+ }
54
+ }
55
+
56
+ // ============================================================================
57
+ // Dummy Composer for testing compose messages
58
+ // ============================================================================
59
+
60
+ #[contracttype]
61
+ pub struct ComposeMessage {
62
+ pub executor: Address,
63
+ pub from: Address,
64
+ pub guid: BytesN<32>,
65
+ pub index: u32,
66
+ pub message: Bytes,
67
+ pub extra_data: Bytes,
68
+ pub value: i128,
69
+ }
70
+
71
+ #[contract]
72
+ pub struct DummyComposer;
73
+
74
+ #[contract_impl]
75
+ impl DummyComposer {
76
+ pub fn __constructor(env: &Env, endpoint: &Address) {
77
+ env.storage().instance().set(&symbol_short!("endpoint"), endpoint);
78
+ }
79
+
80
+ pub fn compose_message(env: &Env) -> Option<ComposeMessage> {
81
+ env.storage().instance().get(&symbol_short!("msg"))
82
+ }
83
+ }
84
+
85
+ #[contract_impl]
86
+ impl ILayerZeroComposer for DummyComposer {
87
+ fn lz_compose(
88
+ env: &Env,
89
+ executor: &Address,
90
+ from: &Address,
91
+ guid: &BytesN<32>,
92
+ index: u32,
93
+ message: &Bytes,
94
+ extra_data: &Bytes,
95
+ value: i128,
96
+ ) {
97
+ let endpoint_address: Address = env.storage().instance().get(&symbol_short!("endpoint")).unwrap();
98
+ let endpoint = endpoint_v2::MessagingComposerClient::new(env, &endpoint_address);
99
+ endpoint.clear_compose(&env.current_contract_address(), from, guid, &index, message);
100
+
101
+ env.storage().instance().set(
102
+ &symbol_short!("msg"),
103
+ &ComposeMessage {
104
+ executor: executor.clone(),
105
+ from: from.clone(),
106
+ guid: guid.clone(),
107
+ index,
108
+ message: message.clone(),
109
+ extra_data: extra_data.clone(),
110
+ value,
111
+ },
112
+ );
113
+ }
114
+ }
115
+
116
+ // ============================================================================
117
+ // Test Setup
118
+ // ============================================================================
119
+
120
+ pub struct ChainSetup<'a> {
121
+ pub eid: u32,
122
+ pub owner: Address,
123
+ pub native_token: Address,
124
+ pub oft_token: Address,
125
+ pub endpoint: EndpointV2Client<'a>,
126
+ pub sml: SimpleMessageLibClient<'a>,
127
+ pub oft: OFTClient<'a>,
128
+ pub composer: DummyComposerClient<'a>,
129
+ }
130
+
131
+ pub struct TestSetup<'a> {
132
+ pub env: Env,
133
+
134
+ pub chain_a: ChainSetup<'a>,
135
+ pub chain_b: ChainSetup<'a>,
136
+ }
137
+
138
+ fn setup_chain<'a>(env: &Env) -> ChainSetup<'a> {
139
+ let owner = Address::generate(env);
140
+
141
+ let sac = env.register_stellar_asset_contract_v2(owner.clone());
142
+ let native_token = sac.address();
143
+
144
+ // Create ZRO token
145
+ let zro_sac = env.register_stellar_asset_contract_v2(owner.clone());
146
+ let zro_token = zro_sac.address();
147
+
148
+ // Create OFT token
149
+ let oft_sac = env.register_stellar_asset_contract_v2(owner.clone());
150
+ let oft_token = oft_sac.address();
151
+
152
+ let endpoint_address = env.register(EndpointV2, (&owner,));
153
+ let fee_recipient = Address::generate(env);
154
+ let sml_address = env.register(SimpleMessageLib, (&owner, &endpoint_address, &fee_recipient));
155
+ let delegate: Option<Address> = Some(owner.clone());
156
+ let oft_address = env.register(TestOFT, (&oft_token, &owner, &endpoint_address, &delegate));
157
+ let composer_address = env.register(DummyComposer, (&endpoint_address,));
158
+
159
+ let endpoint = EndpointV2Client::new(env, &endpoint_address);
160
+ let sml = SimpleMessageLibClient::new(env, &sml_address);
161
+ let oft = OFTClient::new(env, &oft_address);
162
+ let composer = DummyComposerClient::new(env, &composer_address);
163
+
164
+ // Set ZRO token in endpoint
165
+ env.mock_auths(&[MockAuth {
166
+ address: &owner,
167
+ invoke: &MockAuthInvoke {
168
+ contract: &endpoint_address,
169
+ fn_name: "set_zro",
170
+ args: (&zro_token,).into_val(env),
171
+ sub_invokes: &[],
172
+ },
173
+ }]);
174
+ endpoint.set_zro(&zro_token);
175
+
176
+ register_library(env, &owner, &endpoint, &sml.address);
177
+
178
+ let eid = endpoint.eid();
179
+ ChainSetup { eid, owner, native_token, oft_token, endpoint, sml, oft, composer }
180
+ }
181
+
182
+ pub fn setup<'a>() -> TestSetup<'a> {
183
+ let env = Env::default();
184
+ let chain_a = setup_chain(&env);
185
+ let chain_b = setup_chain(&env);
186
+
187
+ let chain_a_oft_token_decimals = TokenClient::new(&env, &chain_a.oft_token).decimals();
188
+ let chain_b_oft_token_decimals = TokenClient::new(&env, &chain_b.oft_token).decimals();
189
+
190
+ log!(&env, "endpoint_a: {:?}", chain_a.endpoint.address);
191
+ log!(&env, "native_token_a: {:?}", chain_a.native_token);
192
+ log!(&env, "oft_token_a: {:?}", chain_a.oft.token());
193
+ log!(&env, "oft_token_a decimals: {:?}", chain_a_oft_token_decimals);
194
+ log!(&env, "oft_a: {:?}", chain_a.oft.address);
195
+ log!(&env, "sml_a: {:?}", chain_a.sml.address);
196
+
197
+ log!(&env, "endpoint_b: {:?}", chain_b.endpoint.address);
198
+ log!(&env, "native_token_b: {:?}", chain_b.native_token);
199
+ log!(&env, "oft_token_b: {:?}", chain_b.oft.token());
200
+ log!(&env, "oft_token_b decimals: {:?}", chain_b_oft_token_decimals);
201
+ log!(&env, "oft_b: {:?}", chain_b.oft.address);
202
+ log!(&env, "sml_b: {:?}", chain_b.sml.address);
203
+
204
+ TestSetup { env, chain_a, chain_b }
205
+ }
206
+
207
+ pub fn wire_endpoint(env: &Env, chains: &[&ChainSetup<'_>]) {
208
+ for chain in chains {
209
+ for other_chain in chains {
210
+ if chain.endpoint.address == other_chain.endpoint.address {
211
+ continue;
212
+ }
213
+ set_default_send_library(env, &chain.owner, &chain.endpoint, other_chain.eid, &chain.sml.address);
214
+ set_default_receive_library(env, &chain.owner, &chain.endpoint, other_chain.eid, &chain.sml.address);
215
+ }
216
+ }
217
+ }
218
+
219
+ pub fn wire_oft(env: &Env, chains: &[&ChainSetup<'_>]) {
220
+ for chain in chains {
221
+ for other_chain in chains {
222
+ if chain.endpoint.address == other_chain.endpoint.address {
223
+ continue;
224
+ }
225
+ set_peer(
226
+ env,
227
+ &chain.owner,
228
+ &chain.oft,
229
+ other_chain.eid,
230
+ &address_to_peer_bytes32(&other_chain.oft.address),
231
+ );
232
+ }
233
+ }
234
+ }
235
+
236
+ pub fn set_peer(env: &Env, owner: &Address, oft: &OFTClient<'_>, dst_eid: u32, peer: &BytesN<32>) {
237
+ env.mock_auths(&[MockAuth {
238
+ address: owner,
239
+ invoke: &MockAuthInvoke {
240
+ contract: &oft.address,
241
+ fn_name: "set_peer",
242
+ args: (&dst_eid, &Some(peer.clone())).into_val(env),
243
+ sub_invokes: &[],
244
+ },
245
+ }]);
246
+ oapp::oapp_core::OAppCoreClient::new(env, &oft.address).set_peer(&dst_eid, &Some(peer.clone()));
247
+ }
248
+
249
+ pub fn register_library(env: &Env, owner: &Address, endpoint: &EndpointV2Client<'_>, lib: &Address) {
250
+ env.mock_auths(&[MockAuth {
251
+ address: owner,
252
+ invoke: &MockAuthInvoke {
253
+ contract: &endpoint.address,
254
+ fn_name: "register_library",
255
+ args: (lib,).into_val(env),
256
+ sub_invokes: &[],
257
+ },
258
+ }]);
259
+ endpoint.register_library(lib);
260
+ }
261
+
262
+ pub fn set_default_send_library(
263
+ env: &Env,
264
+ owner: &Address,
265
+ endpoint: &EndpointV2Client<'_>,
266
+ dst_eid: u32,
267
+ lib: &Address,
268
+ ) {
269
+ env.mock_auths(&[MockAuth {
270
+ address: owner,
271
+ invoke: &MockAuthInvoke {
272
+ contract: &endpoint.address,
273
+ fn_name: "set_default_send_library",
274
+ args: (&dst_eid, lib).into_val(env),
275
+ sub_invokes: &[],
276
+ },
277
+ }]);
278
+ endpoint.set_default_send_library(&dst_eid, lib);
279
+ }
280
+
281
+ pub fn set_default_receive_library(
282
+ env: &Env,
283
+ owner: &Address,
284
+ endpoint: &EndpointV2Client<'_>,
285
+ src_eid: u32,
286
+ lib: &Address,
287
+ ) {
288
+ env.mock_auths(&[MockAuth {
289
+ address: owner,
290
+ invoke: &MockAuthInvoke {
291
+ contract: &endpoint.address,
292
+ fn_name: "set_default_receive_library",
293
+ args: (&src_eid, lib, &0u64).into_val(env),
294
+ sub_invokes: &[],
295
+ },
296
+ }]);
297
+ endpoint.set_default_receive_library(&src_eid, lib, &0u64);
298
+ }
299
+
300
+ pub fn decode_packet(env: &Env, encoded_packet: &soroban_sdk::Bytes) -> endpoint_v2::OutboundPacket {
301
+ use message_lib_common::packet_codec_v1::*;
302
+ use utils::buffer_reader::BufferReader;
303
+
304
+ let header = decode_packet_header(env, &encoded_packet.slice(0..HEADER_LENGTH));
305
+ let payload = encoded_packet.slice(HEADER_LENGTH..);
306
+
307
+ let mut payload_reader = BufferReader::new(&payload);
308
+ let guid = payload_reader.read_bytes_n::<32>();
309
+ let message = payload_reader.read_bytes_until_end();
310
+
311
+ endpoint_v2::OutboundPacket {
312
+ nonce: header.nonce,
313
+ src_eid: header.src_eid,
314
+ sender: peer_bytes32_to_address(env, &header.sender),
315
+ dst_eid: header.dst_eid,
316
+ receiver: header.receiver,
317
+ guid,
318
+ message,
319
+ }
320
+ }
@@ -0,0 +1,155 @@
1
+ use core::ops::Mul;
2
+
3
+ use soroban_sdk::{bytes, log, testutils::Address as _, token::TokenClient, Address, Bytes, Env};
4
+
5
+ use crate::{
6
+ codec::{oft_compose_msg_codec::OFTComposeMsg, oft_msg_codec},
7
+ integration_tests::{
8
+ setup::{decode_packet, setup, wire_endpoint, wire_oft, TestSetup},
9
+ utils::{
10
+ lz_compose, lz_receive, mint_to, quote_oft, quote_send, scan_packet_sent_event, send, transfer_sac_admin,
11
+ validate_packet,
12
+ },
13
+ },
14
+ tests::test_utils::create_recipient_address,
15
+ types::SendParam,
16
+ utils::address_to_bytes32,
17
+ };
18
+
19
+ #[test]
20
+ fn test_send_vanilla() {
21
+ let TestSetup { env, chain_a, chain_b } = setup();
22
+
23
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
24
+ wire_oft(&env, &[&chain_a, &chain_b]);
25
+
26
+ let sender = Address::generate(&env);
27
+ // Register a dummy contract for the receiver so it passes the .exists() check
28
+ let receiver = create_recipient_address(&env);
29
+ log!(&env, "sender: {:?}", sender);
30
+ log!(&env, "receiver: {:?}", receiver);
31
+
32
+ // mint tokens and transfer oft token admin rights
33
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10e7 as i128);
34
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10e18 as i128);
35
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
36
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
37
+
38
+ // initial balances
39
+ let sender_balance_chain_a = TokenClient::new(&env, &chain_a.oft_token).balance(&sender);
40
+ let receiver_balance_chain_b = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
41
+ assert_eq!(sender_balance_chain_a, 10e7 as i128);
42
+ assert_eq!(receiver_balance_chain_b, 0);
43
+
44
+ let send_param = SendParam {
45
+ dst_eid: chain_b.eid,
46
+ to: address_to_bytes32(&receiver),
47
+ amount_ld: 10e7 as i128,
48
+ min_amount_ld: 10e7 as i128,
49
+ extra_options: bytes!(&env),
50
+ compose_msg: bytes!(&env),
51
+ oft_cmd: bytes!(&env),
52
+ };
53
+ log!(&env, "send_param: {:?}", send_param);
54
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
55
+ log!(&env, "oft_receipt: {:?}", oft_receipt);
56
+
57
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
58
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
59
+
60
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
61
+ validate_packet(&env, &chain_b, &packet_event);
62
+ let packet = decode_packet(&env, &packet_event.0);
63
+
64
+ // deliver the message on Chain B and execute lz_receive
65
+ let executor = Address::generate(&env);
66
+ log!(&env, "executor: {:?}", executor);
67
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
68
+
69
+ // assertions
70
+ let sender_balance_chain_a = TokenClient::new(&env, &chain_a.oft_token).balance(&sender);
71
+ let receiver_balance_chain_b = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
72
+ assert_eq!(sender_balance_chain_a, 0);
73
+ assert_eq!(receiver_balance_chain_b, 10e7 as i128);
74
+ }
75
+
76
+ #[test]
77
+ fn test_send_composed() {
78
+ let TestSetup { env, chain_a, chain_b } = setup();
79
+
80
+ wire_endpoint(&env, &[&chain_a, &chain_b]);
81
+ wire_oft(&env, &[&chain_a, &chain_b]);
82
+
83
+ let sender = Address::generate(&env);
84
+ let receiver = chain_b.composer.address.clone();
85
+ log!(&env, "sender: {:?}", sender);
86
+ log!(&env, "receiver: {:?}", receiver);
87
+
88
+ // mint tokens and transfer oft token admin rights
89
+ mint_to(&env, &chain_a.owner, &chain_a.oft_token, &sender, 10e7 as i128);
90
+ mint_to(&env, &chain_a.owner, &chain_a.native_token, &sender, 10e18 as i128);
91
+ transfer_sac_admin(&env, &chain_a.owner, &chain_a.oft_token, &chain_a.oft.address);
92
+ transfer_sac_admin(&env, &chain_b.owner, &chain_b.oft_token, &chain_b.oft.address);
93
+
94
+ // initial balances
95
+ let sender_balance_chain_a = TokenClient::new(&env, &chain_a.oft_token).balance(&sender);
96
+ let receiver_balance_chain_b = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
97
+ assert_eq!(sender_balance_chain_a, 10e7 as i128);
98
+ assert_eq!(receiver_balance_chain_b, 0);
99
+
100
+ let send_param = SendParam {
101
+ dst_eid: chain_b.eid,
102
+ to: address_to_bytes32(&receiver),
103
+ amount_ld: 10e7 as i128,
104
+ min_amount_ld: 10e7 as i128,
105
+ extra_options: bytes!(&env),
106
+ compose_msg: Bytes::from_array(&env, b"compose_msg"),
107
+ oft_cmd: bytes!(&env),
108
+ };
109
+ log!(&env, "send_param: {:?}", send_param);
110
+ let (_, _, oft_receipt) = quote_oft(&chain_a, &send_param);
111
+ log!(&env, "oft_receipt: {:?}", oft_receipt);
112
+
113
+ let fee = quote_send(&env, &chain_a, &sender, &send_param, false);
114
+ send(&env, &chain_a, &sender, &send_param, &fee, &sender, &oft_receipt);
115
+
116
+ let packet_event = scan_packet_sent_event(&env, &chain_a.endpoint.address).unwrap();
117
+ validate_packet(&env, &chain_b, &packet_event);
118
+ let packet = decode_packet(&env, &packet_event.0);
119
+
120
+ // deliver the message on Chain B and execute lz_receive
121
+ let executor = Address::generate(&env);
122
+ log!(&env, "executor: {:?}", executor);
123
+ lz_receive(&env, &chain_b, &executor, &packet, &receiver, 0);
124
+
125
+ // assertions
126
+ let sender_balance_chain_a = TokenClient::new(&env, &chain_a.oft_token).balance(&sender);
127
+ let receiver_balance_chain_b = TokenClient::new(&env, &chain_b.oft_token).balance(&receiver);
128
+ assert_eq!(sender_balance_chain_a, 0);
129
+ assert_eq!(receiver_balance_chain_b, 10e7 as i128);
130
+
131
+ // execute lz_compose
132
+ let extra_data = Bytes::from_array(&env, b"extra data");
133
+ let oft_msg = oft_msg_codec::OFTMessage::decode(&packet.message);
134
+ let oft_compose_msg = OFTComposeMsg {
135
+ nonce: packet.nonce,
136
+ src_eid: packet.src_eid,
137
+ amount_ld: (oft_msg.amount_sd as i128).mul(chain_b.oft.decimal_conversion_rate()),
138
+ compose_from: oft_msg.compose_from.unwrap(),
139
+ compose_msg: oft_msg.compose_msg.unwrap(),
140
+ }
141
+ .encode(&env);
142
+ let compose_value = 100;
143
+ let compose_index = 0;
144
+ lz_compose(&env, &chain_b, &executor, &packet, compose_index, &extra_data, compose_value);
145
+
146
+ // assertions
147
+ let compose_message = chain_b.composer.compose_message().unwrap();
148
+ assert_eq!(compose_message.executor, executor);
149
+ assert_eq!(compose_message.from, chain_b.oft.address);
150
+ assert_eq!(compose_message.guid, packet.guid);
151
+ assert_eq!(compose_message.index, compose_index);
152
+ assert_eq!(compose_message.message, oft_compose_msg);
153
+ assert_eq!(compose_message.extra_data, extra_data);
154
+ assert_eq!(compose_message.value, compose_value);
155
+ }
@@ -0,0 +1,201 @@
1
+ use core::ops::Mul;
2
+
3
+ use crate::{
4
+ codec::{oft_compose_msg_codec::OFTComposeMsg, oft_msg_codec},
5
+ integration_tests::setup::{decode_packet, ChainSetup},
6
+ types::{OFTFeeDetail, OFTLimit, OFTReceipt, SendParam},
7
+ };
8
+ use endpoint_v2::{MessagingFee, Origin, OutboundPacket};
9
+ use message_lib_common::packet_codec_v1;
10
+ use soroban_sdk::{
11
+ address_payload::AddressPayload,
12
+ testutils::{Events, MockAuth, MockAuthInvoke},
13
+ token::StellarAssetClient,
14
+ xdr::ToXdr,
15
+ Address, Bytes, BytesN, Env, IntoVal, Map, Symbol, Val, Vec,
16
+ };
17
+
18
+ pub fn address_to_peer_bytes32(address: &Address) -> BytesN<32> {
19
+ match address.to_payload().unwrap() {
20
+ AddressPayload::ContractIdHash(payload) => payload,
21
+ AddressPayload::AccountIdPublicKeyEd25519(_) => panic!("peer must be a contract"),
22
+ }
23
+ }
24
+
25
+ pub fn peer_bytes32_to_address(env: &Env, bytes32: &BytesN<32>) -> Address {
26
+ AddressPayload::ContractIdHash(bytes32.clone()).to_address(env)
27
+ }
28
+
29
+ pub fn quote_oft(chain: &ChainSetup<'_>, send_param: &SendParam) -> (OFTLimit, Vec<OFTFeeDetail>, OFTReceipt) {
30
+ chain.oft.quote_oft(send_param)
31
+ }
32
+
33
+ pub fn quote_send(
34
+ env: &Env,
35
+ chain: &ChainSetup<'_>,
36
+ sender: &Address,
37
+ send_param: &SendParam,
38
+ pay_in_zro: bool,
39
+ ) -> MessagingFee {
40
+ env.mock_auths(&[MockAuth {
41
+ address: sender,
42
+ invoke: &MockAuthInvoke {
43
+ contract: &chain.oft.address,
44
+ fn_name: "quote_send",
45
+ args: (sender, send_param, &pay_in_zro).into_val(env),
46
+ sub_invokes: &[],
47
+ },
48
+ }]);
49
+ chain.oft.quote_send(sender, send_param, &pay_in_zro)
50
+ }
51
+
52
+ pub fn send(
53
+ env: &Env,
54
+ chain: &ChainSetup<'_>,
55
+ sender: &Address,
56
+ send_param: &SendParam,
57
+ fee: &MessagingFee,
58
+ refund_address: &Address,
59
+ oft_receipt: &OFTReceipt,
60
+ ) {
61
+ env.mock_auths(&[MockAuth {
62
+ address: sender,
63
+ invoke: &MockAuthInvoke {
64
+ contract: &chain.oft.address,
65
+ fn_name: "send",
66
+ args: (sender, send_param, fee, refund_address).into_val(env),
67
+ sub_invokes: &[
68
+ MockAuthInvoke {
69
+ contract: &chain.native_token,
70
+ fn_name: "transfer",
71
+ args: (sender, &chain.endpoint.address, &fee.native_fee).into_val(env),
72
+ sub_invokes: &[],
73
+ },
74
+ MockAuthInvoke {
75
+ contract: &chain.oft_token,
76
+ fn_name: "burn",
77
+ args: (sender, &oft_receipt.amount_sent_ld).into_val(env),
78
+ sub_invokes: &[],
79
+ },
80
+ ],
81
+ },
82
+ }]);
83
+ chain.oft.send(sender, send_param, fee, refund_address);
84
+ }
85
+
86
+ pub fn validate_packet(env: &Env, chain: &ChainSetup<'_>, packet_event: &(Bytes, Bytes, Address)) {
87
+ let packet = decode_packet(env, &packet_event.0);
88
+ let encoded_header = packet_codec_v1::encode_packet_header(env, &packet);
89
+ let payload_hash = packet_codec_v1::payload_hash(env, &packet);
90
+
91
+ env.mock_auths(&[MockAuth {
92
+ address: &chain.owner,
93
+ invoke: &MockAuthInvoke {
94
+ contract: &chain.sml.address,
95
+ fn_name: "validate_packet",
96
+ args: (&encoded_header, &payload_hash).into_val(env),
97
+ sub_invokes: &[],
98
+ },
99
+ }]);
100
+ chain.sml.validate_packet(&encoded_header, &payload_hash);
101
+ }
102
+
103
+ pub fn lz_receive(
104
+ env: &Env,
105
+ chain: &ChainSetup<'_>,
106
+ executor: &Address,
107
+ packet: &OutboundPacket,
108
+ recipient: &Address,
109
+ value: i128,
110
+ ) {
111
+ let origin =
112
+ Origin { src_eid: packet.src_eid, sender: address_to_peer_bytes32(&packet.sender), nonce: packet.nonce };
113
+ let extra_options = recipient.to_xdr(env);
114
+
115
+ env.mock_auths(&[MockAuth {
116
+ address: executor,
117
+ invoke: &MockAuthInvoke {
118
+ contract: &chain.oft.address,
119
+ fn_name: "lz_receive",
120
+ args: (executor, &origin, &packet.guid, &packet.message, &extra_options, &value).into_val(env),
121
+ sub_invokes: &[],
122
+ },
123
+ }]);
124
+ endpoint_v2::LayerZeroReceiverClient::new(env, &chain.oft.address).lz_receive(
125
+ executor,
126
+ &origin,
127
+ &packet.guid,
128
+ &packet.message,
129
+ &extra_options,
130
+ &value,
131
+ );
132
+ }
133
+
134
+ pub fn lz_compose(
135
+ env: &Env,
136
+ chain: &ChainSetup<'_>,
137
+ executor: &Address,
138
+ packet: &OutboundPacket,
139
+ index: u32,
140
+ extra_data: &Bytes,
141
+ value: i128,
142
+ ) {
143
+ let oft_msg = oft_msg_codec::OFTMessage::decode(&packet.message);
144
+ let oft_compose_msg = OFTComposeMsg {
145
+ nonce: packet.nonce,
146
+ src_eid: packet.src_eid,
147
+ amount_ld: (oft_msg.amount_sd as i128).mul(chain.oft.decimal_conversion_rate()),
148
+ compose_from: oft_msg.compose_from.unwrap(),
149
+ compose_msg: oft_msg.compose_msg.unwrap(),
150
+ }
151
+ .encode(&env);
152
+
153
+ chain.composer.lz_compose(executor, &chain.oft.address, &packet.guid, &index, &oft_compose_msg, extra_data, &value);
154
+ }
155
+
156
+ // returns (encoded_payload, options, send_library)
157
+ pub fn scan_packet_sent_event(env: &Env, endpoint: &Address) -> Option<(Bytes, Bytes, Address)> {
158
+ let mut packet = None;
159
+ for (emitter, topics, data) in env.events().all() {
160
+ let packet_sent_symbol = Symbol::new(env, "PacketSent").to_val();
161
+ if emitter == *endpoint && topics.contains(packet_sent_symbol) {
162
+ let map: Map<Symbol, Val> = data.into_val(env);
163
+
164
+ let encoded_payload: Bytes = map.get(Symbol::new(env, "encoded_packet")).unwrap().into_val(env);
165
+ let options: Bytes = map.get(Symbol::new(env, "options")).unwrap().into_val(env);
166
+ let send_library: Address = map.get(Symbol::new(env, "send_library")).unwrap().into_val(env);
167
+
168
+ packet = Some((encoded_payload, options, send_library));
169
+ }
170
+ }
171
+
172
+ packet
173
+ }
174
+
175
+ pub fn mint_to(env: &Env, owner: &Address, token: &Address, to: &Address, amount: i128) {
176
+ env.mock_auths(&[MockAuth {
177
+ address: owner,
178
+ invoke: &MockAuthInvoke {
179
+ contract: token,
180
+ fn_name: "mint",
181
+ args: (to, amount).into_val(env),
182
+ sub_invokes: &[],
183
+ },
184
+ }]);
185
+
186
+ let sac = StellarAssetClient::new(env, token);
187
+ sac.mint(to, &amount);
188
+ }
189
+
190
+ pub fn transfer_sac_admin(env: &Env, owner: &Address, token: &Address, new_admin: &Address) {
191
+ env.mock_auths(&[MockAuth {
192
+ address: owner,
193
+ invoke: &MockAuthInvoke {
194
+ contract: token,
195
+ fn_name: "set_admin",
196
+ args: (new_admin,).into_val(env),
197
+ sub_invokes: &[],
198
+ },
199
+ }]);
200
+ StellarAssetClient::new(env, token).set_admin(new_admin);
201
+ }
@@ -0,0 +1,2 @@
1
+ pub mod oft_compose_msg_codec;
2
+ pub mod oft_msg_codec;