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