From 57329f50c81ef99ec08ca037dd06ef6977688ea5 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Mon, 15 Jan 2024 10:56:08 +0800 Subject: [PATCH 01/14] added transaction index --- lib/ain-ocean/src/lib.rs | 6 ++++- lib/ain-ocean/src/model/transaction.rs | 2 ++ lib/ain-ocean/src/repository/transaction.rs | 26 +++++++++++++++++++ .../src/repository/transaction_vin.rs | 26 +++++++++++++++++++ .../src/repository/transaction_vout.rs | 26 +++++++++++++++++++ .../src/storage/columns/transaction.rs | 20 ++++++++++++-- .../src/storage/columns/transaction_vin.rs | 4 ++- .../src/storage/columns/transaction_vout.rs | 4 ++- 8 files changed, 109 insertions(+), 5 deletions(-) diff --git a/lib/ain-ocean/src/lib.rs b/lib/ain-ocean/src/lib.rs index 3bfd5c0aa0..d9922fcb9e 100644 --- a/lib/ain-ocean/src/lib.rs +++ b/lib/ain-ocean/src/lib.rs @@ -10,7 +10,7 @@ pub use indexer::{index_block, invalidate_block, tx_result, BlockV2Info}; use repository::{ AuctionHistoryByHeightRepository, AuctionHistoryRepository, BlockByHeightRepository, BlockRepository, MasternodeByHeightRepository, MasternodeRepository, MasternodeStatsRepository, - PoolSwapRepository, RawBlockRepository, TxResultRepository, + PoolSwapRepository, RawBlockRepository, TransactionRepository, TxResultRepository, }; pub mod api; mod model; @@ -59,6 +59,10 @@ pub struct Services { client: Arc, } +pub struct TransactionService { + by_id: TransactionRepository, +} + impl Services { fn new() -> Result { let datadir = ain_cpp_imports::get_datadir(); diff --git a/lib/ain-ocean/src/model/transaction.rs b/lib/ain-ocean/src/model/transaction.rs index f1573415d2..462e624840 100644 --- a/lib/ain-ocean/src/model/transaction.rs +++ b/lib/ain-ocean/src/model/transaction.rs @@ -1,7 +1,9 @@ +use bitcoin::Txid; use serde::{Deserialize, Serialize}; use super::BlockContext; +pub type TransactionId = String; #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct Transaction { diff --git a/lib/ain-ocean/src/repository/transaction.rs b/lib/ain-ocean/src/repository/transaction.rs index 8b13789179..a8f271694b 100644 --- a/lib/ain-ocean/src/repository/transaction.rs +++ b/lib/ain-ocean/src/repository/transaction.rs @@ -1 +1,27 @@ +use std::sync::Arc; +use ain_db::LedgerColumn; +use ain_macros::Repository; +use bitcoin::{BlockHash, Txid}; + +use super::RepositoryOps; +use crate::{ + model::Transaction, + storage::{columns, ocean_store::OceanStore}, + Result, +}; +#[derive(Repository)] +#[repository(K = "Txid", V = "Transaction")] +pub struct TransactionRepository { + pub store: Arc, + col: LedgerColumn, +} + +impl TransactionRepository { + pub fn new(store: Arc) -> Self { + Self { + col: store.column(), + store, + } + } +} diff --git a/lib/ain-ocean/src/repository/transaction_vin.rs b/lib/ain-ocean/src/repository/transaction_vin.rs index 8b13789179..f1731ef135 100644 --- a/lib/ain-ocean/src/repository/transaction_vin.rs +++ b/lib/ain-ocean/src/repository/transaction_vin.rs @@ -1 +1,27 @@ +use std::sync::Arc; +use ain_db::LedgerColumn; +use ain_macros::Repository; + +use super::RepositoryOps; +use crate::{ + model::TransactionVin, + storage::{columns, ocean_store::OceanStore}, + Result, +}; + +#[derive(Repository)] +#[repository(K = "String", V = "TransactionVin")] +pub struct TransactionVinRepository { + pub store: Arc, + col: LedgerColumn, +} + +impl TransactionVinRepository { + pub fn new(store: Arc) -> Self { + Self { + col: store.column(), + store, + } + } +} diff --git a/lib/ain-ocean/src/repository/transaction_vout.rs b/lib/ain-ocean/src/repository/transaction_vout.rs index 8b13789179..5a93096239 100644 --- a/lib/ain-ocean/src/repository/transaction_vout.rs +++ b/lib/ain-ocean/src/repository/transaction_vout.rs @@ -1 +1,27 @@ +use std::sync::Arc; +use ain_db::LedgerColumn; +use ain_macros::Repository; + +use super::RepositoryOps; +use crate::{ + model::TransactionVout, + storage::{columns, ocean_store::OceanStore}, + Result, +}; + +#[derive(Repository)] +#[repository(K = "String", V = "TransactionVout")] +pub struct TransactionVoutRepository { + pub store: Arc, + col: LedgerColumn, +} + +impl TransactionVoutRepository { + pub fn new(store: Arc) -> Self { + Self { + col: store.column(), + store, + } + } +} diff --git a/lib/ain-ocean/src/storage/columns/transaction.rs b/lib/ain-ocean/src/storage/columns/transaction.rs index 8c2052f21a..d3fefc4558 100644 --- a/lib/ain-ocean/src/storage/columns/transaction.rs +++ b/lib/ain-ocean/src/storage/columns/transaction.rs @@ -1,5 +1,7 @@ use ain_db::{Column, ColumnName, TypedColumn}; +use bitcoin::{BlockHash, Txid}; +use crate::model; #[derive(Debug)] pub struct Transaction; @@ -8,9 +10,23 @@ impl ColumnName for Transaction { } impl Column for Transaction { - type Index = String; + type Index = Txid; } impl TypedColumn for Transaction { - type Type = String; + type Type = model::Transaction; +} + +pub struct TransactionByBlockHash; + +impl ColumnName for TransactionByBlockHash { + const NAME: &'static str = "transaction_by_block_hash"; +} + +impl Column for TransactionByBlockHash { + type Index = BlockHash; +} + +impl TypedColumn for TransactionByBlockHash { + type Type = model::Transaction; } diff --git a/lib/ain-ocean/src/storage/columns/transaction_vin.rs b/lib/ain-ocean/src/storage/columns/transaction_vin.rs index a8149b1e5b..f8d6116a96 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vin.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vin.rs @@ -1,5 +1,7 @@ use ain_db::{Column, ColumnName, TypedColumn}; +use crate::model; + #[derive(Debug)] pub struct TransactionVin; @@ -12,5 +14,5 @@ impl Column for TransactionVin { } impl TypedColumn for TransactionVin { - type Type = String; + type Type = model::TransactionVin; } diff --git a/lib/ain-ocean/src/storage/columns/transaction_vout.rs b/lib/ain-ocean/src/storage/columns/transaction_vout.rs index 7de7b41c18..7f48f03705 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vout.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vout.rs @@ -1,4 +1,6 @@ use ain_db::{Column, ColumnName, TypedColumn}; + +use crate::model; #[derive(Debug)] pub struct TransactionVout; @@ -11,5 +13,5 @@ impl Column for TransactionVout { } impl TypedColumn for TransactionVout { - type Type = String; + type Type = model::TransactionVout; } From 5206887d9cee844a01d3ac411589aff81f65166e Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Mon, 15 Jan 2024 11:57:20 +0800 Subject: [PATCH 02/14] added transaction api implementation --- lib/ain-ocean/src/api/transactions.rs | 29 +++++++++++++++---- lib/ain-ocean/src/lib.rs | 10 ++++++- lib/ain-ocean/src/repository/transaction.rs | 2 +- .../src/storage/columns/transaction.rs | 2 +- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 9bb495fa30..321c3ae628 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -4,21 +4,38 @@ use axum::{extract::Path, routing::get, Router}; use defichain_rpc::{Client, RpcApi}; use serde::Deserialize; +use crate::{ + model::{Transaction, TransactionVin, TransactionVout}, + repository::RepositoryOps, + Result, SERVICES, +}; #[derive(Deserialize)] struct TransactionId { id: String, } -async fn get_transaction(Path(TransactionId { id }): Path) -> String { - format!("Details of transaction with id {}", id) +async fn get_transaction( + Path(TransactionId { id }): Path, +) -> Result>> { + format!("Details of transaction with id {}", id); + let transactions = SERVICES.transaction.by_id.get(&id)?; + Ok(Json(transactions)) } -async fn get_vins(Path(TransactionId { id }): Path) -> String { - format!("Vins for transaction with id {}", id) +async fn get_vins( + Path(TransactionId { id }): Path, +) -> Result>> { + format!("Vins for transaction with id {}", id); + let transaction_vin = SERVICES.transaction.vin_by_id.get(&id)?; + Ok(Json(transaction_vin)) } -async fn get_vouts(Path(TransactionId { id }): Path) -> String { - format!("Vouts for transaction with id {}", id) +async fn get_vouts( + Path(TransactionId { id }): Path, +) -> Result>> { + format!("Vouts for transaction with id {}", id); + let transaction_vout = SERVICES.transaction.vout_by_id.get(&id)?; + Ok(Json(transaction_vout)) } pub fn router(state: Arc) -> Router { diff --git a/lib/ain-ocean/src/lib.rs b/lib/ain-ocean/src/lib.rs index d9922fcb9e..57ec86294d 100644 --- a/lib/ain-ocean/src/lib.rs +++ b/lib/ain-ocean/src/lib.rs @@ -7,10 +7,12 @@ use std::{path::PathBuf, sync::Arc}; pub use api::ocean_router; use error::OceanError; pub use indexer::{index_block, invalidate_block, tx_result, BlockV2Info}; +use model::TransactionVin; use repository::{ AuctionHistoryByHeightRepository, AuctionHistoryRepository, BlockByHeightRepository, BlockRepository, MasternodeByHeightRepository, MasternodeRepository, MasternodeStatsRepository, - PoolSwapRepository, RawBlockRepository, TransactionRepository, TxResultRepository, + PoolSwapRepository, RawBlockRepository, TransactionRepository, TransactionVinRepository, + TransactionVoutRepository, TxResultRepository, }; pub mod api; mod model; @@ -50,6 +52,12 @@ pub struct PoolService { by_id: PoolSwapRepository, } +pub struct TransactionService { + by_id: TransactionRepository, + vin_by_id: TransactionVinRepository, + vout_by_id: TransactionVoutRepository, +} + pub struct Services { masternode: MasternodeService, block: BlockService, diff --git a/lib/ain-ocean/src/repository/transaction.rs b/lib/ain-ocean/src/repository/transaction.rs index a8f271694b..668d209440 100644 --- a/lib/ain-ocean/src/repository/transaction.rs +++ b/lib/ain-ocean/src/repository/transaction.rs @@ -11,7 +11,7 @@ use crate::{ Result, }; #[derive(Repository)] -#[repository(K = "Txid", V = "Transaction")] +#[repository(K = "String", V = "Transaction")] pub struct TransactionRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/storage/columns/transaction.rs b/lib/ain-ocean/src/storage/columns/transaction.rs index d3fefc4558..537036c53a 100644 --- a/lib/ain-ocean/src/storage/columns/transaction.rs +++ b/lib/ain-ocean/src/storage/columns/transaction.rs @@ -10,7 +10,7 @@ impl ColumnName for Transaction { } impl Column for Transaction { - type Index = Txid; + type Index = String; } impl TypedColumn for Transaction { From 374bcadb2d0129e9b2e33943cc0b4f7d060e8ab4 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Mon, 15 Jan 2024 11:59:13 +0800 Subject: [PATCH 03/14] fixed .cpp file formats --- src/dfi/consensus/poolpairs.cpp | 6 ++++-- src/dfi/govvariables/attributes.cpp | 4 ++-- src/dfi/govvariables/attributes.h | 4 ++-- src/dfi/mn_checks.cpp | 5 ++++- src/dfi/mn_checks.h | 4 +++- src/dfi/validation.cpp | 2 +- src/ffi/cxx.h | 24 ++++++++++++------------ 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/dfi/consensus/poolpairs.cpp b/src/dfi/consensus/poolpairs.cpp index 20e61750a0..cf36b10514 100644 --- a/src/dfi/consensus/poolpairs.cpp +++ b/src/dfi/consensus/poolpairs.cpp @@ -132,7 +132,8 @@ Res CPoolPairsConsensus::operator()(const CPoolSwapMessage &obj) const { const auto &tx = txCtx.GetTransaction(); auto &mnview = blockCtx.GetView(); - return CPoolSwap(obj, height, std::make_pair(CustomTxType::PoolSwap, tx.GetHash())).ExecuteSwap(mnview, {}, consensus); + return CPoolSwap(obj, height, std::make_pair(CustomTxType::PoolSwap, tx.GetHash())) + .ExecuteSwap(mnview, {}, consensus); } Res CPoolPairsConsensus::operator()(const CPoolSwapMessageV2 &obj) const { @@ -146,7 +147,8 @@ Res CPoolPairsConsensus::operator()(const CPoolSwapMessageV2 &obj) const { const auto &tx = txCtx.GetTransaction(); auto &mnview = blockCtx.GetView(); - return CPoolSwap(obj.swapInfo, height, std::make_pair(CustomTxType::PoolSwapV2, tx.GetHash())).ExecuteSwap(mnview, obj.poolIDs, consensus); + return CPoolSwap(obj.swapInfo, height, std::make_pair(CustomTxType::PoolSwapV2, tx.GetHash())) + .ExecuteSwap(mnview, obj.poolIDs, consensus); } Res CPoolPairsConsensus::operator()(const CLiquidityMessage &obj) const { diff --git a/src/dfi/govvariables/attributes.cpp b/src/dfi/govvariables/attributes.cpp index 6d177b4753..f21ee364b5 100644 --- a/src/dfi/govvariables/attributes.cpp +++ b/src/dfi/govvariables/attributes.cpp @@ -774,8 +774,8 @@ static inline void rtrim(std::string &s, unsigned char remove) { s.erase(std::find_if(s.rbegin(), s.rend(), [&remove](unsigned char ch) { return ch != remove; }).base(), s.end()); } -const std::map(const std::string &)>>> - &ATTRIBUTES::parseValue() { +const std::map(const std::string &)>>> & +ATTRIBUTES::parseValue() { static const std::map(const std::string &)>>> parsers{ {AttributeTypes::Token, diff --git a/src/dfi/govvariables/attributes.h b/src/dfi/govvariables/attributes.h index 2910c376bc..9fe4a8723c 100644 --- a/src/dfi/govvariables/attributes.h +++ b/src/dfi/govvariables/attributes.h @@ -590,8 +590,8 @@ class ATTRIBUTES : public GovVariable, public AutoRegistrator &allowedVaultIDs(); static const std::map &allowedRulesIDs(); static const std::map> &allowedKeys(); - static const std::map(const std::string &)>>> - &parseValue(); + static const std::map(const std::string &)>>> & + parseValue(); Res ProcessVariable(const std::string &key, const std::optional &value, diff --git a/src/dfi/mn_checks.cpp b/src/dfi/mn_checks.cpp index 55a05efa0e..a081ae4b8e 100644 --- a/src/dfi/mn_checks.cpp +++ b/src/dfi/mn_checks.cpp @@ -1160,7 +1160,10 @@ Res CPoolSwap::ExecuteSwap(CCustomCSView &view, if (txInfo) { const auto &[txType, txHash] = *txInfo; CrossBoundaryResult ffiResult; - ocean_try_set_tx_result(ffiResult, static_cast(txType), txHash.GetByteArray(), static_cast(reinterpret_cast(&finalSwapAmount))); + ocean_try_set_tx_result(ffiResult, + static_cast(txType), + txHash.GetByteArray(), + static_cast(reinterpret_cast(&finalSwapAmount))); } return Res::Ok(); diff --git a/src/dfi/mn_checks.h b/src/dfi/mn_checks.h index 41815b72a3..dc55ddb2ab 100644 --- a/src/dfi/mn_checks.h +++ b/src/dfi/mn_checks.h @@ -278,7 +278,9 @@ class CPoolSwap { public: std::vector> errors; - CPoolSwap(const CPoolSwapMessage &obj, const uint32_t height, const std::optional> txInfo = std::nullopt) + CPoolSwap(const CPoolSwapMessage &obj, + const uint32_t height, + const std::optional> txInfo = std::nullopt) : obj(obj), height(height), txInfo(txInfo) {} diff --git a/src/dfi/validation.cpp b/src/dfi/validation.cpp index a1137dce5b..37e6b0a32b 100644 --- a/src/dfi/validation.cpp +++ b/src/dfi/validation.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -21,7 +22,6 @@ #include #include #include -#include #include diff --git a/src/ffi/cxx.h b/src/ffi/cxx.h index 1fc163b2d8..b4a4bc7f30 100644 --- a/src/ffi/cxx.h +++ b/src/ffi/cxx.h @@ -55,8 +55,8 @@ namespace rust { static String lossy(const char16_t *) noexcept; static String lossy(const char16_t *, std::size_t) noexcept; - String &operator=(const String &) &noexcept; - String &operator=(String &&) &noexcept; + String &operator=(const String &) & noexcept; + String &operator=(String &&) & noexcept; explicit operator std::string() const; @@ -115,7 +115,7 @@ namespace rust { Str(const char *); Str(const char *, std::size_t); - Str &operator=(const Str &) &noexcept = default; + Str &operator=(const Str &) & noexcept = default; explicit operator std::string() const; @@ -163,8 +163,8 @@ namespace rust { struct copy_assignable_if { copy_assignable_if() noexcept = default; copy_assignable_if(const copy_assignable_if &) noexcept = default; - copy_assignable_if &operator=(const copy_assignable_if &) &noexcept = delete; - copy_assignable_if &operator=(copy_assignable_if &&) &noexcept = default; + copy_assignable_if &operator=(const copy_assignable_if &) & noexcept = delete; + copy_assignable_if &operator=(copy_assignable_if &&) & noexcept = default; }; } // namespace detail @@ -177,8 +177,8 @@ namespace rust { Slice() noexcept; Slice(T *, std::size_t count) noexcept; - Slice &operator=(const Slice &) &noexcept = default; - Slice &operator=(Slice &&) &noexcept = default; + Slice &operator=(const Slice &) & noexcept = default; + Slice &operator=(Slice &&) & noexcept = default; T *data() const noexcept; std::size_t size() const noexcept; @@ -265,7 +265,7 @@ namespace rust { explicit Box(const T &); explicit Box(T &&); - Box &operator=(Box &&) &noexcept; + Box &operator=(Box &&) & noexcept; const T *operator->() const noexcept; const T &operator*() const noexcept; @@ -310,7 +310,7 @@ namespace rust { Vec(Vec &&) noexcept; ~Vec() noexcept; - Vec &operator=(Vec &&) &noexcept; + Vec &operator=(Vec &&) & noexcept; Vec &operator=(const Vec &) &; std::size_t size() const noexcept; @@ -391,7 +391,7 @@ namespace rust { ~Error() noexcept override; Error &operator=(const Error &) &; - Error &operator=(Error &&) &noexcept; + Error &operator=(Error &&) & noexcept; const char *what() const noexcept override; @@ -758,7 +758,7 @@ namespace rust { } template - Box &Box::operator=(Box &&other) &noexcept { + Box &Box::operator=(Box &&other) & noexcept { if (this->ptr) { this->drop(); } @@ -849,7 +849,7 @@ namespace rust { } template - Vec &Vec::operator=(Vec &&other) &noexcept { + Vec &Vec::operator=(Vec &&other) & noexcept { this->drop(); this->repr = other.repr; new (&other) Vec(); From b3819f2d6ecfd12c02f07006f4bb9bb7fb5ba755 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Mon, 15 Jan 2024 16:20:05 +0800 Subject: [PATCH 04/14] fixed id to Txid --- lib/ain-ocean/src/api/transactions.rs | 8 +++----- lib/ain-ocean/src/repository/transaction.rs | 2 +- lib/ain-ocean/src/repository/transaction_vin.rs | 3 ++- lib/ain-ocean/src/repository/transaction_vout.rs | 3 ++- lib/ain-ocean/src/storage/columns/transaction.rs | 2 +- lib/ain-ocean/src/storage/columns/transaction_vin.rs | 3 ++- lib/ain-ocean/src/storage/columns/transaction_vout.rs | 3 ++- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 321c3ae628..18624d8ca9 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -1,7 +1,5 @@ -use std::sync::Arc; - -use axum::{extract::Path, routing::get, Router}; -use defichain_rpc::{Client, RpcApi}; +use axum::{extract::Path, routing::get, Json, Router}; +use bitcoin::Txid; use serde::Deserialize; use crate::{ @@ -11,7 +9,7 @@ use crate::{ }; #[derive(Deserialize)] struct TransactionId { - id: String, + id: Txid, } async fn get_transaction( diff --git a/lib/ain-ocean/src/repository/transaction.rs b/lib/ain-ocean/src/repository/transaction.rs index 668d209440..a8f271694b 100644 --- a/lib/ain-ocean/src/repository/transaction.rs +++ b/lib/ain-ocean/src/repository/transaction.rs @@ -11,7 +11,7 @@ use crate::{ Result, }; #[derive(Repository)] -#[repository(K = "String", V = "Transaction")] +#[repository(K = "Txid", V = "Transaction")] pub struct TransactionRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/repository/transaction_vin.rs b/lib/ain-ocean/src/repository/transaction_vin.rs index f1731ef135..7d2c2ff375 100644 --- a/lib/ain-ocean/src/repository/transaction_vin.rs +++ b/lib/ain-ocean/src/repository/transaction_vin.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use ain_db::LedgerColumn; use ain_macros::Repository; +use bitcoin::Txid; use super::RepositoryOps; use crate::{ @@ -11,7 +12,7 @@ use crate::{ }; #[derive(Repository)] -#[repository(K = "String", V = "TransactionVin")] +#[repository(K = "Txid", V = "TransactionVin")] pub struct TransactionVinRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/repository/transaction_vout.rs b/lib/ain-ocean/src/repository/transaction_vout.rs index 5a93096239..1bbd8cc6a2 100644 --- a/lib/ain-ocean/src/repository/transaction_vout.rs +++ b/lib/ain-ocean/src/repository/transaction_vout.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use ain_db::LedgerColumn; use ain_macros::Repository; +use bitcoin::Txid; use super::RepositoryOps; use crate::{ @@ -11,7 +12,7 @@ use crate::{ }; #[derive(Repository)] -#[repository(K = "String", V = "TransactionVout")] +#[repository(K = "Txid", V = "TransactionVout")] pub struct TransactionVoutRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/storage/columns/transaction.rs b/lib/ain-ocean/src/storage/columns/transaction.rs index 537036c53a..d3fefc4558 100644 --- a/lib/ain-ocean/src/storage/columns/transaction.rs +++ b/lib/ain-ocean/src/storage/columns/transaction.rs @@ -10,7 +10,7 @@ impl ColumnName for Transaction { } impl Column for Transaction { - type Index = String; + type Index = Txid; } impl TypedColumn for Transaction { diff --git a/lib/ain-ocean/src/storage/columns/transaction_vin.rs b/lib/ain-ocean/src/storage/columns/transaction_vin.rs index f8d6116a96..bbe2fa4b51 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vin.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vin.rs @@ -1,4 +1,5 @@ use ain_db::{Column, ColumnName, TypedColumn}; +use bitcoin::Txid; use crate::model; @@ -10,7 +11,7 @@ impl ColumnName for TransactionVin { } impl Column for TransactionVin { - type Index = String; + type Index = Txid; } impl TypedColumn for TransactionVin { diff --git a/lib/ain-ocean/src/storage/columns/transaction_vout.rs b/lib/ain-ocean/src/storage/columns/transaction_vout.rs index 7f48f03705..3af1bd48da 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vout.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vout.rs @@ -1,4 +1,5 @@ use ain_db::{Column, ColumnName, TypedColumn}; +use bitcoin::Txid; use crate::model; #[derive(Debug)] @@ -9,7 +10,7 @@ impl ColumnName for TransactionVout { } impl Column for TransactionVout { - type Index = String; + type Index = Txid; } impl TypedColumn for TransactionVout { From 3a5ebd1a01404608a5a814b1518f60965522c5bd Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Tue, 16 Jan 2024 16:59:55 +0800 Subject: [PATCH 05/14] added transction list method by block_hash --- lib/ain-ocean/src/api/transactions.rs | 39 +++++++++++++++++++-- lib/ain-ocean/src/indexer/mod.rs | 1 + lib/ain-ocean/src/indexer/transaction.rs | 22 ++++++++++++ lib/ain-ocean/src/lib.rs | 1 + lib/ain-ocean/src/repository/transaction.rs | 16 +++++++++ 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 lib/ain-ocean/src/indexer/transaction.rs diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 18624d8ca9..db93e490c8 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -1,17 +1,51 @@ -use axum::{extract::Path, routing::get, Json, Router}; +use axum::{ + extract::{Path, Query}, + routing::get, + Json, Router, +}; use bitcoin::Txid; use serde::Deserialize; use crate::{ - model::{Transaction, TransactionVin, TransactionVout}, + api_paged_response::ApiPagedResponse, + api_query::PaginationQuery, + model::{Block, Transaction, TransactionVin, TransactionVout}, repository::RepositoryOps, Result, SERVICES, }; + #[derive(Deserialize)] struct TransactionId { id: Txid, } +async fn list_transaction_by_block_hash( + Query(query): Query, +) -> Result>> { + let transaction_list = SERVICES + .transaction + .by_block_hash + .list(None)? + .take(query.size) + .map(|item| { + let (txid, id) = item?; + let b = SERVICES + .transaction + .by_id + .get(&txid)? + .ok_or("Missing block index")?; + + Ok(b) + }) + .collect::>>()?; + + Ok(Json(ApiPagedResponse::of( + transaction_list, + query.size, + |transaction_list| transaction_list.id.clone(), + ))) +} + async fn get_transaction( Path(TransactionId { id }): Path, ) -> Result>> { @@ -39,6 +73,7 @@ async fn get_vouts( pub fn router(state: Arc) -> Router { Router::new() .route("/:id", get(get_transaction)) + .route("/:block_hash", get(list_transaction_by_block_hash)) .route("/:id/vins", get(get_vins)) .route("/:id/vouts", get(get_vouts)) } diff --git a/lib/ain-ocean/src/indexer/mod.rs b/lib/ain-ocean/src/indexer/mod.rs index 6b336671ce..b3b93b56f6 100644 --- a/lib/ain-ocean/src/indexer/mod.rs +++ b/lib/ain-ocean/src/indexer/mod.rs @@ -2,6 +2,7 @@ mod auction; mod masternode; mod oracle; mod pool; +pub mod transaction; pub mod tx_result; use defichain_rpc::RpcApi; diff --git a/lib/ain-ocean/src/indexer/transaction.rs b/lib/ain-ocean/src/indexer/transaction.rs new file mode 100644 index 0000000000..5c3ff3c811 --- /dev/null +++ b/lib/ain-ocean/src/indexer/transaction.rs @@ -0,0 +1,22 @@ +use log::debug; + +use super::BlockContext; +use crate::{ + indexer::{Index, Result}, + model::Transaction, + repository::RepositoryOps, + SERVICES, +}; + +// impl Index for CreateTransaction { +// fn index(&self, ctx: &BlockContext, tx: Transaction, idx: usize) -> Result<()> { +// debug!("[CreateMasternode] Indexing..."); +// let txid = tx.txid(); +// SERVICES.transaction.by_id.put(&txid, &tx)?; +// } + +// fn invalidate(&self, ctx: &BlockContext, tx: Transaction, idx: usize) -> Result<()> { +// debug!("[CreateMasternode] Invalidating..."); +// SERVICES.transaction.by_id.delete(&tx.txid())?; +// } +// } diff --git a/lib/ain-ocean/src/lib.rs b/lib/ain-ocean/src/lib.rs index 57ec86294d..5c93d18263 100644 --- a/lib/ain-ocean/src/lib.rs +++ b/lib/ain-ocean/src/lib.rs @@ -54,6 +54,7 @@ pub struct PoolService { pub struct TransactionService { by_id: TransactionRepository, + by_block_hash: TransactionRepository, vin_by_id: TransactionVinRepository, vout_by_id: TransactionVoutRepository, } diff --git a/lib/ain-ocean/src/repository/transaction.rs b/lib/ain-ocean/src/repository/transaction.rs index a8f271694b..f0a6b18caa 100644 --- a/lib/ain-ocean/src/repository/transaction.rs +++ b/lib/ain-ocean/src/repository/transaction.rs @@ -25,3 +25,19 @@ impl TransactionRepository { } } } + +#[derive(Repository)] +#[repository(K = "BlockHash", V = "Transaction")] +pub struct TransactionBlockHashRepository { + pub store: Arc, + col: LedgerColumn, +} + +impl TransactionBlockHashRepository { + pub fn new(store: Arc) -> Self { + Self { + col: store.column(), + store, + } + } +} From 6d5fca3fb6a0e07a3c9190b32e17345790309979 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Tue, 16 Jan 2024 22:37:19 +0800 Subject: [PATCH 06/14] added transaction indexing --- lib/ain-ocean/src/api/transactions.rs | 8 +-- lib/ain-ocean/src/indexer/transaction.rs | 65 ++++++++++++++++++------ lib/ain-ocean/src/lib.rs | 17 ++++--- 3 files changed, 65 insertions(+), 25 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index db93e490c8..3ff50d5dd4 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -1,3 +1,5 @@ +use std::str::FromStr; + use axum::{ extract::{Path, Query}, routing::get, @@ -28,13 +30,13 @@ async fn list_transaction_by_block_hash( .list(None)? .take(query.size) .map(|item| { - let (txid, id) = item?; + let (_, trx) = item?; + let tx_id = Txid::from_str(&trx.txid)?; let b = SERVICES .transaction .by_id - .get(&txid)? + .get(&tx_id)? .ok_or("Missing block index")?; - Ok(b) }) .collect::>>()?; diff --git a/lib/ain-ocean/src/indexer/transaction.rs b/lib/ain-ocean/src/indexer/transaction.rs index 5c3ff3c811..c82846efd4 100644 --- a/lib/ain-ocean/src/indexer/transaction.rs +++ b/lib/ain-ocean/src/indexer/transaction.rs @@ -1,22 +1,57 @@ +use std::str::FromStr; + +use bitcoin::Txid; +use dftx_rs::Transaction; use log::debug; use super::BlockContext; use crate::{ - indexer::{Index, Result}, - model::Transaction, - repository::RepositoryOps, - SERVICES, + indexer::Result, model::Transaction as TrasnactionMapper, repository::RepositoryOps, SERVICES, }; -// impl Index for CreateTransaction { -// fn index(&self, ctx: &BlockContext, tx: Transaction, idx: usize) -> Result<()> { -// debug!("[CreateMasternode] Indexing..."); -// let txid = tx.txid(); -// SERVICES.transaction.by_id.put(&txid, &tx)?; -// } +pub struct TransactionIndex { + pub id: String, + pub order: i32, + pub block: BlockContext, + pub txid: String, + pub hash: String, + pub version: i32, + pub size: i32, + pub v_size: i32, + pub weight: i32, + pub total_vout_value: String, + pub lock_time: i32, + pub vin_count: i32, + pub vout_count: i32, +} + +pub fn index_transaction(ctx: &BlockContext, tx: TransactionIndex) -> Result<()> { + debug!("[CreateTransaction] Indexing..."); + let tx_id = Txid::from_str(&tx.txid)?; + let trx = TrasnactionMapper { + id: tx_id.to_string(), + order: tx.order, + block: ctx.clone(), + txid: tx.txid, + hash: ctx.hash.to_string(), + version: tx.version, + size: tx.size, + v_size: tx.v_size, + weight: tx.weight, + total_vout_value: tx.total_vout_value, + lock_time: tx.lock_time, + vin_count: tx.vin_count, + vout_count: tx.vout_count, + }; + SERVICES.transaction.by_id.put(&tx_id, &trx)?; + SERVICES.transaction.by_block_hash.put(&ctx.hash, &trx)?; + + Ok(()) +} -// fn invalidate(&self, ctx: &BlockContext, tx: Transaction, idx: usize) -> Result<()> { -// debug!("[CreateMasternode] Invalidating..."); -// SERVICES.transaction.by_id.delete(&tx.txid())?; -// } -// } +pub fn invalidate(ctx: &BlockContext, tx: Txid, idx: usize) -> Result<()> { + debug!("[CreateMasternode] Invalidating..."); + SERVICES.transaction.by_id.delete(&tx)?; + SERVICES.transaction.by_block_hash.delete(&ctx.hash)?; + Ok(()) +} diff --git a/lib/ain-ocean/src/lib.rs b/lib/ain-ocean/src/lib.rs index 5c93d18263..d18d500027 100644 --- a/lib/ain-ocean/src/lib.rs +++ b/lib/ain-ocean/src/lib.rs @@ -11,8 +11,8 @@ use model::TransactionVin; use repository::{ AuctionHistoryByHeightRepository, AuctionHistoryRepository, BlockByHeightRepository, BlockRepository, MasternodeByHeightRepository, MasternodeRepository, MasternodeStatsRepository, - PoolSwapRepository, RawBlockRepository, TransactionRepository, TransactionVinRepository, - TransactionVoutRepository, TxResultRepository, + PoolSwapRepository, RawBlockRepository, TransactionBlockHashRepository, TransactionRepository, + TransactionVinRepository, TransactionVoutRepository, TxResultRepository, }; pub mod api; mod model; @@ -54,7 +54,7 @@ pub struct PoolService { pub struct TransactionService { by_id: TransactionRepository, - by_block_hash: TransactionRepository, + by_block_hash: TransactionBlockHashRepository, vin_by_id: TransactionVinRepository, vout_by_id: TransactionVoutRepository, } @@ -66,10 +66,7 @@ pub struct Services { result: TxResultRepository, pool: PoolService, client: Arc, -} - -pub struct TransactionService { - by_id: TransactionRepository, + transaction: TransactionService, } impl Services { @@ -102,6 +99,12 @@ impl Services { pool: PoolService { by_id: PoolSwapRepository::new(Arc::clone(&store)), }, + transaction: TransactionService { + by_id: TransactionRepository::new(Arc::clone(&store)), + by_block_hash: TransactionBlockHashRepository::new(Arc::clone(&store)), + vin_by_id: TransactionVinRepository::new(Arc::clone(&store)), + vout_by_id: TransactionVoutRepository::new(Arc::clone(&store)), + }, client, }) } From cd9cb692564aa19f9335e267a1bba2b851df7ba5 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Thu, 18 Jan 2024 11:50:33 +0800 Subject: [PATCH 07/14] removed transaction by block_hash from trx module --- lib/ain-ocean/src/api/transactions.rs | 4 ++-- lib/ain-ocean/src/indexer/transaction.rs | 3 +-- lib/ain-ocean/src/lib.rs | 6 ++---- lib/ain-ocean/src/repository/transaction.rs | 16 ---------------- 4 files changed, 5 insertions(+), 24 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 3ff50d5dd4..61d017a197 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -26,7 +26,7 @@ async fn list_transaction_by_block_hash( ) -> Result>> { let transaction_list = SERVICES .transaction - .by_block_hash + .by_id .list(None)? .take(query.size) .map(|item| { @@ -75,7 +75,7 @@ async fn get_vouts( pub fn router(state: Arc) -> Router { Router::new() .route("/:id", get(get_transaction)) - .route("/:block_hash", get(list_transaction_by_block_hash)) + .route("/:tx_id", get(list_transaction_by_block_hash)) .route("/:id/vins", get(get_vins)) .route("/:id/vouts", get(get_vouts)) } diff --git a/lib/ain-ocean/src/indexer/transaction.rs b/lib/ain-ocean/src/indexer/transaction.rs index c82846efd4..0a02407155 100644 --- a/lib/ain-ocean/src/indexer/transaction.rs +++ b/lib/ain-ocean/src/indexer/transaction.rs @@ -44,7 +44,6 @@ pub fn index_transaction(ctx: &BlockContext, tx: TransactionIndex) -> Result<()> vout_count: tx.vout_count, }; SERVICES.transaction.by_id.put(&tx_id, &trx)?; - SERVICES.transaction.by_block_hash.put(&ctx.hash, &trx)?; Ok(()) } @@ -52,6 +51,6 @@ pub fn index_transaction(ctx: &BlockContext, tx: TransactionIndex) -> Result<()> pub fn invalidate(ctx: &BlockContext, tx: Txid, idx: usize) -> Result<()> { debug!("[CreateMasternode] Invalidating..."); SERVICES.transaction.by_id.delete(&tx)?; - SERVICES.transaction.by_block_hash.delete(&ctx.hash)?; + Ok(()) } diff --git a/lib/ain-ocean/src/lib.rs b/lib/ain-ocean/src/lib.rs index d18d500027..29f02ffe13 100644 --- a/lib/ain-ocean/src/lib.rs +++ b/lib/ain-ocean/src/lib.rs @@ -11,8 +11,8 @@ use model::TransactionVin; use repository::{ AuctionHistoryByHeightRepository, AuctionHistoryRepository, BlockByHeightRepository, BlockRepository, MasternodeByHeightRepository, MasternodeRepository, MasternodeStatsRepository, - PoolSwapRepository, RawBlockRepository, TransactionBlockHashRepository, TransactionRepository, - TransactionVinRepository, TransactionVoutRepository, TxResultRepository, + PoolSwapRepository, RawBlockRepository, TransactionRepository, TransactionVinRepository, + TransactionVoutRepository, TxResultRepository, }; pub mod api; mod model; @@ -54,7 +54,6 @@ pub struct PoolService { pub struct TransactionService { by_id: TransactionRepository, - by_block_hash: TransactionBlockHashRepository, vin_by_id: TransactionVinRepository, vout_by_id: TransactionVoutRepository, } @@ -101,7 +100,6 @@ impl Services { }, transaction: TransactionService { by_id: TransactionRepository::new(Arc::clone(&store)), - by_block_hash: TransactionBlockHashRepository::new(Arc::clone(&store)), vin_by_id: TransactionVinRepository::new(Arc::clone(&store)), vout_by_id: TransactionVoutRepository::new(Arc::clone(&store)), }, diff --git a/lib/ain-ocean/src/repository/transaction.rs b/lib/ain-ocean/src/repository/transaction.rs index f0a6b18caa..a8f271694b 100644 --- a/lib/ain-ocean/src/repository/transaction.rs +++ b/lib/ain-ocean/src/repository/transaction.rs @@ -25,19 +25,3 @@ impl TransactionRepository { } } } - -#[derive(Repository)] -#[repository(K = "BlockHash", V = "Transaction")] -pub struct TransactionBlockHashRepository { - pub store: Arc, - col: LedgerColumn, -} - -impl TransactionBlockHashRepository { - pub fn new(store: Arc) -> Self { - Self { - col: store.column(), - store, - } - } -} From 59b1a42348b6acacce032aae0193b4c860ec46b1 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Thu, 18 Jan 2024 11:56:51 +0800 Subject: [PATCH 08/14] update txid strong type --- lib/ain-ocean/src/api/transactions.rs | 9 +++------ lib/ain-ocean/src/indexer/transaction.rs | 5 ++--- lib/ain-ocean/src/model/transaction.rs | 3 +-- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 61d017a197..71592ee05b 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -1,5 +1,3 @@ -use std::str::FromStr; - use axum::{ extract::{Path, Query}, routing::get, @@ -11,7 +9,7 @@ use serde::Deserialize; use crate::{ api_paged_response::ApiPagedResponse, api_query::PaginationQuery, - model::{Block, Transaction, TransactionVin, TransactionVout}, + model::{Transaction, TransactionVin, TransactionVout}, repository::RepositoryOps, Result, SERVICES, }; @@ -31,11 +29,10 @@ async fn list_transaction_by_block_hash( .take(query.size) .map(|item| { let (_, trx) = item?; - let tx_id = Txid::from_str(&trx.txid)?; let b = SERVICES .transaction .by_id - .get(&tx_id)? + .get(&trx.id)? .ok_or("Missing block index")?; Ok(b) }) @@ -44,7 +41,7 @@ async fn list_transaction_by_block_hash( Ok(Json(ApiPagedResponse::of( transaction_list, query.size, - |transaction_list| transaction_list.id.clone(), + |transaction_list| transaction_list.id.to_string(), ))) } diff --git a/lib/ain-ocean/src/indexer/transaction.rs b/lib/ain-ocean/src/indexer/transaction.rs index 0a02407155..2c4ec3eb42 100644 --- a/lib/ain-ocean/src/indexer/transaction.rs +++ b/lib/ain-ocean/src/indexer/transaction.rs @@ -10,7 +10,7 @@ use crate::{ }; pub struct TransactionIndex { - pub id: String, + pub id: Txid, pub order: i32, pub block: BlockContext, pub txid: String, @@ -29,7 +29,7 @@ pub fn index_transaction(ctx: &BlockContext, tx: TransactionIndex) -> Result<()> debug!("[CreateTransaction] Indexing..."); let tx_id = Txid::from_str(&tx.txid)?; let trx = TrasnactionMapper { - id: tx_id.to_string(), + id: tx_id, order: tx.order, block: ctx.clone(), txid: tx.txid, @@ -51,6 +51,5 @@ pub fn index_transaction(ctx: &BlockContext, tx: TransactionIndex) -> Result<()> pub fn invalidate(ctx: &BlockContext, tx: Txid, idx: usize) -> Result<()> { debug!("[CreateMasternode] Invalidating..."); SERVICES.transaction.by_id.delete(&tx)?; - Ok(()) } diff --git a/lib/ain-ocean/src/model/transaction.rs b/lib/ain-ocean/src/model/transaction.rs index 462e624840..f4ba120703 100644 --- a/lib/ain-ocean/src/model/transaction.rs +++ b/lib/ain-ocean/src/model/transaction.rs @@ -3,11 +3,10 @@ use serde::{Deserialize, Serialize}; use super::BlockContext; -pub type TransactionId = String; #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] pub struct Transaction { - pub id: String, + pub id: Txid, pub order: i32, pub block: BlockContext, pub txid: String, From d3804ceb94d783723ae38e0259e4b4bec58dd9dc Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Thu, 18 Jan 2024 16:45:53 +0800 Subject: [PATCH 09/14] removed method list_trasnction_txid --- lib/ain-ocean/src/api/transactions.rs | 35 +-------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 71592ee05b..9e3afb9a0a 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -1,14 +1,8 @@ -use axum::{ - extract::{Path, Query}, - routing::get, - Json, Router, -}; +use axum::{extract::Path, routing::get, Json, Router}; use bitcoin::Txid; use serde::Deserialize; use crate::{ - api_paged_response::ApiPagedResponse, - api_query::PaginationQuery, model::{Transaction, TransactionVin, TransactionVout}, repository::RepositoryOps, Result, SERVICES, @@ -19,32 +13,6 @@ struct TransactionId { id: Txid, } -async fn list_transaction_by_block_hash( - Query(query): Query, -) -> Result>> { - let transaction_list = SERVICES - .transaction - .by_id - .list(None)? - .take(query.size) - .map(|item| { - let (_, trx) = item?; - let b = SERVICES - .transaction - .by_id - .get(&trx.id)? - .ok_or("Missing block index")?; - Ok(b) - }) - .collect::>>()?; - - Ok(Json(ApiPagedResponse::of( - transaction_list, - query.size, - |transaction_list| transaction_list.id.to_string(), - ))) -} - async fn get_transaction( Path(TransactionId { id }): Path, ) -> Result>> { @@ -72,7 +40,6 @@ async fn get_vouts( pub fn router(state: Arc) -> Router { Router::new() .route("/:id", get(get_transaction)) - .route("/:tx_id", get(list_transaction_by_block_hash)) .route("/:id/vins", get(get_vins)) .route("/:id/vouts", get(get_vouts)) } From 2cfe15359c28cd31a35cf72f9e26a538005b1f37 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Fri, 19 Jan 2024 16:09:46 +0800 Subject: [PATCH 10/14] added vin and vout index in transaction with query --- lib/ain-ocean/src/api/transactions.rs | 68 +++++++++-- lib/ain-ocean/src/indexer/transaction.rs | 111 ++++++++++++------ lib/ain-ocean/src/lib.rs | 6 +- .../src/repository/transaction_vin.rs | 2 +- .../src/repository/transaction_vout.rs | 2 +- .../src/storage/columns/transaction_vin.rs | 2 +- .../src/storage/columns/transaction_vout.rs | 2 +- 7 files changed, 144 insertions(+), 49 deletions(-) diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index 9e3afb9a0a..cfda7a2535 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -1,8 +1,14 @@ -use axum::{extract::Path, routing::get, Json, Router}; +use axum::{ + extract::{Path, Query}, + routing::get, + Json, Router, +}; use bitcoin::Txid; use serde::Deserialize; use crate::{ + api_paged_response::ApiPagedResponse, + api_query::PaginationQuery, model::{Transaction, TransactionVin, TransactionVout}, repository::RepositoryOps, Result, SERVICES, @@ -21,20 +27,60 @@ async fn get_transaction( Ok(Json(transactions)) } +//get list of vout transaction, by passing id which contains txhash + vout_idx async fn get_vins( - Path(TransactionId { id }): Path, -) -> Result>> { - format!("Vins for transaction with id {}", id); - let transaction_vin = SERVICES.transaction.vin_by_id.get(&id)?; - Ok(Json(transaction_vin)) + Query(query): Query, +) -> Result>> { + let transaction_list = SERVICES + .transaction + .vin_by_id + .list(None)? + .take(query.size) + .map(|item| { + let (txid, id) = item?; + let b = SERVICES + .transaction + .vin_by_id + .get(&txid)? + .ok_or("Missing block index")?; + + Ok(b) + }) + .collect::>>()?; + + Ok(Json(ApiPagedResponse::of( + transaction_list, + query.size, + |transaction_list| transaction_list.id.clone(), + ))) } +//get list of vout transaction, by passing id which contains txhash + vout_idx async fn get_vouts( - Path(TransactionId { id }): Path, -) -> Result>> { - format!("Vouts for transaction with id {}", id); - let transaction_vout = SERVICES.transaction.vout_by_id.get(&id)?; - Ok(Json(transaction_vout)) + Query(query): Query, +) -> Result>> { + let transaction_list = SERVICES + .transaction + .vout_by_id + .list(None)? + .take(query.size) + .map(|item| { + let (txid, id) = item?; + let b = SERVICES + .transaction + .vout_by_id + .get(&txid)? + .ok_or("Missing block index")?; + + Ok(b) + }) + .collect::>>()?; + + Ok(Json(ApiPagedResponse::of( + transaction_list, + query.size, + |transaction_list| transaction_list.id.clone(), + ))) } pub fn router(state: Arc) -> Router { diff --git a/lib/ain-ocean/src/indexer/transaction.rs b/lib/ain-ocean/src/indexer/transaction.rs index 2c4ec3eb42..1ba60e4997 100644 --- a/lib/ain-ocean/src/indexer/transaction.rs +++ b/lib/ain-ocean/src/indexer/transaction.rs @@ -1,54 +1,99 @@ -use std::str::FromStr; - -use bitcoin::Txid; +use bitcoin::{blockdata::locktime::absolute::LockTime, Txid}; use dftx_rs::Transaction; use log::debug; use super::BlockContext; use crate::{ - indexer::Result, model::Transaction as TrasnactionMapper, repository::RepositoryOps, SERVICES, + indexer::Result, + model::{ + Transaction as TrasnactionMapper, TransactionVin, TransactionVinScript, TransactionVinVout, + TransactionVinVoutScript, TransactionVout, TransactionVoutScript, + }, + repository::RepositoryOps, + SERVICES, }; -pub struct TransactionIndex { - pub id: Txid, - pub order: i32, - pub block: BlockContext, - pub txid: String, - pub hash: String, - pub version: i32, - pub size: i32, - pub v_size: i32, - pub weight: i32, - pub total_vout_value: String, - pub lock_time: i32, - pub vin_count: i32, - pub vout_count: i32, -} - -pub fn index_transaction(ctx: &BlockContext, tx: TransactionIndex) -> Result<()> { +pub fn index_transactions(ctx: &BlockContext, tx: Transaction) -> Result<()> { debug!("[CreateTransaction] Indexing..."); - let tx_id = Txid::from_str(&tx.txid)?; + let tx_id = tx.txid(); + + let lock_time_as_i32 = match tx.lock_time { + LockTime::Blocks(value) => value.to_consensus_u32(), + LockTime::Seconds(value) => value.to_consensus_u32(), + }; + let total_vout_value: u64 = tx.output.iter().map(|output| output.value.to_sat()).sum(); + let weight = tx.weight(); + let weight_i32 = weight.to_vbytes_ceil() as i32; + let trx = TrasnactionMapper { id: tx_id, - order: tx.order, + order: 0, block: ctx.clone(), - txid: tx.txid, + txid: tx_id.to_string(), hash: ctx.hash.to_string(), - version: tx.version, - size: tx.size, - v_size: tx.v_size, - weight: tx.weight, - total_vout_value: tx.total_vout_value, - lock_time: tx.lock_time, - vin_count: tx.vin_count, - vout_count: tx.vout_count, + version: tx.version.0, + size: tx.total_size() as i32, + v_size: tx.vsize() as i32, + weight: weight_i32, + total_vout_value: total_vout_value.to_string(), + lock_time: lock_time_as_i32 as i32, + vin_count: tx.input.len() as i32, + vout_count: tx.output.len() as i32, }; + // Index transaction SERVICES.transaction.by_id.put(&tx_id, &trx)?; + // Index transaction vin + for (vin_idx, vin) in tx.input.iter().enumerate() { + let trx_vin = TransactionVin { + id: format!("{}-{}", tx_id, vin_idx), + txid: tx_id.to_string(), + coinbase: vin.script_sig.to_string(), + vout: TransactionVinVout { + id: format!("{}-{}-vout", tx_id, vin_idx), + txid: tx_id.to_string(), + n: vin.previous_output.vout as i32, + value: "0".to_string(), + token_id: 0, + script: TransactionVinVoutScript { + hex: vin.script_sig.to_string(), + }, + }, + script: TransactionVinScript { + hex: vin.script_sig.to_string(), + }, + tx_in_witness: vec![], + sequence: vin.sequence.to_string(), + }; + + SERVICES + .transaction + .vin_by_id + .put(&tx_id.to_string(), &trx_vin)?; + } + // Index transaction vout + for (vout_idx, vout) in tx.output.iter().enumerate() { + let trx_vout = TransactionVout { + id: format!("{}-{}", tx_id, vout_idx), + txid: tx_id.to_string(), + n: vout_idx as i32, + value: vout.value.to_string(), + token_id: 0, + script: TransactionVoutScript { + hex: vout.script_pubkey.to_string(), + r#type: "pubkey".to_string(), + }, + }; + SERVICES + .transaction + .vout_by_id + .put(&tx_id.to_string(), &trx_vout)?; + // .put(&format!("{}-{}", tx_id, vout_idx), &trx_vout)?; //need + } Ok(()) } -pub fn invalidate(ctx: &BlockContext, tx: Txid, idx: usize) -> Result<()> { +pub fn invalidate_transaction(ctx: &BlockContext, tx: Txid, idx: usize) -> Result<()> { debug!("[CreateMasternode] Invalidating..."); SERVICES.transaction.by_id.delete(&tx)?; Ok(()) diff --git a/lib/ain-ocean/src/lib.rs b/lib/ain-ocean/src/lib.rs index 29f02ffe13..f0852aef32 100644 --- a/lib/ain-ocean/src/lib.rs +++ b/lib/ain-ocean/src/lib.rs @@ -6,7 +6,11 @@ use std::{path::PathBuf, sync::Arc}; pub use api::ocean_router; use error::OceanError; -pub use indexer::{index_block, invalidate_block, tx_result, BlockV2Info}; +pub use indexer::{ + index_block, invalidate_block, + transaction::{index_transactions, invalidate_transaction}, + tx_result, BlockV2Info, +}; use model::TransactionVin; use repository::{ AuctionHistoryByHeightRepository, AuctionHistoryRepository, BlockByHeightRepository, diff --git a/lib/ain-ocean/src/repository/transaction_vin.rs b/lib/ain-ocean/src/repository/transaction_vin.rs index 7d2c2ff375..f710b69ac3 100644 --- a/lib/ain-ocean/src/repository/transaction_vin.rs +++ b/lib/ain-ocean/src/repository/transaction_vin.rs @@ -12,7 +12,7 @@ use crate::{ }; #[derive(Repository)] -#[repository(K = "Txid", V = "TransactionVin")] +#[repository(K = "String", V = "TransactionVin")] pub struct TransactionVinRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/repository/transaction_vout.rs b/lib/ain-ocean/src/repository/transaction_vout.rs index 1bbd8cc6a2..d1eb720531 100644 --- a/lib/ain-ocean/src/repository/transaction_vout.rs +++ b/lib/ain-ocean/src/repository/transaction_vout.rs @@ -12,7 +12,7 @@ use crate::{ }; #[derive(Repository)] -#[repository(K = "Txid", V = "TransactionVout")] +#[repository(K = "String", V = "TransactionVout")] pub struct TransactionVoutRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/storage/columns/transaction_vin.rs b/lib/ain-ocean/src/storage/columns/transaction_vin.rs index bbe2fa4b51..fbcc0c5ca3 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vin.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vin.rs @@ -11,7 +11,7 @@ impl ColumnName for TransactionVin { } impl Column for TransactionVin { - type Index = Txid; + type Index = String; } impl TypedColumn for TransactionVin { diff --git a/lib/ain-ocean/src/storage/columns/transaction_vout.rs b/lib/ain-ocean/src/storage/columns/transaction_vout.rs index 3af1bd48da..3bfea20eb7 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vout.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vout.rs @@ -10,7 +10,7 @@ impl ColumnName for TransactionVout { } impl Column for TransactionVout { - type Index = Txid; + type Index = String; } impl TypedColumn for TransactionVout { From cc2dc0e7dc373171c1a1bad4f40abf912a5ced4d Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Mon, 22 Jan 2024 09:27:24 +0800 Subject: [PATCH 11/14] updated vin and vout table as Txid --- lib/ain-ocean/src/indexer/transaction.rs | 14 ++++---------- lib/ain-ocean/src/repository/transaction_vin.rs | 2 +- lib/ain-ocean/src/repository/transaction_vout.rs | 2 +- .../src/storage/columns/transaction_vin.rs | 2 +- .../src/storage/columns/transaction_vout.rs | 2 +- 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/lib/ain-ocean/src/indexer/transaction.rs b/lib/ain-ocean/src/indexer/transaction.rs index 1ba60e4997..95301caf7b 100644 --- a/lib/ain-ocean/src/indexer/transaction.rs +++ b/lib/ain-ocean/src/indexer/transaction.rs @@ -1,5 +1,5 @@ use bitcoin::{blockdata::locktime::absolute::LockTime, Txid}; -use dftx_rs::Transaction; +use dftx_rs::{Block, Transaction}; use log::debug; use super::BlockContext; @@ -42,7 +42,7 @@ pub fn index_transactions(ctx: &BlockContext, tx: Transaction) -> Result<()> { }; // Index transaction SERVICES.transaction.by_id.put(&tx_id, &trx)?; - // Index transaction vin + // Indexing transaction vin for (vin_idx, vin) in tx.input.iter().enumerate() { let trx_vin = TransactionVin { id: format!("{}-{}", tx_id, vin_idx), @@ -65,10 +65,7 @@ pub fn index_transactions(ctx: &BlockContext, tx: Transaction) -> Result<()> { sequence: vin.sequence.to_string(), }; - SERVICES - .transaction - .vin_by_id - .put(&tx_id.to_string(), &trx_vin)?; + SERVICES.transaction.vin_by_id.put(&tx_id, &trx_vin)?; } // Index transaction vout for (vout_idx, vout) in tx.output.iter().enumerate() { @@ -83,10 +80,7 @@ pub fn index_transactions(ctx: &BlockContext, tx: Transaction) -> Result<()> { r#type: "pubkey".to_string(), }, }; - SERVICES - .transaction - .vout_by_id - .put(&tx_id.to_string(), &trx_vout)?; + SERVICES.transaction.vout_by_id.put(&tx_id, &trx_vout)?; // .put(&format!("{}-{}", tx_id, vout_idx), &trx_vout)?; //need } diff --git a/lib/ain-ocean/src/repository/transaction_vin.rs b/lib/ain-ocean/src/repository/transaction_vin.rs index f710b69ac3..7d2c2ff375 100644 --- a/lib/ain-ocean/src/repository/transaction_vin.rs +++ b/lib/ain-ocean/src/repository/transaction_vin.rs @@ -12,7 +12,7 @@ use crate::{ }; #[derive(Repository)] -#[repository(K = "String", V = "TransactionVin")] +#[repository(K = "Txid", V = "TransactionVin")] pub struct TransactionVinRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/repository/transaction_vout.rs b/lib/ain-ocean/src/repository/transaction_vout.rs index d1eb720531..1bbd8cc6a2 100644 --- a/lib/ain-ocean/src/repository/transaction_vout.rs +++ b/lib/ain-ocean/src/repository/transaction_vout.rs @@ -12,7 +12,7 @@ use crate::{ }; #[derive(Repository)] -#[repository(K = "String", V = "TransactionVout")] +#[repository(K = "Txid", V = "TransactionVout")] pub struct TransactionVoutRepository { pub store: Arc, col: LedgerColumn, diff --git a/lib/ain-ocean/src/storage/columns/transaction_vin.rs b/lib/ain-ocean/src/storage/columns/transaction_vin.rs index fbcc0c5ca3..bbe2fa4b51 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vin.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vin.rs @@ -11,7 +11,7 @@ impl ColumnName for TransactionVin { } impl Column for TransactionVin { - type Index = String; + type Index = Txid; } impl TypedColumn for TransactionVin { diff --git a/lib/ain-ocean/src/storage/columns/transaction_vout.rs b/lib/ain-ocean/src/storage/columns/transaction_vout.rs index 3bfea20eb7..3af1bd48da 100644 --- a/lib/ain-ocean/src/storage/columns/transaction_vout.rs +++ b/lib/ain-ocean/src/storage/columns/transaction_vout.rs @@ -10,7 +10,7 @@ impl ColumnName for TransactionVout { } impl Column for TransactionVout { - type Index = String; + type Index = Txid; } impl TypedColumn for TransactionVout { From 2882de582e0799d99a4fc4f4a45f29a0c2816900 Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Thu, 25 Jan 2024 17:08:43 +0800 Subject: [PATCH 12/14] fixed conflicts in transaction branch --- lib/ain-ocean/src/api/response.rs | 4 +++- lib/ain-ocean/src/api/transactions.rs | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ain-ocean/src/api/response.rs b/lib/ain-ocean/src/api/response.rs index 4b9c244450..83cbcd35c2 100644 --- a/lib/ain-ocean/src/api/response.rs +++ b/lib/ain-ocean/src/api/response.rs @@ -128,7 +128,9 @@ mod tests { fn should_next_with_value() { let items: Vec = vec![Item::new("0", "a"), Item::new("1", "b")]; - let next = ApiPagedResponse::next(items, Some("b")).page.next; + let next = ApiPagedResponse::next(items, Some("b".to_string())) + .page + .next; assert_eq!(next, Some("b".into())); } diff --git a/lib/ain-ocean/src/api/transactions.rs b/lib/ain-ocean/src/api/transactions.rs index cfda7a2535..ef2784ea89 100644 --- a/lib/ain-ocean/src/api/transactions.rs +++ b/lib/ain-ocean/src/api/transactions.rs @@ -27,7 +27,6 @@ async fn get_transaction( Ok(Json(transactions)) } -//get list of vout transaction, by passing id which contains txhash + vout_idx async fn get_vins( Query(query): Query, ) -> Result>> { From 8a987198e80e756543931cdff284f65c9ab46f3d Mon Sep 17 00:00:00 2001 From: nagarajm22 Date: Thu, 25 Jan 2024 17:19:47 +0800 Subject: [PATCH 13/14] fixed fmt --- src/dfi/validation.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dfi/validation.cpp b/src/dfi/validation.cpp index 37e6b0a32b..1e5d651edf 100644 --- a/src/dfi/validation.cpp +++ b/src/dfi/validation.cpp @@ -2810,8 +2810,8 @@ Res ProcessDeFiEventFallible(const CBlock &block, info.size_stripped = GetSerializeSize(block, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS); info.weight = GetBlockWeight(block); info.stake_modifier = pindex->stakeModifier.ToString(); - info.minter = ""; // mn operator address - info.masternode = ""; // mn owner address + info.minter = ""; // mn operator address + info.masternode = ""; // mn owner address // minter info CKeyID minter; @@ -2822,7 +2822,8 @@ Res ProcessDeFiEventFallible(const CBlock &block, info.masternode = id->ToString(); auto mn = mnview.GetMasternode(*id); if (mn) { - auto dest = mn->operatorType == 1 ? CTxDestination(PKHash(minter)) : CTxDestination(WitnessV0KeyHash(minter)); + auto dest = + mn->operatorType == 1 ? CTxDestination(PKHash(minter)) : CTxDestination(WitnessV0KeyHash(minter)); info.minter = EncodeDestination(dest); } } From c254facb9cb9d8bc967195d7a7c7cd562db1a570 Mon Sep 17 00:00:00 2001 From: jouzo Date: Thu, 25 Jan 2024 12:01:02 +0100 Subject: [PATCH 14/14] Restore cpp fmt --- src/dfi/consensus/poolpairs.cpp | 6 ++---- src/dfi/govvariables/attributes.cpp | 4 ++-- src/dfi/govvariables/attributes.h | 4 ++-- src/dfi/mn_checks.cpp | 5 +---- src/dfi/mn_checks.h | 4 +--- src/dfi/validation.cpp | 9 ++++----- src/ffi/cxx.h | 24 ++++++++++++------------ 7 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/dfi/consensus/poolpairs.cpp b/src/dfi/consensus/poolpairs.cpp index cf36b10514..20e61750a0 100644 --- a/src/dfi/consensus/poolpairs.cpp +++ b/src/dfi/consensus/poolpairs.cpp @@ -132,8 +132,7 @@ Res CPoolPairsConsensus::operator()(const CPoolSwapMessage &obj) const { const auto &tx = txCtx.GetTransaction(); auto &mnview = blockCtx.GetView(); - return CPoolSwap(obj, height, std::make_pair(CustomTxType::PoolSwap, tx.GetHash())) - .ExecuteSwap(mnview, {}, consensus); + return CPoolSwap(obj, height, std::make_pair(CustomTxType::PoolSwap, tx.GetHash())).ExecuteSwap(mnview, {}, consensus); } Res CPoolPairsConsensus::operator()(const CPoolSwapMessageV2 &obj) const { @@ -147,8 +146,7 @@ Res CPoolPairsConsensus::operator()(const CPoolSwapMessageV2 &obj) const { const auto &tx = txCtx.GetTransaction(); auto &mnview = blockCtx.GetView(); - return CPoolSwap(obj.swapInfo, height, std::make_pair(CustomTxType::PoolSwapV2, tx.GetHash())) - .ExecuteSwap(mnview, obj.poolIDs, consensus); + return CPoolSwap(obj.swapInfo, height, std::make_pair(CustomTxType::PoolSwapV2, tx.GetHash())).ExecuteSwap(mnview, obj.poolIDs, consensus); } Res CPoolPairsConsensus::operator()(const CLiquidityMessage &obj) const { diff --git a/src/dfi/govvariables/attributes.cpp b/src/dfi/govvariables/attributes.cpp index f21ee364b5..6d177b4753 100644 --- a/src/dfi/govvariables/attributes.cpp +++ b/src/dfi/govvariables/attributes.cpp @@ -774,8 +774,8 @@ static inline void rtrim(std::string &s, unsigned char remove) { s.erase(std::find_if(s.rbegin(), s.rend(), [&remove](unsigned char ch) { return ch != remove; }).base(), s.end()); } -const std::map(const std::string &)>>> & -ATTRIBUTES::parseValue() { +const std::map(const std::string &)>>> + &ATTRIBUTES::parseValue() { static const std::map(const std::string &)>>> parsers{ {AttributeTypes::Token, diff --git a/src/dfi/govvariables/attributes.h b/src/dfi/govvariables/attributes.h index 9fe4a8723c..2910c376bc 100644 --- a/src/dfi/govvariables/attributes.h +++ b/src/dfi/govvariables/attributes.h @@ -590,8 +590,8 @@ class ATTRIBUTES : public GovVariable, public AutoRegistrator &allowedVaultIDs(); static const std::map &allowedRulesIDs(); static const std::map> &allowedKeys(); - static const std::map(const std::string &)>>> & - parseValue(); + static const std::map(const std::string &)>>> + &parseValue(); Res ProcessVariable(const std::string &key, const std::optional &value, diff --git a/src/dfi/mn_checks.cpp b/src/dfi/mn_checks.cpp index a081ae4b8e..55a05efa0e 100644 --- a/src/dfi/mn_checks.cpp +++ b/src/dfi/mn_checks.cpp @@ -1160,10 +1160,7 @@ Res CPoolSwap::ExecuteSwap(CCustomCSView &view, if (txInfo) { const auto &[txType, txHash] = *txInfo; CrossBoundaryResult ffiResult; - ocean_try_set_tx_result(ffiResult, - static_cast(txType), - txHash.GetByteArray(), - static_cast(reinterpret_cast(&finalSwapAmount))); + ocean_try_set_tx_result(ffiResult, static_cast(txType), txHash.GetByteArray(), static_cast(reinterpret_cast(&finalSwapAmount))); } return Res::Ok(); diff --git a/src/dfi/mn_checks.h b/src/dfi/mn_checks.h index dc55ddb2ab..41815b72a3 100644 --- a/src/dfi/mn_checks.h +++ b/src/dfi/mn_checks.h @@ -278,9 +278,7 @@ class CPoolSwap { public: std::vector> errors; - CPoolSwap(const CPoolSwapMessage &obj, - const uint32_t height, - const std::optional> txInfo = std::nullopt) + CPoolSwap(const CPoolSwapMessage &obj, const uint32_t height, const std::optional> txInfo = std::nullopt) : obj(obj), height(height), txInfo(txInfo) {} diff --git a/src/dfi/validation.cpp b/src/dfi/validation.cpp index 1e5d651edf..a1137dce5b 100644 --- a/src/dfi/validation.cpp +++ b/src/dfi/validation.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -22,6 +21,7 @@ #include #include #include +#include #include @@ -2810,8 +2810,8 @@ Res ProcessDeFiEventFallible(const CBlock &block, info.size_stripped = GetSerializeSize(block, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS); info.weight = GetBlockWeight(block); info.stake_modifier = pindex->stakeModifier.ToString(); - info.minter = ""; // mn operator address - info.masternode = ""; // mn owner address + info.minter = ""; // mn operator address + info.masternode = ""; // mn owner address // minter info CKeyID minter; @@ -2822,8 +2822,7 @@ Res ProcessDeFiEventFallible(const CBlock &block, info.masternode = id->ToString(); auto mn = mnview.GetMasternode(*id); if (mn) { - auto dest = - mn->operatorType == 1 ? CTxDestination(PKHash(minter)) : CTxDestination(WitnessV0KeyHash(minter)); + auto dest = mn->operatorType == 1 ? CTxDestination(PKHash(minter)) : CTxDestination(WitnessV0KeyHash(minter)); info.minter = EncodeDestination(dest); } } diff --git a/src/ffi/cxx.h b/src/ffi/cxx.h index b4a4bc7f30..1fc163b2d8 100644 --- a/src/ffi/cxx.h +++ b/src/ffi/cxx.h @@ -55,8 +55,8 @@ namespace rust { static String lossy(const char16_t *) noexcept; static String lossy(const char16_t *, std::size_t) noexcept; - String &operator=(const String &) & noexcept; - String &operator=(String &&) & noexcept; + String &operator=(const String &) &noexcept; + String &operator=(String &&) &noexcept; explicit operator std::string() const; @@ -115,7 +115,7 @@ namespace rust { Str(const char *); Str(const char *, std::size_t); - Str &operator=(const Str &) & noexcept = default; + Str &operator=(const Str &) &noexcept = default; explicit operator std::string() const; @@ -163,8 +163,8 @@ namespace rust { struct copy_assignable_if { copy_assignable_if() noexcept = default; copy_assignable_if(const copy_assignable_if &) noexcept = default; - copy_assignable_if &operator=(const copy_assignable_if &) & noexcept = delete; - copy_assignable_if &operator=(copy_assignable_if &&) & noexcept = default; + copy_assignable_if &operator=(const copy_assignable_if &) &noexcept = delete; + copy_assignable_if &operator=(copy_assignable_if &&) &noexcept = default; }; } // namespace detail @@ -177,8 +177,8 @@ namespace rust { Slice() noexcept; Slice(T *, std::size_t count) noexcept; - Slice &operator=(const Slice &) & noexcept = default; - Slice &operator=(Slice &&) & noexcept = default; + Slice &operator=(const Slice &) &noexcept = default; + Slice &operator=(Slice &&) &noexcept = default; T *data() const noexcept; std::size_t size() const noexcept; @@ -265,7 +265,7 @@ namespace rust { explicit Box(const T &); explicit Box(T &&); - Box &operator=(Box &&) & noexcept; + Box &operator=(Box &&) &noexcept; const T *operator->() const noexcept; const T &operator*() const noexcept; @@ -310,7 +310,7 @@ namespace rust { Vec(Vec &&) noexcept; ~Vec() noexcept; - Vec &operator=(Vec &&) & noexcept; + Vec &operator=(Vec &&) &noexcept; Vec &operator=(const Vec &) &; std::size_t size() const noexcept; @@ -391,7 +391,7 @@ namespace rust { ~Error() noexcept override; Error &operator=(const Error &) &; - Error &operator=(Error &&) & noexcept; + Error &operator=(Error &&) &noexcept; const char *what() const noexcept override; @@ -758,7 +758,7 @@ namespace rust { } template - Box &Box::operator=(Box &&other) & noexcept { + Box &Box::operator=(Box &&other) &noexcept { if (this->ptr) { this->drop(); } @@ -849,7 +849,7 @@ namespace rust { } template - Vec &Vec::operator=(Vec &&other) & noexcept { + Vec &Vec::operator=(Vec &&other) &noexcept { this->drop(); this->repr = other.repr; new (&other) Vec();