Skip to content
Snippets Groups Projects
Commit c1e3494a authored by dmitry's avatar dmitry
Browse files

[+] multisign withdraw api

parent 171141c5
No related branches found
No related tags found
1 merge request!436[+] multisign withdraw api
......@@ -57,9 +57,9 @@ endif()
if (NOT (SUPPORT_PYTHON_PLUGINS))
if (NOT(WIN32))
set(CELLFRAME_MODULES "core chains network cs-none srv")
set(CELLFRAME_MODULES "core chains network cs-none srv srv-emit-delegate")
else()
set(CELLFRAME_MODULES "core chains network cs-none srv")
set(CELLFRAME_MODULES "core chains network cs-none srv srv-emit-delegate")
endif()
include(dap-sdk/cmake/OS_Detection.cmake)
add_subdirectory(dap-sdk)
......
Subproject commit b70bc241c0d963f04ae93c7219ab2a2111b091b9
Subproject commit 0444bd221ea844fb521d9949d2971e5d002d12bb
......@@ -94,8 +94,10 @@ PyObject *dap_chain_datum_tx_add_in_cond_item_py(PyObject *self, PyObject *args)
PyObject *dap_chain_datum_tx_add_out_item_py(PyObject *self, PyObject *args);
PyObject *dap_chain_datum_tx_add_out_cond_item_py(PyObject *self, PyObject *args);
PyObject *dap_chain_datum_tx_add_sign_item_py(PyObject *self, PyObject *args);
PyObject *dap_chain_datum_tx_append_sign_item_py(PyObject *self, PyObject *args);
PyObject *dap_chain_datum_tx_verify_sign_py(PyObject *self, PyObject *args);
PyObject *wrapping_dap_chain_datum_tx_get_items(PyObject *self, PyObject *args);
PyObject *wrapping_dap_chain_datum_tx_get_hash(PyObject *self, void* closure);
......
......@@ -202,8 +202,11 @@ PyObject *wrapping_dap_chain_datum_get_datum_tx(PyObject *self, PyObject *args){
PyObject *obj_net;
if(((PyDapChainDatumObject *)self)->datum->header.type_id == DAP_CHAIN_DATUM_TX){
PyDapChainDatumTxObject *obj_datum_tx = PyObject_New(PyDapChainDatumTxObject, &DapChainDatumTxObjectType);
obj_datum_tx->datum_tx = (dap_chain_datum_tx_t *)((PyDapChainDatumObject*)self)->datum->data;
obj_datum_tx->original = false;
dap_chain_datum_tx_t *l_datum_tx = (dap_chain_datum_tx_t *)((PyDapChainDatumObject*)self)->datum->data;
obj_datum_tx->datum_tx = DAP_DUP_SIZE( l_datum_tx, dap_chain_datum_tx_get_size(l_datum_tx));
;
obj_datum_tx->original = true;
return (PyObject*)obj_datum_tx;
}else{
PyErr_SetString(PyExc_Exception, "Due to the type of this datum, it is not possible to get the transaction datum.");
......
......@@ -74,6 +74,7 @@ static PyMethodDef PyDapChainDatumTxObjectMethods[] ={
{"addOutItem", (PyCFunction)dap_chain_datum_tx_add_out_item_py, METH_VARARGS, ""},
{"addOutCond", (PyCFunction)dap_chain_datum_tx_add_out_cond_item_py, METH_VARARGS, ""},
{"addSignItem", (PyCFunction)dap_chain_datum_tx_add_sign_item_py, METH_VARARGS, ""},
{"appendSignItem", (PyCFunction)dap_chain_datum_tx_append_sign_item_py, METH_VARARGS, ""},
{"verifySign", (PyCFunction)dap_chain_datum_tx_verify_sign_py, METH_VARARGS, ""},
{"getItems", (PyCFunction)wrapping_dap_chain_datum_tx_get_items, METH_NOARGS, ""},
{}
......@@ -171,6 +172,7 @@ PyObject *dap_chain_datum_tx_add_out_cond_item_py(PyObject *self, PyObject *args
cond, (size_t)cond_size);
return PyLong_FromLong(res);
}
PyObject *dap_chain_datum_tx_add_sign_item_py(PyObject *self, PyObject *args){
PyObject *obj_key;
if (!PyArg_ParseTuple(args, "O", &obj_key))
......@@ -180,6 +182,15 @@ PyObject *dap_chain_datum_tx_add_sign_item_py(PyObject *self, PyObject *args){
return PyLong_FromLong(res);
}
PyObject *dap_chain_datum_tx_append_sign_item_py(PyObject *self, PyObject *args){
PyDapSignObject *obj_sign;
if (!PyArg_ParseTuple(args, "O", &obj_sign))
return NULL;
Py_RETURN_NONE;
}
PyObject *dap_chain_datum_tx_verify_sign_py(PyObject *self, PyObject *args){
(void)args;
int res = dap_chain_datum_tx_verify_sign(((PyDapChainDatumTxObject*)self)->datum_tx, 0);
......
......@@ -31,7 +31,7 @@ PyObject *dap_chain_mempool_tx_create_cond_input_py(PyObject *self, PyObject *ar
PyObject *dap_chain_mempool_remove_py(PyObject *self, PyObject *args);
PyObject *dap_chain_mempool_list_py(PyObject *self, PyObject *args);
PyObject *dap_chain_mempool_add_datum_py(PyObject *self, PyObject *args);
PyObject *dap_chain_mempool_tx_create_multisign_withdraw_py(PyObject *self, PyObject *args);
PyObject *dap_chain_mempool_datum_extract_py(PyObject *self, PyObject *args);
PyObject *dap_chain_mempool_datum_get_py(PyObject *self, PyObject *args);
......
#include "wrapping_dap_mempool.h"
#include "dap_chain_wallet_python.h"
#include "python-cellframe_common.h"
#include "dap_chain_net_srv_emit_delegate.h"
#define LOG_TAG "python-mempool"
......@@ -18,6 +19,7 @@ static PyMethodDef DapMempoolMethods[] = {
{"remove", dap_chain_mempool_remove_py, METH_VARARGS | METH_STATIC, ""},
{"list", dap_chain_mempool_list_py, METH_VARARGS | METH_STATIC, ""},
{"addDatum", dap_chain_mempool_add_datum_py, METH_VARARGS | METH_STATIC, ""},
{"txCreateMultisignWithdraw", dap_chain_mempool_tx_create_multisign_withdraw_py, METH_VARARGS | METH_STATIC, ""},
{NULL,NULL,0,NULL}
};
......@@ -251,6 +253,85 @@ PyObject *dap_chain_mempool_base_tx_create_py(PyObject *self, PyObject *args){
return (PyObject*)l_obj_hf;
}
PyObject *dap_chain_mempool_tx_create_multisign_withdraw_py(PyObject *self, PyObject *args) {
PyDapChainNetObject *obj_net;
PyDapHashFastObject * transaction_hash;
PyDapChainAddrObject *obj_addr_to;
char * value;
char * fee;
PyCryptoKeyObject *obj_key_from;
if (!PyArg_ParseTuple(args, "OOOssO", &obj_net, &transaction_hash, &obj_addr_to, &value, &fee, &obj_key_from)){
PyErr_SetString(PyExc_AttributeError, "Function takes exactly six arguments.");
return NULL;
}
if (!PyDapChainNet_Check(obj_net)){
PyErr_SetString(PyExc_AttributeError, "The first argument was not correctly passed to "
"this function. The first argument must be an instance of an object of type Net. ");
return NULL;
}
if (!PyDapHashFast_Check(transaction_hash)){
PyErr_SetString(PyExc_AttributeError, "Invalid second argument passed. The second argument must "
"be an instance of an object of type DapHash. ");
return NULL;
}
if (!PyDapChainAddrObject_Check(obj_addr_to)){
PyErr_SetString(PyExc_AttributeError, "Invalid third argument passed. The third argument must "
"be an instance of an object of type DapChainAddr. ");
return NULL;
}
uint256_t l_value_256 = dap_chain_balance_scan(value);
uint256_t l_value_fee_256 = dap_chain_balance_scan(fee);
if (EQUAL_256(l_value_256, uint256_0)) {
PyErr_SetString(PyExc_AttributeError, "Invalid fourth argument passed. The fourth argument must "
"be an string with value > 0. ");
return NULL;
}
if (EQUAL_256(l_value_256, uint256_0)) {
PyErr_SetString(PyExc_AttributeError, "Invalid fifth argument passed. The fifth argument must "
"be an string with value > 0. ");
return NULL;
}
if (!dap_ledger_tx_find_by_hash(obj_net->chain_net->pub.ledger, transaction_hash->hash_fast)) {
PyErr_SetString(PyExc_AttributeError, "Tx with provided hash not found");
return NULL;
}
dap_enc_key_t *l_enc_key =obj_key_from->key;
dap_chain_addr_t *l_addr = obj_addr_to->addr;
dap_chain_datum_tx_t *l_tx = dap_chain_net_srv_emit_delegate_taking_tx_create(NULL, obj_net->chain_net, l_enc_key, l_addr, l_value_256, l_value_fee_256, transaction_hash->hash_fast);
if (!l_tx) {
PyErr_SetString(PyExc_AttributeError, "Failed to create tx datum");
return NULL;
}
size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx);
// Pack transaction into the datum
dap_chain_t * l_chain = dap_chain_net_get_chain_by_name(obj_net->chain_net, "main");
dap_chain_datum_t * l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size);
dap_chain_datum_tx_delete(l_tx);
char *l_ret = dap_chain_mempool_datum_add(l_datum_tx, l_chain, "hex");;
DAP_DELETE(l_datum_tx);
PyDapHashFastObject *l_obj_hf = PyObject_New(PyDapHashFastObject, &DapChainHashFastObjectType);
l_obj_hf->hash_fast = DAP_NEW(dap_hash_fast_t);
dap_chain_hash_fast_from_str(l_ret, l_obj_hf->hash_fast);
l_obj_hf->origin = true;
return (PyObject*)l_obj_hf;
}
PyObject *dap_chain_mempool_tx_create_py(PyObject *self, PyObject *args){
(void)self;
PyObject *obj_chain;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment