Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Showing
with 1926 additions and 0 deletions
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "dap_common.h"
#include "dap_chain_common.h"
/**
* @struct dap_chain_datum_hashtree_roots_v1
* @brief Hash tree roots for block, version 1
*/
typedef struct dap_chain_datum_hashtree_roots_v1{
dap_chain_hash_fast_t main;
} DAP_ALIGN_PACKED dap_chain_block_roots_v1_t;
/**
* @struct dap_chain_datum_hashtree_roots_v2
* @brief Hash tree roots for block, version 2
*/
typedef struct dap_chain_datum_hashtree_roots_v2{
dap_chain_hash_fast_t main;
dap_chain_hash_fast_t txs;
} DAP_ALIGN_PACKED dap_chain_datum_hashtree_roots_v2_t;
typedef dap_chain_datum_hashtree_roots_v2_t dap_chain_datum_hashtree_roots_t;
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* CellFrame https://cellframe.net
* Sources https://gitlab.demlabs.net/cellframe
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of CellFrame SDK the open source project
CellFrame SDK is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
CellFrame SDK is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "dap_chain_common.h"
#include "dap_sign.h"
// Token declaration
typedef struct dap_chain_datum_token{
uint16_t type;
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
union {
// Simple private token declaration. Useful for 100% premined emission without any plays with token and owners after that
struct {
uint64_t total_supply; // Could be zero if unlimited
uint16_t signs_valid; // Emission auth signs
uint16_t signs_total; // Emission auth signs
} DAP_ALIGN_PACKED header_private;
// Private token declarations, with flags, manipulations and updates
struct {
uint16_t flags; // Token declaration flags
size_t tsd_data_size; // Data size section with values in key-length-value list trailing the signs section
} DAP_ALIGN_PACKED header_private_decl;
// Private token update
struct {
uint16_t flags; // Update flag - clear all before, add or etc
size_t klv_data_size; // Data size section with extended values in key-length-value list.
} DAP_ALIGN_PACKED header_private_update;
// Public token declaration
struct {
uint128_t total_supply;
uint128_t premine_supply;
dap_chain_addr_t premine_address;
uint32_t flags;
} DAP_ALIGN_PACKED header_public;
};
byte_t data[]; // Signs or types-size-data sections if exists
} DAP_ALIGN_PACKED dap_chain_datum_token_t;
// Token declaration type
// Simple private token decl
#define DAP_CHAIN_DATUM_TOKEN_PRIVATE 0x0001
// Extended declaration of privatetoken with in-time control
#define DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL 0x0002
// Token update
#define DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE 0x0003
// Open token with now ownership
#define DAP_CHAIN_DATUM_TOKEN_PUBLIC 0x0004
// Macros for token flags
/// ------- Global section flags --------
// Blocked all permissions, usefull issue it by default and then allow what you want to allow
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_BLOCKED 0x0001
// Allowed all permissions if not blocked them. Be careful with this mode
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_ALLOWED 0x0002
// All permissions are temprorary frozen
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_FROZEN 0x0003
// Unfrozen permissions
#define DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_UNFROZEN 0x0004
/// ------ Static configured flags
// No token manipulations after declarations at all. Token declares staticly and can't variabed after
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL 0x0010
// No token manipulations after declarations with flags.
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS 0x0011
// No all permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL 0x0012
// No datum type permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE 0x0013
// No tx sender permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER 0x0014
// No tx receiver permissions lists manipulations after declarations
#define DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER 0x0015
// TSD section - Type-Size-Data
typedef struct dap_chain_datum_token_tsd{
uint16_t type; /// Section type
size_t size; /// Data size trailing the section
byte_t data[]; /// Section's data
} DAP_ALIGN_PACKED dap_chain_datum_token_klv_t;
/// -------- General tsd types ----
// Flags set/unsed
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS 0x0001
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS 0x0002
// Total supply limits
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY 0x0003
// Set total signs count value to set to be valid
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID 0x0004
// Add owner signature's pkey fingerprint
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD 0x0006
// Remove owner signature by pkey fingerprint
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE 0x0007
/// ------- Permissions list flags, grouped by update-remove-clear operations --------
// Allowed datum types list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD 0x0010
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE 0x0011
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_CLEAR 0x0012
// Blocked datum types list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD 0x0013
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE 0x0014
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_CLEAR 0x0015
//Allowed tx receiver addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD 0x0014
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE 0x0015
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_CLEAR 0x0016
//Blocked tx receiver addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD 0x0017
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE 0x0018
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_CLEAR 0x0019
//Allowed tx sender addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD 0x0020
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE 0x0021
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_CLEAR 0x0022
//Blocked tx sender addres list add, remove or clear
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD 0x0023
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE 0x0024
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR 0x0025
// Token emission
typedef struct dap_chain_datum_token_emission{
struct {
uint8_t version;
uint8_t type; // Emission Type
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
dap_chain_addr_t address; // Emission holder's address
uint64_t value;
} DAP_ALIGN_PACKED hdr;
union {
struct {
dap_chain_addr_t addr;
int flags;
uint64_t lock_time;
} DAP_ALIGN_PACKED type_presale;
struct {
uint64_t value_start;// Default value. Static if nothing else is defined
char value_change_algo_codename[32];
} DAP_ALIGN_PACKED type_atom_owner;
struct {
char codename[32];
} DAP_ALIGN_PACKED type_algo;
struct {
uint16_t signs_count;
byte_t signs[];
} DAP_ALIGN_PACKED type_auth;// Signs if exists
} data;
} DAP_ALIGN_PACKED dap_chain_datum_token_emission_t;
// Different emissions type
#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
extern const char *c_dap_chain_datum_token_emission_type_str[];
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "dap_enc_key.h"
#include "dap_chain_common.h"
#include "dap_chain_datum.h"
typedef enum dap_chain_tx_cond_type {
COND_SERVICE_PROVIDE = 0x20, //
COND_SERVICE_BILL = 0x30, //
} dap_chain_tx_cond_type_t;
/**
* @struct dap_chain_datum_tx
* @brief Transaction section, consists from lot of tx_items
*/
typedef struct dap_chain_datum_tx{
struct {
uint64_t ts_created;
uint32_t tx_items_size; // size of next sequencly lying tx_item sections would be decided to belong this transaction
} DAP_ALIGN_PACKED header;
uint8_t tx_items[];
} DAP_ALIGN_PACKED dap_chain_datum_tx_t;
/**
* Create empty transaction
*
* return transaction, 0 Error
*/
dap_chain_datum_tx_t* dap_chain_datum_tx_create(void);
/**
* Delete transaction
*/
void dap_chain_datum_tx_delete(dap_chain_datum_tx_t *a_tx);
/**
* Get size of transaction
*
* return size, 0 Error
*/
size_t dap_chain_datum_tx_get_size(dap_chain_datum_tx_t *a_tx);
/**
* Insert item to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_item);
/**
* Create 'in' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_in_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_fast_t *a_tx_prev_hash,
uint32_t a_tx_out_prev_idx);
/**
* Create 'in_cond' item and insert to transaction
*
* return 0 Ok, -1 Error
*/
int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_fast_t *a_tx_prev_hash,
uint32_t a_tx_out_prev_idx,
uint32_t a_receipt_idx);
/**
* Create 'out' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value);
/**
* Create 'out_cond' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size);
/**
* Sign a transaction (Create sign item and insert to transaction)
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_sign_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key);
/**
* Verify all sign item in transaction
*
* return 1 Ok, 0 Invalid sign, -1 Not found sing or other Error
*/
int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_item
* @brief Sections belongs to heading tx section, with inputs, outputs and others tx relatated items
*/
typedef struct dap_chain_tx_in{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
dap_chain_hash_fast_t tx_prev_hash; /// @param tx_prev_hash @brief Hash of the previous transaction. 0 for generation TX
uint32_t tx_out_prev_idx; /// @param tx_prev_idx @brief Previous tx_out index. 0 for generation TX
// dap_sign_type_t sig_type; /// Signature type
// uint32_t sig_size; /// Signature size
} header; /// Only header's hash is used for verification
// uint32_t seq_no; /// Sequence number, out of the header so could be changed during reorganization
// uint8_t sig[]; /// @param sig @brief raw signatura dat
} DAP_ALIGN_PACKED dap_chain_tx_in_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_item
* @brief Sections belongs to heading tx section, with inputs, outputs and others tx relatated items
*/
typedef struct dap_chain_tx_in_cond {
struct {
dap_chain_tx_item_type_t type :8; /// @param type @brief Transaction item type
dap_chain_hash_fast_t tx_prev_hash; /// @param tx_prev_hash @brief Hash of the previous transaction. 0 for generation TX
uint32_t tx_out_prev_idx; /// @param tx_prev_idx @brief Previous tx_out index. 0 for generation TX
uint32_t receipt_idx;
} header; /// Only header's hash is used for verification
}DAP_ALIGN_PACKED dap_chain_tx_in_cond_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include <string.h>
//#include <glib.h>
#include "dap_common.h"
#include "dap_list.h"
#include "dap_chain_common.h"
#include "dap_sign.h"
#include "dap_chain_datum_tx.h"
#include "dap_chain_datum_tx_in.h"
#include "dap_chain_datum_tx_out.h"
#include "dap_chain_datum_tx_in_cond.h"
#include "dap_chain_datum_tx_out_cond.h"
#include "dap_chain_datum_tx_sig.h"
#include "dap_chain_datum_tx_pkey.h"
#include "dap_chain_datum_tx_token.h"
#include "dap_chain_datum_tx_receipt.h"
/**
* Get item type
*
* return type, or TX_ITEM_TYPE_ANY if error
*/
dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item);
/**
* Get item size
*
* return size, 0 Error
*/
size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item);
/**
* Create item dap_chain_tx_token_t
*
* return item, NULL Error
*/
dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(dap_chain_hash_fast_t * a_datum_token_hash,const char * a_ticker);
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx);
dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx,
uint32_t a_receipt_idx);
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value);
/**
* Create item dap_chain_tx_out_cond_t
*
* return item, NULL Error
*/
dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
const void *a_cond, size_t a_cond_size);
/**
* Create item dap_chain_tx_sig_t
*
* return item, NULL Error
*/
dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
/**
* Get sign from sign item
*
* return sign, NULL Error
*/
dap_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
/**
* Get item from transaction
*
* a_tx [in] transaction
* a_item_idx_start[in/out] start index / found index of item in transaction, if 0 then from beginning
* a_type[in] type of item being find, if TX_ITEM_TYPE_ANY - any item
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
dap_chain_tx_item_type_t a_type, int *a_item_out_size);
// Get all item from transaction by type
dap_list_t* dap_chain_datum_tx_items_get(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int *a_item_count);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_out
* @brief Transaction item outout
*/
typedef struct dap_chain_tx_out{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
uint64_t value; /// @param value @brief Number of Datoshis ( DAP/10^9 ) to be transfered
} header; /// Only header's hash is used for verification
dap_chain_addr_t addr; ////
} DAP_ALIGN_PACKED dap_chain_tx_out_t;
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* Alexander Lysikov <alexander.lysikov@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
#define DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY 0x01
/**
* @struct dap_chain_tx_out
* @brief Transaction item out_cond
*/
typedef struct dap_chain_tx_out_cond {
struct {
/// Transaction item type
dap_chain_tx_item_type_t item_type :8;
/// Condition subtype
uint8_t subtype;
/// Number of Datoshis ( DAP/10^9 ) to be reserver for service
uint64_t value;
/// When time expires this output could be used only by transaction owner
dap_chain_time_t ts_expires;
} header;
union {
struct {
/// Structure with specific for service pay condition subtype
struct {
/// Public key hash that could use this conditioned outout
dap_chain_hash_fast_t pkey_hash;
/// Service uid that only could be used for this outout
dap_chain_net_srv_uid_t srv_uid;
/// Price unit thats used to check price max
dap_chain_net_srv_price_unit_uid_t unit;
/// Maximum price per unit
uint64_t unit_price_max_datoshi;
/// Condition parameters size
uint32_t params_size;
} DAP_ALIGN_PACKED header;
uint8_t params[]; // condition parameters, pkey, hash or smth like this
} DAP_ALIGN_PACKED srv_pay;
} subtype;
}DAP_ALIGN_PACKED dap_chain_tx_out_cond_t;
uint8_t* dap_chain_datum_tx_out_cond_item_get_params(dap_chain_tx_out_cond_t *a_tx_out_cond, size_t *a_params_size_out);
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_pkey
* @brief TX item with one of the transaction's public keys
*/
typedef struct dap_chain_tx_pkey{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
dap_sign_type_t sig_type; /// Signature type
uint32_t sig_size; /// Signature size
} header; /// Only header's hash is used for verification
uint32_t seq_no; /// Sequence number, out of the header so could be changed during reorganization
uint8_t pkey[]; /// @param sig @brief raw pkey dat
} DAP_ALIGN_PACKED dap_chain_tx_pkey_t;
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* CellFrame https://cellframe.net
* Sources https://gitlab.demlabs.net/cellframe
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of CellFrame SDK the open source project
CellFrame SDK is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
CellFrame SDK is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_chain_common.h"
/**
* @struct dap_chain_tx_out
* @brief Transaction item out_cond
*/
typedef struct dap_chain_datum_tx_receipt {
uint8_t type; //dap_chain_tx_item_type_t type :8; // Transaction item type
dap_chain_receipt_info_t receipt_info; // Receipt itself
uint16_t size;
uint16_t exts_size;
byte_t exts_n_signs[]; // Signatures, first from provider, second from client
}DAP_ALIGN_PACKED dap_chain_datum_tx_receipt_t;
#ifdef __cplusplus
extern "C" {
#endif
static inline size_t dap_chain_datum_tx_receipt_get_size_hdr(){ return 1+sizeof (dap_chain_receipt_info_t)+sizeof (uint16_t) +sizeof (uint16_t); }
dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create( dap_chain_net_srv_uid_t srv_uid,
dap_chain_net_srv_price_unit_uid_t units_type,
uint64_t units, uint64_t value_datoshi, const void * a_ext, size_t a_ext_size);
size_t dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t ** a_receipt, size_t a_receipt_size, dap_enc_key_t *a_key );
dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size , uint16_t sign_position);
uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size);
static inline uint16_t dap_chain_datum_tx_receipt_get_size(const dap_chain_datum_tx_receipt_t * l_receipt)
{
return l_receipt->size;
}
#ifdef __cplusplus
}
#endif
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_sig
* @brief Section with set of transaction signatures
*/
typedef struct dap_chain_tx_sig{
struct {
dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type
// dap_sign_type_t sig_type; /// Signature type
uint32_t sig_size; /// Signature size
} header; /// Only header's hash is used for verification
uint8_t sig[]; /// @param sig @brief raw signature data
} DAP_ALIGN_PACKED dap_chain_tx_sig_t;
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_token
* @brief Token item
*/
typedef struct dap_chain_tx_token{
struct {
dap_chain_tx_item_type_t type:8;
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
uint8_t padding; // Padding
dap_chain_id_t token_emission_chain_id;
dap_chain_hash_fast_t token_emission_hash;
} header; /// Only header's hash is used for verification
} DAP_ALIGN_PACKED dap_chain_tx_token_t;
/**
* @struct dap_chain_tx_token_ext
* @brief External token swap
*/
typedef struct dap_chain_tx_token_ext{
struct {
dap_chain_tx_item_type_t type:8;
uint8_t version;
char ticker[DAP_CHAIN_TICKER_SIZE_MAX];
uint8_t padding1; // Padding
dap_chain_net_id_t ext_net_id;
dap_chain_id_t ext_chain_id;
dap_chain_hash_fast_t ext_tx_hash;
uint16_t padding2;
uint16_t ext_tx_out_idx; // Output index
} header; /// Only header's hash is used for verification
} DAP_ALIGN_PACKED dap_chain_tx_token_ext_t;
HEADERS += $$PWD/include/dap_chain_common.h \
$$PWD/include/dap_chain_datum.h \
$$PWD/include/dap_chain_datum_hashtree_roots.h \
$$PWD/include/dap_chain_datum_token.h \
$$PWD/include/dap_chain_datum_tx.h \
$$PWD/include/dap_chain_datum_tx_in_cond.h \
$$PWD/include/dap_chain_datum_tx_in.h \
$$PWD/include/dap_chain_datum_tx_items.h \
$$PWD/include/dap_chain_datum_tx_out_cond.h \
$$PWD/include/dap_chain_datum_tx_out.h \
$$PWD/include/dap_chain_datum_tx_pkey.h \
$$PWD/include/dap_chain_datum_tx_receipt.h \
$$PWD/include/dap_chain_datum_tx_sig.h \
$$PWD/include/dap_chain_datum_tx_token.h
SOURCES += $$PWD/src/dap_chain_common.c \
$$PWD/src/dap_chain_datum.c \
$$PWD/src/dap_chain_datum_hashtree_roots.c \
$$PWD/src/dap_chain_datum_token.c \
$$PWD/src/dap_chain_datum_tx.c \
$$PWD/src/dap_chain_datum_tx_items.c \
$$PWD/src/dap_chain_datum_tx_out_cond.c \
$$PWD/src/dap_chain_datum_tx_receipt.c \
$$PWD/src/dap_chain_datum_tx_token.c
INCLUDEPATH += $$PWD/include
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include "dap_common.h"
#include "dap_sign.h"
#include "dap_chain_common.h"
#include "dap_enc_base58.h"
#include "dap_hash.h"
#include "dap_strfuncs.h"
#define LOG_TAG "dap_chain_common"
/**
* @brief dap_chain_hash_to_str
* @param a_hash
* @param a_str
* @param a_str_max
* @return
*/
size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, size_t a_str_max )
{
const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */;
if(a_str_max < c_hash_str_size) {
log_it(L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max);
}
size_t i;
dap_snprintf(a_str, 3, "0x");
for(i = 0; i < sizeof(a_hash->raw); ++i)
dap_snprintf( a_str + i * 2 + 2, 3, "%02x", a_hash->raw[i] );
a_str[c_hash_str_size] = '\0';
return strlen(a_str);
}
/**
* @brief dap_chain_hash_fast_to_str
* @param a_hash
* @param a_str
* @param a_str_max
* @return
*/
#if 0
size_t dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
{
const size_t c_hash_str_size = sizeof(*a_hash) * 2 + 1 /*trailing zero*/+ 2 /* heading 0x */;
if ( a_str_max < c_hash_str_size ) {
log_it( L_ERROR, "String for hash too small, need %u but have only %u", c_hash_str_size, a_str_max );
}
// size_t i;
// faster conversion to string
dap_snprintf( a_str, 3, "0x" );
size_t l_ret = dap_bin2hex(a_str + 2, a_hash->raw, sizeof(a_hash->raw));
//for(i = 0; i < sizeof(a_hash->raw); ++i)
// dap_snprintf(a_str + i * 2 + 2, 3, "%02x", (a_hash->raw[i]));
a_str[c_hash_str_size - 1] = '\0';
if(!l_ret)
return 0;
return c_hash_str_size - 1; //strlen(a_str);
}
#endif
/**
* @brief dap_chain_addr_to_str
* @param a_addr
* @return
*/
char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr)
{
if ( a_addr ==NULL)
return NULL;
size_t l_ret_size = DAP_ENC_BASE58_ENCODE_SIZE(sizeof(dap_chain_addr_t));
char * l_ret = DAP_NEW_SIZE(char, l_ret_size);
if(dap_enc_base58_encode(a_addr, sizeof(dap_chain_addr_t), l_ret) > 0)
return l_ret;
else {
DAP_DELETE(l_ret);
return NULL;
}
}
/**
* @brief dap_chain_str_to_addr
* @param a_addr
* @return
*/
dap_chain_addr_t* dap_chain_addr_from_str(const char *a_str)
{
size_t l_str_len = (a_str) ? strlen(a_str) : 0;
if(l_str_len <= 0)
return NULL;
size_t l_ret_size = DAP_ENC_BASE58_DECODE_SIZE(l_str_len);
dap_chain_addr_t * l_addr = DAP_NEW_Z_SIZE(dap_chain_addr_t, l_ret_size);
if(dap_enc_base58_decode(a_str, l_addr) == sizeof(dap_chain_addr_t) &&
dap_chain_addr_check_sum(l_addr)==1)
return l_addr;
else
DAP_DELETE(l_addr);
return NULL;
}
/**
* @brief dap_chain_net_id_from_str
* @param a_net_str
* @return
*/
dap_chain_net_id_t dap_chain_net_id_from_str(const char * a_net_str)
{
dap_chain_net_id_t l_ret={ 0 };
log_it(L_DEBUG, "net id: %s", a_net_str);
a_net_str += 2;
/*size_t l_net_str_len = strlen( a_net_str);
if (l_net_str_len >2){
a_net_str+=2;
l_net_str_len-=2;
if (l_net_str_len == sizeof (l_ret)/2 ){
size_t l_pos =0;
char l_byte[3];
while(l_net_str_len){
// Copy two characters for bytes
memcpy(l_byte,a_net_str,2);
l_byte[2]='\0';
// Read byte chars
if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1)
if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 )
break;
// Update pos
l_pos++;
// Reduce in two steps to not to break if input will have bad input
l_net_str_len-=1;
if(l_net_str_len)
l_net_str_len-=1;
}
}else
log_it(L_WARNING,"Wrong input string \"%s\" not recognized as network id", a_net_str);
} */
if (!(l_ret.uint64 = strtol(a_net_str, NULL, 0))) {
log_it(L_ERROR, "Wrong input string \"%s\" not recognized as network id", a_net_str);
return l_ret;
}
//dap_stpcpy(&l_ret.raw, a_net_str);
return l_ret;
}
/**
* @brief dap_chain_net_srv_uid_from_str
* @param a_net_str
* @return
*/
dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str( const char * a_net_srv_uid_str)
{
dap_chain_net_srv_uid_t l_ret={{0}};
size_t l_net_srv_uid_str_len = strlen( a_net_srv_uid_str);
if (l_net_srv_uid_str_len >2){
a_net_srv_uid_str+=2;
l_net_srv_uid_str_len-=2;
if (l_net_srv_uid_str_len == sizeof (l_ret)/2 ){
size_t l_pos =0;
char l_byte[3];
while(l_net_srv_uid_str_len){
// Copy two characters for bytes
memcpy(l_byte,a_net_srv_uid_str,2);
l_byte[2]='\0';
// Read byte chars
if ( sscanf(l_byte,"%02hhx",&l_ret.raw[l_pos] ) != 1)
if( sscanf(l_byte,"%02hhX",&l_ret.raw[l_pos] ) ==1 )
break;
// Update pos
l_pos++;
// Reduce in two steps to not to break if input will have bad input
l_net_srv_uid_str_len-=1;
if(l_net_srv_uid_str_len)
l_net_srv_uid_str_len-=1;
}
}else
log_it(L_WARNING,"Wrong input string \"%s\" not recognized as network id", a_net_srv_uid_str);
}
return l_ret;
}
/**
* @brief dap_chain_addr_fill
* @param a_addr
* @param a_key
* @param a_net_id
* @return
*/
void dap_chain_addr_fill(dap_chain_addr_t *a_addr, dap_enc_key_t *a_key, dap_chain_net_id_t *a_net_id)
{
if(!a_addr || !a_key || !a_net_id)
return;
a_addr->addr_ver = DAP_CHAIN_ADDR_VERSION_CURRENT;
a_addr->net_id.uint64 = a_net_id->uint64;
a_addr->sig_type.raw = dap_sign_type_from_key_type(a_key->type).raw;
// key -> serialized key
dap_chain_hash_fast_t l_hash_public_key;
size_t l_pub_key_data_size;
uint8_t *l_pub_key_data = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_data_size);
if ( l_pub_key_data == NULL ){
log_it(L_ERROR,"Can't fill address from key, its empty");
return;
}
// serialized key -> key hash
if(dap_hash_fast(l_pub_key_data, l_pub_key_data_size, &l_hash_public_key))
memcpy(a_addr->data.hash, l_hash_public_key.raw, sizeof(l_hash_public_key.raw));
DAP_DELETE(l_pub_key_data);
// calc checksum
dap_hash_fast(a_addr, sizeof(dap_chain_addr_t) - sizeof(dap_chain_hash_fast_t), &a_addr->checksum);
}
/**
* @brief dap_chain_addr_check_sum
* @param a_addr
* @return 1 Ok, -1 Invalid a_addr or checksum
*/
int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr)
{
if(!a_addr)
return -1;
dap_chain_hash_fast_t l_checksum;
// calc checksum
dap_hash_fast(a_addr, sizeof(dap_chain_addr_t) - sizeof(dap_chain_hash_fast_t), &l_checksum);
if(!memcmp(a_addr->checksum.raw, l_checksum.raw, sizeof(l_checksum.raw)))
return 1;
return -1;
}
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* Kelvin Project https://github.com/kelvinblockchain
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include "dap_common.h"
#include "dap_chain_datum.h"
#include "dap_chain_datum_tx.h"
#include "dap_chain_datum_hashtree_roots.h"
#include "dap_chain_datum_token.h"
#define LOG_TAG "dap_chain_datum"
const char * c_datum_type_str[]={
[DAP_CHAIN_DATUM_TX]="DATUM_TX",
[DAP_CHAIN_DATUM_TX_REQUEST]="DATUM_TX_REQUEST",
[DAP_CHAIN_DATUM_WASM_CODE]="DATUM_WASM_CODE",
[DAP_CHAIN_DATUM_WASM_DATA]="DATUM_WASM_DATA",
[DAP_CHAIN_DATUM_EVM_CODE]="DATUM_EVM_CODE",
[DAP_CHAIN_DATUM_EVM_DATA]="DATUM_EVM_DATA",
[DAP_CHAIN_DATUM_CA]="DATUM_CA",
[DAP_CHAIN_DATUM_CUSTOM]="DATUM_CUSTOM",
[DAP_CHAIN_DATUM_TOKEN_DECL]="DATUM_TOKEN_DECL",
[DAP_CHAIN_DATUM_TOKEN_EMISSION]="DATUM_TOKEN_EMISSION",
};
/**
* @brief dap_chain_datum_create
* @param a_type_id
* @param a_data
* @param a_data_size
* @return
*/
dap_chain_datum_t * dap_chain_datum_create(uint16_t a_type_id, const void * a_data, size_t a_data_size)
{
dap_chain_datum_t * l_datum = DAP_NEW_Z_SIZE(dap_chain_datum_t, sizeof(l_datum->header)+ a_data_size);
memcpy (l_datum->data,a_data,a_data_size);
l_datum->header.type_id = a_type_id;
l_datum->header.data_size = (uint32_t) a_data_size;
l_datum->header.version_id = DAP_CHAIN_DATUM_VERSION;
l_datum->header.ts_create =(uint64_t) time(NULL);
return l_datum;
}
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include "dap_common.h"
#include "dap_chain_datum_hashtree_roots.h"
#define LOG_TAG "dap_chain_datum_hashtree_roots"
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <string.h>
#include "dap_chain_datum_token.h"
const char *c_dap_chain_datum_token_emission_type_str[]={
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED] = "DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED",
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH] = "DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH",
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO] = "DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO",
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER] = "DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER",
[DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT] = "DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT",
};
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <memory.h>
#include <assert.h>
#include "dap_common.h"
#include "dap_sign.h"
#include "dap_chain_datum_tx_items.h"
#include "dap_chain_datum_tx.h"
#define LOG_TAG "dap_chain_datum_tx"
/**
* Create empty transaction
*
* return transaction, 0 Error
*/
dap_chain_datum_tx_t* dap_chain_datum_tx_create(void)
{
dap_chain_datum_tx_t *tx = DAP_NEW_Z(dap_chain_datum_tx_t);
tx->header.ts_created = time(NULL);
return tx;
}
/**
* Delete transaction
*/
void dap_chain_datum_tx_delete(dap_chain_datum_tx_t *a_tx)
{
if(a_tx)
DAP_DELETE(a_tx);
}
/**
* Get size of transaction
*
* return size, 0 Error
*/
size_t dap_chain_datum_tx_get_size(dap_chain_datum_tx_t *a_tx)
{
if(!a_tx)
return 0;
return (sizeof(dap_chain_datum_tx_t) + a_tx->header.tx_items_size);
}
/**
* Insert item to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_item)
{
size_t size = dap_chain_datum_item_tx_get_size(a_item);
if(!size)
return -1;
dap_chain_datum_tx_t *tx_cur = *a_tx;
tx_cur = (dap_chain_datum_tx_t*) realloc(tx_cur, dap_chain_datum_tx_get_size(tx_cur) + size);
memcpy((uint8_t*) tx_cur->tx_items + tx_cur->header.tx_items_size, a_item, size);
tx_cur->header.tx_items_size += size;
*a_tx = tx_cur;
return 1;
}
/**
* Create 'in' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_in_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_fast_t *a_tx_prev_hash,
uint32_t a_tx_out_prev_idx)
{
dap_chain_tx_in_t *l_tx_in = dap_chain_datum_tx_item_in_create(a_tx_prev_hash, a_tx_out_prev_idx);
if(l_tx_in) {
dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_in);
DAP_DELETE(l_tx_in);
return 1;
}
return -1;
}
/**
* @brief dap_chain_datum_tx_add_in_cond_item
* @param a_tx
* @param a_pkey_serialized
* @param a_pkey_serialized_size
* @param a_receipt_idx
* @return
*/
int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_fast_t *a_tx_prev_hash,
uint32_t a_tx_out_prev_idx,
uint32_t a_receipt_idx)
{
dap_chain_tx_in_cond_t *l_tx_in_cond = dap_chain_datum_tx_item_in_cond_create( a_tx_prev_hash, a_tx_out_prev_idx,
a_receipt_idx);
if(l_tx_in_cond) {
dap_chain_datum_tx_add_item(a_tx, (uint8_t *)l_tx_in_cond);
DAP_DELETE(l_tx_in_cond);
return 0;
}
return -1;
}
/**
* Create 'out' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint64_t a_value)
{
dap_chain_tx_out_t *l_tx_out = dap_chain_datum_tx_item_out_create(a_addr, a_value);
if(l_tx_out) {
dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out);
DAP_DELETE(l_tx_out);
return 1;
}
return -1;
}
/**
* Create 'out_cond' item and insert to transaction
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
uint64_t a_value, uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size)
{
dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay(
a_key, a_srv_uid,a_value, a_value_max_per_unit, a_unit, a_cond, a_cond_size );
if(l_tx_out) {
dap_chain_datum_tx_add_item(a_tx, (const uint8_t *) l_tx_out);
DAP_DELETE(l_tx_out);
return 1;
}
return -1;
}
/**
* Sign a transaction (Add sign item to transaction)
*
* return 1 Ok, -1 Error
*/
int dap_chain_datum_tx_add_sign_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key)
{
if(!a_tx || !a_key)
return -1;
// sign all previous items in transaction
const void *l_data = (*a_tx)->tx_items;
const size_t l_data_size = (*a_tx)->header.tx_items_size;
dap_chain_tx_sig_t *l_tx_sig = dap_chain_datum_tx_item_sign_create(a_key, l_data, l_data_size);
if(l_tx_sig) {
int l_ret = dap_chain_datum_tx_add_item(a_tx, (const uint8_t*) l_tx_sig);
DAP_DELETE(l_tx_sig);
return l_ret;
}
return -1;
}
/**
* Verify all sign item in transaction
*
* return 1 Ok, 0 Invalid signature, -1 Not found signature or other Error
*/
int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx)
{
int ret = -1;
if(!tx)
return -2;
uint32_t tx_items_pos = 0, tx_items_size = tx->header.tx_items_size;
while(tx_items_pos < tx_items_size) {
uint8_t *item = tx->tx_items + tx_items_pos;
size_t l_item_tx_size = dap_chain_datum_item_tx_get_size(item);
if(!l_item_tx_size)
return -3;
if(dap_chain_datum_tx_item_get_type(item) == TX_ITEM_TYPE_SIG) {
dap_chain_tx_sig_t *l_item_tx_sig = (dap_chain_tx_sig_t*) item;
dap_sign_t *l_sign = (dap_sign_t*) l_item_tx_sig->sig;
if ( ( l_sign->header.sign_size + l_sign->header.sign_pkey_size +sizeof (l_sign->header) )
> l_item_tx_size ){
log_it(L_WARNING,"Incorrect signature's header, possible corrupted data");
return -4;
}
if(dap_sign_verify(l_sign, tx->tx_items, tx_items_pos) != 1) {
// invalid signature
ret = 0;
tx_items_pos += l_item_tx_size;
break;
}
// signature verify successfully
ret = 1;
}
// sign item or items must be at the end, therefore ret will be changed later anyway
else
ret = -4;
// go to text item
tx_items_pos += l_item_tx_size;
}
assert(tx_items_pos == tx_items_size);
return ret;
}
/*
* Authors:
* Dmitriy A. Gearasimov <kahovski@gmail.com>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2018
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <string.h>
#include "dap_common.h"
#include "dap_enc_key.h"
#include "dap_chain_common.h"
#include "dap_sign.h"
#include "dap_hash.h"
#include "dap_chain_datum_tx.h"
#include "dap_chain_datum_tx_in.h"
#include "dap_chain_datum_tx_out.h"
#include "dap_chain_datum_tx_in_cond.h"
#include "dap_chain_datum_tx_out_cond.h"
#include "dap_chain_datum_tx_items.h"
static size_t dap_chain_tx_in_get_size(const dap_chain_tx_in_t *a_item)
{
(void) a_item;
size_t size = sizeof(dap_chain_tx_in_t); // + item->header.sig_size;
return size;
}
static size_t dap_chain_tx_in_cond_get_size(const dap_chain_tx_in_cond_t *a_item)
{
size_t size = sizeof(dap_chain_tx_in_cond_t);
return size;
}
static size_t dap_chain_tx_out_get_size(const dap_chain_tx_out_t *a_item)
{
(void) a_item;
size_t size = sizeof(dap_chain_tx_out_t);
return size;
}
static size_t dap_chain_tx_out_cond_get_size(const dap_chain_tx_out_cond_t *a_item)
{
switch (a_item->header.subtype) {
case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:
return sizeof (a_item->header) + sizeof (a_item->subtype.srv_pay.header) + a_item->subtype.srv_pay.header.params_size;
default:
return 0;
}
}
static size_t dap_chain_tx_pkey_get_size(const dap_chain_tx_pkey_t *a_item)
{
size_t size = sizeof(dap_chain_tx_pkey_t) + a_item->header.sig_size;
return size;
}
static size_t dap_chain_tx_sig_get_size(const dap_chain_tx_sig_t *item)
{
size_t size = sizeof(dap_chain_tx_sig_t) + item->header.sig_size;
return size;
}
static size_t dap_chain_tx_token_get_size(const dap_chain_tx_token_t *a_item)
{
(void) a_item;
size_t size = sizeof(dap_chain_tx_token_t);
return size;
}
/**
* Get item type
*
* return type, or TX_ITEM_TYPE_ANY if error
*/
dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item)
{
const dap_chain_tx_in_t *l_item_tx_in = (const dap_chain_tx_in_t*) a_item;
dap_chain_tx_item_type_t type = (l_item_tx_in) ? l_item_tx_in->header.type : TX_ITEM_TYPE_ANY;
return type;
}
/**
* Get item size
*
* return size, 0 Error
*/
size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item)
{
dap_chain_tx_item_type_t type = dap_chain_datum_tx_item_get_type(a_item);
size_t size = 0;
switch (type) {
case TX_ITEM_TYPE_IN: // Transaction inputs
size = dap_chain_tx_in_get_size((const dap_chain_tx_in_t*) a_item);
break;
case TX_ITEM_TYPE_OUT: // Transaction outputs
size = dap_chain_tx_out_get_size((const dap_chain_tx_out_t*) a_item);
break;
case TX_ITEM_TYPE_RECEIPT: // Receipt
size = dap_chain_datum_tx_receipt_get_size((const dap_chain_datum_tx_receipt_t*) a_item);
case TX_ITEM_TYPE_IN_COND: // Transaction inputs with condition
size = dap_chain_tx_in_cond_get_size((const dap_chain_tx_in_cond_t*) a_item);
break;
case TX_ITEM_TYPE_OUT_COND: // Transaction output with condition
size = dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t*) a_item);
break;
case TX_ITEM_TYPE_PKEY: // Transaction public keys
size = dap_chain_tx_pkey_get_size((const dap_chain_tx_pkey_t*) a_item);
break;
case TX_ITEM_TYPE_SIG: // Transaction signatures
size = dap_chain_tx_sig_get_size((const dap_chain_tx_sig_t*) a_item);
break;
case TX_ITEM_TYPE_TOKEN: // token item
size = dap_chain_tx_token_get_size((const dap_chain_tx_token_t*) a_item);
break;
default:
return 0;
}
return size;
}
/**
* Create item dap_chain_tx_token_t
*
* return item, NULL Error
*/
dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(dap_chain_hash_fast_t * a_datum_token_hash,const char * a_ticker)
{
if(!a_ticker)
return NULL;
size_t a_ticker_len = strlen(a_ticker);
dap_chain_tx_token_t *l_item = DAP_NEW_Z(dap_chain_tx_token_t);
l_item->header.type = TX_ITEM_TYPE_TOKEN;
memcpy (& l_item->header.token_emission_hash, a_datum_token_hash, sizeof ( *a_datum_token_hash ) );
if(a_ticker_len >= sizeof(l_item->header.ticker))
a_ticker_len = sizeof(l_item->header.ticker) - 1;
strncpy(l_item->header.ticker, a_ticker, a_ticker_len);
return l_item;
}
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx)
{
if(!a_tx_prev_hash)
return NULL;
dap_chain_tx_in_t *l_item = DAP_NEW_Z(dap_chain_tx_in_t);
l_item->header.type = TX_ITEM_TYPE_IN;
l_item->header.tx_out_prev_idx = a_tx_out_prev_idx;
memcpy(&l_item->header.tx_prev_hash, a_tx_prev_hash, sizeof(dap_chain_hash_fast_t));
return l_item;
}
/**
* @brief dap_chain_datum_tx_item_in_cond_create
* @param a_pkey_serialized
* @param a_pkey_serialized_size
* @param a_receipt_idx
* @return
*/
dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx,
uint32_t a_receipt_idx)
{
if(!a_tx_prev_hash )
return NULL;
dap_chain_tx_in_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_in_cond_t);
l_item->header.type = TX_ITEM_TYPE_IN;
l_item->header.receipt_idx = a_receipt_idx;
l_item->header.tx_out_prev_idx = a_tx_out_prev_idx;
memcpy(&l_item->header.tx_prev_hash, a_tx_prev_hash,sizeof(l_item->header.tx_prev_hash) );
return l_item;
}
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value)
{
if(!a_addr)
return NULL;
dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t);
l_item->header.type = TX_ITEM_TYPE_OUT;
l_item->header.value = a_value;
memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t));
return l_item;
}
/**
* Create item dap_chain_tx_out_cond_t
*
* return item, NULL Error
*/
dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid,
uint64_t a_value,uint64_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit,
const void *a_params, size_t a_params_size)
{
if(!a_key || !a_params)
return NULL;
size_t l_pub_key_size = 0;
uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size);
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t,
sizeof(l_item->header)+sizeof (l_item->subtype.srv_pay.header) + a_params_size);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; // By default creatre cond for service pay. Rework with smth more flexible
l_item->subtype.srv_pay.header.srv_uid = a_srv_uid;
l_item->subtype.srv_pay.header.params_size = (uint32_t) a_params_size;
l_item->subtype.srv_pay.header.unit = a_unit;
l_item->subtype.srv_pay.header.unit_price_max_datoshi = a_value_max_per_unit;
dap_hash_fast( l_pub_key, l_pub_key_size, & l_item->subtype.srv_pay.header.pkey_hash);
memcpy(l_item->subtype.srv_pay.params, a_params, a_params_size);
return l_item;
}
/**
* Create item dap_chain_tx_sig_t
*
* return item, NULL Error
*/
dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size)
{
if(!a_key || !a_data || !a_data_size)
return NULL;
dap_sign_t *l_chain_sign = dap_sign_create(a_key, a_data, a_data_size, 0);
size_t l_chain_sign_size = dap_sign_get_size(l_chain_sign); // sign data
if(!l_chain_sign) {
return NULL;
}
dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE(dap_chain_tx_sig_t,
sizeof(dap_chain_tx_sig_t) + l_chain_sign_size);
l_tx_sig->header.type = TX_ITEM_TYPE_SIG;
l_tx_sig->header.sig_size =(uint32_t) l_chain_sign_size;
memcpy(l_tx_sig->sig, l_chain_sign, l_chain_sign_size);
DAP_DELETE(l_chain_sign);
return l_tx_sig;
}
/**
* Get sign from sign item
*
* return sign, NULL Error
*/
dap_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig)
{
if(!a_tx_sig || !a_tx_sig->header.sig_size)
return NULL;
return (dap_sign_t*) a_tx_sig->sig;
}
/**
* Get item from transaction
*
* a_tx [in] transaction
* a_item_idx_start[in/out] start index / found index of item in transaction, if 0 then from beginning
* a_type[in] type of item being find, if TX_ITEM_TYPE_ANY - any item
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
dap_chain_tx_item_type_t a_type, int *a_item_out_size)
{
if(!a_tx)
return NULL;
uint32_t l_tx_items_pos = 0, l_tx_items_size = a_tx->header.tx_items_size;
int l_item_idx = 0;
while(l_tx_items_pos < l_tx_items_size) {
uint8_t *l_item = a_tx->tx_items + l_tx_items_pos;
int l_item_size = dap_chain_datum_item_tx_get_size(l_item);
if(!l_item_size)
return NULL;
// check index
if(!a_item_idx_start || l_item_idx >= *a_item_idx_start) {
// check type
if(a_type == TX_ITEM_TYPE_ANY || a_type == dap_chain_datum_tx_item_get_type(l_item)) {
if(a_item_idx_start)
*a_item_idx_start = l_item_idx;
if(a_item_out_size)
*a_item_out_size = l_item_size;
return l_item;
}
}
l_tx_items_pos += l_item_size;
l_item_idx++;
}
return NULL;
}
/**
* Get all item from transaction by type
*
* a_tx [in] transaction
* a_item_idx_start[in/out] start index / found index of item in transaction, if 0 then from beginning
* a_type[in] type of item being find, if TX_ITEM_TYPE_ANY - any item
* a_item_count[out] count of returned item
* return item data, NULL Error index or bad format transaction
*/
dap_list_t* dap_chain_datum_tx_items_get(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int *a_item_count)
{
dap_list_t *items_list = NULL;
int l_items_count = 0, l_item_idx_start = 0;
// Get sign item from transaction
while(1) {
uint8_t *l_tx_item = dap_chain_datum_tx_item_get(a_tx, &l_item_idx_start, a_type, NULL);
if(!l_tx_item)
break;
items_list = dap_list_append(items_list, l_tx_item);
l_items_count++;
l_item_idx_start++;
}
if(a_item_count)
*a_item_count = l_items_count;
return items_list;
}
/*
* Authors:
* Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net>
* Alexander Lysikov <alexander.lysikov@demlabs.net>
* DeM Labs Inc. https://demlabs.net
* DeM Labs Open source community https://github.com/demlabsinc
* Copyright (c) 2017-2019
* All rights reserved.
This file is part of DAP (Deus Applications Prototypes) the open source project
DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DAP is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with any DAP based project. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx_out_cond.h"
uint8_t* dap_chain_datum_tx_out_cond_item_get_params(dap_chain_tx_out_cond_t *a_tx_out_cond, size_t *a_cond_size_out)
{
if(a_tx_out_cond) {
switch (a_tx_out_cond->header.subtype ) {
case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{
if(a_cond_size_out)
*a_cond_size_out = a_tx_out_cond->subtype.srv_pay.header.params_size;
return a_tx_out_cond->subtype.srv_pay.params;
}
default: return NULL;
}
}
return NULL;
}