Просмотр исходного кода

contract/money/entrypoint: always check both local and global dbs for outputs regardless if call supports it for consistency

skoupidi 2 месяцев назад
Родитель
Сommit
a9100a34ba

+ 4 - 7
src/contract/money/src/entrypoint/fee_v1.rs

@@ -165,13 +165,10 @@ pub(crate) fn money_fee_process_instruction_v1(
     }
 
     // The new coin should not exist
-    if params.output.tx_local {
-        if db_contains_key_local(coins_db_local, &serialize(&params.output.coin))? {
-            msg!("[FeeV1] Error: Duplicate tx-local coin found");
-            return Err(MoneyError::DuplicateCoin.into())
-        }
-    } else if db_contains_key(coins_db, &serialize(&params.output.coin))? {
-        msg!("[FeeV1] Error: Duplicate on-chain coin found");
+    let coin_ser = serialize(&params.output.coin);
+    if db_contains_key(coins_db, &coin_ser)? || db_contains_key_local(coins_db_local, &coin_ser)? {
+        let coin_type = if params.output.tx_local { "tx-local" } else { "on-chain" };
+        msg!("[FeeV1] Error: Duplicate {} coin found", coin_type);
         return Err(MoneyError::DuplicateCoin.into())
     }
 

+ 5 - 1
src/contract/money/src/entrypoint/pow_reward_v1.rs

@@ -145,9 +145,13 @@ pub(crate) fn money_pow_reward_process_instruction_v1(
     // Access the necessary databases where there is information to
     // validate this state transition.
     let coins_db = wasm::db::db_lookup(cid, MONEY_CONTRACT_COINS_TREE)?;
+    let coins_db_local = wasm::db::db_lookup_local(cid, MONEY_CONTRACT_COINS_TREE)?;
 
     // Check that the coin from the output hasn't existed before.
-    if wasm::db::db_contains_key(coins_db, &serialize(&params.output.coin))? {
+    let coin_ser = serialize(&params.output.coin);
+    if wasm::db::db_contains_key(coins_db, &coin_ser)? ||
+        wasm::db::db_contains_key_local(coins_db_local, &coin_ser)?
+    {
         msg!("[PoWRewardV1] Error: Duplicate coin in output");
         return Err(MoneyError::DuplicateCoin.into())
     }

+ 5 - 1
src/contract/money/src/entrypoint/token_mint_v1.rs

@@ -93,8 +93,12 @@ pub(crate) fn money_token_mint_process_instruction_v1(
 
     // Check that the coin from the output hasn't existed before
     let coins_db = wasm::db::db_lookup(cid, MONEY_CONTRACT_COINS_TREE)?;
+    let coins_db_local = wasm::db::db_lookup_local(cid, MONEY_CONTRACT_COINS_TREE)?;
 
-    if wasm::db::db_contains_key(coins_db, &serialize(&params.coin))? {
+    let coin_ser = serialize(&params.coin);
+    if wasm::db::db_contains_key(coins_db, &coin_ser)? ||
+        wasm::db::db_contains_key_local(coins_db_local, &coin_ser)?
+    {
         msg!("[TokenMintV1] Error: Duplicate coin in output");
         return Err(MoneyError::DuplicateCoin.into())
     }