Skip to content

Commit ca96b1f

Browse files
Merge pull request #3 from CetusProtocol/hot-fix
Hot fix for forward compatibility in aptos
2 parents 2ce5a35 + ddea0d7 commit ca96b1f

File tree

4 files changed

+49
-44
lines changed

4 files changed

+49
-44
lines changed

aptos/sources/full_math_u128.move

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,44 @@
11
module integer_mate::full_math_u128 {
2+
use integer_mate::u256;
3+
use integer_mate::math_u128;
4+
25
public fun mul_div_floor(num1: u128, num2: u128, denom: u128): u128 {
3-
let r = full_mul(num1, num2) / (denom as u256);
6+
let r = full_mul_v2(num1, num2) / (denom as u256);
47
(r as u128)
58
}
69

710
public fun mul_div_round(num1: u128, num2: u128, denom: u128): u128 {
8-
let r = (full_mul(num1, num2) + ((denom as u256) >> 1)) / (denom as u256);
11+
let r = (full_mul_v2(num1, num2) + ((denom as u256) >> 1)) / (denom as u256);
912
(r as u128)
1013
}
1114

1215
public fun mul_div_ceil(num1: u128, num2: u128, denom: u128): u128 {
13-
let r = (full_mul(num1, num2) + ((denom as u256) - 1)) / (denom as u256);
16+
let r = (full_mul_v2(num1, num2) + ((denom as u256) - 1)) / (denom as u256);
1417
(r as u128)
1518
}
1619

1720
public fun mul_shr(num1: u128, num2: u128, shift: u8): u128 {
18-
let product = full_mul(num1, num2) >> shift;
21+
let product = full_mul_v2(num1, num2) >> shift;
1922
(product as u128)
2023
}
2124

2225
public fun mul_shl(num1: u128, num2: u128, shift: u8): u128 {
23-
let product = full_mul(num1, num2) << shift;
26+
let product = full_mul_v2(num1, num2) << shift;
2427
(product as u128)
2528
}
2629

27-
public fun full_mul(num1: u128, num2: u128): u256 {
30+
public fun full_mul(num1: u128, num2: u128): u256::U256 {
31+
let (lo, hi) = math_u128::full_mul(num1, num2);
32+
u256::new(
33+
math_u128::lo(lo),
34+
math_u128::hi(lo),
35+
math_u128::lo(hi),
36+
math_u128::hi(hi),
37+
)
38+
}
39+
40+
public fun full_mul_v2(num1: u128, num2: u128): u256 {
2841
(num1 as u256) * (num2 as u256)
2942
}
43+
3044
}

aptos/sources/i128.move

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
module integer_mate::i128 {
2+
use std::error;
23
use integer_mate::i64;
34
use integer_mate::i32;
45

5-
const EOverflow: u64 = 0;
6+
const OVERFLOW: u64 = 0;
67

78
const MIN_AS_U128: u128 = 1 << 127;
89
const MAX_AS_U128: u128 = 0x7fffffffffffffffffffffffffffffff;
@@ -22,14 +23,14 @@ module integer_mate::i128 {
2223
}
2324

2425
public fun from(v: u128): I128 {
25-
assert!(v <= MAX_AS_U128, EOverflow);
26+
assert!(v <= MAX_AS_U128, error::invalid_argument(OVERFLOW));
2627
I128 {
2728
bits: v
2829
}
2930
}
3031

3132
public fun neg_from(v: u128): I128 {
32-
assert!(v <= MIN_AS_U128, EOverflow);
33+
assert!(v <= MIN_AS_U128, error::invalid_argument(OVERFLOW));
3334
if (v == 0) {
3435
I128 {
3536
bits: v
@@ -66,7 +67,7 @@ module integer_mate::i128 {
6667
public fun add(num1: I128, num2: I128): I128 {
6768
let sum = wrapping_add(num1, num2);
6869
let overflow = (sign(num1) & sign(num2) & u8_neg(sign(sum))) + (u8_neg(sign(num1)) & u8_neg(sign(num2)) & sign(sum));
69-
assert!(overflow == 0, EOverflow);
70+
assert!(overflow == 0, error::invalid_argument(OVERFLOW));
7071
sum
7172
}
7273

@@ -119,7 +120,7 @@ module integer_mate::i128 {
119120
if (sign(v) == 0) {
120121
v
121122
} else {
122-
assert!(v.bits > MIN_AS_U128, EOverflow);
123+
assert!(v.bits > MIN_AS_U128, error::invalid_argument(OVERFLOW));
123124
I128 {
124125
bits: u128_neg(v.bits - 1)
125126
}

aptos/sources/i64.move

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module integer_mate::i64 {
2-
const EOverflow: u64 = 0;
2+
use std::error;
3+
4+
const OVERFLOW: u64 = 0;
35

46
const MIN_AS_U64: u64 = 1 << 63;
57
const MAX_AS_U64: u64 = 0x7fffffffffffffff;
@@ -25,14 +27,14 @@ module integer_mate::i64 {
2527
}
2628

2729
public fun from(v: u64): I64 {
28-
assert!(v <= MAX_AS_U64, EOverflow);
30+
assert!(v <= MAX_AS_U64, error::invalid_argument(OVERFLOW));
2931
I64 {
3032
bits: v
3133
}
3234
}
3335

3436
public fun neg_from(v: u64): I64 {
35-
assert!(v <= MIN_AS_U64, EOverflow);
37+
assert!(v <= MIN_AS_U64, error::invalid_argument(OVERFLOW));
3638
if (v == 0) {
3739
I64 {
3840
bits: v
@@ -63,7 +65,7 @@ module integer_mate::i64 {
6365
let overflow = (sign(num1) & sign(num2) & u8_neg(sign(sum))) + (u8_neg(sign(num1)) & u8_neg(sign(num2)) & sign(
6466
sum
6567
));
66-
assert!(overflow == 0, EOverflow);
68+
assert!(overflow == 0, error::invalid_argument(OVERFLOW));
6769
sum
6870
}
6971

@@ -101,7 +103,7 @@ module integer_mate::i64 {
101103
if (sign(v) == 0) {
102104
v
103105
} else {
104-
assert!(v.bits > MIN_AS_U64, EOverflow);
106+
assert!(v.bits > MIN_AS_U64, error::invalid_argument(OVERFLOW));
105107
I64 {
106108
bits: u64_neg(v.bits - 1)
107109
}

aptos/sources/u256.move

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
module integer_mate::u256 {
2+
use std::error;
23
use integer_mate::math_u64;
34
use integer_mate::math_u128;
45

@@ -17,7 +18,7 @@ module integer_mate::u256 {
1718

1819
/// Total words in `U256` (64 * 4 = 256).
1920
const WORDS: u8 = 4;
20-
21+
2122
struct U256 has copy, drop, store {
2223
n0: u64,
2324
n1: u64,
@@ -57,7 +58,7 @@ module integer_mate::u256 {
5758
let (sum1, carry1) = math_u64::carry_add(a.n1, b.n1, carry0);
5859
let (sum2, carry2) = math_u64::carry_add(a.n2, b.n2, carry1);
5960
let (sum3, carry3) = math_u64::carry_add(a.n3, b.n3, carry2);
60-
assert!(carry3 == 0, OVERFLOW);
61+
assert!(carry3 == 0, error::invalid_argument(OVERFLOW));
6162
U256 {
6263
n0: sum0,
6364
n1: sum1,
@@ -78,7 +79,7 @@ module integer_mate::u256 {
7879
let (t3, overflow_t3) = math_u64::overflowing_sub(a.n3, b.n3);
7980
let (r3, overflow_s3) = math_u64::overflowing_sub(t3, carry2);
8081
let carry3 = if (overflow_t3 || overflow_s3) { 1 } else { 0 };
81-
assert!(carry3 == 0, OVERFLOW);
82+
assert!(carry3 == 0, error::invalid_argument(OVERFLOW));
8283
U256 {
8384
n0: r0,
8485
n1: r1,
@@ -115,7 +116,6 @@ module integer_mate::u256 {
115116
result
116117
}
117118

118-
// TODO: OPT
119119
public fun div_mod(a: U256, b: U256): (U256, U256) {
120120
let ret = zero();
121121
let remainer = a;
@@ -160,12 +160,12 @@ module integer_mate::u256 {
160160
}
161161

162162
public fun as_u128(n: U256): u128 {
163-
assert!(n.n3 == 0 && n.n2 == 0, OVERFLOW);
163+
assert!(n.n3 == 0 && n.n2 == 0, error::invalid_argument(OVERFLOW));
164164
math_u128::from_lo_hi(n.n0, n.n1)
165165
}
166166

167167
public fun as_u64(n: U256): u64 {
168-
assert!(n.n3 == 0 && n.n2 == 0 && n.n1 == 0, OVERFLOW);
168+
assert!(n.n3 == 0 && n.n2 == 0 && n.n1 == 0, error::invalid_argument(OVERFLOW));
169169
n.n0
170170
}
171171

@@ -293,8 +293,7 @@ module integer_mate::u256 {
293293
public fun checked_div_round(num: U256, denom: U256, round_up: bool): U256 {
294294
let (q, r) = div_mod(num, denom);
295295
if (round_up && gt(r, zero())) {
296-
q.n0 = q.n0 + 1;
297-
//return add(q, from(1))
296+
return add(q, from(1))
298297
};
299298
q
300299
}
@@ -412,16 +411,15 @@ module integer_mate::u256 {
412411

413412
#[test]
414413
fun test_add() {
415-
add(from(1000), from(1000));
416-
// let s = add(new(10, 10, 10, 10), new(10, 10, 10, 10));
417-
// assert!(s.n0 == 20 && s.n1 == 20 && s.n2 == 20 && s.n3 == 20, 0);
418-
//
419-
// let s = add(from(0xffffffffffffffffffffffffffffffff), from(0xffffffffffffffffffffffffffffffff));
420-
// assert!(s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 1 && s.n3 == 0, 0);
421-
//
422-
// let max = MAX_U64;
423-
// let s = add(new(max, max, max, 10), new(max, max, max, 10));
424-
// assert!(s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 18446744073709551615 && s.n3 == 21, 0);
414+
let s = add(new(10, 10, 10, 10), new(10, 10, 10, 10));
415+
assert!(s.n0 == 20 && s.n1 == 20 && s.n2 == 20 && s.n3 == 20, 0);
416+
417+
let s = add(from(0xffffffffffffffffffffffffffffffff), from(0xffffffffffffffffffffffffffffffff));
418+
assert!(s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 1 && s.n3 == 0, 0);
419+
420+
let max = MAX_U64;
421+
let s = add(new(max, max, max, 10), new(max, max, max, 10));
422+
assert!(s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 18446744073709551615 && s.n3 == 21, 0);
425423
}
426424

427425
#[test]
@@ -595,14 +593,4 @@ module integer_mate::u256 {
595593
//assert!(eq(checked_div_round(from(MAX_U128), from((MAX_U64 as u128)), true), from((MAX_U128 / 10) + 1)) == true, 0);
596594
//assert!(eq(checked_div_round(from(MAX_U128), from((MAX_U64 as u128)), false), from((MAX_U128 / 10))) == true, 0);
597595
}
598-
599-
#[test]
600-
fun test_div_round() {
601-
checked_div_round(from(1000000000000000000000000000), from(3), true);
602-
}
603-
604-
#[test]
605-
fun test_2_div() {
606-
div_mod(from(1), from(1));
607-
}
608596
}

0 commit comments

Comments
 (0)