byte_utils.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use cosmwasm_std::{CanonicalAddr, StdError, StdResult};
  2. pub trait ByteUtils {
  3. fn get_u8(&self, index: usize) -> u8;
  4. fn get_u16(&self, index: usize) -> u16;
  5. fn get_u32(&self, index: usize) -> u32;
  6. fn get_u64(&self, index: usize) -> u64;
  7. fn get_u128_be(&self, index: usize) -> u128;
  8. /// High 128 then low 128
  9. fn get_u256(&self, index: usize) -> (u128, u128);
  10. fn get_address(&self, index: usize) -> CanonicalAddr;
  11. fn get_bytes32(&self, index: usize) -> &[u8];
  12. }
  13. impl ByteUtils for &[u8] {
  14. fn get_u8(&self, index: usize) -> u8 {
  15. self[index]
  16. }
  17. fn get_u16(&self, index: usize) -> u16 {
  18. let mut bytes: [u8; 16 / 8] = [0; 16 / 8];
  19. bytes.copy_from_slice(&self[index..index + 2]);
  20. u16::from_be_bytes(bytes)
  21. }
  22. fn get_u32(&self, index: usize) -> u32 {
  23. let mut bytes: [u8; 32 / 8] = [0; 32 / 8];
  24. bytes.copy_from_slice(&self[index..index + 4]);
  25. u32::from_be_bytes(bytes)
  26. }
  27. fn get_u64(&self, index: usize) -> u64 {
  28. let mut bytes: [u8; 64 / 8] = [0; 64 / 8];
  29. bytes.copy_from_slice(&self[index..index + 8]);
  30. u64::from_be_bytes(bytes)
  31. }
  32. fn get_u128_be(&self, index: usize) -> u128 {
  33. let mut bytes: [u8; 128 / 8] = [0; 128 / 8];
  34. bytes.copy_from_slice(&self[index..index + 128 / 8]);
  35. u128::from_be_bytes(bytes)
  36. }
  37. fn get_u256(&self, index: usize) -> (u128, u128) {
  38. (self.get_u128_be(index), self.get_u128_be(index + 128 / 8))
  39. }
  40. fn get_address(&self, index: usize) -> CanonicalAddr {
  41. // 32 bytes are reserved for addresses, but only the last 20 bytes are taken by the actual address
  42. CanonicalAddr::from(&self[index + 32 - 20..index + 32])
  43. }
  44. fn get_bytes32(&self, index: usize) -> &[u8] {
  45. &self[index..index + 32]
  46. }
  47. }
  48. pub fn extend_address_to_32(addr: &CanonicalAddr) -> Vec<u8> {
  49. let mut result: Vec<u8> = vec![0; 12];
  50. result.extend(addr.as_slice());
  51. result
  52. }
  53. pub fn extend_string_to_32(s: &String) -> StdResult<Vec<u8>> {
  54. let bytes = s.as_bytes();
  55. if bytes.len() > 32 {
  56. return Err(StdError::generic_err("string more than 32 "))
  57. }
  58. let mut result = vec![0; 32 - bytes.len()];
  59. result.extend(bytes);
  60. Ok(result)
  61. }