Skip to content
Snippets Groups Projects
wrapping_dap_chain_datum_tx.c 7.88 KiB
Newer Older
#include "wrapping_dap_chain_datum_tx.h"

/* DAP chain tx iter type */

PyObject *TX_ITEM_TYPE_IN_PY(void){
    return PyLong_FromLong(TX_ITEM_TYPE_IN);
}
PyObject *TX_ITEM_TYPE_OUT_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_OUT);
}
PyObject *TX_ITEM_TYPE_PKEY_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_PKEY);
}
PyObject *TX_ITEM_TYPE_SIG_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_SIG);
}
PyObject *TX_ITEM_TYPE_TOKEN_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_TOKEN);
}
PyObject *TX_ITEM_TYPE_IN_COND_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_IN_COND);
}
PyObject *TX_ITEM_TYPE_OUT_COND_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_OUT_COND);
}
PyObject *TX_ITEM_TYPE_RECEIPT_PY(void){
        return PyLong_FromLong(TX_ITEM_TYPE_RECEIPT);
}

/* -------------------------------------- */

/* DAP chain tx cond type */
PyObject *COND_SERVICE_PROVIDE_PY(){
    PyObject *obj = _PyObject_New(&DapChainTxCondType_DapChainTxCondTypeObject);
    ((PyDapChainTxCondTypeObject*)obj)->tx_cond_type_t = COND_SERVICE_PROVIDE;
    return Py_BuildValue("O", obj);
}
PyObject *COND_SERVICE_BILL_PY(){
    PyObject *obj = _PyObject_New(&DapChainTxCondType_DapChainTxCondTypeObject);
    ((PyDapChainTxCondTypeObject*)obj)->tx_cond_type_t = COND_SERVICE_BILL;
    return Py_BuildValue("O", obj);
}
/* -------------------------------------- */

/* DAP chain datum tx */
PyObject *PyDapChainDatumTxObject_create(PyTypeObject *type_object, PyObject *args, PyObject *kwds){
    PyDapChainDatumTxObject *obj = (PyDapChainDatumTxObject*)PyType_GenericNew(type_object, args, kwds);
    obj->datum_tx = dap_chain_datum_tx_create();
    return (PyObject *)obj;
}
void PyDapChainDatumTxObject_delete(PyDapChainDatumTxObject* datumTx){
    dap_chain_datum_tx_delete(datumTx->datum_tx);
    Py_TYPE(datumTx)->tp_free((PyObject*)datumTx);
}

PyObject *dap_chain_datum_tx_get_size_py(PyObject *self, PyObject *args){
    size_t size = dap_chain_datum_tx_get_size(((PyDapChainDatumTxObject*)self)->datum_tx);
    return PyLong_FromSize_t(size);
}
PyObject *dap_chain_datum_tx_add_item_py(PyObject *self, PyObject *args){
    PyObject *in_obj;
    u_int8_t *a_item;
    if (!PyArg_ParseTuple(args, "O|b", &in_obj, &a_item))
        return NULL;
    dap_chain_datum_tx_t **txs = PyListToDapChainDatumTxArray(in_obj);
    int res = dap_chain_datum_tx_add_item(txs, a_item);
    if (res == -1){
        return NULL;
    } else {
        PyObject *out = DapChainDatumTxArrayToPyList(txs);
        return Py_BuildValue("O", out);
    }
}
PyObject *dap_chain_datum_tx_add_in_item_py(PyObject *self, PyObject *args){
    PyObject *in_obj_datum_txs;
    PyObject *in_obj_hash_fast;
    uint32_t in_tx_out_pref_idx;
    if (!PyArg_ParseTuple(args, "O|O|I", &in_obj_datum_txs, &in_obj_hash_fast, &in_tx_out_pref_idx))
        return NULL;
    dap_chain_datum_tx_t **a_txs = PyListToDapChainDatumTxArray(in_obj_datum_txs);
alexey.stratulat's avatar
alexey.stratulat committed
    int res = dap_chain_datum_tx_add_in_item(a_txs, ((PyDapHashFastObject*)in_obj_hash_fast)->hash_fast,
                                             in_tx_out_pref_idx);
    if (res == -1){
        return NULL;
    } else {
        PyObject *out = DapChainDatumTxArrayToPyList(a_txs);
        return Py_BuildValue("O", out);
    }
}

PyObject *dap_chain_datum_tx_add_in_cond_item_py(PyObject *self, PyObject *args){
    PyObject *in_obj_datum_txs;
    PyObject *in_chain_hash_fast;
    unsigned int in_tx_out_prev_idx;
    unsigned int in_receipt_idx;
    if (!PyArg_ParseTuple(args, "O|O|I|I", &in_obj_datum_txs, &in_chain_hash_fast, &in_tx_out_prev_idx, &in_receipt_idx))
        return NULL;
    dap_chain_datum_tx_t **a_txs = PyListToDapChainDatumTxArray(in_obj_datum_txs);
alexey.stratulat's avatar
alexey.stratulat committed
    int res = dap_chain_datum_tx_add_in_cond_item(a_txs, ((PyDapHashFastObject*)in_chain_hash_fast)->hash_fast, in_tx_out_prev_idx, in_receipt_idx);
    return PyLong_FromLong(res);
}

PyObject *dap_chain_datum_tx_add_out_item_py(PyObject *self, PyObject *args){
    PyObject *in_obj_datum_txs;
    PyObject *in_addr;
    uint64_t value;
    if (!PyArg_ParseTuple(args, "O|O|k", &in_obj_datum_txs, &in_addr, value))
        return NULL;
    dap_chain_datum_tx_t **txs = PyListToDapChainDatumTxArray(in_obj_datum_txs);
    int res = dap_chain_datum_tx_add_out_item(txs, ((PyDapChainAddrObject*)in_addr)->addr, value);
    if (res == -1){
        return NULL;
    } else {
        PyObject *out = DapChainDatumTxArrayToPyList(txs);
        return Py_BuildValue("O", out);
    }
}
PyObject *dap_chain_datum_tx_add_out_cond_item_py(PyObject *self, PyObject *args){
    PyObject *obj_txs;
    PyObject *obj_key;
    PyObject *obj_srv_uid;
    uint64_t value;
    uint64_t value_max_per_unit;
    PyObject *obj_srv_price_unit_uid;
    PyObject *obj_cond_bytes;
    Py_ssize_t cond_size;
    if (!PyArg_ParseTuple(args, "O|O|O|k|k|O|O|n", &obj_txs, &obj_key, &obj_srv_uid, &value, &value_max_per_unit,
                          &obj_srv_price_unit_uid, &obj_cond_bytes, &cond_size))
        return NULL;
    dap_chain_datum_tx_t **txs = PyListToDapChainDatumTxArray(obj_txs);
    void *cond = (void*)PyBytes_AsString(obj_cond_bytes);
    int res = dap_chain_datum_tx_add_out_cond_item(txs, ((PyCryptoKeyObject*)obj_key)->key, ((PyDapChainNetSrvUIDObject*)obj_srv_uid)->net_srv_uid,
                                                   value, value_max_per_unit, ((PyDapChainNetSrvPriceUnitUIDObject*)obj_srv_price_unit_uid)->price_unit_uid,
                                                   cond, (size_t)cond_size);
    if (res == -1){
        return NULL;
    } else {
        PyObject *out = DapChainDatumTxArrayToPyList(txs);
        return Py_BuildValue("O", out);
    }
}
PyObject *dap_chain_datum_tx_add_sign_item_py(PyObject *self, PyObject *args){
    PyObject *obj_txs;
    PyObject *obj_key;
    if (!PyArg_ParseTuple(args, "O|O", &obj_txs, &obj_key))
        return NULL;
    dap_chain_datum_tx_t **txs = PyListToDapChainDatumTxArray(obj_txs);
    int res = dap_chain_datum_tx_add_sign_item(txs, ((PyCryptoKeyObject*)obj_key)->key);
    if (res == -1){
        return NULL;
    } else {
        PyObject *out = DapChainDatumTxArrayToPyList(txs);
        return Py_BuildValue("O", out);
    }
}
PyObject *dap_chain_datum_tx_verify_sign_py(PyObject *self, PyObject *args){
    int res = dap_chain_datum_tx_verify_sign(((PyDapChainDatumTxObject*)self)->datum_tx);
    return PyLong_FromLong(res);
}

static dap_chain_datum_tx_t **PyListToDapChainDatumTxArray(PyObject *a_in_obj){
    Py_ssize_t size = PyList_Size(a_in_obj);
    dap_chain_datum_tx_t **txs = calloc(sizeof(dap_chain_datum_tx_t), (size_t)size);
    for (Py_ssize_t i = 0; i < size;i++){
        txs[i] = ((PyDapChainDatumTxObject*)PyList_GetItem(a_in_obj, i))->datum_tx;
    }
    return txs;
}

static PyObject* DapChainDatumTxArrayToPyList(dap_chain_datum_tx_t** datum_txs){
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    size_t len = sizeof(datum_txs) / sizeof(*datum_txs);
    PyObject* list = PyList_New((Py_ssize_t)len);
    for (size_t i=0; i < len; i++){
        PyObject *obj = _PyObject_New(&DapChainDatumTx_DapChainDatumTxObjectType);
        ((PyDapChainDatumTxObject*)obj)->datum_tx = datum_txs[i];
        PyList_Append(list, obj);
    }
    return list;
}

dap_chain_tx_out_cond_t **PyListToDapChainTxOutCond(PyObject *list){
    Py_ssize_t size = PyList_Size(list);
    dap_chain_tx_out_cond_t **out_conds = calloc(sizeof(dap_chain_tx_out_cond_t), (size_t)size);
    for (Py_ssize_t i=0; i < size; i++){
        out_conds[i] = ((PyDapChainTxOutCondObject*)PyList_GetItem(list, i))->out_cond;
    }
    return out_conds;
}

PyObject *DapChainTxOutCondObjectToPyList(dap_chain_tx_out_cond_t **out_cond){
Dmitriy A. Gerasimov's avatar
Dmitriy A. Gerasimov committed
    size_t len = sizeof(out_cond) / sizeof(*out_cond);
    PyObject *list = PyList_New((Py_ssize_t)len);
    for (size_t i=0; i< len;i++ ){
        PyObject *obj = _PyObject_New(&DapChainTxOutCond_DapChainTxOutCondObjectType);
        ((PyDapChainTxOutCondObject*)obj)->out_cond = out_cond[i];
        PyList_Append(list, obj);
    }
    return list;
}

/* -------------------------------------- */