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, &current_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);
 }