Skip to content

Commit a1623e5

Browse files
committed
add ethereum conversion function
Signed-off-by: Mislav Novakovic <[email protected]>
1 parent a0ad23a commit a1623e5

File tree

3 files changed

+155
-0
lines changed

3 files changed

+155
-0
lines changed

eth/web3.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,3 +235,68 @@ int eth_getTransactionReceipt(web3_ctx_t *web3, const tx_hash_t *tx_hash)
235235
WEB3_TERMINATOR();
236236
return 0;
237237
}
238+
239+
int eth_convert(const uint256_t *amount, enum ETH_UNIT from, enum ETH_UNIT to, char *buf, size_t buf_size)
240+
{
241+
assert(amount != NULL);
242+
size_t shift = from > to ? from - to : to - from;
243+
244+
if(tostring256(amount, 10, buf, buf_size) == false) {
245+
return -1;
246+
}
247+
248+
// special case '0'
249+
if(buf[0] == '0') return 0;
250+
251+
// finish if the unit doesn't change
252+
if (shift == 0) {
253+
return 0;
254+
// conversion to smaller unit, add '0'
255+
} else if (from > to) {
256+
size_t i;
257+
size_t len = strlen(buf);
258+
// check buffer size
259+
if (len + shift > buf_size) {
260+
return -1;
261+
}
262+
// add zeros
263+
for (i = len; i < len + shift; ++i) {
264+
buf[i] = '0';
265+
}
266+
buf[len + shift] = '\0';
267+
// conversion to bigger unit add '.'
268+
} else {
269+
size_t i;
270+
size_t len = strlen(buf);
271+
size_t skip = LEADING_ZERO + DECIMAL_POINT;
272+
if (len > shift) {
273+
// check buffer size
274+
if (len + DECIMAL_POINT > buf_size) {
275+
return -1;
276+
}
277+
// move numbers
278+
for (i = len + skip; i > len - shift; --i) {
279+
buf[i] = buf[i - 1];
280+
}
281+
buf[len - shift] = '.';
282+
} else {
283+
// check buffer size
284+
if (shift + skip > buf_size) {
285+
return -1;
286+
}
287+
// move numbers
288+
for (i = len; (int) i >= 0; --i) {
289+
buf[i + shift + skip - len] = buf[i];
290+
}
291+
// add '0.' at the beggining
292+
buf[0] = '0';
293+
buf[1] = '.';
294+
// fill the rest with zeros
295+
for (i = skip; i < shift - len + skip; ++i) {
296+
buf[i] = '0';
297+
}
298+
}
299+
}
300+
301+
return 0;
302+
}

eth/web3.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,24 @@ int eth_call(web3_ctx_t *web3, const address_t *from, const transaction_t *tx, u
3535
int eth_estimateGas(web3_ctx_t *web3, const address_t *from, const transaction_t *tx);
3636
int eth_getTransactionReceipt(web3_ctx_t *web3, const tx_hash_t *tx_hash);
3737

38+
#define DECIMAL_POINT 1
39+
#define LEADING_ZERO 1
40+
41+
enum ETH_UNIT {
42+
ETH_UNIT_WEI = 0,
43+
ETH_UNIT_KWEI = 3,
44+
ETH_UNIT_MWEI = 6,
45+
ETH_UNIT_GWEI = 9,
46+
ETH_UNIT_SZABO = 12,
47+
ETH_UNIT_FINNEY = 15,
48+
ETH_UNIT_ETHER = 18,
49+
ETH_UNIT_KETHER = 21,
50+
ETH_UNIT_METHER = 24,
51+
ETH_UNIT_GETHER = 27,
52+
ETH_UNIT_TETHER = 30
53+
};
54+
int eth_convert(const uint256_t *amount, enum ETH_UNIT from, enum ETH_UNIT to, char *buf, size_t buf_size);
55+
3856
#ifdef __cplusplus
3957
}
4058
#endif

examples/tests/src/test_web3.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,75 @@ TEST(TEST_WEB3, test_decode_txreceipt)
105105
ASSERT_EQ(receipt.blockNumber, 0x8d1447);
106106
}
107107

108+
void helper_eth_convert(uint64_t value, const char *compare, enum ETH_UNIT from, enum ETH_UNIT to)
109+
{
110+
int rc;
111+
uint256_t amount;
112+
const size_t buf_len = 50;
113+
char buf[buf_len] = {0};
114+
set256_uint64(&amount, value);
115+
rc = eth_convert(&amount, from, to, buf, buf_len);
116+
ASSERT_EQ(rc, 0);
117+
ASSERT_EQ(strcmp(buf, compare), 0);
118+
ASSERT_EQ(strlen(buf), strlen(compare));
119+
}
120+
121+
TEST(TEST_ETH_CONVERT, test_eth_convert)
122+
{
123+
int rc;
124+
uint256_t amount;
125+
const size_t buf_len = 50;
126+
char buf[buf_len] = {0};
127+
128+
set256_uint64(&amount, 1234);
129+
130+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_FINNEY, buf, 3);
131+
ASSERT_EQ(rc, -1);
132+
133+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_ETHER, buf, 4);
134+
ASSERT_EQ(rc, 0);
135+
ASSERT_EQ(strcmp(buf, "1234"), 0);
136+
137+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_FINNEY, buf, 6);
138+
ASSERT_EQ(rc, -1);
139+
140+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_FINNEY, buf, 7);
141+
ASSERT_EQ(rc, 0);
142+
ASSERT_EQ(strcmp(buf, "1234000"), 0);
143+
144+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_KETHER, buf, 4);
145+
ASSERT_EQ(rc, -1);
146+
147+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_KETHER, buf, 5);
148+
ASSERT_EQ(rc, 0);
149+
ASSERT_EQ(strcmp(buf, "1.234"), 0);
150+
151+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_METHER, buf, 7);
152+
ASSERT_EQ(rc, -1);
153+
154+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_METHER, buf, 8);
155+
ASSERT_EQ(rc, 0);
156+
ASSERT_EQ(strcmp(buf, "0.001234"), 0);
157+
158+
helper_eth_convert(1,"1000000000000000000", ETH_UNIT_ETHER, ETH_UNIT_WEI);
159+
helper_eth_convert(1,"1000000000000000", ETH_UNIT_ETHER, ETH_UNIT_KWEI);
160+
helper_eth_convert(1,"1000000000000", ETH_UNIT_ETHER, ETH_UNIT_MWEI);
161+
helper_eth_convert(1,"1000000000", ETH_UNIT_ETHER, ETH_UNIT_GWEI);
162+
helper_eth_convert(1,"1000000", ETH_UNIT_ETHER, ETH_UNIT_SZABO);
163+
helper_eth_convert(1,"1000", ETH_UNIT_ETHER, ETH_UNIT_FINNEY);
164+
helper_eth_convert(1,"1", ETH_UNIT_ETHER, ETH_UNIT_ETHER);
165+
helper_eth_convert(1,"0.001", ETH_UNIT_ETHER, ETH_UNIT_KETHER);
166+
helper_eth_convert(1,"0.000001", ETH_UNIT_ETHER, ETH_UNIT_METHER);
167+
helper_eth_convert(1,"0.000000001", ETH_UNIT_ETHER, ETH_UNIT_GETHER);
168+
helper_eth_convert(1,"0.000000000001", ETH_UNIT_ETHER, ETH_UNIT_TETHER);
169+
170+
set256_uint64(&amount, 0);
171+
rc = eth_convert(&amount, ETH_UNIT_ETHER, ETH_UNIT_WEI, buf, buf_len);
172+
ASSERT_EQ(rc, 0);
173+
ASSERT_EQ(strcmp(buf, "0"), 0);
174+
175+
helper_eth_convert(123,"0.123", ETH_UNIT_ETHER, ETH_UNIT_KETHER);
176+
helper_eth_convert(1234,"1.234", ETH_UNIT_ETHER, ETH_UNIT_KETHER);
177+
helper_eth_convert(12345,"12.345", ETH_UNIT_ETHER, ETH_UNIT_KETHER);
178+
helper_eth_convert(123456,"123.456", ETH_UNIT_ETHER, ETH_UNIT_KETHER);
179+
}

0 commit comments

Comments
 (0)