Skip to content

Commit dfeb7cc

Browse files
author
ibrizsabin
committed
fix: sui eth-rlp fixes
1 parent 4e08258 commit dfeb7cc

File tree

4 files changed

+159
-139
lines changed

4 files changed

+159
-139
lines changed

contracts/sui/libs/sui_rlp/sources/decoder.move

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ module sui_rlp::decoder {
2020
} else {
2121
let length_len = byte - 0xb7;
2222
let length_bytes = utils::slice_vector(encoded, 1, length_len as u64);
23-
//debug::print(&length_bytes);
2423
let length = utils::from_bytes_u64(&length_bytes);
2524
let data_start = (length_len + 1) as u64;
2625
utils::slice_vector(encoded, data_start, length)

contracts/sui/libs/sui_rlp/sources/encoder.move

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,11 @@ module sui_rlp::encoder {
2121
vector::append(&mut result,*bytes);
2222
result
2323
};
24-
//std::debug::print(&encoded);
2524
encoded
2625

2726
}
2827

2928
public fun encode_list(list:&vector<vector<u8>>,raw:bool):vector<u8>{
30-
//std::debug::print(&b"ENCODELIST".to_string());
31-
//std::debug::print(list);
3229
let mut result=vector::empty();
3330
let mut encoded_list = vector::empty<u8>();
3431
let mut list=*list;
@@ -40,7 +37,6 @@ module sui_rlp::encoder {
4037
vector::append(&mut result,encode(&vector::pop_back(&mut list)));
4138
}else{
4239
vector::append(&mut result,vector::pop_back(&mut list));
43-
//std::debug::print(&result);
4440
};
4541

4642
};
@@ -53,21 +49,17 @@ module sui_rlp::encoder {
5349
vector::append(&mut encoded_list,result);
5450

5551
} else {
56-
let length_bytes = utils::to_bytes_u64(len);
57-
let prefix = (0xf7 + vector::length(&length_bytes)) as u8;
58-
vector::push_back(&mut encoded_list, prefix);
59-
vector::append(&mut encoded_list, length_bytes);
60-
vector::append(&mut encoded_list, result);
61-
62-
52+
let length_bytes = utils::to_bytes_u64(len);
53+
let prefix = (0xf7 + vector::length(&length_bytes)) as u8;
54+
vector::push_back(&mut encoded_list, prefix);
55+
vector::append(&mut encoded_list, length_bytes);
56+
vector::append(&mut encoded_list, result);
6357
}
6458

6559
}else{
6660
vector::push_back(&mut encoded_list,0xc0);
6761

6862
};
69-
//std::debug::print(&b"FINAL_ENCODED_LIST".to_string());
70-
//std::debug::print(&encoded_list);
7163
encoded_list
7264
}
7365

@@ -77,11 +69,11 @@ module sui_rlp::encoder {
7769
let len_u8=(len as u8);
7870
vector::push_back(&mut length_info,(offset+len_u8));
7971
}else {
80-
let length_bytes=utils::to_bytes_u64(len);
81-
let length_byte_len=vector::length(&length_bytes);
82-
let length_byte_len=offset+(length_byte_len as u8);
83-
vector::push_back(&mut length_info,length_byte_len);
84-
vector::append(&mut length_info,length_bytes);
72+
let length_bytes=utils::to_bytes_u64(len);
73+
let length_byte_len=vector::length(&length_bytes);
74+
let length_byte_len=offset+(length_byte_len as u8);
75+
vector::push_back(&mut length_info,length_byte_len);
76+
vector::append(&mut length_info,length_bytes);
8577
};
8678
length_info
8779
}
@@ -133,4 +125,6 @@ module sui_rlp::encoder {
133125
};
134126
vector<u8>[0]
135127
}
128+
129+
136130
}

contracts/sui/libs/sui_rlp/sources/utils.move

Lines changed: 73 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -1,167 +1,123 @@
11
module sui_rlp::utils {
2-
use std::vector::{Self};
3-
use std::string::{Self,String};
4-
use std::bcs;
5-
public fun to_bytes_u32(number: u32): vector<u8> {
6-
let mut bytes: vector<u8> = vector::empty();
7-
let mut i:u8=0;
8-
while(i < 4){
9-
let val =( (number>>(i * 8) & 0xFF) as u8) ;
10-
vector::push_back(&mut bytes,val);
11-
i=i+1;
12-
};
13-
bytes.reverse();
14-
bytes
15-
}
2+
use std::bcs;
3+
164

175
// Convert bytes to u32
18-
public fun from_bytes_u32(bytes: &vector<u8>): u32 {let mut result = 0;
19-
let mut multiplier = 1;
20-
let length = vector::length(bytes);
21-
22-
let mut i = length;
23-
while (i > 0) {
24-
i = i - 1;
25-
//std::debug::print(vector::borrow(bytes, i));
26-
result = result + ((*vector::borrow(bytes, i) as u32) * multiplier);
27-
//std::debug::print(&result);
28-
29-
if (i > 0) {
30-
multiplier = multiplier * 256
31-
};
32-
6+
public fun from_bytes_u32(bytes: &vector<u8>): u32 {
7+
let mut bytes= truncate_zeros(bytes);
8+
bytes.reverse();
9+
let mut diff= 4-bytes.length();
10+
while (diff > 0) {
11+
bytes.push_back(0_u8);
12+
diff=diff-1;
3313
};
34-
result
14+
sui::bcs::peel_u32(&mut sui::bcs::new(bytes))
3515
}
3616

37-
fun truncate_zeros(bytes: &vector<u8>): vector<u8> {
38-
let mut i = 0;
39-
let mut started = false;
40-
let mut result: vector<u8> = vector::empty();
41-
while (i < vector::length(bytes)) {
42-
let val = *vector::borrow(bytes, i) as u8;
43-
if (val > 0 || started) {
44-
started = true;
45-
vector::push_back(&mut result, val);
46-
};
4717

48-
i = i + 1;
18+
// Convert bytes to u64
19+
public fun from_bytes_u64(bytes: &vector<u8>): u64 {
20+
let mut bytes= truncate_zeros(bytes);
21+
bytes.reverse();
22+
let mut diff= 8-bytes.length();
23+
while (diff > 0) {
24+
bytes.push_back(0_u8);
25+
diff=diff-1;
4926
};
27+
sui::bcs::peel_u64(&mut sui::bcs::new(bytes))
5028

51-
result
5229
}
5330

54-
// Convert bytes to u64
55-
public fun from_bytes_u64(bytes: &vector<u8>): u64 {
56-
let bytes = truncate_zeros(bytes);
57-
let mut result = 0;
58-
let mut multiplier = 1;
59-
let length = vector::length(&bytes);
60-
61-
let mut i = length;
62-
while (i > 0) {
63-
i = i - 1;
64-
//std::debug::print(vector::borrow(bytes, i));
65-
result = result + ((*vector::borrow(&bytes, i) as u64) * (multiplier));
66-
//std::debug::print(&result);
67-
if (i > 0) {
68-
multiplier = multiplier * 256
69-
};
70-
31+
// Convert bytes to u128
32+
public fun from_bytes_u128(bytes: &vector<u8>): u128 {
33+
let mut bytes= truncate_zeros(bytes);
34+
bytes.reverse();
35+
let mut diff= 16-bytes.length();
36+
while (diff > 0) {
37+
bytes.push_back(0_u8);
38+
diff=diff-1;
7139
};
72-
result
40+
sui::bcs::peel_u128(&mut sui::bcs::new(bytes))
41+
7342
}
7443

7544
public fun to_bytes_u128(number:u128):vector<u8>{
76-
let mut right:u128= 128;
77-
let mut i=1;
78-
while(i < 16){
79-
right=right << 8;
80-
i=i+1;
81-
82-
};
83-
let mut bytes=bcs::to_bytes(&number);
84-
bytes.reverse();
85-
if (number < right){
86-
truncate_zeros(&bytes)
87-
}else {
88-
let mut prefix = vector<u8>[0];
89-
prefix.append(truncate_zeros(&bytes));
90-
prefix
91-
}
45+
let bytes=bcs::to_bytes(&number);
46+
to_signed_bytes(bytes)
9247
}
9348

49+
9450
public fun to_bytes_u64(number:u64):vector<u8>{
95-
let mut right:u64= 128;
96-
let mut i=1;
97-
while(i < 8){
98-
right=right << 8;
99-
i=i+1;
51+
let bytes=bcs::to_bytes(&number);
52+
to_signed_bytes(bytes)
53+
}
10054

101-
};
102-
let mut bytes=bcs::to_bytes(&number);
55+
public fun to_bytes_u32(number: u32): vector<u8> {
56+
let bytes=bcs::to_bytes(&number);
57+
to_signed_bytes(bytes)
58+
}
59+
60+
fun to_signed_bytes(mut bytes:vector<u8>):vector<u8>{
10361
bytes.reverse();
104-
if (number < right){
105-
truncate_zeros(&bytes)
62+
let truncated=truncate_zeros(&bytes);
63+
let first_byte=*truncated.borrow(0);
64+
65+
if (first_byte >= 128) {
66+
let mut prefix = vector<u8>[0];
67+
prefix.append(truncated);
68+
prefix
69+
10670
}else {
107-
let mut prefix = vector<u8>[0];
108-
prefix.append(truncate_zeros(&bytes));
109-
prefix
71+
truncated
11072
}
73+
11174
}
11275

113-
// Convert bytes to u128
114-
public fun from_bytes_u128(bytes: &vector<u8>): u128 {
115-
let bytes = truncate_zeros(bytes);
116-
let mut result = 0;
117-
let mut multiplier = 1;
118-
let length = vector::length(&bytes);
119-
120-
let mut i = length;
121-
while (i > 0) {
122-
i = i - 1;
123-
//std::debug::print(vector::borrow(bytes, i));
124-
result = result + ((*vector::borrow(&bytes, i) as u128) * multiplier);
125-
//std::debug::print(&result);
126-
127-
if (i > 0) {
128-
multiplier = multiplier * 256
76+
fun truncate_zeros(bytes: &vector<u8>): vector<u8> {
77+
let mut i = 0;
78+
let mut started = false;
79+
let mut result: vector<u8> = vector::empty();
80+
while (i < vector::length(bytes)) {
81+
let val = *vector::borrow(bytes, i) as u8;
82+
if (val > 0 || started) {
83+
started = true;
84+
vector::push_back(&mut result, val);
12985
};
130-
86+
87+
i = i + 1;
13188
};
89+
13290
result
13391
}
13492

93+
94+
13595
/* end is exclusive in slice*/
136-
public fun slice_vector(vec: &vector<u8>, start: u64, length: u64): vector<u8> {
96+
public fun slice_vector(vec: &vector<u8>, start: u64, length: u64): vector<u8> {
13797
let mut result = vector::empty<u8>();
13898
let mut i = 0;
13999
while (i < length) {
140100
let value = *vector::borrow(vec, start + i);
141101
vector::push_back(&mut result, value);
142102
i = i + 1;
143103
};
144-
//std::debug::print(&result);
145104
result
146105
}
147106

148-
107+
149108
}
150109

151110
module sui_rlp::utils_test {
152111
use sui_rlp::utils::{Self};
153-
use std::vector::{Self};
154-
use std::debug;
155-
use sui::bcs::{Self};
156112

157113

158-
#[test]
114+
#[test]
159115
fun test_u32_conversion() {
160116
let num= (122 as u32);
161117
let bytes= utils::to_bytes_u32(num);
162118
let converted=utils::from_bytes_u32(&bytes);
163119
assert!(num==converted,0x01);
164-
120+
165121
}
166122

167123
#[test]
@@ -172,7 +128,7 @@ module sui_rlp::utils_test {
172128
std::debug::print(&bytes);
173129
std::debug::print(&converted);
174130
assert!(num==converted,0x01);
175-
131+
176132
}
177133

178134
#[test]
@@ -183,24 +139,21 @@ module sui_rlp::utils_test {
183139
let converted=utils::from_bytes_u128(&bytes);
184140
std::debug::print(&converted);
185141
assert!(num==converted,0x01);
186-
142+
187143
}
188144

189145
#[test]
190146
fun test_vector_slice() {
191147
let data=create_vector(10);
192148
let slice= utils::slice_vector(&data,0,3);
193149
let expected= create_vector(3);
194-
//debug::print(&expected);
195-
//debug::print(&slice);
196-
//debug::print(&data);
197150
assert!(slice==expected,0x01);
198151

199-
152+
200153
}
201154

202155
fun create_vector(n:u8):vector<u8>{
203-
let mut data=vector::empty();
156+
let mut data=vector::empty();
204157
let mut i=0;
205158
while(i < n){
206159
vector::push_back(&mut data,i);

0 commit comments

Comments
 (0)