From f29e1922f1efbeefb1d176552274588421455e5a Mon Sep 17 00:00:00 2001
From: Jean-Lessa <75625278+Jean-Lessa@users.noreply.github.com>
Date: Tue, 6 Feb 2024 20:25:22 -0300
Subject: [PATCH 001/688] Fix constness on ContractCallLogger
---
src/contract/contractcalllogger.h | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/contract/contractcalllogger.h b/src/contract/contractcalllogger.h
index d88ac5c2..10d474fd 100644
--- a/src/contract/contractcalllogger.h
+++ b/src/contract/contractcalllogger.h
@@ -65,15 +65,15 @@ class ContractCallLogger {
~ContractCallLogger();
/// Copy constructor (deleted).
- ContractCallLogger(ContractCallLogger& other) = delete;
+ ContractCallLogger(const ContractCallLogger& other) = delete;
/// Move constructor (deleted).
ContractCallLogger(ContractCallLogger&& other) = delete;
- /// Copy assignment opetator (deleted).
- ContractCallLogger& operator=(ContractCallLogger& other) = delete;
+ /// Copy assignment operator (deleted).
+ ContractCallLogger& operator=(const ContractCallLogger& other) = delete;
- /// Move assignment opetator (deleted).
+ /// Move assignment operator (deleted).
ContractCallLogger& operator=(ContractCallLogger&& other) = delete;
/// Getter for `balances`.
From 09130d448e58d5daf7d5ab20ae09a24d5b8321de Mon Sep 17 00:00:00 2001
From: Jean-Lessa <75625278+Jean-Lessa@users.noreply.github.com>
Date: Wed, 7 Feb 2024 14:37:51 -0300
Subject: [PATCH 002/688] Deprecate HexTo & fix SafeAddress copy ctor
---
src/contract/variables/safeaddress.h | 4 +---
src/utils/hex.h | 27 ++++++++++-----------------
src/utils/strings.h | 1 -
src/utils/utils.h | 2 +-
tests/utils/hex.cpp | 13 +++++++++++++
5 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/src/contract/variables/safeaddress.h b/src/contract/variables/safeaddress.h
index 37717e1f..a660bd02 100644
--- a/src/contract/variables/safeaddress.h
+++ b/src/contract/variables/safeaddress.h
@@ -47,9 +47,7 @@ class SafeAddress : public SafeBase {
/// Copy constructor.
SafeAddress(const SafeAddress& other) : SafeBase(nullptr) {
- check();
- address_ = other.address_;
- addressPtr_ = std::make_unique
(*other.addressPtr_);
+ other.check(); addressPtr_ = std::make_unique(*other.addressPtr_);
}
/// Getter for the value. Returns the value from the pointer.
diff --git a/src/utils/hex.h b/src/utils/hex.h
index 2f97124c..ff433bd9 100644
--- a/src/utils/hex.h
+++ b/src/utils/hex.h
@@ -26,23 +26,8 @@ using BytesArr = std::array;
using BytesArrView = std::span;
using BytesArrMutableView = std::span;
-
using uint256_t = boost::multiprecision::number>;
-/**
- * Helper struct for use with Boost's lexical_cast to convert hex strings
- * to a given type (`boost::lexical_cast<%HexTo>(hexStr)`).
- */
-template struct HexTo {
- ElemT value; ///< The value to hold.
- operator ElemT() const { return value; } ///< Operator to get the value.
- /// Stream operator.
- friend std::istream& operator>>(std::istream& in, HexTo& out) {
- in >> std::hex >> out.value;
- return in;
- }
-};
-
/// Abstraction of a strictly hex-formatted string (`(0x)[1-9][a-f][A-F]`).
class Hex {
private:
@@ -125,9 +110,17 @@ class Hex {
/// Getter for `hex`.
inline const std::string& get() const { return this->hex_; }
- /// Getter for `hex`, but converts it back to an unsigned integer.
+ /**
+ * Getter for `hex`, but converts it back to an unsigned 256-bit integer.
+ * @throw std::length_error if hex is too big to be converted to uint256_t.
+ */
inline uint256_t getUint() const {
- return boost::lexical_cast>(this->hex_);
+ Bytes b = Hex::toBytes(this->hex_);
+ if (b.size() > 32) throw std::length_error("Hex too big for uint conversion");
+ BytesArrView bV(b.data(), b.size());
+ uint256_t ret;
+ boost::multiprecision::import_bits(ret, bV.begin(), bV.end(), 8);
+ return ret;
}
/**
diff --git a/src/utils/strings.h b/src/utils/strings.h
index 2a790958..640e9933 100644
--- a/src/utils/strings.h
+++ b/src/utils/strings.h
@@ -35,7 +35,6 @@ See the LICENSE.txt file in the project root for more information.
* This class is used as a base for both classes inheriting it
* (e.g. Hash, Signature, etc.) and aliases (e.g. PrivKey, PubKey, etc.).
*/
-
template class FixedBytes {
protected:
BytesArr data_; ///< Internal string data.
diff --git a/src/utils/utils.h b/src/utils/utils.h
index d18588fd..5cd54e8f 100644
--- a/src/utils/utils.h
+++ b/src/utils/utils.h
@@ -18,6 +18,7 @@ See the LICENSE.txt file in the project root for more information.
#include
#include
#include
+#include
#include
#include
@@ -33,7 +34,6 @@ See the LICENSE.txt file in the project root for more information.
#include "src/libs/json.hpp"
#include "src/contract/variables/safeuint.h"
#include "src/contract/variables/safeint.h"
-#include
/// @file utils.h
diff --git a/tests/utils/hex.cpp b/tests/utils/hex.cpp
index 522625a6..585ca7a1 100644
--- a/tests/utils/hex.cpp
+++ b/tests/utils/hex.cpp
@@ -122,10 +122,23 @@ namespace THex {
SECTION("Hex GetUint") {
std::string hexStr = "0x1234";
+ std::string oddHexStr = "0xfffff";
+ std::string evenHexStr = "0x0fffff";
+ std::string tooBigHexStr = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; // 33 bytes
Hex hex(hexStr, false);
Hex hexStrict(hexStr, true);
+ Hex oddHex(oddHexStr, true);
+ Hex evenHex(evenHexStr, true);
+ Hex tooBigHex(tooBigHexStr, true);
REQUIRE(hex.getUint() == uint256_t(4660));
REQUIRE(hexStrict.getUint() == uint256_t(4660));
+ REQUIRE(oddHex.getUint() == uint256_t(1048575));
+ REQUIRE(evenHex.getUint() == uint256_t(1048575));
+ try {
+ uint256_t wrongNumber = tooBigHex.getUint();
+ } catch (std::length_error& e) {
+ REQUIRE(e.what() == std::string("Hex too big for uint conversion"));
+ }
}
SECTION("Hex Substr") {
From 07b534d4c2f1f8e688b306c5ab7f3a6c6872b04d Mon Sep 17 00:00:00 2001
From: Itamar Carvalho <32653934+itamarcps@users.noreply.github.com>
Date: Wed, 7 Feb 2024 15:04:13 -0300
Subject: [PATCH 003/688] Replace std::enable_if usage with requires
---
src/contract/abi.h | 71 ++++---
src/contract/contractfactory.h | 15 +-
src/contract/contractmanager.h | 3 +-
src/contract/variables/safetuple.h | 11 +-
src/contract/variables/safeuint.h | 300 ++++++++++++++---------------
src/utils/jsonabi.h | 8 +-
6 files changed, 206 insertions(+), 202 deletions(-)
diff --git a/src/contract/abi.h b/src/contract/abi.h
index 03806ee2..7fd638bd 100644
--- a/src/contract/abi.h
+++ b/src/contract/abi.h
@@ -249,7 +249,7 @@ namespace ABI {
template<> struct TypeName { static std::string get() { return "string"; }};
/// Enum types are encoded as uint8_t
template
- struct TypeName>> {
+ requires std::is_enum_v struct TypeName {
static std::string get() {
return TypeName::get();
}
@@ -424,9 +424,9 @@ namespace ABI {
};
/// Specializations for int types (int8_t, int16_t, int24_t, ..., int256_t)
- /// Takes advantage of std::enable_if_t to check if the type is a or int.
+ /// Takes advantage of requires to check if the type is a or int.
template
- struct TypeEncoder || std::is_same_v || std::is_same_v ||
+ requires std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
@@ -436,16 +436,17 @@ namespace ABI {
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
- std::is_same_v || std::is_same_v>> {
+ std::is_same_v || std::is_same_v
+ struct TypeEncoder {
static Bytes encode(const T& i) {
return encodeInt(i);
}
};
/// Specialization for uint types (uint8_t, uint16_t, uint24_t, ..., uint256_t)
- /// Takes advantage of std::enable_if_t to check if the type is a or uint.
+ /// Takes advantage of requires to check if the type is a or uint.
template
- struct TypeEncoder || std::is_same_v || std::is_same_v ||
+ requires std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
@@ -455,7 +456,8 @@ namespace ABI {
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
- std::is_same_v || std::is_same_v>> {
+ std::is_same_v || std::is_same_v
+ struct TypeEncoder {
static Bytes encode(const T& i) {
return encodeUint(i);
}
@@ -463,7 +465,8 @@ namespace ABI {
/// Specialization for enum types
template
- struct TypeEncoder>> {
+ requires std::is_enum_v
+ struct TypeEncoder {
static Bytes encode(const T& i) {
return encodeUint(static_cast(i));
}
@@ -605,9 +608,9 @@ namespace ABI {
};
/// Specializations for int types (int8_t, int16_t, int24_t, ..., int256_t)
- /// Takes advantage of std::enable_if_t to check if the type is a or int.
+ /// Takes advantage of requires to check if the type is a or int.
template
- struct TypeEncoder || std::is_same_v || std::is_same_v ||
+ requires std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
@@ -617,16 +620,17 @@ namespace ABI {
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
- std::is_same_v || std::is_same_v>> {
+ std::is_same_v || std::is_same_v
+ struct TypeEncoder {
static Bytes encode(const T& i) {
return ABI::Encoder::encodeInt(i);
}
};
/// Specialization for uint types (uint8_t, uint16_t, uint24_t, ..., uint256_t)
- /// Takes advantage of std::enable_if_t to check if the type is a or uint.
+ /// Takes advantage of requires to check if the type is a or uint.
template
- struct TypeEncoder || std::is_same_v || std::is_same_v ||
+ requires std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
@@ -636,14 +640,17 @@ namespace ABI {
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
- std::is_same_v || std::is_same_v>> {
+ std::is_same_v || std::is_same_v
+ struct TypeEncoder {
static Bytes encode(const T& i) {
return ABI::Encoder::encodeUint(i);
}
};
/// Specialization for enum types
- template struct TypeEncoder>> {
+ template
+ requires std::is_enum_v
+ struct TypeEncoder {
static Bytes encode(const T& i) {
return ABI::Encoder::encodeUint(static_cast(i));
}
@@ -823,9 +830,9 @@ namespace ABI {
};
/// Specializations for int types (int8_t, int16_t, int24_t, ..., int256_t)
- /// Takes advantage of std::enable_if_t to check if the type is a or int.
+ /// Takes advantage of requires to check if the type is a or int.
template
- struct TypeDecoder || std::is_same_v || std::is_same_v ||
+ requires std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
@@ -835,16 +842,17 @@ namespace ABI {
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
- std::is_same_v || std::is_same_v>> {
+ std::is_same_v || std::is_same_v
+ struct TypeDecoder {
static T decode(const BytesArrView& bytes, uint64_t& index) {
return static_cast(decodeInt(bytes, index));
}
};
/// Specialization for uint types (uint8_t, uint16_t, uint24_t, ..., uint256_t)
- /// Takes advantage of std::enable_if_t to check if the type is a or uint.
+ /// Takes advantage of requires to check if the type is a or uint.
template
- struct TypeDecoder || std::is_same_v || std::is_same_v ||
+ requires std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
@@ -854,7 +862,8 @@ namespace ABI {
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
std::is_same_v || std::is_same_v || std::is_same_v ||
- std::is_same_v || std::is_same_v>> {
+ std::is_same_v || std::is_same_v
+ struct TypeDecoder {
static T decode(const BytesArrView& bytes, uint64_t& index) {
return static_cast(decodeUint(bytes, index));
}
@@ -862,7 +871,8 @@ namespace ABI {
/// Specialization for enum types
template
- struct TypeDecoder>> {
+ requires std::is_enum_v
+ struct TypeDecoder {
static T decode(const BytesArrView& bytes, uint64_t& index) {
return static_cast(decodeUint(bytes, index));
}
@@ -870,7 +880,8 @@ namespace ABI {
/// Forward declaration of TypeDecode> so TypeDecoder> can see it.
template
- struct TypeDecoder>> {
+ requires isVectorV
+ struct TypeDecoder {
static T decode(const BytesArrView& bytes, uint64_t& index);
};
@@ -894,7 +905,8 @@ namespace ABI {
/// Specialization for std::tuple
template
- struct TypeDecoder::value>> {
+ requires isTuple::value
+ struct TypeDecoder {
static T decode(const BytesArrView& bytes, uint64_t& index) {
T ret;
if constexpr (isTupleOfDynamicTypes::value) {
@@ -916,7 +928,8 @@ namespace ABI {
/// Specialization for std::vector
template
- T TypeDecoder>>::decode(const BytesArrView& bytes, uint64_t& index) {
+ requires isVectorV
+ T TypeDecoder::decode(const BytesArrView& bytes, uint64_t& index) {
using ElementType = vectorElementTypeT;
std::vector retVector;
// Get array offset
@@ -944,8 +957,8 @@ namespace ABI {
/// Specialization of decodeTupleHelper() for when tuple index is the last one
template
- typename std::enable_if_t
- decodeTupleHelper(const BytesArrView&, const uint64_t&, std::tuple&) {
+ requires (Index == sizeof...(Args))
+ void decodeTupleHelper(const BytesArrView&, const uint64_t&, std::tuple&) {
// End of recursion, do nothing
}
@@ -958,8 +971,8 @@ namespace ABI {
* @param tuple The tuple to hold the decoded values.
*/
template
- typename std::enable_if_t
- decodeTupleHelper(const BytesArrView& encodedData, uint64_t& index, std::tuple& tuple) {
+ requires (Index < sizeof...(Args))
+ void decodeTupleHelper(const BytesArrView& encodedData, uint64_t& index, std::tuple& tuple) {
// TODO: Technically, we could pass std::get(tuple) as a reference to decode<>().
// But, it is worth to reduce code readability for a few nanoseconds? Need to benchmark.
std::get(tuple) = TypeDecoder>>::decode(encodedData, index);
diff --git a/src/contract/contractfactory.h b/src/contract/contractfactory.h
index ed91000a..e42a6865 100644
--- a/src/contract/contractfactory.h
+++ b/src/contract/contractfactory.h
@@ -197,19 +197,11 @@ class ContractFactory {
* @tparam Tuple The tuple of contracts to add.
*/
template
- std::enable_if_t