From 738dfaedf50f3a81fd727cc1b8014e1a8fcdf9f0 Mon Sep 17 00:00:00 2001 From: as-iotex Date: Fri, 25 Mar 2022 17:32:33 +0000 Subject: [PATCH] feat: add address abi decoding --- src/abi/abiDecode.cpp | 11 ++++++++ src/abi/abiDecode.h | 1 + tests/CMakeLists.txt | 2 ++ .../src/abi/decode/abiDecodeAddressTests.cpp | 27 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 tests/src/abi/decode/abiDecodeAddressTests.cpp diff --git a/src/abi/abiDecode.cpp b/src/abi/abiDecode.cpp index 251fc28..5611c8c 100644 --- a/src/abi/abiDecode.cpp +++ b/src/abi/abiDecode.cpp @@ -121,3 +121,14 @@ ResultCode iotex::abi::decode::decodeString(const char* pData, size_t size, Iote return ResultCode::SUCCESS; } + +iotex::ResultCode iotex::abi::decode::decodeAddress(const char data[64], char out[ETH_ADDRESS_C_STRING_SIZE]) +{ + // The address is encoded as a uint160 + // Ie. big-endian encoding padded on the higher-order (left) side with zero-bytes such that the length is 32 bytes. + out[ETH_ADDRESS_C_STRING_SIZE-1] = 0; + const char* pStart = data + 24; // 12 padding bytes + memcpy(out, pStart, ETH_ADDRESS_C_STRING_SIZE - 1); + + return ResultCode::SUCCESS; +} \ No newline at end of file diff --git a/src/abi/abiDecode.h b/src/abi/abiDecode.h index 48ed564..713ff60 100644 --- a/src/abi/abiDecode.h +++ b/src/abi/abiDecode.h @@ -90,6 +90,7 @@ bool decodeBool(const char data[64]); iotex::ResultCode decodeUintGeneric(const char* pData, size_t uintSize, uint64_t* out); iotex::ResultCode decodeIntGeneric(const char* pData, size_t uintSize, int64_t* out); iotex::ResultCode decodeString(const char* pData, size_t size, IotexString& out); +iotex::ResultCode decodeAddress(const char data[64], char out[ETH_ADDRESS_C_STRING_SIZE]); template ResultCode decodeUint(const char* pData, size_t dataSize, uint64_t* out) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7da2edc..3348a62 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -42,6 +42,8 @@ set (IOTEX_UNIT_TESTS_SOURCES src/abi/abiTests.cpp src/abi/decode/abiDecodeUintTests.cpp src/abi/decode/abiDecodeIntTests.cpp + src/abi/decode/abiDecodeStringTests.cpp + src/abi/decode/abiDecodeAddressTests.cpp src/contract/contractTests.cpp src/contract/xrc20ContractTests.cpp src/account/accountTests_Execution.cpp diff --git a/tests/src/abi/decode/abiDecodeAddressTests.cpp b/tests/src/abi/decode/abiDecodeAddressTests.cpp new file mode 100644 index 0000000..b3ad265 --- /dev/null +++ b/tests/src/abi/decode/abiDecodeAddressTests.cpp @@ -0,0 +1,27 @@ +#include +#include + +#include "abi/abiDecode.h" +#include "contract/contract.h" +#include "signer/signer.h" + +using namespace std; +using namespace testing; +using namespace iotex; +using namespace iotex::abi::decode; + +class AbiDecodeAddressTests : public Test +{ + void SetUp() override {} + + void TearDown() override {} +}; + +TEST_F(AbiDecodeAddressTests, DecodesCorrectly) +{ + const char encoded[] = "00000000000000000000000019e7e376e7c213b7e7e7e46cc70a5dd086daff2a"; + char decoded[ETH_ADDRESS_C_STRING_SIZE]; + ResultCode res = decodeAddress(encoded, decoded); + ASSERT_EQ(ResultCode::SUCCESS, res); + ASSERT_STREQ("19e7e376e7c213b7e7e7e46cc70a5dd086daff2a", decoded); +}