@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,1006 @@
1
+ use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, Address, Bytes, BytesN, Env};
2
+
3
+ use crate::buffer_reader::BufferReader;
4
+ use crate::buffer_writer::BufferWriter;
5
+
6
+ #[test]
7
+ fn test_new_buffer_reader() {
8
+ let env = Env::default();
9
+ let bytes = Bytes::from_array(&env, &[0u8, 1, 2, 3, 4, 5]);
10
+ let _reader = BufferReader::new(&bytes);
11
+
12
+ // Verify reader is created (we can't access pos directly but can verify by reading)
13
+ assert!(true); // Successfully created
14
+ }
15
+
16
+ #[test]
17
+ fn test_read_u32() {
18
+ let env = Env::default();
19
+ // Create bytes representing u32 value 0x01020304 (16909060 in decimal)
20
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
21
+ let mut reader = BufferReader::new(&bytes);
22
+
23
+ let value = reader.read_u32();
24
+ assert_eq!(value, 0x01020304u32);
25
+ }
26
+
27
+ #[test]
28
+ fn test_read_u32_zero() {
29
+ let env = Env::default();
30
+ let bytes = Bytes::from_array(&env, &[0x00, 0x00, 0x00, 0x00]);
31
+ let mut reader = BufferReader::new(&bytes);
32
+
33
+ let value = reader.read_u32();
34
+ assert_eq!(value, 0u32);
35
+ }
36
+
37
+ #[test]
38
+ fn test_read_u32_max_value() {
39
+ let env = Env::default();
40
+ let bytes = Bytes::from_array(&env, &[0xFF, 0xFF, 0xFF, 0xFF]);
41
+ let mut reader = BufferReader::new(&bytes);
42
+
43
+ let value = reader.read_u32();
44
+ assert_eq!(value, u32::MAX);
45
+ }
46
+
47
+ #[test]
48
+ fn test_read_u64() {
49
+ let env = Env::default();
50
+ // Create bytes representing u64 value 0x0102030405060708
51
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]);
52
+ let mut reader = BufferReader::new(&bytes);
53
+
54
+ let value = reader.read_u64();
55
+ assert_eq!(value, 0x0102030405060708u64);
56
+ }
57
+
58
+ #[test]
59
+ fn test_read_u64_zero() {
60
+ let env = Env::default();
61
+ let bytes = Bytes::from_array(&env, &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
62
+ let mut reader = BufferReader::new(&bytes);
63
+
64
+ let value = reader.read_u64();
65
+ assert_eq!(value, 0u64);
66
+ }
67
+
68
+ #[test]
69
+ fn test_read_u64_max_value() {
70
+ let env = Env::default();
71
+ let bytes = Bytes::from_array(&env, &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
72
+ let mut reader = BufferReader::new(&bytes);
73
+
74
+ let value = reader.read_u64();
75
+ assert_eq!(value, u64::MAX);
76
+ }
77
+
78
+ #[test]
79
+ fn test_sequential_reads() {
80
+ let env = Env::default();
81
+
82
+ // Create a buffer with multiple values:
83
+ // - u32: 0x01020304
84
+ // - u64: 0x0102030405060708
85
+ // - another u32: 0xAABBCCDD
86
+ let buffer_array: [u8; 16] = [
87
+ 0x01, 0x02, 0x03, 0x04, // u32
88
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, // u64
89
+ 0xAA, 0xBB, 0xCC, 0xDD, // u32
90
+ ];
91
+
92
+ let bytes = Bytes::from_array(&env, &buffer_array);
93
+ let mut reader = BufferReader::new(&bytes);
94
+
95
+ // Read in sequence and verify position is being tracked correctly
96
+ let val1 = reader.read_u32();
97
+ assert_eq!(val1, 0x01020304u32);
98
+
99
+ let val2 = reader.read_u64();
100
+ assert_eq!(val2, 0x0102030405060708u64);
101
+
102
+ let val3 = reader.read_u32();
103
+ assert_eq!(val3, 0xAABBCCDDu32);
104
+ }
105
+
106
+ #[test]
107
+ fn test_read_multiple_u32() {
108
+ let env = Env::default();
109
+ let bytes = Bytes::from_array(
110
+ &env,
111
+ &[
112
+ 0x00, 0x00, 0x00, 0x01, // 1
113
+ 0x00, 0x00, 0x00, 0x02, // 2
114
+ 0x00, 0x00, 0x00, 0x03, // 3
115
+ ],
116
+ );
117
+ let mut reader = BufferReader::new(&bytes);
118
+
119
+ assert_eq!(reader.read_u32(), 1u32);
120
+ assert_eq!(reader.read_u32(), 2u32);
121
+ assert_eq!(reader.read_u32(), 3u32);
122
+ }
123
+
124
+ #[test]
125
+ fn test_read_multiple_u64() {
126
+ let env = Env::default();
127
+ let bytes = Bytes::from_array(
128
+ &env,
129
+ &[
130
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // 1
131
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, // 2
132
+ ],
133
+ );
134
+ let mut reader = BufferReader::new(&bytes);
135
+
136
+ assert_eq!(reader.read_u64(), 1u64);
137
+ assert_eq!(reader.read_u64(), 2u64);
138
+ }
139
+
140
+ #[test]
141
+ #[should_panic]
142
+ fn test_read_u32_insufficient_bytes_empty() {
143
+ let env = Env::default();
144
+ let bytes = Bytes::from_array(&env, &[]);
145
+ let mut reader = BufferReader::new(&bytes);
146
+
147
+ // Should panic - no bytes available
148
+ reader.read_u32();
149
+ }
150
+
151
+ #[test]
152
+ #[should_panic]
153
+ fn test_read_u32_insufficient_bytes_partial() {
154
+ let env = Env::default();
155
+ // Only 3 bytes, need 4 for u32
156
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03]);
157
+ let mut reader = BufferReader::new(&bytes);
158
+
159
+ // Should panic - not enough bytes
160
+ reader.read_u32();
161
+ }
162
+
163
+ #[test]
164
+ #[should_panic]
165
+ fn test_read_u32_insufficient_bytes_one() {
166
+ let env = Env::default();
167
+ // Only 1 byte, need 4 for u32
168
+ let bytes = Bytes::from_array(&env, &[0x01]);
169
+ let mut reader = BufferReader::new(&bytes);
170
+
171
+ // Should panic - not enough bytes
172
+ reader.read_u32();
173
+ }
174
+
175
+ #[test]
176
+ #[should_panic]
177
+ fn test_read_u64_insufficient_bytes_empty() {
178
+ let env = Env::default();
179
+ let bytes = Bytes::from_array(&env, &[]);
180
+ let mut reader = BufferReader::new(&bytes);
181
+
182
+ // Should panic - no bytes available
183
+ reader.read_u64();
184
+ }
185
+
186
+ #[test]
187
+ #[should_panic]
188
+ fn test_read_u64_insufficient_bytes_partial() {
189
+ let env = Env::default();
190
+ // Only 7 bytes, need 8 for u64
191
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]);
192
+ let mut reader = BufferReader::new(&bytes);
193
+
194
+ // Should panic - not enough bytes
195
+ reader.read_u64();
196
+ }
197
+
198
+ #[test]
199
+ #[should_panic]
200
+ fn test_read_u64_insufficient_bytes_only_four() {
201
+ let env = Env::default();
202
+ // Only 4 bytes, need 8 for u64
203
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
204
+ let mut reader = BufferReader::new(&bytes);
205
+
206
+ // Should panic - not enough bytes
207
+ reader.read_u64();
208
+ }
209
+
210
+ #[test]
211
+ #[should_panic]
212
+ fn test_sequential_reads_run_out_of_bytes() {
213
+ let env = Env::default();
214
+
215
+ // Only enough for u32 and partial u64
216
+ let buffer_array: [u8; 10] = [
217
+ 0x01, 0x02, 0x03, 0x04, // u32 (4 bytes)
218
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // partial u64 (only 6 bytes, need 8)
219
+ ];
220
+
221
+ let bytes = Bytes::from_array(&env, &buffer_array);
222
+ let mut reader = BufferReader::new(&bytes);
223
+
224
+ // First read succeeds
225
+ let _val1 = reader.read_u32();
226
+
227
+ // Second read should panic - not enough bytes for u64
228
+ reader.read_u64();
229
+ }
230
+
231
+ #[test]
232
+ #[should_panic]
233
+ fn test_read_after_buffer_exhausted() {
234
+ let env = Env::default();
235
+ // Exactly 4 bytes
236
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
237
+ let mut reader = BufferReader::new(&bytes);
238
+
239
+ // First read succeeds and exhausts the buffer
240
+ let _val = reader.read_u32();
241
+
242
+ // Second read should panic - no bytes left
243
+ reader.read_u32();
244
+ }
245
+
246
+ // Tests for read() method
247
+ #[test]
248
+ fn test_read() {
249
+ let env = Env::default();
250
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
251
+ let mut reader = BufferReader::new(&bytes);
252
+
253
+ let chunk1 = reader.read_bytes(3);
254
+ assert_eq!(chunk1.len(), 3);
255
+ assert_eq!(chunk1.get(0).unwrap(), 0x01);
256
+ assert_eq!(chunk1.get(1).unwrap(), 0x02);
257
+ assert_eq!(chunk1.get(2).unwrap(), 0x03);
258
+
259
+ let chunk2 = reader.read_bytes(2);
260
+ assert_eq!(chunk2.len(), 2);
261
+ assert_eq!(chunk2.get(0).unwrap(), 0x04);
262
+ assert_eq!(chunk2.get(1).unwrap(), 0x05);
263
+ }
264
+
265
+ #[test]
266
+ fn test_read_single_byte() {
267
+ let env = Env::default();
268
+ let bytes = Bytes::from_array(&env, &[0xAB]);
269
+ let mut reader = BufferReader::new(&bytes);
270
+
271
+ let chunk = reader.read_bytes(1);
272
+ assert_eq!(chunk.len(), 1);
273
+ assert_eq!(chunk.get(0).unwrap(), 0xAB);
274
+ }
275
+
276
+ #[test]
277
+ fn test_read_entire_buffer() {
278
+ let env = Env::default();
279
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
280
+ let mut reader = BufferReader::new(&bytes);
281
+
282
+ let chunk = reader.read_bytes(4);
283
+ assert_eq!(chunk.len(), 4);
284
+ assert_eq!(chunk.get(0).unwrap(), 0x01);
285
+ assert_eq!(chunk.get(3).unwrap(), 0x04);
286
+ }
287
+
288
+ // Tests for rewind() method
289
+ #[test]
290
+ fn test_rewind() {
291
+ let env = Env::default();
292
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
293
+ let mut reader = BufferReader::new(&bytes);
294
+
295
+ // Read 4 bytes
296
+ let _chunk1 = reader.read_bytes(4);
297
+
298
+ // Rewind 2 bytes
299
+ reader.rewind(2);
300
+
301
+ // Read again should get bytes starting from position 2
302
+ let chunk2 = reader.read_bytes(2);
303
+ assert_eq!(chunk2.get(0).unwrap(), 0x03);
304
+ assert_eq!(chunk2.get(1).unwrap(), 0x04);
305
+ }
306
+
307
+ #[test]
308
+ fn test_rewind_chaining() {
309
+ let env = Env::default();
310
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
311
+ let mut reader = BufferReader::new(&bytes);
312
+
313
+ reader.read_bytes(4);
314
+ // Test that rewind returns &mut Self for chaining
315
+ let chunk = reader.rewind(2).read_bytes(1);
316
+ assert_eq!(chunk.get(0).unwrap(), 0x03);
317
+ }
318
+
319
+ #[test]
320
+ fn test_rewind_to_start() {
321
+ let env = Env::default();
322
+ let bytes = Bytes::from_array(&env, &[0xAA, 0xBB, 0xCC]);
323
+ let mut reader = BufferReader::new(&bytes);
324
+
325
+ reader.read_bytes(3);
326
+ reader.rewind(3);
327
+
328
+ let chunk = reader.read_bytes(1);
329
+ assert_eq!(chunk.get(0).unwrap(), 0xAA);
330
+ }
331
+
332
+ // Tests for read_u8() method
333
+ #[test]
334
+ fn test_read_u8() {
335
+ let env = Env::default();
336
+ let bytes = Bytes::from_array(&env, &[0x42]);
337
+ let mut reader = BufferReader::new(&bytes);
338
+
339
+ let value = reader.read_u8();
340
+ assert_eq!(value, 0x42);
341
+ }
342
+
343
+ #[test]
344
+ fn test_read_u8_zero() {
345
+ let env = Env::default();
346
+ let bytes = Bytes::from_array(&env, &[0x00]);
347
+ let mut reader = BufferReader::new(&bytes);
348
+
349
+ let value = reader.read_u8();
350
+ assert_eq!(value, 0u8);
351
+ }
352
+
353
+ #[test]
354
+ fn test_read_u8_max_value() {
355
+ let env = Env::default();
356
+ let bytes = Bytes::from_array(&env, &[0xFF]);
357
+ let mut reader = BufferReader::new(&bytes);
358
+
359
+ let value = reader.read_u8();
360
+ assert_eq!(value, u8::MAX);
361
+ }
362
+
363
+ #[test]
364
+ fn test_read_multiple_u8() {
365
+ let env = Env::default();
366
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
367
+ let mut reader = BufferReader::new(&bytes);
368
+
369
+ assert_eq!(reader.read_u8(), 0x01);
370
+ assert_eq!(reader.read_u8(), 0x02);
371
+ assert_eq!(reader.read_u8(), 0x03);
372
+ assert_eq!(reader.read_u8(), 0x04);
373
+ }
374
+
375
+ #[test]
376
+ #[should_panic]
377
+ fn test_read_u8_insufficient_bytes() {
378
+ let env = Env::default();
379
+ let bytes = Bytes::from_array(&env, &[]);
380
+ let mut reader = BufferReader::new(&bytes);
381
+
382
+ reader.read_u8();
383
+ }
384
+
385
+ // Tests for read_u16() method
386
+ #[test]
387
+ fn test_read_u16() {
388
+ let env = Env::default();
389
+ let bytes = Bytes::from_array(&env, &[0x12, 0x34]);
390
+ let mut reader = BufferReader::new(&bytes);
391
+
392
+ let value = reader.read_u16();
393
+ assert_eq!(value, 0x1234u16);
394
+ }
395
+
396
+ #[test]
397
+ fn test_read_u16_zero() {
398
+ let env = Env::default();
399
+ let bytes = Bytes::from_array(&env, &[0x00, 0x00]);
400
+ let mut reader = BufferReader::new(&bytes);
401
+
402
+ let value = reader.read_u16();
403
+ assert_eq!(value, 0u16);
404
+ }
405
+
406
+ #[test]
407
+ fn test_read_u16_max_value() {
408
+ let env = Env::default();
409
+ let bytes = Bytes::from_array(&env, &[0xFF, 0xFF]);
410
+ let mut reader = BufferReader::new(&bytes);
411
+
412
+ let value = reader.read_u16();
413
+ assert_eq!(value, u16::MAX);
414
+ }
415
+
416
+ #[test]
417
+ fn test_read_multiple_u16() {
418
+ let env = Env::default();
419
+ let bytes = Bytes::from_array(&env, &[0x00, 0x01, 0x00, 0x02, 0x00, 0x03]);
420
+ let mut reader = BufferReader::new(&bytes);
421
+
422
+ assert_eq!(reader.read_u16(), 1u16);
423
+ assert_eq!(reader.read_u16(), 2u16);
424
+ assert_eq!(reader.read_u16(), 3u16);
425
+ }
426
+
427
+ #[test]
428
+ #[should_panic]
429
+ fn test_read_u16_insufficient_bytes_empty() {
430
+ let env = Env::default();
431
+ let bytes = Bytes::from_array(&env, &[]);
432
+ let mut reader = BufferReader::new(&bytes);
433
+
434
+ reader.read_u16();
435
+ }
436
+
437
+ #[test]
438
+ #[should_panic]
439
+ fn test_read_u16_insufficient_bytes_one() {
440
+ let env = Env::default();
441
+ let bytes = Bytes::from_array(&env, &[0x01]);
442
+ let mut reader = BufferReader::new(&bytes);
443
+
444
+ reader.read_u16();
445
+ }
446
+
447
+ // Tests for read_u256() method
448
+ #[test]
449
+ fn test_read_u256() {
450
+ let env = Env::default();
451
+ let bytes = Bytes::from_array(
452
+ &env,
453
+ &[
454
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
456
+ ],
457
+ );
458
+ let mut reader = BufferReader::new(&bytes);
459
+
460
+ let value = reader.read_u256();
461
+ let expected = soroban_sdk::U256::from_u32(&env, 0x01020304);
462
+ assert_eq!(value, expected);
463
+ }
464
+
465
+ #[test]
466
+ fn test_read_u256_zero() {
467
+ let env = Env::default();
468
+ let bytes = Bytes::from_array(
469
+ &env,
470
+ &[
471
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473
+ ],
474
+ );
475
+ let mut reader = BufferReader::new(&bytes);
476
+
477
+ let value = reader.read_u256();
478
+ let expected = soroban_sdk::U256::from_u32(&env, 0);
479
+ assert_eq!(value, expected);
480
+ }
481
+
482
+ #[test]
483
+ fn test_read_u256_max_value() {
484
+ let env = Env::default();
485
+ let bytes = Bytes::from_array(
486
+ &env,
487
+ &[
488
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
489
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
490
+ ],
491
+ );
492
+ let mut reader = BufferReader::new(&bytes);
493
+
494
+ let value = reader.read_u256();
495
+ // Verify it's a large number by checking it's not zero
496
+ assert!(value > soroban_sdk::U256::from_u32(&env, 0));
497
+ }
498
+
499
+ #[test]
500
+ #[should_panic]
501
+ fn test_read_u256_insufficient_bytes() {
502
+ let env = Env::default();
503
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]); // Only 4 bytes, need 32
504
+ let mut reader = BufferReader::new(&bytes);
505
+
506
+ reader.read_u256();
507
+ }
508
+
509
+ // Tests for read_bytes_until_end() method
510
+ #[test]
511
+ fn test_read_bytes_until_end() {
512
+ let env = Env::default();
513
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
514
+ let mut reader = BufferReader::new(&bytes);
515
+
516
+ reader.read_bytes(2); // Read first 2 bytes
517
+
518
+ let remaining = reader.read_bytes_until_end();
519
+ assert_eq!(remaining.len(), 4);
520
+ assert_eq!(remaining.get(0).unwrap(), 0x03);
521
+ assert_eq!(remaining.get(1).unwrap(), 0x04);
522
+ assert_eq!(remaining.get(2).unwrap(), 0x05);
523
+ assert_eq!(remaining.get(3).unwrap(), 0x06);
524
+ }
525
+
526
+ #[test]
527
+ fn test_read_bytes_until_end_entire_buffer() {
528
+ let env = Env::default();
529
+ let bytes = Bytes::from_array(&env, &[0xAA, 0xBB, 0xCC]);
530
+ let mut reader = BufferReader::new(&bytes);
531
+
532
+ let remaining = reader.read_bytes_until_end();
533
+ assert_eq!(remaining.len(), 3);
534
+ assert_eq!(remaining.get(0).unwrap(), 0xAA);
535
+ assert_eq!(remaining.get(1).unwrap(), 0xBB);
536
+ assert_eq!(remaining.get(2).unwrap(), 0xCC);
537
+ }
538
+
539
+ #[test]
540
+ fn test_read_bytes_until_end_empty() {
541
+ let env = Env::default();
542
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02]);
543
+ let mut reader = BufferReader::new(&bytes);
544
+
545
+ reader.read_bytes(2); // Exhaust the buffer
546
+
547
+ let remaining = reader.read_bytes_until_end();
548
+ assert_eq!(remaining.len(), 0);
549
+ }
550
+
551
+ #[test]
552
+ fn test_read_bytes_until_end_updates_position() {
553
+ let env = Env::default();
554
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
555
+ let mut reader = BufferReader::new(&bytes);
556
+
557
+ reader.read_bytes(1);
558
+ let _remaining = reader.read_bytes_until_end();
559
+
560
+ // After read_bytes_until_end, position should be at the end
561
+ assert_eq!(reader.remaining(), 0);
562
+ }
563
+
564
+ // Tests for len() method
565
+ #[test]
566
+ fn test_len() {
567
+ let env = Env::default();
568
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05]);
569
+ let reader = BufferReader::new(&bytes);
570
+
571
+ assert_eq!(reader.len(), 5);
572
+ }
573
+
574
+ #[test]
575
+ fn test_len_empty_buffer() {
576
+ let env = Env::default();
577
+ let bytes = Bytes::from_array(&env, &[]);
578
+ let reader = BufferReader::new(&bytes);
579
+
580
+ assert_eq!(reader.len(), 0);
581
+ }
582
+
583
+ #[test]
584
+ fn test_len_unchanged_after_read() {
585
+ let env = Env::default();
586
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
587
+ let mut reader = BufferReader::new(&bytes);
588
+
589
+ assert_eq!(reader.len(), 4);
590
+ reader.read_bytes(2);
591
+ assert_eq!(reader.len(), 4); // len() should not change
592
+ }
593
+
594
+ // Tests for remaining() method
595
+ #[test]
596
+ fn test_remaining_initial() {
597
+ let env = Env::default();
598
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05]);
599
+ let reader = BufferReader::new(&bytes);
600
+
601
+ assert_eq!(reader.remaining(), 5);
602
+ }
603
+
604
+ #[test]
605
+ fn test_remaining_after_read() {
606
+ let env = Env::default();
607
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
608
+ let mut reader = BufferReader::new(&bytes);
609
+
610
+ reader.read_bytes(2);
611
+ assert_eq!(reader.remaining(), 4);
612
+
613
+ reader.read_bytes(3);
614
+ assert_eq!(reader.remaining(), 1);
615
+
616
+ reader.read_bytes(1);
617
+ assert_eq!(reader.remaining(), 0);
618
+ }
619
+
620
+ #[test]
621
+ fn test_remaining_empty_buffer() {
622
+ let env = Env::default();
623
+ let bytes = Bytes::from_array(&env, &[]);
624
+ let reader = BufferReader::new(&bytes);
625
+
626
+ assert_eq!(reader.remaining(), 0);
627
+ }
628
+
629
+ #[test]
630
+ fn test_remaining_after_rewind() {
631
+ let env = Env::default();
632
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
633
+ let mut reader = BufferReader::new(&bytes);
634
+
635
+ reader.read_bytes(3);
636
+ assert_eq!(reader.remaining(), 1);
637
+
638
+ reader.rewind(2);
639
+ assert_eq!(reader.remaining(), 3);
640
+ }
641
+
642
+ #[test]
643
+ fn test_read_u128() {
644
+ let env = Env::default();
645
+ // Create bytes representing u128 value 0x0102030405060708090a0b0c0d0e0f10
646
+ let bytes = Bytes::from_array(
647
+ &env,
648
+ &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10],
649
+ );
650
+ let mut reader = BufferReader::new(&bytes);
651
+
652
+ let value = reader.read_u128();
653
+ assert_eq!(value, 0x0102030405060708090a0b0c0d0e0f10u128);
654
+ }
655
+
656
+ #[test]
657
+ fn test_read_u128_zero() {
658
+ let env = Env::default();
659
+ let bytes = Bytes::from_array(&env, &[0x00; 16]);
660
+ let mut reader = BufferReader::new(&bytes);
661
+
662
+ let value = reader.read_u128();
663
+ assert_eq!(value, 0u128);
664
+ }
665
+
666
+ #[test]
667
+ fn test_read_u128_max_value() {
668
+ let env = Env::default();
669
+ let bytes = Bytes::from_array(&env, &[0xFF; 16]);
670
+ let mut reader = BufferReader::new(&bytes);
671
+
672
+ let value = reader.read_u128();
673
+ assert_eq!(value, u128::MAX);
674
+ }
675
+
676
+ #[test]
677
+ fn test_read_u128_specific_value() {
678
+ let env = Env::default();
679
+ // Test with a specific value: 200000 (0x030d40)
680
+ let mut bytes_array = [0u8; 16];
681
+ // Fill with zeros except for the last 3 bytes
682
+ bytes_array[13] = 0x03;
683
+ bytes_array[14] = 0x0d;
684
+ bytes_array[15] = 0x40;
685
+ let bytes = Bytes::from_array(&env, &bytes_array);
686
+ let mut reader = BufferReader::new(&bytes);
687
+
688
+ let value = reader.read_u128();
689
+ assert_eq!(value, 200000u128);
690
+ }
691
+
692
+ #[test]
693
+ fn test_read_bytes_n() {
694
+ let env = Env::default();
695
+ // Create 32 bytes with a pattern
696
+ let bytes = Bytes::from_array(
697
+ &env,
698
+ &[
699
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
700
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
701
+ ],
702
+ );
703
+ let mut reader = BufferReader::new(&bytes);
704
+
705
+ let value = reader.read_bytes_n::<32>();
706
+ let expected = BytesN::<32>::from_array(
707
+ &env,
708
+ &[
709
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
710
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
711
+ ],
712
+ );
713
+ assert_eq!(value, expected);
714
+ }
715
+
716
+ #[test]
717
+ fn test_read_bytes_n_zeros() {
718
+ let env = Env::default();
719
+ let bytes = Bytes::from_array(&env, &[0x00; 32]);
720
+ let mut reader = BufferReader::new(&bytes);
721
+
722
+ let value = reader.read_bytes_n::<32>();
723
+ let expected = BytesN::<32>::from_array(&env, &[0x00; 32]);
724
+ assert_eq!(value, expected);
725
+ }
726
+
727
+ #[test]
728
+ fn test_read_bytes_n_all_ones() {
729
+ let env = Env::default();
730
+ let bytes = Bytes::from_array(&env, &[0xFF; 32]);
731
+ let mut reader = BufferReader::new(&bytes);
732
+
733
+ let value = reader.read_bytes_n::<32>();
734
+ let expected = BytesN::<32>::from_array(&env, &[0xFF; 32]);
735
+ assert_eq!(value, expected);
736
+ }
737
+
738
+ #[test]
739
+ fn test_read_bytes_n_different_sizes() {
740
+ let env = Env::default();
741
+ // Create buffer with 4 + 8 + 16 = 28 bytes
742
+ let bytes = Bytes::from_array(
743
+ &env,
744
+ &[
745
+ 0x01, 0x02, 0x03, 0x04, // 4 bytes
746
+ 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, // 8 bytes
747
+ 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b,
748
+ 0x1c, // 16 bytes
749
+ ],
750
+ );
751
+ let mut reader = BufferReader::new(&bytes);
752
+
753
+ let val4: BytesN<4> = reader.read_bytes_n();
754
+ assert_eq!(val4, BytesN::<4>::from_array(&env, &[0x01, 0x02, 0x03, 0x04]));
755
+
756
+ let val8: BytesN<8> = reader.read_bytes_n();
757
+ assert_eq!(val8, BytesN::<8>::from_array(&env, &[0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c]));
758
+
759
+ let val16: BytesN<16> = reader.read_bytes_n();
760
+ assert_eq!(
761
+ val16,
762
+ BytesN::<16>::from_array(
763
+ &env,
764
+ &[0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c]
765
+ )
766
+ );
767
+
768
+ assert_eq!(reader.remaining(), 0);
769
+ }
770
+
771
+ #[test]
772
+ fn test_read_bytes_n_address_pattern() {
773
+ let env = Env::default();
774
+ // Test with a typical Ethereum-style address padded to 32 bytes
775
+ let bytes = Bytes::from_array(
776
+ &env,
777
+ &[
778
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xf3, 0x9f, 0xd6, 0xe5, 0x1a, 0xad, 0x88, 0xf6, 0xf4, 0xce, 0x6a, 0xb8,
779
+ 0x82, 0x72, 0x79, 0xcf, 0xff, 0xb9, 0x22, 0x66,
780
+ ],
781
+ );
782
+ let mut reader = BufferReader::new(&bytes);
783
+
784
+ let value = reader.read_bytes_n::<32>();
785
+ let expected = BytesN::<32>::from_array(
786
+ &env,
787
+ &[
788
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xf3, 0x9f, 0xd6, 0xe5, 0x1a, 0xad, 0x88, 0xf6, 0xf4, 0xce, 0x6a, 0xb8,
789
+ 0x82, 0x72, 0x79, 0xcf, 0xff, 0xb9, 0x22, 0x66,
790
+ ],
791
+ );
792
+ assert_eq!(value, expected);
793
+ }
794
+
795
+ #[test]
796
+ fn test_sequential_reads_with_u128_and_bytes32() {
797
+ let env = Env::default();
798
+
799
+ // Create a buffer with:
800
+ // - u8: 0x01
801
+ // - u16: 0x0011
802
+ // - u128: 200000
803
+ // - bytes32: all 0x42s
804
+ let mut final_bytes = Bytes::new(&env);
805
+
806
+ // u8
807
+ final_bytes.push_back(0x01);
808
+
809
+ // u16
810
+ final_bytes.extend_from_slice(&[0x00, 0x11]);
811
+
812
+ // u128 (200000)
813
+ final_bytes.extend_from_slice(&200000u128.to_be_bytes());
814
+
815
+ // bytes32
816
+ final_bytes.extend_from_slice(&[0x42; 32]);
817
+
818
+ let mut reader = BufferReader::new(&final_bytes);
819
+
820
+ // Read in sequence
821
+ let val1 = reader.read_u8();
822
+ assert_eq!(val1, 0x01);
823
+
824
+ let val2 = reader.read_u16();
825
+ assert_eq!(val2, 0x0011);
826
+
827
+ let val3 = reader.read_u128();
828
+ assert_eq!(val3, 200000u128);
829
+
830
+ let val4 = reader.read_bytes_n::<32>();
831
+ let expected = BytesN::<32>::from_array(&env, &[0x42; 32]);
832
+ assert_eq!(val4, expected);
833
+
834
+ // Should have read everything
835
+ assert_eq!(reader.remaining(), 0);
836
+ }
837
+
838
+ #[test]
839
+ fn test_read_arbitrary_size() {
840
+ let env = Env::default();
841
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]);
842
+ let mut reader = BufferReader::new(&bytes);
843
+
844
+ // Read 4 bytes
845
+ let chunk1 = reader.read_bytes(4);
846
+ assert_eq!(chunk1.len(), 4);
847
+ assert_eq!(chunk1.get(0).unwrap(), 0x01);
848
+ assert_eq!(chunk1.get(3).unwrap(), 0x04);
849
+
850
+ // Read remaining 4 bytes
851
+ let chunk2 = reader.read_bytes(4);
852
+ assert_eq!(chunk2.len(), 4);
853
+ assert_eq!(chunk2.get(0).unwrap(), 0x05);
854
+ assert_eq!(chunk2.get(3).unwrap(), 0x08);
855
+
856
+ // All bytes consumed
857
+ assert_eq!(reader.remaining(), 0);
858
+ }
859
+
860
+ #[test]
861
+ #[should_panic]
862
+ fn test_read_insufficient_bytes() {
863
+ let env = Env::default();
864
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
865
+ let mut reader = BufferReader::new(&bytes);
866
+
867
+ // Try to read more bytes than available
868
+ // Should panic with InsufficientBytes error
869
+ reader.read_bytes(10);
870
+ }
871
+
872
+ #[test]
873
+ #[should_panic]
874
+ fn test_read_insufficient_bytes_after_partial_read() {
875
+ let env = Env::default();
876
+ let bytes = Bytes::from_array(&env, &[0x01, 0x02, 0x03, 0x04]);
877
+ let mut reader = BufferReader::new(&bytes);
878
+
879
+ // Read 2 bytes successfully
880
+ let _chunk = reader.read_bytes(2);
881
+ assert_eq!(reader.remaining(), 2);
882
+
883
+ // Try to read 3 bytes when only 2 remain
884
+ // Should panic with InsufficientBytes error
885
+ reader.read_bytes(3);
886
+ }
887
+
888
+ // Tests for read_address() method
889
+ #[test]
890
+ fn test_read_address_contract_roundtrip() {
891
+ let env = Env::default();
892
+
893
+ // Address::generate() creates a Contract address
894
+ let original_address = Address::generate(&env);
895
+ let payload = original_address.to_payload().unwrap();
896
+ assert!(matches!(payload, AddressPayload::ContractIdHash(_)));
897
+
898
+ // Serialize using BufferWriter, then read back
899
+ let mut writer = BufferWriter::new(&env);
900
+ writer.write_address(&original_address);
901
+ let bytes = writer.to_bytes();
902
+
903
+ let mut reader = BufferReader::new(&bytes);
904
+ let read_address = reader.read_address();
905
+
906
+ assert_eq!(read_address, original_address);
907
+ assert_eq!(reader.remaining(), 0);
908
+ }
909
+
910
+ #[test]
911
+ fn test_read_address_account_roundtrip() {
912
+ let env = Env::default();
913
+
914
+ // Create an account address from a 32-byte payload
915
+ let account_payload = BytesN::<32>::from_array(
916
+ &env,
917
+ &[
918
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
919
+ 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
920
+ ],
921
+ );
922
+ let original_address = Address::from_payload(&env, AddressPayload::AccountIdPublicKeyEd25519(account_payload));
923
+ let payload = original_address.to_payload().unwrap();
924
+ assert!(matches!(payload, AddressPayload::AccountIdPublicKeyEd25519(_)));
925
+
926
+ // Serialize using BufferWriter, then read back
927
+ let mut writer = BufferWriter::new(&env);
928
+ writer.write_address(&original_address);
929
+ let bytes = writer.to_bytes();
930
+
931
+ let mut reader = BufferReader::new(&bytes);
932
+ let read_address = reader.read_address();
933
+
934
+ assert_eq!(read_address, original_address);
935
+ assert_eq!(reader.remaining(), 0);
936
+ }
937
+
938
+ #[test]
939
+ fn test_read_address_mixed_types_roundtrip() {
940
+ let env = Env::default();
941
+
942
+ // Generate contract address
943
+ let contract_addr = Address::generate(&env);
944
+
945
+ // Create account address
946
+ let account_payload = BytesN::<32>::from_array(&env, &[0x42; 32]);
947
+ let account_addr = Address::from_payload(&env, AddressPayload::AccountIdPublicKeyEd25519(account_payload));
948
+
949
+ // Serialize both addresses (33 * 2 = 66 bytes)
950
+ let mut writer = BufferWriter::new(&env);
951
+ writer.write_address(&contract_addr);
952
+ writer.write_address(&account_addr);
953
+ let bytes = writer.to_bytes();
954
+
955
+ assert_eq!(bytes.len(), 66); // 33 bytes per address
956
+
957
+ let mut reader = BufferReader::new(&bytes);
958
+ assert_eq!(reader.read_address(), contract_addr);
959
+ assert_eq!(reader.read_address(), account_addr);
960
+ assert_eq!(reader.remaining(), 0);
961
+ }
962
+
963
+ #[test]
964
+ fn test_read_address_with_other_data_roundtrip() {
965
+ let env = Env::default();
966
+
967
+ let original_address = Address::generate(&env);
968
+
969
+ // Create buffer: u32 + address (33 bytes) + u64
970
+ let mut writer = BufferWriter::new(&env);
971
+ writer.write_u32(0x12345678);
972
+ writer.write_address(&original_address);
973
+ writer.write_u64(0xAABBCCDDEEFF0011);
974
+ let bytes = writer.to_bytes();
975
+
976
+ assert_eq!(bytes.len(), 4 + 33 + 8);
977
+
978
+ let mut reader = BufferReader::new(&bytes);
979
+ assert_eq!(reader.read_u32(), 0x12345678);
980
+ assert_eq!(reader.read_address(), original_address);
981
+ assert_eq!(reader.read_u64(), 0xAABBCCDDEEFF0011);
982
+ assert_eq!(reader.remaining(), 0);
983
+ }
984
+
985
+ #[test]
986
+ #[should_panic]
987
+ fn test_read_address_insufficient_bytes_empty() {
988
+ let env = Env::default();
989
+ let bytes = Bytes::from_array(&env, &[]);
990
+ let mut reader = BufferReader::new(&bytes);
991
+
992
+ // Should panic - no bytes available (need 33)
993
+ reader.read_address();
994
+ }
995
+
996
+ #[test]
997
+ #[should_panic]
998
+ fn test_read_address_insufficient_bytes_partial() {
999
+ let env = Env::default();
1000
+ // Only 32 bytes, need 33
1001
+ let bytes = Bytes::from_array(&env, &[0x00; 32]);
1002
+ let mut reader = BufferReader::new(&bytes);
1003
+
1004
+ // Should panic - not enough bytes
1005
+ reader.read_address();
1006
+ }