I am writing a c++ wallet and I need to be able to encode smart contract function calls in ABI format. I found that the web3 library has the ability, but it is written in JS. Is there a c++ alternative?
Thank you
I am writing a c++ wallet and I need to be able to encode smart contract function calls in ABI format. I found that the web3 library has the ability, but it is written in JS. Is there a c++ alternative?
Thank you
i found two of them and it's really bad. One is 392 mb size haha. Really you don't need it if you deal with known contract. here is sample of token mint from cpp.
#include <sys/socket.h>
#include <netdb.h>
#include <iostream>
#include <sstream>
#include <openssl/bn.h>
#include <string>
#include <iomanip>
#include <algorithm>
#include "keccak.h"
#include <unistd.h>
int main(int argc , char *argv[])
{
Keccak keccak256(Keccak::Keccak256);
std::stringstream f;
const char et[] = "mint(address,uint256)";
std::string ettag(keccak256(et), 0, 8);
f << "0x" << ettag;
std::string addr("0xF9cBf7b08f09ED3d4516E8b7A3FCbe4Dc7B3Cd40");
std::string addrone(addr, 2, 40);
f << std::setfill('0') << std::setw(64) << addrone;
unsigned long long c = 17000000000000000000ULL;
// std::reverse((unsigned char*)&c, (unsigned char*)&c + 8);
f << std::hex << std::setw(64) << c;
std::cout << "and then " << f.str().c_str() << std::endl;
int q;
hostent *host = gethostbyname("localhost");
sockaddr_in server = {AF_INET, htons( 8545 ), *((unsigned long*)host->h_addr)};
q = socket(AF_INET , SOCK_STREAM , 0);
connect(q, (sockaddr *)&server, sizeof(server));
std::stringstream fvea;
fvea << R"({"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from": "0x031200BCE52f44EDd8e3988c09faBF106b508F86","to": "0xEf49513C0261848b0e49c61f750Ec06a8d204AEe","gas": "0x31f90","gasPrice": "0xa111a000","value": "0x0", "data": ")" << f.str() << R"("}], "id":49})";
std::stringstream cp;
cp << "POST / HTTP/1.1\r\nContent-Length: "<< fvea.str().length() << "\r\n\r\n"<< fvea.str();
char b[2501]={};
send(q, cp.str().c_str(), cp.str().length(), 0);
recv(q, b, 2500, 0);
close(q);
std::cout << b << std::endl;
}
c++ --std=c++17 '/home/alex/Desktop/etr/port.cpp' '/home/alex/Desktop/etr/keccak.cpp' -o c
There is. You can use libethc. An example for encoding ERC20 balanceOf
call would be:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ethc/abi.h>
#define ok(ethcop) assert(ethcop >= 0)
int main(void) {
struct eth_abi abi;
char *fn = "balanceOf(address)", *addr="0x876D477Bd5cD050E6162cf757E1Bc02D93cdC0fE", *hex;
size_t hexlen;
ok(eth_abi_init(&abi, ETH_ABI_ENCODE));
ok(eth_abi_call(&abi, &fn, NULL)); // balanceOf(
ok(eth_abi_address(&abi, &addr)); // 0x876D477Bd5cD050E6162cf757E1Bc02D93cdC0fE
ok(eth_abi_call_end(&abi)); // )
ok(eth_abi_to_hex(&abi, &hex, &hexlen));
ok(eth_abi_free(&abi));
printf("encoded abi: %s\n", hex); // encoded abi: 70a08231000000000000000000000000876d477bd5cd050e6162cf757e1bc02d93cdc0fe
free(hex);
return 0;
}
#include <iostream>
#include <map>
using namespace std;
struct headSensitivity {
double sensitivity_x;
double sensitivity_y;
pair<double, double> cordinate;
// Default constructor
headSensitivity() : sensitivity_x(0.0), sensitivity_y(0.0), cordinate({0.0, 0.0}) {}
// Constructor for aggregate initialization
headSensitivity(double sx, double sy, pair<double, double> cord)
: sensitivity_x(sx), sensitivity_y(sy), cordinate(cord) {}
};
int main() {
map<double, headSensitivity> map_sensitivity;
map_sensitivity[0] = headSensitivity(900.0, 0.5, {0.5, 900.0});
map_sensitivity[1] = headSensitivity(900.0, 0.5, {0.5, 900.0});
map_sensitivity[2] = headSensitivity(900.0, 0.5, {0.5, 900.0});
for(const auto& par: map_sensitivity){
double clave = par.first;
const headSensitivity& data = par.second;
// Accessing members of headSensitivity
double x = data.sensitivity_x;
double y = data.sensitivity_y;
pair<double, double> coordinates = data.cordinate;
// Printing values
cout << "Key: " << clave << ", Sensitivity (x, y): (" << x << ", " << y << "), Coordinates: (" << coordinates.first << ", " << coordinates.second << ")" << endl;
}
return 0;
}