Skip to content

Commit

Permalink
update multi_index in wasm NftTransferHistoryTable and PRIMARY KEY in…
Browse files Browse the repository at this point in the history
… sql transfer history
  • Loading branch information
laruh committed Sep 3, 2024
1 parent 7ca140a commit 51eb543
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 22 deletions.
7 changes: 6 additions & 1 deletion mm2src/coins/nft/nft_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,12 @@ cross_test!(test_add_get_transfers, {
.clone();
assert_eq!(transfer1.block_number, 28056721);
let transfer2 = storage
.get_transfer_by_tx_hash_and_log_index(&chain, TX_HASH.to_string(), LOG_INDEX)
.get_transfer_by_tx_hash_log_index_token_id(
&chain,
TX_HASH.to_string(),
LOG_INDEX,
BigUint::from_str("214300047253").unwrap(),
)
.await
.unwrap()
.unwrap();
Expand Down
8 changes: 4 additions & 4 deletions mm2src/coins/nft/storage/db_test_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ pub(crate) fn nft_transfer_history() -> Vec<NftTransferHistory> {
transaction_index: Some(198),
log_index: 495,
value: Default::default(),
transaction_type: Some("Single".to_string()),
transaction_type: Some("Batch".to_string()),
token_address: Address::from_str("0xfd913a305d70a60aac4faac70c739563738e1f81").unwrap(),
from_address: Address::from_str("0x6fad0ec6bb76914b2a2a800686acc22970645820").unwrap(),
to_address: Address::from_str("0xf622a6c52c94b500542e2ae6bcad24c53bc5b6a2").unwrap(),
Expand All @@ -284,15 +284,15 @@ pub(crate) fn nft_transfer_history() -> Vec<NftTransferHistory> {
confirmations: 0,
};

// Same as transfer1 but with different log_index, meaning that transfer1 and transfer2 are part of one batch/multi token transaction
// Same as transfer1 (identical tx hash and log index) but with different token_id, meaning that transfer1 and transfer2 are part of one batch/multi token transaction
let transfer2 = NftTransferHistory {
common: NftTransferCommon {
block_hash: Some("0x3d68b78391fb3cf8570df27036214f7e9a5a6a45d309197936f51d826041bfe7".to_string()),
transaction_hash: "0x1e9f04e9b571b283bde02c98c2a97da39b2bb665b57c1f2b0b733f9b681debbe".to_string(),
transaction_index: Some(198),
log_index: 496,
log_index: 495,
value: Default::default(),
transaction_type: Some("Single".to_string()),
transaction_type: Some("Batch".to_string()),
token_address: Address::from_str("0xfd913a305d70a60aac4faac70c739563738e1f81").unwrap(),
from_address: Address::from_str("0x6fad0ec6bb76914b2a2a800686acc22970645820").unwrap(),
to_address: Address::from_str("0xf622a6c52c94b500542e2ae6bcad24c53bc5b6a2").unwrap(),
Expand Down
3 changes: 2 additions & 1 deletion mm2src/coins/nft/storage/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,12 @@ pub trait NftTransferHistoryStorageOps {
token_id: BigUint,
) -> MmResult<Vec<NftTransferHistory>, Self::Error>;

async fn get_transfer_by_tx_hash_and_log_index(
async fn get_transfer_by_tx_hash_log_index_token_id(
&self,
chain: &Chain,
transaction_hash: String,
log_index: u32,
token_id: BigUint,
) -> MmResult<Option<NftTransferHistory>, Self::Error>;

/// Updates the metadata for NFT transfers identified by their token address and ID.
Expand Down
9 changes: 5 additions & 4 deletions mm2src/coins/nft/storage/sql_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ fn create_transfer_history_table_sql(chain: &Chain) -> Result<String, SqlError>
image_domain TEXT,
token_name TEXT,
details_json TEXT,
PRIMARY KEY (transaction_hash, log_index)
PRIMARY KEY (transaction_hash, log_index, token_id)
);",
safe_table_name.inner()
);
Expand Down Expand Up @@ -1121,22 +1121,23 @@ impl NftTransferHistoryStorageOps for AsyncMutexGuard<'_, AsyncConnection> {
.map_to_mm(AsyncConnError::from)
}

async fn get_transfer_by_tx_hash_and_log_index(
async fn get_transfer_by_tx_hash_log_index_token_id(
&self,
chain: &Chain,
transaction_hash: String,
log_index: u32,
token_id: BigUint,
) -> MmResult<Option<NftTransferHistory>, Self::Error> {
let table_name = chain.transfer_history_table_name()?;
let sql = format!(
"SELECT * FROM {} WHERE transaction_hash=?1 AND log_index = ?2",
"SELECT * FROM {} WHERE transaction_hash=?1 AND log_index = ?2 AND token_id = ?3",
table_name.inner()
);
self.call(move |conn| {
let transfer = query_single_row(
conn,
&sql,
[transaction_hash, log_index.to_string()],
[transaction_hash, log_index.to_string(), token_id.to_string()],
transfer_history_from_row,
)?;
Ok(transfer)
Expand Down
29 changes: 17 additions & 12 deletions mm2src/coins/nft/storage/wasm/wasm_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -547,18 +547,20 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> {
.collect()
}

async fn get_transfer_by_tx_hash_and_log_index(
async fn get_transfer_by_tx_hash_log_index_token_id(
&self,
chain: &Chain,
transaction_hash: String,
log_index: u32,
token_id: BigUint,
) -> MmResult<Option<NftTransferHistory>, Self::Error> {
let db_transaction = self.get_inner().transaction().await?;
let table = db_transaction.table::<NftTransferHistoryTable>().await?;
let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_INDEX)
let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX)
.with_value(chain.to_string())?
.with_value(&transaction_hash)?
.with_value(log_index)?;
.with_value(log_index)?
.with_value(BeBigUint::from(token_id))?;

if let Some((_item_id, item)) = table.get_item_by_unique_multi_index(index_keys).await? {
Ok(Some(transfer_details_from_item(item)?))
Expand Down Expand Up @@ -602,10 +604,11 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> {
}
drop_mutability!(transfer);

let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_INDEX)
let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX)
.with_value(&chain_str)?
.with_value(&transfer.common.transaction_hash)?
.with_value(transfer.common.log_index)?;
.with_value(transfer.common.log_index)?
.with_value(BeBigUint::from(transfer.token_id.clone()))?;

let item = NftTransferHistoryTable::from_transfer_history(&transfer)?;
table.replace_item_by_unique_multi_index(index_keys, &item).await?;
Expand Down Expand Up @@ -691,10 +694,11 @@ impl NftTransferHistoryStorageOps for NftCacheIDBLocked<'_> {
transfer.common.possible_spam = possible_spam;
drop_mutability!(transfer);

let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_INDEX)
let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX)
.with_value(&chain_str)?
.with_value(&transfer.common.transaction_hash)?
.with_value(transfer.common.log_index)?;
.with_value(transfer.common.log_index)?
.with_value(BeBigUint::from(transfer.token_id.clone()))?;

let item = NftTransferHistoryTable::from_transfer_history(&transfer)?;
table.replace_item_by_unique_multi_index(index_keys, &item).await?;
Expand Down Expand Up @@ -777,10 +781,11 @@ async fn update_transfer_phishing_for_index(
transfer.possible_phishing = possible_phishing;
drop_mutability!(transfer);
let transfer_item = NftTransferHistoryTable::from_transfer_history(&transfer)?;
let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_INDEX)
let index_keys = MultiIndex::new(NftTransferHistoryTable::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX)
.with_value(chain)?
.with_value(&transfer.common.transaction_hash)?
.with_value(transfer.common.log_index)?;
.with_value(transfer.common.log_index)?
.with_value(BeBigUint::from(transfer.token_id))?;
table
.replace_item_by_unique_multi_index(index_keys, &transfer_item)
.await?;
Expand Down Expand Up @@ -951,7 +956,7 @@ pub(crate) struct NftTransferHistoryTable {
}

impl NftTransferHistoryTable {
const CHAIN_TX_HASH_LOG_INDEX_INDEX: &str = "chain_tx_hash_log_index_index";
const CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX: &str = "chain_tx_hash_log_index_token_idindex";

fn from_transfer_history(transfer: &NftTransferHistory) -> WasmNftCacheResult<NftTransferHistoryTable> {
let details_json =
Expand Down Expand Up @@ -992,8 +997,8 @@ impl TableSignature for NftTransferHistoryTable {
false,
)?;
table.create_multi_index(
Self::CHAIN_TX_HASH_LOG_INDEX_INDEX,
&["chain", "transaction_hash", "log_index"],
Self::CHAIN_TX_HASH_LOG_INDEX_TOKEN_ID_INDEX,
&["chain", "transaction_hash", "log_index", "token_id"],
true,
)?;
table.create_multi_index(CHAIN_BLOCK_NUMBER_INDEX, &["chain", "block_number"], false)?;
Expand Down

0 comments on commit 51eb543

Please sign in to comment.