IoTeX client
abiDecode.h
1#ifndef IOTEX_ABI_DECODE_H
2#define IOTEX_ABI_DECODE_H
3
4#include "bignum/bignum.h"
5#include "helpers/client_helper.h"
6#include "IoTeXConstants.h"
7#include "IoTeXResultCodes.h"
8
9#include <stddef.h>
10#include <stdint.h>
11#include <vector>
12
13namespace
14{
15const uint8_t prefixSize = 2;
16void skip0xPrefix(const char** pData, size_t* size)
17{
18 if((*pData)[0] == '0' && ((*pData)[1] == 'x' || (*pData)[1] == 'X'))
19 {
20 (*pData) += 2;
21 *size -= 2;
22 }
23}
24} // namespace
25
26namespace iotex
27{
28namespace abi
29{
30namespace decode
31{
37uint8_t decodeUint8(const char pData[64]);
38
44uint16_t decodeUint16(const char pData[64]);
45
51uint32_t decodeUint32(const char pData[64]);
52
58uint64_t decodeUint64(const char pData[64]);
59
67iotex::ResultCode decodeBigUint(const char* pData, size_t uintSize, iotex::bignum::Bignum& out);
68
74int8_t decodeInt8(const char pData[64]);
75
81int16_t decodeInt16(const char pData[64]);
82
88int32_t decodeInt32(const char pData[64]);
89
95int64_t decodeInt64(const char pData[64]);
96
105iotex::ResultCode decodeString(const char* pData, size_t size, IotexString& out,
106 bool containsOffset = true);
107
114iotex::ResultCode decodeAddress(const char data[64], char out[ETH_ADDRESS_C_STRING_SIZE]);
115
122bool decodeBool(const char data[64]);
123
132iotex::ResultCode decodeStaticBytes(const char* pData, size_t bytesSize, uint8_t out[]);
133
142iotex::ResultCode decodeDynamicBytes(const char* pData, std::vector<uint8_t>& out,
143 bool containsOffset = true);
144
153iotex::ResultCode decodeStaticArrayUint8(const char* pData, size_t arraySize, uint8_t out[]);
154
163iotex::ResultCode decodeStaticArrayUint16(const char* pData, size_t arraySize, uint16_t out[]);
164
173iotex::ResultCode decodeStaticArrayUint32(const char* pData, size_t arraySize, uint32_t out[]);
174
183iotex::ResultCode decodeStaticArrayUint64(const char* pData, size_t arraySize, uint64_t out[]);
184
193iotex::ResultCode decodeStaticArrayUint256(const char* pData, size_t arraySize,
195
204iotex::ResultCode decodeStaticArrayBool(const char* pData, size_t arraySize, bool out[]);
205
214iotex::ResultCode decodeStaticArrayInt8(const char* pData, size_t arraySize, int8_t out[]);
215
224iotex::ResultCode decodeStaticArrayInt16(const char* pData, size_t arraySize, int16_t out[]);
225
234iotex::ResultCode decodeStaticArrayInt32(const char* pData, size_t arraySize, int32_t out[]);
235
244iotex::ResultCode decodeStaticArrayInt64(const char* pData, size_t arraySize, int64_t out[]);
245
254iotex::ResultCode decodeStaticArrayAddress(const char* pData, size_t arraySize,
255 char out[][ETH_ADDRESS_C_STRING_SIZE]);
256
265iotex::ResultCode decodeStaticArrayStaticBytes(const char* pData, size_t arraySize,
266 size_t bytesSize,
267 std::vector<std::vector<uint8_t>>& out);
268
277iotex::ResultCode decodeStaticArrayDynamicBytes(const char* pData, size_t arraySize,
278 std::vector<std::vector<uint8_t>>& out,
279 bool containsArrayOffset = true);
280
289iotex::ResultCode decodeStaticArrayString(const char* pData, size_t arraySize, IotexString out[],
290 bool containsArrayOffset = true);
291
292size_t getDynamicArraySize(const char* pData);
293
294iotex::ResultCode decodeUintGeneric(const char* pData, size_t uintSize, uint64_t* out);
295iotex::ResultCode decodeIntGeneric(const char* pData, size_t uintSize, int64_t* out);
296
297template<uint8_t size>
298ResultCode decodeUint(const char* pData, size_t dataSize, uint64_t* out)
299{
300 // The caller can pass the whole word (32 bytes) or more, but this funciton only decodes up to a
301 // <size> byte int.
302 if(size > sizeof(uint64_t))
303 return ResultCode::ERROR_BAD_PARAMETER;
304 size_t dataSizeWoPrefix = dataSize;
305 if(dataSize >= prefixSize + size)
306 {
307 skip0xPrefix(&pData, &dataSizeWoPrefix);
308 }
309 // Move the pointer to the end of data minus the integer size.
310 pData = pData + (dataSizeWoPrefix) - (size * 2);
311 return decodeUintGeneric(pData, size, (uint64_t*)out);
312}
313
314template<uint8_t size>
315ResultCode decodeInt(const char* pData, size_t dataSize, int64_t* out)
316{
317 // The caller can pass the whole word (32 bytes) or more, but this funciton only decodes up to a
318 // <size> byte int.
319 if(size > sizeof(uint64_t))
320 return ResultCode::ERROR_BAD_PARAMETER;
321 size_t dataSizeWoPrefix = dataSize;
322 if(dataSize >= prefixSize + size)
323 {
324 skip0xPrefix(&pData, &dataSizeWoPrefix);
325 }
326 // Move the pointer to the end of data minus the integer size
327 pData = pData + (dataSizeWoPrefix) - (size * 2);
328 return decodeIntGeneric(pData, size, (int64_t*)out);
329}
330} // namespace decode
331} // namespace abi
332} // namespace iotex
333
334#endif
Represents an unigned integer of up to 256 bytes.
Definition: bignum.h:21
Definition: abi.h:12