1#ifndef IOTEX_ABI_DECODE_H
2#define IOTEX_ABI_DECODE_H
4#include "bignum/bignum.h"
5#include "helpers/client_helper.h"
6#include "IoTeXConstants.h"
7#include "IoTeXResultCodes.h"
15const uint8_t prefixSize = 2;
16void skip0xPrefix(
const char** pData,
size_t* size)
18 if((*pData)[0] ==
'0' && ((*pData)[1] ==
'x' || (*pData)[1] ==
'X'))
37uint8_t decodeUint8(
const char pData[64]);
44uint16_t decodeUint16(
const char pData[64]);
51uint32_t decodeUint32(
const char pData[64]);
58uint64_t decodeUint64(
const char pData[64]);
74int8_t decodeInt8(
const char pData[64]);
81int16_t decodeInt16(
const char pData[64]);
88int32_t decodeInt32(
const char pData[64]);
95int64_t decodeInt64(
const char pData[64]);
105iotex::ResultCode decodeString(
const char* pData,
size_t size, IotexString& out,
106 bool containsOffset =
true);
114iotex::ResultCode decodeAddress(
const char data[64],
char out[ETH_ADDRESS_C_STRING_SIZE]);
122bool decodeBool(
const char data[64]);
132iotex::ResultCode decodeStaticBytes(
const char* pData,
size_t bytesSize, uint8_t out[]);
142iotex::ResultCode decodeDynamicBytes(
const char* pData, std::vector<uint8_t>& out,
143 bool containsOffset =
true);
153iotex::ResultCode decodeStaticArrayUint8(
const char* pData,
size_t arraySize, uint8_t out[]);
163iotex::ResultCode decodeStaticArrayUint16(
const char* pData,
size_t arraySize, uint16_t out[]);
173iotex::ResultCode decodeStaticArrayUint32(
const char* pData,
size_t arraySize, uint32_t out[]);
183iotex::ResultCode decodeStaticArrayUint64(
const char* pData,
size_t arraySize, uint64_t out[]);
193iotex::ResultCode decodeStaticArrayUint256(
const char* pData,
size_t arraySize,
204iotex::ResultCode decodeStaticArrayBool(
const char* pData,
size_t arraySize,
bool out[]);
214iotex::ResultCode decodeStaticArrayInt8(
const char* pData,
size_t arraySize, int8_t out[]);
224iotex::ResultCode decodeStaticArrayInt16(
const char* pData,
size_t arraySize, int16_t out[]);
234iotex::ResultCode decodeStaticArrayInt32(
const char* pData,
size_t arraySize, int32_t out[]);
244iotex::ResultCode decodeStaticArrayInt64(
const char* pData,
size_t arraySize, int64_t out[]);
254iotex::ResultCode decodeStaticArrayAddress(
const char* pData,
size_t arraySize,
255 char out[][ETH_ADDRESS_C_STRING_SIZE]);
265iotex::ResultCode decodeStaticArrayStaticBytes(
const char* pData,
size_t arraySize,
267 std::vector<std::vector<uint8_t>>& out);
277iotex::ResultCode decodeStaticArrayDynamicBytes(
const char* pData,
size_t arraySize,
278 std::vector<std::vector<uint8_t>>& out,
279 bool containsArrayOffset =
true);
289iotex::ResultCode decodeStaticArrayString(
const char* pData,
size_t arraySize, IotexString out[],
290 bool containsArrayOffset =
true);
292size_t getDynamicArraySize(
const char* pData);
294iotex::ResultCode decodeUintGeneric(
const char* pData,
size_t uintSize, uint64_t* out);
295iotex::ResultCode decodeIntGeneric(
const char* pData,
size_t uintSize, int64_t* out);
297template<u
int8_t size>
298ResultCode decodeUint(
const char* pData,
size_t dataSize, uint64_t* out)
302 if(size >
sizeof(uint64_t))
303 return ResultCode::ERROR_BAD_PARAMETER;
304 size_t dataSizeWoPrefix = dataSize;
305 if(dataSize >= prefixSize + size)
307 skip0xPrefix(&pData, &dataSizeWoPrefix);
310 pData = pData + (dataSizeWoPrefix) - (size * 2);
311 return decodeUintGeneric(pData, size, (uint64_t*)out);
314template<u
int8_t size>
315ResultCode decodeInt(
const char* pData,
size_t dataSize, int64_t* out)
319 if(size >
sizeof(uint64_t))
320 return ResultCode::ERROR_BAD_PARAMETER;
321 size_t dataSizeWoPrefix = dataSize;
322 if(dataSize >= prefixSize + size)
324 skip0xPrefix(&pData, &dataSizeWoPrefix);
327 pData = pData + (dataSizeWoPrefix) - (size * 2);
328 return decodeIntGeneric(pData, size, (int64_t*)out);
Represents an unigned integer of up to 256 bytes.
Definition: bignum.h:21