Skip to content

Commit c008a99

Browse files
authored
Merge pull request #1709 from mintlayer/feat/atomic_swaps_basics
Atomic swaps support in chainstate
2 parents 5d31d9d + 80c76cc commit c008a99

File tree

89 files changed

+2073
-327
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+2073
-327
lines changed

api-server/scanner-lib/src/blockchain_state/mod.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,8 @@ async fn update_tables_from_block_reward<T: ApiServerStorageWrite>(
395395
| TxOutput::DataDeposit(_)
396396
| TxOutput::DelegateStaking(_, _)
397397
| TxOutput::IssueFungibleToken(_)
398-
| TxOutput::IssueNft(_, _, _) => {}
398+
| TxOutput::IssueNft(_, _, _)
399+
| TxOutput::Htlc(_, _) => {}
399400
TxOutput::ProduceBlockFromStake(_, _) => {
400401
set_utxo(
401402
outpoint,
@@ -569,7 +570,8 @@ async fn calculate_fees<T: ApiServerStorageWrite>(
569570
| TxOutput::DataDeposit(_)
570571
| TxOutput::DelegateStaking(_, _)
571572
| TxOutput::CreateDelegationId(_, _)
572-
| TxOutput::ProduceBlockFromStake(_, _) => None,
573+
| TxOutput::ProduceBlockFromStake(_, _)
574+
| TxOutput::Htlc(_, _) => None,
573575
})
574576
})
575577
.collect();
@@ -601,7 +603,8 @@ async fn calculate_fees<T: ApiServerStorageWrite>(
601603
| TxOutput::DelegateStaking(_, _)
602604
| TxOutput::CreateDelegationId(_, _)
603605
| TxOutput::IssueFungibleToken(_)
604-
| TxOutput::ProduceBlockFromStake(_, _) => None,
606+
| TxOutput::ProduceBlockFromStake(_, _)
607+
| TxOutput::Htlc(_, _) => None,
605608
},
606609
TxInput::Account(_) => None,
607610
TxInput::AccountCommand(_, cmd) => match cmd {
@@ -726,7 +729,8 @@ async fn prefetch_pool_amounts<T: ApiServerStorageWrite>(
726729
| TxOutput::CreateDelegationId(_, _)
727730
| TxOutput::DelegateStaking(_, _)
728731
| TxOutput::IssueNft(_, _, _)
729-
| TxOutput::IssueFungibleToken(_),
732+
| TxOutput::IssueFungibleToken(_)
733+
| TxOutput::Htlc(_, _),
730734
) => {}
731735
None => {}
732736
}
@@ -1103,7 +1107,8 @@ async fn update_tables_from_transaction_inputs<T: ApiServerStorageWrite>(
11031107
| TxOutput::DataDeposit(_)
11041108
| TxOutput::CreateDelegationId(_, _)
11051109
| TxOutput::DelegateStaking(_, _)
1106-
| TxOutput::IssueFungibleToken(_) => {}
1110+
| TxOutput::IssueFungibleToken(_)
1111+
| TxOutput::Htlc(_, _) => {}
11071112
TxOutput::CreateStakePool(pool_id, _)
11081113
| TxOutput::ProduceBlockFromStake(_, pool_id) => {
11091114
let pool_data = db_tx
@@ -1196,6 +1201,7 @@ async fn update_tables_from_transaction_inputs<T: ApiServerStorageWrite>(
11961201
)
11971202
.await;
11981203
}
1204+
TxOutput::Htlc(_, _) => {} // TODO(HTLC)
11991205
TxOutput::LockThenTransfer(output_value, destination, _)
12001206
| TxOutput::Transfer(output_value, destination) => {
12011207
let address = Address::<Destination>::new(&chain_config, destination)
@@ -1610,6 +1616,7 @@ async fn update_tables_from_transaction_outputs<T: ApiServerStorageWrite>(
16101616
.expect("Unable to set locked utxo");
16111617
}
16121618
}
1619+
TxOutput::Htlc(_, _) => {} // TODO(HTLC)
16131620
}
16141621
}
16151622

@@ -1809,5 +1816,6 @@ fn get_tx_output_destination(txo: &TxOutput) -> Option<&Destination> {
18091816
| TxOutput::Burn(_)
18101817
| TxOutput::DelegateStaking(_, _)
18111818
| TxOutput::DataDeposit(_) => None,
1819+
TxOutput::Htlc(_, _) => None, // TODO(HTLC)
18121820
}
18131821
}

api-server/scanner-lib/src/sync/tests/simulation.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ async fn simulation(
236236
let mut block_builder = tf.make_pos_block_builder().with_random_staking_pool(&mut rng);
237237

238238
for _ in 0..rng.gen_range(10..max_tx_per_block) {
239-
block_builder = block_builder.add_test_transaction(&mut rng);
239+
block_builder = block_builder.add_test_transaction(&mut rng, false);
240240
}
241241

242242
let block = block_builder.build(&mut rng);
@@ -259,7 +259,8 @@ async fn simulation(
259259
| TxOutput::CreateDelegationId(_, _)
260260
| TxOutput::IssueFungibleToken(_)
261261
| TxOutput::ProduceBlockFromStake(_, _)
262-
| TxOutput::IssueNft(_, _, _) => None,
262+
| TxOutput::IssueNft(_, _, _)
263+
| TxOutput::Htlc(_, _) => None,
263264
});
264265
staking_pools.extend(new_pools);
265266

@@ -277,7 +278,8 @@ async fn simulation(
277278
| TxOutput::DelegateStaking(_, _)
278279
| TxOutput::IssueFungibleToken(_)
279280
| TxOutput::ProduceBlockFromStake(_, _)
280-
| TxOutput::IssueNft(_, _, _) => None,
281+
| TxOutput::IssueNft(_, _, _)
282+
| TxOutput::Htlc(_, _) => None,
281283
});
282284
delegations.extend(new_delegations);
283285

@@ -292,7 +294,8 @@ async fn simulation(
292294
| TxOutput::DataDeposit(_)
293295
| TxOutput::DelegateStaking(_, _)
294296
| TxOutput::CreateDelegationId(_, _)
295-
| TxOutput::ProduceBlockFromStake(_, _) => None,
297+
| TxOutput::ProduceBlockFromStake(_, _)
298+
| TxOutput::Htlc(_, _) => None,
296299
});
297300
token_ids.extend(new_tokens);
298301

@@ -335,7 +338,8 @@ async fn simulation(
335338
| TxOutput::CreateDelegationId(_, _)
336339
| TxOutput::Transfer(_, _)
337340
| TxOutput::LockThenTransfer(_, _, _)
338-
| TxOutput::ProduceBlockFromStake(_, _) => {}
341+
| TxOutput::ProduceBlockFromStake(_, _)
342+
| TxOutput::Htlc(_, _) => {}
339343
});
340344

341345
tx.inputs().iter().for_each(|inp| match inp {

api-server/web-server/src/api/json_helpers.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,18 @@ pub fn txoutput_to_json(
185185
"destination": Address::new(chain_config, dest.clone()).expect("no error").as_str(),
186186
})
187187
}
188+
TxOutput::Htlc(value, htlc) => {
189+
json!({
190+
"type": "Htlc",
191+
"value": outputvalue_to_json(value, chain_config, token_decimals),
192+
"htlc": {
193+
"secret_hash": to_json_string(htlc.secret_hash.as_bytes()),
194+
"spend_key": Address::new(chain_config, htlc.spend_key.clone()).expect("no error").as_str(),
195+
"refund_timelock": htlc.refund_timelock,
196+
"refund_key": Address::new(chain_config, htlc.refund_key.clone()).expect("no error").as_str(),
197+
},
198+
})
199+
}
188200
}
189201
}
190202

chainstate/constraints-value-accumulator/src/constraints_accumulator.rs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ impl ConstrainedValueAccumulator {
133133
StakerBalanceGetterFn: Fn(PoolId) -> Result<Option<Amount>, Error>,
134134
{
135135
match input_utxo {
136-
TxOutput::Transfer(value, _) | TxOutput::LockThenTransfer(value, _, _) => {
136+
TxOutput::Transfer(value, _)
137+
| TxOutput::LockThenTransfer(value, _, _)
138+
| TxOutput::Htlc(value, _) => {
137139
match value {
138140
OutputValue::Coin(amount) => insert_or_increase(
139141
&mut self.unconstrained_value,
@@ -269,19 +271,21 @@ impl ConstrainedValueAccumulator {
269271

270272
for output in outputs {
271273
match output {
272-
TxOutput::Transfer(value, _) | TxOutput::Burn(value) => match value {
273-
OutputValue::Coin(amount) => insert_or_increase(
274-
&mut accumulator.unconstrained_value,
275-
CoinOrTokenId::Coin,
276-
*amount,
277-
)?,
278-
OutputValue::TokenV0(_) => { /* ignore */ }
279-
OutputValue::TokenV1(token_id, amount) => insert_or_increase(
280-
&mut accumulator.unconstrained_value,
281-
CoinOrTokenId::TokenId(*token_id),
282-
*amount,
283-
)?,
284-
},
274+
TxOutput::Transfer(value, _) | TxOutput::Burn(value) | TxOutput::Htlc(value, _) => {
275+
match value {
276+
OutputValue::Coin(amount) => insert_or_increase(
277+
&mut accumulator.unconstrained_value,
278+
CoinOrTokenId::Coin,
279+
*amount,
280+
)?,
281+
OutputValue::TokenV0(_) => { /* ignore */ }
282+
OutputValue::TokenV1(token_id, amount) => insert_or_increase(
283+
&mut accumulator.unconstrained_value,
284+
CoinOrTokenId::TokenId(*token_id),
285+
*amount,
286+
)?,
287+
}
288+
}
285289
TxOutput::DelegateStaking(coins, _) => insert_or_increase(
286290
&mut accumulator.unconstrained_value,
287291
CoinOrTokenId::Coin,

chainstate/src/detail/ban_score.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ impl BanScore for mintscript::translate::TranslationError {
171171
| Self::DelegationNotFound(_)
172172
| Self::TokenNotFound(_) => 100,
173173

174+
Self::SignatureError(_) => 100,
174175
Self::PoSAccounting(e) => e.ban_score(),
175176
Self::TokensAccounting(e) => e.ban_score(),
176177
}
@@ -351,6 +352,7 @@ impl BanScore for CheckTransactionError {
351352
CheckTransactionError::DataDepositMaxSizeExceeded(_, _, _) => 100,
352353
CheckTransactionError::TxSizeTooLarge(_, _, _) => 100,
353354
CheckTransactionError::DeprecatedTokenOperationVersion(_, _) => 100,
355+
CheckTransactionError::HtlcsAreNotActivated => 100,
354356
}
355357
}
356358
}

chainstate/src/detail/chainstateref/epoch_seal.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ where
174174
| TxOutput::DelegateStaking(_, _)
175175
| TxOutput::IssueFungibleToken(_)
176176
| TxOutput::IssueNft(_, _, _)
177-
| TxOutput::DataDeposit(_) => {
177+
| TxOutput::DataDeposit(_)
178+
| TxOutput::Htlc(_, _) => {
178179
return Err(EpochSealError::SpendStakeError(
179180
SpendStakeError::InvalidBlockRewardOutputType,
180181
));

chainstate/src/detail/chainstateref/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,8 @@ impl<'a, S: BlockchainStorageRead, V: TransactionVerificationStrategy> Chainstat
697697
| TxOutput::DelegateStaking(_, _)
698698
| TxOutput::IssueFungibleToken(_)
699699
| TxOutput::IssueNft(_, _, _)
700-
| TxOutput::DataDeposit(_) => Err(
700+
| TxOutput::DataDeposit(_)
701+
| TxOutput::Htlc(_, _) => Err(
701702
CheckBlockError::InvalidBlockRewardOutputType(block.get_id()),
702703
),
703704
},
@@ -713,7 +714,8 @@ impl<'a, S: BlockchainStorageRead, V: TransactionVerificationStrategy> Chainstat
713714
| TxOutput::DelegateStaking(_, _)
714715
| TxOutput::IssueFungibleToken(_)
715716
| TxOutput::IssueNft(_, _, _)
716-
| TxOutput::DataDeposit(_) => Err(
717+
| TxOutput::DataDeposit(_)
718+
| TxOutput::Htlc(_, _) => Err(
717719
CheckBlockError::InvalidBlockRewardOutputType(block.get_id()),
718720
),
719721
}

chainstate/src/detail/error_classification.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ impl BlockProcessingErrorClassification for mintscript::translate::TranslationEr
349349

350350
Self::PoSAccounting(e) => e.classify(),
351351
Self::TokensAccounting(e) => e.classify(),
352+
Self::SignatureError(e) => e.classify(),
352353
}
353354
}
354355
}
@@ -786,9 +787,8 @@ impl BlockProcessingErrorClassification for CheckTransactionError {
786787
| CheckTransactionError::NoSignatureDataNotAllowed(_)
787788
| CheckTransactionError::DataDepositMaxSizeExceeded(_, _, _)
788789
| CheckTransactionError::TxSizeTooLarge(_, _, _)
789-
| CheckTransactionError::DeprecatedTokenOperationVersion(_, _) => {
790-
BlockProcessingErrorClass::BadBlock
791-
}
790+
| CheckTransactionError::DeprecatedTokenOperationVersion(_, _)
791+
| CheckTransactionError::HtlcsAreNotActivated => BlockProcessingErrorClass::BadBlock,
792792

793793
CheckTransactionError::PropertyQueryError(err) => err.classify(),
794794
CheckTransactionError::TokensError(err) => err.classify(),

chainstate/src/detail/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,8 @@ impl<S: BlockchainStorage, V: TransactionVerificationStrategy> Chainstate<S, V>
723723
| TxOutput::DelegateStaking(_, _)
724724
| TxOutput::IssueFungibleToken(_)
725725
| TxOutput::IssueNft(_, _, _)
726-
| TxOutput::DataDeposit(_) => { /* do nothing */ }
726+
| TxOutput::DataDeposit(_)
727+
| TxOutput::Htlc(_, _) => { /* do nothing */ }
727728
| TxOutput::CreateStakePool(pool_id, data) => {
728729
let _ = db
729730
.create_pool(*pool_id, data.as_ref().clone().into())

chainstate/src/detail/query.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,8 @@ impl<'a, S: BlockchainStorageRead, V: TransactionVerificationStrategy> Chainstat
348348
| TxOutput::ProduceBlockFromStake(_, _)
349349
| TxOutput::CreateDelegationId(_, _)
350350
| TxOutput::DelegateStaking(_, _)
351-
| TxOutput::DataDeposit(_) => None,
351+
| TxOutput::DataDeposit(_)
352+
| TxOutput::Htlc(_, _) => None,
352353
TxOutput::IssueNft(_, issuance, _) => match issuance.as_ref() {
353354
NftIssuance::V0(nft) => {
354355
Some(RPCTokenInfo::new_nonfungible(RPCNonFungibleTokenInfo::new(

0 commit comments

Comments
 (0)