From 2b94cc3b26932b54d359931d4d96db533fc11093 Mon Sep 17 00:00:00 2001 From: "alexey.stratulat" <alexey.stratulat@demlabs.net> Date: Sat, 8 Jan 2022 22:09:34 +0700 Subject: [PATCH] [+] Added attributes for reading data from dap chain_datum_token_t and dap chain _datum_token_emission_t. --- .../include/wrapping_dap_chain_datum_token.h | 40 ++++- .../src/wrapping_dap_chain_datum_token.c | 144 ++++++++++++++++++ 2 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_token.c diff --git a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h index 1da688e3..9c0eedaa 100644 --- a/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h +++ b/modules/cellframe-sdk/common/include/wrapping_dap_chain_datum_token.h @@ -28,6 +28,7 @@ #include "Python.h" #include "dap_chain_datum_token.h" +#include "wrapping_dap_chain_common.h" #ifdef __cplusplus extern "C" { @@ -40,6 +41,17 @@ typedef struct PyDapChainDatumToken{ dap_chain_datum_token_t *token; }PyDapChainDatumTokenObject; +PyObject *wrapping_dap_chain_datum_token_get_ticker(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_get_type_str(PyObject *self, void *closure); +//PyObject *wrapping_dap_chain_datum_token_get_size(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_get_data(PyObject *self, void *closure); + +static PyGetSetDef PyDapChainDatumTokenGetsSetsDef[]={ + {"ticker", (getter)wrapping_dap_chain_datum_token_get_ticker, NULL, NULL}, + {"data", (getter)wrapping_dap_chain_datum_token_get_data, NULL, NULL}, + {NULL} +}; + static PyTypeObject DapChainDatumToken_DapChainDatumTokenObjectType = { PyVarObject_HEAD_INIT(NULL, 0) "CellFrame.Chain.DatumTokenObject", /* tp_name */ @@ -71,7 +83,7 @@ static PyTypeObject DapChainDatumToken_DapChainDatumTokenObjectType = { 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ - 0, /* tp_getset */ + PyDapChainDatumTokenGetsSetsDef, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ @@ -91,6 +103,28 @@ typedef struct PyDapChainDatumTokenEmission{ dap_chain_datum_token_emission_t *token_emission; }PyDapChainDatumTokenEmissionObject; +PyObject *wrapping_dap_chain_datum_token_emission_get_version(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_emission_get_type_str(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_emission_get_ticker(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_emission_get_addr(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_emission_get_value(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_emission_get_nonce(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_datum_token_emission_get_data(PyObject *self, void *closure); + +static PyGetSetDef PyDapChainDatumTokenEmissionGetsSetsDef[]={ + {"version", (getter)wrapping_dap_chain_datum_token_emission_get_version, NULL, NULL}, + {"typeStr", (getter)wrapping_dap_chain_datum_token_emission_get_type_str, NULL, NULL}, + {"ticker", (getter)wrapping_dap_chain_datum_token_emission_get_ticker, NULL, NULL}, + {"addr", (getter)wrapping_dap_chain_datum_token_emission_get_addr, NULL, NULL}, + {"value", (getter)wrapping_dap_chain_datum_token_emission_get_value, NULL, NULL}, + {"data", (getter)wrapping_dap_chain_datum_token_emission_get_data, NULL, NULL}, + {NULL} +}; + +static PyMethodDef PyDapChainDatumTokenEmissionMethods[]={ + {NULL, NULL, 0, NULL} +}; + static PyTypeObject DapChainDatumTokenEmission_DapChainDatumTokenEmissionObjectType = { PyVarObject_HEAD_INIT(NULL, 0) "CellFrame.Chain.DatumTokenEmission", /* tp_name */ @@ -120,9 +154,9 @@ static PyTypeObject DapChainDatumTokenEmission_DapChainDatumTokenEmissionObjectT 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ - 0, /* tp_methods */ + PyDapChainDatumTokenEmissionMethods, /* tp_methods */ 0, /* tp_members */ - 0, /* tp_getset */ + PyDapChainDatumTokenEmissionGetsSetsDef, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ diff --git a/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_token.c b/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_token.c new file mode 100644 index 00000000..01758249 --- /dev/null +++ b/modules/cellframe-sdk/common/src/wrapping_dap_chain_datum_token.c @@ -0,0 +1,144 @@ +#include "wrapping_dap_chain_datum_token.h" + +/* Token */ +PyObject *wrapping_dap_chain_datum_token_get_ticker(PyObject *self, void *closure){ + (void)closure; + return Py_BuildValue("s", ((PyDapChainDatumTokenObject*)self)->token->ticker); +} +PyObject *wrapping_dap_chain_datum_token_get_type_str(PyObject *self, void *closure){ + (void)closure; +} +//PyObject *wrapping_dap_chain_datum_token_get_size(PyObject *self, void *closure){ +// (void)closure; +// return Py_BuildValue("", ((PyDapChainDatumTokenObject*)self)->token->) +//} +PyObject *wrapping_dap_chain_datum_token_get_data(PyObject *self, void *closure){ + (void)closure; + dap_chain_datum_token_t *l_token = ((PyDapChainDatumTokenObject*)self)->token; + PyObject *obj_dict = PyDict_New(); + PyObject *obj_dict_header_private = NULL; + PyObject *obj = Py_None; + switch(l_token->type){ + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: + obj = Py_BuildValue("H", l_token->header_private.signs_total); + PyDict_SetItemString(obj_dict, "signs_total", obj); + obj = Py_BuildValue("H", l_token->header_private.signs_valid); + PyDict_SetItemString(obj_dict, "signs_valid", obj); + if (dap_chain_datum_token_is_old(l_token->type)) + obj = Py_BuildValue("k", l_token->header_private.total_supply); + else + obj = Py_BuildValue("s", dap_chain_balance_print(l_token->header_private.total_supply_256)); + PyDict_SetItemString(obj_dict, "total_supply", obj); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: + break; + default: + return Py_None; + } + return obj_dict; +} + +/* Token Emission */ +PyObject *wrapping_dap_chain_datum_token_emission_get_version(PyObject *self, void *closure){ + (void)closure; + return Py_BuildValue("I", ((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.version); +} +PyObject *wrapping_dap_chain_datum_token_emission_get_type_str(PyObject *self, void *closure){ + (void)closure; + const char *str; + switch (((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.type) { + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + str = "TOKEN_EMISSION_TYPE_UNDEFINED"; + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: + str = "TOKEN_EMISSION_TYPE_AUTH"; + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: + str = "TOKEN_EMISSION_TYPE_ALGO"; + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + str = "TOKEN_EMISSION_TYPE_ATOM_OWNER"; + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: + str = "TOKEN_EMISSION_TYPE_SMART_CONTRACT"; + break; + default: + str = "UNDEFINED"; + } + return Py_BuildValue("s", str); +// const char *str = "UNDEFINED"; +//#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED 0x00 +//#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH 0x01 +//#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO 0x02 +//#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER 0x03 +//#define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT 0x04 +// const char *str = c_dap_chain_datum_token_emission_type_str(((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.type); +// return Py_BuildValue("s", str); +} +PyObject *wrapping_dap_chain_datum_token_emission_get_ticker(PyObject *self, void *closure){ + (void)closure; +// log_it(L_NOTICE, "ticker in token: %s", ((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.ticker); + return Py_BuildValue("s", ((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.ticker); +} +PyObject *wrapping_dap_chain_datum_token_emission_get_addr(PyObject *self, void *closure){ + (void)closure; + PyDapChainAddrObject *obj_addr = PyObject_New(PyDapChainAddrObject, &DapChainAddrObject_DapChainAddrObjectType); + PyObject_Dir((PyObject*)obj_addr); + obj_addr->addr = &((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.address; + return (PyObject*)obj_addr; +} +PyObject *wrapping_dap_chain_datum_token_emission_get_value(PyObject *self, void *closure){ + (void)closure; + return Py_BuildValue("k", ((PyDapChainDatumTokenEmissionObject*)self)->token_emission->hdr.value); +} +PyObject *wrapping_dap_chain_datum_token_emission_get_nonce(PyObject *self, void *closure){ + (void)closure; +} +PyObject *wrapping_dap_chain_datum_token_emission_get_data(PyObject *self, void *closure){ + (void)closure; + PyObject *obj_dict = NULL; + PyObject *obj_tmp = Py_None; + dap_chain_datum_token_emission_t *token_emi = ((PyDapChainDatumTokenEmissionObject*)self)->token_emission; + PyDapSignObject *obj_tmp_sign = Py_None; + switch(token_emi->hdr.type){ + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: + obj_dict = PyDict_New(); + obj_tmp = PyList_New(token_emi->data.type_auth.signs_count); + for (size_t i = 0; i < token_emi->data.type_auth.signs_count; i++){ + obj_tmp_sign = PyObject_New(PyDapSignObject, &DapSignObject_DapSignObjectType); + PyObject_Dir((PyObject*)obj_tmp_sign); + obj_tmp_sign->sign = DAP_NEW(dap_sign_t); + memcpy( + obj_tmp_sign->sign + sizeof(dap_sign_t) * i, + token_emi->data.type_auth.signs[i], + sizeof(dap_sign_t)); + PyList_SetItem(obj_tmp, i, obj_tmp_sign); + } + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: + obj_dict = PyDict_New(); + obj_tmp = Py_BuildValue("s", token_emi->data.type_algo.codename); + PyDict_SetItemString(obj_dict, "codename", obj_tmp); + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + obj_dict = PyDict_New(); + obj_tmp = Py_BuildValue("k", token_emi->data.type_atom_owner.value_start); + PyDict_SetItemString(obj_dict, "value_start", obj_tmp); + obj_tmp = Py_BuildValue("s", token_emi->data.type_atom_owner.value_change_algo_codename); + PyDict_SetItemString(obj_dict, "value_change_algo_codename", obj_tmp); + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: + obj_dict = PyDict_New(); + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + return Py_None; + break; + default: + return Py_None; + } +} \ No newline at end of file -- GitLab