@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
@@ -2,6 +2,39 @@ use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, Addr
2
2
 
3
3
  use crate::buffer_reader::BufferReader;
4
4
  use crate::buffer_writer::BufferWriter;
5
+ use crate::bytes_ext::BytesExt;
6
+
7
+ use crate::tests::test_helper::assert_address_payload_matches;
8
+
9
+ /// Helper to test U256 write/read roundtrip
10
+ fn test_u256_roundtrip(env: &Env, value: &soroban_sdk::U256) {
11
+ let mut writer = BufferWriter::new(env);
12
+ writer.write_u256(value.clone());
13
+ let bytes = writer.to_bytes();
14
+ assert_eq!(bytes.len(), 32);
15
+
16
+ let mut reader = BufferReader::new(&bytes);
17
+ assert_eq!(reader.read_u256(), *value);
18
+ assert_eq!(reader.remaining_len(), 0);
19
+ }
20
+
21
+ /// Helper to test address write/read roundtrip
22
+ fn test_address_write_roundtrip(env: &Env, address: &Address) {
23
+ let mut writer = BufferWriter::new(env);
24
+ writer.write_address(address);
25
+
26
+ // Address is 33 bytes (1 type + 32 payload)
27
+ let bytes = writer.to_bytes();
28
+ assert_eq!(bytes.len(), 33);
29
+
30
+ let mut reader = BufferReader::new(&bytes);
31
+ assert_eq!(reader.read_address(), *address);
32
+ assert_eq!(reader.remaining_len(), 0);
33
+ }
34
+
35
+ // ============================================
36
+ // constructor tests (new, from_bytes)
37
+ // ============================================
5
38
 
6
39
  #[test]
7
40
  fn test_new_buffer_writer() {
@@ -13,105 +46,204 @@ fn test_new_buffer_writer() {
13
46
  }
14
47
 
15
48
  #[test]
16
- fn test_write_u8() {
49
+ fn test_from_bytes() {
17
50
  let env = Env::default();
18
- let mut writer = BufferWriter::new(&env);
51
+ let initial = Bytes::from_array(&env, &[0x01, 0x02]);
52
+ let mut writer = BufferWriter::from_bytes(initial);
19
53
 
20
- writer.write_u8(0x42);
54
+ writer.write_u8(0x03).write_u16(0x0405);
21
55
 
22
56
  let bytes = writer.to_bytes();
23
- assert_eq!(bytes.len(), 1);
24
- assert_eq!(bytes.get(0).unwrap(), 0x42);
57
+ assert_eq!(bytes.len(), 5);
58
+ assert_eq!(bytes.get(0).unwrap(), 0x01);
59
+ assert_eq!(bytes.get(1).unwrap(), 0x02);
60
+ assert_eq!(bytes.get(2).unwrap(), 0x03);
61
+ assert_eq!(bytes.get(3).unwrap(), 0x04);
62
+ assert_eq!(bytes.get(4).unwrap(), 0x05);
25
63
  }
26
64
 
27
65
  #[test]
28
- fn test_write_u16() {
66
+ fn test_from_bytes_with_large_buffer() {
29
67
  let env = Env::default();
30
- let mut writer = BufferWriter::new(&env);
68
+ let initial_data: [u8; 100] = core::array::from_fn(|i| i as u8);
69
+ let initial = Bytes::from_array(&env, &initial_data);
70
+ let mut writer = BufferWriter::from_bytes(initial);
31
71
 
32
- writer.write_u16(0x1234);
72
+ writer.write_u32(0xDEADBEEF);
33
73
 
34
74
  let bytes = writer.to_bytes();
35
- assert_eq!(bytes.len(), 2);
36
- assert_eq!(bytes.get(0).unwrap(), 0x12);
37
- assert_eq!(bytes.get(1).unwrap(), 0x34);
75
+ assert_eq!(bytes.len(), 104);
76
+ assert_eq!(bytes.get(0).unwrap(), 0);
77
+ assert_eq!(bytes.get(99).unwrap(), 99);
78
+ // Verify appended data
79
+ let mut reader = BufferReader::new(&bytes);
80
+ reader.skip(100);
81
+ assert_eq!(reader.read_u32(), 0xDEADBEEF);
38
82
  }
39
83
 
40
84
  #[test]
41
- fn test_write_u32() {
85
+ fn test_from_bytes_empty() {
42
86
  let env = Env::default();
43
- let mut writer = BufferWriter::new(&env);
87
+ let empty = Bytes::new(&env);
88
+ let mut writer = BufferWriter::from_bytes(empty);
44
89
 
45
- writer.write_u32(0x12345678);
90
+ writer.write_u8(0x42);
46
91
 
47
92
  let bytes = writer.to_bytes();
48
- assert_eq!(bytes.len(), 4);
49
- assert_eq!(bytes.get(0).unwrap(), 0x12);
50
- assert_eq!(bytes.get(1).unwrap(), 0x34);
51
- assert_eq!(bytes.get(2).unwrap(), 0x56);
52
- assert_eq!(bytes.get(3).unwrap(), 0x78);
93
+ assert_eq!(bytes.len(), 1);
94
+ assert_eq!(bytes.get(0).unwrap(), 0x42);
53
95
  }
54
96
 
97
+ // ============================================
98
+ // write_primitives tests (u8, u16, u32, u64, u128, u256, bool)
99
+ // ============================================
100
+
55
101
  #[test]
56
- fn test_write_u64() {
102
+ fn test_write_primitives_big_endian_golden_bytes() {
57
103
  let env = Env::default();
58
104
  let mut writer = BufferWriter::new(&env);
59
-
60
- writer.write_u64(0x0102030405060708);
105
+ writer
106
+ .write_u8(0x12)
107
+ .write_u16(0x3456)
108
+ .write_u32(0x789ABCDE)
109
+ .write_u64(0x0102030405060708)
110
+ .write_u128(0x0102030405060708090a0b0c0d0e0f10);
61
111
 
62
112
  let bytes = writer.to_bytes();
63
- assert_eq!(bytes.len(), 8);
64
- assert_eq!(bytes.get(0).unwrap(), 0x01);
65
- assert_eq!(bytes.get(7).unwrap(), 0x08);
113
+ let got: [u8; 31] = bytes.to_array();
114
+
115
+ let expected: [u8; 31] = [
116
+ 0x12, // u8
117
+ 0x34, 0x56, // u16
118
+ 0x78, 0x9A, 0xBC, 0xDE, // u32
119
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, // u64
120
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, // u128
121
+ ];
122
+ assert_eq!(got, expected);
66
123
  }
67
124
 
68
125
  #[test]
69
- fn test_write_u128() {
126
+ fn test_write_primitives_roundtrip() {
70
127
  let env = Env::default();
71
128
  let mut writer = BufferWriter::new(&env);
72
129
 
73
- writer.write_u128(200000u128);
130
+ writer
131
+ .write_u8(0x12)
132
+ .write_u16(0x3456)
133
+ .write_u32(0x789ABCDE)
134
+ .write_u64(0x0102030405060708)
135
+ .write_u128(0x10111213141516171819_1a1b1c1d1e1f);
74
136
 
75
137
  let bytes = writer.to_bytes();
76
- assert_eq!(bytes.len(), 16);
138
+ // 1 + 2 + 4 + 8 + 16 = 31
139
+ assert_eq!(bytes.len(), 31);
140
+
141
+ // Verify with reader
142
+ let mut reader = BufferReader::new(&bytes);
143
+ assert_eq!(reader.read_u8(), 0x12);
144
+ assert_eq!(reader.read_u16(), 0x3456);
145
+ assert_eq!(reader.read_u32(), 0x789ABCDE);
146
+ assert_eq!(reader.read_u64(), 0x0102030405060708);
147
+ assert_eq!(reader.read_u128(), 0x10111213141516171819_1a1b1c1d1e1f);
77
148
  }
78
149
 
79
150
  #[test]
80
- fn test_write_u256() {
151
+ fn test_write_boundary_values() {
81
152
  let env = Env::default();
82
153
  let mut writer = BufferWriter::new(&env);
83
154
 
84
- let value = U256::from_u32(&env, 0x12345678);
85
- writer.write_u256(value);
155
+ writer
156
+ .write_u8(0)
157
+ .write_u8(u8::MAX)
158
+ .write_u16(0)
159
+ .write_u16(u16::MAX)
160
+ .write_u32(0)
161
+ .write_u32(u32::MAX)
162
+ .write_u64(0)
163
+ .write_u64(u64::MAX)
164
+ .write_u128(0)
165
+ .write_u128(u128::MAX);
86
166
 
87
167
  let bytes = writer.to_bytes();
88
- assert_eq!(bytes.len(), 32);
168
+ let mut reader = BufferReader::new(&bytes);
169
+
170
+ assert_eq!(reader.read_u8(), 0);
171
+ assert_eq!(reader.read_u8(), u8::MAX);
172
+ assert_eq!(reader.read_u16(), 0);
173
+ assert_eq!(reader.read_u16(), u16::MAX);
174
+ assert_eq!(reader.read_u32(), 0);
175
+ assert_eq!(reader.read_u32(), u32::MAX);
176
+ assert_eq!(reader.read_u64(), 0);
177
+ assert_eq!(reader.read_u64(), u64::MAX);
178
+ assert_eq!(reader.read_u128(), 0);
179
+ assert_eq!(reader.read_u128(), u128::MAX);
89
180
  }
90
181
 
91
182
  #[test]
92
- fn test_write_bool_true() {
183
+ fn test_write_bool() {
93
184
  let env = Env::default();
94
185
  let mut writer = BufferWriter::new(&env);
95
186
 
96
- writer.write_bool(true);
187
+ writer.write_bool(true).write_bool(false).write_bool(true);
97
188
 
98
189
  let bytes = writer.to_bytes();
99
- assert_eq!(bytes.len(), 1);
100
- assert_eq!(bytes.get(0).unwrap(), 1);
190
+ assert_eq!(bytes.len(), 3);
191
+
192
+ let mut reader = BufferReader::new(&bytes);
193
+ assert!(reader.read_bool());
194
+ assert!(!reader.read_bool());
195
+ assert!(reader.read_bool());
101
196
  }
102
197
 
103
198
  #[test]
104
- fn test_write_bool_false() {
199
+ fn test_write_u256_boundary_values() {
200
+ use soroban_sdk::U256;
201
+ let env = Env::default();
202
+
203
+ // Zero
204
+ let zero = U256::from_u32(&env, 0);
205
+ test_u256_roundtrip(&env, &zero);
206
+
207
+ // From u128::MAX
208
+ let from_u128_max = U256::from_u128(&env, u128::MAX);
209
+ test_u256_roundtrip(&env, &from_u128_max);
210
+
211
+ // Max (all 0xFF bytes)
212
+ let max_bytes = Bytes::from_array(&env, &[0xFF; 32]);
213
+ let max_u256 = U256::from_be_bytes(&env, &max_bytes);
214
+ test_u256_roundtrip(&env, &max_u256);
215
+ }
216
+
217
+ #[test]
218
+ fn test_write_mixed_sizes_no_alignment_issues() {
105
219
  let env = Env::default();
106
220
  let mut writer = BufferWriter::new(&env);
107
221
 
108
- writer.write_bool(false);
222
+ // Test that byte-packed writes work correctly regardless of "alignment"
223
+ // (Soroban Bytes has no alignment requirements, but this documents the behavior)
224
+ writer
225
+ .write_u8(0x01)
226
+ .write_u64(0x0203040506070809)
227
+ .write_u8(0x0A)
228
+ .write_u128(0x0B0C0D0E0F101112131415161718191A)
229
+ .write_u8(0x1B);
230
+
231
+ assert_eq!(writer.len(), 1 + 8 + 1 + 16 + 1); // 27 bytes
109
232
 
110
233
  let bytes = writer.to_bytes();
111
- assert_eq!(bytes.len(), 1);
112
- assert_eq!(bytes.get(0).unwrap(), 0);
234
+ let mut reader = BufferReader::new(&bytes);
235
+ assert_eq!(reader.read_u8(), 0x01);
236
+ assert_eq!(reader.read_u64(), 0x0203040506070809);
237
+ assert_eq!(reader.read_u8(), 0x0A);
238
+ assert_eq!(reader.read_u128(), 0x0B0C0D0E0F101112131415161718191A);
239
+ assert_eq!(reader.read_u8(), 0x1B);
240
+ assert_eq!(reader.remaining_len(), 0);
113
241
  }
114
242
 
243
+ // ============================================
244
+ // write_bytes tests (write_bytes, write_bytes_n)
245
+ // ============================================
246
+
115
247
  #[test]
116
248
  fn test_write_bytes() {
117
249
  let env = Env::default();
@@ -127,204 +259,260 @@ fn test_write_bytes() {
127
259
  }
128
260
 
129
261
  #[test]
130
- fn test_write_bytes_n() {
262
+ fn test_write_bytes_empty() {
131
263
  let env = Env::default();
132
264
  let mut writer = BufferWriter::new(&env);
133
265
 
134
- let data: [u8; 32] = [0x42; 32];
135
- let bytes32 = BytesN::<32>::from_array(&env, &data);
136
- writer.write_bytes_n(&bytes32);
266
+ let empty = Bytes::new(&env);
267
+ writer.write_bytes(&empty);
137
268
 
138
269
  let bytes = writer.to_bytes();
139
- assert_eq!(bytes.len(), 32);
140
- assert_eq!(bytes.get(0).unwrap(), 0x42);
141
- assert_eq!(bytes.get(31).unwrap(), 0x42);
270
+ assert_eq!(bytes.len(), 0);
142
271
  }
143
272
 
144
273
  #[test]
145
- fn test_write_bytes_n_different_sizes() {
274
+ fn test_write_bytes_n() {
146
275
  let env = Env::default();
147
276
  let mut writer = BufferWriter::new(&env);
148
277
 
149
- // Write BytesN<4>
150
278
  let bytes4 = BytesN::<4>::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
151
- writer.write_bytes_n(&bytes4);
152
-
153
- // Write BytesN<8>
154
279
  let bytes8 = BytesN::<8>::from_array(&env, &[0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c]);
155
- writer.write_bytes_n(&bytes8);
280
+ let bytes32 = BytesN::<32>::from_array(&env, &[0x42; 32]);
281
+
282
+ writer.write_bytes_n(&bytes4).write_bytes_n(&bytes8).write_bytes_n(&bytes32);
156
283
 
157
284
  let bytes = writer.to_bytes();
158
- assert_eq!(bytes.len(), 12); // 4 + 8
159
- assert_eq!(bytes.get(0).unwrap(), 0x01);
160
- assert_eq!(bytes.get(4).unwrap(), 0x05);
285
+ assert_eq!(bytes.len(), 4 + 8 + 32);
286
+
287
+ let mut reader = BufferReader::new(&bytes);
288
+ assert_eq!(reader.read_bytes_n::<4>(), bytes4);
289
+ assert_eq!(reader.read_bytes_n::<8>(), bytes8);
290
+ assert_eq!(reader.read_bytes_n::<32>(), bytes32);
161
291
  }
162
292
 
163
293
  #[test]
164
- fn test_write_address_contract() {
294
+ fn test_write_bytes_n_array() {
165
295
  let env = Env::default();
166
296
  let mut writer = BufferWriter::new(&env);
297
+ let bytes = writer.write_array(&[0x01, 0x02, 0x03, 0x04]).to_bytes();
298
+ assert_eq!(bytes.len(), 4);
299
+ assert_eq!(bytes.get(0).unwrap(), 0x01);
300
+ assert_eq!(bytes.get(3).unwrap(), 0x04);
301
+ }
302
+
303
+ // ============================================
304
+ // write_address tests
305
+ // ============================================
167
306
 
168
- // Generate a contract address
307
+ #[test]
308
+ fn test_write_address_contract() {
309
+ let env = Env::default();
169
310
  let address = Address::generate(&env);
170
311
  let payload = address.to_payload().unwrap();
171
312
  assert!(matches!(payload, AddressPayload::ContractIdHash(_)));
172
-
173
- writer.write_address(&address);
174
-
175
- // Address is 33 bytes (1 type + 32 payload)
176
- let bytes = writer.to_bytes();
177
- assert_eq!(bytes.len(), 33);
313
+ test_address_write_roundtrip(&env, &address);
178
314
  }
179
315
 
180
316
  #[test]
181
317
  fn test_write_address_account() {
182
318
  let env = Env::default();
183
- let mut writer = BufferWriter::new(&env);
184
-
185
- // Create an account address
186
319
  let account_payload = BytesN::<32>::from_array(&env, &[0x42; 32]);
187
320
  let address = Address::from_payload(&env, AddressPayload::AccountIdPublicKeyEd25519(account_payload));
188
321
  let payload = address.to_payload().unwrap();
189
322
  assert!(matches!(payload, AddressPayload::AccountIdPublicKeyEd25519(_)));
323
+ test_address_write_roundtrip(&env, &address);
324
+ }
190
325
 
191
- writer.write_address(&address);
326
+ #[test]
327
+ fn test_write_multiple_addresses() {
328
+ let env = Env::default();
329
+ let mut writer = BufferWriter::new(&env);
330
+
331
+ let addr1 = Address::generate(&env);
332
+ let addr2 = Address::generate(&env);
333
+ let addr3 = Address::generate(&env);
334
+
335
+ writer.write_address(&addr1).write_address(&addr2).write_address(&addr3);
192
336
 
193
- // Address is 33 bytes (1 type + 32 payload)
194
337
  let bytes = writer.to_bytes();
195
- assert_eq!(bytes.len(), 33);
338
+ assert_eq!(bytes.len(), 99); // 33 * 3
339
+
340
+ let mut reader = BufferReader::new(&bytes);
341
+ assert_eq!(reader.read_address(), addr1);
342
+ assert_eq!(reader.read_address(), addr2);
343
+ assert_eq!(reader.read_address(), addr3);
196
344
  }
197
345
 
346
+ // ============================================
347
+ // write_address_payload tests
348
+ // ============================================
349
+
198
350
  #[test]
199
- fn test_write_address_roundtrip() {
351
+ fn test_write_address_payload() {
200
352
  let env = Env::default();
201
- let mut writer = BufferWriter::new(&env);
202
-
203
353
  let address = Address::generate(&env);
204
- writer.write_address(&address);
354
+ let expected_payload = address.to_payload().unwrap();
205
355
 
356
+ let mut writer = BufferWriter::new(&env);
357
+ writer.write_address_payload(&address);
206
358
  let bytes = writer.to_bytes();
207
- let mut reader = BufferReader::new(&bytes);
208
- let read_address = reader.read_address();
209
359
 
210
- // Verify round-trip
211
- assert_eq!(read_address, address);
212
- assert_eq!(reader.remaining(), 0);
360
+ // Verify it's exactly 32 bytes (no type byte)
361
+ assert_eq!(bytes.len(), 32);
362
+
363
+ // Verify the payload matches
364
+ let mut reader = BufferReader::new(&bytes);
365
+ let payload = reader.read_address_payload();
366
+ assert_address_payload_matches(payload, expected_payload);
367
+ assert_eq!(reader.remaining_len(), 0);
213
368
  }
214
369
 
215
370
  #[test]
216
- fn test_chaining() {
371
+ fn test_write_address_payload_with_other_data() {
217
372
  let env = Env::default();
373
+ let address = Address::generate(&env);
374
+
218
375
  let mut writer = BufferWriter::new(&env);
376
+ writer.write_u32(0x12345678).write_address_payload(&address).write_u64(0xAABBCCDDEEFF0011);
377
+ let bytes = writer.to_bytes();
219
378
 
220
- writer.write_u8(0x01).write_u16(0x0203).write_u32(0x04050607);
379
+ assert_eq!(bytes.len(), 4 + 32 + 8); // u32 + payload (32) + u64
221
380
 
222
- let bytes = writer.to_bytes();
223
- assert_eq!(bytes.len(), 1 + 2 + 4); // 7 bytes total
381
+ let mut reader = BufferReader::new(&bytes);
382
+ assert_eq!(reader.read_u32(), 0x12345678);
383
+ let payload = reader.read_address_payload();
384
+ assert_address_payload_matches(payload, address.to_payload().unwrap());
385
+ assert_eq!(reader.read_u64(), 0xAABBCCDDEEFF0011);
386
+ assert_eq!(reader.remaining_len(), 0);
224
387
  }
225
388
 
389
+ // ============================================
390
+ // chaining tests
391
+ // ============================================
392
+
226
393
  #[test]
227
- fn test_from_bytes() {
394
+ fn test_chaining_empty_bytes() {
228
395
  let env = Env::default();
229
- let initial = Bytes::from_array(&env, &[0x01, 0x02]);
230
- let mut writer = BufferWriter::from_bytes(initial);
396
+ let mut writer = BufferWriter::new(&env);
231
397
 
232
- writer.write_u8(0x03);
398
+ let empty = Bytes::new(&env);
399
+ writer.write_bytes(&empty).write_u8(0x42).write_bytes(&empty);
233
400
 
234
401
  let bytes = writer.to_bytes();
235
- assert_eq!(bytes.len(), 3);
236
- assert_eq!(bytes.get(0).unwrap(), 0x01);
237
- assert_eq!(bytes.get(1).unwrap(), 0x02);
238
- assert_eq!(bytes.get(2).unwrap(), 0x03);
402
+ assert_eq!(bytes.len(), 1); // Only the u8
403
+ assert_eq!(bytes.get(0).unwrap(), 0x42);
239
404
  }
240
405
 
241
- // Round-trip tests: write -> read
406
+ // ============================================
407
+ // buffer_access tests (len, is_empty, env)
408
+ // ============================================
409
+
242
410
  #[test]
243
- fn test_roundtrip_primitives() {
411
+ fn test_len_after_writes() {
244
412
  let env = Env::default();
245
413
  let mut writer = BufferWriter::new(&env);
246
414
 
247
- writer
248
- .write_u8(0x12)
249
- .write_u16(0x3456)
250
- .write_u32(0x789ABCDE)
251
- .write_u64(0x0102030405060708)
252
- .write_bool(true)
253
- .write_bool(false);
415
+ assert_eq!(writer.len(), 0);
416
+ assert!(writer.is_empty());
254
417
 
255
- let bytes = writer.to_bytes();
256
- let mut reader = BufferReader::new(&bytes);
418
+ writer.write_u8(0x01);
419
+ assert_eq!(writer.len(), 1);
420
+ assert!(!writer.is_empty());
257
421
 
258
- assert_eq!(reader.read_u8(), 0x12);
259
- assert_eq!(reader.read_u16(), 0x3456);
260
- assert_eq!(reader.read_u32(), 0x789ABCDE);
261
- assert_eq!(reader.read_u64(), 0x0102030405060708);
262
- assert!(reader.read_bool());
263
- assert!(!reader.read_bool());
264
- assert_eq!(reader.remaining(), 0);
422
+ writer.write_u16(0x0203);
423
+ assert_eq!(writer.len(), 3);
424
+
425
+ writer.write_u32(0x04050607);
426
+ assert_eq!(writer.len(), 7);
265
427
  }
266
428
 
267
429
  #[test]
268
- fn test_roundtrip_address() {
430
+ fn test_env_from_writer() {
269
431
  let env = Env::default();
432
+ let writer = BufferWriter::new(&env);
433
+
434
+ // Verify we can use the env reference from the writer
435
+ let _new_bytes = Bytes::from_array(writer.env(), &[0x01, 0x02]);
436
+ }
270
437
 
271
- // Generate address
272
- let original_address = Address::generate(&env);
438
+ // ============================================
439
+ // complex_roundtrip tests
440
+ // ============================================
273
441
 
274
- // Write
442
+ #[test]
443
+ fn test_complex_message_roundtrip() {
444
+ let env = Env::default();
275
445
  let mut writer = BufferWriter::new(&env);
276
- writer.write_address(&original_address);
446
+
447
+ // Simulate a complex message structure
448
+ let version: u8 = 1;
449
+ let msg_type: u16 = 0x0102;
450
+ let sender = Address::generate(&env);
451
+ let nonce: u64 = 12345678;
452
+ let amount = U256::from_u128(&env, 1000000000000000000u128);
453
+ let payload = Bytes::from_array(&env, &[0xDE, 0xAD, 0xBE, 0xEF]);
454
+
455
+ writer
456
+ .write_u8(version)
457
+ .write_u16(msg_type)
458
+ .write_address(&sender)
459
+ .write_u64(nonce)
460
+ .write_u256(amount.clone())
461
+ .write_bytes(&payload);
462
+
277
463
  let bytes = writer.to_bytes();
278
464
 
279
- // Read
465
+ // Read back and verify
280
466
  let mut reader = BufferReader::new(&bytes);
281
- let read_address = reader.read_address();
282
-
283
- // Verify round-trip
284
- assert_eq!(read_address, original_address);
285
- assert_eq!(reader.remaining(), 0);
467
+ assert_eq!(reader.read_u8(), version);
468
+ assert_eq!(reader.read_u16(), msg_type);
469
+ assert_eq!(reader.read_address(), sender);
470
+ assert_eq!(reader.read_u64(), nonce);
471
+ assert_eq!(reader.read_u256(), amount);
472
+
473
+ let read_payload = reader.read_bytes(4);
474
+ assert_eq!(read_payload.len(), 4);
475
+ assert_eq!(read_payload.get(0).unwrap(), 0xDE);
476
+ assert_eq!(read_payload.get(3).unwrap(), 0xEF);
286
477
  }
287
478
 
479
+ // ============================================
480
+ // stress_and_edge_case tests
481
+ // ============================================
482
+
288
483
  #[test]
289
- fn test_roundtrip_bytes_n() {
484
+ fn test_write_large_buffer() {
290
485
  let env = Env::default();
486
+ let mut writer = BufferWriter::new(&env);
291
487
 
292
- let original: [u8; 32] = [
293
- 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
294
- 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
295
- ];
296
- let original_bytes32 = BytesN::<32>::from_array(&env, &original);
488
+ // Write many items to test buffer growth
489
+ for i in 0..1000u32 {
490
+ writer.write_u32(i);
491
+ }
297
492
 
298
- // Write
299
- let mut writer = BufferWriter::new(&env);
300
- writer.write_bytes_n(&original_bytes32);
301
- let bytes = writer.to_bytes();
493
+ assert_eq!(writer.len(), 4000);
302
494
 
303
- // Read
495
+ // Verify via reader
496
+ let bytes = writer.to_bytes();
304
497
  let mut reader = BufferReader::new(&bytes);
305
- let read_bytes32 = reader.read_bytes_n::<32>();
306
-
307
- // Verify round-trip
308
- assert_eq!(read_bytes32, original_bytes32);
309
- assert_eq!(reader.remaining(), 0);
498
+ for i in 0..1000u32 {
499
+ assert_eq!(reader.read_u32(), i);
500
+ }
310
501
  }
311
502
 
312
503
  #[test]
313
- fn test_roundtrip_u256() {
504
+ fn test_write_repeated_values() {
314
505
  let env = Env::default();
506
+ let mut writer = BufferWriter::new(&env);
315
507
 
316
- let original = U256::from_u32(&env, 0x12345678);
508
+ for _ in 0..100 {
509
+ writer.write_u8(0xFF);
510
+ }
317
511
 
318
- // Write
319
- let mut writer = BufferWriter::new(&env);
320
- writer.write_u256(original.clone());
321
512
  let bytes = writer.to_bytes();
513
+ assert_eq!(bytes.len(), 100);
322
514
 
323
- // Read
324
- let mut reader = BufferReader::new(&bytes);
325
- let read_value = reader.read_u256();
326
-
327
- // Verify round-trip
328
- assert_eq!(read_value, original);
329
- assert_eq!(reader.remaining(), 0);
515
+ for i in 0..100 {
516
+ assert_eq!(bytes.get(i).unwrap(), 0xFF);
517
+ }
330
518
  }