2024-02-07 20:11:09 +01:00
// Copyright (c) 2014-2024 Zano Project
2018-12-27 18:50:45 +03:00
// Copyright (c) 2014-2018 The Louisdor Project
// Copyright (c) 2012-2013 The Cryptonote developers
// Copyright (c) 2014-2015 The Boolberry developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# pragma once
# include <type_traits>
# include <boost/variant.hpp>
# include <boost/functional/hash/hash.hpp>
# include <boost/mpl/back_inserter.hpp>
# include <boost/mpl/copy.hpp>
# include <boost/mpl/unique.hpp>
# include <boost/mpl/list.hpp>
# include <boost/mpl/equal.hpp>
2020-04-27 14:52:31 +03:00
# include <boost/mpl/vector/vector30.hpp>
2018-12-27 18:50:45 +03:00
# include <boost/type_traits/is_same.hpp>
# include <vector>
# include <cstring> // memcmp
# include <sstream>
# include <chrono>
# include "include_base_utils.h"
# include "serialization/binary_archive.h"
2022-05-10 21:56:42 +02:00
# include "common/crypto_serialization.h"
2018-12-27 18:50:45 +03:00
# include "serialization/stl_containers.h"
# include "serialization/serialization.h"
# include "serialization/variant.h"
2023-02-21 17:18:21 +01:00
# include "serialization/boost_types.h"
2018-12-27 18:50:45 +03:00
# include "serialization/json_archive.h"
# include "serialization/debug_archive.h"
# include "serialization/keyvalue_serialization.h" // epee key-value serialization
# include "string_tools.h"
# include "currency_config.h"
# include "crypto/crypto.h"
# include "crypto/hash.h"
2022-05-10 21:10:33 +02:00
# include "crypto/range_proofs.h"
2022-10-12 19:17:00 +02:00
# include "crypto/zarcanum.h"
2024-07-18 00:14:03 +02:00
# include "crypto/eth_signature.h"
2018-12-27 18:50:45 +03:00
# include "misc_language.h"
# include "block_flags.h"
# include "etc_custom_serialization.h"
2022-11-23 03:05:59 +01:00
# include "difficulty.h"
2018-12-27 18:50:45 +03:00
namespace currency
{
const static crypto : : hash null_hash = AUTO_VAL_INIT ( null_hash ) ;
const static crypto : : public_key null_pkey = AUTO_VAL_INIT ( null_pkey ) ;
const static crypto : : key_image null_ki = AUTO_VAL_INIT ( null_ki ) ;
const static crypto : : secret_key null_skey = AUTO_VAL_INIT ( null_skey ) ;
const static crypto : : signature null_sig = AUTO_VAL_INIT ( null_sig ) ;
const static crypto : : key_derivation null_derivation = AUTO_VAL_INIT ( null_derivation ) ;
2020-04-30 22:29:08 +02:00
const static crypto : : hash gdefault_genesis = epee : : string_tools : : hex_to_pod < crypto : : hash > ( " CC608F59F8080E2FBFE3C8C80EB6E6A953D47CF2D6AEBD345BADA3A1CAB99852 " ) ;
2023-02-08 18:42:29 +01:00
2023-07-14 02:10:18 +02:00
// Using C++17 extended aggregate initialization (P0017R1). C++17, finally! -- sowle
const static crypto : : public_key native_coin_asset_id = { { ' \xd6 ' , ' \x32 ' , ' \x9b ' , ' \x5b ' , ' \x1f ' , ' \x7c ' , ' \x08 ' , ' \x05 ' , ' \xb5 ' , ' \xc3 ' , ' \x45 ' , ' \xf4 ' , ' \x95 ' , ' \x75 ' , ' \x54 ' , ' \x00 ' , ' \x2a ' , ' \x2f ' , ' \x55 ' , ' \x78 ' , ' \x45 ' , ' \xf6 ' , ' \x4d ' , ' \x76 ' , ' \x45 ' , ' \xda ' , ' \xe0 ' , ' \xe0 ' , ' \x51 ' , ' \xa6 ' , ' \x49 ' , ' \x8a ' } } ; // == crypto::c_point_H, checked in crypto_constants
const static crypto : : public_key native_coin_asset_id_1div8 = { { ' \x74 ' , ' \xc3 ' , ' \x2d ' , ' \x3e ' , ' \xaa ' , ' \xfa ' , ' \xfc ' , ' \x62 ' , ' \x3b ' , ' \xf4 ' , ' \x83 ' , ' \xe8 ' , ' \x58 ' , ' \xd4 ' , ' \x2e ' , ' \x8b ' , ' \xf4 ' , ' \xec ' , ' \x7d ' , ' \xf0 ' , ' \x64 ' , ' \xad ' , ' \xa2 ' , ' \xe3 ' , ' \x49 ' , ' \x34 ' , ' \x46 ' , ' \x9c ' , ' \xff ' , ' \x6b ' , ' \x62 ' , ' \x68 ' } } ; // == 1/8 * crypto::c_point_H, checked in crypto_constants
2023-12-25 23:48:14 +01:00
const static crypto : : point_t native_coin_asset_id_pt { { 20574939 , 16670001 , - 29137604 , 14614582 , 24883426 , 3503293 , 2667523 , 420631 , 2267646 , - 4769165 , - 11764015 , - 12206428 , - 14187565 , - 2328122 , - 16242653 , - 788308 , - 12595746 , - 8251557 , - 10110987 , 853396 , - 4982135 , 6035602 , - 21214320 , 16156349 , 977218 , 2807645 , 31002271 , 5694305 , - 16054128 , 5644146 , - 15047429 , - 568775 , - 22568195 , - 8089957 , - 27721961 , - 10101877 , - 29459620 , - 13359100 , - 31515170 , - 6994674 } } ; // c_point_H
2022-09-30 21:23:06 +02:00
2022-11-23 03:05:59 +01:00
const static wide_difficulty_type global_difficulty_pow_starter = DIFFICULTY_POW_STARTER ;
const static wide_difficulty_type global_difficulty_pos_starter = DIFFICULTY_POS_STARTER ;
const static uint64_t global_difficulty_pos_target = DIFFICULTY_POS_TARGET ;
const static uint64_t global_difficulty_pow_target = DIFFICULTY_POW_TARGET ;
2020-04-30 22:29:08 +02:00
2019-04-03 12:48:09 +03:00
typedef std : : string payment_id_t ;
2018-12-27 18:50:45 +03:00
/************************************************************************/
/* */
/************************************************************************/
2024-10-21 20:51:27 +02:00
struct asset_descriptor_operation_v1 ;
2020-04-27 14:52:31 +03:00
//since structure used in blockchain as a key accessor, then be sure that there is no padding inside
# pragma pack(push, 1)
struct account_public_address_old
{
crypto : : public_key spend_public_key ;
crypto : : public_key view_public_key ;
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( spend_public_key )
FIELD ( view_public_key )
END_SERIALIZE ( )
BEGIN_KV_SERIALIZE_MAP ( )
2020-05-07 14:57:45 +03:00
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N ( spend_public_key , " m_spend_public_key " )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N ( view_public_key , " m_view_public_key " )
2020-04-27 14:52:31 +03:00
END_KV_SERIALIZE_MAP ( )
} ;
# pragma pack(pop)
# define ACCOUNT_PUBLIC_ADDRESS_SERIZALIZATION_VER 1
# define ACCOUNT_PUBLIC_ADDRESS_FLAG_AUDITABLE 0x01 // auditable address
//since structure used in blockchain as a key accessor, then be sure that there is no padding inside
2018-12-27 18:50:45 +03:00
# pragma pack(push, 1)
struct account_public_address
{
2020-04-22 22:30:29 +03:00
crypto : : public_key spend_public_key ;
crypto : : public_key view_public_key ;
2020-04-30 18:50:22 +03:00
uint8_t flags ;
2018-12-27 18:50:45 +03:00
2020-04-27 14:52:31 +03:00
DEFINE_SERIALIZATION_VERSION ( ACCOUNT_PUBLIC_ADDRESS_SERIZALIZATION_VER )
2018-12-27 18:50:45 +03:00
BEGIN_SERIALIZE_OBJECT ( )
2020-04-22 22:30:29 +03:00
FIELD ( spend_public_key )
FIELD ( view_public_key )
2020-04-30 18:50:22 +03:00
FIELD ( flags )
2018-12-27 18:50:45 +03:00
END_SERIALIZE ( )
2020-04-27 14:52:31 +03:00
BEGIN_KV_SERIALIZE_MAP ( )
2020-05-18 17:19:21 +03:00
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N ( spend_public_key , " m_spend_public_key " )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE_N ( view_public_key , " m_view_public_key " )
2020-04-30 18:50:22 +03:00
KV_SERIALIZE ( flags )
2020-04-27 14:52:31 +03:00
END_KV_SERIALIZE_MAP ( )
2020-05-07 15:02:35 +03:00
bool is_auditable ( ) const
{
return ( flags & ACCOUNT_PUBLIC_ADDRESS_FLAG_AUDITABLE ) ! = 0 ;
}
2020-04-27 14:52:31 +03:00
static account_public_address from_old ( const account_public_address_old & rhs )
{
account_public_address result = AUTO_VAL_INIT ( result ) ;
result . spend_public_key = rhs . spend_public_key ;
result . view_public_key = rhs . view_public_key ;
return result ;
}
account_public_address_old to_old ( ) const
{
account_public_address_old result = AUTO_VAL_INIT ( result ) ;
result . spend_public_key = spend_public_key ;
result . view_public_key = view_public_key ;
return result ;
}
2018-12-27 18:50:45 +03:00
} ;
# pragma pack(pop)
2020-04-27 14:52:31 +03:00
2018-12-27 18:50:45 +03:00
const static account_public_address null_pub_addr = AUTO_VAL_INIT ( null_pub_addr ) ;
typedef std : : vector < crypto : : signature > ring_signature ;
/************************************************************************/
/* extra structures */
/************************************************************************/
struct extra_attachment_info
{
uint64_t sz ;
crypto : : hash hsh ;
uint64_t cnt ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( sz )
FIELD ( hsh )
VARINT_FIELD ( cnt )
END_SERIALIZE ( )
} ;
/* outputs */
// 'mix_attr' possible values
# define CURRENCY_TO_KEY_OUT_RELAXED 0 // the output may be mixed with any fake outputs
# define CURRENCY_TO_KEY_OUT_FORCED_NO_MIX 1 // the output can't be mixed, only direct spend allowed
# define CURRENCY_TO_KEY_OUT_FORCED_MIX_LOWER_BOUND 2 // this and greather values means minimum number of total outputs (fakes + 1) must be mixed together for using that one
# pragma pack(push, 1)
struct txout_to_key
{
txout_to_key ( ) : key ( null_pkey ) , mix_attr ( 0 ) { }
txout_to_key ( const crypto : : public_key & _key ) : key ( _key ) , mix_attr ( 0 ) { }
crypto : : public_key key ;
uint8_t mix_attr ;
} ;
# pragma pack(pop)
/* inputs */
struct txin_gen
{
size_t height ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( height )
END_SERIALIZE ( )
} ;
// ref_by_id is used by txin_to_key to reference an output by source transaction hash and output's internal index,
// rather than amount and global output index (by default). Useful when output global index is unknown or may change.
struct ref_by_id
{
crypto : : hash tx_id ; // source transaction hash
uint32_t n ; // output index in source transaction
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( tx_id )
VARINT_FIELD ( n )
END_SERIALIZE ( )
} ;
2021-01-06 00:10:54 +01:00
typedef boost : : variant < uint64_t , ref_by_id > txout_ref_v ;
2018-12-27 18:50:45 +03:00
struct signed_parts
{
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( n_outs )
VARINT_FIELD ( n_extras )
END_SERIALIZE ( )
uint32_t n_outs ;
uint32_t n_extras ;
} ;
2022-09-21 22:35:24 +02:00
2023-02-01 21:58:26 +01:00
typedef boost : : variant < signed_parts , extra_attachment_info > txin_etc_details_v ;
2018-12-27 18:50:45 +03:00
2022-05-16 21:38:32 +02:00
struct referring_input
2018-12-27 18:50:45 +03:00
{
2021-01-06 00:10:54 +01:00
std : : vector < txout_ref_v > key_offsets ;
2022-05-16 21:38:32 +02:00
} ;
struct txin_to_key : public referring_input
{
uint64_t amount ;
2018-12-27 18:50:45 +03:00
crypto : : key_image k_image ; // double spending protection
2022-06-27 23:09:25 +02:00
std : : vector < txin_etc_details_v > etc_details ; // see also TX_FLAG_SIGNATURE_MODE_SEPARATE
2018-12-27 18:50:45 +03:00
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( amount )
2022-05-16 21:38:32 +02:00
FIELD ( key_offsets ) // from referring_input
2018-12-27 18:50:45 +03:00
FIELD ( k_image )
FIELD ( etc_details )
END_SERIALIZE ( )
} ;
2021-01-06 23:16:49 +01:00
struct txin_htlc : public txin_to_key
2020-12-28 23:45:16 +01:00
{
2020-12-30 23:58:03 +01:00
std : : string hltc_origin ;
2020-12-28 23:45:16 +01:00
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( hltc_origin )
2021-01-06 23:16:49 +01:00
FIELDS ( * static_cast < txin_to_key * > ( this ) )
END_SERIALIZE ( )
2020-12-28 23:45:16 +01:00
} ;
2018-12-27 18:50:45 +03:00
struct txin_multisig
{
uint64_t amount ;
crypto : : hash multisig_out_id ;
uint32_t sigs_count ; // actual number of signatures that are used to sign this input; needed to calculate tx blob size; must be equal to minimum_sigs of corresponding ms output
std : : vector < txin_etc_details_v > etc_details ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( amount )
FIELD ( multisig_out_id )
VARINT_FIELD ( sigs_count )
FIELD ( etc_details )
END_SERIALIZE ( )
} ;
2022-05-16 21:38:32 +02:00
2018-12-27 18:50:45 +03:00
struct txout_multisig
{
uint32_t minimum_sigs ;
std : : vector < crypto : : public_key > keys ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( minimum_sigs )
FIELD ( keys )
END_SERIALIZE ( )
} ;
2020-12-30 23:58:03 +01:00
# define CURRENCY_TXOUT_HTLC_FLAGS_HASH_TYPE_MASK 0x01 // 0 - SHA256, 1 - RIPEMD160
2020-12-28 23:45:16 +01:00
struct txout_htlc
{
crypto : : hash htlc_hash ;
uint8_t flags ; //select type of the hash, may be some extra info in future
uint64_t expiration ;
2021-01-24 21:00:43 +01:00
crypto : : public_key pkey_redeem ; //works before expiration
crypto : : public_key pkey_refund ; //works after expiration
2020-12-28 23:45:16 +01:00
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( htlc_hash )
FIELD ( flags )
VARINT_FIELD ( expiration )
2021-01-24 21:00:43 +01:00
FIELD ( pkey_redeem )
FIELD ( pkey_refund )
2020-12-28 23:45:16 +01:00
END_SERIALIZE ( )
} ;
2020-12-29 23:42:37 +01:00
typedef boost : : variant < txout_to_key , txout_multisig , txout_htlc > txout_target_v ;
2018-12-27 18:50:45 +03:00
//typedef std::pair<uint64_t, txout> out_t;
2022-05-17 17:32:53 +02:00
struct tx_out_bare
2018-12-27 18:50:45 +03:00
{
uint64_t amount ;
txout_target_v target ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( amount )
FIELD ( target )
END_SERIALIZE ( )
} ;
2022-06-27 23:09:25 +02:00
/////////////////////////////////////////////////////////////////////////////
// Zarcanum structures
//
2022-08-03 14:00:39 +02:00
struct txin_zc_input : public referring_input
{
txin_zc_input ( ) { }
// Boost's Assignable concept
txin_zc_input ( const txin_zc_input & ) = default ;
txin_zc_input & operator = ( const txin_zc_input & ) = default ;
crypto : : key_image k_image ;
std : : vector < txin_etc_details_v > etc_details ;
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( key_offsets ) // referring_input
FIELD ( k_image )
FIELD ( etc_details )
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( key_offsets ) // referring_input
BOOST_SERIALIZE ( k_image )
BOOST_SERIALIZE ( etc_details )
END_BOOST_SERIALIZATION ( )
} ;
2022-05-09 17:29:25 +02:00
struct tx_out_zarcanum
{
tx_out_zarcanum ( ) { }
// Boost's Assignable concept
tx_out_zarcanum ( const tx_out_zarcanum & ) = default ;
tx_out_zarcanum & operator = ( const tx_out_zarcanum & ) = default ;
crypto : : public_key stealth_address ;
2022-07-26 06:44:19 +02:00
crypto : : public_key concealing_point ; // group element Q, see also Zarcanum paper, premultiplied by 1/8
crypto : : public_key amount_commitment ; // premultiplied by 1/8
2023-02-08 18:31:07 +01:00
crypto : : public_key blinded_asset_id ; // group element T, premultiplied by 1/8
2023-02-01 21:58:26 +01:00
uint64_t encrypted_amount = 0 ;
uint8_t mix_attr = 0 ;
2022-05-09 17:29:25 +02:00
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( stealth_address )
FIELD ( concealing_point )
2022-06-27 23:09:25 +02:00
FIELD ( amount_commitment )
2023-02-01 21:58:26 +01:00
FIELD ( blinded_asset_id )
2022-05-09 17:29:25 +02:00
FIELD ( encrypted_amount )
2022-06-30 18:42:13 +02:00
FIELD ( mix_attr )
2022-05-09 17:29:25 +02:00
END_SERIALIZE ( )
2022-05-16 21:38:32 +02:00
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( stealth_address )
BOOST_SERIALIZE ( concealing_point )
2022-06-27 23:09:25 +02:00
BOOST_SERIALIZE ( amount_commitment )
2023-02-01 21:58:26 +01:00
BOOST_SERIALIZE ( blinded_asset_id )
2022-05-16 21:38:32 +02:00
BOOST_SERIALIZE ( encrypted_amount )
2022-06-30 18:42:13 +02:00
BOOST_SERIALIZE ( mix_attr )
2022-05-16 21:38:32 +02:00
END_BOOST_SERIALIZATION ( )
2022-05-09 17:29:25 +02:00
} ;
2022-06-27 23:09:25 +02:00
struct zarcanum_tx_data_v1
{
uint64_t fee ;
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( fee )
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( fee )
END_BOOST_SERIALIZATION ( )
} ;
2023-02-08 18:31:07 +01:00
struct zc_asset_surjection_proof
{
2023-04-01 06:49:40 +02:00
std : : vector < crypto : : BGE_proof_s > bge_proofs ; // one per output, non-aggregated version of Groth-Bootle-Esgin yet, need to be upgraded later -- sowle
2023-02-08 18:31:07 +01:00
BEGIN_SERIALIZE_OBJECT ( )
2023-04-01 06:49:40 +02:00
FIELD ( bge_proofs )
2023-02-08 18:31:07 +01:00
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
2023-04-01 06:49:40 +02:00
BOOST_SERIALIZE ( bge_proofs )
2023-02-08 18:31:07 +01:00
END_BOOST_SERIALIZATION ( )
} ;
// non-consoditated txs must have one of this objects in the attachments (elements count == vout.size())
// consolidated -- one pre consolidated part (sum(elements count) == vout.size())
2022-09-28 03:45:10 +02:00
struct zc_outs_range_proof
2022-07-06 03:01:53 +02:00
{
2023-02-08 18:31:07 +01:00
crypto : : bpp_signature_serialized bpp ; // for commitments in form: amount * U + mask * G
crypto : : vector_UG_aggregation_proof_serialized aggregation_proof ; // E'_j = e_j * U + y'_j * G + vector Shnorr
2022-07-06 03:01:53 +02:00
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( bpp )
2023-02-01 21:58:26 +01:00
FIELD ( aggregation_proof )
2022-07-06 03:01:53 +02:00
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( bpp )
2023-02-01 21:58:26 +01:00
BOOST_SERIALIZE ( aggregation_proof )
2022-07-06 03:01:53 +02:00
END_BOOST_SERIALIZATION ( )
} ;
2023-02-08 18:31:07 +01:00
// Zarcanum-aware CLSAG signature (one per ZC input)
2022-07-22 05:39:54 +02:00
struct ZC_sig
2022-06-27 23:09:25 +02:00
{
2022-10-11 20:19:24 +02:00
crypto : : public_key pseudo_out_amount_commitment = null_pkey ; // premultiplied by 1/8
2023-02-08 18:31:07 +01:00
crypto : : public_key pseudo_out_blinded_asset_id = null_pkey ; // premultiplied by 1/8
2023-02-01 21:58:26 +01:00
crypto : : CLSAG_GGX_signature_serialized clsags_ggx ;
2022-08-03 14:00:39 +02:00
2022-06-27 23:09:25 +02:00
BEGIN_SERIALIZE_OBJECT ( )
2022-08-03 14:00:39 +02:00
FIELD ( pseudo_out_amount_commitment )
2023-02-08 18:31:07 +01:00
FIELD ( pseudo_out_blinded_asset_id )
2023-02-01 21:58:26 +01:00
FIELD ( clsags_ggx )
2022-06-27 23:09:25 +02:00
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
2022-08-03 14:00:39 +02:00
BOOST_SERIALIZE ( pseudo_out_amount_commitment )
2023-02-08 18:31:07 +01:00
BOOST_SERIALIZE ( pseudo_out_blinded_asset_id )
2023-02-01 21:58:26 +01:00
BOOST_SERIALIZE ( clsags_ggx )
2022-06-27 23:09:25 +02:00
END_BOOST_SERIALIZATION ( )
} ;
2022-08-25 04:28:34 +02:00
2024-02-08 17:43:01 +01:00
// First part of a double Schnorr proof:
// 1) for txs without ZC inputs: proves that balance point = lin(G) (cancels out G component of outputs' amount commitments, asset tags assumed to be H (native coin) and non-blinded)
// 2) for txs with ZC inputs: proves that balance point = lin(X) (cancels out X component of blinded asset tags within amount commitments for both outputs and inputs (pseudo outs))
// Second part:
// proof of knowing transaction secret key (with respect to G)
2022-08-25 04:28:34 +02:00
struct zc_balance_proof
{
2024-02-08 17:43:01 +01:00
crypto : : generic_double_schnorr_sig_s dss ;
2022-08-25 04:28:34 +02:00
BEGIN_SERIALIZE_OBJECT ( )
2024-02-08 17:43:01 +01:00
FIELD ( dss )
2022-08-25 04:28:34 +02:00
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
2024-02-08 17:43:01 +01:00
BOOST_SERIALIZE ( dss )
2022-08-25 04:28:34 +02:00
END_BOOST_SERIALIZATION ( )
} ;
2022-10-12 19:17:00 +02:00
struct zarcanum_sig : public crypto : : zarcanum_proof
{
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( d )
FIELD ( C )
2022-10-18 04:30:54 +02:00
FIELD ( C_prime ) ;
FIELD ( E ) ;
FIELD ( c ) ;
FIELD ( y0 ) ;
FIELD ( y1 ) ;
FIELD ( y2 ) ;
FIELD ( y3 ) ;
FIELD ( y4 ) ;
2023-03-20 21:21:47 +01:00
FIELD_N ( " E_range_proof " , ( crypto : : bppe_signature_serialized & ) E_range_proof ) ;
2022-10-18 04:30:54 +02:00
FIELD ( pseudo_out_amount_commitment ) ;
2023-03-20 21:21:47 +01:00
FIELD_N ( " clsag_ggxxg " , ( crypto : : CLSAG_GGXXG_signature_serialized & ) clsag_ggxxg ) ;
2022-10-12 19:17:00 +02:00
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( d )
BOOST_SERIALIZE ( C )
2022-10-18 04:30:54 +02:00
BOOST_SERIALIZE ( C_prime ) ;
BOOST_SERIALIZE ( E ) ;
BOOST_SERIALIZE ( c ) ;
BOOST_SERIALIZE ( y0 ) ;
BOOST_SERIALIZE ( y1 ) ;
BOOST_SERIALIZE ( y2 ) ;
BOOST_SERIALIZE ( y3 ) ;
BOOST_SERIALIZE ( y4 ) ;
BOOST_SERIALIZE ( ( crypto : : bppe_signature_serialized & ) E_range_proof ) ;
BOOST_SERIALIZE ( pseudo_out_amount_commitment ) ;
2023-03-20 21:21:47 +01:00
BOOST_SERIALIZE ( ( crypto : : CLSAG_GGXXG_signature_serialized & ) clsag_ggxxg ) ;
2022-10-12 19:17:00 +02:00
END_BOOST_SERIALIZATION ( )
} ;
2022-06-27 23:09:25 +02:00
//#pragma pack(pop)
2022-08-03 14:00:39 +02:00
typedef boost : : variant < txin_gen , txin_to_key , txin_multisig , txin_htlc , txin_zc_input > txin_v ;
2022-05-09 17:29:25 +02:00
2022-05-17 17:32:53 +02:00
typedef boost : : variant < tx_out_bare , tx_out_zarcanum > tx_out_v ;
2022-05-09 17:29:25 +02:00
2018-12-27 18:50:45 +03:00
struct tx_comment
{
std : : string comment ;
BEGIN_SERIALIZE ( )
FIELD ( comment )
END_SERIALIZE ( )
} ;
2020-04-27 14:52:31 +03:00
struct tx_payer_old
{
account_public_address_old acc_addr ;
BEGIN_SERIALIZE ( )
FIELD ( acc_addr )
END_SERIALIZE ( )
} ;
2018-12-27 18:50:45 +03:00
struct tx_payer
{
2020-04-27 14:52:31 +03:00
tx_payer ( ) = default ;
tx_payer ( const tx_payer_old & old ) : acc_addr ( account_public_address : : from_old ( old . acc_addr ) ) { }
account_public_address acc_addr { } ;
BEGIN_SERIALIZE ( )
FIELD ( acc_addr )
END_SERIALIZE ( )
} ;
struct tx_receiver_old
{
account_public_address_old acc_addr ;
2018-12-27 18:50:45 +03:00
BEGIN_SERIALIZE ( )
FIELD ( acc_addr )
END_SERIALIZE ( )
} ;
struct tx_receiver
{
2020-04-27 14:52:31 +03:00
tx_receiver ( ) = default ;
tx_receiver ( const tx_receiver_old & old ) : acc_addr ( account_public_address : : from_old ( old . acc_addr ) ) { }
account_public_address acc_addr { } ;
2018-12-27 18:50:45 +03:00
BEGIN_SERIALIZE ( )
FIELD ( acc_addr )
END_SERIALIZE ( )
} ;
struct tx_crypto_checksum
{
//we put tx encrypted key_derivation into tx attachment/extra, to let sender decrypt attachments that had been encrypted.
// key_derivation encrypted on sender private send address
crypto : : key_derivation encrypted_key_derivation ;
uint32_t derivation_hash ;
BEGIN_SERIALIZE ( )
FIELD ( encrypted_key_derivation )
FIELD ( derivation_hash )
END_SERIALIZE ( )
} ;
2019-09-27 17:16:18 +02:00
struct tx_derivation_hint
2018-12-27 18:50:45 +03:00
{
std : : string msg ;
BEGIN_SERIALIZE ( )
FIELD ( msg )
2019-09-27 17:16:18 +02:00
END_SERIALIZE ( )
2018-12-27 18:50:45 +03:00
} ;
struct tx_service_attachment
{
std : : string service_id ; //string identifying service which addressed this attachment
std : : string instruction ; //string identifying specific instructions for service/way to interpret data
std : : string body ; //any data identifying service, options etc
std : : vector < crypto : : public_key > security ; //some of commands need proof of owner
uint8_t flags ; //special flags (ex: TX_SERVICE_ATTACHMENT_ENCRYPT_BODY), see below
BEGIN_SERIALIZE ( )
FIELD ( service_id )
FIELD ( instruction )
FIELD ( body )
FIELD ( security )
FIELD ( flags )
END_SERIALIZE ( )
2021-06-26 02:40:41 +02:00
BEGIN_KV_SERIALIZE_MAP ( )
2024-04-09 22:52:41 +02:00
KV_SERIALIZE ( service_id ) DOC_DSCR ( " Service ID, identificator that diferent one service from another " ) DOC_EXMP ( " C " ) DOC_END
KV_SERIALIZE ( instruction ) DOC_DSCR ( " Instruction that make sence for this particular service " ) DOC_EXMP ( " K " ) DOC_END
KV_SERIALIZE_BLOB_AS_HEX_STRING ( body ) DOC_DSCR ( " Hex-encoded body of the attachment " ) DOC_EXMP ( " dcfd7e055a6a3043ea3541a571a57a63e25dcc64e4a270f14fa9a58ac5dbec85dcfd7e055a6a3043ea3541a571a57a63e25dcc64e4a270f14fa9a58ac5dbec85 " ) DOC_END
KV_SERIALIZE_CONTAINER_POD_AS_HEX ( security ) DOC_DSCR ( " Hex-encoded public key of the owner, optional " ) DOC_EXMP ( " d8f6e37f28a632c06b0b3466db1b9d2d1b36a580ee35edfd971dc1423bc412a5 " ) DOC_END
KV_SERIALIZE ( flags ) DOC_DSCR ( " Flags that help wallet to automatically process some properties of the attachment(combination of TX_SERVICE_ATTACHMENT_ENCRYPT_BODY=1, TX_SERVICE_ATTACHMENT_DEFLATE_BODY=2, TX_SERVICE_ATTACHMENT_ENCRYPT_BODY_ISOLATE_AUDITABLE=4,TX_SERVICE_ATTACHMENT_ENCRYPT_ADD_PROOF=8 ) " ) DOC_END
2021-06-26 02:40:41 +02:00
END_KV_SERIALIZE_MAP ( )
2018-12-27 18:50:45 +03:00
} ;
// applicable flags for tx_service_attachment::flags, can be combined using bitwise OR
2021-06-24 00:57:38 +02:00
# define TX_SERVICE_ATTACHMENT_ENCRYPT_BODY static_cast<uint8_t>(1 << 0)
# define TX_SERVICE_ATTACHMENT_DEFLATE_BODY static_cast<uint8_t>(1 << 1)
// with this flag enabled body encrypted/decrypted with the key created as a derivation from onetime key and "spend keys" of receiver
# define TX_SERVICE_ATTACHMENT_ENCRYPT_BODY_ISOLATE_AUDITABLE static_cast<uint8_t>(1 << 2)
// add proof of content, without revealing secrete
# define TX_SERVICE_ATTACHMENT_ENCRYPT_ADD_PROOF static_cast<uint8_t>(1 << 3)
2018-12-27 18:50:45 +03:00
//,
struct extra_user_data
{
std : : string buff ;
BEGIN_SERIALIZE ( )
FIELD ( buff )
END_SERIALIZE ( )
} ;
2020-04-29 21:12:16 +03:00
struct extra_alias_entry_base_old
{
account_public_address_old m_address ;
std : : string m_text_comment ;
std : : vector < crypto : : secret_key > m_view_key ; // only one or zero elments expected (std::vector is using as memory efficient container for such a case)
std : : vector < crypto : : signature > m_sign ; // only one or zero elments expected (std::vector is using as memory efficient container for such a case)
BEGIN_SERIALIZE ( )
FIELD ( m_address )
FIELD ( m_text_comment )
FIELD ( m_view_key )
FIELD ( m_sign )
END_SERIALIZE ( )
} ;
struct extra_alias_entry_old : public extra_alias_entry_base_old
{
std : : string m_alias ;
BEGIN_SERIALIZE ( )
FIELD ( m_alias )
FIELDS ( * static_cast < extra_alias_entry_base_old * > ( this ) )
END_SERIALIZE ( )
} ;
2018-12-27 18:50:45 +03:00
struct extra_alias_entry_base
{
2020-05-01 12:56:09 +03:00
extra_alias_entry_base ( ) = default ;
extra_alias_entry_base ( const extra_alias_entry_base_old & old )
: m_address ( account_public_address : : from_old ( old . m_address ) )
, m_text_comment ( old . m_text_comment )
, m_view_key ( old . m_view_key )
, m_sign ( old . m_sign )
{
}
2018-12-27 18:50:45 +03:00
account_public_address m_address ;
std : : string m_text_comment ;
std : : vector < crypto : : secret_key > m_view_key ; // only one or zero elments expected (std::vector is using as memory efficient container for such a case)
std : : vector < crypto : : signature > m_sign ; // only one or zero elments expected (std::vector is using as memory efficient container for such a case)
BEGIN_SERIALIZE ( )
FIELD ( m_address )
FIELD ( m_text_comment )
FIELD ( m_view_key )
FIELD ( m_sign )
END_SERIALIZE ( )
} ;
2020-04-29 21:12:16 +03:00
struct extra_alias_entry : public extra_alias_entry_base
2018-12-27 18:50:45 +03:00
{
2020-05-01 12:56:09 +03:00
extra_alias_entry ( ) = default ;
extra_alias_entry ( const extra_alias_entry_old & old )
: extra_alias_entry_base ( old )
, m_alias ( old . m_alias )
2022-05-18 16:34:19 +02:00
{ }
2020-05-01 12:56:09 +03:00
2018-12-27 18:50:45 +03:00
std : : string m_alias ;
BEGIN_SERIALIZE ( )
FIELD ( m_alias )
2020-04-29 21:12:16 +03:00
FIELDS ( * static_cast < extra_alias_entry_base * > ( this ) )
2020-05-01 12:56:09 +03:00
END_SERIALIZE ( )
extra_alias_entry_old to_old ( ) const
{
extra_alias_entry_old result = AUTO_VAL_INIT ( result ) ;
result . m_address = m_address . to_old ( ) ;
result . m_text_comment = m_text_comment ;
result . m_view_key = m_view_key ;
result . m_sign = m_sign ;
result . m_alias = m_alias ;
return result ;
}
2018-12-27 18:50:45 +03:00
} ;
2024-10-20 15:57:25 +04:00
# define ASSET_DESCRIPTOR_BASE_HF4_VER 0
# define ASSET_DESCRIPTOR_BASE_HF5_VER 2
# define ASSET_DESCRIPTOR_BASE_LAST_VER 2
2018-12-27 18:50:45 +03:00
2024-10-18 13:49:21 +02:00
struct dummy
{
2024-10-18 00:26:30 +04:00
BEGIN_SERIALIZE ( )
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
END_BOOST_SERIALIZATION_TOTAL_FIELDS ( 0 )
} ;
typedef boost : : variant < dummy > asset_descriptor_base_etc_fields ;
2024-10-18 13:49:21 +02:00
typedef boost : : variant < crypto : : public_key , crypto : : eth_public_key > asset_owner_pub_key_v ;
2024-09-23 05:27:46 +02:00
2022-09-23 23:19:44 +02:00
struct asset_descriptor_base
{
uint64_t total_max_supply = 0 ;
uint64_t current_supply = 0 ;
2024-07-03 01:40:40 +02:00
uint8_t decimal_point = 0 ;
2022-09-23 23:19:44 +02:00
std : : string ticker ;
std : : string full_name ;
2022-11-15 21:54:55 +01:00
std : : string meta_info ;
2023-02-21 01:51:55 +01:00
crypto : : public_key owner = currency : : null_pkey ; // consider premultipling by 1/8
bool hidden_supply = false ;
2024-10-20 15:57:25 +04:00
uint8_t version = ASSET_DESCRIPTOR_BASE_HF4_VER ;
2024-10-18 00:26:30 +04:00
//version 1 members
2024-08-12 20:14:31 +02:00
boost : : optional < crypto : : eth_public_key > owner_eth_pub_key ; // note: the size is 33 bytes (if present) // NOTE: using boost::optional instead of std::optional because of the Boost compilation issue: https://github.com/boostorg/serialization/issues/319 -- sowle
2024-10-18 00:26:30 +04:00
//version 2 members
std : : vector < asset_descriptor_base_etc_fields > etc ; //container for future use if we would be adding some optional parameters that is not known yet, but without mess related to format version
2022-09-23 23:19:44 +02:00
2024-07-18 00:14:03 +02:00
2024-10-19 17:49:38 +04:00
BEGIN_VERSIONED_SERIALIZE ( ASSET_DESCRIPTOR_BASE_LAST_VER , version )
2022-09-23 23:19:44 +02:00
FIELD ( total_max_supply )
FIELD ( current_supply )
FIELD ( decimal_point )
FIELD ( ticker )
FIELD ( full_name )
2022-11-15 21:54:55 +01:00
FIELD ( meta_info )
2022-09-23 23:19:44 +02:00
FIELD ( owner )
2023-02-21 01:51:55 +01:00
FIELD ( hidden_supply )
2024-07-18 00:14:03 +02:00
END_VERSION_UNDER ( 1 )
FIELD ( owner_eth_pub_key )
2024-10-18 00:26:30 +04:00
END_VERSION_UNDER ( 2 )
FIELD ( etc )
2022-09-26 21:57:24 +02:00
END_SERIALIZE ( )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZATION_CURRENT_ARCHIVE_VER ( 2 )
2022-09-26 21:57:24 +02:00
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( total_max_supply )
BOOST_SERIALIZE ( current_supply )
BOOST_SERIALIZE ( decimal_point )
BOOST_SERIALIZE ( ticker )
BOOST_SERIALIZE ( full_name )
2022-11-15 21:54:55 +01:00
BOOST_SERIALIZE ( meta_info )
2022-09-26 21:57:24 +02:00
BOOST_SERIALIZE ( owner )
2023-08-17 21:00:59 +02:00
BOOST_SERIALIZE ( hidden_supply )
2024-07-18 00:14:03 +02:00
BOOST_END_VERSION_UNDER ( 1 )
BOOST_SERIALIZE ( owner_eth_pub_key )
2024-10-18 00:26:30 +04:00
BOOST_END_VERSION_UNDER ( 2 )
BOOST_SERIALIZE ( etc )
BOOST_SERIALIZE ( version )
END_BOOST_SERIALIZATION_TOTAL_FIELDS ( 11 )
2022-11-15 21:54:55 +01:00
BEGIN_KV_SERIALIZE_MAP ( )
2024-07-18 00:14:03 +02:00
KV_SERIALIZE ( total_max_supply ) DOC_DSCR ( " Maximum possible supply for a given asset, cannot be changed after deployment. " ) DOC_EXMP ( 1000000000000000000 ) DOC_END
KV_SERIALIZE ( current_supply ) DOC_DSCR ( " Currently emitted supply for the given asset (ignored for REGISTER operation). " ) DOC_EXMP ( 500000000000000000 ) DOC_END
KV_SERIALIZE ( decimal_point ) DOC_DSCR ( " Decimal point. " ) DOC_EXMP ( 12 ) DOC_END
KV_SERIALIZE ( ticker ) DOC_DSCR ( " Ticker associated with the asset. " ) DOC_EXMP ( " ZABC " ) DOC_END
KV_SERIALIZE ( full_name ) DOC_DSCR ( " Full name of the asset. " ) DOC_EXMP ( " Zano wrapped ABC " ) DOC_END
KV_SERIALIZE ( meta_info ) DOC_DSCR ( " Any other information associated with the asset in free form. " ) DOC_EXMP ( " Stable and private " ) DOC_END
KV_SERIALIZE_POD_AS_HEX_STRING ( owner ) DOC_DSCR ( " Owner's key, used only for EMIT and UPDATE validation, can be changed by transferring asset ownership. " ) DOC_EXMP ( " f74bb56a5b4fa562e679ccaadd697463498a66de4f1760b2cd40f11c3a00a7a8 " ) DOC_END
KV_SERIALIZE ( hidden_supply ) DOC_DSCR ( " This field is reserved for future use and will be documented later. " ) DOC_END
2024-09-29 23:30:48 +04:00
KV_SERIALIZE_POD_AS_HEX_STRING ( owner_eth_pub_key ) DOC_DSCR ( " [Optional] Owner's key in the case when ETH signature is used. " ) DOC_END
2022-11-15 21:54:55 +01:00
END_KV_SERIALIZE_MAP ( )
2022-09-23 23:19:44 +02:00
} ;
2022-11-17 21:58:36 +01:00
struct asset_descriptor_with_id : public asset_descriptor_base
{
2023-02-01 21:58:26 +01:00
crypto : : public_key asset_id = currency : : null_pkey ;
2022-11-17 21:58:36 +01:00
/*
BEGIN_VERSIONED_SERIALIZE ( )
FIELD ( * static_cast < asset_descriptor_base > ( this ) )
FIELD ( asset_id )
END_SERIALIZE ( )
*/
BEGIN_KV_SERIALIZE_MAP ( )
KV_CHAIN_BASE ( asset_descriptor_base )
2024-04-07 16:43:55 +02:00
KV_SERIALIZE_POD_AS_HEX_STRING ( asset_id ) DOC_DSCR ( " Asset ID " ) DOC_EXMP ( " f74bb56a5b4fa562e679ccaadd697463498a66de4f1760b2cd40f11c3a00a7a8 " ) DOC_END
2022-11-17 21:58:36 +01:00
END_KV_SERIALIZE_MAP ( )
2022-09-23 23:19:44 +02:00
} ;
2022-09-26 21:57:24 +02:00
# define ASSET_DESCRIPTOR_OPERATION_UNDEFINED 0
# define ASSET_DESCRIPTOR_OPERATION_REGISTER 1
2023-08-29 09:20:59 +02:00
# define ASSET_DESCRIPTOR_OPERATION_EMIT 2
2022-09-27 20:13:49 +02:00
# define ASSET_DESCRIPTOR_OPERATION_UPDATE 3
2023-02-01 21:58:26 +01:00
# define ASSET_DESCRIPTOR_OPERATION_PUBLIC_BURN 4
2022-09-26 21:57:24 +02:00
2024-10-20 15:57:25 +04:00
# define ASSET_DESCRIPTOR_OPERATION_HF4_VER 1
# define ASSET_DESCRIPTOR_OPERATION_HF5_VER 2
2024-10-18 00:26:30 +04:00
# define ASSET_DESCRIPTOR_OPERATION_LAST_VER 2
2024-10-18 01:15:47 +04:00
typedef boost : : variant < dummy > asset_descriptor_operation_etc_fields ;
2022-09-26 21:57:24 +02:00
struct asset_descriptor_operation
{
2024-10-18 00:26:30 +04:00
uint8_t operation_type = ASSET_DESCRIPTOR_OPERATION_UNDEFINED ;
2024-10-20 15:57:25 +04:00
uint8_t version = ASSET_DESCRIPTOR_OPERATION_HF4_VER ;
2024-10-18 03:15:33 +02:00
// register emit burn update
boost : : optional < crypto : : public_key > opt_amount_commitment ; // + + + - (premultiplied by 1/8)
boost : : optional < crypto : : public_key > opt_asset_id ; // - + + +
boost : : optional < asset_descriptor_base > opt_descriptor ; // + - - +
2024-10-31 03:39:09 +01:00
boost : : optional < uint64_t > opt_amount ; // ? ? ? - (only for non-hidden supply)
2024-10-18 03:15:33 +02:00
boost : : optional < uint32_t > opt_asset_id_salt ; // ? - - - (optional)
std : : vector < asset_descriptor_operation_etc_fields > etc ; // (reserved for future use)
2024-10-18 00:26:30 +04:00
BEGIN_VERSIONED_SERIALIZE ( ASSET_DESCRIPTOR_OPERATION_LAST_VER , version )
CHAIN_TRANSITION_VER ( 0 , asset_descriptor_operation_v1 )
CHAIN_TRANSITION_VER ( 1 , asset_descriptor_operation_v1 )
2022-09-26 21:57:24 +02:00
FIELD ( operation_type )
2024-10-18 00:26:30 +04:00
FIELD ( opt_amount_commitment )
2023-08-03 20:01:41 +02:00
FIELD ( opt_asset_id )
2024-10-18 00:26:30 +04:00
FIELD ( opt_descriptor )
FIELD ( opt_amount )
2024-10-18 03:15:33 +02:00
FIELD ( opt_asset_id_salt )
2024-10-18 00:26:30 +04:00
FIELD ( etc )
2022-09-26 21:57:24 +02:00
END_SERIALIZE ( )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZATION_CURRENT_ARCHIVE_VER ( 2 )
2022-09-26 21:57:24 +02:00
BEGIN_BOOST_SERIALIZATION ( )
2024-10-18 00:26:30 +04:00
BOOST_CHAIN_TRANSITION_VER ( 1 , asset_descriptor_operation_v1 )
BOOST_CHAIN_TRANSITION_VER ( 0 , asset_descriptor_operation_v1 )
BOOST_SERIALIZE ( version )
2022-09-26 21:57:24 +02:00
BOOST_SERIALIZE ( operation_type )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZE ( opt_amount_commitment )
2023-08-03 20:01:41 +02:00
BOOST_SERIALIZE ( opt_asset_id )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZE ( opt_descriptor )
BOOST_SERIALIZE ( opt_amount )
2024-10-18 03:15:33 +02:00
BOOST_SERIALIZE ( opt_asset_id_salt )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZE ( etc )
2024-10-19 17:49:38 +04:00
END_BOOST_SERIALIZATION_TOTAL_FIELDS ( 8 )
2024-09-23 14:33:22 +02:00
BEGIN_KV_SERIALIZE_MAP ( )
2024-10-18 00:26:30 +04:00
KV_SERIALIZE ( version ) DOC_DSCR ( " Asset operation type struct version " ) DOC_EXMP ( 2 ) DOC_END
KV_SERIALIZE ( operation_type ) DOC_DSCR ( " Asset operation type identifier " ) DOC_EXMP ( 1 ) DOC_END
2024-10-18 03:15:33 +02:00
KV_SERIALIZE_POD_AS_HEX_STRING ( opt_amount_commitment ) DOC_DSCR ( " (optional) Asset operation amount commitment (register/emit/burn). " ) DOC_EXMP ( " 5688b56a5b4fa562e679ccaadd697463498a66de4f1760b2cd40f11c3a00a7a8 " ) DOC_END
KV_SERIALIZE_POD_AS_HEX_STRING ( opt_asset_id ) DOC_DSCR ( " (optional) ID of an asset (emit/burn/update). " ) DOC_EXMP ( " cc4e69455e63f4a581257382191de6856c2156630b3fba0db4bdd73ffcfb36b6 " ) DOC_END
KV_SERIALIZE ( opt_descriptor ) DOC_DSCR ( " (optional) Asset operation descriptor (register/update). " ) DOC_EXMP_AUTO ( ) DOC_END
KV_SERIALIZE ( opt_amount ) DOC_DSCR ( " (optional) Asset operation amount (register/emit/burn when supply is non-hidden). " ) DOC_EXMP_AUTO ( ) DOC_END
KV_SERIALIZE ( opt_asset_id_salt ) DOC_DSCR ( " (optional) Asset ID salt. May only be used for asset registration. " ) DOC_EXMP_AUTO ( ) DOC_END
2024-10-18 00:26:30 +04:00
//KV_SERIALIZE(etc) DOC_DSCR("Extra operations") DOC_EXMP_AUTO() DOC_END <---- serialization for variant not supported yet
2024-09-23 14:33:22 +02:00
END_KV_SERIALIZE_MAP ( )
2024-10-18 00:26:30 +04:00
2023-02-21 01:51:55 +01:00
} ;
struct asset_operation_proof
{
// linear composition proof for the fact amount_commitment = lin(asset_id, G)
boost : : optional < crypto : : linear_composition_proof_s > opt_amount_commitment_composition_proof ; // for hidden supply
boost : : optional < crypto : : signature > opt_amount_commitment_g_proof ; // for non-hidden supply, proofs that amount_commitment - supply * asset_id = lin(G)
2023-09-01 11:59:23 +02:00
uint8_t version = 0 ;
2023-02-21 01:51:55 +01:00
2023-09-01 11:59:23 +02:00
BEGIN_VERSIONED_SERIALIZE ( 0 , version )
2023-02-21 17:18:21 +01:00
FIELD ( opt_amount_commitment_composition_proof )
FIELD ( opt_amount_commitment_g_proof )
2023-02-21 01:51:55 +01:00
END_SERIALIZE ( )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZATION_CURRENT_ARCHIVE_VER ( 1 )
2023-02-21 01:51:55 +01:00
BEGIN_BOOST_SERIALIZATION ( )
2023-02-21 17:18:21 +01:00
BOOST_SERIALIZE ( opt_amount_commitment_composition_proof )
BOOST_SERIALIZE ( opt_amount_commitment_g_proof )
2023-09-01 11:59:23 +02:00
BOOST_END_VERSION_UNDER ( 1 )
BOOST_SERIALIZE ( version )
2022-09-26 21:57:24 +02:00
END_BOOST_SERIALIZATION ( )
} ;
2024-02-13 11:14:05 +01:00
struct asset_operation_ownership_proof
{
crypto : : generic_schnorr_sig_s gss ;
uint8_t version = 0 ;
BEGIN_VERSIONED_SERIALIZE ( 0 , version )
FIELD ( gss )
END_SERIALIZE ( )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZATION_CURRENT_ARCHIVE_VER ( 1 )
2024-02-13 11:14:05 +01:00
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( gss )
BOOST_END_VERSION_UNDER ( 1 )
BOOST_SERIALIZE ( version )
END_BOOST_SERIALIZATION ( )
} ;
2022-09-26 21:57:24 +02:00
2022-09-23 23:19:44 +02:00
2024-07-18 00:14:03 +02:00
struct asset_operation_ownership_proof_eth
{
2024-09-23 05:13:26 +02:00
crypto : : eth_signature eth_sig ; // 64 bytes
2024-07-18 00:14:03 +02:00
uint8_t version = 0 ;
BEGIN_VERSIONED_SERIALIZE ( 0 , version )
FIELD ( eth_sig )
END_SERIALIZE ( )
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( eth_sig )
BOOST_SERIALIZE ( version )
END_BOOST_SERIALIZATION ( )
2024-09-23 14:33:22 +02:00
BEGIN_KV_SERIALIZE_MAP ( )
KV_SERIALIZE_POD_AS_HEX_STRING ( eth_sig ) DOC_DSCR ( " HEX-encoded ETH signature (64 bytes) " ) DOC_EXMP ( " 674bb56a5b4fa562e679ccacc4e69455e63f4a581257382191de6856c2156630b3fba0db4bdd73ffcfb36b6add697463498a66de4f1760b2cd40f11c3a00a7a8 " ) DOC_END
KV_SERIALIZE ( version ) DOC_DSCR ( " Structure version " ) DOC_EXMP ( 0 ) DOC_END
END_KV_SERIALIZE_MAP ( )
2024-07-18 00:14:03 +02:00
} ;
2018-12-27 18:50:45 +03:00
struct extra_padding
{
std : : vector < uint8_t > buff ; //stub
BEGIN_SERIALIZE ( )
FIELD ( buff )
END_SERIALIZE ( )
} ;
2019-07-22 13:04:01 +02:00
//number of block (or timestamp if v bigger then CURRENCY_MAX_BLOCK_NUMBER), used as a limitation: spend this tx not early then block/time
2018-12-27 18:50:45 +03:00
struct etc_tx_details_unlock_time
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
END_SERIALIZE ( )
} ;
2019-07-22 13:04:01 +02:00
//number of block (or timestamp if unlock_time_array[i] bigger then CURRENCY_MAX_BLOCK_NUMBER), used as a limitation: spend this tx not early then block/time
//unlock_time_array[i], i - index of output, unlock_time_array.size() == vout.size()
struct etc_tx_details_unlock_time2
{
std : : vector < uint64_t > unlock_time_array ;
BEGIN_SERIALIZE ( )
2019-07-24 00:37:24 +02:00
FIELD ( unlock_time_array )
2019-07-22 13:04:01 +02:00
END_SERIALIZE ( )
} ;
2018-12-27 18:50:45 +03:00
struct etc_tx_details_expiration_time
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
END_SERIALIZE ( )
} ;
/*
this structure used to put real time into PoS block ( or could be other meaning ) , to have more suitable dates in transactions
*/
struct etc_tx_time
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
2019-07-24 00:37:24 +02:00
END_SERIALIZE ( )
2018-12-27 18:50:45 +03:00
} ;
struct etc_tx_details_flags
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
END_SERIALIZE ( )
} ;
2020-08-29 01:14:26 +02:00
struct etc_tx_flags16_t
2018-12-27 18:50:45 +03:00
{
uint16_t v ;
BEGIN_SERIALIZE ( )
FIELD ( v )
END_SERIALIZE ( )
} ;
2023-02-21 01:51:55 +01:00
typedef boost : : mpl : : vector23 <
2020-04-27 14:52:31 +03:00
tx_service_attachment , tx_comment , tx_payer_old , tx_receiver_old , tx_derivation_hint , std : : string , tx_crypto_checksum , etc_tx_time , etc_tx_details_unlock_time , etc_tx_details_expiration_time ,
2020-08-29 01:14:26 +02:00
etc_tx_details_flags , crypto : : public_key , extra_attachment_info , extra_alias_entry_old , extra_user_data , extra_padding , etc_tx_flags16_t , etc_tx_details_unlock_time2 ,
2023-02-21 01:51:55 +01:00
tx_payer , tx_receiver , extra_alias_entry , zarcanum_tx_data_v1 , asset_descriptor_operation
2020-04-22 22:02:37 +03:00
> all_payload_types ;
2018-12-27 18:50:45 +03:00
typedef boost : : make_variant_over < all_payload_types > : : type payload_items_v ;
2020-04-22 22:02:37 +03:00
typedef payload_items_v extra_v ;
typedef payload_items_v attachment_v ;
2018-12-27 18:50:45 +03:00
2022-05-16 21:38:32 +02:00
2022-05-18 16:34:19 +02:00
//classic CryptoNote signature by Nicolas Van Saberhagen
struct NLSAG_sig
{
2022-06-19 19:47:43 +02:00
std : : vector < crypto : : signature > s ;
2022-05-24 00:46:44 +02:00
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( s )
END_SERIALIZE ( )
2022-05-25 22:31:23 +02:00
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( s )
END_BOOST_SERIALIZATION ( )
2022-05-18 16:34:19 +02:00
} ;
struct void_sig
{
//TODO:
2022-05-24 00:46:44 +02:00
BEGIN_SERIALIZE_OBJECT ( )
END_SERIALIZE ( )
2022-05-25 22:31:23 +02:00
BEGIN_BOOST_SERIALIZATION ( )
END_BOOST_SERIALIZATION ( )
2022-05-18 16:34:19 +02:00
} ;
2022-10-12 19:17:00 +02:00
typedef boost : : variant < NLSAG_sig , void_sig , ZC_sig , zarcanum_sig > signature_v ;
2022-05-18 16:34:19 +02:00
2024-07-18 00:14:03 +02:00
typedef boost : : variant < zc_asset_surjection_proof , zc_outs_range_proof , zc_balance_proof , asset_operation_proof , asset_operation_ownership_proof , asset_operation_ownership_proof_eth > proof_v ;
2022-05-18 16:34:19 +02:00
2022-05-17 16:19:55 +02:00
2022-05-16 23:32:28 +02:00
//include backward compatibility defintions
# include "currency_basic_backward_comp.inl"
2018-12-27 18:50:45 +03:00
class transaction_prefix
{
public :
2023-02-21 01:51:55 +01:00
uint64_t version = 0 ;
2024-12-06 05:39:18 +01:00
uint8_t hardfork_id = 0 ;
2018-12-27 18:50:45 +03:00
std : : vector < txin_v > vin ;
2023-02-21 01:51:55 +01:00
std : : vector < extra_v > extra ;
2022-05-18 16:34:19 +02:00
std : : vector < tx_out_v > vout ;
2018-12-27 18:50:45 +03:00
BEGIN_SERIALIZE ( )
VARINT_FIELD ( version )
2022-05-16 23:32:28 +02:00
CHAIN_TRANSITION_VER ( TRANSACTION_VERSION_INITAL , transaction_prefix_v1 )
CHAIN_TRANSITION_VER ( TRANSACTION_VERSION_PRE_HF4 , transaction_prefix_v1 )
2018-12-27 18:50:45 +03:00
if ( CURRENT_TRANSACTION_VERSION < version ) return false ;
FIELD ( vin )
FIELD ( extra )
2023-02-21 01:51:55 +01:00
FIELD ( vout )
2024-12-06 05:39:18 +01:00
if ( version < TRANSACTION_VERSION_POST_HF5 ) return true ;
FIELD ( hardfork_id )
2018-12-27 18:50:45 +03:00
END_SERIALIZE ( )
} ;
/*
TX_FLAG_SIGNATURE_MODE_SEPARATE - flag that set different signature validation mode .
With this mode each signature sign prefix with it ' s own txin entry only , that allow
construct transaction partially , supposed to be in use to construct multisig - based escrow transaction .
*/
# define TX_FLAG_SIGNATURE_MODE_SEPARATE 0x01
class transaction : public transaction_prefix
{
public :
std : : vector < attachment_v > attachment ;
2023-02-21 01:51:55 +01:00
std : : vector < signature_v > signatures ;
std : : vector < proof_v > proofs ;
2018-12-27 18:50:45 +03:00
BEGIN_SERIALIZE_OBJECT ( )
FIELDS ( * static_cast < transaction_prefix * > ( this ) )
2022-05-18 16:34:19 +02:00
CHAIN_TRANSITION_VER ( TRANSACTION_VERSION_INITAL , transaction_v1 )
CHAIN_TRANSITION_VER ( TRANSACTION_VERSION_PRE_HF4 , transaction_v1 )
2018-12-27 18:50:45 +03:00
FIELD ( attachment )
2023-02-21 01:51:55 +01:00
FIELD ( signatures )
FIELD ( proofs )
2018-12-27 18:50:45 +03:00
END_SERIALIZE ( )
2024-10-18 00:26:30 +04:00
BOOST_SERIALIZATION_CURRENT_ARCHIVE_VER ( 0 )
BEGIN_BOOST_SERIALIZATION ( )
BOOST_SERIALIZE ( version )
BOOST_SERIALIZE ( vin )
BOOST_SERIALIZE ( vout )
BOOST_SERIALIZE ( extra )
BOOST_SERIALIZE ( signatures )
BOOST_SERIALIZE ( attachment )
BOOST_END_VERSION_UNDER ( 1 )
BOOST_SERIALIZE ( proofs )
2024-10-19 17:49:38 +04:00
END_BOOST_SERIALIZATION ( )
2018-12-27 18:50:45 +03:00
} ;
/************************************************************************/
/* */
/************************************************************************/
struct block_header
{
uint8_t major_version ;
uint8_t minor_version ;
uint64_t timestamp ;
crypto : : hash prev_id ;
uint64_t nonce ;
uint8_t flags ;
BEGIN_SERIALIZE ( )
FIELD ( major_version )
2019-08-15 07:15:08 +03:00
if ( major_version > CURRENT_BLOCK_MAJOR_VERSION ) return false ;
2018-12-27 18:50:45 +03:00
FIELD ( nonce )
FIELD ( prev_id )
VARINT_FIELD ( minor_version )
VARINT_FIELD ( timestamp )
FIELD ( flags )
END_SERIALIZE ( )
} ;
struct block : public block_header
{
transaction miner_tx ;
std : : vector < crypto : : hash > tx_hashes ;
BEGIN_SERIALIZE_OBJECT ( )
FIELDS ( * static_cast < block_header * > ( this ) )
FIELD ( miner_tx )
FIELD ( tx_hashes )
END_SERIALIZE ( )
} ;
struct keypair
{
crypto : : public_key pub ;
crypto : : secret_key sec ;
static inline keypair generate ( )
{
keypair k ;
generate_keys ( k . pub , k . sec ) ;
return k ;
}
} ;
2021-06-24 20:34:13 +02:00
const static keypair null_keypair = AUTO_VAL_INIT ( null_keypair ) ;
2018-12-27 18:50:45 +03:00
//---------------------------------------------------------------
//PoS
//based from ppcoin/novacoin approach
/*
POS PROTOCOL , stake modifier
*/
//-------------------------------------------------------------------------------------------------------------------
# pragma pack(push, 1)
struct stake_modifier_type
{
crypto : : hash last_pow_id ;
crypto : : hash last_pos_kernel_id ;
} ;
struct stake_kernel
{
stake_modifier_type stake_modifier ;
uint64_t block_timestamp ; //this block timestamp
crypto : : key_image kimage ;
} ;
# pragma pack(pop)
struct pos_entry
{
uint64_t amount ;
2022-09-05 20:18:27 +02:00
uint64_t g_index ; // global output index. (could be WALLET_GLOBAL_OUTPUT_INDEX_UNDEFINED)
2018-12-27 18:50:45 +03:00
crypto : : key_image keyimage ;
uint64_t block_timestamp ;
2019-07-24 19:14:35 +02:00
uint64_t stake_unlock_time ;
2022-09-05 12:30:08 +02:00
crypto : : hash tx_id ; // stake output source tx id
uint64_t tx_out_index ; // stake output local index in its tx
2018-12-27 18:50:45 +03:00
//not for serialization
2022-09-23 18:45:22 +02:00
uint64_t wallet_index ; // transfer id index
2018-12-27 18:50:45 +03:00
BEGIN_KV_SERIALIZE_MAP ( )
KV_SERIALIZE ( amount )
2022-09-05 20:18:27 +02:00
KV_SERIALIZE ( g_index )
2019-07-24 19:14:35 +02:00
KV_SERIALIZE ( stake_unlock_time )
2018-12-27 18:50:45 +03:00
KV_SERIALIZE ( block_timestamp )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE ( keyimage )
2022-09-05 12:30:08 +02:00
KV_SERIALIZE ( tx_id )
KV_SERIALIZE ( tx_out_index )
2018-12-27 18:50:45 +03:00
END_KV_SERIALIZE_MAP ( )
} ;
2019-04-03 12:48:09 +03:00
2023-03-17 23:29:26 +01:00
bool operator = = ( const currency : : transaction & a , const currency : : transaction & b ) ;
bool operator = = ( const currency : : block & a , const currency : : block & b ) ;
bool operator = = ( const currency : : extra_attachment_info & a , const currency : : extra_attachment_info & b ) ;
bool operator = = ( const currency : : NLSAG_sig & a , const currency : : NLSAG_sig & b ) ;
bool operator = = ( const currency : : void_sig & a , const currency : : void_sig & b ) ;
bool operator = = ( const currency : : ZC_sig & a , const currency : : ZC_sig & b ) ;
bool operator = = ( const currency : : zarcanum_sig & a , const currency : : zarcanum_sig & b ) ;
bool operator = = ( const currency : : ref_by_id & a , const currency : : ref_by_id & b ) ;
2023-08-06 00:00:02 +02:00
// TODO: REPLACE all of the following operators to "bool operator==(..) const = default" once we moved to C++20 -- sowle
bool operator = = ( const currency : : signed_parts & a , const currency : : signed_parts & b ) ;
bool operator = = ( const currency : : txin_gen & a , const currency : : txin_gen & b ) ;
bool operator = = ( const currency : : txin_to_key & a , const currency : : txin_to_key & b ) ;
bool operator = = ( const currency : : txin_multisig & a , const currency : : txin_multisig & b ) ;
bool operator = = ( const currency : : txin_htlc & a , const currency : : txin_htlc & b ) ;
bool operator = = ( const currency : : txin_zc_input & a , const currency : : txin_zc_input & b ) ;
2019-04-03 12:48:09 +03:00
} // namespace currency
2018-12-27 18:50:45 +03:00
POD_MAKE_HASHABLE ( currency , account_public_address ) ;
2020-07-13 14:54:32 +03:00
POD_MAKE_HASHABLE ( currency , account_public_address_old ) ;
2018-12-27 18:50:45 +03:00
BLOB_SERIALIZER ( currency : : txout_to_key ) ;
# define SET_VARIANT_TAGS(type_name, id, json_tag) \
VARIANT_TAG ( binary_archive , type_name , id ) ; \
VARIANT_TAG ( json_archive , type_name , json_tag )
2024-10-18 00:26:30 +04:00
LOOP_BACK_BOOST_SERIALIZATION_VERSION ( currency : : asset_descriptor_operation ) ;
LOOP_BACK_BOOST_SERIALIZATION_VERSION ( currency : : asset_descriptor_base ) ;
LOOP_BACK_BOOST_SERIALIZATION_VERSION ( currency : : asset_operation_proof ) ;
LOOP_BACK_BOOST_SERIALIZATION_VERSION ( currency : : asset_operation_ownership_proof ) ;
LOOP_BACK_BOOST_SERIALIZATION_VERSION ( currency : : transaction ) ;
2023-09-01 11:59:23 +02:00
2018-12-27 18:50:45 +03:00
// txin_v variant currency
SET_VARIANT_TAGS ( currency : : txin_gen , 0 , " gen " ) ;
SET_VARIANT_TAGS ( currency : : txin_to_key , 1 , " key " ) ;
SET_VARIANT_TAGS ( currency : : txin_multisig , 2 , " multisig " ) ;
// txout_target_v variant definitions
SET_VARIANT_TAGS ( currency : : txout_to_key , 3 , " key " ) ;
SET_VARIANT_TAGS ( currency : : txout_multisig , 4 , " multisig " ) ;
SET_VARIANT_TAGS ( currency : : transaction , 5 , " tx " ) ;
SET_VARIANT_TAGS ( currency : : block , 6 , " block " ) ;
//attachment_v definitions
SET_VARIANT_TAGS ( currency : : tx_comment , 7 , " comment " ) ;
2020-04-27 14:52:31 +03:00
SET_VARIANT_TAGS ( currency : : tx_payer_old , 8 , " payer " ) ;
2018-12-27 18:50:45 +03:00
SET_VARIANT_TAGS ( std : : string , 9 , " string " ) ;
SET_VARIANT_TAGS ( currency : : tx_crypto_checksum , 10 , " checksum " ) ;
2019-09-27 17:16:18 +02:00
SET_VARIANT_TAGS ( currency : : tx_derivation_hint , 11 , " derivation_hint " ) ;
2018-12-27 18:50:45 +03:00
SET_VARIANT_TAGS ( currency : : tx_service_attachment , 12 , " attachment " ) ;
//SET_VARIANT_TAGS(currency::tx_onetime_secret_key, 13, "sec_key");
SET_VARIANT_TAGS ( currency : : etc_tx_details_unlock_time , 14 , " unlock_time " ) ;
SET_VARIANT_TAGS ( currency : : etc_tx_details_expiration_time , 15 , " expiration_time " ) ;
SET_VARIANT_TAGS ( currency : : etc_tx_details_flags , 16 , " flags " ) ;
//txin_etc_details_v definitions
SET_VARIANT_TAGS ( currency : : signed_parts , 17 , " signed_outs " ) ;
//extra_v definitions
SET_VARIANT_TAGS ( currency : : extra_attachment_info , 18 , " extra_attach_info " ) ;
SET_VARIANT_TAGS ( currency : : extra_user_data , 19 , " user_data " ) ;
2020-04-29 21:12:16 +03:00
SET_VARIANT_TAGS ( currency : : extra_alias_entry_old , 20 , " alias_entry " ) ;
2018-12-27 18:50:45 +03:00
SET_VARIANT_TAGS ( currency : : extra_padding , 21 , " extra_padding " ) ;
SET_VARIANT_TAGS ( crypto : : public_key , 22 , " pub_key " ) ;
2020-08-29 01:14:26 +02:00
SET_VARIANT_TAGS ( currency : : etc_tx_flags16_t , 23 , " etc_tx_flags16 " ) ;
2018-12-27 18:50:45 +03:00
SET_VARIANT_TAGS ( uint16_t , 24 , " derive_xor " ) ;
//txout_v
SET_VARIANT_TAGS ( currency : : ref_by_id , 25 , " ref_by_id " ) ;
SET_VARIANT_TAGS ( uint64_t , 26 , " uint64_t " ) ;
//etc
SET_VARIANT_TAGS ( currency : : etc_tx_time , 27 , " etc_tx_time " ) ;
SET_VARIANT_TAGS ( uint32_t , 28 , " uint32_t " ) ;
2020-04-29 21:12:16 +03:00
SET_VARIANT_TAGS ( currency : : tx_receiver_old , 29 , " payer " ) ; // -- original
//SET_VARIANT_TAGS(currency::tx_receiver_old, 29, "receiver");
2019-07-22 13:04:01 +02:00
SET_VARIANT_TAGS ( currency : : etc_tx_details_unlock_time2 , 30 , " unlock_time2 " ) ;
2018-12-27 18:50:45 +03:00
2020-04-29 21:12:16 +03:00
SET_VARIANT_TAGS ( currency : : tx_payer , 31 , " payer2 " ) ;
SET_VARIANT_TAGS ( currency : : tx_receiver , 32 , " receiver2 " ) ;
// @#@ TODO @#@
SET_VARIANT_TAGS ( currency : : extra_alias_entry , 33 , " alias_entry2 " ) ;
2020-12-29 23:42:37 +01:00
//htlc
2021-01-06 05:15:01 +01:00
SET_VARIANT_TAGS ( currency : : txin_htlc , 34 , " txin_htlc " ) ;
2020-12-29 23:42:37 +01:00
SET_VARIANT_TAGS ( currency : : txout_htlc , 35 , " txout_htlc " ) ;
2022-05-17 17:32:53 +02:00
SET_VARIANT_TAGS ( currency : : tx_out_bare , 36 , " tx_out_bare " ) ;
2022-05-09 17:29:25 +02:00
// Zarcanum
2022-08-03 14:00:39 +02:00
SET_VARIANT_TAGS ( currency : : txin_zc_input , 37 , " txin_zc_input " ) ;
2022-05-17 17:32:53 +02:00
SET_VARIANT_TAGS ( currency : : tx_out_zarcanum , 38 , " tx_out_zarcanum " ) ;
SET_VARIANT_TAGS ( currency : : zarcanum_tx_data_v1 , 39 , " zarcanum_tx_data_v1 " ) ;
SET_VARIANT_TAGS ( crypto : : bpp_signature_serialized , 40 , " bpp_signature_serialized " ) ;
SET_VARIANT_TAGS ( crypto : : bppe_signature_serialized , 41 , " bppe_signature_serialized " ) ;
2022-05-18 16:34:19 +02:00
SET_VARIANT_TAGS ( currency : : NLSAG_sig , 42 , " NLSAG_sig " ) ;
2022-07-22 05:39:54 +02:00
SET_VARIANT_TAGS ( currency : : ZC_sig , 43 , " ZC_sig " ) ;
2022-05-26 19:55:41 +02:00
SET_VARIANT_TAGS ( currency : : void_sig , 44 , " void_sig " ) ;
2022-10-12 19:17:00 +02:00
SET_VARIANT_TAGS ( currency : : zarcanum_sig , 45 , " zarcanum_sig " ) ;
2023-02-08 18:31:07 +01:00
SET_VARIANT_TAGS ( currency : : zc_asset_surjection_proof , 46 , " zc_asset_surjection_proof " ) ;
2023-02-01 21:58:26 +01:00
SET_VARIANT_TAGS ( currency : : zc_outs_range_proof , 47 , " zc_outs_range_proof " ) ;
SET_VARIANT_TAGS ( currency : : zc_balance_proof , 48 , " zc_balance_proof " ) ;
2022-05-17 17:32:53 +02:00
2023-02-01 21:58:26 +01:00
SET_VARIANT_TAGS ( currency : : asset_descriptor_operation , 49 , " asset_descriptor_base " ) ;
2023-02-21 01:51:55 +01:00
SET_VARIANT_TAGS ( currency : : asset_operation_proof , 50 , " asset_operation_proof " ) ;
2024-02-13 12:19:10 +01:00
SET_VARIANT_TAGS ( currency : : asset_operation_ownership_proof , 51 , " asset_operation_ownership_proof " ) ;
2024-07-18 00:14:03 +02:00
SET_VARIANT_TAGS ( currency : : asset_operation_ownership_proof_eth , 52 , " asset_operation_ownership_proof_eth " ) ;
SET_VARIANT_TAGS ( crypto : : eth_public_key , 60 , " eth_public_key " ) ;
2024-10-18 00:26:30 +04:00
//SET_VARIANT_TAGS(crypto::eth_signature, 61, "eth_signature");
SET_VARIANT_TAGS ( currency : : dummy , 62 , " dummy " ) ;
2022-09-26 21:57:24 +02:00
2020-04-29 21:12:16 +03:00
2018-12-27 18:50:45 +03:00
# undef SET_VARIANT_TAGS