diff --git a/CellFrame/python-cellframe.c b/CellFrame/python-cellframe.c index c01d180842aa8acd4ac213a3e0d416eb8779d836..5be61405964f037507f8fb8a90a2059c6fd74528 100644 --- a/CellFrame/python-cellframe.c +++ b/CellFrame/python-cellframe.c @@ -607,7 +607,7 @@ PyMODINIT_FUNC PyInit_libCellFrame(void) PyType_Ready( &PyDapChainNetSrvStakePosDelegateObjectType ) < 0 || PyType_Ready( &PyDapStreamChChainValidatorTestObjectType ) < 0 || PyType_Ready( &DapChainNetSrvXchangeObjectType ) < 0 || - PyType_Ready( &PyDapChainNetSrvXchangePriceObjectType ) < 0 || + PyType_Ready( &PyDapChainNetSrvXchangeOrderObjectType ) < 0 || PyType_Ready( &PyDapChainNetSrvVoteObjectType ) < 0 || PyType_Ready( &DapChainNetSrvVoteInfoObjectType ) < 0 || PyType_Ready( &DapChainNetSrvVoteInfoOptionObjectType ) < 0 || diff --git a/dists/examples/plugins/dex/dex.py b/dists/examples/plugins/dex/dex.py new file mode 100644 index 0000000000000000000000000000000000000000..5e91adf4b47e5868d84cda24673975ff81d4bf3c --- /dev/null +++ b/dists/examples/plugins/dex/dex.py @@ -0,0 +1,92 @@ +from DAP.Core import logIt, AppContext +from CellFrame import AppCliServer +from DAP.Network import Server as IO, HttpSimple +from CellFrame.Services import Xchange +from CellFrame.Network import Net +from DAP.Core import Math +from CellFrame.Chain import Wallet + + +def find_arg_value(val, argv): + for i, arg in enumerate(argv): + if arg == val: + if len(argv) > i+1: + return argv[i+1] + + return None + +def find_arg(val, argv): + for i, arg in enumerate(argv): + if arg == val: + return True + + return False + + +def list_orders(argv, rpi): + netname = find_arg_value("-net", argv) + net = Net.byName(netname) + orders = Xchange.getOrders(net) + msg = f"Net {netname} has {len(orders)} orders:\n" + + for p in orders: + msg += f"Order: {str(p.orderHash)} [{p.status}]" + "\n" + msg += f"\t Buying {int(str(p.datoshiBuy))/10**18} {p.tokenBuy} " + msg += f"for {int(str(p.datoshiSell))/10**18} {p.tokenSell} " + msg += f"(rate={int(str(p.rate))/10**18} " + msg += f"completed={p.completionRate}%) \n" + msg += f"\t Fee: {p.fee}" + "\n" + msg += f"\t Last tx: {p.txHash}" + "\n" + msg += "\n" + AppCliServer.setReplyText(msg, rpi) + + +def purchase(argv, rpi): + + netname = find_arg_value("-net", argv) + orderhash = find_arg_value("-order", argv) + value = Math(find_arg_value("-value", argv)) + wallet = Wallet.openFile(find_arg_value("-wallet", argv)) + + net = Net.byName(netname) + order = next(filter(lambda x: str(x.orderHash) == str(orderhash), Xchange.getOrders(net)),None) + + if not order: + AppCliServer.setReplyText("Order not found", rpi) + return + + order.purchase(value, net.validatorAverageFee, wallet) + +def create(argv, rpi): + netname = find_arg_value("-net", argv) + tsell = find_arg_value("-tsell", argv) + tbuy = find_arg_value("-tbuy", argv) + sellval = Math(find_arg_value("-value", argv) ) + rate = Math(find_arg_value("-rate", argv)) + wallet = Wallet.openFile(find_arg_value("-wallet", argv)) + + net = Net.byName(netname) + Xchange.createOrder(net, tsell, tbuy, sellval, rate, net.validatorAverageFee, wallet) + +def close(argv, rpi): + netname = find_arg_value("-net", argv) + orderhash = find_arg_value("-order", argv) + wallet = Wallet.openFile(find_arg_value("-wallet", argv)) + + net = Net.byName(netname) + order = next(filter(lambda x: str(x.orderHash) == str(orderhash), Xchange.getOrders(net)),None) + + if not order: + AppCliServer.setReplyText("Order not found", rpi) + return + + order.invalidate(net.valĂÂșidatorAverageFee, wallet) + + +def init(): + logIt.notice("Starting dex test plugin") + AppCliServer.cmdItemCreate("xlist", list_orders, "Show awailable XChange orders") + AppCliServer.cmdItemCreate("xpur", purchase, "purchase order") + AppCliServer.cmdItemCreate("xcreate", create, "create order") + AppCliServer.cmdItemCreate("xrm", close, "close order") + return 0 diff --git a/dists/examples/plugins/dex/manifest.json b/dists/examples/plugins/dex/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..0f73bf586d9a110fa5b545a070dee213a709c4b7 --- /dev/null +++ b/dists/examples/plugins/dex/manifest.json @@ -0,0 +1,8 @@ +{ + "name": "dex", + "version": "1.0", + "author": "DEMLABS (C) 2024", + "dependencies": [], + "type":"python", + "description": "staking-engine: scan outer providers for new contract event, provide http-api for staking frontend" +} diff --git a/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange.h b/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange.h index 850fc6f3f43da5b09048eb0fcfd1148911718df5..729baecee9c2195492741ba3164ceaf6064820a7 100644 --- a/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange.h +++ b/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange.h @@ -30,8 +30,7 @@ typedef struct PyDapChainNetSrvXchange{ static PyObject *CellFrame_Xchange_error; -PyObject *wrapping_dap_chain_net_srv_xchange_get_prices(PyObject *self, PyObject *argv); +PyObject *wrapping_dap_chain_net_srv_xchange_get_orders(PyObject *self, PyObject *argv); PyObject *wrapping_dap_chain_net_srv_xchange_create(PyObject *self, PyObject *argv); -PyObject *wrapping_dap_chain_net_srv_xchange_remove(PyObject *self, PyObject *argv); extern PyTypeObject DapChainNetSrvXchangeObjectType; \ No newline at end of file diff --git a/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange_price.h b/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange_price.h index d647f8b7eada443c19f1d91a710b3a5d91ca36fa..f34ce3df18fc5f418d88d84faaea95e839431dd0 100644 --- a/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange_price.h +++ b/modules/cellframe-sdk/services/xchange/include/wrapping_dap_chain_net_srv_xchange_price.h @@ -28,7 +28,7 @@ typedef struct PyDapChainNetSrvXchangePrice { PyObject_HEAD dap_chain_net_srv_xchange_price_t *price; -}PyDapChainNetSrvXchangePriceObject; +}PyDapChainNetSrvXchangeOrderObject; static PyObject *CellFrame_Xchange_Price_error; @@ -39,12 +39,15 @@ PyObject *wrapping_dap_chain_net_srv_xchange_price_get_token_buy(PyObject *self, PyObject *wrapping_dap_chain_net_srv_xchange_price_get_datoshi_buy(PyObject *self, void *closure); PyObject *wrapping_dap_chain_net_srv_xchange_price_get_rate(PyObject *self, void *closure); PyObject *wrapping_dap_chain_net_srv_xchange_price_get_fee(PyObject *self, void *closure); + PyObject *wrapping_dap_chain_net_srv_xchange_price_get_tx_hash(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_completion_rate(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_status(PyObject *self, void *closure); PyObject *wrapping_dap_chain_net_srv_xchange_price_get_order_hash(PyObject *self, void *closure); -PyObject *wrapping_dap_chain_net_srv_xchange_price_get_wallet_key(PyObject *self, void *closure); - -PyObject *wrapping_dap_chain_net_srv_xchange_price_create_object(dap_chain_net_srv_xchange_price_t *a_price); +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_order_creator_address(PyObject *self, void *closure); +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_order_creation_date(PyObject *self, void *closure); PyObject *wrapping_dap_chain_net_srv_xchange_price_purchase(PyObject *self, PyObject *argv); +PyObject *wrapping_dap_chain_net_srv_xchange_price_invalidate(PyObject *self, PyObject *argv); -extern PyTypeObject PyDapChainNetSrvXchangePriceObjectType; +extern PyTypeObject PyDapChainNetSrvXchangeOrderObjectType; diff --git a/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange.c b/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange.c index 776a56510fcce59f5d858b0d9cc3a34691604535..b1739431821bf2ecdc3b3b665f1ffe0a304ef0b5 100644 --- a/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange.c +++ b/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange.c @@ -7,26 +7,20 @@ PyMethodDef DapChainNetSrvXchangeMethods[] = { { - "getPrices", - wrapping_dap_chain_net_srv_xchange_get_prices, + "getOrders", + wrapping_dap_chain_net_srv_xchange_get_orders, METH_VARARGS | METH_STATIC, "The function receives a list of prices for exchange; if there are no prices, then an empty list is returned."}, { - "createExchange", + "createOrder", wrapping_dap_chain_net_srv_xchange_create, METH_VARARGS | METH_STATIC, "The function creates a base transaction and an exchange order." }, - { - "removeExchange", - wrapping_dap_chain_net_srv_xchange_remove, - METH_VARARGS | METH_STATIC, - "This function deletes an exchange order." - }, {NULL, NULL, 0, NULL} }; -PyObject *wrapping_dap_chain_net_srv_xchange_get_prices(PyObject *self, PyObject *argv){ +PyObject *wrapping_dap_chain_net_srv_xchange_get_orders(PyObject *self, PyObject *argv){ (void)self; PyObject *obj_net; if (!PyArg_ParseTuple(argv, "O", &obj_net)) { @@ -37,8 +31,11 @@ PyObject *wrapping_dap_chain_net_srv_xchange_get_prices(PyObject *self, PyObject PyObject *obj_list_price = PyList_New(0); while (tmp) { dap_chain_net_srv_xchange_price_t *l_price = (dap_chain_net_srv_xchange_price_t*)tmp->data; - PyObject *l_obj_price = wrapping_dap_chain_net_srv_xchange_price_create_object(l_price); - PyList_Append(obj_list_price, l_obj_price); + PyDapChainNetSrvXchangeOrderObject *l_obj_price = PyObject_New(PyDapChainNetSrvXchangeOrderObject, + &PyDapChainNetSrvXchangeOrderObjectType); + l_obj_price->price = DAP_NEW(dap_chain_net_srv_xchange_price_t); + memcpy(l_obj_price->price, l_price, sizeof(dap_chain_net_srv_xchange_price_t)); + PyList_Append(obj_list_price, (PyObject*)l_obj_price); Py_XDECREF(l_obj_price); tmp = tmp->next; } @@ -57,6 +54,32 @@ PyObject *wrapping_dap_chain_net_srv_xchange_create(PyObject *self, PyObject *ar PyObject *obj_wallet; if (!PyArg_ParseTuple(argv, "OssOOOO", &obj_net, &l_token_sell, &l_token_buy, &obj_value_sell, &obj_rate, &obj_fee, &obj_wallet)) { + PyErr_SetString(PyExc_AttributeError, "Cant parse args"); + return NULL; + } + if (!PyDapChainNet_Check(obj_net)) { + PyErr_SetString(PyExc_AttributeError, "The first parameter to the function passed an incorrect " + "argument. This must be an instance of the dapchain net class."); + return NULL; + } + if (!DapMathObject_Check(obj_value_sell)) { + PyErr_SetString(PyExc_AttributeError, "The forth argument was passed incorrectly. This must be " + "an instance of an object of type Math."); + return NULL; + } + if (!DapMathObject_Check(obj_rate)) { + PyErr_SetString(PyExc_AttributeError, "The fifth argument was passed incorrectly. This must be " + "an instance of an object of type Math."); + return NULL; + } + if (!DapMathObject_Check(obj_fee)) { + PyErr_SetString(PyExc_AttributeError, "The sixth parameter to the function passed an incorrect " + "argument. This must be an instance of the Wallet class."); + return NULL; + } + if (!PyDapChainWalletObject_Check(obj_wallet)) { + PyErr_SetString(PyExc_AttributeError, "The seventh parameter to the function passed an incorrect " + "argument. This must be an instance of the Wallet class."); return NULL; } dap_chain_net_t *l_net = ((PyDapChainNetObject*)obj_net)->chain_net; @@ -138,51 +161,6 @@ PyObject *wrapping_dap_chain_net_srv_xchange_create(PyObject *self, PyObject *ar } } -PyObject *wrapping_dap_chain_net_srv_xchange_remove(PyObject *self, PyObject *argv){ - (void)self; - PyObject *obj_net; - PyObject *obj_fee; - PyObject *obj_wallet; - PyObject *obj_tx_hash; - if (!PyArg_ParseTuple(argv, "OOOO", &obj_net, &obj_tx_hash, &obj_fee, &obj_wallet)) - return NULL; - char *l_tx_hash_out = NULL; - int l_ret_code = dap_chain_net_srv_xchange_remove(((PyDapChainNetObject*)obj_net)->chain_net, - ((PyDapHashFastObject*)obj_tx_hash)->hash_fast, - ((DapMathObject*)obj_fee)->value, - ((PyDapChainWalletObject*)obj_wallet)->wallet, &l_tx_hash_out); - switch (l_ret_code) { - case XCHANGE_REMOVE_ERROR_OK:{ - return Py_BuildValue("s", l_tx_hash_out); - } - case XCHANGE_REMOVE_ERROR_INVALID_ARGUMENT: { - PyErr_SetString(CellFrame_Xchange_error, "One of the input arguments is not set correctly."); - return NULL; - } - case XCHANGE_REMOVE_ERROR_FEE_IS_ZERO: { - PyErr_SetString(CellFrame_Xchange_error, "Fee is zero."); - return NULL; - } - case XCHANGE_REMOVE_ERROR_CAN_NOT_FIND_TX: { - PyErr_SetString(CellFrame_Xchange_error, "Specified order not found."); - return NULL; - } - case XCHANGE_REMOVE_ERROR_CAN_NOT_CREATE_PRICE: { - PyErr_SetString(CellFrame_Xchange_error, "Can't create price object from order."); - return NULL; - } - case XCHANGE_REMOVE_ERROR_CAN_NOT_INVALIDATE_TX: { - PyErr_SetString(CellFrame_Xchange_error, "Can't create invalidate transaction."); - return NULL; - } - default: { - char *l_ret = dap_strdup_printf("An error occurred with an unknown code: %d.", l_ret_code); - PyErr_SetString(CellFrame_Xchange_error, l_ret); - DAP_DELETE(l_ret); - return NULL; - } - } -} PyTypeObject DapChainNetSrvXchangeObjectType = DAP_PY_TYPE_OBJECT( "CellFrame.Service.Xchange", diff --git a/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange_price.c b/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange_price.c index e6c54c4da8be05eca01ca5e782ff9a62ef36bbb4..445aa4400ddb8c6b763df255d70cad15fa943801 100644 --- a/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange_price.c +++ b/modules/cellframe-sdk/services/xchange/wrapping_dap_chain_net_srv_xchange_price.c @@ -4,7 +4,7 @@ #include "libdap_crypto_key_python.h" #include "dap_chain_wallet_python.h" -#define PRICE(a) ((PyDapChainNetSrvXchangePriceObject*)a)->price +#define PRICE(a) ((PyDapChainNetSrvXchangeOrderObject*)a)->price PyGetSetDef DapChainNetSrvXchangePriceGetSetDef[] = { {"tokenSell", (getter)wrapping_dap_chain_net_srv_xchange_price_get_token_sell, NULL, NULL, NULL}, @@ -16,7 +16,10 @@ PyGetSetDef DapChainNetSrvXchangePriceGetSetDef[] = { {"fee", (getter)wrapping_dap_chain_net_srv_xchange_price_get_fee, NULL, NULL, NULL}, {"txHash", (getter)wrapping_dap_chain_net_srv_xchange_price_get_tx_hash, NULL, NULL, NULL}, {"orderHash", (getter)wrapping_dap_chain_net_srv_xchange_price_get_order_hash, NULL, NULL, NULL}, - {"walletKey", (getter)wrapping_dap_chain_net_srv_xchange_price_get_wallet_key, NULL, NULL, NULL}, + {"completionRate", (getter)wrapping_dap_chain_net_srv_xchange_price_get_completion_rate, NULL, NULL, NULL}, + {"status", (getter)wrapping_dap_chain_net_srv_xchange_price_get_status, NULL, NULL, NULL}, + {"creator_addr", (getter)wrapping_dap_chain_net_srv_xchange_price_get_order_creator_address, NULL, NULL, NULL}, + {"creation_date", (getter)wrapping_dap_chain_net_srv_xchange_price_get_order_creation_date, NULL, NULL, NULL}, {} }; @@ -27,9 +30,21 @@ PyMethodDef DapChainNetSrvXchangePriceMethods[] = { METH_VARARGS, "Function for partial or full purchase of an order." }, + { + "invalidate", + wrapping_dap_chain_net_srv_xchange_price_invalidate, + METH_VARARGS, + "Function for order invalidation." + }, {NULL} }; +void DapChainNetSrvXchangePrice_free(PyDapChainNetSrvXchangeOrderObject *self){ + DAP_DELETE(self->price); + Py_TYPE(self)->tp_free((PyObject*)self); +} + + PyObject *wrapping_dap_chain_net_srv_xchange_price_get_token_sell(PyObject *self, void *closure){ UNUSED(closure); return Py_BuildValue("s", PRICE(self)->token_sell); @@ -64,13 +79,37 @@ PyObject *wrapping_dap_chain_net_srv_xchange_price_get_rate(PyObject *self, void } PyObject *wrapping_dap_chain_net_srv_xchange_price_get_fee(PyObject *self, void *closure){ UNUSED(closure); - DapMathObject *obj_math = PyObject_New(DapMathObject, &DapMathObjectType); - obj_math->value = PRICE(self)->fee; - return (PyObject*)obj_math; + DapMathObject *order_fee = PyObject_New(DapMathObject, &DapMathObjectType); + DapMathObject *network_fee = PyObject_New(DapMathObject, &DapMathObjectType); + + uint256_t current_net_fee_val; + dap_chain_addr_t comission_addr; + uint16_t comission_type; + dap_chain_net_srv_xchange_get_fee(PRICE(self)->net->pub.id, ¤t_net_fee_val, &comission_addr, &comission_type); + + order_fee->value = PRICE(self)->fee; + network_fee->value = current_net_fee_val; + + PyDapChainAddrObject *obj_addr = PyObject_New(PyDapChainAddrObject, &DapChainAddrObjectType); + obj_addr->addr = DAP_NEW(dap_chain_addr_t); + mempcpy(obj_addr->addr, &comission_addr, sizeof(dap_chain_addr_t)); + + PyObject *res = PyDict_New(); + PyDict_SetItemString(res, "order_fee", order_fee); + PyDict_SetItemString(res, "network_fee", order_fee); + PyDict_SetItemString(res, "address", obj_addr); + PyDict_SetItemString(res, "type", Py_BuildValue("s", dap_chain_net_srv_fee_type_to_str(comission_type))); + + const char *l_native_ticker = PRICE(self)->net->pub.native_ticker; + const char *l_service_ticker = (comission_type == SERVICE_FEE_OWN_FIXED || comission_type == SERVICE_FEE_OWN_PERCENT) ? + PRICE(self)->token_buy : l_native_ticker; + + PyDict_SetItemString(res, "token", Py_BuildValue("s", l_service_ticker)); + return (PyObject*)res; } PyObject *wrapping_dap_chain_net_srv_xchange_price_get_tx_hash(PyObject *self, void *closure){ UNUSED(closure); - PyDapHashFastObject *obj_hash = PyObject_NEW(PyDapHashFastObject, &DapHashFastObjectType); + PyDapHashFastObject *obj_hash = PyObject_New(PyDapHashFastObject, &DapChainHashFastObjectType); obj_hash->hash_fast = DAP_NEW(dap_chain_hash_fast_t); dap_chain_hash_fast_t l_hf = PRICE(self)->tx_hash; memcpy(obj_hash->hash_fast, &l_hf, sizeof(dap_chain_hash_fast_t)); @@ -79,31 +118,112 @@ PyObject *wrapping_dap_chain_net_srv_xchange_price_get_tx_hash(PyObject *self, v } PyObject *wrapping_dap_chain_net_srv_xchange_price_get_order_hash(PyObject *self, void *closure){ UNUSED(closure); - PyDapHashFastObject *obj_hash = PyObject_NEW(PyDapHashFastObject, &DapHashFastObjectType); - obj_hash->hash_fast = DAP_NEW(dap_chain_hash_fast_t); + PyDapHashFastObject *obj_hf = PyObject_New(PyDapHashFastObject, &DapChainHashFastObjectType); + obj_hf->hash_fast = DAP_NEW(dap_hash_fast_t); dap_chain_hash_fast_t l_hf = PRICE(self)->order_hash; - memcpy(obj_hash->hash_fast, &l_hf, sizeof(dap_chain_hash_fast_t)); - obj_hash->origin = true; - return (PyObject*)obj_hash; + memcpy(obj_hf->hash_fast, &l_hf, sizeof(dap_chain_hash_fast_t)); + obj_hf->origin = true; + return (PyObject*)obj_hf; } -PyObject *wrapping_dap_chain_net_srv_xchange_price_get_wallet_key(PyObject *self, void *closure){ - UNUSED(closure); - PyCryptoKeyObject *obj_key = PyObject_New(PyCryptoKeyObject, &PyCryptoKeyObjectType); - obj_key->key = PRICE(self)->wallet_key; - return (PyObject*)obj_key; + +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_completion_rate(PyObject *self, void *closure){ + return Py_BuildValue("l",dap_chain_net_srv_xchange_get_order_completion_rate(PRICE(self)->net, PRICE(self)->order_hash)); +} + +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_order_creator_address(PyObject *self, void *closure){ + + PyDapChainAddrObject *obj_addr = PyObject_New(PyDapChainAddrObject, &DapChainAddrObjectType); + obj_addr->addr = DAP_NEW(dap_chain_addr_t); + mempcpy(obj_addr->addr, &PRICE(self)->creator_addr, sizeof(dap_chain_addr_t)); + return obj_addr; +} + +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_order_creation_date(PyObject *self, void *closure){ + + PyObject *obj_ts_float = PyLong_FromLong(PRICE(self)->creation_date); + PyObject *obj_ts = Py_BuildValue("(O)", obj_ts_float); + PyDateTime_IMPORT; + PyObject *obj_dt = PyDateTime_FromTimestamp(obj_ts); + return obj_dt; +} + +PyObject *wrapping_dap_chain_net_srv_xchange_price_get_status(PyObject *self, void *closure){ + switch (dap_chain_net_srv_xchange_get_order_status(PRICE(self)->net, PRICE(self)->order_hash)) + { + case XCHANGE_ORDER_STATUS_OPENED: + return Py_BuildValue("s", "OPENED"); + + case XCHANGE_ORDER_STATUS_CLOSED: + return Py_BuildValue("s", "CLOSED"); + } + return Py_BuildValue("s", "UNKNOWN"); +} + +PyObject *wrapping_dap_chain_net_srv_xchange_price_invalidate(PyObject *self, PyObject *argv) { + (void) self; + PyObject *obj_fee; + PyObject *obj_wallet; + + if (!PyArg_ParseTuple(argv, "OO", &obj_fee, &obj_wallet)) + return NULL; + + if (!DapMathObject_Check(obj_fee)) { + PyErr_SetString(PyExc_AttributeError, "The first argument was passed incorrectly. This must be " + "an instance of an object of type Math."); + return NULL; + } + + if (!PyDapChainWalletObject_Check(obj_wallet)) { + PyErr_SetString(PyExc_AttributeError, "The second parameter to the function passed an incorrect " + "argument. This must be an instance of the Wallet class."); + return NULL; + } + + char *l_tx_hash_out = NULL; + int l_ret_code = dap_chain_net_srv_xchange_remove(PRICE(self)->net, + &PRICE(self)->order_hash, + ((DapMathObject *) obj_fee)->value, + ((PyDapChainWalletObject *) obj_wallet)->wallet, &l_tx_hash_out); + switch (l_ret_code) { + case XCHANGE_REMOVE_ERROR_OK: { + return Py_BuildValue("s", l_tx_hash_out); + } + case XCHANGE_REMOVE_ERROR_INVALID_ARGUMENT: { + PyErr_SetString(PyExc_RuntimeError, "One of the input arguments is not set correctly."); + return NULL; + } + case XCHANGE_REMOVE_ERROR_FEE_IS_ZERO: { + PyErr_SetString(PyExc_RuntimeError, "Fee is zero."); + return NULL; + } + case XCHANGE_REMOVE_ERROR_CAN_NOT_FIND_TX: { + PyErr_SetString(PyExc_RuntimeError, "Specified order not found."); + return NULL; + } + case XCHANGE_REMOVE_ERROR_CAN_NOT_CREATE_PRICE: { + PyErr_SetString(PyExc_RuntimeError, "Can't create price object from order."); + return NULL; + } + case XCHANGE_REMOVE_ERROR_CAN_NOT_INVALIDATE_TX: { + PyErr_SetString(PyExc_RuntimeError, "Can't create invalidate transaction."); + return NULL; + } + default: { + char *l_ret = dap_strdup_printf("An error occurred with an unknown code: %d.", l_ret_code); + PyErr_SetString(PyExc_RuntimeError, l_ret); + DAP_DELETE(l_ret); + return NULL; + } + } } -PyTypeObject PyDapChainNetSrvXchangePriceObjectType = DAP_PY_TYPE_OBJECT( - "CellFrame.Service.Xchange.Price", sizeof(PyDapChainNetSrvXchangePriceObject), - "Price from service xchange", +PyTypeObject PyDapChainNetSrvXchangeOrderObjectType = DAP_PY_TYPE_OBJECT( + "CellFrame.Service.Xchange.Order", sizeof(PyDapChainNetSrvXchangeOrderObject), + "Order from service xchange", + .tp_dealloc = (destructor)DapChainNetSrvXchangePrice_free, .tp_getset = DapChainNetSrvXchangePriceGetSetDef, .tp_methods = DapChainNetSrvXchangePriceMethods); -PyObject *wrapping_dap_chain_net_srv_xchange_price_create_object(dap_chain_net_srv_xchange_price_t *a_price) { - PyDapChainNetSrvXchangePriceObject *self = PyObject_New(PyDapChainNetSrvXchangePriceObject, &PyDapChainNetSrvXchangePriceObjectType); - self->price = a_price; - return (PyObject*)self; -} PyObject *wrapping_dap_chain_net_srv_xchange_price_purchase(PyObject *self, PyObject *argv){ PyObject *obj_wallet, *obj_fee, *obj_value; @@ -136,31 +256,8 @@ PyObject *wrapping_dap_chain_net_srv_xchange_price_purchase(PyObject *self, PyOb case XCHANGE_PURCHASE_ERROR_OK: { return Py_BuildValue("s", l_ret_tx_hash); } - case XCHANGE_PURCHASE_ERROR_INVALID_ARGUMENT: { - PyErr_SetString(CellFrame_Xchange_Price_error, "An internal error occurred in the order " - "purchase function; not all arguments were passed."); - return NULL; - } - case XCHANGE_PURCHASE_ERROR_SPECIFIED_ORDER_NOT_FOUND: { - PyErr_SetString(CellFrame_Xchange_Price_error, "An error occurred: the order was not found " - "for the hash specified in the price list."); - return NULL; - } - case XCHANGE_PURCHASE_ERROR_CAN_NOT_CREATE_PRICE: { - PyErr_SetString(CellFrame_Xchange_Price_error, "An error occurred. It was not possible to " - "create a new price list to create an exchange transaction."); - return NULL; - } - case XCHANGE_PURCHASE_ERROR_CAN_NOT_CREATE_EXCHANGE_TX: { - PyErr_SetString(CellFrame_Xchange_Price_error, "An error occurred: it was not possible to " - "create an exchange transaction."); - return NULL; - } default: { - char *l_ret = dap_strdup_printf("An error occurred with an unknown code: %d.", l_ret_code); - PyErr_SetString(CellFrame_Xchange_Price_error, l_ret); - DAP_DELETE(l_ret); - return NULL; + Py_RETURN_NONE; } } } diff --git a/modules/dap-sdk/core/src/math_python.h b/modules/dap-sdk/core/src/math_python.h index cf660396fc21b66075cf27f2aedff2bac23def2b..1d702516ce0fd7c0ed16afc4a8df95df2dc81560 100644 --- a/modules/dap-sdk/core/src/math_python.h +++ b/modules/dap-sdk/core/src/math_python.h @@ -48,5 +48,5 @@ PyObject *wrapping_dap_math_get_balance(PyObject *self, void *closure); extern PyTypeObject DapMathObjectType; DAP_STATIC_INLINE bool DapMathObject_Check(PyObject *obj_math){ - return PyObject_TypeCheck(obj_math, &DapMathObjectType) == 0 ? true : false; + return PyObject_TypeCheck(obj_math, &DapMathObjectType); }