RLP is the serialization format that Ethereum uses to serialize objects to raw bytes.
Read more in the documentation on ReadTheDocs.
int wallet_ethereum_assemble_tx(EthereumSignTx *msg, EthereumSig *tx, uint64_t *rawTx) {
EncodeEthereumSignTx new_msg;
EncodeEthereumTxRequest new_tx;
memset(&new_msg, 0, sizeof(new_msg));
memset(&new_tx, 0, sizeof(new_tx));
wallet_encode_element(msg->nonce.bytes, msg->nonce.size,
new_msg.nonce.bytes, &(new_msg.nonce.size), false);
wallet_encode_element(msg->gas_price.bytes, msg->gas_price.size,
new_msg.gas_price.bytes, &(new_msg.gas_price.size), false);
wallet_encode_element(msg->gas_limit.bytes, msg->gas_limit.size,
new_msg.gas_limit.bytes, &(new_msg.gas_limit.size), false);
wallet_encode_element(msg->to.bytes, msg->to.size, new_msg.to.bytes,
&(new_msg.to.size), false);
wallet_encode_element(msg->value.bytes, msg->value.size,
new_msg.value.bytes, &(new_msg.value.size), false);
wallet_encode_element(msg->data_initial_chunk.bytes,
msg->data_initial_chunk.size, new_msg.data_initial_chunk.bytes,
&(new_msg.data_initial_chunk.size), false);
wallet_encode_int(tx->signature_v, &(new_tx.signature_v));
wallet_encode_element(tx->signature_r.bytes, tx->signature_r.size,
new_tx.signature_r.bytes, &(new_tx.signature_r.size), true);
wallet_encode_element(tx->signature_s.bytes, tx->signature_s.size,
new_tx.signature_s.bytes, &(new_tx.signature_s.size), true);
int length = wallet_encode_list(&new_msg, &new_tx, rawTx);
return length;
}
void assembleTx() {
static char rawTx[256];
EthereumSignTx tx;
EthereumSig signature;
uint64_t raw_tx_bytes[24];
const char *nonce = "00";
const char *gas_price = "4a817c800";
const char *gas_limit = "5208";
const char *to = "e0defb92145fef3c3a945637705fafd3aa74a241";
const char *value = "de0b6b3a7640000";
const char *data = "00";
const char *r = "09ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9c";
const char *s = "440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428";
uint32_t v = 27;
tx.nonce.size = size_of_bytes(strlen(nonce));
hex2byte_arr(nonce, strlen(nonce), tx.nonce.bytes, tx.nonce.size);
tx.gas_price.size = size_of_bytes(strlen(gas_price));
hex2byte_arr(gas_price, strlen(gas_price), tx.gas_price.bytes, tx.gas_price.size);
tx.gas_limit.size = size_of_bytes(strlen(gas_limit));
hex2byte_arr(gas_limit, strlen(gas_limit), tx.gas_limit.bytes, tx.gas_limit.size);
tx.to.size = size_of_bytes(strlen(to));
hex2byte_arr(to, strlen(to), tx.to.bytes, tx.to.size);
tx.value.size = size_of_bytes(strlen(value));
hex2byte_arr(value, strlen(value), tx.value.bytes, tx.value.size);
tx.data_initial_chunk.size = size_of_bytes(strlen(data));
hex2byte_arr(data, strlen(data), tx.data_initial_chunk.bytes,
tx.data_initial_chunk.size);
signature.signature_v = 27;
signature.signature_r.size = size_of_bytes(strlen(r));
hex2byte_arr(r, strlen(r), signature.signature_r.bytes, signature.signature_r.size);
signature.signature_s.size = size_of_bytes(strlen(s));
hex2byte_arr(s, strlen(s), signature.signature_s.bytes, signature.signature_s.size);
int length = wallet_ethereum_assemble_tx(&tx, &signature, raw_tx_bytes);
int8_to_char((uint8_t *) raw_tx_bytes, length, rawTx);
printf("raw tx: %s", rawTx);
}
Output:
raw transaction: f86c008504a817c80082520894e0defb92145fef3c3a945637705fafd3aa74a209880de0b6b3a7640000001ba009ebb6ca057a0535d6186462bc0b465b561c94a295bdb0621fc19208ab149a9ca0440ffd775ce91a833ab410777204d5341a6f9fa91216a6f3ee2c051fea6a0428
Please contact sfa.alptekin@gmail.com