From 387e4ed2b0d653ebc316956f0c64addb406dd835 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 12:23:16 +0530 Subject: [PATCH 01/29] move primitive_conversions --- sway-lib-core/src/primitive_conversions.sw | 370 ------------- .../src/primitive_conversions/b256.sw | 23 + sway-lib-std/src/primitive_conversions/u16.sw | 69 +++ .../src/primitive_conversions/u256.sw | 23 + sway-lib-std/src/primitive_conversions/u32.sw | 48 ++ sway-lib-std/src/primitive_conversions/u64.sw | 24 + sway-lib-std/src/primitive_conversions/u8.sw | 90 ++++ .../src/main.sw | 9 + .../src/main.sw | 23 + .../src/main.sw | 16 + .../src/main.sw | 9 + .../src/main.sw | 30 ++ .../revert_inline_tests/src/main.sw | 2 +- .../u128_inline_tests/src/main.sw | 494 ++++++++++-------- 14 files changed, 638 insertions(+), 592 deletions(-) diff --git a/sway-lib-core/src/primitive_conversions.sw b/sway-lib-core/src/primitive_conversions.sw index 3160a5eca02..316a905aa9b 100644 --- a/sway-lib-core/src/primitive_conversions.sw +++ b/sway-lib-core/src/primitive_conversions.sw @@ -1,371 +1 @@ library; - -impl u64 { - /// Extends a `u64` to a `u256`. - /// - /// # Returns - /// - /// * [u256] - The converted `u64` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2; - /// let result = val.as_u256(); - /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); - /// } - /// ``` - pub fn as_u256(self) -> u256 { - let input = (0u64, 0u64, 0u64, self); - asm(input: input) { - input: u256 - } - } -} - -impl u32 { - /// Extends a `u32` to a `u64`. - /// - /// # Returns - /// - /// * [u64] - The converted `u32` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 10u32; - /// let result = val.as_u64(); - /// assert(result == 10); - /// } - /// ``` - pub fn as_u64(self) -> u64 { - asm(input: self) { - input: u64 - } - } -} - -// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved -impl u32 { - /// Extends a `u32` to a `u256`. - /// - /// # Returns - /// - /// * [u256] - The converted `u32` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2u32; - /// let result = val.as_u256(); - /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); - /// } - /// ``` - pub fn as_u256(self) -> u256 { - let input = (0u64, 0u64, 0u64, self.as_u64()); - asm(input: input) { - input: u256 - } - } -} - -impl u16 { - /// Extends a `u16` to a `u32`. - /// - /// # Returns - /// - /// * [u32] - The converted `u16` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 10u16; - /// let result = val.as_u32(); - /// assert(result == 10u32); - /// } - /// ``` - pub fn as_u32(self) -> u32 { - asm(input: self) { - input: u32 - } - } - - /// Extends a `u16` to a `u64`. - /// - /// # Returns - /// - /// * [u64] - The converted `u16` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 10u16; - /// let result = val.as_u64(); - /// assert(result == 10); - /// } - /// ``` - pub fn as_u64(self) -> u64 { - asm(input: self) { - input: u64 - } - } -} - -// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved -impl u16 { - /// Extends a `u16` to a `u256`. - /// - /// # Returns - /// - /// * [u256] - The converted `u16` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2u16; - /// let result = val.as_u256(); - /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); - /// } - /// ``` - pub fn as_u256(self) -> u256 { - let input = (0u64, 0u64, 0u64, self.as_u64()); - asm(input: input) { - input: u256 - } - } -} - -impl u8 { - /// Extends a `u8` to a `u16`. - /// - /// # Returns - /// - /// * [u16] - The converted `u8` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2u8; - /// let result = val.as_u16(); - /// assert(result == 2u16); - /// } - /// ``` - pub fn as_u16(self) -> u16 { - asm(input: self) { - input: u16 - } - } - - /// Extends a `u8` to a `u32`. - /// - /// # Returns - /// - /// * [u32] - The converted `u8` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2u8; - /// let result = val.as_u32(); - /// assert(result == 2u32); - /// } - /// ``` - pub fn as_u32(self) -> u32 { - asm(input: self) { - input: u32 - } - } - - /// Extends a `u8` to a `u64`. - /// - /// # Returns - /// - /// * [u64] - The converted `u8` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2u8; - /// let result = val.as_u64(); - /// assert(result == 2); - /// } - /// ``` - pub fn as_u64(self) -> u64 { - asm(input: self) { - input: u64 - } - } -} - -// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved -impl u8 { - /// Extends a `u8` to a `u256`. - /// - /// # Returns - /// - /// * [u256] - The converted `u8` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = 2u8; - /// let result = val.as_u256(); - /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); - /// } - /// ``` - pub fn as_u256(self) -> u256 { - let input = (0u64, 0u64, 0u64, self.as_u64()); - asm(input: input) { - input: u256 - } - } -} - -impl b256 { - /// Converts a `b256` to a `u256`. - /// - /// # Returns - /// - /// * [u256] - The converted `b256` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val: b256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20; - /// let result = val.as_u256(); - /// assert(result == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256); - /// } - /// ``` - pub fn as_u256(self) -> u256 { - asm(input: self) { - input: u256 - } - } -} - -impl u256 { - /// Converts a `u256` to a `b256`. - /// - /// # Returns - /// - /// * [b256] - The converted `u256` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val: u256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256; - /// let result = val.as_b256(); - /// assert(result == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20); - /// } - /// ``` - pub fn as_b256(self) -> b256 { - asm(input: self) { - input: b256 - } - } -} - -fn assert(condition: bool) { - if !condition { - __revert(0) - } -} - -#[test] -fn test_u64_as_u256() { - let val = 2; - let result = val.as_u256(); - assert( - result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, - ); -} - -#[test] -fn test_u32_as_u64() { - let val = 2u32; - let result = val.as_u64(); - assert(result == 2); -} - -#[test] -fn test_u32_as_u256() { - let val = 2u32; - let result = val.as_u256(); - assert( - result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, - ); -} - -#[test] -fn test_u16_as_u64() { - let val = 2u16; - let result = val.as_u64(); - assert(result == 2); -} - -#[test] -fn test_u16_as_u32() { - let val = 2u16; - let result = val.as_u32(); - assert(result == 2u32); -} - -#[test] -fn test_u16_as_u256() { - let val = 2u16; - let result = val.as_u256(); - assert( - result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, - ); -} - -#[test] -fn test_u8_as_u64() { - let val = 2u8; - let result = val.as_u64(); - assert(result == 2); -} - -#[test] -fn test_u8_as_u32() { - let val = 2u8; - let result = val.as_u32(); - assert(result == 2u32); -} - -#[test] -fn test_u8_as_u16() { - let val = 2u8; - let result = val.as_u16(); - assert(result == 2u16); -} - -#[test] -fn test_u8_as_u256() { - let val = 2u8; - let result = val.as_u256(); - assert( - result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, - ); -} - -#[test] -fn test_b256_as_u256() { - let val = 0x0000000000000000000000000000000000000000000000000000000000000002; - let result = val.as_u256(); - assert( - result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, - ); -} diff --git a/sway-lib-std/src/primitive_conversions/b256.sw b/sway-lib-std/src/primitive_conversions/b256.sw index 266bba0c9d8..a6f85496309 100644 --- a/sway-lib-std/src/primitive_conversions/b256.sw +++ b/sway-lib-std/src/primitive_conversions/b256.sw @@ -6,6 +6,29 @@ use ::option::Option::{self, *}; use ::u128::U128; use ::b512::B512; +impl b256 { + /// Converts a `b256` to a `u256`. + /// + /// # Returns + /// + /// * [u256] - The converted `b256` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val: b256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20; + /// let result = val.as_u256(); + /// assert(result == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256); + /// } + /// ``` + pub fn as_u256(self) -> u256 { + asm(input: self) { + input: u256 + } + } +} + impl TryFrom for b256 { fn try_from(b: Bytes) -> Option { if b.len() != 32 { diff --git a/sway-lib-std/src/primitive_conversions/u16.sw b/sway-lib-std/src/primitive_conversions/u16.sw index 5a032306332..50d412b5fc4 100644 --- a/sway-lib-std/src/primitive_conversions/u16.sw +++ b/sway-lib-std/src/primitive_conversions/u16.sw @@ -4,6 +4,75 @@ use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; use ::u128::U128; +impl u16 { + /// Extends a `u16` to a `u32`. + /// + /// # Returns + /// + /// * [u32] - The converted `u16` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 10u16; + /// let result = val.as_u32(); + /// assert(result == 10u32); + /// } + /// ``` + pub fn as_u32(self) -> u32 { + asm(input: self) { + input: u32 + } + } + + /// Extends a `u16` to a `u64`. + /// + /// # Returns + /// + /// * [u64] - The converted `u16` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 10u16; + /// let result = val.as_u64(); + /// assert(result == 10); + /// } + /// ``` + pub fn as_u64(self) -> u64 { + asm(input: self) { + input: u64 + } + } +} + +// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved +impl u16 { + /// Extends a `u16` to a `u256`. + /// + /// # Returns + /// + /// * [u256] - The converted `u16` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2u16; + /// let result = val.as_u256(); + /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); + /// } + /// ``` + pub fn as_u256(self) -> u256 { + let input = (0u64, 0u64, 0u64, self.as_u64()); + asm(input: input) { + input: u256 + } + } +} + impl u16 { /// Attempts to convert the u16 value into a u8 value. /// diff --git a/sway-lib-std/src/primitive_conversions/u256.sw b/sway-lib-std/src/primitive_conversions/u256.sw index b4d14755092..a23a845ebb8 100644 --- a/sway-lib-std/src/primitive_conversions/u256.sw +++ b/sway-lib-std/src/primitive_conversions/u256.sw @@ -5,6 +5,29 @@ use ::option::Option::{self, *}; use ::u128::U128; use ::b512::B512; +impl u256 { + /// Converts a `u256` to a `b256`. + /// + /// # Returns + /// + /// * [b256] - The converted `u256` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val: u256 = 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20u256; + /// let result = val.as_b256(); + /// assert(result == 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20); + /// } + /// ``` + pub fn as_b256(self) -> b256 { + asm(input: self) { + input: b256 + } + } +} + impl TryFrom for u256 { /// Attempts conversion from a `B512` to a `u256`. /// diff --git a/sway-lib-std/src/primitive_conversions/u32.sw b/sway-lib-std/src/primitive_conversions/u32.sw index 8ffa2ca2605..f5072a12c8d 100644 --- a/sway-lib-std/src/primitive_conversions/u32.sw +++ b/sway-lib-std/src/primitive_conversions/u32.sw @@ -4,6 +4,54 @@ use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; use ::u128::U128; +impl u32 { + /// Extends a `u32` to a `u64`. + /// + /// # Returns + /// + /// * [u64] - The converted `u32` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 10u32; + /// let result = val.as_u64(); + /// assert(result == 10); + /// } + /// ``` + pub fn as_u64(self) -> u64 { + asm(input: self) { + input: u64 + } + } +} + +// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved +impl u32 { + /// Extends a `u32` to a `u256`. + /// + /// # Returns + /// + /// * [u256] - The converted `u32` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2u32; + /// let result = val.as_u256(); + /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); + /// } + /// ``` + pub fn as_u256(self) -> u256 { + let input = (0u64, 0u64, 0u64, self.as_u64()); + asm(input: input) { + input: u256 + } + } +} + impl u32 { /// Attempts to convert the u32 value into a u8 value. /// diff --git a/sway-lib-std/src/primitive_conversions/u64.sw b/sway-lib-std/src/primitive_conversions/u64.sw index 92267638a1d..40e3fbbb79e 100644 --- a/sway-lib-std/src/primitive_conversions/u64.sw +++ b/sway-lib-std/src/primitive_conversions/u64.sw @@ -4,6 +4,30 @@ use ::convert::{TryFrom, TryInto, *}; use ::option::Option::{self, *}; use ::u128::U128; +impl u64 { + /// Extends a `u64` to a `u256`. + /// + /// # Returns + /// + /// * [u256] - The converted `u64` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2; + /// let result = val.as_u256(); + /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); + /// } + /// ``` + pub fn as_u256(self) -> u256 { + let input = (0u64, 0u64, 0u64, self); + asm(input: input) { + input: u256 + } + } +} + impl u64 { /// Attempts to convert the u64 value into a u8 value. /// diff --git a/sway-lib-std/src/primitive_conversions/u8.sw b/sway-lib-std/src/primitive_conversions/u8.sw index 70f10614ae7..f4f2fdcad47 100644 --- a/sway-lib-std/src/primitive_conversions/u8.sw +++ b/sway-lib-std/src/primitive_conversions/u8.sw @@ -4,6 +4,96 @@ use ::convert::TryFrom; use ::option::Option::{self, *}; use ::u128::U128; +impl u8 { + /// Extends a `u8` to a `u16`. + /// + /// # Returns + /// + /// * [u16] - The converted `u8` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2u8; + /// let result = val.as_u16(); + /// assert(result == 2u16); + /// } + /// ``` + pub fn as_u16(self) -> u16 { + asm(input: self) { + input: u16 + } + } + + /// Extends a `u8` to a `u32`. + /// + /// # Returns + /// + /// * [u32] - The converted `u8` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2u8; + /// let result = val.as_u32(); + /// assert(result == 2u32); + /// } + /// ``` + pub fn as_u32(self) -> u32 { + asm(input: self) { + input: u32 + } + } + + /// Extends a `u8` to a `u64`. + /// + /// # Returns + /// + /// * [u64] - The converted `u8` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2u8; + /// let result = val.as_u64(); + /// assert(result == 2); + /// } + /// ``` + pub fn as_u64(self) -> u64 { + asm(input: self) { + input: u64 + } + } +} + +// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved +impl u8 { + /// Extends a `u8` to a `u256`. + /// + /// # Returns + /// + /// * [u256] - The converted `u8` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = 2u8; + /// let result = val.as_u256(); + /// assert(result == 0x0000000000000000000000000000000000000000000000000000000000000002u256); + /// } + /// ``` + pub fn as_u256(self) -> u256 { + let input = (0u64, 0u64, 0u64, self.as_u64()); + asm(input: input) { + input: u256 + } + } +} + impl TryFrom for u8 { fn try_from(u: u16) -> Option { if u > u8::max().as_u16() { diff --git a/test/src/in_language_tests/test_programs/primitive_conversions_b256_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/primitive_conversions_b256_inline_tests/src/main.sw index 21fe0d19f71..c0d576179d3 100644 --- a/test/src/in_language_tests/test_programs/primitive_conversions_b256_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/primitive_conversions_b256_inline_tests/src/main.sw @@ -166,3 +166,12 @@ fn b256_into_tuple() { assert(b256_2 == 0x0000000000000001000000000000000200000000000000030000000000000004); assert(b256_3 == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); } + +#[test] +fn test_b256_as_u256() { + let val = 0x0000000000000000000000000000000000000000000000000000000000000002; + let result = val.as_u256(); + assert( + result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, + ); +} diff --git a/test/src/in_language_tests/test_programs/primitive_conversions_u16_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/primitive_conversions_u16_inline_tests/src/main.sw index 6ac9fc8fb8a..4990c814efb 100644 --- a/test/src/in_language_tests/test_programs/primitive_conversions_u16_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/primitive_conversions_u16_inline_tests/src/main.sw @@ -127,3 +127,26 @@ fn u16_try_from_u128() { assert(u16_4.is_none()); } + +#[test] +fn test_u16_as_u64() { + let val = 2u16; + let result = val.as_u64(); + assert(result == 2); +} + +#[test] +fn test_u16_as_u32() { + let val = 2u16; + let result = val.as_u32(); + assert(result == 2u32); +} + +#[test] +fn test_u16_as_u256() { + let val = 2u16; + let result = val.as_u256(); + assert( + result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, + ); +} diff --git a/test/src/in_language_tests/test_programs/primitive_conversions_u32_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/primitive_conversions_u32_inline_tests/src/main.sw index 862cab88c91..294fc834701 100644 --- a/test/src/in_language_tests/test_programs/primitive_conversions_u32_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/primitive_conversions_u32_inline_tests/src/main.sw @@ -133,3 +133,19 @@ fn u32_try_from_u128() { assert(u32_4.is_none()); } + +#[test] +fn test_u32_as_u64() { + let val = 2u32; + let result = val.as_u64(); + assert(result == 2); +} + +#[test] +fn test_u32_as_u256() { + let val = 2u32; + let result = val.as_u256(); + assert( + result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, + ); +} diff --git a/test/src/in_language_tests/test_programs/primitive_conversions_u64_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/primitive_conversions_u64_inline_tests/src/main.sw index e82b953c1ab..ca737cacbc1 100644 --- a/test/src/in_language_tests/test_programs/primitive_conversions_u64_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/primitive_conversions_u64_inline_tests/src/main.sw @@ -139,3 +139,12 @@ fn u64_try_from_u128() { assert(u64_4.is_none()); } + +#[test] +fn u64_as_u256() { + let val = 2; + let result = val.as_u256(); + assert( + result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, + ); +} diff --git a/test/src/in_language_tests/test_programs/primitive_conversions_u8_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/primitive_conversions_u8_inline_tests/src/main.sw index 0fa64a82e6a..ff08c0180e1 100644 --- a/test/src/in_language_tests/test_programs/primitive_conversions_u8_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/primitive_conversions_u8_inline_tests/src/main.sw @@ -121,3 +121,33 @@ fn u8_try_from_u128() { assert(u8_4.is_none()); } + +#[test] +fn test_u8_as_u64() { + let val = 2u8; + let result = val.as_u64(); + assert(result == 2); +} + +#[test] +fn test_u8_as_u32() { + let val = 2u8; + let result = val.as_u32(); + assert(result == 2u32); +} + +#[test] +fn test_u8_as_u16() { + let val = 2u8; + let result = val.as_u16(); + assert(result == 2u16); +} + +#[test] +fn test_u8_as_u256() { + let val = 2u8; + let result = val.as_u256(); + assert( + result == 0x0000000000000000000000000000000000000000000000000000000000000002u256, + ); +} diff --git a/test/src/in_language_tests/test_programs/revert_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/revert_inline_tests/src/main.sw index 64c74e30b63..e11a6f413cd 100644 --- a/test/src/in_language_tests/test_programs/revert_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/revert_inline_tests/src/main.sw @@ -18,4 +18,4 @@ fn pass_revert_require() { #[test(should_revert)] fn revert_revert_with_log() { revert_with_log("error") -} \ No newline at end of file +} diff --git a/test/src/in_language_tests/test_programs/u128_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/u128_inline_tests/src/main.sw index 4d7acda31fb..37423cf7a28 100644 --- a/test/src/in_language_tests/test_programs/u128_inline_tests/src/main.sw +++ b/test/src/in_language_tests/test_programs/u128_inline_tests/src/main.sw @@ -1,6 +1,14 @@ library; -use std::{u128::U128, registers::flags, flags::{set_flags, disable_panic_on_unsafe_math, disable_panic_on_overflow}}; +use std::{ + flags::{ + disable_panic_on_overflow, + disable_panic_on_unsafe_math, + set_flags, + }, + registers::flags, + u128::U128, +}; #[test] fn u128_from_u8() { @@ -781,228 +789,272 @@ fn parity_u128_log_with_ruint() { // Failure cases found by comparing parity with ruint implementation of U128 // https://docs.rs/ruint/latest/src/ruint/log.rs.html#45-89 let a = [ - 2, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, - 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, - 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, - 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, - 60, 60, 61, 61, 61, 62, 62, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, - 100, 100, 100, 100, + 2, 4, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, + 14, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, + 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, + 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, + 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 60, 60, 60, + 60, 61, 61, 61, 62, 62, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, + 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, ]; let b = [ - 3, 3, 5, 6, 7, 3, 6, 7, 3, 7, 3, 3, 9, 10, 11, 12, 13, 14, 15, 3, 10, 11, 12, 13, 14, 15, - 3, 11, 12, 13, 14, 15, 3, 12, 13, 14, 15, 3, 13, 14, 15, 3, 14, 15, 3, 15, 3, 3, 5, 6, 7, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 3, 5, 6, 7, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, - 6, 7, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, - 6, 7, 25, 26, 27, 28, 29, 30, 31, 3, 6, 7, 26, 27, 28, 29, 30, 31, 3, 6, 7, 27, 28, 29, 30, - 31, 3, 6, 7, 28, 29, 30, 31, 3, 6, 7, 29, 30, 31, 3, 6, 7, 30, 31, 3, 6, 7, 31, 3, 6, 7, 3, - 6, 7, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 6, 7, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 6, 7, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 3, 6, 7, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 3, 7, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 3, 7, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 43, 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 3, 7, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 3, 7, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 3, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 56, 57, 58, - 59, 60, 61, 62, 63, 3, 57, 58, 59, 60, 61, 62, 63, 3, 58, 59, 60, 61, 62, 63, 3, 59, 60, - 61, 62, 63, 3, 60, 61, 62, 63, 3, 61, 62, 63, 3, 62, 63, 3, 63, 3, 3, 5, 6, 7, 9, 10, 11, - 12, 13, 14, 15, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, - 12, 13, 14, 15, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, - 13, 14, 15, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, - 15, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, - 10, 11, 12, 13, 14, 15, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, - 11, 12, 13, 14, 15, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, - 7, 9, 10, 11, 12, 13, 14, 15, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, - 10, 11, 12, 13, 14, 15, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, - 7, 10, 11, 12, 13, 14, 15, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, - 14, 15, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, - 12, 13, 14, 15, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, - 11, 12, 13, 14, 15, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, - 11, 12, 13, 14, 15, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, - 12, 13, 14, 15, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, - 14, 15, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 93, 94, 95, 96, 97, - 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, - 10, 11, 12, 13, 14, 15, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 96, - 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, - 12, 13, 14, 15, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 99, 100, 3, 5, 6, 7, 10, - 11, 12, 13, 14, 15, 100, 3, 5, 6, 7, 11, 12, 13, 14, 15, + 3, 3, 5, 6, 7, 3, 6, 7, 3, 7, 3, 3, 9, 10, 11, 12, 13, 14, 15, 3, 10, 11, + 12, 13, 14, 15, 3, 11, 12, 13, 14, 15, 3, 12, 13, 14, 15, 3, 13, 14, 15, 3, + 14, 15, 3, 15, 3, 3, 5, 6, 7, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 3, 5, 6, 7, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 3, 5, 6, 7, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, + 5, 6, 7, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 3, 5, 6, 7, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 24, + 25, 26, 27, 28, 29, 30, 31, 3, 5, 6, 7, 25, 26, 27, 28, 29, 30, 31, 3, 6, + 7, 26, 27, 28, 29, 30, 31, 3, 6, 7, 27, 28, 29, 30, 31, 3, 6, 7, 28, 29, 30, + 31, 3, 6, 7, 29, 30, 31, 3, 6, 7, 30, 31, 3, 6, 7, 31, 3, 6, 7, 3, 6, 7, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 6, 7, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 3, 6, 7, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 6, + 7, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 3, 7, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, + 7, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 3, 7, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 3, 7, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 3, 7, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 3, 7, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 3, 7, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 3, 7, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 3, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 3, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 3, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 3, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 3, 56, 57, 58, 59, 60, 61, 62, 63, 3, 57, 58, 59, 60, 61, + 62, 63, 3, 58, 59, 60, 61, 62, 63, 3, 59, 60, 61, 62, 63, 3, 60, 61, 62, 63, + 3, 61, 62, 63, 3, 62, 63, 3, 63, 3, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, + 6, 7, 9, 10, 11, 12, 13, 14, 15, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, + 14, 15, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, + 7, 9, 10, 11, 12, 13, 14, 15, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, + 6, 7, 9, 10, 11, 12, 13, 14, 15, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, + 13, 14, 15, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, + 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, + 11, 12, 13, 14, 15, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, + 15, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, + 12, 13, 14, 15, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, + 7, 10, 11, 12, 13, 14, 15, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, + 5, 6, 7, 10, 11, 12, 13, 14, 15, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 92, 93, 94, 95, 96, 97, 98, 99, 100, 3, + 5, 6, 7, 10, 11, 12, 13, 14, 15, 93, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, + 7, 10, 11, 12, 13, 14, 15, 94, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, + 12, 13, 14, 15, 95, 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, + 96, 97, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 97, 98, 99, 100, + 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 98, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, + 14, 15, 99, 100, 3, 5, 6, 7, 10, 11, 12, 13, 14, 15, 100, 3, 5, 6, 7, 11, + 12, 13, 14, 15, ]; let expected = [ - 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 3, 1, 1, 0, - 0, 0, 3, 1, 1, 0, 0, 3, 1, 1, 0, 3, 1, 1, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 3, 0, 3, 3, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, - 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 4, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, + 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 2, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 0, 0, 0, 0, 3, + 1, 1, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 3, 1, 1, 0, 0, 3, 1, 1, 0, 3, 1, 1, 3, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 3, 0, 3, 3, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 4, 2, 2, 2, 1, 1, 1, 1, 1, ]; @@ -1065,7 +1117,7 @@ fn u128_overflowing_pow() { let a = U128::max(); let res = a.pow(2); - + assert(res == U128::from((0, 0))); set_flags(prior_flags); @@ -1081,4 +1133,4 @@ fn u128_unsafemath_log2() { assert(res == U128::zero()); set_flags(prior_flags); -} \ No newline at end of file +} From cb63d64e01a6e100994c4abe14b28c2b277b7966 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 12:40:27 +0530 Subject: [PATCH 02/29] more raw_ptr --- sway-lib-core/src/raw_ptr.sw | 303 -------------------------------- sway-lib-core/src/raw_slice.sw | 161 ----------------- sway-lib-std/src/lib.sw | 2 + sway-lib-std/src/raw_ptr.sw | 312 +++++++++++++++++++++++++++++++++ sway-lib-std/src/raw_slice.sw | 162 +++++++++++++++++ 5 files changed, 476 insertions(+), 464 deletions(-) create mode 100644 sway-lib-std/src/raw_ptr.sw create mode 100644 sway-lib-std/src/raw_slice.sw diff --git a/sway-lib-core/src/raw_ptr.sw b/sway-lib-core/src/raw_ptr.sw index 1b4eb513397..316a905aa9b 100644 --- a/sway-lib-core/src/raw_ptr.sw +++ b/sway-lib-core/src/raw_ptr.sw @@ -1,304 +1 @@ library; - -impl raw_ptr { - /// Returns `true` if the pointer is null. - /// - /// # Returns - /// - /// * [bool] - `true` if the pointer is null, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(2); - /// assert(!ptr.is_null()); - /// } - /// ``` - pub fn is_null(self) -> bool { - let null_ptr = asm() { - zero: raw_ptr - }; - __eq(self, null_ptr) - } - - /// Calculates the offset from the pointer. - /// - /// # Arguments - /// - /// * `count`: [u64] - The number of `size_of` bytes to increase by. - /// - /// # Returns - /// - /// * [raw_ptr] - The pointer to the offset memory location. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(2); - /// let offset_ptr = ptr.add::(1); - /// assert(ptr != offset_ptr); - /// } - /// ``` - pub fn add(self, count: u64) -> Self { - __ptr_add::(self, count) - } - - /// Calculates the offset from the pointer. - /// - /// # Arguments - /// - /// * `count`: [u64] - The number of `size_of` bytes to decrease by. - /// - /// # Returns - /// - /// * [raw_ptr] - The pointer to the offset memory location. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(2); - /// let offset_ptr = ptr.add::(1); - /// let subbed_offset = offset_ptr.sub::(1); - /// assert(ptr == subbed_offset); - /// } - /// ``` - pub fn sub(self, count: u64) -> Self { - __ptr_sub::(self, count) - } - - /// Reads the given type of value from the address. - /// - /// # Returns - /// - /// * [T] - The copy of the value in memory at the location of the pointer. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// ptr.write(5); - /// assert(ptr.read::() == 5); - /// } - /// ``` - pub fn read(self) -> T { - if __is_reference_type::() { - asm(ptr: self) { - ptr: T - } - } else if __eq(__size_of::(), 1) { - asm(ptr: self, val) { - lb val ptr i0; - val: T - } - } else { - asm(ptr: self, val) { - lw val ptr i0; - val: T - } - } - } - - /// Copies `count * size_of` bytes from `self` to `dst`. - /// - /// # Arguments - /// - /// * `dst`: [raw_ptr] - Pointer to the location in memory to copy the bytes to. - /// * `count`: [u64] - The number of `size_of` bytes to copy. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr_1 = alloc::(1); - /// let ptr_2 = alloc::(1); - /// ptr_1.write(5); - /// ptr_1.copy_to::(ptr_2, 1); - /// assert(ptr_2.read::() == 5); - /// } - /// ``` - pub fn copy_to(self, dst: Self, count: u64) { - let len = __mul(count, __size_of::()); - asm(dst: dst, src: self, len: len) { - mcp dst src len; - }; - } - - /// Writes the given value to the address. - /// - /// # Arguments - /// - /// * `val`: [T] - The value to write to memory. - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// ptr.write(5); - /// assert(ptr.read::() == 5); - /// } - /// ``` - pub fn write(self, val: T) { - if __is_reference_type::() { - asm(dst: self, src: val, count: __size_of_val(val)) { - mcp dst src count; - }; - } else if __eq(__size_of::(), 1) { - asm(ptr: self, val: val) { - sb ptr val i0; - }; - } else { - asm(ptr: self, val: val) { - sw ptr val i0; - }; - } - } - - /// Writes the given byte to the address. - /// - /// # Arguments - /// - /// * `val`: [u8] - The bytes to write. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// ptr.write_byte(5u8); - /// assert(ptr.read::() == 5u8); - /// } - /// ``` - pub fn write_byte(self, val: u8) { - let val_ptr = asm(r1: val) { - r1: raw_ptr - }; - asm(ptr: self, val: val_ptr) { - sb ptr val i0; - }; - } - - /// Reads a byte from the given address. - /// - /// # Returns - /// - /// * [u8] - The byte in memory. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// ptr.write_byte(5u8); - /// assert(ptr.read_byte() == 5u8); - /// } - /// ``` - pub fn read_byte(self) -> u8 { - asm(r1: self, r2) { - lb r2 r1 i0; - r2: u8 - } - } - - /// Copies `count` bytes from `self` to `dst`. - /// - /// # Arguments - /// - /// * `dst`: [raw_ptr] - Pointer to the location in memory to copy the bytes to. - /// * `count`: [u64] - The number of bytes to copy. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr_1 = alloc::(1); - /// let ptr_2 = alloc::(1); - /// ptr_1.write_byte(5u8); - /// ptr_1.copy_bytes_to(ptr_2, 1); - /// assert(ptr_2.read_byte() == 5u8); - /// } - /// ``` - pub fn copy_bytes_to(self, dst: Self, count: u64) { - asm(dst: dst, src: self, len: count) { - mcp dst src len; - }; - } - - /// Add a `u64` offset to a `raw_ptr`. - /// - /// # Arguments - /// - /// * `count`: [u64] - The number of `u64` bytes to increase by. - /// - /// # Returns - /// - /// * [raw_ptr] - The pointer to the offset memory location. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(2); - /// let offset_ptr_1 = ptr.add::(1); - /// let offset_ptr_2 = ptr.add_uint_offset(1); - /// assert(offset_ptr_1 == offset_ptr_2); - /// } - /// ``` - pub fn add_uint_offset(self, offset: u64) -> Self { - asm(ptr: self, offset: offset, new) { - add new ptr offset; - new: raw_ptr - } - } - - /// Subtract a `u64` offset from a `raw_ptr`. - /// - /// # Arguments - /// - /// * `count`: [u64] - The number of `u64` bytes to decrease by. - /// - /// # Returns - /// - /// * [raw_ptr] - The pointer to the offset memory location. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(2); - /// let offset_ptr = ptr.add::(1); - /// let subbed_offset = offset_ptr.sub_uint_offset(1); - /// assert(ptr == subbed_offset); - /// } - /// ``` - pub fn sub_uint_offset(self, offset: u64) -> Self { - asm(ptr: self, offset: offset, new) { - sub new ptr offset; - new: raw_ptr - } - } -} diff --git a/sway-lib-core/src/raw_slice.sw b/sway-lib-core/src/raw_slice.sw index 13bd0affb90..316a905aa9b 100644 --- a/sway-lib-core/src/raw_slice.sw +++ b/sway-lib-core/src/raw_slice.sw @@ -1,162 +1 @@ library; - -use ::raw_ptr::*; - -/// Trait to return a type as a `raw_slice`. -pub trait AsRawSlice { - /// Converts self into a `raw_slice`. - /// - /// # Returns - /// - /// * [raw_slice] - The newly created `raw_slice` from self. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc_bytes; - /// - /// struct MyType { - /// ptr: raw_ptr, - /// len: u64 - /// } - /// - /// impl AsRawSlice for MyType { - /// fn as_raw_slice(self) -> raw_slice { - /// from_parts(self.ptr, self.len) - /// } - /// } - /// - /// fn foo() { - /// let my_type = MyType { - /// ptr: alloc_bytes(0), - /// len: 0 - /// } - /// let slice = my_type.as_raw_slice(); - /// assert(slice.ptr() == my_type.ptr); - /// assert(slice.number_of_bytes() == my_type.len); - /// } - /// ``` - fn as_raw_slice(self) -> raw_slice; -} - -/// Returns a `raw_slice` from a pointer and length. -/// -/// # Arguments -/// -/// * `parts`: [(raw_ptr, u64)] - A location in memory and a length to become a `raw_slice`. -/// -/// # Returns -/// -/// * [raw_slice] - The newly created `raw_slice`. -fn from_parts(parts: (raw_ptr, u64)) -> raw_slice { - asm(ptr: parts) { - ptr: raw_slice - } -} - -/// Returns a pointer and length from a `raw_slice`. -/// -/// # Arguments -/// -/// * `slice`: [raw_slice] - The slice to be broken into its parts. -/// -/// # Returns -/// -/// * [(raw_ptr, u64)] - A tuple of the location in memory of the original `raw_slice` and its length. -fn into_parts(slice: raw_slice) -> (raw_ptr, u64) { - asm(ptr: slice) { - ptr: (raw_ptr, u64) - } -} - -impl raw_slice { - /// Forms a slice from a pointer and a length. - /// - /// # Arguments - /// - /// * `ptr`: [raw_ptr] - The pointer to the location in memory. - /// * `count`: [u64] - The number of `__size_of::` bytes. - /// - /// # Returns - /// - /// * [raw_slice] - The newly created `raw_slice`. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// let slice = raw_slice::from_parts::(ptr, 1); - /// assert(slice.len::() == 1); - /// } - /// ``` - pub fn from_parts(ptr: raw_ptr, count: u64) -> Self { - from_parts((ptr, __mul(count, __size_of::()))) - } - - /// Returns the pointer to the slice. - /// - /// # Returns - /// - /// * [raw_ptr] - The pointer to the location in memory of the `raw_slice`. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// let slice = raw_slice::from_parts::(ptr, 1); - /// let slice_ptr = slice.ptr(); - /// assert(slice_ptr == ptr); - /// } - /// ``` - pub fn ptr(self) -> raw_ptr { - into_parts(self).0 - } - - /// Returns the number of elements in the slice. - /// - /// # Returns - /// - /// * [u64] - The length of the slice based on `size_of::`. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// let slice = raw_slice::from_parts::(ptr, 1); - /// assert(slice.len::() == 1); - /// } - /// ``` - pub fn len(self) -> u64 { - __div(into_parts(self).1, __size_of::()) - } - - /// Returns the number of elements in the slice when the elements are bytes. - /// - /// # Returns - /// - /// * [u64] - The number of bytes in the `raw_slice`. - /// - /// # Examples - /// - /// ```sway - /// use std::alloc::alloc; - /// - /// fn foo() { - /// let ptr = alloc::(1); - /// let slice = raw_slice::from_parts::(ptr, 1); - /// assert(slice.number_of_bytes() == 8); - /// } - /// ``` - pub fn number_of_bytes(self) -> u64 { - into_parts(self).1 - } -} diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index fc09e123cd6..ad4a21eb2a3 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -1,5 +1,7 @@ library; +pub mod raw_ptr; +pub mod raw_slice; pub mod constants; pub mod error_signals; pub mod logging; diff --git a/sway-lib-std/src/raw_ptr.sw b/sway-lib-std/src/raw_ptr.sw new file mode 100644 index 00000000000..955af547f71 --- /dev/null +++ b/sway-lib-std/src/raw_ptr.sw @@ -0,0 +1,312 @@ +library; + +use core::ops::Eq; + +impl Eq for raw_ptr { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl raw_ptr { + /// Returns `true` if the pointer is null. + /// + /// # Returns + /// + /// * [bool] - `true` if the pointer is null, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(2); + /// assert(!ptr.is_null()); + /// } + /// ``` + pub fn is_null(self) -> bool { + let null_ptr = asm() { + zero: raw_ptr + }; + self == null_ptr + } + + /// Calculates the offset from the pointer. + /// + /// # Arguments + /// + /// * `count`: [u64] - The number of `size_of` bytes to increase by. + /// + /// # Returns + /// + /// * [raw_ptr] - The pointer to the offset memory location. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(2); + /// let offset_ptr = ptr.add::(1); + /// assert(ptr != offset_ptr); + /// } + /// ``` + pub fn add(self, count: u64) -> Self { + __ptr_add::(self, count) + } + + /// Calculates the offset from the pointer. + /// + /// # Arguments + /// + /// * `count`: [u64] - The number of `size_of` bytes to decrease by. + /// + /// # Returns + /// + /// * [raw_ptr] - The pointer to the offset memory location. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(2); + /// let offset_ptr = ptr.add::(1); + /// let subbed_offset = offset_ptr.sub::(1); + /// assert(ptr == subbed_offset); + /// } + /// ``` + pub fn sub(self, count: u64) -> Self { + __ptr_sub::(self, count) + } + + /// Reads the given type of value from the address. + /// + /// # Returns + /// + /// * [T] - The copy of the value in memory at the location of the pointer. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// ptr.write(5); + /// assert(ptr.read::() == 5); + /// } + /// ``` + pub fn read(self) -> T { + if __is_reference_type::() { + asm(ptr: self) { + ptr: T + } + } else if __size_of::() == 1 { + asm(ptr: self, val) { + lb val ptr i0; + val: T + } + } else { + asm(ptr: self, val) { + lw val ptr i0; + val: T + } + } + } + + /// Copies `count * size_of` bytes from `self` to `dst`. + /// + /// # Arguments + /// + /// * `dst`: [raw_ptr] - Pointer to the location in memory to copy the bytes to. + /// * `count`: [u64] - The number of `size_of` bytes to copy. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr_1 = alloc::(1); + /// let ptr_2 = alloc::(1); + /// ptr_1.write(5); + /// ptr_1.copy_to::(ptr_2, 1); + /// assert(ptr_2.read::() == 5); + /// } + /// ``` + pub fn copy_to(self, dst: Self, count: u64) { + let len = count * __size_of::(); + asm(dst: dst, src: self, len: len) { + mcp dst src len; + }; + } + + /// Writes the given value to the address. + /// + /// # Arguments + /// + /// * `val`: [T] - The value to write to memory. + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// ptr.write(5); + /// assert(ptr.read::() == 5); + /// } + /// ``` + pub fn write(self, val: T) { + if __is_reference_type::() { + asm(dst: self, src: val, count: __size_of_val(val)) { + mcp dst src count; + }; + } else if __size_of::() == 1 { + asm(ptr: self, val: val) { + sb ptr val i0; + }; + } else { + asm(ptr: self, val: val) { + sw ptr val i0; + }; + } + } + + /// Writes the given byte to the address. + /// + /// # Arguments + /// + /// * `val`: [u8] - The bytes to write. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// ptr.write_byte(5u8); + /// assert(ptr.read::() == 5u8); + /// } + /// ``` + pub fn write_byte(self, val: u8) { + let val_ptr = asm(r1: val) { + r1: raw_ptr + }; + asm(ptr: self, val: val_ptr) { + sb ptr val i0; + }; + } + + /// Reads a byte from the given address. + /// + /// # Returns + /// + /// * [u8] - The byte in memory. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// ptr.write_byte(5u8); + /// assert(ptr.read_byte() == 5u8); + /// } + /// ``` + pub fn read_byte(self) -> u8 { + asm(r1: self, r2) { + lb r2 r1 i0; + r2: u8 + } + } + + /// Copies `count` bytes from `self` to `dst`. + /// + /// # Arguments + /// + /// * `dst`: [raw_ptr] - Pointer to the location in memory to copy the bytes to. + /// * `count`: [u64] - The number of bytes to copy. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr_1 = alloc::(1); + /// let ptr_2 = alloc::(1); + /// ptr_1.write_byte(5u8); + /// ptr_1.copy_bytes_to(ptr_2, 1); + /// assert(ptr_2.read_byte() == 5u8); + /// } + /// ``` + pub fn copy_bytes_to(self, dst: Self, count: u64) { + asm(dst: dst, src: self, len: count) { + mcp dst src len; + }; + } + + /// Add a `u64` offset to a `raw_ptr`. + /// + /// # Arguments + /// + /// * `count`: [u64] - The number of `u64` bytes to increase by. + /// + /// # Returns + /// + /// * [raw_ptr] - The pointer to the offset memory location. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(2); + /// let offset_ptr_1 = ptr.add::(1); + /// let offset_ptr_2 = ptr.add_uint_offset(1); + /// assert(offset_ptr_1 == offset_ptr_2); + /// } + /// ``` + pub fn add_uint_offset(self, offset: u64) -> Self { + asm(ptr: self, offset: offset, new) { + add new ptr offset; + new: raw_ptr + } + } + + /// Subtract a `u64` offset from a `raw_ptr`. + /// + /// # Arguments + /// + /// * `count`: [u64] - The number of `u64` bytes to decrease by. + /// + /// # Returns + /// + /// * [raw_ptr] - The pointer to the offset memory location. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(2); + /// let offset_ptr = ptr.add::(1); + /// let subbed_offset = offset_ptr.sub_uint_offset(1); + /// assert(ptr == subbed_offset); + /// } + /// ``` + pub fn sub_uint_offset(self, offset: u64) -> Self { + asm(ptr: self, offset: offset, new) { + sub new ptr offset; + new: raw_ptr + } + } +} diff --git a/sway-lib-std/src/raw_slice.sw b/sway-lib-std/src/raw_slice.sw new file mode 100644 index 00000000000..92092e070f9 --- /dev/null +++ b/sway-lib-std/src/raw_slice.sw @@ -0,0 +1,162 @@ +library; + +use ::raw_ptr::*; + +/// Trait to return a type as a `raw_slice`. +pub trait AsRawSlice { + /// Converts self into a `raw_slice`. + /// + /// # Returns + /// + /// * [raw_slice] - The newly created `raw_slice` from self. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc_bytes; + /// + /// struct MyType { + /// ptr: raw_ptr, + /// len: u64 + /// } + /// + /// impl AsRawSlice for MyType { + /// fn as_raw_slice(self) -> raw_slice { + /// from_parts(self.ptr, self.len) + /// } + /// } + /// + /// fn foo() { + /// let my_type = MyType { + /// ptr: alloc_bytes(0), + /// len: 0 + /// } + /// let slice = my_type.as_raw_slice(); + /// assert(slice.ptr() == my_type.ptr); + /// assert(slice.number_of_bytes() == my_type.len); + /// } + /// ``` + fn as_raw_slice(self) -> raw_slice; +} + +/// Returns a `raw_slice` from a pointer and length. +/// +/// # Arguments +/// +/// * `parts`: [(raw_ptr, u64)] - A location in memory and a length to become a `raw_slice`. +/// +/// # Returns +/// +/// * [raw_slice] - The newly created `raw_slice`. +fn from_parts(parts: (raw_ptr, u64)) -> raw_slice { + asm(ptr: parts) { + ptr: raw_slice + } +} + +/// Returns a pointer and length from a `raw_slice`. +/// +/// # Arguments +/// +/// * `slice`: [raw_slice] - The slice to be broken into its parts. +/// +/// # Returns +/// +/// * [(raw_ptr, u64)] - A tuple of the location in memory of the original `raw_slice` and its length. +fn into_parts(slice: raw_slice) -> (raw_ptr, u64) { + asm(ptr: slice) { + ptr: (raw_ptr, u64) + } +} + +impl raw_slice { + /// Forms a slice from a pointer and a length. + /// + /// # Arguments + /// + /// * `ptr`: [raw_ptr] - The pointer to the location in memory. + /// * `count`: [u64] - The number of `__size_of::` bytes. + /// + /// # Returns + /// + /// * [raw_slice] - The newly created `raw_slice`. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// let slice = raw_slice::from_parts::(ptr, 1); + /// assert(slice.len::() == 1); + /// } + /// ``` + pub fn from_parts(ptr: raw_ptr, count: u64) -> Self { + from_parts((ptr, count * __size_of::())) + } + + /// Returns the pointer to the slice. + /// + /// # Returns + /// + /// * [raw_ptr] - The pointer to the location in memory of the `raw_slice`. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// let slice = raw_slice::from_parts::(ptr, 1); + /// let slice_ptr = slice.ptr(); + /// assert(slice_ptr == ptr); + /// } + /// ``` + pub fn ptr(self) -> raw_ptr { + into_parts(self).0 + } + + /// Returns the number of elements in the slice. + /// + /// # Returns + /// + /// * [u64] - The length of the slice based on `size_of::`. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// let slice = raw_slice::from_parts::(ptr, 1); + /// assert(slice.len::() == 1); + /// } + /// ``` + pub fn len(self) -> u64 { + into_parts(self).1 / __size_of::() + } + + /// Returns the number of elements in the slice when the elements are bytes. + /// + /// # Returns + /// + /// * [u64] - The number of bytes in the `raw_slice`. + /// + /// # Examples + /// + /// ```sway + /// use std::alloc::alloc; + /// + /// fn foo() { + /// let ptr = alloc::(1); + /// let slice = raw_slice::from_parts::(ptr, 1); + /// assert(slice.number_of_bytes() == 8); + /// } + /// ``` + pub fn number_of_bytes(self) -> u64 { + into_parts(self).1 + } +} From 771081f5b4bae103e8d154157e76fc9192385dcd Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 12:42:30 +0530 Subject: [PATCH 03/29] move codec --- sway-lib-core/src/codec.sw | 5377 ----------------------------------- sway-lib-std/src/codec.sw | 5378 ++++++++++++++++++++++++++++++++++++ 2 files changed, 5378 insertions(+), 5377 deletions(-) create mode 100644 sway-lib-std/src/codec.sw diff --git a/sway-lib-core/src/codec.sw b/sway-lib-core/src/codec.sw index 913da976a0c..316a905aa9b 100644 --- a/sway-lib-core/src/codec.sw +++ b/sway-lib-core/src/codec.sw @@ -1,5378 +1 @@ library; - -use ::raw_slice::*; - -pub struct Buffer { - buffer: (raw_ptr, u64, u64), // ptr, capacity, size -} - -impl Buffer { - pub fn new() -> Self { - Buffer { - buffer: __encode_buffer_empty(), - } - } - - fn with_capacity(cap: u64) -> Self { - let ptr = asm(cap: cap) { - aloc cap; - hp: raw_ptr - }; - - Buffer { - buffer: (ptr, cap, 0), - } - } -} - -impl AsRawSlice for Buffer { - fn as_raw_slice(self) -> raw_slice { - __encode_buffer_as_raw_slice(self.buffer) - } -} - -pub struct BufferReader { - ptr: raw_ptr, -} - -impl BufferReader { - pub fn from_parts(ptr: raw_ptr, _len: u64) -> BufferReader { - BufferReader { ptr } - } - - pub fn from_first_parameter() -> BufferReader { - const FIRST_PARAMETER_OFFSET: u64 = 73; - - let ptr = asm() { - fp: raw_ptr - }; - let ptr = ptr.add::(FIRST_PARAMETER_OFFSET); - let ptr = ptr.read::(); - - BufferReader { - ptr: asm(ptr: ptr) { - ptr: raw_ptr - }, - } - } - - pub fn from_second_parameter() -> BufferReader { - const SECOND_PARAMETER_OFFSET: u64 = 74; - - let ptr = asm() { - fp: raw_ptr - }; - let ptr = ptr.add::(SECOND_PARAMETER_OFFSET); - let ptr = ptr.read::(); - - BufferReader { - ptr: asm(ptr: ptr) { - ptr: raw_ptr - }, - } - } - - pub fn from_script_data() -> BufferReader { - let ptr = __gtf::(0, 0xA); // SCRIPT_DATA - let _len = __gtf::(0, 0x4); // SCRIPT_DATA_LEN - BufferReader { ptr } - } - - pub fn from_predicate_data() -> BufferReader { - let predicate_index = asm(r1) { - gm r1 i3; // GET_VERIFYING_PREDICATE - r1: u64 - }; - Self::from_predicate_data_by_index(predicate_index) - } - - pub fn from_predicate_data_by_index(predicate_index: u64) -> BufferReader { - match __gtf::(predicate_index, 0x200) { // GTF_INPUT_TYPE - 0u8 => { - let ptr = __gtf::(predicate_index, 0x20C); // INPUT_COIN_PREDICATE_DATA - let _len = __gtf::(predicate_index, 0x20A); // INPUT_COIN_PREDICATE_DATA_LENGTH - BufferReader { ptr } - }, - 2u8 => { - let ptr = __gtf::(predicate_index, 0x24A); // INPUT_MESSAGE_PREDICATE_DATA - let _len = __gtf::(predicate_index, 0x247); // INPUT_MESSAGE_PREDICATE_DATA_LENGTH - BufferReader { ptr } - }, - _ => __revert(0), - } - } - - pub fn read_8_bytes(ref mut self) -> T { - let v = asm(ptr: self.ptr, val) { - lw val ptr i0; - val: T - }; - self.ptr = __ptr_add::(self.ptr, 8); - v - } - - pub fn read_32_bytes(ref mut self) -> T { - let v = asm(ptr: self.ptr) { - ptr: T - }; - self.ptr = __ptr_add::(self.ptr, 32); - v - } - - pub fn read_bytes(ref mut self, count: u64) -> raw_slice { - let slice = asm(ptr: (self.ptr, count)) { - ptr: raw_slice - }; - self.ptr = __ptr_add::(self.ptr, count); - slice - } - - pub fn read(ref mut self) -> T { - let size = __size_of::(); - - if __is_reference_type::() { - let v = asm(ptr: self.ptr) { - ptr: T - }; - self.ptr = __ptr_add::(self.ptr, size); - v - } else if size == 1 { - let v = asm(ptr: self.ptr, val) { - lb val ptr i0; - val: T - }; - self.ptr = __ptr_add::(self.ptr, 1); - v - } else { - self.read_8_bytes::() - } - } - - pub fn decode(ref mut self) -> T - where - T: AbiDecode, - { - T::abi_decode(self) - } -} - -// Encode - -pub trait AbiEncode { - fn abi_encode(self, buffer: Buffer) -> Buffer; -} - -impl AbiEncode for bool { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -// Encode Numbers - -impl AbiEncode for b256 { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for u256 { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for u64 { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for u32 { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for u16 { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for u8 { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -// Encode str slice and str arrays - -impl AbiEncode for str { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for str[0] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - buffer - } -} - -// BEGIN STRARRAY_ENCODE -impl AbiEncode for str[1] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[2] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[3] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[4] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[5] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[6] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[7] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[8] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[9] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[10] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[11] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[12] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[13] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[14] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[15] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[16] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[17] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[18] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[19] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[20] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[21] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[22] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[23] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[24] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[25] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[26] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[27] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[28] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[29] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[30] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[31] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[32] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[33] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[34] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[35] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[36] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[37] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[38] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[39] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[40] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[41] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[42] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[43] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[44] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[45] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[46] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[47] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[48] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[49] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[50] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[51] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[52] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[53] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[54] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[55] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[56] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[57] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[58] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[59] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[60] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[61] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[62] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[63] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -impl AbiEncode for str[64] { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} -// END STRARRAY_ENCODE - -// Encode Arrays and Slices - -impl AbiEncode for raw_slice { - fn abi_encode(self, buffer: Buffer) -> Buffer { - Buffer { - buffer: __encode_buffer_append(buffer.buffer, self), - } - } -} - -impl AbiEncode for [T; 0] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - buffer - } -} - -// BEGIN ARRAY_ENCODE -impl AbiEncode for [T; 1] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 1 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 2] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 2 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 3] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 3 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 4] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 4 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 5] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 5 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 6] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 6 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 7] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 7 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 8] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 8 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 9] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 9 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 10] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 10 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 11] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 11 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 12] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 12 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 13] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 13 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 14] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 14 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 15] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 15 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 16] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 16 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 17] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 17 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 18] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 18 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 19] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 19 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 20] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 20 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 21] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 21 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 22] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 22 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 23] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 23 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 24] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 24 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 25] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 25 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 26] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 26 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 27] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 27 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 28] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 28 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 29] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 29 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 30] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 30 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 31] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 31 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 32] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 32 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 33] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 33 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 34] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 34 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 35] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 35 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 36] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 36 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 37] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 37 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 38] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 38 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 39] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 39 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 40] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 40 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 41] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 41 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 42] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 42 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 43] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 43 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 44] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 44 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 45] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 45 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 46] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 46 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 47] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 47 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 48] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 48 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 49] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 49 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 50] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 50 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 51] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 51 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 52] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 52 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 53] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 53 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 54] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 54 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 55] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 55 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 56] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 56 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 57] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 57 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 58] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 58 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 59] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 59 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 60] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 60 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 61] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 61 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 62] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 62 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 63] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 63 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -impl AbiEncode for [T; 64] -where - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let mut buffer = buffer; - let mut i = 0; - while i < 64 { - buffer = self[i].abi_encode(buffer); - i += 1; - }; - buffer - } -} -// END ARRAY_ENCODE - -// Encode Tuples - -impl AbiEncode for () { - fn abi_encode(self, buffer: Buffer) -> Buffer { - buffer - } -} - -// BEGIN TUPLES_ENCODE -impl AbiEncode for (A, ) -where - A: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B) -where - A: AbiEncode, - B: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, - U: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - let buffer = self.20.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, - U: AbiEncode, - V: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - let buffer = self.20.abi_encode(buffer); - let buffer = self.21.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, - U: AbiEncode, - V: AbiEncode, - W: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - let buffer = self.20.abi_encode(buffer); - let buffer = self.21.abi_encode(buffer); - let buffer = self.22.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, - U: AbiEncode, - V: AbiEncode, - W: AbiEncode, - X: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - let buffer = self.20.abi_encode(buffer); - let buffer = self.21.abi_encode(buffer); - let buffer = self.22.abi_encode(buffer); - let buffer = self.23.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, - U: AbiEncode, - V: AbiEncode, - W: AbiEncode, - X: AbiEncode, - Y: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - let buffer = self.20.abi_encode(buffer); - let buffer = self.21.abi_encode(buffer); - let buffer = self.22.abi_encode(buffer); - let buffer = self.23.abi_encode(buffer); - let buffer = self.24.abi_encode(buffer); - buffer - } -} -impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z) -where - A: AbiEncode, - B: AbiEncode, - C: AbiEncode, - D: AbiEncode, - E: AbiEncode, - F: AbiEncode, - G: AbiEncode, - H: AbiEncode, - I: AbiEncode, - J: AbiEncode, - K: AbiEncode, - L: AbiEncode, - M: AbiEncode, - N: AbiEncode, - O: AbiEncode, - P: AbiEncode, - Q: AbiEncode, - R: AbiEncode, - S: AbiEncode, - T: AbiEncode, - U: AbiEncode, - V: AbiEncode, - W: AbiEncode, - X: AbiEncode, - Y: AbiEncode, - Z: AbiEncode, -{ - fn abi_encode(self, buffer: Buffer) -> Buffer { - let buffer = self.0.abi_encode(buffer); - let buffer = self.1.abi_encode(buffer); - let buffer = self.2.abi_encode(buffer); - let buffer = self.3.abi_encode(buffer); - let buffer = self.4.abi_encode(buffer); - let buffer = self.5.abi_encode(buffer); - let buffer = self.6.abi_encode(buffer); - let buffer = self.7.abi_encode(buffer); - let buffer = self.8.abi_encode(buffer); - let buffer = self.9.abi_encode(buffer); - let buffer = self.10.abi_encode(buffer); - let buffer = self.11.abi_encode(buffer); - let buffer = self.12.abi_encode(buffer); - let buffer = self.13.abi_encode(buffer); - let buffer = self.14.abi_encode(buffer); - let buffer = self.15.abi_encode(buffer); - let buffer = self.16.abi_encode(buffer); - let buffer = self.17.abi_encode(buffer); - let buffer = self.18.abi_encode(buffer); - let buffer = self.19.abi_encode(buffer); - let buffer = self.20.abi_encode(buffer); - let buffer = self.21.abi_encode(buffer); - let buffer = self.22.abi_encode(buffer); - let buffer = self.23.abi_encode(buffer); - let buffer = self.24.abi_encode(buffer); - let buffer = self.25.abi_encode(buffer); - buffer - } -} -// END TUPLES_ENCODE - -pub fn encode(item: T) -> raw_slice -where - T: AbiEncode, -{ - let buffer = item.abi_encode(Buffer::new()); - buffer.as_raw_slice() -} - -#[inline(never)] -pub fn abi_decode(data: raw_slice) -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_parts(data.ptr(), data.len::()); - T::abi_decode(buffer) -} - -#[inline(never)] -pub fn abi_decode_in_place(ptr: raw_ptr, len: u64, target: raw_ptr) -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_parts(ptr, len); - let temp = T::abi_decode(buffer); - asm( - target: target, - temp: __addr_of(temp), - size: __size_of::(), - ) { - mcp target temp size; - } -} - -// Decode - -pub trait AbiDecode { - fn abi_decode(ref mut buffer: BufferReader) -> Self; -} - -impl AbiDecode for b256 { - fn abi_decode(ref mut buffer: BufferReader) -> b256 { - buffer.read_32_bytes::() - } -} - -impl AbiDecode for u256 { - fn abi_decode(ref mut buffer: BufferReader) -> u256 { - buffer.read_32_bytes::() - } -} - -impl AbiDecode for u64 { - fn abi_decode(ref mut buffer: BufferReader) -> u64 { - buffer.read_8_bytes::() - } -} - -impl AbiDecode for u32 { - fn abi_decode(ref mut buffer: BufferReader) -> u32 { - use ::primitive_conversions::*; - let a = buffer.read::().as_u32(); - let b = buffer.read::().as_u32(); - let c = buffer.read::().as_u32(); - let d = buffer.read::().as_u32(); - (a << 24) | (b << 16) | (c << 8) | d - } -} - -impl AbiDecode for u16 { - fn abi_decode(ref mut buffer: BufferReader) -> u16 { - use ::primitive_conversions::*; - let a = buffer.read::().as_u16(); - let b = buffer.read::().as_u16(); - (a << 8) | b - } -} - -impl AbiDecode for u8 { - fn abi_decode(ref mut buffer: BufferReader) -> u8 { - buffer.read::() - } -} - -impl AbiDecode for bool { - fn abi_decode(ref mut buffer: BufferReader) -> bool { - match buffer.read::() { - 0 => false, - 1 => true, - _ => __revert(0), - } - } -} - -impl AbiDecode for raw_slice { - fn abi_decode(ref mut buffer: BufferReader) -> raw_slice { - let len = buffer.read_8_bytes::(); - buffer.read_bytes(len) - } -} - -impl AbiDecode for str { - fn abi_decode(ref mut buffer: BufferReader) -> str { - let len = buffer.read_8_bytes::(); - let data = buffer.read_bytes(len); - asm(s: (data.ptr(), len)) { - s: str - } - } -} - -// BEGIN STRARRAY_DECODE -impl AbiDecode for str[1] { - fn abi_decode(ref mut buffer: BufferReader) -> str[1] { - let data = buffer.read_bytes(1); - asm(s: data.ptr()) { - s: str[1] - } - } -} -impl AbiDecode for str[2] { - fn abi_decode(ref mut buffer: BufferReader) -> str[2] { - let data = buffer.read_bytes(2); - asm(s: data.ptr()) { - s: str[2] - } - } -} -impl AbiDecode for str[3] { - fn abi_decode(ref mut buffer: BufferReader) -> str[3] { - let data = buffer.read_bytes(3); - asm(s: data.ptr()) { - s: str[3] - } - } -} -impl AbiDecode for str[4] { - fn abi_decode(ref mut buffer: BufferReader) -> str[4] { - let data = buffer.read_bytes(4); - asm(s: data.ptr()) { - s: str[4] - } - } -} -impl AbiDecode for str[5] { - fn abi_decode(ref mut buffer: BufferReader) -> str[5] { - let data = buffer.read_bytes(5); - asm(s: data.ptr()) { - s: str[5] - } - } -} -impl AbiDecode for str[6] { - fn abi_decode(ref mut buffer: BufferReader) -> str[6] { - let data = buffer.read_bytes(6); - asm(s: data.ptr()) { - s: str[6] - } - } -} -impl AbiDecode for str[7] { - fn abi_decode(ref mut buffer: BufferReader) -> str[7] { - let data = buffer.read_bytes(7); - asm(s: data.ptr()) { - s: str[7] - } - } -} -impl AbiDecode for str[8] { - fn abi_decode(ref mut buffer: BufferReader) -> str[8] { - let data = buffer.read_bytes(8); - asm(s: data.ptr()) { - s: str[8] - } - } -} -impl AbiDecode for str[9] { - fn abi_decode(ref mut buffer: BufferReader) -> str[9] { - let data = buffer.read_bytes(9); - asm(s: data.ptr()) { - s: str[9] - } - } -} -impl AbiDecode for str[10] { - fn abi_decode(ref mut buffer: BufferReader) -> str[10] { - let data = buffer.read_bytes(10); - asm(s: data.ptr()) { - s: str[10] - } - } -} -impl AbiDecode for str[11] { - fn abi_decode(ref mut buffer: BufferReader) -> str[11] { - let data = buffer.read_bytes(11); - asm(s: data.ptr()) { - s: str[11] - } - } -} -impl AbiDecode for str[12] { - fn abi_decode(ref mut buffer: BufferReader) -> str[12] { - let data = buffer.read_bytes(12); - asm(s: data.ptr()) { - s: str[12] - } - } -} -impl AbiDecode for str[13] { - fn abi_decode(ref mut buffer: BufferReader) -> str[13] { - let data = buffer.read_bytes(13); - asm(s: data.ptr()) { - s: str[13] - } - } -} -impl AbiDecode for str[14] { - fn abi_decode(ref mut buffer: BufferReader) -> str[14] { - let data = buffer.read_bytes(14); - asm(s: data.ptr()) { - s: str[14] - } - } -} -impl AbiDecode for str[15] { - fn abi_decode(ref mut buffer: BufferReader) -> str[15] { - let data = buffer.read_bytes(15); - asm(s: data.ptr()) { - s: str[15] - } - } -} -impl AbiDecode for str[16] { - fn abi_decode(ref mut buffer: BufferReader) -> str[16] { - let data = buffer.read_bytes(16); - asm(s: data.ptr()) { - s: str[16] - } - } -} -impl AbiDecode for str[17] { - fn abi_decode(ref mut buffer: BufferReader) -> str[17] { - let data = buffer.read_bytes(17); - asm(s: data.ptr()) { - s: str[17] - } - } -} -impl AbiDecode for str[18] { - fn abi_decode(ref mut buffer: BufferReader) -> str[18] { - let data = buffer.read_bytes(18); - asm(s: data.ptr()) { - s: str[18] - } - } -} -impl AbiDecode for str[19] { - fn abi_decode(ref mut buffer: BufferReader) -> str[19] { - let data = buffer.read_bytes(19); - asm(s: data.ptr()) { - s: str[19] - } - } -} -impl AbiDecode for str[20] { - fn abi_decode(ref mut buffer: BufferReader) -> str[20] { - let data = buffer.read_bytes(20); - asm(s: data.ptr()) { - s: str[20] - } - } -} -impl AbiDecode for str[21] { - fn abi_decode(ref mut buffer: BufferReader) -> str[21] { - let data = buffer.read_bytes(21); - asm(s: data.ptr()) { - s: str[21] - } - } -} -impl AbiDecode for str[22] { - fn abi_decode(ref mut buffer: BufferReader) -> str[22] { - let data = buffer.read_bytes(22); - asm(s: data.ptr()) { - s: str[22] - } - } -} -impl AbiDecode for str[23] { - fn abi_decode(ref mut buffer: BufferReader) -> str[23] { - let data = buffer.read_bytes(23); - asm(s: data.ptr()) { - s: str[23] - } - } -} -impl AbiDecode for str[24] { - fn abi_decode(ref mut buffer: BufferReader) -> str[24] { - let data = buffer.read_bytes(24); - asm(s: data.ptr()) { - s: str[24] - } - } -} -impl AbiDecode for str[25] { - fn abi_decode(ref mut buffer: BufferReader) -> str[25] { - let data = buffer.read_bytes(25); - asm(s: data.ptr()) { - s: str[25] - } - } -} -impl AbiDecode for str[26] { - fn abi_decode(ref mut buffer: BufferReader) -> str[26] { - let data = buffer.read_bytes(26); - asm(s: data.ptr()) { - s: str[26] - } - } -} -impl AbiDecode for str[27] { - fn abi_decode(ref mut buffer: BufferReader) -> str[27] { - let data = buffer.read_bytes(27); - asm(s: data.ptr()) { - s: str[27] - } - } -} -impl AbiDecode for str[28] { - fn abi_decode(ref mut buffer: BufferReader) -> str[28] { - let data = buffer.read_bytes(28); - asm(s: data.ptr()) { - s: str[28] - } - } -} -impl AbiDecode for str[29] { - fn abi_decode(ref mut buffer: BufferReader) -> str[29] { - let data = buffer.read_bytes(29); - asm(s: data.ptr()) { - s: str[29] - } - } -} -impl AbiDecode for str[30] { - fn abi_decode(ref mut buffer: BufferReader) -> str[30] { - let data = buffer.read_bytes(30); - asm(s: data.ptr()) { - s: str[30] - } - } -} -impl AbiDecode for str[31] { - fn abi_decode(ref mut buffer: BufferReader) -> str[31] { - let data = buffer.read_bytes(31); - asm(s: data.ptr()) { - s: str[31] - } - } -} -impl AbiDecode for str[32] { - fn abi_decode(ref mut buffer: BufferReader) -> str[32] { - let data = buffer.read_bytes(32); - asm(s: data.ptr()) { - s: str[32] - } - } -} -impl AbiDecode for str[33] { - fn abi_decode(ref mut buffer: BufferReader) -> str[33] { - let data = buffer.read_bytes(33); - asm(s: data.ptr()) { - s: str[33] - } - } -} -impl AbiDecode for str[34] { - fn abi_decode(ref mut buffer: BufferReader) -> str[34] { - let data = buffer.read_bytes(34); - asm(s: data.ptr()) { - s: str[34] - } - } -} -impl AbiDecode for str[35] { - fn abi_decode(ref mut buffer: BufferReader) -> str[35] { - let data = buffer.read_bytes(35); - asm(s: data.ptr()) { - s: str[35] - } - } -} -impl AbiDecode for str[36] { - fn abi_decode(ref mut buffer: BufferReader) -> str[36] { - let data = buffer.read_bytes(36); - asm(s: data.ptr()) { - s: str[36] - } - } -} -impl AbiDecode for str[37] { - fn abi_decode(ref mut buffer: BufferReader) -> str[37] { - let data = buffer.read_bytes(37); - asm(s: data.ptr()) { - s: str[37] - } - } -} -impl AbiDecode for str[38] { - fn abi_decode(ref mut buffer: BufferReader) -> str[38] { - let data = buffer.read_bytes(38); - asm(s: data.ptr()) { - s: str[38] - } - } -} -impl AbiDecode for str[39] { - fn abi_decode(ref mut buffer: BufferReader) -> str[39] { - let data = buffer.read_bytes(39); - asm(s: data.ptr()) { - s: str[39] - } - } -} -impl AbiDecode for str[40] { - fn abi_decode(ref mut buffer: BufferReader) -> str[40] { - let data = buffer.read_bytes(40); - asm(s: data.ptr()) { - s: str[40] - } - } -} -impl AbiDecode for str[41] { - fn abi_decode(ref mut buffer: BufferReader) -> str[41] { - let data = buffer.read_bytes(41); - asm(s: data.ptr()) { - s: str[41] - } - } -} -impl AbiDecode for str[42] { - fn abi_decode(ref mut buffer: BufferReader) -> str[42] { - let data = buffer.read_bytes(42); - asm(s: data.ptr()) { - s: str[42] - } - } -} -impl AbiDecode for str[43] { - fn abi_decode(ref mut buffer: BufferReader) -> str[43] { - let data = buffer.read_bytes(43); - asm(s: data.ptr()) { - s: str[43] - } - } -} -impl AbiDecode for str[44] { - fn abi_decode(ref mut buffer: BufferReader) -> str[44] { - let data = buffer.read_bytes(44); - asm(s: data.ptr()) { - s: str[44] - } - } -} -impl AbiDecode for str[45] { - fn abi_decode(ref mut buffer: BufferReader) -> str[45] { - let data = buffer.read_bytes(45); - asm(s: data.ptr()) { - s: str[45] - } - } -} -impl AbiDecode for str[46] { - fn abi_decode(ref mut buffer: BufferReader) -> str[46] { - let data = buffer.read_bytes(46); - asm(s: data.ptr()) { - s: str[46] - } - } -} -impl AbiDecode for str[47] { - fn abi_decode(ref mut buffer: BufferReader) -> str[47] { - let data = buffer.read_bytes(47); - asm(s: data.ptr()) { - s: str[47] - } - } -} -impl AbiDecode for str[48] { - fn abi_decode(ref mut buffer: BufferReader) -> str[48] { - let data = buffer.read_bytes(48); - asm(s: data.ptr()) { - s: str[48] - } - } -} -impl AbiDecode for str[49] { - fn abi_decode(ref mut buffer: BufferReader) -> str[49] { - let data = buffer.read_bytes(49); - asm(s: data.ptr()) { - s: str[49] - } - } -} -impl AbiDecode for str[50] { - fn abi_decode(ref mut buffer: BufferReader) -> str[50] { - let data = buffer.read_bytes(50); - asm(s: data.ptr()) { - s: str[50] - } - } -} -impl AbiDecode for str[51] { - fn abi_decode(ref mut buffer: BufferReader) -> str[51] { - let data = buffer.read_bytes(51); - asm(s: data.ptr()) { - s: str[51] - } - } -} -impl AbiDecode for str[52] { - fn abi_decode(ref mut buffer: BufferReader) -> str[52] { - let data = buffer.read_bytes(52); - asm(s: data.ptr()) { - s: str[52] - } - } -} -impl AbiDecode for str[53] { - fn abi_decode(ref mut buffer: BufferReader) -> str[53] { - let data = buffer.read_bytes(53); - asm(s: data.ptr()) { - s: str[53] - } - } -} -impl AbiDecode for str[54] { - fn abi_decode(ref mut buffer: BufferReader) -> str[54] { - let data = buffer.read_bytes(54); - asm(s: data.ptr()) { - s: str[54] - } - } -} -impl AbiDecode for str[55] { - fn abi_decode(ref mut buffer: BufferReader) -> str[55] { - let data = buffer.read_bytes(55); - asm(s: data.ptr()) { - s: str[55] - } - } -} -impl AbiDecode for str[56] { - fn abi_decode(ref mut buffer: BufferReader) -> str[56] { - let data = buffer.read_bytes(56); - asm(s: data.ptr()) { - s: str[56] - } - } -} -impl AbiDecode for str[57] { - fn abi_decode(ref mut buffer: BufferReader) -> str[57] { - let data = buffer.read_bytes(57); - asm(s: data.ptr()) { - s: str[57] - } - } -} -impl AbiDecode for str[58] { - fn abi_decode(ref mut buffer: BufferReader) -> str[58] { - let data = buffer.read_bytes(58); - asm(s: data.ptr()) { - s: str[58] - } - } -} -impl AbiDecode for str[59] { - fn abi_decode(ref mut buffer: BufferReader) -> str[59] { - let data = buffer.read_bytes(59); - asm(s: data.ptr()) { - s: str[59] - } - } -} -impl AbiDecode for str[60] { - fn abi_decode(ref mut buffer: BufferReader) -> str[60] { - let data = buffer.read_bytes(60); - asm(s: data.ptr()) { - s: str[60] - } - } -} -impl AbiDecode for str[61] { - fn abi_decode(ref mut buffer: BufferReader) -> str[61] { - let data = buffer.read_bytes(61); - asm(s: data.ptr()) { - s: str[61] - } - } -} -impl AbiDecode for str[62] { - fn abi_decode(ref mut buffer: BufferReader) -> str[62] { - let data = buffer.read_bytes(62); - asm(s: data.ptr()) { - s: str[62] - } - } -} -impl AbiDecode for str[63] { - fn abi_decode(ref mut buffer: BufferReader) -> str[63] { - let data = buffer.read_bytes(63); - asm(s: data.ptr()) { - s: str[63] - } - } -} -impl AbiDecode for str[64] { - fn abi_decode(ref mut buffer: BufferReader) -> str[64] { - let data = buffer.read_bytes(64); - asm(s: data.ptr()) { - s: str[64] - } - } -} -// END STRARRAY_DECODE - -// BEGIN ARRAY_DECODE -impl AbiDecode for [T; 1] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 1] { - let first: T = buffer.decode::(); - let mut array = [first; 1]; - let mut i = 1; - while i < 1 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 2] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 2] { - let first: T = buffer.decode::(); - let mut array = [first; 2]; - let mut i = 1; - while i < 2 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 3] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 3] { - let first: T = buffer.decode::(); - let mut array = [first; 3]; - let mut i = 1; - while i < 3 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 4] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 4] { - let first: T = buffer.decode::(); - let mut array = [first; 4]; - let mut i = 1; - while i < 4 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 5] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 5] { - let first: T = buffer.decode::(); - let mut array = [first; 5]; - let mut i = 1; - while i < 5 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 6] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 6] { - let first: T = buffer.decode::(); - let mut array = [first; 6]; - let mut i = 1; - while i < 6 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 7] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 7] { - let first: T = buffer.decode::(); - let mut array = [first; 7]; - let mut i = 1; - while i < 7 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 8] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 8] { - let first: T = buffer.decode::(); - let mut array = [first; 8]; - let mut i = 1; - while i < 8 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 9] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 9] { - let first: T = buffer.decode::(); - let mut array = [first; 9]; - let mut i = 1; - while i < 9 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 10] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 10] { - let first: T = buffer.decode::(); - let mut array = [first; 10]; - let mut i = 1; - while i < 10 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 11] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 11] { - let first: T = buffer.decode::(); - let mut array = [first; 11]; - let mut i = 1; - while i < 11 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 12] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 12] { - let first: T = buffer.decode::(); - let mut array = [first; 12]; - let mut i = 1; - while i < 12 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 13] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 13] { - let first: T = buffer.decode::(); - let mut array = [first; 13]; - let mut i = 1; - while i < 13 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 14] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 14] { - let first: T = buffer.decode::(); - let mut array = [first; 14]; - let mut i = 1; - while i < 14 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 15] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 15] { - let first: T = buffer.decode::(); - let mut array = [first; 15]; - let mut i = 1; - while i < 15 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 16] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 16] { - let first: T = buffer.decode::(); - let mut array = [first; 16]; - let mut i = 1; - while i < 16 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 17] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 17] { - let first: T = buffer.decode::(); - let mut array = [first; 17]; - let mut i = 1; - while i < 17 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 18] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 18] { - let first: T = buffer.decode::(); - let mut array = [first; 18]; - let mut i = 1; - while i < 18 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 19] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 19] { - let first: T = buffer.decode::(); - let mut array = [first; 19]; - let mut i = 1; - while i < 19 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 20] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 20] { - let first: T = buffer.decode::(); - let mut array = [first; 20]; - let mut i = 1; - while i < 20 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 21] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 21] { - let first: T = buffer.decode::(); - let mut array = [first; 21]; - let mut i = 1; - while i < 21 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 22] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 22] { - let first: T = buffer.decode::(); - let mut array = [first; 22]; - let mut i = 1; - while i < 22 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 23] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 23] { - let first: T = buffer.decode::(); - let mut array = [first; 23]; - let mut i = 1; - while i < 23 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 24] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 24] { - let first: T = buffer.decode::(); - let mut array = [first; 24]; - let mut i = 1; - while i < 24 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 25] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 25] { - let first: T = buffer.decode::(); - let mut array = [first; 25]; - let mut i = 1; - while i < 25 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 26] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 26] { - let first: T = buffer.decode::(); - let mut array = [first; 26]; - let mut i = 1; - while i < 26 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 27] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 27] { - let first: T = buffer.decode::(); - let mut array = [first; 27]; - let mut i = 1; - while i < 27 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 28] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 28] { - let first: T = buffer.decode::(); - let mut array = [first; 28]; - let mut i = 1; - while i < 28 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 29] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 29] { - let first: T = buffer.decode::(); - let mut array = [first; 29]; - let mut i = 1; - while i < 29 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 30] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 30] { - let first: T = buffer.decode::(); - let mut array = [first; 30]; - let mut i = 1; - while i < 30 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 31] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 31] { - let first: T = buffer.decode::(); - let mut array = [first; 31]; - let mut i = 1; - while i < 31 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 32] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 32] { - let first: T = buffer.decode::(); - let mut array = [first; 32]; - let mut i = 1; - while i < 32 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 33] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 33] { - let first: T = buffer.decode::(); - let mut array = [first; 33]; - let mut i = 1; - while i < 33 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 34] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 34] { - let first: T = buffer.decode::(); - let mut array = [first; 34]; - let mut i = 1; - while i < 34 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 35] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 35] { - let first: T = buffer.decode::(); - let mut array = [first; 35]; - let mut i = 1; - while i < 35 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 36] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 36] { - let first: T = buffer.decode::(); - let mut array = [first; 36]; - let mut i = 1; - while i < 36 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 37] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 37] { - let first: T = buffer.decode::(); - let mut array = [first; 37]; - let mut i = 1; - while i < 37 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 38] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 38] { - let first: T = buffer.decode::(); - let mut array = [first; 38]; - let mut i = 1; - while i < 38 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 39] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 39] { - let first: T = buffer.decode::(); - let mut array = [first; 39]; - let mut i = 1; - while i < 39 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 40] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 40] { - let first: T = buffer.decode::(); - let mut array = [first; 40]; - let mut i = 1; - while i < 40 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 41] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 41] { - let first: T = buffer.decode::(); - let mut array = [first; 41]; - let mut i = 1; - while i < 41 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 42] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 42] { - let first: T = buffer.decode::(); - let mut array = [first; 42]; - let mut i = 1; - while i < 42 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 43] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 43] { - let first: T = buffer.decode::(); - let mut array = [first; 43]; - let mut i = 1; - while i < 43 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 44] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 44] { - let first: T = buffer.decode::(); - let mut array = [first; 44]; - let mut i = 1; - while i < 44 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 45] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 45] { - let first: T = buffer.decode::(); - let mut array = [first; 45]; - let mut i = 1; - while i < 45 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 46] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 46] { - let first: T = buffer.decode::(); - let mut array = [first; 46]; - let mut i = 1; - while i < 46 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 47] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 47] { - let first: T = buffer.decode::(); - let mut array = [first; 47]; - let mut i = 1; - while i < 47 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 48] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 48] { - let first: T = buffer.decode::(); - let mut array = [first; 48]; - let mut i = 1; - while i < 48 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 49] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 49] { - let first: T = buffer.decode::(); - let mut array = [first; 49]; - let mut i = 1; - while i < 49 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 50] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 50] { - let first: T = buffer.decode::(); - let mut array = [first; 50]; - let mut i = 1; - while i < 50 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 51] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 51] { - let first: T = buffer.decode::(); - let mut array = [first; 51]; - let mut i = 1; - while i < 51 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 52] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 52] { - let first: T = buffer.decode::(); - let mut array = [first; 52]; - let mut i = 1; - while i < 52 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 53] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 53] { - let first: T = buffer.decode::(); - let mut array = [first; 53]; - let mut i = 1; - while i < 53 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 54] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 54] { - let first: T = buffer.decode::(); - let mut array = [first; 54]; - let mut i = 1; - while i < 54 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 55] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 55] { - let first: T = buffer.decode::(); - let mut array = [first; 55]; - let mut i = 1; - while i < 55 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 56] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 56] { - let first: T = buffer.decode::(); - let mut array = [first; 56]; - let mut i = 1; - while i < 56 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 57] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 57] { - let first: T = buffer.decode::(); - let mut array = [first; 57]; - let mut i = 1; - while i < 57 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 58] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 58] { - let first: T = buffer.decode::(); - let mut array = [first; 58]; - let mut i = 1; - while i < 58 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 59] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 59] { - let first: T = buffer.decode::(); - let mut array = [first; 59]; - let mut i = 1; - while i < 59 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 60] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 60] { - let first: T = buffer.decode::(); - let mut array = [first; 60]; - let mut i = 1; - while i < 60 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 61] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 61] { - let first: T = buffer.decode::(); - let mut array = [first; 61]; - let mut i = 1; - while i < 61 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 62] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 62] { - let first: T = buffer.decode::(); - let mut array = [first; 62]; - let mut i = 1; - while i < 62 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 63] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 63] { - let first: T = buffer.decode::(); - let mut array = [first; 63]; - let mut i = 1; - while i < 63 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -impl AbiDecode for [T; 64] -where - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> [T; 64] { - let first: T = buffer.decode::(); - let mut array = [first; 64]; - let mut i = 1; - while i < 64 { - array[i] = buffer.decode::(); - i += 1; - }; - array - } -} -// END ARRAY_DECODE - -impl AbiDecode for () { - fn abi_decode(ref mut _buffer: BufferReader) -> () { - () - } -} - -// BEGIN TUPLES_DECODE -impl AbiDecode for (A, ) -where - A: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - (A::abi_decode(buffer), ) - } -} -impl AbiDecode for (A, B) -where - A: AbiDecode, - B: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - (A::abi_decode(buffer), B::abi_decode(buffer)) - } -} -impl AbiDecode for (A, B, C) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - (A::abi_decode(buffer), B::abi_decode(buffer), C::abi_decode(buffer)) - } -} -impl AbiDecode for (A, B, C, D) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, - U: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - U::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, - U: AbiDecode, - V: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - U::abi_decode(buffer), - V::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, - U: AbiDecode, - V: AbiDecode, - W: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - U::abi_decode(buffer), - V::abi_decode(buffer), - W::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, - U: AbiDecode, - V: AbiDecode, - W: AbiDecode, - X: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - U::abi_decode(buffer), - V::abi_decode(buffer), - W::abi_decode(buffer), - X::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, - U: AbiDecode, - V: AbiDecode, - W: AbiDecode, - X: AbiDecode, - Y: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - U::abi_decode(buffer), - V::abi_decode(buffer), - W::abi_decode(buffer), - X::abi_decode(buffer), - Y::abi_decode(buffer), - ) - } -} -impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z) -where - A: AbiDecode, - B: AbiDecode, - C: AbiDecode, - D: AbiDecode, - E: AbiDecode, - F: AbiDecode, - G: AbiDecode, - H: AbiDecode, - I: AbiDecode, - J: AbiDecode, - K: AbiDecode, - L: AbiDecode, - M: AbiDecode, - N: AbiDecode, - O: AbiDecode, - P: AbiDecode, - Q: AbiDecode, - R: AbiDecode, - S: AbiDecode, - T: AbiDecode, - U: AbiDecode, - V: AbiDecode, - W: AbiDecode, - X: AbiDecode, - Y: AbiDecode, - Z: AbiDecode, -{ - fn abi_decode(ref mut buffer: BufferReader) -> Self { - ( - A::abi_decode(buffer), - B::abi_decode(buffer), - C::abi_decode(buffer), - D::abi_decode(buffer), - E::abi_decode(buffer), - F::abi_decode(buffer), - G::abi_decode(buffer), - H::abi_decode(buffer), - I::abi_decode(buffer), - J::abi_decode(buffer), - K::abi_decode(buffer), - L::abi_decode(buffer), - M::abi_decode(buffer), - N::abi_decode(buffer), - O::abi_decode(buffer), - P::abi_decode(buffer), - Q::abi_decode(buffer), - R::abi_decode(buffer), - S::abi_decode(buffer), - T::abi_decode(buffer), - U::abi_decode(buffer), - V::abi_decode(buffer), - W::abi_decode(buffer), - X::abi_decode(buffer), - Y::abi_decode(buffer), - Z::abi_decode(buffer), - ) - } -} -// END TUPLES_DECODE -use ::ops::*; - -pub fn contract_call( - contract_id: b256, - method_name: str, - args: TArgs, - coins: u64, - asset_id: b256, - gas: u64, -) -> T -where - T: AbiDecode, - TArgs: AbiEncode, -{ - let first_parameter = encode(method_name); - let second_parameter = encode(args); - let params = encode(( - contract_id, - asm(a: first_parameter.ptr()) { - a: u64 - }, - asm(a: second_parameter.ptr()) { - a: u64 - }, - )); - - __contract_call(params.ptr(), coins, asset_id, gas); - let ptr = asm() { - ret: raw_ptr - }; - let len = asm() { - retl: u64 - }; - - let mut buffer = BufferReader::from_parts(ptr, len); - T::abi_decode(buffer) -} - -pub fn decode_script_data() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_script_data(); - T::abi_decode(buffer) -} - -pub fn decode_predicate_data() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_predicate_data(); - T::abi_decode(buffer) -} - -pub fn decode_predicate_data_by_index(index: u64) -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_predicate_data_by_index(index); - T::abi_decode(buffer) -} - -pub fn decode_first_param() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_first_parameter(); - T::abi_decode(buffer) -} - -pub fn decode_second_param() -> T -where - T: AbiDecode, -{ - let mut buffer = BufferReader::from_second_parameter(); - T::abi_decode(buffer) -} - -// Tests - - -fn assert_encoding(value: T, expected: SLICE) -where - T: AbiEncode, -{ - let len = __size_of::(); - - if len == 0 { - __revert(0); - } - - let expected = raw_slice::from_parts::(__addr_of(expected), len); - let actual = encode(value); - - if actual.len::() != expected.len::() { - __revert(0); - } - - let result = asm( - result, - expected: expected.ptr(), - actual: actual.ptr(), - len: len, - ) { - meq result expected actual len; - result: bool - }; - - if !result { - __revert(0); - } -} - -fn assert_encoding_and_decoding( - value: T, - expected: SLICE, -) -where - T: Eq + AbiEncode + AbiDecode, -{ - let len = __size_of::(); - - if len == 0 { - __revert(0); - } - - let expected = raw_slice::from_parts::(__addr_of(expected), len); - let actual = encode(value); - - if actual.len::() != expected.len::() { - __revert(0); - } - - let result = asm( - result, - expected: expected.ptr(), - actual: actual.ptr(), - len: len, - ) { - meq result expected actual len; - result: bool - }; - - if !result { - __revert(0); - } - - let decoded = abi_decode::(actual); - __log(decoded); - if !decoded.eq(value) { - __revert(0); - } -} - -fn to_slice(array: T) -> raw_slice { - let len = __size_of::(); - raw_slice::from_parts::(__addr_of(array), len) -} - -fn assert_ge(a: T, b: T, revert_code: u64) -where - T: Ord, -{ - if a.lt(b) { - __revert(revert_code) - } -} - -fn assert_eq(a: T, b: T, revert_code: u64) -where - T: Eq, -{ - if a != b { - __revert(revert_code) - } -} - -fn assert_neq(a: T, b: T, revert_code: u64) -where - T: Eq, -{ - if a == b { - __revert(revert_code) - } -} - -fn assert_no_write_after_buffer(value_to_append: T, size_of_t: u64) -where - T: AbiEncode, -{ - // This red zone should not be overwritten - let red_zone1 = asm(size: 1024) { - aloc size; - hp: raw_ptr - }; - red_zone1.write(0xFFFFFFFFFFFFFFFF); - - // Create encoding buffer with capacity for one item - let mut buffer = Buffer::with_capacity(size_of_t); - let ptr1 = buffer.buffer.0; - - // Append one item - let buffer = value_to_append.abi_encode(buffer); - assert_eq(ptr1, buffer.buffer.0, 1); // no buffer grow is expected - assert_eq(buffer.buffer.1, size_of_t, 2); // capacity must be still be one item - assert_eq(buffer.buffer.2, size_of_t, 3); // buffer has one item - - // This red zone should not be overwritten - let red_zone2 = asm(size: 1024) { - aloc size; - hp: raw_ptr - }; - red_zone2.write(0xFFFFFFFFFFFFFFFF); - - // Append another item - let buffer = value_to_append.abi_encode(buffer); - assert_neq(ptr1, buffer.buffer.0, 4); // must have allocated new buffer - assert_ge(buffer.buffer.1, size_of_t * 2, 5); // capacity for at least two items - assert_eq(buffer.buffer.2, size_of_t * 2, 6); // buffer has two items - - // Check that red zones were not overwritten - assert_eq(red_zone1.read::(), 0xFFFFFFFFFFFFFFFF, 7); - assert_eq(red_zone2.read::(), 0xFFFFFFFFFFFFFFFF, 8); -} - -#[test] -fn ok_encoding_should_not_write_outside_buffer() { - assert_no_write_after_buffer::(true, 1); - - // numbers - assert_no_write_after_buffer::(1, 1); - assert_no_write_after_buffer::(1, 2); - assert_no_write_after_buffer::(1, 4); - assert_no_write_after_buffer::(1, 8); - assert_no_write_after_buffer::( - 0x0000000000000000000000000000000000000000000000000000000000000001u256, - 32, - ); - assert_no_write_after_buffer::( - 0x0000000000000000000000000000000000000000000000000000000000000001, - 32, - ); - - // arrays - assert_no_write_after_buffer::<[u8; 1]>([1], 1); - assert_no_write_after_buffer::<[u8; 2]>([1, 1], 2); - assert_no_write_after_buffer::<[u8; 3]>([1, 1, 1], 3); - assert_no_write_after_buffer::<[u8; 4]>([1, 1, 1, 1], 4); - assert_no_write_after_buffer::<[u8; 5]>([1, 1, 1, 1, 1], 5); - - // string arrays - assert_no_write_after_buffer::(__to_str_array("h"), 1); - assert_no_write_after_buffer::(__to_str_array("he"), 2); - assert_no_write_after_buffer::(__to_str_array("hello world"), 11); - - // string slices - assert_no_write_after_buffer::("h", 9); - assert_no_write_after_buffer::("he", 10); - assert_no_write_after_buffer::("hello world", 19); -} - -#[test] -fn ok_abi_encoding() { - // bool - assert_encoding_and_decoding(false, [0u8]); - assert_encoding_and_decoding(true, [1u8]); - - // numbers - assert_encoding_and_decoding(0u8, [0u8]); - assert_encoding_and_decoding(255u8, [255u8]); - - assert_encoding_and_decoding(0u16, [0u8, 0u8]); - assert_encoding_and_decoding(128u16, [0u8, 128u8]); - assert_encoding_and_decoding(65535u16, [255u8, 255u8]); - - assert_encoding_and_decoding(0u32, [0u8, 0u8, 0u8, 0u8]); - assert_encoding_and_decoding(128u32, [0u8, 0u8, 0u8, 128u8]); - assert_encoding_and_decoding(4294967295u32, [255u8, 255u8, 255u8, 255u8]); - - assert_encoding_and_decoding(0u64, [0u8; 8]); - assert_encoding_and_decoding(128u64, [0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8]); - assert_encoding_and_decoding(18446744073709551615u64, [255u8; 8]); - - assert_encoding_and_decoding( - 0x0000000000000000000000000000000000000000000000000000000000000000u256, - [0u8; 32], - ); - assert_encoding_and_decoding( - 0xAA000000000000000000000000000000000000000000000000000000000000BBu256, - [ - 0xAAu8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, - 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, - 0u8, 0u8, 0u8, 0xBBu8, - ], - ); - assert_encoding_and_decoding( - 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu256, - [255u8; 32], - ); - - assert_encoding_and_decoding( - 0x0000000000000000000000000000000000000000000000000000000000000000, - [0u8; 32], - ); - assert_encoding_and_decoding( - 0xAA000000000000000000000000000000000000000000000000000000000000BB, - [ - 0xAAu8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, - 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, - 0u8, 0u8, 0u8, 0xBBu8, - ], - ); - assert_encoding_and_decoding( - 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, - [255u8; 32], - ); - - // strings - assert_encoding_and_decoding( - "Hello", - [0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 5u8, 72u8, 101u8, 108u8, 108u8, 111u8], - ); - - assert_encoding( - { - let a: str[1] = __to_str_array("a"); - a - }, - [97u8], - ); - assert_encoding( - { - let a: str[2] = __to_str_array("aa"); - a - }, - [97u8, 97u8], - ); - assert_encoding( - { - let a: str[3] = __to_str_array("aaa"); - a - }, - [97u8, 97u8, 97u8], - ); - assert_encoding( - { - let a: str[4] = __to_str_array("aaaa"); - a - }, - [97u8, 97u8, 97u8, 97u8], - ); - assert_encoding( - { - let a: str[5] = __to_str_array("aaaaa"); - a - }, - [97u8, 97u8, 97u8, 97u8, 97u8], - ); - - // arrays - assert_encoding([255u8; 1], [255u8; 1]); - assert_encoding([255u8; 2], [255u8; 2]); - assert_encoding([255u8; 3], [255u8; 3]); - assert_encoding([255u8; 4], [255u8; 4]); - assert_encoding([255u8; 5], [255u8; 5]); - - let array = abi_decode::<[u8; 1]>(to_slice([255u8])); - assert_eq(array[0], 255u8, 0); - - let array = abi_decode::<[u8; 2]>(to_slice([255u8, 254u8])); - assert_eq(array[0], 255u8, 0); - assert_eq(array[1], 254u8, 0); -} - -#[test(should_revert)] -fn nok_abi_encoding_invalid_bool() { - let actual = encode(2u8); - let _ = abi_decode::(actual); -} diff --git a/sway-lib-std/src/codec.sw b/sway-lib-std/src/codec.sw new file mode 100644 index 00000000000..3c65de44f23 --- /dev/null +++ b/sway-lib-std/src/codec.sw @@ -0,0 +1,5378 @@ +library; + +use ::raw_slice::*; + +pub struct Buffer { + buffer: (raw_ptr, u64, u64), // ptr, capacity, size +} + +impl Buffer { + pub fn new() -> Self { + Buffer { + buffer: __encode_buffer_empty(), + } + } + + fn with_capacity(cap: u64) -> Self { + let ptr = asm(cap: cap) { + aloc cap; + hp: raw_ptr + }; + + Buffer { + buffer: (ptr, cap, 0), + } + } +} + +impl AsRawSlice for Buffer { + fn as_raw_slice(self) -> raw_slice { + __encode_buffer_as_raw_slice(self.buffer) + } +} + +pub struct BufferReader { + ptr: raw_ptr, +} + +impl BufferReader { + pub fn from_parts(ptr: raw_ptr, _len: u64) -> BufferReader { + BufferReader { ptr } + } + + pub fn from_first_parameter() -> BufferReader { + const FIRST_PARAMETER_OFFSET: u64 = 73; + + let ptr = asm() { + fp: raw_ptr + }; + let ptr = ptr.add::(FIRST_PARAMETER_OFFSET); + let ptr = ptr.read::(); + + BufferReader { + ptr: asm(ptr: ptr) { + ptr: raw_ptr + }, + } + } + + pub fn from_second_parameter() -> BufferReader { + const SECOND_PARAMETER_OFFSET: u64 = 74; + + let ptr = asm() { + fp: raw_ptr + }; + let ptr = ptr.add::(SECOND_PARAMETER_OFFSET); + let ptr = ptr.read::(); + + BufferReader { + ptr: asm(ptr: ptr) { + ptr: raw_ptr + }, + } + } + + pub fn from_script_data() -> BufferReader { + let ptr = __gtf::(0, 0xA); // SCRIPT_DATA + let _len = __gtf::(0, 0x4); // SCRIPT_DATA_LEN + BufferReader { ptr } + } + + pub fn from_predicate_data() -> BufferReader { + let predicate_index = asm(r1) { + gm r1 i3; // GET_VERIFYING_PREDICATE + r1: u64 + }; + Self::from_predicate_data_by_index(predicate_index) + } + + pub fn from_predicate_data_by_index(predicate_index: u64) -> BufferReader { + match __gtf::(predicate_index, 0x200) { // GTF_INPUT_TYPE + 0u8 => { + let ptr = __gtf::(predicate_index, 0x20C); // INPUT_COIN_PREDICATE_DATA + let _len = __gtf::(predicate_index, 0x20A); // INPUT_COIN_PREDICATE_DATA_LENGTH + BufferReader { ptr } + }, + 2u8 => { + let ptr = __gtf::(predicate_index, 0x24A); // INPUT_MESSAGE_PREDICATE_DATA + let _len = __gtf::(predicate_index, 0x247); // INPUT_MESSAGE_PREDICATE_DATA_LENGTH + BufferReader { ptr } + }, + _ => __revert(0), + } + } + + pub fn read_8_bytes(ref mut self) -> T { + let v = asm(ptr: self.ptr, val) { + lw val ptr i0; + val: T + }; + self.ptr = __ptr_add::(self.ptr, 8); + v + } + + pub fn read_32_bytes(ref mut self) -> T { + let v = asm(ptr: self.ptr) { + ptr: T + }; + self.ptr = __ptr_add::(self.ptr, 32); + v + } + + pub fn read_bytes(ref mut self, count: u64) -> raw_slice { + let slice = asm(ptr: (self.ptr, count)) { + ptr: raw_slice + }; + self.ptr = __ptr_add::(self.ptr, count); + slice + } + + pub fn read(ref mut self) -> T { + let size = __size_of::(); + + if __is_reference_type::() { + let v = asm(ptr: self.ptr) { + ptr: T + }; + self.ptr = __ptr_add::(self.ptr, size); + v + } else if size == 1 { + let v = asm(ptr: self.ptr, val) { + lb val ptr i0; + val: T + }; + self.ptr = __ptr_add::(self.ptr, 1); + v + } else { + self.read_8_bytes::() + } + } + + pub fn decode(ref mut self) -> T + where + T: AbiDecode, + { + T::abi_decode(self) + } +} + +// Encode + +pub trait AbiEncode { + fn abi_encode(self, buffer: Buffer) -> Buffer; +} + +impl AbiEncode for bool { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +// Encode Numbers + +impl AbiEncode for b256 { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for u256 { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for u64 { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for u32 { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for u16 { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for u8 { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +// Encode str slice and str arrays + +impl AbiEncode for str { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for str[0] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + buffer + } +} + +// BEGIN STRARRAY_ENCODE +impl AbiEncode for str[1] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[2] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[3] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[4] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[5] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[6] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[7] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[8] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[9] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[10] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[11] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[12] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[13] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[14] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[15] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[16] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[17] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[18] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[19] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[20] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[21] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[22] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[23] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[24] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[25] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[26] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[27] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[28] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[29] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[30] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[31] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[32] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[33] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[34] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[35] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[36] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[37] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[38] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[39] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[40] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[41] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[42] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[43] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[44] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[45] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[46] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[47] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[48] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[49] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[50] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[51] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[52] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[53] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[54] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[55] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[56] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[57] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[58] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[59] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[60] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[61] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[62] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[63] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +impl AbiEncode for str[64] { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} +// END STRARRAY_ENCODE + +// Encode Arrays and Slices + +impl AbiEncode for raw_slice { + fn abi_encode(self, buffer: Buffer) -> Buffer { + Buffer { + buffer: __encode_buffer_append(buffer.buffer, self), + } + } +} + +impl AbiEncode for [T; 0] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + buffer + } +} + +// BEGIN ARRAY_ENCODE +impl AbiEncode for [T; 1] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 1 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 2] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 2 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 3] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 3 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 4] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 4 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 5] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 5 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 6] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 6 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 7] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 7 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 8] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 8 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 9] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 9 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 10] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 10 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 11] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 11 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 12] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 12 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 13] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 13 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 14] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 14 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 15] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 15 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 16] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 16 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 17] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 17 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 18] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 18 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 19] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 19 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 20] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 20 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 21] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 21 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 22] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 22 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 23] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 23 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 24] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 24 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 25] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 25 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 26] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 26 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 27] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 27 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 28] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 28 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 29] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 29 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 30] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 30 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 31] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 31 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 32] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 32 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 33] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 33 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 34] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 34 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 35] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 35 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 36] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 36 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 37] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 37 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 38] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 38 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 39] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 39 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 40] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 40 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 41] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 41 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 42] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 42 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 43] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 43 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 44] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 44 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 45] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 45 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 46] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 46 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 47] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 47 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 48] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 48 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 49] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 49 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 50] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 50 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 51] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 51 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 52] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 52 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 53] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 53 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 54] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 54 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 55] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 55 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 56] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 56 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 57] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 57 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 58] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 58 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 59] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 59 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 60] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 60 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 61] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 61 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 62] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 62 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 63] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 63 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +impl AbiEncode for [T; 64] +where + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let mut buffer = buffer; + let mut i = 0; + while i < 64 { + buffer = self[i].abi_encode(buffer); + i += 1; + }; + buffer + } +} +// END ARRAY_ENCODE + +// Encode Tuples + +impl AbiEncode for () { + fn abi_encode(self, buffer: Buffer) -> Buffer { + buffer + } +} + +// BEGIN TUPLES_ENCODE +impl AbiEncode for (A, ) +where + A: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B) +where + A: AbiEncode, + B: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, + U: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + let buffer = self.20.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, + U: AbiEncode, + V: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + let buffer = self.20.abi_encode(buffer); + let buffer = self.21.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, + U: AbiEncode, + V: AbiEncode, + W: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + let buffer = self.20.abi_encode(buffer); + let buffer = self.21.abi_encode(buffer); + let buffer = self.22.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, + U: AbiEncode, + V: AbiEncode, + W: AbiEncode, + X: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + let buffer = self.20.abi_encode(buffer); + let buffer = self.21.abi_encode(buffer); + let buffer = self.22.abi_encode(buffer); + let buffer = self.23.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, + U: AbiEncode, + V: AbiEncode, + W: AbiEncode, + X: AbiEncode, + Y: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + let buffer = self.20.abi_encode(buffer); + let buffer = self.21.abi_encode(buffer); + let buffer = self.22.abi_encode(buffer); + let buffer = self.23.abi_encode(buffer); + let buffer = self.24.abi_encode(buffer); + buffer + } +} +impl AbiEncode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z) +where + A: AbiEncode, + B: AbiEncode, + C: AbiEncode, + D: AbiEncode, + E: AbiEncode, + F: AbiEncode, + G: AbiEncode, + H: AbiEncode, + I: AbiEncode, + J: AbiEncode, + K: AbiEncode, + L: AbiEncode, + M: AbiEncode, + N: AbiEncode, + O: AbiEncode, + P: AbiEncode, + Q: AbiEncode, + R: AbiEncode, + S: AbiEncode, + T: AbiEncode, + U: AbiEncode, + V: AbiEncode, + W: AbiEncode, + X: AbiEncode, + Y: AbiEncode, + Z: AbiEncode, +{ + fn abi_encode(self, buffer: Buffer) -> Buffer { + let buffer = self.0.abi_encode(buffer); + let buffer = self.1.abi_encode(buffer); + let buffer = self.2.abi_encode(buffer); + let buffer = self.3.abi_encode(buffer); + let buffer = self.4.abi_encode(buffer); + let buffer = self.5.abi_encode(buffer); + let buffer = self.6.abi_encode(buffer); + let buffer = self.7.abi_encode(buffer); + let buffer = self.8.abi_encode(buffer); + let buffer = self.9.abi_encode(buffer); + let buffer = self.10.abi_encode(buffer); + let buffer = self.11.abi_encode(buffer); + let buffer = self.12.abi_encode(buffer); + let buffer = self.13.abi_encode(buffer); + let buffer = self.14.abi_encode(buffer); + let buffer = self.15.abi_encode(buffer); + let buffer = self.16.abi_encode(buffer); + let buffer = self.17.abi_encode(buffer); + let buffer = self.18.abi_encode(buffer); + let buffer = self.19.abi_encode(buffer); + let buffer = self.20.abi_encode(buffer); + let buffer = self.21.abi_encode(buffer); + let buffer = self.22.abi_encode(buffer); + let buffer = self.23.abi_encode(buffer); + let buffer = self.24.abi_encode(buffer); + let buffer = self.25.abi_encode(buffer); + buffer + } +} +// END TUPLES_ENCODE + +pub fn encode(item: T) -> raw_slice +where + T: AbiEncode, +{ + let buffer = item.abi_encode(Buffer::new()); + buffer.as_raw_slice() +} + +#[inline(never)] +pub fn abi_decode(data: raw_slice) -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_parts(data.ptr(), data.len::()); + T::abi_decode(buffer) +} + +#[inline(never)] +pub fn abi_decode_in_place(ptr: raw_ptr, len: u64, target: raw_ptr) +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_parts(ptr, len); + let temp = T::abi_decode(buffer); + asm( + target: target, + temp: __addr_of(temp), + size: __size_of::(), + ) { + mcp target temp size; + } +} + +// Decode + +pub trait AbiDecode { + fn abi_decode(ref mut buffer: BufferReader) -> Self; +} + +impl AbiDecode for b256 { + fn abi_decode(ref mut buffer: BufferReader) -> b256 { + buffer.read_32_bytes::() + } +} + +impl AbiDecode for u256 { + fn abi_decode(ref mut buffer: BufferReader) -> u256 { + buffer.read_32_bytes::() + } +} + +impl AbiDecode for u64 { + fn abi_decode(ref mut buffer: BufferReader) -> u64 { + buffer.read_8_bytes::() + } +} + +impl AbiDecode for u32 { + fn abi_decode(ref mut buffer: BufferReader) -> u32 { + use ::primitive_conversions::u8::*; + let a = buffer.read::().as_u32(); + let b = buffer.read::().as_u32(); + let c = buffer.read::().as_u32(); + let d = buffer.read::().as_u32(); + (a << 24) | (b << 16) | (c << 8) | d + } +} + +impl AbiDecode for u16 { + fn abi_decode(ref mut buffer: BufferReader) -> u16 { + use ::primitive_conversions::u8::*; + let a = buffer.read::().as_u16(); + let b = buffer.read::().as_u16(); + (a << 8) | b + } +} + +impl AbiDecode for u8 { + fn abi_decode(ref mut buffer: BufferReader) -> u8 { + buffer.read::() + } +} + +impl AbiDecode for bool { + fn abi_decode(ref mut buffer: BufferReader) -> bool { + match buffer.read::() { + 0 => false, + 1 => true, + _ => __revert(0), + } + } +} + +impl AbiDecode for raw_slice { + fn abi_decode(ref mut buffer: BufferReader) -> raw_slice { + let len = buffer.read_8_bytes::(); + buffer.read_bytes(len) + } +} + +impl AbiDecode for str { + fn abi_decode(ref mut buffer: BufferReader) -> str { + let len = buffer.read_8_bytes::(); + let data = buffer.read_bytes(len); + asm(s: (data.ptr(), len)) { + s: str + } + } +} + +// BEGIN STRARRAY_DECODE +impl AbiDecode for str[1] { + fn abi_decode(ref mut buffer: BufferReader) -> str[1] { + let data = buffer.read_bytes(1); + asm(s: data.ptr()) { + s: str[1] + } + } +} +impl AbiDecode for str[2] { + fn abi_decode(ref mut buffer: BufferReader) -> str[2] { + let data = buffer.read_bytes(2); + asm(s: data.ptr()) { + s: str[2] + } + } +} +impl AbiDecode for str[3] { + fn abi_decode(ref mut buffer: BufferReader) -> str[3] { + let data = buffer.read_bytes(3); + asm(s: data.ptr()) { + s: str[3] + } + } +} +impl AbiDecode for str[4] { + fn abi_decode(ref mut buffer: BufferReader) -> str[4] { + let data = buffer.read_bytes(4); + asm(s: data.ptr()) { + s: str[4] + } + } +} +impl AbiDecode for str[5] { + fn abi_decode(ref mut buffer: BufferReader) -> str[5] { + let data = buffer.read_bytes(5); + asm(s: data.ptr()) { + s: str[5] + } + } +} +impl AbiDecode for str[6] { + fn abi_decode(ref mut buffer: BufferReader) -> str[6] { + let data = buffer.read_bytes(6); + asm(s: data.ptr()) { + s: str[6] + } + } +} +impl AbiDecode for str[7] { + fn abi_decode(ref mut buffer: BufferReader) -> str[7] { + let data = buffer.read_bytes(7); + asm(s: data.ptr()) { + s: str[7] + } + } +} +impl AbiDecode for str[8] { + fn abi_decode(ref mut buffer: BufferReader) -> str[8] { + let data = buffer.read_bytes(8); + asm(s: data.ptr()) { + s: str[8] + } + } +} +impl AbiDecode for str[9] { + fn abi_decode(ref mut buffer: BufferReader) -> str[9] { + let data = buffer.read_bytes(9); + asm(s: data.ptr()) { + s: str[9] + } + } +} +impl AbiDecode for str[10] { + fn abi_decode(ref mut buffer: BufferReader) -> str[10] { + let data = buffer.read_bytes(10); + asm(s: data.ptr()) { + s: str[10] + } + } +} +impl AbiDecode for str[11] { + fn abi_decode(ref mut buffer: BufferReader) -> str[11] { + let data = buffer.read_bytes(11); + asm(s: data.ptr()) { + s: str[11] + } + } +} +impl AbiDecode for str[12] { + fn abi_decode(ref mut buffer: BufferReader) -> str[12] { + let data = buffer.read_bytes(12); + asm(s: data.ptr()) { + s: str[12] + } + } +} +impl AbiDecode for str[13] { + fn abi_decode(ref mut buffer: BufferReader) -> str[13] { + let data = buffer.read_bytes(13); + asm(s: data.ptr()) { + s: str[13] + } + } +} +impl AbiDecode for str[14] { + fn abi_decode(ref mut buffer: BufferReader) -> str[14] { + let data = buffer.read_bytes(14); + asm(s: data.ptr()) { + s: str[14] + } + } +} +impl AbiDecode for str[15] { + fn abi_decode(ref mut buffer: BufferReader) -> str[15] { + let data = buffer.read_bytes(15); + asm(s: data.ptr()) { + s: str[15] + } + } +} +impl AbiDecode for str[16] { + fn abi_decode(ref mut buffer: BufferReader) -> str[16] { + let data = buffer.read_bytes(16); + asm(s: data.ptr()) { + s: str[16] + } + } +} +impl AbiDecode for str[17] { + fn abi_decode(ref mut buffer: BufferReader) -> str[17] { + let data = buffer.read_bytes(17); + asm(s: data.ptr()) { + s: str[17] + } + } +} +impl AbiDecode for str[18] { + fn abi_decode(ref mut buffer: BufferReader) -> str[18] { + let data = buffer.read_bytes(18); + asm(s: data.ptr()) { + s: str[18] + } + } +} +impl AbiDecode for str[19] { + fn abi_decode(ref mut buffer: BufferReader) -> str[19] { + let data = buffer.read_bytes(19); + asm(s: data.ptr()) { + s: str[19] + } + } +} +impl AbiDecode for str[20] { + fn abi_decode(ref mut buffer: BufferReader) -> str[20] { + let data = buffer.read_bytes(20); + asm(s: data.ptr()) { + s: str[20] + } + } +} +impl AbiDecode for str[21] { + fn abi_decode(ref mut buffer: BufferReader) -> str[21] { + let data = buffer.read_bytes(21); + asm(s: data.ptr()) { + s: str[21] + } + } +} +impl AbiDecode for str[22] { + fn abi_decode(ref mut buffer: BufferReader) -> str[22] { + let data = buffer.read_bytes(22); + asm(s: data.ptr()) { + s: str[22] + } + } +} +impl AbiDecode for str[23] { + fn abi_decode(ref mut buffer: BufferReader) -> str[23] { + let data = buffer.read_bytes(23); + asm(s: data.ptr()) { + s: str[23] + } + } +} +impl AbiDecode for str[24] { + fn abi_decode(ref mut buffer: BufferReader) -> str[24] { + let data = buffer.read_bytes(24); + asm(s: data.ptr()) { + s: str[24] + } + } +} +impl AbiDecode for str[25] { + fn abi_decode(ref mut buffer: BufferReader) -> str[25] { + let data = buffer.read_bytes(25); + asm(s: data.ptr()) { + s: str[25] + } + } +} +impl AbiDecode for str[26] { + fn abi_decode(ref mut buffer: BufferReader) -> str[26] { + let data = buffer.read_bytes(26); + asm(s: data.ptr()) { + s: str[26] + } + } +} +impl AbiDecode for str[27] { + fn abi_decode(ref mut buffer: BufferReader) -> str[27] { + let data = buffer.read_bytes(27); + asm(s: data.ptr()) { + s: str[27] + } + } +} +impl AbiDecode for str[28] { + fn abi_decode(ref mut buffer: BufferReader) -> str[28] { + let data = buffer.read_bytes(28); + asm(s: data.ptr()) { + s: str[28] + } + } +} +impl AbiDecode for str[29] { + fn abi_decode(ref mut buffer: BufferReader) -> str[29] { + let data = buffer.read_bytes(29); + asm(s: data.ptr()) { + s: str[29] + } + } +} +impl AbiDecode for str[30] { + fn abi_decode(ref mut buffer: BufferReader) -> str[30] { + let data = buffer.read_bytes(30); + asm(s: data.ptr()) { + s: str[30] + } + } +} +impl AbiDecode for str[31] { + fn abi_decode(ref mut buffer: BufferReader) -> str[31] { + let data = buffer.read_bytes(31); + asm(s: data.ptr()) { + s: str[31] + } + } +} +impl AbiDecode for str[32] { + fn abi_decode(ref mut buffer: BufferReader) -> str[32] { + let data = buffer.read_bytes(32); + asm(s: data.ptr()) { + s: str[32] + } + } +} +impl AbiDecode for str[33] { + fn abi_decode(ref mut buffer: BufferReader) -> str[33] { + let data = buffer.read_bytes(33); + asm(s: data.ptr()) { + s: str[33] + } + } +} +impl AbiDecode for str[34] { + fn abi_decode(ref mut buffer: BufferReader) -> str[34] { + let data = buffer.read_bytes(34); + asm(s: data.ptr()) { + s: str[34] + } + } +} +impl AbiDecode for str[35] { + fn abi_decode(ref mut buffer: BufferReader) -> str[35] { + let data = buffer.read_bytes(35); + asm(s: data.ptr()) { + s: str[35] + } + } +} +impl AbiDecode for str[36] { + fn abi_decode(ref mut buffer: BufferReader) -> str[36] { + let data = buffer.read_bytes(36); + asm(s: data.ptr()) { + s: str[36] + } + } +} +impl AbiDecode for str[37] { + fn abi_decode(ref mut buffer: BufferReader) -> str[37] { + let data = buffer.read_bytes(37); + asm(s: data.ptr()) { + s: str[37] + } + } +} +impl AbiDecode for str[38] { + fn abi_decode(ref mut buffer: BufferReader) -> str[38] { + let data = buffer.read_bytes(38); + asm(s: data.ptr()) { + s: str[38] + } + } +} +impl AbiDecode for str[39] { + fn abi_decode(ref mut buffer: BufferReader) -> str[39] { + let data = buffer.read_bytes(39); + asm(s: data.ptr()) { + s: str[39] + } + } +} +impl AbiDecode for str[40] { + fn abi_decode(ref mut buffer: BufferReader) -> str[40] { + let data = buffer.read_bytes(40); + asm(s: data.ptr()) { + s: str[40] + } + } +} +impl AbiDecode for str[41] { + fn abi_decode(ref mut buffer: BufferReader) -> str[41] { + let data = buffer.read_bytes(41); + asm(s: data.ptr()) { + s: str[41] + } + } +} +impl AbiDecode for str[42] { + fn abi_decode(ref mut buffer: BufferReader) -> str[42] { + let data = buffer.read_bytes(42); + asm(s: data.ptr()) { + s: str[42] + } + } +} +impl AbiDecode for str[43] { + fn abi_decode(ref mut buffer: BufferReader) -> str[43] { + let data = buffer.read_bytes(43); + asm(s: data.ptr()) { + s: str[43] + } + } +} +impl AbiDecode for str[44] { + fn abi_decode(ref mut buffer: BufferReader) -> str[44] { + let data = buffer.read_bytes(44); + asm(s: data.ptr()) { + s: str[44] + } + } +} +impl AbiDecode for str[45] { + fn abi_decode(ref mut buffer: BufferReader) -> str[45] { + let data = buffer.read_bytes(45); + asm(s: data.ptr()) { + s: str[45] + } + } +} +impl AbiDecode for str[46] { + fn abi_decode(ref mut buffer: BufferReader) -> str[46] { + let data = buffer.read_bytes(46); + asm(s: data.ptr()) { + s: str[46] + } + } +} +impl AbiDecode for str[47] { + fn abi_decode(ref mut buffer: BufferReader) -> str[47] { + let data = buffer.read_bytes(47); + asm(s: data.ptr()) { + s: str[47] + } + } +} +impl AbiDecode for str[48] { + fn abi_decode(ref mut buffer: BufferReader) -> str[48] { + let data = buffer.read_bytes(48); + asm(s: data.ptr()) { + s: str[48] + } + } +} +impl AbiDecode for str[49] { + fn abi_decode(ref mut buffer: BufferReader) -> str[49] { + let data = buffer.read_bytes(49); + asm(s: data.ptr()) { + s: str[49] + } + } +} +impl AbiDecode for str[50] { + fn abi_decode(ref mut buffer: BufferReader) -> str[50] { + let data = buffer.read_bytes(50); + asm(s: data.ptr()) { + s: str[50] + } + } +} +impl AbiDecode for str[51] { + fn abi_decode(ref mut buffer: BufferReader) -> str[51] { + let data = buffer.read_bytes(51); + asm(s: data.ptr()) { + s: str[51] + } + } +} +impl AbiDecode for str[52] { + fn abi_decode(ref mut buffer: BufferReader) -> str[52] { + let data = buffer.read_bytes(52); + asm(s: data.ptr()) { + s: str[52] + } + } +} +impl AbiDecode for str[53] { + fn abi_decode(ref mut buffer: BufferReader) -> str[53] { + let data = buffer.read_bytes(53); + asm(s: data.ptr()) { + s: str[53] + } + } +} +impl AbiDecode for str[54] { + fn abi_decode(ref mut buffer: BufferReader) -> str[54] { + let data = buffer.read_bytes(54); + asm(s: data.ptr()) { + s: str[54] + } + } +} +impl AbiDecode for str[55] { + fn abi_decode(ref mut buffer: BufferReader) -> str[55] { + let data = buffer.read_bytes(55); + asm(s: data.ptr()) { + s: str[55] + } + } +} +impl AbiDecode for str[56] { + fn abi_decode(ref mut buffer: BufferReader) -> str[56] { + let data = buffer.read_bytes(56); + asm(s: data.ptr()) { + s: str[56] + } + } +} +impl AbiDecode for str[57] { + fn abi_decode(ref mut buffer: BufferReader) -> str[57] { + let data = buffer.read_bytes(57); + asm(s: data.ptr()) { + s: str[57] + } + } +} +impl AbiDecode for str[58] { + fn abi_decode(ref mut buffer: BufferReader) -> str[58] { + let data = buffer.read_bytes(58); + asm(s: data.ptr()) { + s: str[58] + } + } +} +impl AbiDecode for str[59] { + fn abi_decode(ref mut buffer: BufferReader) -> str[59] { + let data = buffer.read_bytes(59); + asm(s: data.ptr()) { + s: str[59] + } + } +} +impl AbiDecode for str[60] { + fn abi_decode(ref mut buffer: BufferReader) -> str[60] { + let data = buffer.read_bytes(60); + asm(s: data.ptr()) { + s: str[60] + } + } +} +impl AbiDecode for str[61] { + fn abi_decode(ref mut buffer: BufferReader) -> str[61] { + let data = buffer.read_bytes(61); + asm(s: data.ptr()) { + s: str[61] + } + } +} +impl AbiDecode for str[62] { + fn abi_decode(ref mut buffer: BufferReader) -> str[62] { + let data = buffer.read_bytes(62); + asm(s: data.ptr()) { + s: str[62] + } + } +} +impl AbiDecode for str[63] { + fn abi_decode(ref mut buffer: BufferReader) -> str[63] { + let data = buffer.read_bytes(63); + asm(s: data.ptr()) { + s: str[63] + } + } +} +impl AbiDecode for str[64] { + fn abi_decode(ref mut buffer: BufferReader) -> str[64] { + let data = buffer.read_bytes(64); + asm(s: data.ptr()) { + s: str[64] + } + } +} +// END STRARRAY_DECODE + +// BEGIN ARRAY_DECODE +impl AbiDecode for [T; 1] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 1] { + let first: T = buffer.decode::(); + let mut array = [first; 1]; + let mut i = 1; + while i < 1 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 2] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 2] { + let first: T = buffer.decode::(); + let mut array = [first; 2]; + let mut i = 1; + while i < 2 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 3] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 3] { + let first: T = buffer.decode::(); + let mut array = [first; 3]; + let mut i = 1; + while i < 3 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 4] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 4] { + let first: T = buffer.decode::(); + let mut array = [first; 4]; + let mut i = 1; + while i < 4 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 5] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 5] { + let first: T = buffer.decode::(); + let mut array = [first; 5]; + let mut i = 1; + while i < 5 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 6] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 6] { + let first: T = buffer.decode::(); + let mut array = [first; 6]; + let mut i = 1; + while i < 6 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 7] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 7] { + let first: T = buffer.decode::(); + let mut array = [first; 7]; + let mut i = 1; + while i < 7 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 8] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 8] { + let first: T = buffer.decode::(); + let mut array = [first; 8]; + let mut i = 1; + while i < 8 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 9] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 9] { + let first: T = buffer.decode::(); + let mut array = [first; 9]; + let mut i = 1; + while i < 9 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 10] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 10] { + let first: T = buffer.decode::(); + let mut array = [first; 10]; + let mut i = 1; + while i < 10 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 11] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 11] { + let first: T = buffer.decode::(); + let mut array = [first; 11]; + let mut i = 1; + while i < 11 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 12] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 12] { + let first: T = buffer.decode::(); + let mut array = [first; 12]; + let mut i = 1; + while i < 12 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 13] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 13] { + let first: T = buffer.decode::(); + let mut array = [first; 13]; + let mut i = 1; + while i < 13 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 14] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 14] { + let first: T = buffer.decode::(); + let mut array = [first; 14]; + let mut i = 1; + while i < 14 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 15] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 15] { + let first: T = buffer.decode::(); + let mut array = [first; 15]; + let mut i = 1; + while i < 15 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 16] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 16] { + let first: T = buffer.decode::(); + let mut array = [first; 16]; + let mut i = 1; + while i < 16 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 17] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 17] { + let first: T = buffer.decode::(); + let mut array = [first; 17]; + let mut i = 1; + while i < 17 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 18] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 18] { + let first: T = buffer.decode::(); + let mut array = [first; 18]; + let mut i = 1; + while i < 18 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 19] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 19] { + let first: T = buffer.decode::(); + let mut array = [first; 19]; + let mut i = 1; + while i < 19 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 20] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 20] { + let first: T = buffer.decode::(); + let mut array = [first; 20]; + let mut i = 1; + while i < 20 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 21] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 21] { + let first: T = buffer.decode::(); + let mut array = [first; 21]; + let mut i = 1; + while i < 21 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 22] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 22] { + let first: T = buffer.decode::(); + let mut array = [first; 22]; + let mut i = 1; + while i < 22 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 23] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 23] { + let first: T = buffer.decode::(); + let mut array = [first; 23]; + let mut i = 1; + while i < 23 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 24] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 24] { + let first: T = buffer.decode::(); + let mut array = [first; 24]; + let mut i = 1; + while i < 24 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 25] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 25] { + let first: T = buffer.decode::(); + let mut array = [first; 25]; + let mut i = 1; + while i < 25 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 26] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 26] { + let first: T = buffer.decode::(); + let mut array = [first; 26]; + let mut i = 1; + while i < 26 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 27] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 27] { + let first: T = buffer.decode::(); + let mut array = [first; 27]; + let mut i = 1; + while i < 27 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 28] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 28] { + let first: T = buffer.decode::(); + let mut array = [first; 28]; + let mut i = 1; + while i < 28 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 29] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 29] { + let first: T = buffer.decode::(); + let mut array = [first; 29]; + let mut i = 1; + while i < 29 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 30] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 30] { + let first: T = buffer.decode::(); + let mut array = [first; 30]; + let mut i = 1; + while i < 30 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 31] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 31] { + let first: T = buffer.decode::(); + let mut array = [first; 31]; + let mut i = 1; + while i < 31 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 32] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 32] { + let first: T = buffer.decode::(); + let mut array = [first; 32]; + let mut i = 1; + while i < 32 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 33] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 33] { + let first: T = buffer.decode::(); + let mut array = [first; 33]; + let mut i = 1; + while i < 33 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 34] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 34] { + let first: T = buffer.decode::(); + let mut array = [first; 34]; + let mut i = 1; + while i < 34 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 35] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 35] { + let first: T = buffer.decode::(); + let mut array = [first; 35]; + let mut i = 1; + while i < 35 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 36] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 36] { + let first: T = buffer.decode::(); + let mut array = [first; 36]; + let mut i = 1; + while i < 36 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 37] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 37] { + let first: T = buffer.decode::(); + let mut array = [first; 37]; + let mut i = 1; + while i < 37 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 38] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 38] { + let first: T = buffer.decode::(); + let mut array = [first; 38]; + let mut i = 1; + while i < 38 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 39] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 39] { + let first: T = buffer.decode::(); + let mut array = [first; 39]; + let mut i = 1; + while i < 39 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 40] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 40] { + let first: T = buffer.decode::(); + let mut array = [first; 40]; + let mut i = 1; + while i < 40 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 41] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 41] { + let first: T = buffer.decode::(); + let mut array = [first; 41]; + let mut i = 1; + while i < 41 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 42] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 42] { + let first: T = buffer.decode::(); + let mut array = [first; 42]; + let mut i = 1; + while i < 42 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 43] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 43] { + let first: T = buffer.decode::(); + let mut array = [first; 43]; + let mut i = 1; + while i < 43 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 44] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 44] { + let first: T = buffer.decode::(); + let mut array = [first; 44]; + let mut i = 1; + while i < 44 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 45] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 45] { + let first: T = buffer.decode::(); + let mut array = [first; 45]; + let mut i = 1; + while i < 45 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 46] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 46] { + let first: T = buffer.decode::(); + let mut array = [first; 46]; + let mut i = 1; + while i < 46 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 47] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 47] { + let first: T = buffer.decode::(); + let mut array = [first; 47]; + let mut i = 1; + while i < 47 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 48] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 48] { + let first: T = buffer.decode::(); + let mut array = [first; 48]; + let mut i = 1; + while i < 48 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 49] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 49] { + let first: T = buffer.decode::(); + let mut array = [first; 49]; + let mut i = 1; + while i < 49 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 50] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 50] { + let first: T = buffer.decode::(); + let mut array = [first; 50]; + let mut i = 1; + while i < 50 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 51] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 51] { + let first: T = buffer.decode::(); + let mut array = [first; 51]; + let mut i = 1; + while i < 51 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 52] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 52] { + let first: T = buffer.decode::(); + let mut array = [first; 52]; + let mut i = 1; + while i < 52 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 53] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 53] { + let first: T = buffer.decode::(); + let mut array = [first; 53]; + let mut i = 1; + while i < 53 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 54] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 54] { + let first: T = buffer.decode::(); + let mut array = [first; 54]; + let mut i = 1; + while i < 54 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 55] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 55] { + let first: T = buffer.decode::(); + let mut array = [first; 55]; + let mut i = 1; + while i < 55 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 56] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 56] { + let first: T = buffer.decode::(); + let mut array = [first; 56]; + let mut i = 1; + while i < 56 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 57] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 57] { + let first: T = buffer.decode::(); + let mut array = [first; 57]; + let mut i = 1; + while i < 57 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 58] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 58] { + let first: T = buffer.decode::(); + let mut array = [first; 58]; + let mut i = 1; + while i < 58 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 59] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 59] { + let first: T = buffer.decode::(); + let mut array = [first; 59]; + let mut i = 1; + while i < 59 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 60] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 60] { + let first: T = buffer.decode::(); + let mut array = [first; 60]; + let mut i = 1; + while i < 60 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 61] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 61] { + let first: T = buffer.decode::(); + let mut array = [first; 61]; + let mut i = 1; + while i < 61 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 62] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 62] { + let first: T = buffer.decode::(); + let mut array = [first; 62]; + let mut i = 1; + while i < 62 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 63] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 63] { + let first: T = buffer.decode::(); + let mut array = [first; 63]; + let mut i = 1; + while i < 63 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +impl AbiDecode for [T; 64] +where + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> [T; 64] { + let first: T = buffer.decode::(); + let mut array = [first; 64]; + let mut i = 1; + while i < 64 { + array[i] = buffer.decode::(); + i += 1; + }; + array + } +} +// END ARRAY_DECODE + +impl AbiDecode for () { + fn abi_decode(ref mut _buffer: BufferReader) -> () { + () + } +} + +// BEGIN TUPLES_DECODE +impl AbiDecode for (A, ) +where + A: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + (A::abi_decode(buffer), ) + } +} +impl AbiDecode for (A, B) +where + A: AbiDecode, + B: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + (A::abi_decode(buffer), B::abi_decode(buffer)) + } +} +impl AbiDecode for (A, B, C) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + (A::abi_decode(buffer), B::abi_decode(buffer), C::abi_decode(buffer)) + } +} +impl AbiDecode for (A, B, C, D) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, + U: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + U::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, + U: AbiDecode, + V: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + U::abi_decode(buffer), + V::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, + U: AbiDecode, + V: AbiDecode, + W: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + U::abi_decode(buffer), + V::abi_decode(buffer), + W::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, + U: AbiDecode, + V: AbiDecode, + W: AbiDecode, + X: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + U::abi_decode(buffer), + V::abi_decode(buffer), + W::abi_decode(buffer), + X::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, + U: AbiDecode, + V: AbiDecode, + W: AbiDecode, + X: AbiDecode, + Y: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + U::abi_decode(buffer), + V::abi_decode(buffer), + W::abi_decode(buffer), + X::abi_decode(buffer), + Y::abi_decode(buffer), + ) + } +} +impl AbiDecode for (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z) +where + A: AbiDecode, + B: AbiDecode, + C: AbiDecode, + D: AbiDecode, + E: AbiDecode, + F: AbiDecode, + G: AbiDecode, + H: AbiDecode, + I: AbiDecode, + J: AbiDecode, + K: AbiDecode, + L: AbiDecode, + M: AbiDecode, + N: AbiDecode, + O: AbiDecode, + P: AbiDecode, + Q: AbiDecode, + R: AbiDecode, + S: AbiDecode, + T: AbiDecode, + U: AbiDecode, + V: AbiDecode, + W: AbiDecode, + X: AbiDecode, + Y: AbiDecode, + Z: AbiDecode, +{ + fn abi_decode(ref mut buffer: BufferReader) -> Self { + ( + A::abi_decode(buffer), + B::abi_decode(buffer), + C::abi_decode(buffer), + D::abi_decode(buffer), + E::abi_decode(buffer), + F::abi_decode(buffer), + G::abi_decode(buffer), + H::abi_decode(buffer), + I::abi_decode(buffer), + J::abi_decode(buffer), + K::abi_decode(buffer), + L::abi_decode(buffer), + M::abi_decode(buffer), + N::abi_decode(buffer), + O::abi_decode(buffer), + P::abi_decode(buffer), + Q::abi_decode(buffer), + R::abi_decode(buffer), + S::abi_decode(buffer), + T::abi_decode(buffer), + U::abi_decode(buffer), + V::abi_decode(buffer), + W::abi_decode(buffer), + X::abi_decode(buffer), + Y::abi_decode(buffer), + Z::abi_decode(buffer), + ) + } +} +// END TUPLES_DECODE +use ::ops::*; + +pub fn contract_call( + contract_id: b256, + method_name: str, + args: TArgs, + coins: u64, + asset_id: b256, + gas: u64, +) -> T +where + T: AbiDecode, + TArgs: AbiEncode, +{ + let first_parameter = encode(method_name); + let second_parameter = encode(args); + let params = encode(( + contract_id, + asm(a: first_parameter.ptr()) { + a: u64 + }, + asm(a: second_parameter.ptr()) { + a: u64 + }, + )); + + __contract_call(params.ptr(), coins, asset_id, gas); + let ptr = asm() { + ret: raw_ptr + }; + let len = asm() { + retl: u64 + }; + + let mut buffer = BufferReader::from_parts(ptr, len); + T::abi_decode(buffer) +} + +pub fn decode_script_data() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_script_data(); + T::abi_decode(buffer) +} + +pub fn decode_predicate_data() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_predicate_data(); + T::abi_decode(buffer) +} + +pub fn decode_predicate_data_by_index(index: u64) -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_predicate_data_by_index(index); + T::abi_decode(buffer) +} + +pub fn decode_first_param() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_first_parameter(); + T::abi_decode(buffer) +} + +pub fn decode_second_param() -> T +where + T: AbiDecode, +{ + let mut buffer = BufferReader::from_second_parameter(); + T::abi_decode(buffer) +} + +// Tests + + +fn assert_encoding(value: T, expected: SLICE) +where + T: AbiEncode, +{ + let len = __size_of::(); + + if len == 0 { + __revert(0); + } + + let expected = raw_slice::from_parts::(__addr_of(expected), len); + let actual = encode(value); + + if actual.len::() != expected.len::() { + __revert(0); + } + + let result = asm( + result, + expected: expected.ptr(), + actual: actual.ptr(), + len: len, + ) { + meq result expected actual len; + result: bool + }; + + if !result { + __revert(0); + } +} + +fn assert_encoding_and_decoding( + value: T, + expected: SLICE, +) +where + T: Eq + AbiEncode + AbiDecode, +{ + let len = __size_of::(); + + if len == 0 { + __revert(0); + } + + let expected = raw_slice::from_parts::(__addr_of(expected), len); + let actual = encode(value); + + if actual.len::() != expected.len::() { + __revert(0); + } + + let result = asm( + result, + expected: expected.ptr(), + actual: actual.ptr(), + len: len, + ) { + meq result expected actual len; + result: bool + }; + + if !result { + __revert(0); + } + + let decoded = abi_decode::(actual); + __log(decoded); + if !decoded.eq(value) { + __revert(0); + } +} + +fn to_slice(array: T) -> raw_slice { + let len = __size_of::(); + raw_slice::from_parts::(__addr_of(array), len) +} + +fn assert_ge(a: T, b: T, revert_code: u64) +where + T: Ord, +{ + if a.lt(b) { + __revert(revert_code) + } +} + +fn assert_eq(a: T, b: T, revert_code: u64) +where + T: Eq, +{ + if a != b { + __revert(revert_code) + } +} + +fn assert_neq(a: T, b: T, revert_code: u64) +where + T: Eq, +{ + if a == b { + __revert(revert_code) + } +} + +fn assert_no_write_after_buffer(value_to_append: T, size_of_t: u64) +where + T: AbiEncode, +{ + // This red zone should not be overwritten + let red_zone1 = asm(size: 1024) { + aloc size; + hp: raw_ptr + }; + red_zone1.write(0xFFFFFFFFFFFFFFFF); + + // Create encoding buffer with capacity for one item + let mut buffer = Buffer::with_capacity(size_of_t); + let ptr1 = buffer.buffer.0; + + // Append one item + let buffer = value_to_append.abi_encode(buffer); + assert_eq(ptr1, buffer.buffer.0, 1); // no buffer grow is expected + assert_eq(buffer.buffer.1, size_of_t, 2); // capacity must be still be one item + assert_eq(buffer.buffer.2, size_of_t, 3); // buffer has one item + + // This red zone should not be overwritten + let red_zone2 = asm(size: 1024) { + aloc size; + hp: raw_ptr + }; + red_zone2.write(0xFFFFFFFFFFFFFFFF); + + // Append another item + let buffer = value_to_append.abi_encode(buffer); + assert_neq(ptr1, buffer.buffer.0, 4); // must have allocated new buffer + assert_ge(buffer.buffer.1, size_of_t * 2, 5); // capacity for at least two items + assert_eq(buffer.buffer.2, size_of_t * 2, 6); // buffer has two items + + // Check that red zones were not overwritten + assert_eq(red_zone1.read::(), 0xFFFFFFFFFFFFFFFF, 7); + assert_eq(red_zone2.read::(), 0xFFFFFFFFFFFFFFFF, 8); +} + +#[test] +fn ok_encoding_should_not_write_outside_buffer() { + assert_no_write_after_buffer::(true, 1); + + // numbers + assert_no_write_after_buffer::(1, 1); + assert_no_write_after_buffer::(1, 2); + assert_no_write_after_buffer::(1, 4); + assert_no_write_after_buffer::(1, 8); + assert_no_write_after_buffer::( + 0x0000000000000000000000000000000000000000000000000000000000000001u256, + 32, + ); + assert_no_write_after_buffer::( + 0x0000000000000000000000000000000000000000000000000000000000000001, + 32, + ); + + // arrays + assert_no_write_after_buffer::<[u8; 1]>([1], 1); + assert_no_write_after_buffer::<[u8; 2]>([1, 1], 2); + assert_no_write_after_buffer::<[u8; 3]>([1, 1, 1], 3); + assert_no_write_after_buffer::<[u8; 4]>([1, 1, 1, 1], 4); + assert_no_write_after_buffer::<[u8; 5]>([1, 1, 1, 1, 1], 5); + + // string arrays + assert_no_write_after_buffer::(__to_str_array("h"), 1); + assert_no_write_after_buffer::(__to_str_array("he"), 2); + assert_no_write_after_buffer::(__to_str_array("hello world"), 11); + + // string slices + assert_no_write_after_buffer::("h", 9); + assert_no_write_after_buffer::("he", 10); + assert_no_write_after_buffer::("hello world", 19); +} + +#[test] +fn ok_abi_encoding() { + // bool + assert_encoding_and_decoding(false, [0u8]); + assert_encoding_and_decoding(true, [1u8]); + + // numbers + assert_encoding_and_decoding(0u8, [0u8]); + assert_encoding_and_decoding(255u8, [255u8]); + + assert_encoding_and_decoding(0u16, [0u8, 0u8]); + assert_encoding_and_decoding(128u16, [0u8, 128u8]); + assert_encoding_and_decoding(65535u16, [255u8, 255u8]); + + assert_encoding_and_decoding(0u32, [0u8, 0u8, 0u8, 0u8]); + assert_encoding_and_decoding(128u32, [0u8, 0u8, 0u8, 128u8]); + assert_encoding_and_decoding(4294967295u32, [255u8, 255u8, 255u8, 255u8]); + + assert_encoding_and_decoding(0u64, [0u8; 8]); + assert_encoding_and_decoding(128u64, [0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 128u8]); + assert_encoding_and_decoding(18446744073709551615u64, [255u8; 8]); + + assert_encoding_and_decoding( + 0x0000000000000000000000000000000000000000000000000000000000000000u256, + [0u8; 32], + ); + assert_encoding_and_decoding( + 0xAA000000000000000000000000000000000000000000000000000000000000BBu256, + [ + 0xAAu8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0xBBu8, + ], + ); + assert_encoding_and_decoding( + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu256, + [255u8; 32], + ); + + assert_encoding_and_decoding( + 0x0000000000000000000000000000000000000000000000000000000000000000, + [0u8; 32], + ); + assert_encoding_and_decoding( + 0xAA000000000000000000000000000000000000000000000000000000000000BB, + [ + 0xAAu8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0xBBu8, + ], + ); + assert_encoding_and_decoding( + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + [255u8; 32], + ); + + // strings + assert_encoding_and_decoding( + "Hello", + [0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 5u8, 72u8, 101u8, 108u8, 108u8, 111u8], + ); + + assert_encoding( + { + let a: str[1] = __to_str_array("a"); + a + }, + [97u8], + ); + assert_encoding( + { + let a: str[2] = __to_str_array("aa"); + a + }, + [97u8, 97u8], + ); + assert_encoding( + { + let a: str[3] = __to_str_array("aaa"); + a + }, + [97u8, 97u8, 97u8], + ); + assert_encoding( + { + let a: str[4] = __to_str_array("aaaa"); + a + }, + [97u8, 97u8, 97u8, 97u8], + ); + assert_encoding( + { + let a: str[5] = __to_str_array("aaaaa"); + a + }, + [97u8, 97u8, 97u8, 97u8, 97u8], + ); + + // arrays + assert_encoding([255u8; 1], [255u8; 1]); + assert_encoding([255u8; 2], [255u8; 2]); + assert_encoding([255u8; 3], [255u8; 3]); + assert_encoding([255u8; 4], [255u8; 4]); + assert_encoding([255u8; 5], [255u8; 5]); + + let array = abi_decode::<[u8; 1]>(to_slice([255u8])); + assert_eq(array[0], 255u8, 0); + + let array = abi_decode::<[u8; 2]>(to_slice([255u8, 254u8])); + assert_eq(array[0], 255u8, 0); + assert_eq(array[1], 254u8, 0); +} + +#[test(should_revert)] +fn nok_abi_encoding_invalid_bool() { + let actual = encode(2u8); + let _ = abi_decode::(actual); +} From 0d244856ce271e98e3f6b81feae32e535e5198f1 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 12:48:54 +0530 Subject: [PATCH 04/29] remove uses of core::codec in std lib --- sway-lib-std/src/call_frames.sw | 4 ++-- sway-lib-std/src/identity.sw | 2 +- sway-lib-std/src/inputs.sw | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sway-lib-std/src/call_frames.sw b/sway-lib-std/src/call_frames.sw index 21b009659c3..659e9dbbc81 100644 --- a/sway-lib-std/src/call_frames.sw +++ b/sway-lib-std/src/call_frames.sw @@ -122,7 +122,7 @@ pub fn second_param() -> u64 { /// Get the called method name from the current call frame. pub fn called_method() -> str { - use core::codec::decode_first_param; + use ::codec::decode_first_param; decode_first_param::() } @@ -131,7 +131,7 @@ pub fn called_args() -> T where T: AbiDecode, { - use core::codec::decode_second_param; + use ::codec::decode_second_param; decode_second_param::() } diff --git a/sway-lib-std/src/identity.sw b/sway-lib-std/src/identity.sw index 7c3b06bf5e9..33aeef4d207 100644 --- a/sway-lib-std/src/identity.sw +++ b/sway-lib-std/src/identity.sw @@ -2,7 +2,7 @@ //! The use of this type allows for handling interactions with contracts and addresses in a unified manner. library; -use core::codec::*; +use ::codec::*; use ::assert::assert; use ::address::Address; use ::alias::SubId; diff --git a/sway-lib-std/src/inputs.sw b/sway-lib-std/src/inputs.sw index f4db2869bb2..ccd7ba774bd 100644 --- a/sway-lib-std/src/inputs.sw +++ b/sway-lib-std/src/inputs.sw @@ -281,8 +281,8 @@ where T: AbiDecode, { match input_type(index) { - Some(Input::Coin) => Some(core::codec::decode_predicate_data_by_index::(index)), - Some(Input::Message) => Some(core::codec::decode_predicate_data_by_index::(index)), + Some(Input::Coin) => Some(::codec::decode_predicate_data_by_index::(index)), + Some(Input::Message) => Some(::codec::decode_predicate_data_by_index::(index)), _ => None, } } From 29c1b407322332dcd122d7894ec99a4913e131a0 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 12:53:06 +0530 Subject: [PATCH 05/29] add codec to lib.sw --- sway-lib-std/src/lib.sw | 1 + 1 file changed, 1 insertion(+) diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index ad4a21eb2a3..acfe72dbcb3 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -2,6 +2,7 @@ library; pub mod raw_ptr; pub mod raw_slice; +pub mod codec; pub mod constants; pub mod error_signals; pub mod logging; From 6a143004ba649960ae96c928642193f47836057d Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:01:39 +0530 Subject: [PATCH 06/29] change order of libs in lib.sw --- sway-lib-std/src/lib.sw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index acfe72dbcb3..8e2e4a51e69 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -2,7 +2,6 @@ library; pub mod raw_ptr; pub mod raw_slice; -pub mod codec; pub mod constants; pub mod error_signals; pub mod logging; @@ -22,6 +21,7 @@ pub mod math; pub mod u128; pub mod b512; pub mod primitive_conversions; +pub mod codec; pub mod alias; pub mod hash; pub mod asset_id; From f954429880f696508ba8db995a565226472ee595 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:09:10 +0530 Subject: [PATCH 07/29] move slice, ops, primitves --- sway-lib-core/src/ops.sw | 1431 ------------------------ sway-lib-core/src/primitives.sw | 450 -------- sway-lib-core/src/slice.sw | 18 - sway-lib-std/src/address.sw | 2 +- sway-lib-std/src/asset_id.sw | 2 +- sway-lib-std/src/b512.sw | 2 +- sway-lib-std/src/bytes.sw | 2 +- sway-lib-std/src/contract_id.sw | 2 +- sway-lib-std/src/identity.sw | 2 +- sway-lib-std/src/inputs.sw | 2 +- sway-lib-std/src/lib.sw | 3 + sway-lib-std/src/ops.sw | 1413 +++++++++++++++++++++++ sway-lib-std/src/option.sw | 2 +- sway-lib-std/src/outputs.sw | 2 +- sway-lib-std/src/primitives.sw | 451 ++++++++ sway-lib-std/src/raw_ptr.sw | 2 +- sway-lib-std/src/slice.sw | 19 + sway-lib-std/src/tx.sw | 2 +- sway-lib-std/src/u128.sw | 24 +- sway-lib-std/src/vm/evm/evm_address.sw | 2 +- 20 files changed, 1910 insertions(+), 1923 deletions(-) create mode 100644 sway-lib-std/src/ops.sw create mode 100644 sway-lib-std/src/primitives.sw create mode 100644 sway-lib-std/src/slice.sw diff --git a/sway-lib-core/src/ops.sw b/sway-lib-core/src/ops.sw index c49147bccae..316a905aa9b 100644 --- a/sway-lib-core/src/ops.sw +++ b/sway-lib-core/src/ops.sw @@ -1,1432 +1 @@ library; - -use ::primitives::*; -use ::slice::*; - -/// Trait for the addition of two values. -pub trait Add { - /// Add two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value to add to self. - /// - /// # Returns - /// - /// * [Self] - The result of the two values added. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Add for MyStruct { - /// fn add(self, other: Self) -> Self { - /// let val = self.val + other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 1 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result_struct = struct1 + struct2; - /// assert(result_struct.val == 3); - /// } - /// ``` - fn add(self, other: Self) -> Self; -} - -impl Add for u256 { - fn add(self, other: Self) -> Self { - __add(self, other) - } -} - -impl Add for u64 { - fn add(self, other: Self) -> Self { - __add(self, other) - } -} - -// Emulate overflowing arithmetic for non-64-bit integer types -impl Add for u32 { - fn add(self, other: Self) -> Self { - // any non-64-bit value is compiled to a u64 value under-the-hood - // constants (like Self::max() below) are also automatically promoted to u64 - let res = __add(self, other); - // integer overflow - if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { - __revert(0) - } else { - // overflow enabled - // res % (Self::max() + 1) - __mod(res, __add(Self::max(), 1)) - } - } else { - // no overflow - res - } - } -} - -impl Add for u16 { - fn add(self, other: Self) -> Self { - let res = __add(self, other); - if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { - __revert(0) - } else { - // overflow enabled - // res % (Self::max() + 1) - __mod(res, __add(Self::max(), 1)) - } - } else { - res - } - } -} - -impl Add for u8 { - fn add(self, other: Self) -> Self { - let self_u64 = asm(input: self) { - input: u64 - }; - let other_u64 = asm(input: other) { - input: u64 - }; - let res_u64 = __add(self_u64, other_u64); - let max_u8_u64 = asm(input: Self::max()) { - input: u64 - }; - if __gt(res_u64, max_u8_u64) { - if panic_on_overflow_is_enabled() { - __revert(0) - } else { - // overflow enabled - // res % (Self::max() + 1) - let res_u64 = __mod(res_u64, __add(max_u8_u64, 1)); - asm(input: res_u64) { - input: u8 - } - } - } else { - asm(input: res_u64) { - input: u8 - } - } - } -} - -/// Trait for the subtraction of two values. -pub trait Subtract { - /// Subtract two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value to subtract from self. - /// - /// # Returns - /// - /// * [Self] - The result of the two values subtracted. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Subtract for MyStruct { - /// fn subtract(self, other: Self) -> Self { - /// let val = self.val - other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 3 }; - /// let struct2 = MyStruct { val: 1 }; - /// let result_struct = struct1 - struct2; - /// assert(result_struct.val == 2); - /// } - /// ``` - fn subtract(self, other: Self) -> Self; -} - -impl Subtract for u256 { - fn subtract(self, other: Self) -> Self { - __sub(self, other) - } -} - -impl Subtract for u64 { - fn subtract(self, other: Self) -> Self { - __sub(self, other) - } -} - -// unlike addition, underflowing subtraction does not need special treatment -// because VM handles underflow -impl Subtract for u32 { - fn subtract(self, other: Self) -> Self { - __sub(self, other) - } -} - -impl Subtract for u16 { - fn subtract(self, other: Self) -> Self { - __sub(self, other) - } -} - -impl Subtract for u8 { - fn subtract(self, other: Self) -> Self { - __sub(self, other) - } -} - -/// Trait for the multiplication of two values. -pub trait Multiply { - /// Multiply two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value to multiply with self. - /// - /// # Returns - /// - /// * [Self] - The result of the two values multiplied. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Multiply for MyStruct { - /// fn multiply(self, other: Self) -> Self { - /// let val = self.val * other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 3 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result_struct = struct1 * struct2; - /// assert(result_struct.val == 6); - /// } - /// ``` - fn multiply(self, other: Self) -> Self; -} - -impl Multiply for u256 { - fn multiply(self, other: Self) -> Self { - __mul(self, other) - } -} - -impl Multiply for u64 { - fn multiply(self, other: Self) -> Self { - __mul(self, other) - } -} - -// Emulate overflowing arithmetic for non-64-bit integer types -impl Multiply for u32 { - fn multiply(self, other: Self) -> Self { - // any non-64-bit value is compiled to a u64 value under-the-hood - // constants (like Self::max() below) are also automatically promoted to u64 - let res = __mul(self, other); - if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { - // integer overflow - __revert(0) - } else { - // overflow enabled - // res % (Self::max() + 1) - __mod(res, __add(Self::max(), 1)) - } - } else { - // no overflow - res - } - } -} - -impl Multiply for u16 { - fn multiply(self, other: Self) -> Self { - let res = __mul(self, other); - if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { - __revert(0) - } else { - __mod(res, __add(Self::max(), 1)) - } - } else { - res - } - } -} - -impl Multiply for u8 { - fn multiply(self, other: Self) -> Self { - let self_u64 = asm(input: self) { - input: u64 - }; - let other_u64 = asm(input: other) { - input: u64 - }; - let res_u64 = __mul(self_u64, other_u64); - let max_u8_u64 = asm(input: Self::max()) { - input: u64 - }; - if __gt(res_u64, max_u8_u64) { - if panic_on_overflow_is_enabled() { - __revert(0) - } else { - // overflow enabled - // res % (Self::max() + 1) - let res_u64 = __mod(res_u64, __add(max_u8_u64, 1)); - asm(input: res_u64) { - input: u8 - } - } - } else { - asm(input: res_u64) { - input: u8 - } - } - } -} - -/// Trait for the division of two values. -pub trait Divide { - /// Divide two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value to divide with self. - /// - /// # Returns - /// - /// * [Self] - The result of the two values divided. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Divide for MyStruct { - /// fn divide(self, other: Self) -> Self { - /// let val = self.val / other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result_struct = struct1 / struct2; - /// assert(result_struct.val == 5); - /// } - /// ``` - fn divide(self, other: Self) -> Self; -} - -impl Divide for u256 { - fn divide(self, other: Self) -> Self { - __div(self, other) - } -} - -impl Divide for u64 { - fn divide(self, other: Self) -> Self { - __div(self, other) - } -} - -// division for unsigned integers cannot overflow, -// but if signed integers are ever introduced, -// overflow needs to be handled, since -// Self::max() / -1 overflows -impl Divide for u32 { - fn divide(self, other: Self) -> Self { - __div(self, other) - } -} - -impl Divide for u16 { - fn divide(self, other: Self) -> Self { - __div(self, other) - } -} - -impl Divide for u8 { - fn divide(self, other: Self) -> Self { - __div(self, other) - } -} - -/// Trait for the modulo of two values. -pub trait Mod { - /// Modulo two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value to mod with self. - /// - /// # Returns - /// - /// * [Self] - The modulo of the two values. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Mod for MyStruct { - /// fn modulo(self, other: Self) -> Self { - /// let val = self.val % other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result_struct = struct1 % struct2; - /// assert(result_struct.val == 0); - /// } - /// ``` - fn modulo(self, other: Self) -> Self; -} - -impl Mod for u256 { - fn modulo(self, other: Self) -> Self { - __mod(self, other) - } -} - -impl Mod for u64 { - fn modulo(self, other: Self) -> Self { - __mod(self, other) - } -} - -impl Mod for u32 { - fn modulo(self, other: Self) -> Self { - __mod(self, other) - } -} - -impl Mod for u16 { - fn modulo(self, other: Self) -> Self { - __mod(self, other) - } -} - -impl Mod for u8 { - fn modulo(self, other: Self) -> Self { - __mod(self, other) - } -} - -/// Trait to invert a type. -pub trait Not { - /// Inverts the value of the type. - /// - /// # Returns - /// - /// * [Self] - The result of the inverse. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: bool, - /// } - /// - /// impl Not for MyStruct { - /// fn not(self) -> Self { - /// Self { - /// val: !self.val, - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct = MyStruct { val: true }; - /// let result_struct = !struct; - /// assert(!result_struct.val); - /// } - /// ``` - fn not(self) -> Self; -} - -impl Not for bool { - fn not(self) -> Self { - __eq(self, false) - } -} - -impl Not for u256 { - fn not(self) -> Self { - __not(self) - } -} - -impl Not for b256 { - fn not(self) -> Self { - __not(self) - } -} - -impl Not for u64 { - fn not(self) -> Self { - __not(self) - } -} - -impl Not for u32 { - fn not(self) -> Self { - let v = __not(self); - __and(v, u32::max()) - } -} - -impl Not for u16 { - fn not(self) -> Self { - let v = __not(self); - __and(v, u16::max()) - } -} - -impl Not for u8 { - fn not(self) -> Self { - let v = __not(self); - __and(v, u8::max()) - } -} - -/// Trait to evaluate if two types are equal. -pub trait Eq { - /// Evaluates if two values of the same type are equal. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [bool] - `true` if the values are equal, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Eq for MyStruct { - /// fn eq(self, other: Self) -> bool { - /// self.val == other.val - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 2 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result = struct1 == struct2; - /// assert(result); - /// } - /// ``` - fn eq(self, other: Self) -> bool; -} { - /// Evaluates if two values of the same type are not equal. - /// - /// # Additional Information - /// - /// This function is inherited when `eq()` is implemented. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [bool] - `true` if the two values are not equal, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Eq for MyStruct { - /// fn eq(self, other: Self) -> bool { - /// self.val == other.val - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result = struct1 != struct2; - /// assert(result); - /// } - /// ``` - fn neq(self, other: Self) -> bool { - (self.eq(other)).not() - } -} - -impl Eq for bool { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for u256 { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for b256 { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for u64 { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for u32 { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for u16 { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for u8 { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -impl Eq for raw_ptr { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} - -/// Trait to evaluate if one value is greater or less than another of the same type. -pub trait Ord { - /// Evaluates if one value of the same type is greater than another. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [bool] - `true` if `self` is greater than `other`, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Ord for MyStruct { - /// fn gt(self, other: Self) -> bool { - /// self.val > other.val - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result = struct1 > struct2; - /// assert(result); - /// } - /// ``` - fn gt(self, other: Self) -> bool; - - /// Evaluates if one value of the same type is less than another. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [bool] - `true` if `self` is less than `other`, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Ord for MyStruct { - /// fn lt(self, other: Self) -> bool { - /// self.val < other.val - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 2 }; - /// let result = struct1 < struct2; - /// assert(!result); - /// } - /// ``` - fn lt(self, other: Self) -> bool; -} - -impl Ord for u256 { - fn gt(self, other: Self) -> bool { - __gt(self, other) - } - - fn lt(self, other: Self) -> bool { - __lt(self, other) - } -} - -impl Ord for b256 { - fn gt(self, other: Self) -> bool { - __gt(self, other) - } - - fn lt(self, other: Self) -> bool { - __lt(self, other) - } -} - -impl Ord for u64 { - fn gt(self, other: Self) -> bool { - __gt(self, other) - } - fn lt(self, other: Self) -> bool { - __lt(self, other) - } -} - -impl Ord for u32 { - fn gt(self, other: Self) -> bool { - __gt(self, other) - } - fn lt(self, other: Self) -> bool { - __lt(self, other) - } -} - -impl Ord for u16 { - fn gt(self, other: Self) -> bool { - __gt(self, other) - } - fn lt(self, other: Self) -> bool { - __lt(self, other) - } -} - -impl Ord for u8 { - fn gt(self, other: Self) -> bool { - __gt(self, other) - } - fn lt(self, other: Self) -> bool { - __lt(self, other) - } -} - -/// Trait to bitwise AND two values of the same type. -pub trait BitwiseAnd { - /// Bitwise AND two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [Self] - The result of the bitwise AND of the two values. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl BitwiseAnd for MyStruct { - /// fn binary_and(self, other: Self) -> Self { - /// let val = self.val & other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 11 }; - /// let result_struct = struct1 & struct2; - /// assert(result_struct.val == 10); - /// } - /// ``` - fn binary_and(self, other: Self) -> Self; -} - -impl BitwiseAnd for u256 { - fn binary_and(self, other: Self) -> Self { - __and(self, other) - } -} - -impl BitwiseAnd for b256 { - fn binary_and(self, other: Self) -> Self { - __and(self, other) - } -} - -impl BitwiseAnd for u64 { - fn binary_and(self, other: Self) -> Self { - __and(self, other) - } -} - -impl BitwiseAnd for u32 { - fn binary_and(self, other: Self) -> Self { - __and(self, other) - } -} - -impl BitwiseAnd for u16 { - fn binary_and(self, other: Self) -> Self { - __and(self, other) - } -} - -impl BitwiseAnd for u8 { - fn binary_and(self, other: Self) -> Self { - __and(self, other) - } -} - -/// Trait to bitwise OR two values of the same type. -pub trait BitwiseOr { - /// Bitwise OR two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [Self] - The result of the bitwise OR of the two values. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl BitwiseOr for MyStruct { - /// fn binary_or(self, other: Self) -> Self { - /// let val = self.val | other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 11 }; - /// let result_struct = struct1 | struct2; - /// assert(result_struct.val == 11); - /// } - /// ``` - fn binary_or(self, other: Self) -> Self; -} - -impl BitwiseOr for u256 { - fn binary_or(self, other: Self) -> Self { - __or(self, other) - } -} - -impl BitwiseOr for b256 { - fn binary_or(self, other: Self) -> Self { - __or(self, other) - } -} - -impl BitwiseOr for u64 { - fn binary_or(self, other: Self) -> Self { - __or(self, other) - } -} - -impl BitwiseOr for u32 { - fn binary_or(self, other: Self) -> Self { - __or(self, other) - } -} - -impl BitwiseOr for u16 { - fn binary_or(self, other: Self) -> Self { - __or(self, other) - } -} - -impl BitwiseOr for u8 { - fn binary_or(self, other: Self) -> Self { - __or(self, other) - } -} - -/// Trait to bitwise XOR two values of the same type. -pub trait BitwiseXor { - /// Bitwise XOR two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [Self] - The result of the bitwise XOR of the two values. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl BitwiseXOr for MyStruct { - /// fn binary_xor(self, other: Self) -> Self { - /// let val = self.val ^ other.val; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 11 }; - /// let result_struct = struct1 ^ struct2; - /// assert(result_struct.val == 1); - /// } - /// ``` - fn binary_xor(self, other: Self) -> Self; -} - -impl BitwiseXor for u256 { - fn binary_xor(self, other: Self) -> Self { - __xor(self, other) - } -} - -impl BitwiseXor for b256 { - fn binary_xor(self, other: Self) -> Self { - __xor(self, other) - } -} - -impl BitwiseXor for u64 { - fn binary_xor(self, other: Self) -> Self { - __xor(self, other) - } -} - -impl BitwiseXor for u32 { - fn binary_xor(self, other: Self) -> Self { - __xor(self, other) - } -} - -impl BitwiseXor for u16 { - fn binary_xor(self, other: Self) -> Self { - __xor(self, other) - } -} - -impl BitwiseXor for u8 { - fn binary_xor(self, other: Self) -> Self { - __xor(self, other) - } -} - -/// Trait to evaluate if one value is greater than or equal, or less than or equal to another of the same type. -pub trait OrdEq: Ord + Eq { -} { - /// Evaluates if one value of the same type is greater or equal to than another. - /// - /// # Additional Information - /// - /// This trait requires that the `Ord` and `Eq` traits are implemented. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [bool] - `true` if `self` is greater than or equal to `other`, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Eq for MyStruct { - /// fn eq(self, other: Self) -> bool { - /// self.val == other.val - /// } - /// } - /// - /// impl Ord for MyStruct { - /// fn gt(self, other: Self) -> bool { - /// self.val > other.val - /// } - /// } - /// - /// impl OrdEq for MyStruct {} - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 10 }; - /// let result = struct1 >= struct2; - /// assert(result); - /// } - /// ``` - fn ge(self, other: Self) -> bool { - self.gt(other) || self.eq(other) - } - /// Evaluates if one value of the same type is less or equal to than another. - /// - /// # Additional Information - /// - /// This trait requires that the `Ord` and `Eq` traits are implemented. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * [bool] - `true` if `self` is less than or equal to `other`, otherwise `false`. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Eq for MyStruct { - /// fn eq(self, other: Self) -> bool { - /// self.val == other.val - /// } - /// } - /// - /// impl Ord for MyStruct { - /// fn lt(self, other: Self) -> bool { - /// self.val < other.val - /// } - /// } - /// - /// impl OrdEq for MyStruct {} - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 10 }; - /// let result = struct1 <= struct2; - /// assert(result); - /// } - /// ``` - fn le(self, other: Self) -> bool { - self.lt(other) || self.eq(other) - } -} - -impl OrdEq for u256 {} -impl OrdEq for u64 {} -impl OrdEq for u32 {} -impl OrdEq for u16 {} -impl OrdEq for u8 {} -impl OrdEq for b256 {} - -/// Trait to bit shift a value. -pub trait Shift { - /// Bit shift left by an amount. - /// - /// # Arguments - /// - /// * `other`: [u64] - The amount to bit shift by. - /// - /// # Returns - /// - /// * [Self] - The result of the value bit shifted to the left. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Shift for MyStruct { - /// fn lsh(self, other: u64) -> Self { - /// let val = self.val << other; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let result_struct = struct1 << 3; - /// assert(result_struct.val == 80); - /// } - /// ``` - fn lsh(self, other: u64) -> Self; - - /// Bit shift right by an amount. - /// - /// # Arguments - /// - /// * `other`: [u64] - The amount to bit shift by. - /// - /// # Returns - /// - /// * [Self] - The result of the value bit shifted to the right. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl Shift for MyStruct { - /// fn rsh(self, other: u64) -> Self { - /// let val = self.val >> other; - /// Self { - /// val - /// } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let result_struct = struct1 >> 1; - /// assert(result_struct.val == 5); - /// } - /// ``` - fn rsh(self, other: u64) -> Self; -} - -impl Shift for u256 { - fn lsh(self, other: u64) -> Self { - __lsh(self, other) - } - fn rsh(self, other: u64) -> Self { - __rsh(self, other) - } -} - -impl Shift for b256 { - fn lsh(self, other: u64) -> Self { - __lsh(self, other) - } - - fn rsh(self, other: u64) -> Self { - __rsh(self, other) - } -} - -impl Shift for u64 { - fn lsh(self, other: u64) -> Self { - __lsh(self, other) - } - fn rsh(self, other: u64) -> Self { - __rsh(self, other) - } -} - -impl Shift for u32 { - fn lsh(self, other: u64) -> Self { - // any non-64-bit value is compiled to a u64 value under-the-hood - // so we need to clear upper bits here - __and(__lsh(self, other), Self::max()) - } - fn rsh(self, other: u64) -> Self { - __rsh(self, other) - } -} - -impl Shift for u16 { - fn lsh(self, other: u64) -> Self { - __and(__lsh(self, other), Self::max()) - } - fn rsh(self, other: u64) -> Self { - __rsh(self, other) - } -} - -/// Trait to compare values of the same type. -pub trait TotalOrd { - /// Finds the minimum value of two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * Self - the minimum of the two values, or the same value if they are equal. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl TotalOrd for MyStruct { - /// fn min(self, other: Self) -> Self { - /// if self.val < other.val { self } else { other } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 20 }; - /// let min = struct1.min(struct2); - /// assert(min.val == struct1.val); - /// } - /// ``` - fn min(self, other: Self) -> Self; - /// Finds the maximum value of two values of the same type. - /// - /// # Arguments - /// - /// * `other`: [Self] - The value of the same type. - /// - /// # Returns - /// - /// * Self - the maximum of the two values, or the same value if they are equal. - /// - /// # Examples - /// - /// ```sway - /// struct MyStruct { - /// val: u64, - /// } - /// - /// impl TotalOrd for MyStruct { - /// fn max(self, other: Self) -> Self { - /// if self.val > other.val { self } else { other } - /// } - /// } - /// - /// fn foo() { - /// let struct1 = MyStruct { val: 10 }; - /// let struct2 = MyStruct { val: 20 }; - /// let max = struct1.max(struct2); - /// assert(max.val == struct2.val); - /// } - /// ``` - fn max(self, other: Self) -> Self; -} - -impl TotalOrd for u8 { - fn min(self, other: Self) -> Self { - if self < other { self } else { other } - } - - fn max(self, other: Self) -> Self { - if self > other { self } else { other } - } -} - -impl TotalOrd for u16 { - fn min(self, other: Self) -> Self { - if self < other { self } else { other } - } - - fn max(self, other: Self) -> Self { - if self > other { self } else { other } - } -} - -impl TotalOrd for u32 { - fn min(self, other: Self) -> Self { - if self < other { self } else { other } - } - - fn max(self, other: Self) -> Self { - if self > other { self } else { other } - } -} - -impl TotalOrd for u64 { - fn min(self, other: Self) -> Self { - if self < other { self } else { other } - } - - fn max(self, other: Self) -> Self { - if self > other { self } else { other } - } -} - -impl TotalOrd for u256 { - fn min(self, other: Self) -> Self { - if self < other { self } else { other } - } - - fn max(self, other: Self) -> Self { - if self > other { self } else { other } - } -} - -impl Shift for u8 { - fn lsh(self, other: u64) -> Self { - __and(__lsh(self, other), Self::max()) - } - fn rsh(self, other: u64) -> Self { - __rsh(self, other) - } -} - -///////////////////////////////////////////////// -// Internal Helpers -///////////////////////////////////////////////// - -/// Build a single b256 value from a tuple of 4 u64 values. -fn compose(words: (u64, u64, u64, u64)) -> b256 { - asm(r1: words) { - r1: b256 - } -} - -/// Get a tuple of 4 u64 values from a single b256 value. -fn decompose(val: b256) -> (u64, u64, u64, u64) { - asm(r1: val) { - r1: (u64, u64, u64, u64) - } -} - -#[test] -fn test_compose() { - let expected: b256 = 0x0000000000000001_0000000000000002_0000000000000003_0000000000000004; - let composed = compose((1, 2, 3, 4)); - if composed.neq(expected) { - __revert(0) - } -} - -#[test] -fn test_decompose() { - let initial: b256 = 0x0000000000000001_0000000000000002_0000000000000003_0000000000000004; - let expected = (1, 2, 3, 4); - let decomposed = decompose(initial); - if decomposed.0.neq(expected.0) - && decomposed.1.neq(expected.1) - && decomposed.2.neq(expected.2) - && decomposed.3.neq(expected.3) - { - __revert(0) - } -} - -use ::str::*; - -impl Eq for str { - fn eq(self, other: Self) -> bool { - if self.len() != other.len() { - false - } else { - let self_ptr = self.as_ptr(); - let other_ptr = other.as_ptr(); - let l = self.len(); - asm(r1: self_ptr, r2: other_ptr, r3: l, r4) { - meq r4 r1 r2 r3; - r4: bool - } - } - } -} - -fn assert(v: bool) { - if !v { - __revert(0) - } -} - -#[test] -pub fn ok_str_eq() { - assert("" == ""); - assert("a" == "a"); - - assert("a" != ""); - assert("" != "a"); - assert("a" != "b"); -} - -fn flags() -> u64 { - asm() { - flag - } -} - -fn panic_on_overflow_is_enabled() -> bool { - __eq( - __and( - flags(), - 0b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000010, - ), - 0, - ) -} diff --git a/sway-lib-core/src/primitives.sw b/sway-lib-core/src/primitives.sw index 0aa5eaa8565..316a905aa9b 100644 --- a/sway-lib-core/src/primitives.sw +++ b/sway-lib-core/src/primitives.sw @@ -1,451 +1 @@ library; - -impl u256 { - /// The smallest value that can be represented by this integer type. - /// - /// # Returns - /// - /// * [u256] - The smallest `u256` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u256::min(); - /// assert(val == 0x0000000000000000000000000000000000000000000000000000000000000000u256); - // } - /// ``` - pub fn min() -> Self { - 0x0000000000000000000000000000000000000000000000000000000000000000u256 - } - - /// The largest value that can be represented by this integer type, - /// 2256 - 1. - /// - /// # Returns - /// - /// * [u256] - The largest `u256` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u256::max(); - /// assert(val == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu256); - /// } - /// ``` - pub fn max() -> Self { - 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu256 - } - - /// The size of this integer type in bits. - /// - /// # Returns - /// - /// * [u32] - The number of bits for a `u256`. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let bits = u256::bits(); - /// assert(bits == 256); - /// } - /// ``` - pub fn bits() -> u64 { - 256 - } - - /// Returns the zero value for the `u256` type. - /// - /// # Returns - /// - /// * [u256] -> The zero value for the `u256` type. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u256 = u256::zero(); - /// assert(zero_u256 == 0x00u256); - /// } - /// ``` - pub fn zero() -> Self { - 0x00u256 - } -} - -impl u64 { - /// The smallest value that can be represented by this integer type. - /// - /// # Returns - /// - /// * [u64] - The smallest `u64` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u64::min(); - /// assert(val == 0); - // } - /// ``` - pub fn min() -> Self { - 0 - } - - /// The largest value that can be represented by this integer type, - /// 264 - 1. - /// - /// # Returns - /// - /// * [u64] - The largest `u64` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u64::max(); - /// assert(val == 18446744073709551615); - /// } - /// ``` - pub fn max() -> Self { - 18446744073709551615 - } - - /// The size of this integer type in bits. - /// - /// # Returns - /// - /// * [u32] - The number of bits for a `u64`. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let bits = u64::bits(); - /// assert(bits == 64); - /// } - /// ``` - pub fn bits() -> u64 { - 64 - } - - /// Returns the zero value for the `u64` type. - /// - /// # Returns - /// - /// * [u64] -> The zero value for the `u64` type. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u64 = u64::zero(); - /// assert(zero_u64 == 0u64); - /// } - /// ``` - pub fn zero() -> Self { - 0u64 - } -} - -impl u32 { - /// The smallest value that can be represented by this integer type. - /// - /// # Returns - /// - /// * [u32] - The smallest `u32` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val == u32::min(); - /// assert(val == 0u32); - /// } - /// ``` - pub fn min() -> Self { - 0 - } - - /// The largest value that can be represented by this integer type, - /// 232 - 1. - /// - /// # Returns - /// - /// * [u32] - The largest `u32` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val == u32:max(); - /// assert(val == 4294967295u32); - /// } - /// ``` - pub fn max() -> Self { - 4294967295 - } - - /// The size of this integer type in bits. - /// - /// # Returns - /// - /// * [u32] - The number of bits for a `u32`. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let bits = u32::bits(); - /// assert(bits == 32); - /// } - /// ``` - pub fn bits() -> u64 { - 32 - } - - /// Returns the zero value for the `u32` type. - /// - /// # Returns - /// - /// * [u32] -> The zero value for the `u32` type. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u32 = u32::zero(); - /// assert(zero_u32 == 0u32); - /// } - /// ``` - pub fn zero() -> Self { - 0u32 - } -} - -impl u16 { - /// The smallest value that can be represented by this integer type. - /// - /// # Returns - /// - /// * [u16] - The smallest `u16` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u16::min(); - /// assert(val == 0u16); - /// } - /// ``` - pub fn min() -> Self { - 0 - } - - /// The largest value that can be represented by this integer type, - /// 216 - 1. - /// - /// # Returns - /// - /// * [u16] - The largest `u16` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u16::max(); - /// assert(val == 65535u16); - /// } - /// ``` - pub fn max() -> Self { - 65535 - } - - /// The size of this integer type in bits. - /// - /// # Returns - /// - /// * [u32] - The number of bits for a `u16`. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let bits = u16::bits(); - /// assert(bits == 16); - /// } - /// ``` - pub fn bits() -> u64 { - 16 - } - - /// Returns the zero value for the `u16` type. - /// - /// # Returns - /// - /// * [u16] -> The zero value for the `u16` type. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u16 = u16::zero(); - /// assert(zero_u16 == 0u16); - /// } - /// ``` - pub fn zero() -> Self { - 0u16 - } -} - -impl u8 { - /// The smallest value that can be represented by this integer type. - /// - /// # Returns - /// - /// * [u8] - The smallest `u8` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u8::min(); - /// assert(val == 0u8); - /// } - /// ``` - pub fn min() -> Self { - 0 - } - - /// The largest value that can be represented by this integer type, - /// 28 - 1. - /// - /// # Returns - /// - /// * [u8] - The largest `u8` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = u8::max(); - /// assert(val == 255u8); - /// } - /// ``` - pub fn max() -> Self { - 255 - } - - /// The size of this integer type in bits. - /// - /// # Returns - /// - /// * [u64] - The number of bits for a `u8`. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let bits = u8::bits(); - /// assert(bits == 8); - /// } - /// ``` - pub fn bits() -> u64 { - 8 - } - - // Returns the zero value for the `u8` type. - /// - /// # Returns - /// - /// * [u8] -> The zero value for the `u8` type. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u8 = u8::zero(); - /// assert(zero_u8 == 0u8); - /// } - /// ``` - pub fn zero() -> Self { - 0u8 - } -} - -impl b256 { - /// The smallest value that can be represented by this type. - /// - /// # Returns - /// - /// * [b256] - The smallest `b256` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val = b256::min(); - /// assert(val == b256::zero()); - /// } - /// ``` - pub fn min() -> Self { - 0x0000000000000000000000000000000000000000000000000000000000000000 - } - - /// The largest value that can be represented by this type, - /// 2256 - 1. - /// - /// # Returns - /// - /// * [b256] - The largest `b256` value. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let val == b256::max(); - /// assert(val == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); - /// } - /// ``` - pub fn max() -> Self { - 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - } - - /// The size of this type in bits. - /// - /// # Returns - /// - /// * [u64] - The number of bits for a `b256`. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let bits == b256::bits(); - /// assert(bits == 256); - /// } - /// ``` - pub fn bits() -> u64 { - 256 - } - - /// Returns the zero value for the `b256` type. - /// - /// # Returns - /// - /// * [b256] -> The zero value for the `b256` type. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_b256 = b256::zero(); - /// assert(zero_b256 == 0x0000000000000000000000000000000000000000000000000000000000000000); - /// } - /// ``` - pub fn zero() -> Self { - 0x0000000000000000000000000000000000000000000000000000000000000000 - } -} diff --git a/sway-lib-core/src/slice.sw b/sway-lib-core/src/slice.sw index c2a19246696..316a905aa9b 100644 --- a/sway-lib-core/src/slice.sw +++ b/sway-lib-core/src/slice.sw @@ -1,19 +1 @@ library; - -use ::raw_ptr::*; - -impl &__slice[T] { - pub fn ptr(self) -> raw_ptr { - let (ptr, _) = asm(s: self) { - s: (raw_ptr, u64) - }; - ptr - } - - pub fn len(self) -> u64 { - let (_, len) = asm(s: self) { - s: (raw_ptr, u64) - }; - len - } -} diff --git a/sway-lib-std/src/address.sw b/sway-lib-std/src/address.sw index d2c82e5026c..c28e20e0537 100644 --- a/sway-lib-std/src/address.sw +++ b/sway-lib-std/src/address.sw @@ -68,7 +68,7 @@ impl Address { } } -impl core::ops::Eq for Address { +impl ::ops::Eq for Address { fn eq(self, other: Self) -> bool { self.bits == other.bits } diff --git a/sway-lib-std/src/asset_id.sw b/sway-lib-std/src/asset_id.sw index 53fadeeaa9d..c41430ddd58 100644 --- a/sway-lib-std/src/asset_id.sw +++ b/sway-lib-std/src/asset_id.sw @@ -27,7 +27,7 @@ impl Hash for AssetId { } } -impl core::ops::Eq for AssetId { +impl ::ops::Eq for AssetId { fn eq(self, other: Self) -> bool { self.bits == other.bits } diff --git a/sway-lib-std/src/b512.sw b/sway-lib-std/src/b512.sw index 96e4c5d68cd..5ef426a7cfa 100644 --- a/sway-lib-std/src/b512.sw +++ b/sway-lib-std/src/b512.sw @@ -10,7 +10,7 @@ pub struct B512 { bits: [b256; 2], } -impl core::ops::Eq for B512 { +impl ::ops::Eq for B512 { fn eq(self, other: Self) -> bool { (self.bits)[0] == (other.bits)[0] && (self.bits)[1] == (other.bits)[1] } diff --git a/sway-lib-std/src/bytes.sw b/sway-lib-std/src/bytes.sw index c02b097811f..50a02d3074c 100644 --- a/sway-lib-std/src/bytes.sw +++ b/sway-lib-std/src/bytes.sw @@ -724,7 +724,7 @@ impl Bytes { } } -impl core::ops::Eq for Bytes { +impl ::ops::Eq for Bytes { fn eq(self, other: Self) -> bool { if self.len != other.len { return false; diff --git a/sway-lib-std/src/contract_id.sw b/sway-lib-std/src/contract_id.sw index 5ec994dffab..c16113f392b 100644 --- a/sway-lib-std/src/contract_id.sw +++ b/sway-lib-std/src/contract_id.sw @@ -30,7 +30,7 @@ impl ContractId { } } -impl core::ops::Eq for ContractId { +impl ::ops::Eq for ContractId { fn eq(self, other: Self) -> bool { self.bits == other.bits } diff --git a/sway-lib-std/src/identity.sw b/sway-lib-std/src/identity.sw index 33aeef4d207..06970e6fd94 100644 --- a/sway-lib-std/src/identity.sw +++ b/sway-lib-std/src/identity.sw @@ -19,7 +19,7 @@ pub enum Identity { } // ANCHOR_END: docs_identity -impl core::ops::Eq for Identity { +impl ::ops::Eq for Identity { fn eq(self, other: Self) -> bool { match (self, other) { (Identity::Address(addr1), Identity::Address(addr2)) => addr1 == addr2, diff --git a/sway-lib-std/src/inputs.sw b/sway-lib-std/src/inputs.sw index ccd7ba774bd..c5061b310f6 100644 --- a/sway-lib-std/src/inputs.sw +++ b/sway-lib-std/src/inputs.sw @@ -17,7 +17,7 @@ use ::tx::{ Transaction, tx_type, }; -use core::ops::Eq; +use ::ops::Eq; use ::revert::revert; // GTF Opcode const selectors diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index 8e2e4a51e69..f097127c456 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -2,6 +2,8 @@ library; pub mod raw_ptr; pub mod raw_slice; +pub mod primitives; +pub mod slice; pub mod constants; pub mod error_signals; pub mod logging; @@ -17,6 +19,7 @@ pub mod iterator; pub mod vec; pub mod bytes; pub mod flags; +pub mod ops; pub mod math; pub mod u128; pub mod b512; diff --git a/sway-lib-std/src/ops.sw b/sway-lib-std/src/ops.sw new file mode 100644 index 00000000000..867fefdb096 --- /dev/null +++ b/sway-lib-std/src/ops.sw @@ -0,0 +1,1413 @@ +library; + +use ::primitives::*; +use ::slice::*; +use ::assert::assert; +use ::registers::flags; +use ::flags::panic_on_overflow_enabled; + +/// Trait for the addition of two values. +pub trait Add { + /// Add two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value to add to self. + /// + /// # Returns + /// + /// * [Self] - The result of the two values added. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Add for MyStruct { + /// fn add(self, other: Self) -> Self { + /// let val = self.val + other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 1 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result_struct = struct1 + struct2; + /// assert(result_struct.val == 3); + /// } + /// ``` + fn add(self, other: Self) -> Self; +} + +impl Add for u256 { + fn add(self, other: Self) -> Self { + __add(self, other) + } +} + +impl Add for u64 { + fn add(self, other: Self) -> Self { + __add(self, other) + } +} + +// Emulate overflowing arithmetic for non-64-bit integer types +impl Add for u32 { + fn add(self, other: Self) -> Self { + // any non-64-bit value is compiled to a u64 value under-the-hood + // constants (like Self::max() below) are also automatically promoted to u64 + let res = __add(self, other); + // integer overflow + if __gt(res, Self::max()) { + if panic_on_overflow_is_enabled() { + __revert(0) + } else { + // overflow enabled + // res % (Self::max() + 1) + __mod(res, __add(Self::max(), 1)) + } + } else { + // no overflow + res + } + } +} + +impl Add for u16 { + fn add(self, other: Self) -> Self { + let res = __add(self, other); + if __gt(res, Self::max()) { + if panic_on_overflow_is_enabled() { + __revert(0) + } else { + // overflow enabled + // res % (Self::max() + 1) + __mod(res, __add(Self::max(), 1)) + } + } else { + res + } + } +} + +impl Add for u8 { + fn add(self, other: Self) -> Self { + let self_u64 = asm(input: self) { + input: u64 + }; + let other_u64 = asm(input: other) { + input: u64 + }; + let res_u64 = __add(self_u64, other_u64); + let max_u8_u64 = asm(input: Self::max()) { + input: u64 + }; + if __gt(res_u64, max_u8_u64) { + if panic_on_overflow_is_enabled() { + __revert(0) + } else { + // overflow enabled + // res % (Self::max() + 1) + let res_u64 = __mod(res_u64, __add(max_u8_u64, 1)); + asm(input: res_u64) { + input: u8 + } + } + } else { + asm(input: res_u64) { + input: u8 + } + } + } +} + +/// Trait for the subtraction of two values. +pub trait Subtract { + /// Subtract two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value to subtract from self. + /// + /// # Returns + /// + /// * [Self] - The result of the two values subtracted. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Subtract for MyStruct { + /// fn subtract(self, other: Self) -> Self { + /// let val = self.val - other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 3 }; + /// let struct2 = MyStruct { val: 1 }; + /// let result_struct = struct1 - struct2; + /// assert(result_struct.val == 2); + /// } + /// ``` + fn subtract(self, other: Self) -> Self; +} + +impl Subtract for u256 { + fn subtract(self, other: Self) -> Self { + __sub(self, other) + } +} + +impl Subtract for u64 { + fn subtract(self, other: Self) -> Self { + __sub(self, other) + } +} + +// unlike addition, underflowing subtraction does not need special treatment +// because VM handles underflow +impl Subtract for u32 { + fn subtract(self, other: Self) -> Self { + __sub(self, other) + } +} + +impl Subtract for u16 { + fn subtract(self, other: Self) -> Self { + __sub(self, other) + } +} + +impl Subtract for u8 { + fn subtract(self, other: Self) -> Self { + __sub(self, other) + } +} + +/// Trait for the multiplication of two values. +pub trait Multiply { + /// Multiply two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value to multiply with self. + /// + /// # Returns + /// + /// * [Self] - The result of the two values multiplied. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Multiply for MyStruct { + /// fn multiply(self, other: Self) -> Self { + /// let val = self.val * other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 3 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result_struct = struct1 * struct2; + /// assert(result_struct.val == 6); + /// } + /// ``` + fn multiply(self, other: Self) -> Self; +} + +impl Multiply for u256 { + fn multiply(self, other: Self) -> Self { + __mul(self, other) + } +} + +impl Multiply for u64 { + fn multiply(self, other: Self) -> Self { + __mul(self, other) + } +} + +// Emulate overflowing arithmetic for non-64-bit integer types +impl Multiply for u32 { + fn multiply(self, other: Self) -> Self { + // any non-64-bit value is compiled to a u64 value under-the-hood + // constants (like Self::max() below) are also automatically promoted to u64 + let res = __mul(self, other); + if __gt(res, Self::max()) { + if panic_on_overflow_is_enabled() { + // integer overflow + __revert(0) + } else { + // overflow enabled + // res % (Self::max() + 1) + __mod(res, __add(Self::max(), 1)) + } + } else { + // no overflow + res + } + } +} + +impl Multiply for u16 { + fn multiply(self, other: Self) -> Self { + let res = __mul(self, other); + if __gt(res, Self::max()) { + if panic_on_overflow_is_enabled() { + __revert(0) + } else { + __mod(res, __add(Self::max(), 1)) + } + } else { + res + } + } +} + +impl Multiply for u8 { + fn multiply(self, other: Self) -> Self { + let self_u64 = asm(input: self) { + input: u64 + }; + let other_u64 = asm(input: other) { + input: u64 + }; + let res_u64 = __mul(self_u64, other_u64); + let max_u8_u64 = asm(input: Self::max()) { + input: u64 + }; + if __gt(res_u64, max_u8_u64) { + if panic_on_overflow_is_enabled() { + __revert(0) + } else { + // overflow enabled + // res % (Self::max() + 1) + let res_u64 = __mod(res_u64, __add(max_u8_u64, 1)); + asm(input: res_u64) { + input: u8 + } + } + } else { + asm(input: res_u64) { + input: u8 + } + } + } +} + +/// Trait for the division of two values. +pub trait Divide { + /// Divide two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value to divide with self. + /// + /// # Returns + /// + /// * [Self] - The result of the two values divided. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Divide for MyStruct { + /// fn divide(self, other: Self) -> Self { + /// let val = self.val / other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result_struct = struct1 / struct2; + /// assert(result_struct.val == 5); + /// } + /// ``` + fn divide(self, other: Self) -> Self; +} + +impl Divide for u256 { + fn divide(self, other: Self) -> Self { + __div(self, other) + } +} + +impl Divide for u64 { + fn divide(self, other: Self) -> Self { + __div(self, other) + } +} + +// division for unsigned integers cannot overflow, +// but if signed integers are ever introduced, +// overflow needs to be handled, since +// Self::max() / -1 overflows +impl Divide for u32 { + fn divide(self, other: Self) -> Self { + __div(self, other) + } +} + +impl Divide for u16 { + fn divide(self, other: Self) -> Self { + __div(self, other) + } +} + +impl Divide for u8 { + fn divide(self, other: Self) -> Self { + __div(self, other) + } +} + +/// Trait for the modulo of two values. +pub trait Mod { + /// Modulo two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value to mod with self. + /// + /// # Returns + /// + /// * [Self] - The modulo of the two values. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Mod for MyStruct { + /// fn modulo(self, other: Self) -> Self { + /// let val = self.val % other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result_struct = struct1 % struct2; + /// assert(result_struct.val == 0); + /// } + /// ``` + fn modulo(self, other: Self) -> Self; +} + +impl Mod for u256 { + fn modulo(self, other: Self) -> Self { + __mod(self, other) + } +} + +impl Mod for u64 { + fn modulo(self, other: Self) -> Self { + __mod(self, other) + } +} + +impl Mod for u32 { + fn modulo(self, other: Self) -> Self { + __mod(self, other) + } +} + +impl Mod for u16 { + fn modulo(self, other: Self) -> Self { + __mod(self, other) + } +} + +impl Mod for u8 { + fn modulo(self, other: Self) -> Self { + __mod(self, other) + } +} + +/// Trait to invert a type. +pub trait Not { + /// Inverts the value of the type. + /// + /// # Returns + /// + /// * [Self] - The result of the inverse. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: bool, + /// } + /// + /// impl Not for MyStruct { + /// fn not(self) -> Self { + /// Self { + /// val: !self.val, + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct = MyStruct { val: true }; + /// let result_struct = !struct; + /// assert(!result_struct.val); + /// } + /// ``` + fn not(self) -> Self; +} + +impl Not for bool { + fn not(self) -> Self { + __eq(self, false) + } +} + +impl Not for u256 { + fn not(self) -> Self { + __not(self) + } +} + +impl Not for b256 { + fn not(self) -> Self { + __not(self) + } +} + +impl Not for u64 { + fn not(self) -> Self { + __not(self) + } +} + +impl Not for u32 { + fn not(self) -> Self { + let v = __not(self); + __and(v, u32::max()) + } +} + +impl Not for u16 { + fn not(self) -> Self { + let v = __not(self); + __and(v, u16::max()) + } +} + +impl Not for u8 { + fn not(self) -> Self { + let v = __not(self); + __and(v, u8::max()) + } +} + +/// Trait to evaluate if two types are equal. +pub trait Eq { + /// Evaluates if two values of the same type are equal. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [bool] - `true` if the values are equal, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Eq for MyStruct { + /// fn eq(self, other: Self) -> bool { + /// self.val == other.val + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 2 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result = struct1 == struct2; + /// assert(result); + /// } + /// ``` + fn eq(self, other: Self) -> bool; +} { + /// Evaluates if two values of the same type are not equal. + /// + /// # Additional Information + /// + /// This function is inherited when `eq()` is implemented. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [bool] - `true` if the two values are not equal, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Eq for MyStruct { + /// fn eq(self, other: Self) -> bool { + /// self.val == other.val + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result = struct1 != struct2; + /// assert(result); + /// } + /// ``` + fn neq(self, other: Self) -> bool { + (self.eq(other)).not() + } +} + +impl Eq for bool { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for u256 { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for b256 { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for u64 { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for u32 { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for u16 { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for u8 { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +impl Eq for raw_ptr { + fn eq(self, other: Self) -> bool { + __eq(self, other) + } +} + +/// Trait to evaluate if one value is greater or less than another of the same type. +pub trait Ord { + /// Evaluates if one value of the same type is greater than another. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [bool] - `true` if `self` is greater than `other`, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Ord for MyStruct { + /// fn gt(self, other: Self) -> bool { + /// self.val > other.val + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result = struct1 > struct2; + /// assert(result); + /// } + /// ``` + fn gt(self, other: Self) -> bool; + + /// Evaluates if one value of the same type is less than another. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [bool] - `true` if `self` is less than `other`, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Ord for MyStruct { + /// fn lt(self, other: Self) -> bool { + /// self.val < other.val + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 2 }; + /// let result = struct1 < struct2; + /// assert(!result); + /// } + /// ``` + fn lt(self, other: Self) -> bool; +} + +impl Ord for u256 { + fn gt(self, other: Self) -> bool { + __gt(self, other) + } + + fn lt(self, other: Self) -> bool { + __lt(self, other) + } +} + +impl Ord for b256 { + fn gt(self, other: Self) -> bool { + __gt(self, other) + } + + fn lt(self, other: Self) -> bool { + __lt(self, other) + } +} + +impl Ord for u64 { + fn gt(self, other: Self) -> bool { + __gt(self, other) + } + fn lt(self, other: Self) -> bool { + __lt(self, other) + } +} + +impl Ord for u32 { + fn gt(self, other: Self) -> bool { + __gt(self, other) + } + fn lt(self, other: Self) -> bool { + __lt(self, other) + } +} + +impl Ord for u16 { + fn gt(self, other: Self) -> bool { + __gt(self, other) + } + fn lt(self, other: Self) -> bool { + __lt(self, other) + } +} + +impl Ord for u8 { + fn gt(self, other: Self) -> bool { + __gt(self, other) + } + fn lt(self, other: Self) -> bool { + __lt(self, other) + } +} + +/// Trait to bitwise AND two values of the same type. +pub trait BitwiseAnd { + /// Bitwise AND two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [Self] - The result of the bitwise AND of the two values. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl BitwiseAnd for MyStruct { + /// fn binary_and(self, other: Self) -> Self { + /// let val = self.val & other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 11 }; + /// let result_struct = struct1 & struct2; + /// assert(result_struct.val == 10); + /// } + /// ``` + fn binary_and(self, other: Self) -> Self; +} + +impl BitwiseAnd for u256 { + fn binary_and(self, other: Self) -> Self { + __and(self, other) + } +} + +impl BitwiseAnd for b256 { + fn binary_and(self, other: Self) -> Self { + __and(self, other) + } +} + +impl BitwiseAnd for u64 { + fn binary_and(self, other: Self) -> Self { + __and(self, other) + } +} + +impl BitwiseAnd for u32 { + fn binary_and(self, other: Self) -> Self { + __and(self, other) + } +} + +impl BitwiseAnd for u16 { + fn binary_and(self, other: Self) -> Self { + __and(self, other) + } +} + +impl BitwiseAnd for u8 { + fn binary_and(self, other: Self) -> Self { + __and(self, other) + } +} + +/// Trait to bitwise OR two values of the same type. +pub trait BitwiseOr { + /// Bitwise OR two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [Self] - The result of the bitwise OR of the two values. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl BitwiseOr for MyStruct { + /// fn binary_or(self, other: Self) -> Self { + /// let val = self.val | other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 11 }; + /// let result_struct = struct1 | struct2; + /// assert(result_struct.val == 11); + /// } + /// ``` + fn binary_or(self, other: Self) -> Self; +} + +impl BitwiseOr for u256 { + fn binary_or(self, other: Self) -> Self { + __or(self, other) + } +} + +impl BitwiseOr for b256 { + fn binary_or(self, other: Self) -> Self { + __or(self, other) + } +} + +impl BitwiseOr for u64 { + fn binary_or(self, other: Self) -> Self { + __or(self, other) + } +} + +impl BitwiseOr for u32 { + fn binary_or(self, other: Self) -> Self { + __or(self, other) + } +} + +impl BitwiseOr for u16 { + fn binary_or(self, other: Self) -> Self { + __or(self, other) + } +} + +impl BitwiseOr for u8 { + fn binary_or(self, other: Self) -> Self { + __or(self, other) + } +} + +/// Trait to bitwise XOR two values of the same type. +pub trait BitwiseXor { + /// Bitwise XOR two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [Self] - The result of the bitwise XOR of the two values. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl BitwiseXOr for MyStruct { + /// fn binary_xor(self, other: Self) -> Self { + /// let val = self.val ^ other.val; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 11 }; + /// let result_struct = struct1 ^ struct2; + /// assert(result_struct.val == 1); + /// } + /// ``` + fn binary_xor(self, other: Self) -> Self; +} + +impl BitwiseXor for u256 { + fn binary_xor(self, other: Self) -> Self { + __xor(self, other) + } +} + +impl BitwiseXor for b256 { + fn binary_xor(self, other: Self) -> Self { + __xor(self, other) + } +} + +impl BitwiseXor for u64 { + fn binary_xor(self, other: Self) -> Self { + __xor(self, other) + } +} + +impl BitwiseXor for u32 { + fn binary_xor(self, other: Self) -> Self { + __xor(self, other) + } +} + +impl BitwiseXor for u16 { + fn binary_xor(self, other: Self) -> Self { + __xor(self, other) + } +} + +impl BitwiseXor for u8 { + fn binary_xor(self, other: Self) -> Self { + __xor(self, other) + } +} + +/// Trait to evaluate if one value is greater than or equal, or less than or equal to another of the same type. +pub trait OrdEq: Ord + Eq { +} { + /// Evaluates if one value of the same type is greater or equal to than another. + /// + /// # Additional Information + /// + /// This trait requires that the `Ord` and `Eq` traits are implemented. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [bool] - `true` if `self` is greater than or equal to `other`, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Eq for MyStruct { + /// fn eq(self, other: Self) -> bool { + /// self.val == other.val + /// } + /// } + /// + /// impl Ord for MyStruct { + /// fn gt(self, other: Self) -> bool { + /// self.val > other.val + /// } + /// } + /// + /// impl OrdEq for MyStruct {} + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 10 }; + /// let result = struct1 >= struct2; + /// assert(result); + /// } + /// ``` + fn ge(self, other: Self) -> bool { + self.gt(other) || self.eq(other) + } + /// Evaluates if one value of the same type is less or equal to than another. + /// + /// # Additional Information + /// + /// This trait requires that the `Ord` and `Eq` traits are implemented. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * [bool] - `true` if `self` is less than or equal to `other`, otherwise `false`. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Eq for MyStruct { + /// fn eq(self, other: Self) -> bool { + /// self.val == other.val + /// } + /// } + /// + /// impl Ord for MyStruct { + /// fn lt(self, other: Self) -> bool { + /// self.val < other.val + /// } + /// } + /// + /// impl OrdEq for MyStruct {} + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 10 }; + /// let result = struct1 <= struct2; + /// assert(result); + /// } + /// ``` + fn le(self, other: Self) -> bool { + self.lt(other) || self.eq(other) + } +} + +impl OrdEq for u256 {} +impl OrdEq for u64 {} +impl OrdEq for u32 {} +impl OrdEq for u16 {} +impl OrdEq for u8 {} +impl OrdEq for b256 {} + +/// Trait to bit shift a value. +pub trait Shift { + /// Bit shift left by an amount. + /// + /// # Arguments + /// + /// * `other`: [u64] - The amount to bit shift by. + /// + /// # Returns + /// + /// * [Self] - The result of the value bit shifted to the left. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Shift for MyStruct { + /// fn lsh(self, other: u64) -> Self { + /// let val = self.val << other; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let result_struct = struct1 << 3; + /// assert(result_struct.val == 80); + /// } + /// ``` + fn lsh(self, other: u64) -> Self; + + /// Bit shift right by an amount. + /// + /// # Arguments + /// + /// * `other`: [u64] - The amount to bit shift by. + /// + /// # Returns + /// + /// * [Self] - The result of the value bit shifted to the right. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl Shift for MyStruct { + /// fn rsh(self, other: u64) -> Self { + /// let val = self.val >> other; + /// Self { + /// val + /// } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let result_struct = struct1 >> 1; + /// assert(result_struct.val == 5); + /// } + /// ``` + fn rsh(self, other: u64) -> Self; +} + +impl Shift for u256 { + fn lsh(self, other: u64) -> Self { + __lsh(self, other) + } + fn rsh(self, other: u64) -> Self { + __rsh(self, other) + } +} + +impl Shift for b256 { + fn lsh(self, other: u64) -> Self { + __lsh(self, other) + } + + fn rsh(self, other: u64) -> Self { + __rsh(self, other) + } +} + +impl Shift for u64 { + fn lsh(self, other: u64) -> Self { + __lsh(self, other) + } + fn rsh(self, other: u64) -> Self { + __rsh(self, other) + } +} + +impl Shift for u32 { + fn lsh(self, other: u64) -> Self { + // any non-64-bit value is compiled to a u64 value under-the-hood + // so we need to clear upper bits here + __and(__lsh(self, other), Self::max()) + } + fn rsh(self, other: u64) -> Self { + __rsh(self, other) + } +} + +impl Shift for u16 { + fn lsh(self, other: u64) -> Self { + __and(__lsh(self, other), Self::max()) + } + fn rsh(self, other: u64) -> Self { + __rsh(self, other) + } +} + +/// Trait to compare values of the same type. +pub trait TotalOrd { + /// Finds the minimum value of two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * Self - the minimum of the two values, or the same value if they are equal. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl TotalOrd for MyStruct { + /// fn min(self, other: Self) -> Self { + /// if self.val < other.val { self } else { other } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 20 }; + /// let min = struct1.min(struct2); + /// assert(min.val == struct1.val); + /// } + /// ``` + fn min(self, other: Self) -> Self; + /// Finds the maximum value of two values of the same type. + /// + /// # Arguments + /// + /// * `other`: [Self] - The value of the same type. + /// + /// # Returns + /// + /// * Self - the maximum of the two values, or the same value if they are equal. + /// + /// # Examples + /// + /// ```sway + /// struct MyStruct { + /// val: u64, + /// } + /// + /// impl TotalOrd for MyStruct { + /// fn max(self, other: Self) -> Self { + /// if self.val > other.val { self } else { other } + /// } + /// } + /// + /// fn foo() { + /// let struct1 = MyStruct { val: 10 }; + /// let struct2 = MyStruct { val: 20 }; + /// let max = struct1.max(struct2); + /// assert(max.val == struct2.val); + /// } + /// ``` + fn max(self, other: Self) -> Self; +} + +impl TotalOrd for u8 { + fn min(self, other: Self) -> Self { + if self < other { self } else { other } + } + + fn max(self, other: Self) -> Self { + if self > other { self } else { other } + } +} + +impl TotalOrd for u16 { + fn min(self, other: Self) -> Self { + if self < other { self } else { other } + } + + fn max(self, other: Self) -> Self { + if self > other { self } else { other } + } +} + +impl TotalOrd for u32 { + fn min(self, other: Self) -> Self { + if self < other { self } else { other } + } + + fn max(self, other: Self) -> Self { + if self > other { self } else { other } + } +} + +impl TotalOrd for u64 { + fn min(self, other: Self) -> Self { + if self < other { self } else { other } + } + + fn max(self, other: Self) -> Self { + if self > other { self } else { other } + } +} + +impl TotalOrd for u256 { + fn min(self, other: Self) -> Self { + if self < other { self } else { other } + } + + fn max(self, other: Self) -> Self { + if self > other { self } else { other } + } +} + +impl Shift for u8 { + fn lsh(self, other: u64) -> Self { + __and(__lsh(self, other), Self::max()) + } + fn rsh(self, other: u64) -> Self { + __rsh(self, other) + } +} + +///////////////////////////////////////////////// +// Internal Helpers +///////////////////////////////////////////////// + +/// Build a single b256 value from a tuple of 4 u64 values. +fn compose(words: (u64, u64, u64, u64)) -> b256 { + asm(r1: words) { + r1: b256 + } +} + +/// Get a tuple of 4 u64 values from a single b256 value. +fn decompose(val: b256) -> (u64, u64, u64, u64) { + asm(r1: val) { + r1: (u64, u64, u64, u64) + } +} + +#[test] +fn test_compose() { + let expected: b256 = 0x0000000000000001_0000000000000002_0000000000000003_0000000000000004; + let composed = compose((1, 2, 3, 4)); + if composed.neq(expected) { + __revert(0) + } +} + +#[test] +fn test_decompose() { + let initial: b256 = 0x0000000000000001_0000000000000002_0000000000000003_0000000000000004; + let expected = (1, 2, 3, 4); + let decomposed = decompose(initial); + if decomposed.0.neq(expected.0) + && decomposed.1.neq(expected.1) + && decomposed.2.neq(expected.2) + && decomposed.3.neq(expected.3) + { + __revert(0) + } +} + +use ::str::*; + +impl Eq for str { + fn eq(self, other: Self) -> bool { + if self.len() != other.len() { + false + } else { + let self_ptr = self.as_ptr(); + let other_ptr = other.as_ptr(); + let l = self.len(); + asm(r1: self_ptr, r2: other_ptr, r3: l, r4) { + meq r4 r1 r2 r3; + r4: bool + } + } + } +} + +#[test] +pub fn ok_str_eq() { + assert("" == ""); + assert("a" == "a"); + + assert("a" != ""); + assert("" != "a"); + assert("a" != "b"); +} diff --git a/sway-lib-std/src/option.sw b/sway-lib-std/src/option.sw index 882879cd3b6..04d7019ac65 100644 --- a/sway-lib-std/src/option.sw +++ b/sway-lib-std/src/option.sw @@ -88,7 +88,7 @@ pub enum Option { } // ANCHOR_END: docs_option -impl core::ops::Eq for Option +impl ::ops::Eq for Option where T: Eq, { diff --git a/sway-lib-std/src/outputs.sw b/sway-lib-std/src/outputs.sw index 69ccac1b23b..92d3d04b242 100644 --- a/sway-lib-std/src/outputs.sw +++ b/sway-lib-std/src/outputs.sw @@ -264,7 +264,7 @@ pub fn output_asset_to(index: u64) -> Option
{ } } -impl core::ops::Eq for Output { +impl ::ops::Eq for Output { fn eq(self, other: Self) -> bool { match (self, other) { (Output::Coin, Output::Coin) => true, diff --git a/sway-lib-std/src/primitives.sw b/sway-lib-std/src/primitives.sw new file mode 100644 index 00000000000..0aa5eaa8565 --- /dev/null +++ b/sway-lib-std/src/primitives.sw @@ -0,0 +1,451 @@ +library; + +impl u256 { + /// The smallest value that can be represented by this integer type. + /// + /// # Returns + /// + /// * [u256] - The smallest `u256` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u256::min(); + /// assert(val == 0x0000000000000000000000000000000000000000000000000000000000000000u256); + // } + /// ``` + pub fn min() -> Self { + 0x0000000000000000000000000000000000000000000000000000000000000000u256 + } + + /// The largest value that can be represented by this integer type, + /// 2256 - 1. + /// + /// # Returns + /// + /// * [u256] - The largest `u256` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u256::max(); + /// assert(val == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu256); + /// } + /// ``` + pub fn max() -> Self { + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFu256 + } + + /// The size of this integer type in bits. + /// + /// # Returns + /// + /// * [u32] - The number of bits for a `u256`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let bits = u256::bits(); + /// assert(bits == 256); + /// } + /// ``` + pub fn bits() -> u64 { + 256 + } + + /// Returns the zero value for the `u256` type. + /// + /// # Returns + /// + /// * [u256] -> The zero value for the `u256` type. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u256 = u256::zero(); + /// assert(zero_u256 == 0x00u256); + /// } + /// ``` + pub fn zero() -> Self { + 0x00u256 + } +} + +impl u64 { + /// The smallest value that can be represented by this integer type. + /// + /// # Returns + /// + /// * [u64] - The smallest `u64` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u64::min(); + /// assert(val == 0); + // } + /// ``` + pub fn min() -> Self { + 0 + } + + /// The largest value that can be represented by this integer type, + /// 264 - 1. + /// + /// # Returns + /// + /// * [u64] - The largest `u64` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u64::max(); + /// assert(val == 18446744073709551615); + /// } + /// ``` + pub fn max() -> Self { + 18446744073709551615 + } + + /// The size of this integer type in bits. + /// + /// # Returns + /// + /// * [u32] - The number of bits for a `u64`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let bits = u64::bits(); + /// assert(bits == 64); + /// } + /// ``` + pub fn bits() -> u64 { + 64 + } + + /// Returns the zero value for the `u64` type. + /// + /// # Returns + /// + /// * [u64] -> The zero value for the `u64` type. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u64 = u64::zero(); + /// assert(zero_u64 == 0u64); + /// } + /// ``` + pub fn zero() -> Self { + 0u64 + } +} + +impl u32 { + /// The smallest value that can be represented by this integer type. + /// + /// # Returns + /// + /// * [u32] - The smallest `u32` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val == u32::min(); + /// assert(val == 0u32); + /// } + /// ``` + pub fn min() -> Self { + 0 + } + + /// The largest value that can be represented by this integer type, + /// 232 - 1. + /// + /// # Returns + /// + /// * [u32] - The largest `u32` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val == u32:max(); + /// assert(val == 4294967295u32); + /// } + /// ``` + pub fn max() -> Self { + 4294967295 + } + + /// The size of this integer type in bits. + /// + /// # Returns + /// + /// * [u32] - The number of bits for a `u32`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let bits = u32::bits(); + /// assert(bits == 32); + /// } + /// ``` + pub fn bits() -> u64 { + 32 + } + + /// Returns the zero value for the `u32` type. + /// + /// # Returns + /// + /// * [u32] -> The zero value for the `u32` type. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u32 = u32::zero(); + /// assert(zero_u32 == 0u32); + /// } + /// ``` + pub fn zero() -> Self { + 0u32 + } +} + +impl u16 { + /// The smallest value that can be represented by this integer type. + /// + /// # Returns + /// + /// * [u16] - The smallest `u16` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u16::min(); + /// assert(val == 0u16); + /// } + /// ``` + pub fn min() -> Self { + 0 + } + + /// The largest value that can be represented by this integer type, + /// 216 - 1. + /// + /// # Returns + /// + /// * [u16] - The largest `u16` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u16::max(); + /// assert(val == 65535u16); + /// } + /// ``` + pub fn max() -> Self { + 65535 + } + + /// The size of this integer type in bits. + /// + /// # Returns + /// + /// * [u32] - The number of bits for a `u16`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let bits = u16::bits(); + /// assert(bits == 16); + /// } + /// ``` + pub fn bits() -> u64 { + 16 + } + + /// Returns the zero value for the `u16` type. + /// + /// # Returns + /// + /// * [u16] -> The zero value for the `u16` type. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u16 = u16::zero(); + /// assert(zero_u16 == 0u16); + /// } + /// ``` + pub fn zero() -> Self { + 0u16 + } +} + +impl u8 { + /// The smallest value that can be represented by this integer type. + /// + /// # Returns + /// + /// * [u8] - The smallest `u8` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u8::min(); + /// assert(val == 0u8); + /// } + /// ``` + pub fn min() -> Self { + 0 + } + + /// The largest value that can be represented by this integer type, + /// 28 - 1. + /// + /// # Returns + /// + /// * [u8] - The largest `u8` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = u8::max(); + /// assert(val == 255u8); + /// } + /// ``` + pub fn max() -> Self { + 255 + } + + /// The size of this integer type in bits. + /// + /// # Returns + /// + /// * [u64] - The number of bits for a `u8`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let bits = u8::bits(); + /// assert(bits == 8); + /// } + /// ``` + pub fn bits() -> u64 { + 8 + } + + // Returns the zero value for the `u8` type. + /// + /// # Returns + /// + /// * [u8] -> The zero value for the `u8` type. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u8 = u8::zero(); + /// assert(zero_u8 == 0u8); + /// } + /// ``` + pub fn zero() -> Self { + 0u8 + } +} + +impl b256 { + /// The smallest value that can be represented by this type. + /// + /// # Returns + /// + /// * [b256] - The smallest `b256` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val = b256::min(); + /// assert(val == b256::zero()); + /// } + /// ``` + pub fn min() -> Self { + 0x0000000000000000000000000000000000000000000000000000000000000000 + } + + /// The largest value that can be represented by this type, + /// 2256 - 1. + /// + /// # Returns + /// + /// * [b256] - The largest `b256` value. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let val == b256::max(); + /// assert(val == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + /// } + /// ``` + pub fn max() -> Self { + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + } + + /// The size of this type in bits. + /// + /// # Returns + /// + /// * [u64] - The number of bits for a `b256`. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let bits == b256::bits(); + /// assert(bits == 256); + /// } + /// ``` + pub fn bits() -> u64 { + 256 + } + + /// Returns the zero value for the `b256` type. + /// + /// # Returns + /// + /// * [b256] -> The zero value for the `b256` type. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_b256 = b256::zero(); + /// assert(zero_b256 == 0x0000000000000000000000000000000000000000000000000000000000000000); + /// } + /// ``` + pub fn zero() -> Self { + 0x0000000000000000000000000000000000000000000000000000000000000000 + } +} diff --git a/sway-lib-std/src/raw_ptr.sw b/sway-lib-std/src/raw_ptr.sw index 955af547f71..df4458863a0 100644 --- a/sway-lib-std/src/raw_ptr.sw +++ b/sway-lib-std/src/raw_ptr.sw @@ -1,6 +1,6 @@ library; -use core::ops::Eq; +use ::ops::Eq; impl Eq for raw_ptr { fn eq(self, other: Self) -> bool { diff --git a/sway-lib-std/src/slice.sw b/sway-lib-std/src/slice.sw new file mode 100644 index 00000000000..c2a19246696 --- /dev/null +++ b/sway-lib-std/src/slice.sw @@ -0,0 +1,19 @@ +library; + +use ::raw_ptr::*; + +impl &__slice[T] { + pub fn ptr(self) -> raw_ptr { + let (ptr, _) = asm(s: self) { + s: (raw_ptr, u64) + }; + ptr + } + + pub fn len(self) -> u64 { + let (_, len) = asm(s: self) { + s: (raw_ptr, u64) + }; + len + } +} diff --git a/sway-lib-std/src/tx.sw b/sway-lib-std/src/tx.sw index 033b937ec50..47e4a793526 100644 --- a/sway-lib-std/src/tx.sw +++ b/sway-lib-std/src/tx.sw @@ -62,7 +62,7 @@ pub enum Transaction { Blob: (), } -impl core::ops::Eq for Transaction { +impl ::ops::Eq for Transaction { fn eq(self, other: Self) -> bool { match (self, other) { (Transaction::Script, Transaction::Script) => true, diff --git a/sway-lib-std/src/u128.sw b/sway-lib-std/src/u128.sw index 8eb22317b64..bde8b055477 100644 --- a/sway-lib-std/src/u128.sw +++ b/sway-lib-std/src/u128.sw @@ -144,13 +144,13 @@ impl From for (u64, u64) { } } -impl core::ops::Eq for U128 { +impl ::ops::Eq for U128 { fn eq(self, other: Self) -> bool { self.lower == other.lower && self.upper == other.upper } } -impl core::ops::Ord for U128 { +impl ::ops::Ord for U128 { fn gt(self, other: Self) -> bool { self.upper > other.upper || self.upper == other.upper && self.lower > other.lower } @@ -160,7 +160,7 @@ impl core::ops::Ord for U128 { } } -impl core::ops::OrdEq for U128 {} +impl ::ops::OrdEq for U128 {} impl u64 { /// Performs addition between two `u64` values, returning a `U128`. @@ -481,19 +481,19 @@ impl U128 { } } -impl core::ops::BitwiseAnd for U128 { +impl ::ops::BitwiseAnd for U128 { fn binary_and(self, other: Self) -> Self { Self::from((self.upper & other.upper, self.lower & other.lower)) } } -impl core::ops::BitwiseOr for U128 { +impl ::ops::BitwiseOr for U128 { fn binary_or(self, other: Self) -> Self { Self::from((self.upper | other.upper, self.lower | other.lower)) } } -impl core::ops::Shift for U128 { +impl ::ops::Shift for U128 { fn lsh(self, rhs: u64) -> Self { // If shifting by at least the number of bits, then saturate with // zeroes. @@ -543,7 +543,7 @@ impl core::ops::Shift for U128 { } } -impl core::ops::Not for U128 { +impl ::ops::Not for U128 { fn not(self) -> Self { Self { upper: !self.upper, @@ -552,7 +552,7 @@ impl core::ops::Not for U128 { } } -impl core::ops::Add for U128 { +impl ::ops::Add for U128 { /// Add a `U128` to a `U128`. Reverts on overflow. fn add(self, other: Self) -> Self { let mut upper_128 = self.upper.overflowing_add(other.upper); @@ -582,7 +582,7 @@ impl core::ops::Add for U128 { } } -impl core::ops::Subtract for U128 { +impl ::ops::Subtract for U128 { /// Subtract a `U128` from a `U128`. Reverts on underflow. fn subtract(self, other: Self) -> Self { // panic_on_overflow_enabled is also for underflow @@ -605,7 +605,7 @@ impl core::ops::Subtract for U128 { Self { upper, lower } } } -impl core::ops::Multiply for U128 { +impl ::ops::Multiply for U128 { /// Multiply a `U128` with a `U128`. Reverts of overflow. fn multiply(self, other: Self) -> Self { // in case both of the `U128` upper parts are bigger than zero, @@ -628,7 +628,7 @@ impl core::ops::Multiply for U128 { } } -impl core::ops::Divide for U128 { +impl ::ops::Divide for U128 { /// Divide a `U128` by a `U128`. Reverts if divisor is zero. fn divide(self, divisor: Self) -> Self { let zero = Self::from((0, 0)); @@ -865,7 +865,7 @@ impl Logarithm for U128 { } } -impl core::ops::TotalOrd for U128 { +impl ::ops::TotalOrd for U128 { fn min(self, other: Self) -> Self { if self < other { self } else { other } } diff --git a/sway-lib-std/src/vm/evm/evm_address.sw b/sway-lib-std/src/vm/evm/evm_address.sw index 554a44204a9..26691aea7ab 100644 --- a/sway-lib-std/src/vm/evm/evm_address.sw +++ b/sway-lib-std/src/vm/evm/evm_address.sw @@ -75,7 +75,7 @@ impl EvmAddress { } } -impl core::ops::Eq for EvmAddress { +impl ::ops::Eq for EvmAddress { fn eq(self, other: Self) -> bool { self.bits == other.bits } From 24361d7423306114cdc250e10d09aa12ec1db36e Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:23:53 +0530 Subject: [PATCH 08/29] move never and str, add core imports to prelude --- sway-lib-core/src/never.sw | 74 ------------------------------------ sway-lib-std/src/lib.sw | 1 + sway-lib-std/src/never.sw | 75 +++++++++++++++++++++++++++++++++++++ sway-lib-std/src/prelude.sw | 10 +++++ sway-lib-std/src/str.sw | 36 ++++++++++++++++++ 5 files changed, 122 insertions(+), 74 deletions(-) create mode 100644 sway-lib-std/src/never.sw create mode 100644 sway-lib-std/src/str.sw diff --git a/sway-lib-core/src/never.sw b/sway-lib-core/src/never.sw index af47b9c5222..316a905aa9b 100644 --- a/sway-lib-core/src/never.sw +++ b/sway-lib-core/src/never.sw @@ -1,75 +1 @@ library; - -use ::ops::{Eq, Not, Ord}; - -/// `!` represents the type of computations which never resolve to any value at all. -/// -/// # Additional Information -/// -/// `break`, `continue` and `return` expressions also have type `!`. For example we are allowed to -/// write: -/// -/// ```sway -/// let x: ! = { -/// return 123 -/// }; -/// ``` -/// -/// Although the `let` is pointless here, it illustrates the meaning of `!`. Since `x` is never -/// assigned a value (because `return` returns from the entire function), `x` can be given type -/// `Never`. We could also replace `return 123` with a `revert()` or a never-ending `loop` and this code -/// would still be valid. -/// -/// A more realistic usage of `Never` is in this code: -/// -/// ```sway -/// let num: u32 = match get_a_number() { -/// Some(num) => num, -/// None => break, -/// }; -/// ``` -/// -/// Both match arms must produce values of type [`u32`], but since `break` never produces a value -/// at all we know it can never produce a value which isn't a [`u32`]. This illustrates another -/// behaviour of the `!` type - expressions with type `!` will coerce into any other type. -/// -/// Note that `!` type coerces into any other type, another example of this would be: -/// -/// ```sway -/// let x: u32 = { -/// return 123 -/// }; -/// ``` -/// -/// Regardless of the type of `x`, the return block of type `Never` will always coerce into `x` type. -/// -/// # Examples -/// -/// ```sway -/// fn foo() { -/// let num: u64 = match Option::None:: { -/// Some(num) => num, -/// None => return, -/// }; -/// } -/// ``` -impl Not for ! { - fn not(self) -> Self { - match self {} - } -} - -impl Eq for ! { - fn eq(self, _other: Self) -> bool { - self - } -} - -impl Ord for ! { - fn gt(self, _other: Self) -> bool { - self - } - fn lt(self, _other: Self) -> bool { - self - } -} diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index f097127c456..f48fef9fb96 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -20,6 +20,7 @@ pub mod vec; pub mod bytes; pub mod flags; pub mod ops; +pub mod never; pub mod math; pub mod u128; pub mod b512; diff --git a/sway-lib-std/src/never.sw b/sway-lib-std/src/never.sw new file mode 100644 index 00000000000..af47b9c5222 --- /dev/null +++ b/sway-lib-std/src/never.sw @@ -0,0 +1,75 @@ +library; + +use ::ops::{Eq, Not, Ord}; + +/// `!` represents the type of computations which never resolve to any value at all. +/// +/// # Additional Information +/// +/// `break`, `continue` and `return` expressions also have type `!`. For example we are allowed to +/// write: +/// +/// ```sway +/// let x: ! = { +/// return 123 +/// }; +/// ``` +/// +/// Although the `let` is pointless here, it illustrates the meaning of `!`. Since `x` is never +/// assigned a value (because `return` returns from the entire function), `x` can be given type +/// `Never`. We could also replace `return 123` with a `revert()` or a never-ending `loop` and this code +/// would still be valid. +/// +/// A more realistic usage of `Never` is in this code: +/// +/// ```sway +/// let num: u32 = match get_a_number() { +/// Some(num) => num, +/// None => break, +/// }; +/// ``` +/// +/// Both match arms must produce values of type [`u32`], but since `break` never produces a value +/// at all we know it can never produce a value which isn't a [`u32`]. This illustrates another +/// behaviour of the `!` type - expressions with type `!` will coerce into any other type. +/// +/// Note that `!` type coerces into any other type, another example of this would be: +/// +/// ```sway +/// let x: u32 = { +/// return 123 +/// }; +/// ``` +/// +/// Regardless of the type of `x`, the return block of type `Never` will always coerce into `x` type. +/// +/// # Examples +/// +/// ```sway +/// fn foo() { +/// let num: u64 = match Option::None:: { +/// Some(num) => num, +/// None => return, +/// }; +/// } +/// ``` +impl Not for ! { + fn not(self) -> Self { + match self {} + } +} + +impl Eq for ! { + fn eq(self, _other: Self) -> bool { + self + } +} + +impl Ord for ! { + fn gt(self, _other: Self) -> bool { + self + } + fn lt(self, _other: Self) -> bool { + self + } +} diff --git a/sway-lib-std/src/prelude.sw b/sway-lib-std/src/prelude.sw index f8d42cf0044..ac460e7da83 100644 --- a/sway-lib-std/src/prelude.sw +++ b/sway-lib-std/src/prelude.sw @@ -37,3 +37,13 @@ pub use ::auth::msg_sender; // Math pub use ::math::*; + +// (Previously) core +pub use ::primitives::*; +pub use ::slice::*; +pub use ::ops::*; +pub use ::never::*; +pub use ::raw_ptr::*; +pub use ::raw_slice::*; +pub use ::codec::*; +pub use ::str::*; \ No newline at end of file diff --git a/sway-lib-std/src/str.sw b/sway-lib-std/src/str.sw new file mode 100644 index 00000000000..27ddb173682 --- /dev/null +++ b/sway-lib-std/src/str.sw @@ -0,0 +1,36 @@ +library; + +impl str { + /// Return a `raw_ptr` to the beginning of the string slice on the heap + pub fn as_ptr(self) -> raw_ptr { + let (ptr, _) = asm(s: self) { + s: (raw_ptr, u64) + }; + ptr + } + + /// Return the length of the string slice in bytes + pub fn len(self) -> u64 { + let (_, len) = asm(s: self) { + s: (raw_ptr, u64) + }; + len + } +} + +pub fn from_str_array(s: S) -> str { + __assert_is_str_array::(); + let str_size = __size_of_str_array::(); + let src = __addr_of(s); + + let ptr = asm(size: __size_of::(), dest, src: src) { + aloc size; + move dest hp; + mcp dest src size; + dest: raw_ptr + }; + + asm(s: (ptr, str_size)) { + s: str + } +} From 109c11bfed250ec893b9b5cd32a909a34653e48f Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:27:58 +0530 Subject: [PATCH 09/29] remove slice import - i tihnk unnecessary in ops --- sway-lib-std/src/ops.sw | 1 - 1 file changed, 1 deletion(-) diff --git a/sway-lib-std/src/ops.sw b/sway-lib-std/src/ops.sw index 867fefdb096..6d8918935ea 100644 --- a/sway-lib-std/src/ops.sw +++ b/sway-lib-std/src/ops.sw @@ -1,7 +1,6 @@ library; use ::primitives::*; -use ::slice::*; use ::assert::assert; use ::registers::flags; use ::flags::panic_on_overflow_enabled; From 33ace1bec5da7298663875c797f14c7e7d9670f2 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:31:42 +0530 Subject: [PATCH 10/29] add str to lib.sw --- sway-lib-std/src/lib.sw | 1 + 1 file changed, 1 insertion(+) diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index f48fef9fb96..af84b63f259 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -1,5 +1,6 @@ library; +pub mod str; pub mod raw_ptr; pub mod raw_slice; pub mod primitives; From d4d42dcc191926c6e59d2259d41dd23bef0390cc Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:34:36 +0530 Subject: [PATCH 11/29] add r# to str --- sway-lib-std/src/lib.sw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index af84b63f259..a17bc1e0538 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -1,6 +1,6 @@ library; -pub mod str; +pub mod r#str; pub mod raw_ptr; pub mod raw_slice; pub mod primitives; From 295bcb4080efe5c9d9df69aad8d6a9d210542240 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:38:24 +0530 Subject: [PATCH 12/29] remove original str impl --- sway-lib-core/src/str.sw | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/sway-lib-core/src/str.sw b/sway-lib-core/src/str.sw index 27ddb173682..316a905aa9b 100644 --- a/sway-lib-core/src/str.sw +++ b/sway-lib-core/src/str.sw @@ -1,36 +1 @@ library; - -impl str { - /// Return a `raw_ptr` to the beginning of the string slice on the heap - pub fn as_ptr(self) -> raw_ptr { - let (ptr, _) = asm(s: self) { - s: (raw_ptr, u64) - }; - ptr - } - - /// Return the length of the string slice in bytes - pub fn len(self) -> u64 { - let (_, len) = asm(s: self) { - s: (raw_ptr, u64) - }; - len - } -} - -pub fn from_str_array(s: S) -> str { - __assert_is_str_array::(); - let str_size = __size_of_str_array::(); - let src = __addr_of(s); - - let ptr = asm(size: __size_of::(), dest, src: src) { - aloc size; - move dest hp; - mcp dest src size; - dest: raw_ptr - }; - - asm(s: (ptr, str_size)) { - s: str - } -} From 39cb0ed6b1dab34ebf6b80aafa239f2bdb15b6c1 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:44:22 +0530 Subject: [PATCH 13/29] import AbiEncode where necessary --- sway-lib-std/src/assert.sw | 1 + sway-lib-std/src/bytes.sw | 1 + sway-lib-std/src/logging.sw | 2 ++ sway-lib-std/src/option.sw | 1 + sway-lib-std/src/result.sw | 1 + sway-lib-std/src/revert.sw | 1 + sway-lib-std/src/string.sw | 1 + sway-lib-std/src/vec.sw | 1 + 8 files changed, 9 insertions(+) diff --git a/sway-lib-std/src/assert.sw b/sway-lib-std/src/assert.sw index a3bb6e3e7f1..faca10a3dec 100644 --- a/sway-lib-std/src/assert.sw +++ b/sway-lib-std/src/assert.sw @@ -4,6 +4,7 @@ library; use ::logging::log; use ::revert::revert; use ::error_signals::{FAILED_ASSERT_EQ_SIGNAL, FAILED_ASSERT_NE_SIGNAL, FAILED_ASSERT_SIGNAL}; +use ::codec::AbiEncode /// Asserts that the given `condition` will always be `true` during runtime. /// diff --git a/sway-lib-std/src/bytes.sw b/sway-lib-std/src/bytes.sw index 50a02d3074c..ead4033693e 100644 --- a/sway-lib-std/src/bytes.sw +++ b/sway-lib-std/src/bytes.sw @@ -7,6 +7,7 @@ use ::intrinsics::size_of_val; use ::option::Option::{self, *}; use ::convert::{From, Into, *}; use ::clone::Clone; +use ::codec::AbiEncode; struct RawBytes { ptr: raw_ptr, diff --git a/sway-lib-std/src/logging.sw b/sway-lib-std/src/logging.sw index 900e6f1045e..83bd1351bc5 100644 --- a/sway-lib-std/src/logging.sw +++ b/sway-lib-std/src/logging.sw @@ -1,6 +1,8 @@ //! Allows logging of arbitrary stack types, emitted as either `Log` or `Logd` receipts. library; +use ::codec::AbiEncode; + /// Log any stack type. /// /// # Additional Information diff --git a/sway-lib-std/src/option.sw b/sway-lib-std/src/option.sw index 04d7019ac65..649f724b796 100644 --- a/sway-lib-std/src/option.sw +++ b/sway-lib-std/src/option.sw @@ -77,6 +77,7 @@ library; use ::logging::log; use ::result::Result; use ::revert::revert; +use ::codec::AbiEncode; // ANCHOR: docs_option /// A type that represents an optional value, either `Some(val)` or `None`. diff --git a/sway-lib-std/src/result.sw b/sway-lib-std/src/result.sw index 9b0532ee567..d1647e75141 100644 --- a/sway-lib-std/src/result.sw +++ b/sway-lib-std/src/result.sw @@ -57,6 +57,7 @@ library; use ::logging::log; use ::revert::revert; +use ::codec::AbiEncode; // ANCHOR: docs_result /// `Result` is a type that represents either success (`Ok`) or failure (`Err`). diff --git a/sway-lib-std/src/revert.sw b/sway-lib-std/src/revert.sw index f53dd5378d2..28ee3c2e182 100644 --- a/sway-lib-std/src/revert.sw +++ b/sway-lib-std/src/revert.sw @@ -3,6 +3,7 @@ library; use ::logging::log; use ::error_signals::{FAILED_REQUIRE_SIGNAL, REVERT_WITH_LOG_SIGNAL}; +use ::codec::AbiEncode; /// Will either panic or revert with a given number depending on the context. /// diff --git a/sway-lib-std/src/string.sw b/sway-lib-std/src/string.sw index abe9673dbdc..c51e58d249e 100644 --- a/sway-lib-std/src/string.sw +++ b/sway-lib-std/src/string.sw @@ -6,6 +6,7 @@ use ::bytes::*; use ::convert::*; use ::hash::{Hash, Hasher}; use ::option::Option; +use ::codec::AbiEncode; /// A UTF-8 encoded growable string. It has ownership over its buffer. /// diff --git a/sway-lib-std/src/vec.sw b/sway-lib-std/src/vec.sw index 5b7830b848c..5ebe05cc1af 100644 --- a/sway-lib-std/src/vec.sw +++ b/sway-lib-std/src/vec.sw @@ -6,6 +6,7 @@ use ::assert::assert; use ::option::Option::{self, *}; use ::convert::From; use ::iterator::*; +use ::codec::AbiEncode; struct RawVec { ptr: raw_ptr, From e4d696c3362557386e394ff8c5372235c283da1a Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:47:16 +0530 Subject: [PATCH 14/29] add missing ; --- sway-lib-std/src/assert.sw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sway-lib-std/src/assert.sw b/sway-lib-std/src/assert.sw index faca10a3dec..93bef15faa9 100644 --- a/sway-lib-std/src/assert.sw +++ b/sway-lib-std/src/assert.sw @@ -4,7 +4,7 @@ library; use ::logging::log; use ::revert::revert; use ::error_signals::{FAILED_ASSERT_EQ_SIGNAL, FAILED_ASSERT_NE_SIGNAL, FAILED_ASSERT_SIGNAL}; -use ::codec::AbiEncode +use ::codec::AbiEncode; /// Asserts that the given `condition` will always be `true` during runtime. /// From 2cad4ba20deb6dfbbe28a6535cde944c82942457 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:50:34 +0530 Subject: [PATCH 15/29] remove log in import for flags.sw --- sway-lib-std/src/flags.sw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sway-lib-std/src/flags.sw b/sway-lib-std/src/flags.sw index 956f5024218..77afaa6cc5b 100644 --- a/sway-lib-std/src/flags.sw +++ b/sway-lib-std/src/flags.sw @@ -1,7 +1,7 @@ //! Functionality for setting and unsetting FuelVM flags to modify behavior related to the `$err` and `$of` registers. library; -use ::{assert::assert, logging::log, registers::{error, flags}}; +use ::{assert::assert, registers::{error, flags}}; // Mask second bit, which is `F_WRAPPING`. pub const F_WRAPPING_DISABLE_MASK: u64 = 0b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000010; From 06b2172cad53d23f66fde10be9ae872fe39d9eea Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 13:56:20 +0530 Subject: [PATCH 16/29] remove assert and error from flags import --- sway-lib-std/src/flags.sw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sway-lib-std/src/flags.sw b/sway-lib-std/src/flags.sw index 77afaa6cc5b..0dfb6048d2e 100644 --- a/sway-lib-std/src/flags.sw +++ b/sway-lib-std/src/flags.sw @@ -1,7 +1,7 @@ //! Functionality for setting and unsetting FuelVM flags to modify behavior related to the `$err` and `$of` registers. library; -use ::{assert::assert, registers::{error, flags}}; +use ::registers::flags; // Mask second bit, which is `F_WRAPPING`. pub const F_WRAPPING_DISABLE_MASK: u64 = 0b00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000010; From f5b1f1ef95a4894e8529098c8ed8ec5765da2dce Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 14:01:59 +0530 Subject: [PATCH 17/29] move out tests from ops lib --- sway-lib-std/src/ops.sw | 11 ----------- test/src/in_language_tests/Forc.toml | 1 + .../test_programs/ops_inline_tests/Forc.toml | 8 ++++++++ .../test_programs/ops_inline_tests/src/main.sw | 11 +++++++++++ 4 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 test/src/in_language_tests/test_programs/ops_inline_tests/Forc.toml create mode 100644 test/src/in_language_tests/test_programs/ops_inline_tests/src/main.sw diff --git a/sway-lib-std/src/ops.sw b/sway-lib-std/src/ops.sw index 6d8918935ea..bd6d3ca9d1d 100644 --- a/sway-lib-std/src/ops.sw +++ b/sway-lib-std/src/ops.sw @@ -1,7 +1,6 @@ library; use ::primitives::*; -use ::assert::assert; use ::registers::flags; use ::flags::panic_on_overflow_enabled; @@ -1400,13 +1399,3 @@ impl Eq for str { } } } - -#[test] -pub fn ok_str_eq() { - assert("" == ""); - assert("a" == "a"); - - assert("a" != ""); - assert("" != "a"); - assert("a" != "b"); -} diff --git a/test/src/in_language_tests/Forc.toml b/test/src/in_language_tests/Forc.toml index b2f198bf2f7..c82c4684b07 100644 --- a/test/src/in_language_tests/Forc.toml +++ b/test/src/in_language_tests/Forc.toml @@ -43,4 +43,5 @@ members = [ "test_programs/primitive_conversions_u256_inline_tests", "test_programs/vm_evm_evm_address_inline_tests", "test_programs/vm_evm_ecr_inline_tests", + "test_programs/ops_inline_tests", ] diff --git a/test/src/in_language_tests/test_programs/ops_inline_tests/Forc.toml b/test/src/in_language_tests/test_programs/ops_inline_tests/Forc.toml new file mode 100644 index 00000000000..b9e67b715c2 --- /dev/null +++ b/test/src/in_language_tests/test_programs/ops_inline_tests/Forc.toml @@ -0,0 +1,8 @@ +[project] +authors = ["Fuel Labs "] +entry = "main.sw" +license = "Apache-2.0" +name = "ops_inline_tests" + +[dependencies] +std = { path = "../../../../../sway-lib-std" } diff --git a/test/src/in_language_tests/test_programs/ops_inline_tests/src/main.sw b/test/src/in_language_tests/test_programs/ops_inline_tests/src/main.sw new file mode 100644 index 00000000000..b7ba1dbf655 --- /dev/null +++ b/test/src/in_language_tests/test_programs/ops_inline_tests/src/main.sw @@ -0,0 +1,11 @@ +library; + +#[test] +pub fn str_eq_test() { + assert("" == ""); + assert("a" == "a"); + + assert("a" != ""); + assert("" != "a"); + assert("a" != "b"); +} From 140e97c4af823dd93add88d85967879b7d30631f Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 14:12:55 +0530 Subject: [PATCH 18/29] remove primitive conversions dependency from codec --- sway-lib-std/src/codec.sw | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/sway-lib-std/src/codec.sw b/sway-lib-std/src/codec.sw index 3c65de44f23..18d9e9153b8 100644 --- a/sway-lib-std/src/codec.sw +++ b/sway-lib-std/src/codec.sw @@ -2557,22 +2557,32 @@ impl AbiDecode for u64 { } } +pub fn as_u16(u8) -> u16 { + asm(input: u8) { + input: u16 + } +} + +pub fn as_u32(u8) -> u32 { + asm(input: u8) { + input: u32 + } +} + impl AbiDecode for u32 { fn abi_decode(ref mut buffer: BufferReader) -> u32 { - use ::primitive_conversions::u8::*; - let a = buffer.read::().as_u32(); - let b = buffer.read::().as_u32(); - let c = buffer.read::().as_u32(); - let d = buffer.read::().as_u32(); + let a = as_u32(buffer.read::()); + let b = as_u32(buffer.read::()); + let c = as_u32(buffer.read::()); + let d = as_u32(buffer.read::()); (a << 24) | (b << 16) | (c << 8) | d } } impl AbiDecode for u16 { fn abi_decode(ref mut buffer: BufferReader) -> u16 { - use ::primitive_conversions::u8::*; - let a = buffer.read::().as_u16(); - let b = buffer.read::().as_u16(); + let a = as_u16(buffer.read::()); + let b = as_u16(buffer.read::()); (a << 8) | b } } From 928d5276040c19130f981e7ecdfe5b924f734687 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 14:15:45 +0530 Subject: [PATCH 19/29] fix typo --- sway-lib-std/src/codec.sw | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sway-lib-std/src/codec.sw b/sway-lib-std/src/codec.sw index 18d9e9153b8..5eb70e86fb2 100644 --- a/sway-lib-std/src/codec.sw +++ b/sway-lib-std/src/codec.sw @@ -2557,14 +2557,14 @@ impl AbiDecode for u64 { } } -pub fn as_u16(u8) -> u16 { - asm(input: u8) { +pub fn as_u16(input: u8) -> u16 { + asm(input: input) { input: u16 } } -pub fn as_u32(u8) -> u32 { - asm(input: u8) { +pub fn as_u32(input: u8) -> u32 { + asm(input: input) { input: u32 } } From 7940ce2bb9323d33eb303f5d1490b9a1c64c04c1 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 18 Nov 2024 14:15:58 +0530 Subject: [PATCH 20/29] fmt --- sway-lib-std/src/prelude.sw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sway-lib-std/src/prelude.sw b/sway-lib-std/src/prelude.sw index ac460e7da83..2f8808583aa 100644 --- a/sway-lib-std/src/prelude.sw +++ b/sway-lib-std/src/prelude.sw @@ -46,4 +46,4 @@ pub use ::never::*; pub use ::raw_ptr::*; pub use ::raw_slice::*; pub use ::codec::*; -pub use ::str::*; \ No newline at end of file +pub use ::str::*; From e809184c20655d0a0e6173b27152d30f4d48a161 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Tue, 7 Jan 2025 12:47:23 +0530 Subject: [PATCH 21/29] progress --- sway-lib-std/src/alloc.sw | 3 +++ sway-lib-std/src/assert.sw | 2 ++ sway-lib-std/src/bytes.sw | 6 ++++-- sway-lib-std/src/constants.sw | 2 ++ sway-lib-std/src/flags.sw | 12 ++++++------ sway-lib-std/src/lib.sw | 16 ++++++++-------- sway-lib-std/src/math.sw | 1 + sway-lib-std/src/ops.sw | 12 ++++++------ sway-lib-std/src/option.sw | 3 ++- sway-lib-std/src/raw_ptr.sw | 8 +------- sway-lib-std/src/result.sw | 1 + sway-lib-std/src/revert.sw | 1 + sway-lib-std/src/vec.sw | 4 +++- 13 files changed, 40 insertions(+), 31 deletions(-) diff --git a/sway-lib-std/src/alloc.sw b/sway-lib-std/src/alloc.sw index bd3dd7cc095..62bccb902ed 100644 --- a/sway-lib-std/src/alloc.sw +++ b/sway-lib-std/src/alloc.sw @@ -1,6 +1,9 @@ //! A library for allocating memory inspired by [Rust's std::alloc](https://doc.rust-lang.org/std/alloc/index.html). library; +use ::ops::*; +use ::raw_ptr::*; + /// Allocates zeroed memory on the heap. /// /// # Additional Information diff --git a/sway-lib-std/src/assert.sw b/sway-lib-std/src/assert.sw index 93bef15faa9..b42e315d508 100644 --- a/sway-lib-std/src/assert.sw +++ b/sway-lib-std/src/assert.sw @@ -5,6 +5,8 @@ use ::logging::log; use ::revert::revert; use ::error_signals::{FAILED_ASSERT_EQ_SIGNAL, FAILED_ASSERT_NE_SIGNAL, FAILED_ASSERT_SIGNAL}; use ::codec::AbiEncode; +use ::ops::*; +use ::never::*; /// Asserts that the given `condition` will always be `true` during runtime. /// diff --git a/sway-lib-std/src/bytes.sw b/sway-lib-std/src/bytes.sw index ead4033693e..796352af6a6 100644 --- a/sway-lib-std/src/bytes.sw +++ b/sway-lib-std/src/bytes.sw @@ -7,7 +7,9 @@ use ::intrinsics::size_of_val; use ::option::Option::{self, *}; use ::convert::{From, Into, *}; use ::clone::Clone; -use ::codec::AbiEncode; +use ::codec::*; +use ::raw_slice::*; +use ::ops::*; struct RawBytes { ptr: raw_ptr, @@ -725,7 +727,7 @@ impl Bytes { } } -impl ::ops::Eq for Bytes { +impl Eq for Bytes { fn eq(self, other: Self) -> bool { if self.len != other.len { return false; diff --git a/sway-lib-std/src/constants.sw b/sway-lib-std/src/constants.sw index 68cecbfb965..308ab9a85c4 100644 --- a/sway-lib-std/src/constants.sw +++ b/sway-lib-std/src/constants.sw @@ -1,6 +1,8 @@ //! Definitions for constant values in Sway. library; +use ::primitives::*; + /// A b256 of zero value. /// /// # Additional Information diff --git a/sway-lib-std/src/flags.sw b/sway-lib-std/src/flags.sw index 0dfb6048d2e..3958291930c 100644 --- a/sway-lib-std/src/flags.sw +++ b/sway-lib-std/src/flags.sw @@ -82,7 +82,7 @@ pub fn disable_panic_on_overflow() -> u64 { // Get the current value of the flags register and mask it, setting the // masked bit. Flags are inverted, so set = off. - let flag_val = prior_flags | F_WRAPPING_DISABLE_MASK; + let flag_val = __or(prior_flags, F_WRAPPING_DISABLE_MASK); asm(flag_val: flag_val) { flag flag_val; } @@ -115,7 +115,7 @@ pub fn disable_panic_on_overflow() -> u64 { pub fn enable_panic_on_overflow() { // Get the current value of the flags register and mask it, unsetting the // masked bit. Flags are inverted, so unset = on. - let flag_val = flags() & F_WRAPPING_ENABLE_MASK; + let flag_val = __and(flags(), F_WRAPPING_ENABLE_MASK); asm(flag_val: flag_val) { flag flag_val; } @@ -170,7 +170,7 @@ pub fn disable_panic_on_unsafe_math() -> u64 { // Get the current value of the flags register and mask it, setting the // masked bit. Flags are inverted, so set = off. - let flag_val = prior_flags | F_UNSAFEMATH_DISABLE_MASK; + let flag_val = __or(prior_flags, F_UNSAFEMATH_DISABLE_MASK); asm(flag_val: flag_val) { flag flag_val; } @@ -205,7 +205,7 @@ pub fn disable_panic_on_unsafe_math() -> u64 { pub fn enable_panic_on_unsafe_math() { // Get the current value of the flags register and mask it, unsetting the // masked bit. Flags are inverted, so unset = on. - let flag_val = flags() & F_UNSAFEMATH_ENABLE_MASK; + let flag_val = __and(flags(), F_UNSAFEMATH_ENABLE_MASK); asm(flag_val: flag_val) { flag flag_val; } @@ -229,7 +229,7 @@ pub fn enable_panic_on_unsafe_math() { /// } /// ``` pub fn panic_on_overflow_enabled() -> bool { - (flags() & F_WRAPPING_DISABLE_MASK) == 0 + __eq(__and(flags(), F_WRAPPING_DISABLE_MASK), 0) } /// Checks if the `panic-on-unsafe-math` flag is set in the FuelVM. @@ -250,5 +250,5 @@ pub fn panic_on_overflow_enabled() -> bool { /// } /// ``` pub fn panic_on_unsafe_math_enabled() -> bool { - (flags() & F_UNSAFEMATH_DISABLE_MASK) == 0 + __eq(__and(flags(), F_UNSAFEMATH_DISABLE_MASK), 0) } diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index a17bc1e0538..c896c40bb56 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -1,31 +1,31 @@ library; pub mod r#str; -pub mod raw_ptr; -pub mod raw_slice; pub mod primitives; pub mod slice; pub mod constants; pub mod error_signals; pub mod logging; pub mod revert; -pub mod result; -pub mod option; pub mod assert; pub mod convert; pub mod intrinsics; -pub mod alloc; pub mod registers; pub mod iterator; pub mod vec; -pub mod bytes; pub mod flags; pub mod ops; +pub mod bytes; +pub mod alloc; +pub mod result; +pub mod option; +pub mod raw_ptr; +pub mod raw_slice; pub mod never; -pub mod math; -pub mod u128; pub mod b512; pub mod primitive_conversions; +pub mod math; +pub mod u128; pub mod codec; pub mod alias; pub mod hash; diff --git a/sway-lib-std/src/math.sw b/sway-lib-std/src/math.sw index 6ffd4071865..90227724597 100644 --- a/sway-lib-std/src/math.sw +++ b/sway-lib-std/src/math.sw @@ -11,6 +11,7 @@ use ::flags::{ set_flags, }; use ::registers::{flags, overflow}; +use ::primitive_conversions::{u8::*, u16::*, u32::*, u64::*, u256::*}; /// Calculates the square root. pub trait Root { diff --git a/sway-lib-std/src/ops.sw b/sway-lib-std/src/ops.sw index bd6d3ca9d1d..1a1674b661c 100644 --- a/sway-lib-std/src/ops.sw +++ b/sway-lib-std/src/ops.sw @@ -62,7 +62,7 @@ impl Add for u32 { let res = __add(self, other); // integer overflow if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { + if panic_on_overflow_enabled() { __revert(0) } else { // overflow enabled @@ -80,7 +80,7 @@ impl Add for u16 { fn add(self, other: Self) -> Self { let res = __add(self, other); if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { + if panic_on_overflow_enabled() { __revert(0) } else { // overflow enabled @@ -106,7 +106,7 @@ impl Add for u8 { input: u64 }; if __gt(res_u64, max_u8_u64) { - if panic_on_overflow_is_enabled() { + if panic_on_overflow_enabled() { __revert(0) } else { // overflow enabled @@ -251,7 +251,7 @@ impl Multiply for u32 { // constants (like Self::max() below) are also automatically promoted to u64 let res = __mul(self, other); if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { + if panic_on_overflow_enabled() { // integer overflow __revert(0) } else { @@ -270,7 +270,7 @@ impl Multiply for u16 { fn multiply(self, other: Self) -> Self { let res = __mul(self, other); if __gt(res, Self::max()) { - if panic_on_overflow_is_enabled() { + if panic_on_overflow_enabled() { __revert(0) } else { __mod(res, __add(Self::max(), 1)) @@ -294,7 +294,7 @@ impl Multiply for u8 { input: u64 }; if __gt(res_u64, max_u8_u64) { - if panic_on_overflow_is_enabled() { + if panic_on_overflow_enabled() { __revert(0) } else { // overflow enabled diff --git a/sway-lib-std/src/option.sw b/sway-lib-std/src/option.sw index 649f724b796..db132bab6a9 100644 --- a/sway-lib-std/src/option.sw +++ b/sway-lib-std/src/option.sw @@ -78,6 +78,7 @@ use ::logging::log; use ::result::Result; use ::revert::revert; use ::codec::AbiEncode; +use ::ops::*; // ANCHOR: docs_option /// A type that represents an optional value, either `Some(val)` or `None`. @@ -89,7 +90,7 @@ pub enum Option { } // ANCHOR_END: docs_option -impl ::ops::Eq for Option +impl Eq for Option where T: Eq, { diff --git a/sway-lib-std/src/raw_ptr.sw b/sway-lib-std/src/raw_ptr.sw index df4458863a0..668d9039b8d 100644 --- a/sway-lib-std/src/raw_ptr.sw +++ b/sway-lib-std/src/raw_ptr.sw @@ -1,12 +1,6 @@ library; -use ::ops::Eq; - -impl Eq for raw_ptr { - fn eq(self, other: Self) -> bool { - __eq(self, other) - } -} +use ::ops::*; impl raw_ptr { /// Returns `true` if the pointer is null. diff --git a/sway-lib-std/src/result.sw b/sway-lib-std/src/result.sw index d1647e75141..394eb2c79d4 100644 --- a/sway-lib-std/src/result.sw +++ b/sway-lib-std/src/result.sw @@ -58,6 +58,7 @@ library; use ::logging::log; use ::revert::revert; use ::codec::AbiEncode; +use ::ops::*; // ANCHOR: docs_result /// `Result` is a type that represents either success (`Ok`) or failure (`Err`). diff --git a/sway-lib-std/src/revert.sw b/sway-lib-std/src/revert.sw index 28ee3c2e182..67f2f698d9c 100644 --- a/sway-lib-std/src/revert.sw +++ b/sway-lib-std/src/revert.sw @@ -4,6 +4,7 @@ library; use ::logging::log; use ::error_signals::{FAILED_REQUIRE_SIGNAL, REVERT_WITH_LOG_SIGNAL}; use ::codec::AbiEncode; +use ::never::*; /// Will either panic or revert with a given number depending on the context. /// diff --git a/sway-lib-std/src/vec.sw b/sway-lib-std/src/vec.sw index 5ebe05cc1af..7be6b22cab5 100644 --- a/sway-lib-std/src/vec.sw +++ b/sway-lib-std/src/vec.sw @@ -6,7 +6,9 @@ use ::assert::assert; use ::option::Option::{self, *}; use ::convert::From; use ::iterator::*; -use ::codec::AbiEncode; +use ::codec::*; +use ::ops::*; +use ::raw_slice::*; struct RawVec { ptr: raw_ptr, From f62e3f1572e2704edaa69414bbb17901a81ca5e2 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Thu, 23 Jan 2025 15:52:43 +0530 Subject: [PATCH 22/29] remove todo stuff --- sway-lib-std/src/primitive_conversions/u16.sw | 5 ----- sway-lib-std/src/primitive_conversions/u32.sw | 5 ----- sway-lib-std/src/primitive_conversions/u64.sw | 2 -- sway-lib-std/src/primitive_conversions/u8.sw | 3 --- 4 files changed, 15 deletions(-) diff --git a/sway-lib-std/src/primitive_conversions/u16.sw b/sway-lib-std/src/primitive_conversions/u16.sw index 50d412b5fc4..5e8a4ca34b7 100644 --- a/sway-lib-std/src/primitive_conversions/u16.sw +++ b/sway-lib-std/src/primitive_conversions/u16.sw @@ -46,10 +46,7 @@ impl u16 { input: u64 } } -} -// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved -impl u16 { /// Extends a `u16` to a `u256`. /// /// # Returns @@ -71,9 +68,7 @@ impl u16 { input: u256 } } -} -impl u16 { /// Attempts to convert the u16 value into a u8 value. /// /// # Additional Information diff --git a/sway-lib-std/src/primitive_conversions/u32.sw b/sway-lib-std/src/primitive_conversions/u32.sw index f5072a12c8d..b50e223ab48 100644 --- a/sway-lib-std/src/primitive_conversions/u32.sw +++ b/sway-lib-std/src/primitive_conversions/u32.sw @@ -25,10 +25,7 @@ impl u32 { input: u64 } } -} -// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved -impl u32 { /// Extends a `u32` to a `u256`. /// /// # Returns @@ -50,9 +47,7 @@ impl u32 { input: u256 } } -} -impl u32 { /// Attempts to convert the u32 value into a u8 value. /// /// # Additional Information diff --git a/sway-lib-std/src/primitive_conversions/u64.sw b/sway-lib-std/src/primitive_conversions/u64.sw index 40e3fbbb79e..828031399e2 100644 --- a/sway-lib-std/src/primitive_conversions/u64.sw +++ b/sway-lib-std/src/primitive_conversions/u64.sw @@ -26,9 +26,7 @@ impl u64 { input: u256 } } -} -impl u64 { /// Attempts to convert the u64 value into a u8 value. /// /// # Additional Information diff --git a/sway-lib-std/src/primitive_conversions/u8.sw b/sway-lib-std/src/primitive_conversions/u8.sw index f4f2fdcad47..2b3f4f4f6c4 100644 --- a/sway-lib-std/src/primitive_conversions/u8.sw +++ b/sway-lib-std/src/primitive_conversions/u8.sw @@ -67,10 +67,7 @@ impl u8 { input: u64 } } -} -// TODO: This must be in a separate impl block until https://github.com/FuelLabs/sway/issues/1548 is resolved -impl u8 { /// Extends a `u8` to a `u256`. /// /// # Returns From 1bd6641ed9144f08115ccc59de47da8e0d3db97c Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 27 Jan 2025 15:50:39 +0530 Subject: [PATCH 23/29] rid of all but 1 error --- sway-lib-std/src/address.sw | 4 +- sway-lib-std/src/asset_id.sw | 10 +- sway-lib-std/src/b512.sw | 4 +- sway-lib-std/src/block.sw | 2 + sway-lib-std/src/call_frames.sw | 2 + sway-lib-std/src/contract_id.sw | 11 +- sway-lib-std/src/identity.sw | 3 +- sway-lib-std/src/inputs.sw | 7 +- sway-lib-std/src/lib.sw | 14 +- sway-lib-std/src/low_level_call.sw | 1 + sway-lib-std/src/math.sw | 120 ----------------- sway-lib-std/src/message.sw | 1 + sway-lib-std/src/ops.sw | 120 +++++++++++++++++ sway-lib-std/src/outputs.sw | 5 +- .../src/primitive_conversions/b256.sw | 30 +---- sway-lib-std/src/primitive_conversions/str.sw | 2 + sway-lib-std/src/primitive_conversions/u16.sw | 13 +- .../src/primitive_conversions/u256.sw | 32 +---- sway-lib-std/src/primitive_conversions/u32.sw | 13 +- sway-lib-std/src/primitive_conversions/u64.sw | 12 +- sway-lib-std/src/primitive_conversions/u8.sw | 12 +- sway-lib-std/src/storage/storage_api.sw | 2 + sway-lib-std/src/string.sw | 4 +- sway-lib-std/src/tx.sw | 3 +- sway-lib-std/src/u128.sw | 127 ++++++++++++++++-- sway-lib-std/src/vm/evm/evm_address.sw | 4 +- 26 files changed, 302 insertions(+), 256 deletions(-) diff --git a/sway-lib-std/src/address.sw b/sway-lib-std/src/address.sw index c28e20e0537..a9e408a9e0a 100644 --- a/sway-lib-std/src/address.sw +++ b/sway-lib-std/src/address.sw @@ -3,6 +3,8 @@ library; use ::convert::From; use ::hash::{Hash, Hasher}; +use ::ops::Eq; +use ::primitives::*; /// The `Address` type, a struct wrapper around the inner `b256` value. pub struct Address { @@ -68,7 +70,7 @@ impl Address { } } -impl ::ops::Eq for Address { +impl Eq for Address { fn eq(self, other: Self) -> bool { self.bits == other.bits } diff --git a/sway-lib-std/src/asset_id.sw b/sway-lib-std/src/asset_id.sw index c41430ddd58..80b0bba92ac 100644 --- a/sway-lib-std/src/asset_id.sw +++ b/sway-lib-std/src/asset_id.sw @@ -5,6 +5,8 @@ use ::alias::SubId; use ::contract_id::ContractId; use ::convert::From; use ::hash::{Hash, Hasher}; +use ::ops::Eq; +use ::primitives::*; /// An AssetId is used for interacting with an asset on the network. /// @@ -27,7 +29,7 @@ impl Hash for AssetId { } } -impl ::ops::Eq for AssetId { +impl Eq for AssetId { fn eq(self, other: Self) -> bool { self.bits == other.bits } @@ -81,7 +83,7 @@ impl AssetId { /// } /// ``` pub fn new(contract_id: ContractId, sub_id: SubId) -> Self { - let result_buffer = 0x0000000000000000000000000000000000000000000000000000000000000000; + let result_buffer = b256::zero(); asm( asset_id: result_buffer, ptr: (contract_id, sub_id), @@ -120,12 +122,12 @@ impl AssetId { let contract_id = asm() { fp: b256 }; - let result_buffer = 0x0000000000000000000000000000000000000000000000000000000000000000; + let result_buffer = b256::zero(); asm( asset_id: result_buffer, ptr: ( contract_id, - 0x0000000000000000000000000000000000000000000000000000000000000000, + b256::zero(), ), bytes: 64, ) { diff --git a/sway-lib-std/src/b512.sw b/sway-lib-std/src/b512.sw index 5ef426a7cfa..7ce1b23e61b 100644 --- a/sway-lib-std/src/b512.sw +++ b/sway-lib-std/src/b512.sw @@ -2,6 +2,8 @@ library; use ::convert::From; +use ::ops::*; +use ::primitives::*; /// Stores two `b256`s in contiguous memory. /// Guaranteed to be contiguous for use with ec-recover: `std::ecr::ec_recover`. @@ -10,7 +12,7 @@ pub struct B512 { bits: [b256; 2], } -impl ::ops::Eq for B512 { +impl Eq for B512 { fn eq(self, other: Self) -> bool { (self.bits)[0] == (other.bits)[0] && (self.bits)[1] == (other.bits)[1] } diff --git a/sway-lib-std/src/block.sw b/sway-lib-std/src/block.sw index dc9e597962e..8d57e631652 100644 --- a/sway-lib-std/src/block.sw +++ b/sway-lib-std/src/block.sw @@ -4,6 +4,8 @@ library; use ::assert::assert; use ::result::Result::{self, *}; use ::logging::log; +use ::primitives::*; +use ::ops::*; /// Error type for when the block hash cannot be found. pub enum BlockHashError { diff --git a/sway-lib-std/src/call_frames.sw b/sway-lib-std/src/call_frames.sw index 659e9dbbc81..fad2673e391 100644 --- a/sway-lib-std/src/call_frames.sw +++ b/sway-lib-std/src/call_frames.sw @@ -6,6 +6,8 @@ use ::asset_id::AssetId; use ::contract_id::ContractId; use ::intrinsics::is_reference_type; use ::registers::frame_ptr; +use ::raw_ptr::*; +use ::codec::*; // Note that everything when serialized is padded to word length. // diff --git a/sway-lib-std/src/contract_id.sw b/sway-lib-std/src/contract_id.sw index c16113f392b..a6eb2c96d52 100644 --- a/sway-lib-std/src/contract_id.sw +++ b/sway-lib-std/src/contract_id.sw @@ -3,6 +3,9 @@ library; use ::convert::From; use ::hash::{Hash, Hasher}; +use ::ops::Eq; +use ::primitives::*; +use ::codec::*; /// The `ContractId` type, a struct wrapper around the inner `b256` value. pub struct ContractId { @@ -30,7 +33,7 @@ impl ContractId { } } -impl ::ops::Eq for ContractId { +impl Eq for ContractId { fn eq(self, other: Self) -> bool { self.bits == other.bits } @@ -154,3 +157,9 @@ impl ContractId { self.bits == b256::zero() } } + +impl AbiEncode for ContractId { + fn abi_encode(self, buffer: Buffer) -> Buffer { + self.bits.abi_encode(buffer) + } +} \ No newline at end of file diff --git a/sway-lib-std/src/identity.sw b/sway-lib-std/src/identity.sw index 06970e6fd94..c9fdcf24538 100644 --- a/sway-lib-std/src/identity.sw +++ b/sway-lib-std/src/identity.sw @@ -10,6 +10,7 @@ use ::asset_id::AssetId; use ::contract_id::ContractId; use ::hash::{Hash, Hasher}; use ::option::Option::{self, *}; +use ::ops::Eq; /// The `Identity` type: either an `Address` or a `ContractId`. // ANCHOR: docs_identity @@ -19,7 +20,7 @@ pub enum Identity { } // ANCHOR_END: docs_identity -impl ::ops::Eq for Identity { +impl Eq for Identity { fn eq(self, other: Self) -> bool { match (self, other) { (Identity::Address(addr1), Identity::Address(addr2)) => addr1 == addr2, diff --git a/sway-lib-std/src/inputs.sw b/sway-lib-std/src/inputs.sw index c5061b310f6..146d171b247 100644 --- a/sway-lib-std/src/inputs.sw +++ b/sway-lib-std/src/inputs.sw @@ -19,6 +19,9 @@ use ::tx::{ }; use ::ops::Eq; use ::revert::revert; +use ::primitive_conversions::u16::*; +use ::codec::*; +use ::raw_slice::*; // GTF Opcode const selectors pub const GTF_INPUT_TYPE = 0x200; @@ -281,8 +284,8 @@ where T: AbiDecode, { match input_type(index) { - Some(Input::Coin) => Some(::codec::decode_predicate_data_by_index::(index)), - Some(Input::Message) => Some(::codec::decode_predicate_data_by_index::(index)), + Some(Input::Coin) => Some(decode_predicate_data_by_index::(index)), + Some(Input::Message) => Some(decode_predicate_data_by_index::(index)), _ => None, } } diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index c896c40bb56..b4a502a5633 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -1,7 +1,13 @@ library; +pub mod registers; +pub mod flags; pub mod r#str; pub mod primitives; +pub mod ops; +pub mod raw_ptr; +pub mod raw_slice; +pub mod codec; pub mod slice; pub mod constants; pub mod error_signals; @@ -10,23 +16,17 @@ pub mod revert; pub mod assert; pub mod convert; pub mod intrinsics; -pub mod registers; pub mod iterator; pub mod vec; -pub mod flags; -pub mod ops; pub mod bytes; pub mod alloc; pub mod result; pub mod option; -pub mod raw_ptr; -pub mod raw_slice; pub mod never; pub mod b512; +pub mod u128; pub mod primitive_conversions; pub mod math; -pub mod u128; -pub mod codec; pub mod alias; pub mod hash; pub mod asset_id; diff --git a/sway-lib-std/src/low_level_call.sw b/sway-lib-std/src/low_level_call.sw index 7ae93606f99..5102c5244a5 100644 --- a/sway-lib-std/src/low_level_call.sw +++ b/sway-lib-std/src/low_level_call.sw @@ -6,6 +6,7 @@ use ::assert::assert; use ::asset_id::AssetId; use ::bytes::Bytes; use ::contract_id::ContractId; +use ::codec::*; use ::option::Option; use ::revert::require; use ::vec::Vec; diff --git a/sway-lib-std/src/math.sw b/sway-lib-std/src/math.sw index 90227724597..8c79fd1f059 100644 --- a/sway-lib-std/src/math.sw +++ b/sway-lib-std/src/math.sw @@ -394,123 +394,3 @@ impl Logarithm for u256 { result } } - -impl u8 { - /// Returns whether a `u8` is set to zero. - /// - /// # Returns - /// - /// * [bool] -> True if the `u8` is zero, otherwise false. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u8 = u8::zero(); - /// assert(zero_u8.is_zero()); - /// } - /// ``` - pub fn is_zero(self) -> bool { - self == 0u8 - } -} - -impl u16 { - /// Returns whether a `u16` is set to zero. - /// - /// # Returns - /// - /// * [bool] -> True if the `u16` is zero, otherwise false. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u16 = u16::zero(); - /// assert(zero_u16.is_zero()); - /// } - /// ``` - pub fn is_zero(self) -> bool { - self == 0u16 - } -} - -impl u32 { - /// Returns whether a `u32` is set to zero. - /// - /// # Returns - /// - /// * [bool] -> True if the `u32` is zero, otherwise false. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u32 = u32::zero(); - /// assert(zero_u32.is_zero()); - /// } - /// ``` - pub fn is_zero(self) -> bool { - self == 0u32 - } -} - -impl u64 { - /// Returns whether a `u64` is set to zero. - /// - /// # Returns - /// - /// * [bool] -> True if the `u64` is zero, otherwise false. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u64 = u64::zero(); - /// assert(zero_u64.is_zero()); - /// } - /// ``` - pub fn is_zero(self) -> bool { - self == 0u64 - } -} - -impl u256 { - /// Returns whether a `u256` is set to zero. - /// - /// # Returns - /// - /// * [bool] -> True if the `u256` is zero, otherwise false. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_u256 = u256::zero(); - /// assert(zero_u256.is_zero()); - /// } - /// ``` - pub fn is_zero(self) -> bool { - self == 0x00u256 - } -} - -impl b256 { - /// Returns whether a `b256` is set to zero. - /// - /// # Returns - /// - /// * [bool] -> True if the `b256` is zero, otherwise false. - /// - /// # Examples - /// - /// ```sway - /// fn foo() { - /// let zero_b256 = b256::zero(); - /// assert(zero_b256.is_zero()); - /// } - /// ``` - pub fn is_zero(self) -> bool { - self == 0x0000000000000000000000000000000000000000000000000000000000000000 - } -} diff --git a/sway-lib-std/src/message.sw b/sway-lib-std/src/message.sw index 0d70bcac129..28b5db9e72f 100644 --- a/sway-lib-std/src/message.sw +++ b/sway-lib-std/src/message.sw @@ -5,6 +5,7 @@ use ::alloc::alloc_bytes; use ::bytes::Bytes; use ::outputs::{Output, output_count, output_type}; use ::revert::revert; +use ::ops::*; /// Sends a message `msg_data` to `recipient` with a `coins` amount of the base asset. /// diff --git a/sway-lib-std/src/ops.sw b/sway-lib-std/src/ops.sw index 1a1674b661c..250f32747e6 100644 --- a/sway-lib-std/src/ops.sw +++ b/sway-lib-std/src/ops.sw @@ -1399,3 +1399,123 @@ impl Eq for str { } } } + +impl u8 { + /// Returns whether a `u8` is set to zero. + /// + /// # Returns + /// + /// * [bool] -> True if the `u8` is zero, otherwise false. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u8 = u8::zero(); + /// assert(zero_u8.is_zero()); + /// } + /// ``` + pub fn is_zero(self) -> bool { + self == 0u8 + } +} + +impl u16 { + /// Returns whether a `u16` is set to zero. + /// + /// # Returns + /// + /// * [bool] -> True if the `u16` is zero, otherwise false. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u16 = u16::zero(); + /// assert(zero_u16.is_zero()); + /// } + /// ``` + pub fn is_zero(self) -> bool { + self == 0u16 + } +} + +impl u32 { + /// Returns whether a `u32` is set to zero. + /// + /// # Returns + /// + /// * [bool] -> True if the `u32` is zero, otherwise false. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u32 = u32::zero(); + /// assert(zero_u32.is_zero()); + /// } + /// ``` + pub fn is_zero(self) -> bool { + self == 0u32 + } +} + +impl u64 { + /// Returns whether a `u64` is set to zero. + /// + /// # Returns + /// + /// * [bool] -> True if the `u64` is zero, otherwise false. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u64 = u64::zero(); + /// assert(zero_u64.is_zero()); + /// } + /// ``` + pub fn is_zero(self) -> bool { + self == 0u64 + } +} + +impl u256 { + /// Returns whether a `u256` is set to zero. + /// + /// # Returns + /// + /// * [bool] -> True if the `u256` is zero, otherwise false. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_u256 = u256::zero(); + /// assert(zero_u256.is_zero()); + /// } + /// ``` + pub fn is_zero(self) -> bool { + self == 0x00u256 + } +} + +impl b256 { + /// Returns whether a `b256` is set to zero. + /// + /// # Returns + /// + /// * [bool] -> True if the `b256` is zero, otherwise false. + /// + /// # Examples + /// + /// ```sway + /// fn foo() { + /// let zero_b256 = b256::zero(); + /// assert(zero_b256.is_zero()); + /// } + /// ``` + pub fn is_zero(self) -> bool { + self == 0x0000000000000000000000000000000000000000000000000000000000000000 + } +} diff --git a/sway-lib-std/src/outputs.sw b/sway-lib-std/src/outputs.sw index b9fba33ac93..754c8444b07 100644 --- a/sway-lib-std/src/outputs.sw +++ b/sway-lib-std/src/outputs.sw @@ -15,6 +15,9 @@ use ::tx::{ tx_type, }; use ::option::Option::{self, *}; +use ::ops::*; +use ::primitive_conversions::u16::*; +use ::raw_ptr::*; // GTF Opcode const selectors // @@ -275,7 +278,7 @@ pub fn output_asset_to(index: u64) -> Option
{ } } -impl ::ops::Eq for Output { +impl Eq for Output { fn eq(self, other: Self) -> bool { match (self, other) { (Output::Coin, Output::Coin) => true, diff --git a/sway-lib-std/src/primitive_conversions/b256.sw b/sway-lib-std/src/primitive_conversions/b256.sw index a6f85496309..3662019b0d5 100644 --- a/sway-lib-std/src/primitive_conversions/b256.sw +++ b/sway-lib-std/src/primitive_conversions/b256.sw @@ -3,7 +3,6 @@ library; use ::bytes::Bytes; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; -use ::u128::U128; use ::b512::B512; impl b256 { @@ -93,34 +92,7 @@ impl From for b256 { /// } /// ``` fn from(num: u256) -> Self { - num.as_b256() - } -} - -impl From for b256 { - /// Converts a `U128` to a `b256`. - /// - /// # Arguments - /// - /// * `num`: [U128] - The `U128` to be converted. - /// - /// # Returns - /// - /// * [b256] - The `b256` representation of the `U128` value. - /// - /// # Examples - /// - /// ```sway - /// use std::u128::U128; - /// - /// fn foo() { - /// let u128_value = U128::from((18446744073709551615_u64, 18446744073709551615_u64)); - /// let b256_value = b256::from(u128_value); - /// } - /// ``` - fn from(num: U128) -> Self { - let input = (0u64, 0u64, num.upper(), num.lower()); - asm(input: input) { + asm(input: num) { input: b256 } } diff --git a/sway-lib-std/src/primitive_conversions/str.sw b/sway-lib-std/src/primitive_conversions/str.sw index 4ace1dd03a6..c2485b07446 100644 --- a/sway-lib-std/src/primitive_conversions/str.sw +++ b/sway-lib-std/src/primitive_conversions/str.sw @@ -1,6 +1,8 @@ library; use ::option::Option::{self, *}; +use ::str::*; +use ::ops::*; impl str { /// Attempts to convert the string slice into a string array. diff --git a/sway-lib-std/src/primitive_conversions/u16.sw b/sway-lib-std/src/primitive_conversions/u16.sw index 5e8a4ca34b7..7e39f8b4f2d 100644 --- a/sway-lib-std/src/primitive_conversions/u16.sw +++ b/sway-lib-std/src/primitive_conversions/u16.sw @@ -2,7 +2,8 @@ library; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; -use ::u128::U128; +use ::ops::*; +use ::primitive_conversions::u8::*; impl u16 { /// Extends a `u16` to a `u32`. @@ -167,13 +168,3 @@ impl TryFrom for u16 { } } } - -impl TryFrom for u16 { - fn try_from(u: U128) -> Option { - if u.upper() == 0 { - >::try_from(u.lower()) - } else { - None - } - } -} diff --git a/sway-lib-std/src/primitive_conversions/u256.sw b/sway-lib-std/src/primitive_conversions/u256.sw index a23a845ebb8..38e424dde2d 100644 --- a/sway-lib-std/src/primitive_conversions/u256.sw +++ b/sway-lib-std/src/primitive_conversions/u256.sw @@ -2,8 +2,9 @@ library; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; -use ::u128::U128; use ::b512::B512; +use ::ops::*; +use ::primitive_conversions::{u8::*, u16::*, u32::*, u64::*, b256::*}; impl u256 { /// Converts a `u256` to a `b256`. @@ -183,35 +184,6 @@ impl From for u256 { } } -impl From for u256 { - /// Converts a `U128` to a `u256`. - /// - /// # Arguments - /// - /// * `num`: [U128] - The `U128` to be converted. - /// - /// # Returns - /// - /// * [u256] - The `u256` representation of the `U128` value. - /// - /// # Examples - /// - /// ```sway - /// use std::u128::U128; - /// - /// fn foo() { - /// let u128_value = U128::from((18446744073709551615_u64, 18446744073709551615_u64)); - /// let u256_value = u256::from(u128_value); - /// } - /// ``` - fn from(num: U128) -> Self { - let input = (0u64, 0u64, num.upper(), num.lower()); - asm(input: input) { - input: u256 - } - } -} - impl From<(u64, u64, u64, u64)> for u256 { /// Casts a tuple of 4 `u64` values to a `u256`. /// diff --git a/sway-lib-std/src/primitive_conversions/u32.sw b/sway-lib-std/src/primitive_conversions/u32.sw index b50e223ab48..2a54865c740 100644 --- a/sway-lib-std/src/primitive_conversions/u32.sw +++ b/sway-lib-std/src/primitive_conversions/u32.sw @@ -2,7 +2,8 @@ library; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; -use ::u128::U128; +use ::ops::*; +use ::primitive_conversions::{u8::*, u16::*}; impl u32 { /// Extends a `u32` to a `u64`. @@ -189,12 +190,4 @@ impl TryFrom for u32 { } } -impl TryFrom for u32 { - fn try_from(u: U128) -> Option { - if u.upper() == 0 { - >::try_from(u.lower()) - } else { - None - } - } -} + diff --git a/sway-lib-std/src/primitive_conversions/u64.sw b/sway-lib-std/src/primitive_conversions/u64.sw index 828031399e2..dede1e0ce0a 100644 --- a/sway-lib-std/src/primitive_conversions/u64.sw +++ b/sway-lib-std/src/primitive_conversions/u64.sw @@ -2,7 +2,8 @@ library; use ::convert::{TryFrom, TryInto, *}; use ::option::Option::{self, *}; -use ::u128::U128; +use ::ops::*; +use ::primitive_conversions::{u8::*, u16::*, u32::*}; impl u64 { /// Extends a `u64` to a `u256`. @@ -204,12 +205,3 @@ impl TryFrom for u64 { } } -impl TryFrom for u64 { - fn try_from(u: U128) -> Option { - if u.upper() == 0 { - Some(u.lower()) - } else { - None - } - } -} diff --git a/sway-lib-std/src/primitive_conversions/u8.sw b/sway-lib-std/src/primitive_conversions/u8.sw index 2b3f4f4f6c4..70041583a66 100644 --- a/sway-lib-std/src/primitive_conversions/u8.sw +++ b/sway-lib-std/src/primitive_conversions/u8.sw @@ -2,7 +2,7 @@ library; use ::convert::TryFrom; use ::option::Option::{self, *}; -use ::u128::U128; +use ::ops::*; impl u8 { /// Extends a `u8` to a `u16`. @@ -146,13 +146,3 @@ impl TryFrom for u8 { } } } - -impl TryFrom for u8 { - fn try_from(u: U128) -> Option { - if u.upper() == 0 { - >::try_from(u.lower()) - } else { - None - } - } -} diff --git a/sway-lib-std/src/storage/storage_api.sw b/sway-lib-std/src/storage/storage_api.sw index 2431e4c6b3d..aad1e72f859 100644 --- a/sway-lib-std/src/storage/storage_api.sw +++ b/sway-lib-std/src/storage/storage_api.sw @@ -2,6 +2,8 @@ library; use ::alloc::alloc; use ::option::Option::{self, *}; +use ::ops::*; +use ::primitive_conversions::{u64::*, b256::*, u256::*}; /// Stores a stack value in storage. Will not work for heap values. /// diff --git a/sway-lib-std/src/string.sw b/sway-lib-std/src/string.sw index c51e58d249e..69637a2d397 100644 --- a/sway-lib-std/src/string.sw +++ b/sway-lib-std/src/string.sw @@ -6,7 +6,9 @@ use ::bytes::*; use ::convert::*; use ::hash::{Hash, Hasher}; use ::option::Option; -use ::codec::AbiEncode; +use ::codec::*; +use ::ops::Eq; +use ::raw_slice::AsRawSlice; /// A UTF-8 encoded growable string. It has ownership over its buffer. /// diff --git a/sway-lib-std/src/tx.sw b/sway-lib-std/src/tx.sw index 47e4a793526..409b75e3188 100644 --- a/sway-lib-std/src/tx.sw +++ b/sway-lib-std/src/tx.sw @@ -4,6 +4,7 @@ library; use ::revert::revert; use ::option::Option::{self, *}; use ::alloc::alloc_bytes; +use ::ops::*; // GTF Opcode const selectors // @@ -62,7 +63,7 @@ pub enum Transaction { Blob: (), } -impl ::ops::Eq for Transaction { +impl Eq for Transaction { fn eq(self, other: Self) -> bool { match (self, other) { (Transaction::Script, Transaction::Script) => true, diff --git a/sway-lib-std/src/u128.sw b/sway-lib-std/src/u128.sw index d43476587cd..51abd9c1780 100644 --- a/sway-lib-std/src/u128.sw +++ b/sway-lib-std/src/u128.sw @@ -2,7 +2,7 @@ library; use ::assert::assert; -use ::convert::{From, Into}; +use ::convert::{From, Into, TryFrom}; use ::flags::{ disable_panic_on_overflow, panic_on_overflow_enabled, @@ -13,6 +13,7 @@ use ::registers::{flags, overflow}; use ::math::*; use ::result::Result::{self, *}; use ::option::Option::{self, None, Some}; +use ::ops::*; /// The 128-bit unsigned integer type. /// @@ -144,13 +145,13 @@ impl From for (u64, u64) { } } -impl ::ops::Eq for U128 { +impl Eq for U128 { fn eq(self, other: Self) -> bool { self.lower == other.lower && self.upper == other.upper } } -impl ::ops::Ord for U128 { +impl Ord for U128 { fn gt(self, other: Self) -> bool { self.upper > other.upper || self.upper == other.upper && self.lower > other.lower } @@ -160,7 +161,7 @@ impl ::ops::Ord for U128 { } } -impl ::ops::OrdEq for U128 {} +impl OrdEq for U128 {} impl u64 { /// Performs addition between two `u64` values, returning a `U128`. @@ -481,19 +482,19 @@ impl U128 { } } -impl ::ops::BitwiseAnd for U128 { +impl ::BitwiseAnd for U128 { fn binary_and(self, other: Self) -> Self { Self::from((self.upper & other.upper, self.lower & other.lower)) } } -impl ::ops::BitwiseOr for U128 { +impl ::BitwiseOr for U128 { fn binary_or(self, other: Self) -> Self { Self::from((self.upper | other.upper, self.lower | other.lower)) } } -impl ::ops::Shift for U128 { +impl ::Shift for U128 { fn lsh(self, rhs: u64) -> Self { // If shifting by at least the number of bits, then saturate with // zeroes. @@ -543,7 +544,7 @@ impl ::ops::Shift for U128 { } } -impl ::ops::Not for U128 { +impl ::Not for U128 { fn not(self) -> Self { Self { upper: !self.upper, @@ -552,7 +553,7 @@ impl ::ops::Not for U128 { } } -impl ::ops::Add for U128 { +impl ::Add for U128 { /// Add a `U128` to a `U128`. Reverts on overflow. fn add(self, other: Self) -> Self { let mut upper_128 = self.upper.overflowing_add(other.upper); @@ -582,7 +583,7 @@ impl ::ops::Add for U128 { } } -impl ::ops::Subtract for U128 { +impl ::Subtract for U128 { /// Subtract a `U128` from a `U128`. Reverts on underflow. fn subtract(self, other: Self) -> Self { // panic_on_overflow_enabled is also for underflow @@ -605,7 +606,7 @@ impl ::ops::Subtract for U128 { Self { upper, lower } } } -impl ::ops::Multiply for U128 { +impl ::Multiply for U128 { /// Multiply a `U128` with a `U128`. Reverts of overflow. fn multiply(self, other: Self) -> Self { // in case both of the `U128` upper parts are bigger than zero, @@ -628,7 +629,7 @@ impl ::ops::Multiply for U128 { } } -impl ::ops::Divide for U128 { +impl ::Divide for U128 { /// Divide a `U128` by a `U128`. Reverts if divisor is zero. fn divide(self, divisor: Self) -> Self { let zero = Self::from((0, 0)); @@ -668,7 +669,7 @@ impl ::ops::Divide for U128 { } } -impl core::ops::Mod for U128 { +impl Mod for U128 { fn modulo(self, other: Self) -> Self { assert(other != Self::zero()); @@ -876,7 +877,7 @@ impl Logarithm for U128 { } } -impl ::ops::TotalOrd for U128 { +impl TotalOrd for U128 { fn min(self, other: Self) -> Self { if self < other { self } else { other } } @@ -885,3 +886,101 @@ impl ::ops::TotalOrd for U128 { if self > other { self } else { other } } } + +impl TryFrom for u8 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + >::try_from(u.lower()) + } else { + None + } + } +} + +impl TryFrom for u16 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + >::try_from(u.lower()) + } else { + None + } + } +} + +impl TryFrom for u32 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + >::try_from(u.lower()) + } else { + None + } + } +} + +impl TryFrom for u64 { + fn try_from(u: U128) -> Option { + if u.upper() == 0 { + Some(u.lower()) + } else { + None + } + } +} + +impl From for u256 { + /// Converts a `U128` to a `u256`. + /// + /// # Arguments + /// + /// * `num`: [U128] - The `U128` to be converted. + /// + /// # Returns + /// + /// * [u256] - The `u256` representation of the `U128` value. + /// + /// # Examples + /// + /// ```sway + /// use std::u128::U128; + /// + /// fn foo() { + /// let u128_value = U128::from((18446744073709551615_u64, 18446744073709551615_u64)); + /// let u256_value = u256::from(u128_value); + /// } + /// ``` + fn from(num: U128) -> Self { + let input = (0u64, 0u64, num.upper(), num.lower()); + asm(input: input) { + input: u256 + } + } +} + +impl From for b256 { + /// Converts a `U128` to a `b256`. + /// + /// # Arguments + /// + /// * `num`: [U128] - The `U128` to be converted. + /// + /// # Returns + /// + /// * [b256] - The `b256` representation of the `U128` value. + /// + /// # Examples + /// + /// ```sway + /// use std::u128::U128; + /// + /// fn foo() { + /// let u128_value = U128::from((18446744073709551615_u64, 18446744073709551615_u64)); + /// let b256_value = b256::from(u128_value); + /// } + /// ``` + fn from(num: U128) -> Self { + let input = (0u64, 0u64, num.upper(), num.lower()); + asm(input: input) { + input: b256 + } + } +} diff --git a/sway-lib-std/src/vm/evm/evm_address.sw b/sway-lib-std/src/vm/evm/evm_address.sw index 26691aea7ab..2a35c25a43c 100644 --- a/sway-lib-std/src/vm/evm/evm_address.sw +++ b/sway-lib-std/src/vm/evm/evm_address.sw @@ -4,6 +4,8 @@ library; use ::intrinsics::size_of_val; use ::convert::From; use ::hash::*; +use ::ops::Eq; +use ::primitives::*; /// The `EvmAddress` type, a struct wrapper around the inner `b256` value. pub struct EvmAddress { @@ -75,7 +77,7 @@ impl EvmAddress { } } -impl ::ops::Eq for EvmAddress { +impl Eq for EvmAddress { fn eq(self, other: Self) -> bool { self.bits == other.bits } From 06ad163cbd5f4e54306ebfaf6081d017b36e0d39 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 27 Jan 2025 15:57:27 +0530 Subject: [PATCH 24/29] fmt --- sway-lib-std/src/asset_id.sw | 5 +---- sway-lib-std/src/contract_id.sw | 3 +-- sway-lib-std/src/math.sw | 2 +- sway-lib-std/src/primitive_conversions/u256.sw | 2 +- sway-lib-std/src/primitive_conversions/u32.sw | 4 +--- sway-lib-std/src/primitive_conversions/u64.sw | 3 +-- sway-lib-std/src/storage/storage_api.sw | 2 +- 7 files changed, 7 insertions(+), 14 deletions(-) diff --git a/sway-lib-std/src/asset_id.sw b/sway-lib-std/src/asset_id.sw index 13bff73a448..25e361ba204 100644 --- a/sway-lib-std/src/asset_id.sw +++ b/sway-lib-std/src/asset_id.sw @@ -127,10 +127,7 @@ impl AssetId { let result_buffer = b256::zero(); asm( asset_id: result_buffer, - ptr: ( - contract_id, - b256::zero(), - ), + ptr: (contract_id, b256::zero()), bytes: 64, ) { s256 asset_id ptr bytes; diff --git a/sway-lib-std/src/contract_id.sw b/sway-lib-std/src/contract_id.sw index 141295917ed..899969bfc93 100644 --- a/sway-lib-std/src/contract_id.sw +++ b/sway-lib-std/src/contract_id.sw @@ -9,7 +9,6 @@ use ::codec::*; use ::bytes::Bytes; use ::option::Option::{self, *}; - /// The `ContractId` type, a struct wrapper around the inner `b256` value. pub struct ContractId { /// The underlying raw `b256` data of the contract id. @@ -221,4 +220,4 @@ impl AbiEncode for ContractId { fn abi_encode(self, buffer: Buffer) -> Buffer { self.bits.abi_encode(buffer) } -} \ No newline at end of file +} diff --git a/sway-lib-std/src/math.sw b/sway-lib-std/src/math.sw index 8c79fd1f059..2e7a51386f5 100644 --- a/sway-lib-std/src/math.sw +++ b/sway-lib-std/src/math.sw @@ -11,7 +11,7 @@ use ::flags::{ set_flags, }; use ::registers::{flags, overflow}; -use ::primitive_conversions::{u8::*, u16::*, u32::*, u64::*, u256::*}; +use ::primitive_conversions::{u16::*, u256::*, u32::*, u64::*, u8::*}; /// Calculates the square root. pub trait Root { diff --git a/sway-lib-std/src/primitive_conversions/u256.sw b/sway-lib-std/src/primitive_conversions/u256.sw index 38e424dde2d..ba46ca1ad6e 100644 --- a/sway-lib-std/src/primitive_conversions/u256.sw +++ b/sway-lib-std/src/primitive_conversions/u256.sw @@ -4,7 +4,7 @@ use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; use ::b512::B512; use ::ops::*; -use ::primitive_conversions::{u8::*, u16::*, u32::*, u64::*, b256::*}; +use ::primitive_conversions::{b256::*, u16::*, u32::*, u64::*, u8::*}; impl u256 { /// Converts a `u256` to a `b256`. diff --git a/sway-lib-std/src/primitive_conversions/u32.sw b/sway-lib-std/src/primitive_conversions/u32.sw index 2a54865c740..ab290f3f074 100644 --- a/sway-lib-std/src/primitive_conversions/u32.sw +++ b/sway-lib-std/src/primitive_conversions/u32.sw @@ -3,7 +3,7 @@ library; use ::convert::{From, TryFrom}; use ::option::Option::{self, *}; use ::ops::*; -use ::primitive_conversions::{u8::*, u16::*}; +use ::primitive_conversions::{u16::*, u8::*}; impl u32 { /// Extends a `u32` to a `u64`. @@ -189,5 +189,3 @@ impl TryFrom for u32 { } } } - - diff --git a/sway-lib-std/src/primitive_conversions/u64.sw b/sway-lib-std/src/primitive_conversions/u64.sw index dede1e0ce0a..460786af73a 100644 --- a/sway-lib-std/src/primitive_conversions/u64.sw +++ b/sway-lib-std/src/primitive_conversions/u64.sw @@ -3,7 +3,7 @@ library; use ::convert::{TryFrom, TryInto, *}; use ::option::Option::{self, *}; use ::ops::*; -use ::primitive_conversions::{u8::*, u16::*, u32::*}; +use ::primitive_conversions::{u16::*, u32::*, u8::*}; impl u64 { /// Extends a `u64` to a `u256`. @@ -204,4 +204,3 @@ impl TryFrom for u64 { } } } - diff --git a/sway-lib-std/src/storage/storage_api.sw b/sway-lib-std/src/storage/storage_api.sw index aad1e72f859..85504cdb7cc 100644 --- a/sway-lib-std/src/storage/storage_api.sw +++ b/sway-lib-std/src/storage/storage_api.sw @@ -3,7 +3,7 @@ library; use ::alloc::alloc; use ::option::Option::{self, *}; use ::ops::*; -use ::primitive_conversions::{u64::*, b256::*, u256::*}; +use ::primitive_conversions::{b256::*, u256::*, u64::*}; /// Stores a stack value in storage. Will not work for heap values. /// From 05d7a2eacc45968820fcbfa511492ddcfd35ee0b Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 27 Jan 2025 17:07:39 +0530 Subject: [PATCH 25/29] fix new errors --- sway-lib-std/src/b512.sw | 1 + sway-lib-std/src/crypto/ed25519.sw | 3 ++- sway-lib-std/src/crypto/message.sw | 3 ++- sway-lib-std/src/crypto/public_key.sw | 3 ++- sway-lib-std/src/crypto/secp256k1.sw | 4 ++-- sway-lib-std/src/crypto/secp256r1.sw | 4 ++-- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/sway-lib-std/src/b512.sw b/sway-lib-std/src/b512.sw index 75386c5e386..8958529d5d2 100644 --- a/sway-lib-std/src/b512.sw +++ b/sway-lib-std/src/b512.sw @@ -6,6 +6,7 @@ use ::primitives::*; use ::convert::{From, Into, TryFrom}; use ::bytes::Bytes; use ::option::Option::{self, *}; +use ::raw_slice::*; /// Stores two `b256`s in contiguous memory. /// Guaranteed to be contiguous for use with ec-recover: `std::ecr::ec_recover`. diff --git a/sway-lib-std/src/crypto/ed25519.sw b/sway-lib-std/src/crypto/ed25519.sw index c8c57c5538c..5ae77a4684b 100644 --- a/sway-lib-std/src/crypto/ed25519.sw +++ b/sway-lib-std/src/crypto/ed25519.sw @@ -8,6 +8,7 @@ use ::crypto::{message::Message, public_key::PublicKey, signature_error::Signatu use ::hash::*; use ::result::Result::{self, *}; use ::option::Option::{self, *}; +use ::ops::Eq; /// An ed25519 signature. pub struct Ed25519 { @@ -189,7 +190,7 @@ impl Into for Ed25519 { } } -impl core::ops::Eq for Ed25519 { +impl Eq for Ed25519 { fn eq(self, other: Self) -> bool { let mut iter = 0; while iter < 64 { diff --git a/sway-lib-std/src/crypto/message.sw b/sway-lib-std/src/crypto/message.sw index 811051c02fa..ae319682fed 100644 --- a/sway-lib-std/src/crypto/message.sw +++ b/sway-lib-std/src/crypto/message.sw @@ -6,6 +6,7 @@ use ::alloc::alloc_bytes; use ::convert::{From, TryFrom, TryInto}; use ::option::Option::{self, *}; use ::hash::*; +use ::ops::Eq; /// Normalized (hashed) message authenticated by a signature. pub struct Message { @@ -83,7 +84,7 @@ impl TryInto for Message { } } -impl core::ops::Eq for Message { +impl Eq for Message { fn eq(self, other: Self) -> bool { if self.bytes.len() != other.bytes.len() { return false; diff --git a/sway-lib-std/src/crypto/public_key.sw b/sway-lib-std/src/crypto/public_key.sw index b940395ebf0..6e58a00393e 100644 --- a/sway-lib-std/src/crypto/public_key.sw +++ b/sway-lib-std/src/crypto/public_key.sw @@ -7,6 +7,7 @@ use ::constants::ZERO_B256; use ::convert::{From, TryFrom, TryInto}; use ::option::Option::{self, *}; use ::hash::*; +use ::ops::Eq; /// Asymmetric public key, i.e. verifying key, in uncompressed form. /// @@ -172,7 +173,7 @@ impl TryInto for PublicKey { } } -impl core::ops::Eq for PublicKey { +impl Eq for PublicKey { fn eq(self, other: Self) -> bool { if self.bytes.len() != other.bytes.len() { return false; diff --git a/sway-lib-std/src/crypto/secp256k1.sw b/sway-lib-std/src/crypto/secp256k1.sw index 2249df6ecad..b1340f25681 100644 --- a/sway-lib-std/src/crypto/secp256k1.sw +++ b/sway-lib-std/src/crypto/secp256k1.sw @@ -11,7 +11,7 @@ use ::registers::error; use ::result::Result::{self, *}; use ::option::Option::{self, *}; use ::vm::evm::evm_address::EvmAddress; - +use ::ops::Eq; /// A secp256k1 signature. pub struct Secp256k1 { /// The underlying raw `[u8; 64]` data of the signature. @@ -424,7 +424,7 @@ impl Into for Secp256k1 { } } -impl core::ops::Eq for Secp256k1 { +impl Eq for Secp256k1 { fn eq(self, other: Self) -> bool { let mut iter = 0; while iter < 64 { diff --git a/sway-lib-std/src/crypto/secp256r1.sw b/sway-lib-std/src/crypto/secp256r1.sw index 560e8558f87..0e5194b2bed 100644 --- a/sway-lib-std/src/crypto/secp256r1.sw +++ b/sway-lib-std/src/crypto/secp256r1.sw @@ -11,7 +11,7 @@ use ::registers::error; use ::result::Result::{self, *}; use ::option::Option::{self, *}; use ::vm::evm::evm_address::EvmAddress; - +use ::ops::Eq; /// A secp256r1 signature. pub struct Secp256r1 { /// The underlying raw `[u8; 64]` data of the signature. @@ -425,7 +425,7 @@ impl Into for Secp256r1 { } } -impl core::ops::Eq for Secp256r1 { +impl Eq for Secp256r1 { fn eq(self, other: Self) -> bool { let mut iter = 0; while iter < 64 { From 9bb1d3e150dd56cc6c48580d62b8b43dae2fa379 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 27 Jan 2025 17:22:31 +0530 Subject: [PATCH 26/29] fix all bugs --- sway-lib-std/src/logging.sw | 2 +- sway-lib-std/src/u128.sw | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/sway-lib-std/src/logging.sw b/sway-lib-std/src/logging.sw index 83bd1351bc5..a115537919e 100644 --- a/sway-lib-std/src/logging.sw +++ b/sway-lib-std/src/logging.sw @@ -1,7 +1,7 @@ //! Allows logging of arbitrary stack types, emitted as either `Log` or `Logd` receipts. library; -use ::codec::AbiEncode; +use ::codec::*; /// Log any stack type. /// diff --git a/sway-lib-std/src/u128.sw b/sway-lib-std/src/u128.sw index 51abd9c1780..cbe7546065a 100644 --- a/sway-lib-std/src/u128.sw +++ b/sway-lib-std/src/u128.sw @@ -482,19 +482,19 @@ impl U128 { } } -impl ::BitwiseAnd for U128 { +impl BitwiseAnd for U128 { fn binary_and(self, other: Self) -> Self { Self::from((self.upper & other.upper, self.lower & other.lower)) } } -impl ::BitwiseOr for U128 { +impl BitwiseOr for U128 { fn binary_or(self, other: Self) -> Self { Self::from((self.upper | other.upper, self.lower | other.lower)) } } -impl ::Shift for U128 { +impl Shift for U128 { fn lsh(self, rhs: u64) -> Self { // If shifting by at least the number of bits, then saturate with // zeroes. @@ -544,7 +544,7 @@ impl ::Shift for U128 { } } -impl ::Not for U128 { +impl Not for U128 { fn not(self) -> Self { Self { upper: !self.upper, @@ -553,7 +553,7 @@ impl ::Not for U128 { } } -impl ::Add for U128 { +impl Add for U128 { /// Add a `U128` to a `U128`. Reverts on overflow. fn add(self, other: Self) -> Self { let mut upper_128 = self.upper.overflowing_add(other.upper); @@ -583,7 +583,7 @@ impl ::Add for U128 { } } -impl ::Subtract for U128 { +impl Subtract for U128 { /// Subtract a `U128` from a `U128`. Reverts on underflow. fn subtract(self, other: Self) -> Self { // panic_on_overflow_enabled is also for underflow @@ -606,7 +606,7 @@ impl ::Subtract for U128 { Self { upper, lower } } } -impl ::Multiply for U128 { +impl Multiply for U128 { /// Multiply a `U128` with a `U128`. Reverts of overflow. fn multiply(self, other: Self) -> Self { // in case both of the `U128` upper parts are bigger than zero, @@ -629,7 +629,7 @@ impl ::Multiply for U128 { } } -impl ::Divide for U128 { +impl Divide for U128 { /// Divide a `U128` by a `U128`. Reverts if divisor is zero. fn divide(self, divisor: Self) -> Self { let zero = Self::from((0, 0)); From e16357da7796a28e7515e9116298461f460d2be4 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Wed, 29 Jan 2025 14:17:08 +0530 Subject: [PATCH 27/29] move storagekey --- sway-lib-core/src/storage.sw | 117 --------------------- sway-lib-std/src/storage/storage_bytes.sw | 2 +- sway-lib-std/src/storage/storage_key.sw | 117 +++++++++++++++++++++ sway-lib-std/src/storage/storage_string.sw | 2 +- 4 files changed, 119 insertions(+), 119 deletions(-) diff --git a/sway-lib-core/src/storage.sw b/sway-lib-core/src/storage.sw index ed0eb8edecf..316a905aa9b 100644 --- a/sway-lib-core/src/storage.sw +++ b/sway-lib-core/src/storage.sw @@ -1,118 +1 @@ library; - -/// Describes a location in storage. -/// -/// # Additional Information -/// -/// The location in storage is specified by the `b256` key of a particular storage slot and an -/// offset, in words, from the start of the storage slot at `key`. The parameter `T` is the type of -/// the data to be read from or written to at `offset`. -/// `field_id` is a unique identifier for the storage field being referred to, it is different even -/// for multiple zero sized fields that might live at the same location but -/// represent different storage constructs. -pub struct StorageKey { - /// The assigned location in storage. - slot: b256, - /// The assigned offset based on the data structure `T`. - offset: u64, - /// A unique identifier. - field_id: b256, -} - -impl StorageKey { - /// Create a new `StorageKey`. - /// - /// # Arguments - /// - /// * `slot`: [b256] - The assigned location in storage for the new `StorageKey`. - /// * `offset`: [u64] - The assigned offset based on the data structure `T` for the new `StorageKey`. - /// * `field_id`: [b256] - A unique identifier for the new `StorageKey`. - /// - /// # Returns - /// - /// * [StorageKey] - The newly created `StorageKey`. - /// - /// # Examples - /// - /// ```sway - /// use std::hash::sha256; - /// - /// fn foo() { - /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); - /// assert(my_key.slot() == b256::zero()); - /// } - /// ``` - pub fn new(slot: b256, offset: u64, field_id: b256) -> Self { - Self { - slot, - offset, - field_id, - } - } - - /// Returns the storage slot address. - /// - /// # Returns - /// - /// * [b256] - The address in storage that this storage slot points to. - /// - /// # Examples - /// - /// ```sway - /// use std::hash::sha256; - /// - /// fn foo() { - /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); - /// assert(my_key.slot() == b256::zero()); - /// } - /// ``` - pub fn slot(self) -> b256 { - self.slot - } - - /// Returns the offset on the storage slot. - /// - /// # Returns - /// - /// * [u64] - The offset in storage that this storage slot points to. - /// - /// # Examples - /// - /// ```sway - /// use std::hash::sha256; - /// - /// fn foo() { - /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); - /// assert(my_key.offset() == 0); - /// } - /// ``` - pub fn offset(self) -> u64 { - self.offset - } - - /// Returns the storage slot field id. - /// - /// # Additional Information - /// - /// The field id is a unique identifier for the storage field being referred to, it is different even - /// for multiple zero sized fields that might live at the same location but - /// represent different storage constructs. - /// - /// # Returns - /// - /// * [b256] - The field id for this storage slot. - /// - /// # Examples - /// - /// ```sway - /// use std::hash::sha256; - /// - /// fn foo() { - /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); - /// assert(my_key.field_id() == sha256(b256::zero())); - /// } - /// ``` - pub fn field_id(self) -> b256 { - self.field_id - } -} diff --git a/sway-lib-std/src/storage/storage_bytes.sw b/sway-lib-std/src/storage/storage_bytes.sw index e3a15f2cae2..4744e2c39e1 100644 --- a/sway-lib-std/src/storage/storage_bytes.sw +++ b/sway-lib-std/src/storage/storage_bytes.sw @@ -3,7 +3,7 @@ library; use ::bytes::Bytes; use ::option::Option::{self, *}; use ::storage::storable_slice::*; -use ::storage::storage_api::*; +use ::storage::{storage_api::*, storage_key::StorageKey}; /// A persistent storage type to store a collection of tightly packed bytes. pub struct StorageBytes {} diff --git a/sway-lib-std/src/storage/storage_key.sw b/sway-lib-std/src/storage/storage_key.sw index 96cfab4c5d4..f5f168897b4 100644 --- a/sway-lib-std/src/storage/storage_key.sw +++ b/sway-lib-std/src/storage/storage_key.sw @@ -3,6 +3,123 @@ library; use ::option::Option; use ::storage::storage_api::*; +/// Describes a location in storage. +/// +/// # Additional Information +/// +/// The location in storage is specified by the `b256` key of a particular storage slot and an +/// offset, in words, from the start of the storage slot at `key`. The parameter `T` is the type of +/// the data to be read from or written to at `offset`. +/// `field_id` is a unique identifier for the storage field being referred to, it is different even +/// for multiple zero sized fields that might live at the same location but +/// represent different storage constructs. +pub struct StorageKey { + /// The assigned location in storage. + slot: b256, + /// The assigned offset based on the data structure `T`. + offset: u64, + /// A unique identifier. + field_id: b256, +} + +impl StorageKey { + /// Create a new `StorageKey`. + /// + /// # Arguments + /// + /// * `slot`: [b256] - The assigned location in storage for the new `StorageKey`. + /// * `offset`: [u64] - The assigned offset based on the data structure `T` for the new `StorageKey`. + /// * `field_id`: [b256] - A unique identifier for the new `StorageKey`. + /// + /// # Returns + /// + /// * [StorageKey] - The newly created `StorageKey`. + /// + /// # Examples + /// + /// ```sway + /// use std::hash::sha256; + /// + /// fn foo() { + /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); + /// assert(my_key.slot() == b256::zero()); + /// } + /// ``` + pub fn new(slot: b256, offset: u64, field_id: b256) -> Self { + Self { + slot, + offset, + field_id, + } + } + + /// Returns the storage slot address. + /// + /// # Returns + /// + /// * [b256] - The address in storage that this storage slot points to. + /// + /// # Examples + /// + /// ```sway + /// use std::hash::sha256; + /// + /// fn foo() { + /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); + /// assert(my_key.slot() == b256::zero()); + /// } + /// ``` + pub fn slot(self) -> b256 { + self.slot + } + + /// Returns the offset on the storage slot. + /// + /// # Returns + /// + /// * [u64] - The offset in storage that this storage slot points to. + /// + /// # Examples + /// + /// ```sway + /// use std::hash::sha256; + /// + /// fn foo() { + /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); + /// assert(my_key.offset() == 0); + /// } + /// ``` + pub fn offset(self) -> u64 { + self.offset + } + + /// Returns the storage slot field id. + /// + /// # Additional Information + /// + /// The field id is a unique identifier for the storage field being referred to, it is different even + /// for multiple zero sized fields that might live at the same location but + /// represent different storage constructs. + /// + /// # Returns + /// + /// * [b256] - The field id for this storage slot. + /// + /// # Examples + /// + /// ```sway + /// use std::hash::sha256; + /// + /// fn foo() { + /// let my_key = StorageKey::::new(b256::zero(), 0, sha256(b256::zero())); + /// assert(my_key.field_id() == sha256(b256::zero())); + /// } + /// ``` + pub fn field_id(self) -> b256 { + self.field_id + } +} + impl StorageKey { /// Reads a value of type `T` starting at the location specified by `self`. If the value /// crosses the boundary of a storage slot, reading continues at the following slot. diff --git a/sway-lib-std/src/storage/storage_string.sw b/sway-lib-std/src/storage/storage_string.sw index c235b1ad96e..97a99ced10a 100644 --- a/sway-lib-std/src/storage/storage_string.sw +++ b/sway-lib-std/src/storage/storage_string.sw @@ -2,7 +2,7 @@ library; use ::bytes::Bytes; use ::option::Option::{self, *}; -use ::storage::storable_slice::*; +use ::storage::{storable_slice::*, storage_key::StorageKey}; use ::storage::storage_api::read; use ::string::String; From e47e22acb482cf13d2bdf84c18450e2b2e8aa2e9 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Wed, 29 Jan 2025 14:23:40 +0530 Subject: [PATCH 28/29] move generate.sh --- {sway-lib-core => sway-lib-std}/generate.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sway-lib-core => sway-lib-std}/generate.sh (100%) diff --git a/sway-lib-core/generate.sh b/sway-lib-std/generate.sh similarity index 100% rename from sway-lib-core/generate.sh rename to sway-lib-std/generate.sh From 28642b14996fe6f372ad893ae99ad2dfd3099768 Mon Sep 17 00:00:00 2001 From: SwayStar123 Date: Mon, 3 Feb 2025 17:56:59 +0530 Subject: [PATCH 29/29] remove some references of core from compiler --- forc-pkg/src/manifest/mod.rs | 10 ++-- forc-pkg/src/pkg.rs | 50 ------------------- sway-ast/src/expr/mod.rs | 2 +- .../match_expression/typed/instantiate.rs | 8 +-- .../ast_node/expression/typed_expression.rs | 17 ++++--- .../semantic_analysis/namespace/namespace.rs | 39 ++++----------- .../to_parsed_lang/convert_parse_tree.rs | 4 +- sway-types/src/constants.rs | 1 - 8 files changed, 29 insertions(+), 102 deletions(-) diff --git a/forc-pkg/src/manifest/mod.rs b/forc-pkg/src/manifest/mod.rs index c20effec0fb..8d64c3f73c8 100644 --- a/forc-pkg/src/manifest/mod.rs +++ b/forc-pkg/src/manifest/mod.rs @@ -679,14 +679,12 @@ impl PackageManifest { /// Note: If only `core` is specified, we are unable to implicitly add `std` as we cannot /// guarantee that the user's `core` is compatible with the implicit `std`. fn implicitly_include_std_if_missing(&mut self) { - use sway_types::constants::{CORE, STD}; + use sway_types::constants::STD; // Don't include `std` if: - // - this *is* `core` or `std`. - // - either `core` or `std` packages are already specified. + // - this *is* `std`. + // - `std` package is already specified. // - a dependency already exists with the name "std". - if self.project.name == CORE - || self.project.name == STD - || self.pkg_dep(CORE).is_some() + if self.project.name == STD || self.pkg_dep(STD).is_some() || self.dep(STD).is_some() || !self.project.implicit_std.unwrap_or(true) diff --git a/forc-pkg/src/pkg.rs b/forc-pkg/src/pkg.rs index a89223c584c..57671087913 100644 --- a/forc-pkg/src/pkg.rs +++ b/forc-pkg/src/pkg.rs @@ -49,7 +49,6 @@ use sway_core::{ use sway_core::{set_bytecode_configurables_offset, PrintAsm, PrintIr}; use sway_error::{error::CompileError, handler::Handler, warning::CompileWarning}; use sway_features::ExperimentalFeatures; -use sway_types::constants::{CORE, STD}; use sway_types::{Ident, Span, Spanned}; use sway_utils::{constants, time_expr, PerformanceData, PerformanceMetric}; use tracing::{debug, info}; @@ -1605,7 +1604,6 @@ pub fn dependency_namespace( }; // Add direct dependencies. - let mut core_added = false; for edge in graph.edges_directed(node, Direction::Outgoing) { let dep_node = edge.target(); let dep_name = kebab_to_snake_case(&edge.weight().name); @@ -1635,59 +1633,11 @@ pub fn dependency_namespace( } }; root_namespace.add_external(dep_name, dep_namespace); - let dep = &graph[dep_node]; - if dep.name == CORE { - core_added = true; - } - } - - // Add `core` if not already added. - if !core_added { - if let Some(core_node) = find_core_dep(graph, node) { - let core_namespace = &lib_namespace_map[&core_node]; - root_namespace.add_external(CORE.to_string(), core_namespace.clone()); - } } Ok(root_namespace) } -/// Find the `core` dependency (whether direct or transitive) for the given node if it exists. -fn find_core_dep(graph: &Graph, node: NodeIx) -> Option { - // If we are `core`, do nothing. - let pkg = &graph[node]; - if pkg.name == CORE { - return None; - } - - // If we have `core` as a direct dep, use it. - let mut maybe_std = None; - for edge in graph.edges_directed(node, Direction::Outgoing) { - let dep_node = edge.target(); - let dep = &graph[dep_node]; - match &dep.name[..] { - CORE => return Some(dep_node), - STD => maybe_std = Some(dep_node), - _ => {} - } - } - - // If we have `std`, select `core` via `std`. - if let Some(std) = maybe_std { - return find_core_dep(graph, std); - } - - // Otherwise, search from this node. - for dep_node in Dfs::new(graph, node).iter(graph) { - let dep = &graph[dep_node]; - if dep.name == CORE { - return Some(dep_node); - } - } - - None -} - /// Compiles the given package. /// /// ## Program Types diff --git a/sway-ast/src/expr/mod.rs b/sway-ast/src/expr/mod.rs index 52999a63dcf..a94a0e9fa1b 100644 --- a/sway-ast/src/expr/mod.rs +++ b/sway-ast/src/expr/mod.rs @@ -295,7 +295,7 @@ pub enum ReassignmentOpVariant { } impl ReassignmentOpVariant { - pub fn core_name(&self) -> &'static str { + pub fn std_name(&self) -> &'static str { match self { ReassignmentOpVariant::Equals => "eq", ReassignmentOpVariant::AddEquals => "add", diff --git a/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/instantiate.rs b/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/instantiate.rs index 792de9d779b..cf4a83ee921 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/instantiate.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/match_expression/typed/instantiate.rs @@ -165,7 +165,7 @@ impl Instantiate { lhs: ty::TyExpression, rhs: ty::TyExpression, ) -> Result { - ty::TyExpression::core_ops_eq(handler, ctx, vec![lhs, rhs], self.dummy_span()) + ty::TyExpression::std_ops_eq(handler, ctx, vec![lhs, rhs], self.dummy_span()) } /// Instantiates an expression equivalent to ` != `. @@ -176,7 +176,7 @@ impl Instantiate { lhs: ty::TyExpression, rhs: ty::TyExpression, ) -> Result { - ty::TyExpression::core_ops_neq(handler, ctx, vec![lhs, rhs], self.dummy_span()) + ty::TyExpression::std_ops_neq(handler, ctx, vec![lhs, rhs], self.dummy_span()) } /// Instantiates an expression equivalent to ` == `. The method expects that @@ -187,8 +187,8 @@ impl Instantiate { lhs: ty::TyExpression, rhs: ty::TyExpression, ) -> ty::TyExpression { - ty::TyExpression::core_ops_eq(&Handler::default(), ctx, vec![lhs, rhs], self.dummy_span()) - .expect("Instantiating `core::ops::eq` is expected to always work.") + ty::TyExpression::std_ops_eq(&Handler::default(), ctx, vec![lhs, rhs], self.dummy_span()) + .expect("Instantiating `std::ops::eq` is expected to always work.") } /// Instantiates a [ty::TyExpressionVariant::TupleElemAccess] `.`. The method expects that diff --git a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs index 65d645dffed..376d8f6653c 100644 --- a/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs +++ b/sway-core/src/semantic_analysis/ast_node/expression/typed_expression.rs @@ -54,7 +54,7 @@ use type_resolve::{resolve_call_path, VisibilityCheck}; #[allow(clippy::too_many_arguments)] impl ty::TyExpression { - pub(crate) fn core_ops_eq( + pub(crate) fn std_ops_eq( handler: &Handler, ctx: TypeCheckContext, arguments: Vec, @@ -66,10 +66,10 @@ impl ty::TyExpression { TypeInfo::Boolean, span.source_id(), )); - Self::core_ops(handler, ctx, OpVariant::Equals, arguments, span) + Self::std_ops(handler, ctx, OpVariant::Equals, arguments, span) } - pub(crate) fn core_ops_neq( + pub(crate) fn std_ops_neq( handler: &Handler, ctx: TypeCheckContext, arguments: Vec, @@ -81,10 +81,10 @@ impl ty::TyExpression { TypeInfo::Boolean, span.source_id(), )); - Self::core_ops(handler, ctx, OpVariant::NotEquals, arguments, span) + Self::std_ops(handler, ctx, OpVariant::NotEquals, arguments, span) } - fn core_ops( + fn std_ops( handler: &Handler, mut ctx: TypeCheckContext, op_variant: OpVariant, @@ -95,7 +95,7 @@ impl ty::TyExpression { let call_path = CallPath { prefixes: vec![ - Ident::new_with_override("core".into(), span.clone()), + Ident::new_with_override("std".into(), span.clone()), Ident::new_with_override("ops".into(), span.clone()), ], suffix: Op { @@ -1242,11 +1242,12 @@ impl ty::TyExpression { ) })?; - // The type of a storage access is `core::storage::StorageKey`. This is + // The type of a storage access is `std::storage::storage_key::StorageKey`. This is // the path to it. let storage_key_mod_path = vec![ - Ident::new_with_override("core".into(), span.clone()), + Ident::new_with_override("std".into(), span.clone()), Ident::new_with_override("storage".into(), span.clone()), + Ident::new_with_override("storage_key".into(), span.clone()), ]; let storage_key_ident = Ident::new_with_override("StorageKey".into(), span.clone()); diff --git a/sway-core/src/semantic_analysis/namespace/namespace.rs b/sway-core/src/semantic_analysis/namespace/namespace.rs index ab6ad42a89f..df9e20d5f62 100644 --- a/sway-core/src/semantic_analysis/namespace/namespace.rs +++ b/sway-core/src/semantic_analysis/namespace/namespace.rs @@ -4,7 +4,7 @@ use super::{module::Module, root::Root, ModulePath, ModulePathBuf}; use sway_error::handler::{ErrorEmitted, Handler}; use sway_types::{ - constants::{CONTRACT_ID, CORE, PRELUDE, STD}, + constants::{CONTRACT_ID, PRELUDE, STD}, span::Span, }; @@ -29,13 +29,13 @@ impl Namespace { /// Initialize the namespace /// See also the factory functions in contract_helpers.rs /// - /// If `import_preludes_into_root` is true then core::prelude::* and std::prelude::* will be - /// imported into the root module, provided core and std are available in the external modules. + /// If `import_prelude_into_root` is true then and std::prelude::* will be + /// imported into the root module, provided std is available in the external modules. pub fn new( handler: &Handler, engines: &Engines, package_root: Root, - import_preludes_into_root: bool, + import_prelude_into_root: bool, ) -> Result { let package_name = package_root.current_package_name().clone(); let mut res = Self { @@ -43,7 +43,7 @@ impl Namespace { current_mod_path: vec![package_name], }; - if import_preludes_into_root { + if import_prelude_into_root { res.import_implicits(handler, engines)?; } Ok(res) @@ -206,7 +206,7 @@ impl Namespace { } } - // Import core::prelude::*, std::prelude::* and ::CONTRACT_ID as appropriate into the current module + // Import std::prelude::* and ::CONTRACT_ID as appropriate into the current module fn import_implicits( &mut self, handler: &Handler, @@ -214,33 +214,12 @@ impl Namespace { ) -> Result<(), ErrorEmitted> { // Import preludes let package_name = self.current_package_name().to_string(); - let core_string = CORE.to_string(); - let core_ident = Ident::new_no_span(core_string.clone()); let prelude_ident = Ident::new_no_span(PRELUDE.to_string()); - if package_name == CORE { + + if package_name == STD { // Do nothing - } else if package_name == STD { - // Import core::prelude::* - assert!(self.root.exists_as_external(&core_string)); - self.root.star_import( - handler, - engines, - &[core_ident, prelude_ident], - &self.current_mod_path, - Visibility::Private, - )? } else { - // Import core::prelude::* and std::prelude::* - if self.root.exists_as_external(&core_string) { - self.root.star_import( - handler, - engines, - &[core_ident, prelude_ident.clone()], - &self.current_mod_path, - Visibility::Private, - )?; - } - + // Import std::prelude::* let std_string = STD.to_string(); // Only import std::prelude::* if std exists as a dependency if self.root.exists_as_external(&std_string) { diff --git a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs index 5615851fb60..a5a66d67316 100644 --- a/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs +++ b/sway-core/src/transform/to_parsed_lang/convert_parse_tree.rs @@ -2491,7 +2491,7 @@ fn expr_to_expression( assignable.clone(), )?; let rhs = Box::new(op_call( - op_variant.core_name(), + op_variant.std_name(), op_span, span.clone(), &vec![ @@ -2527,7 +2527,7 @@ fn op_call( inner: MethodName::FromTrait { call_path: CallPath { prefixes: vec![ - Ident::new_with_override("core".into(), op_span.clone()), + Ident::new_with_override("std".into(), op_span.clone()), Ident::new_with_override("ops".into(), op_span.clone()), ], suffix: Ident::new_with_override(name.into(), op_span.clone()), diff --git a/sway-types/src/constants.rs b/sway-types/src/constants.rs index 3a9f01edc1b..d63d0654d00 100644 --- a/sway-types/src/constants.rs +++ b/sway-types/src/constants.rs @@ -68,7 +68,6 @@ pub const VALID_ATTRIBUTE_NAMES: &[&str] = &[ FALLBACK_ATTRIBUTE_NAME, ]; -pub const CORE: &str = "core"; pub const STD: &str = "std"; pub const PRELUDE: &str = "prelude"; pub const CONTRACT_ID: &str = "CONTRACT_ID";