mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-20 21:01:03 +00:00
392447f5c8
407bf44a8a add missing license header (#1204) 9babb19810 Custom relay strategy (#1198) c287872a11 fix clippy things (#1200) 3a40e62789 Expose some const value and type (#1186) 32b61476d1 increase sleep before connectingMillau (#1195) aabe7041fa revert messages transactions mortality (#1194) 3651f4f909 Message transactions mortality (#1191) 364d6e155d Bump dependencies (#1180) f0389acc08 cargo +nightly fmt --all (#1192) b270b6a016 Unify error enums in substrate and ethereum clients with `thiserror` (#1094) 58c4946f74 Limit max call size of Rialto/Millau runtimes (#1187) fd56a8cd56 Add UI to the deployment (#1047) 16f01dc736 Westend -> Millau alerts are pending before notifications are sent (#1184) 5628c11ece replace collective flip with babe randomness in Rialto (#1188) 1094a63b00 ignore another (pretty bad) RUSTSEC (#1185) 379fe323ea fix/ignore cargo deny issues (#1183) 92af5e6e64 additional log in finality relay + rephrase "failed" (#1182) b996a3b681 Rialto parachain in test deployments (#1178) 28d9332b44 Resubmit transactions strategy for Polkadot/Kusama (#1175) d0172c6847 Playing with CI (#1179) fb6f42456d fix checks order when registering parachain (#1177) ee828c005a Register-parachain subcommand of substrate-relay (#1170) 8cd2b1a112 Token swap pallet benchmarks (#1174) bb811accb1 fix collision with westend bridge (#1172) 8d2fba70ed add token swaps to test deployments (#1169) b6d1bdfe2c publish rialto parachain collator image (#1171) 834ae4a10a Fix OutboundLaneData types (#1159) 5ee0ea1626 copypasted -> copied (#1168) c3bb835f18 fix spelling (#1167) f90d041dc9 Upgrade `jsonrpsee` to v0.3 (#1051) 598c9b6d0d add some basic tests for swap tokens (#1164) 05e88c61f5 publish images when tag of specific format(e.g. v2021-09-27 + v2021-09-27-1) is published (#1166) 7f3f94a6e0 Fix CI again (#1165) ff37de332f Move calculation relayer reward into `MessageDeliveryAndDispatchPayment` (#1153) 36fbba839b fix clippy warning (#1163) 16da44d018 explicit wasm build (#1158) c9c8226449 Match substrate's fmt (#1148) 2fdd7f3e5e Fix/ignore clippy warnings (#1157) 43dfcc2686 Adding LookupAddress (#1156) 951eaa5582 Add rialto-parachain runtime and node (#1142) 803d266d61 Rename MessageId -> BridgeMessageId (#1152) 5f234484fc Box large arguments of GRANDPA pallet (#1154) cf9abc1011 Fix spelling (#1150) ab83ba2e58 Relay subcommand that performs token RLT <> MLAU token swap (#1141) 832536caf0 Polkadot <> Kusama relayers (#1122) 6d0daa8975 Add `OnMessageAccepted` callback (#1134) 5d03a20b3e Integrate token swap pallet into Millau runtime (#1099) ea4cfa833e Adding MultiAddress type and ValidationCodeHash (#1139) c20325a784 Add tests for `Raw` and `BridgeSendMessage` enum `Call` variants (#1125) 6d802416e2 increase pause before pining Rialto nodes (#1137) b54fa56b62 calculate fee using full message payload (#1132) ca5d8178f5 Add parachain pallets to rialto runtime (#1053) 9eaae4142e fix transaction resubmitter limits for Millau -> Rialto transactions (#1135) 9d4e17783c add --mandatory-headers-only cli option to complex relay (#1129) 1c5e0ec1cb Add local CI info to README (#1131) a8e0929e14 chore: spellchecker fixes (#1130) 3b8e2118e3 set fee for importing mandatory headers to zero (#1127) 49bba9aa52 another bunch of words for spellchecker (#1128) 8a72eafef6 Increase pause before messages generation start (#1126) 1f0ba9a191 Move some associated types from relay_substrate_client::Chain to bp_runtime::Chain (#1087) 74bc1a5b54 Transactions resubmitter (#1083) 21ba001f26 log max balance drop when sending message (#1117) 638a7ddffa Code Cleaning (#1124) be6555c51b Fix buildah logout (#1120) 87539c4a98 Format code work (#1116) 526fe7fdd7 fix spelling (#1119) bd4ce7f241 Fix spelling (#1118) 3c1147858e added missing constants to Kusama/Polkadot primitives (#1114) 52093b22ab Fix delivery transaction estimation used by rational relayer (#1109) 77a2f2fbed Remove fund account checks from upgrade. (#1111) 824334802b Rename param and update comment (#1108) d7784bfe06 Fix spellcheck (#1110) 0b18f5906a Refactor substrate messages source and substrate messages target (#1105) b27240bbff fix compilation (#1107) 9697da4fe8 Emit mortal transactions from relay (#1073) b29396c077 Change vault vars type to env vars (#1084) 35e0bbdc0c Make clippy mandatory. (#1103) a517e8541f Remove unused deps (#1102) 873dae608a Remove unnessary deps (#1101) 13450b74ee Stored conversion rate updater (#1005) 74389829f3 [BREAKING] Migrate messages pallet to frame v2 (#1088) 424da938dd README fix (#1100) 865744c909 upgrade currency exchange pallet to frame v2 (#1097) b5038148b3 Add missing docs (#1095) 0791e911c1 Common crate for substrate-relay (#1082) 3834c9d880 Update high-level-overview.md (#1093) c93553face Increase the time window for messaging alerts. (#1092) 8b9cc3cecd migrate pallet-shift-session-manager to frame v2 (#1090) dc91813c22 migrate eth PoA pallet to frame v2 (#1091) f16bb098cc Migrate dispatch pallet to frame v2 (#1089) 19f4325348 Bridge/This Chain Ids should be exposed as constants on pallet level. (#1085) 6381122df7 Change ChainSpec::from_genesis for Rialto and Millau chains to reflect the chain names. (#1079) 0f1d33e973 Make CI happy again (#1086) 238e65d96f fix typo (#1080) fc008457b6 Token-swap-over-bridge pallet (#944) 3fb97fa5ef Fix full spellcheck (#1076) eae4ed7170 fixed wrong trace (#1075) 219a0fad04 merge two weight-related loops in messages pallet (#1071) fc85632fdb increase_message_fee depends on stored mesage size (#1066) 530f37a23b companion for https://github.com/paritytech/polkadot/pull/3507 (#1067) 53b8cba683 sc_basic_authorship=trace for millau nodes (#1074) 9874e05e98 Improve traces of message generator scripts (#1069) 7b5ee84fbb extract message_details impl into runtime common (#1070) 5a4aed5a8b refund weight for mot pruning messages (#1062) 90e3d1e111 Fix Westend -> Millau sync (#1064) 427d30ddfc When restarting client, also "restart" tokio runtime (#1065) d47c05eeef Change get pipeline sensitive variables from Vault instead of GitLab settings (#1063) d775a85415 use tokio reactor to execute jsonrpsee futures (#1061) 15c8cd61cb Use BABE to author blocks on Rialto (previously: Aura) (#1050) 5186293500 Allow reading suri && password override from file (#1059) b506298262 Update jsonrpsee reference (#1049) 1734d00517 enable weight fee adjustent in Rialto/Millau (#1044) 607265afae Pay dispatch fee at target chain cli option (#1043) ce79ef91be bump dependencies before start referencing polkadot repo (#1048) 924fa24f6d Cli option for greedy relayer + run no-losses relayer by default (#1042) e21eba7b59 Yrong README Fixup + M1 Fixes (#1045) 20d08204a2 Confirm delivery detects when more than expected messages are confirmed (#1039) 994b846b52 pre and post dispatch weights of OnDeliveryConfirmed callback (#1040) 1dd5297e84 give real value to Rialto and Millau tokens (#1038) 035bee8715 Use real conversion rate in greedy relayer strategy (#1035) 9cfaecd0f7 fixed metrics prefix (#1037) 1d8d224937 Use kebab-case for bridge arguments (#1036) f30a4c79a6 Shared reference to conversion rate metric value (#1034) c34d7a5cbb estimate transaction fee (#1015) 93404b18bb change alert period from 2m to 10m for Westend -> Millau (GRANDPA or public node itself is lagging sometimes) (#1032) git-subtree-dir: bridges git-subtree-split: 407bf44a8a5f4e60aceef2dc755cd9ff09929ac3
260 lines
8.2 KiB
Rust
260 lines
8.2 KiB
Rust
// Copyright 2019-2021 Parity Technologies (UK) Ltd.
|
|
// This file is part of Parity Bridges Common.
|
|
|
|
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Parity Bridges Common is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! Support for PoA -> Substrate native tokens exchange.
|
|
//!
|
|
//! If you want to exchange native PoA tokens for native Substrate
|
|
//! chain tokens, you need to:
|
|
//! 1) send some PoA tokens to `LOCK_FUNDS_ADDRESS` address on PoA chain. Data field of
|
|
//! the transaction must be SCALE-encoded id of Substrate account that will receive
|
|
//! funds on Substrate chain;
|
|
//! 2) wait until the 'lock funds' transaction is mined on PoA chain;
|
|
//! 3) wait until the block containing the 'lock funds' transaction is finalized on PoA chain;
|
|
//! 4) wait until the required PoA header and its finality are provided
|
|
//! to the PoA -> Substrate bridge module (it can be provided by you);
|
|
//! 5) receive tokens by providing proof-of-inclusion of PoA transaction.
|
|
|
|
use bp_currency_exchange::{
|
|
Error as ExchangeError, LockFundsTransaction, MaybeLockFundsTransaction,
|
|
Result as ExchangeResult,
|
|
};
|
|
use bp_eth_poa::{transaction_decode_rlp, RawTransaction, RawTransactionReceipt};
|
|
use codec::{Decode, Encode};
|
|
use frame_support::RuntimeDebug;
|
|
use hex_literal::hex;
|
|
use scale_info::TypeInfo;
|
|
use sp_std::vec::Vec;
|
|
|
|
/// Ethereum address where locked PoA funds must be sent to.
|
|
pub const LOCK_FUNDS_ADDRESS: [u8; 20] = hex!("DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF");
|
|
|
|
/// Ethereum transaction inclusion proof.
|
|
#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug, TypeInfo)]
|
|
pub struct EthereumTransactionInclusionProof {
|
|
/// Hash of the block with transaction.
|
|
pub block: sp_core::H256,
|
|
/// Index of the transaction within the block.
|
|
pub index: u64,
|
|
/// The proof itself (right now it is all RLP-encoded transactions of the block +
|
|
/// RLP-encoded receipts of all transactions of the block).
|
|
pub proof: Vec<(RawTransaction, RawTransactionReceipt)>,
|
|
}
|
|
|
|
/// We uniquely identify transfer by the pair (sender, nonce).
|
|
///
|
|
/// The assumption is that this pair will never appear more than once in
|
|
/// transactions included into finalized blocks. This is obviously true
|
|
/// for any existing eth-like chain (that keep current TX format), because
|
|
/// otherwise transaction can be replayed over and over.
|
|
#[derive(Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)]
|
|
pub struct EthereumTransactionTag {
|
|
/// Account that has locked funds.
|
|
pub account: [u8; 20],
|
|
/// Lock transaction nonce.
|
|
pub nonce: sp_core::U256,
|
|
}
|
|
|
|
/// Ethereum transaction from runtime perspective.
|
|
pub struct EthTransaction;
|
|
|
|
impl MaybeLockFundsTransaction for EthTransaction {
|
|
type Transaction = RawTransaction;
|
|
type Id = EthereumTransactionTag;
|
|
type Recipient = crate::AccountId;
|
|
type Amount = crate::Balance;
|
|
|
|
fn parse(
|
|
raw_tx: &Self::Transaction,
|
|
) -> ExchangeResult<LockFundsTransaction<Self::Id, Self::Recipient, Self::Amount>> {
|
|
let tx = transaction_decode_rlp(raw_tx).map_err(|_| ExchangeError::InvalidTransaction)?;
|
|
|
|
// we only accept transactions sending funds directly to the pre-configured address
|
|
if tx.unsigned.to != Some(LOCK_FUNDS_ADDRESS.into()) {
|
|
log::trace!(
|
|
target: "runtime",
|
|
"Failed to parse fund locks transaction. Invalid peer recipient: {:?}",
|
|
tx.unsigned.to,
|
|
);
|
|
|
|
return Err(ExchangeError::InvalidTransaction)
|
|
}
|
|
|
|
let mut recipient_raw = sp_core::H256::default();
|
|
match tx.unsigned.payload.len() {
|
|
32 => recipient_raw.as_fixed_bytes_mut().copy_from_slice(&tx.unsigned.payload),
|
|
len => {
|
|
log::trace!(
|
|
target: "runtime",
|
|
"Failed to parse fund locks transaction. Invalid recipient length: {}",
|
|
len,
|
|
);
|
|
|
|
return Err(ExchangeError::InvalidRecipient)
|
|
},
|
|
}
|
|
let amount = tx.unsigned.value.low_u128();
|
|
|
|
if tx.unsigned.value != amount.into() {
|
|
log::trace!(
|
|
target: "runtime",
|
|
"Failed to parse fund locks transaction. Invalid amount: {}",
|
|
tx.unsigned.value,
|
|
);
|
|
|
|
return Err(ExchangeError::InvalidAmount)
|
|
}
|
|
|
|
Ok(LockFundsTransaction {
|
|
id: EthereumTransactionTag {
|
|
account: *tx.sender.as_fixed_bytes(),
|
|
nonce: tx.unsigned.nonce,
|
|
},
|
|
recipient: crate::AccountId::from(*recipient_raw.as_fixed_bytes()),
|
|
amount,
|
|
})
|
|
}
|
|
}
|
|
|
|
/// Prepares everything required to bench claim of funds locked by given transaction.
|
|
#[cfg(feature = "runtime-benchmarks")]
|
|
pub(crate) fn prepare_environment_for_claim<T: pallet_bridge_eth_poa::Config<I>, I: 'static>(
|
|
transactions: &[(RawTransaction, RawTransactionReceipt)],
|
|
) -> bp_eth_poa::H256 {
|
|
use bp_eth_poa::compute_merkle_root;
|
|
use pallet_bridge_eth_poa::{
|
|
test_utils::{insert_dummy_header, validator_utils::validator, HeaderBuilder},
|
|
BridgeStorage, Storage,
|
|
};
|
|
|
|
let mut storage = BridgeStorage::<T, I>::new();
|
|
let header = HeaderBuilder::with_parent_number_on_runtime::<T, I>(0)
|
|
.transactions_root(compute_merkle_root(transactions.iter().map(|(tx, _)| tx)))
|
|
.receipts_root(compute_merkle_root(transactions.iter().map(|(_, receipt)| receipt)))
|
|
.sign_by(&validator(0));
|
|
let header_id = header.compute_id();
|
|
insert_dummy_header(&mut storage, header);
|
|
storage.finalize_and_prune_headers(Some(header_id), 0);
|
|
|
|
header_id.hash
|
|
}
|
|
|
|
/// Prepare signed ethereum lock-funds transaction.
|
|
#[cfg(any(feature = "runtime-benchmarks", test))]
|
|
pub(crate) fn prepare_ethereum_transaction(
|
|
recipient: &crate::AccountId,
|
|
editor: impl Fn(&mut bp_eth_poa::UnsignedTransaction),
|
|
) -> (RawTransaction, RawTransactionReceipt) {
|
|
use bp_eth_poa::{signatures::SignTransaction, Receipt, TransactionOutcome};
|
|
|
|
// prepare tx for OpenEthereum private dev chain:
|
|
// chain id is 0x11
|
|
// sender secret is 0x4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7
|
|
let chain_id = 0x11;
|
|
let signer = libsecp256k1::SecretKey::parse(&hex!(
|
|
"4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7"
|
|
))
|
|
.unwrap();
|
|
let recipient_raw: &[u8; 32] = recipient.as_ref();
|
|
let mut eth_tx = bp_eth_poa::UnsignedTransaction {
|
|
nonce: 0.into(),
|
|
to: Some(LOCK_FUNDS_ADDRESS.into()),
|
|
value: 100.into(),
|
|
gas: 100_000.into(),
|
|
gas_price: 100_000.into(),
|
|
payload: recipient_raw.to_vec(),
|
|
};
|
|
editor(&mut eth_tx);
|
|
(
|
|
eth_tx.sign_by(&signer, Some(chain_id)),
|
|
Receipt {
|
|
outcome: TransactionOutcome::StatusCode(1),
|
|
gas_used: Default::default(),
|
|
log_bloom: Default::default(),
|
|
logs: Vec::new(),
|
|
}
|
|
.rlp(),
|
|
)
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use hex_literal::hex;
|
|
|
|
fn ferdie() -> crate::AccountId {
|
|
hex!("1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c").into()
|
|
}
|
|
|
|
#[test]
|
|
fn valid_transaction_accepted() {
|
|
assert_eq!(
|
|
EthTransaction::parse(&prepare_ethereum_transaction(&ferdie(), |_| {}).0),
|
|
Ok(LockFundsTransaction {
|
|
id: EthereumTransactionTag {
|
|
account: hex!("00a329c0648769a73afac7f9381e08fb43dbea72"),
|
|
nonce: 0.into(),
|
|
},
|
|
recipient: ferdie(),
|
|
amount: 100,
|
|
}),
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn invalid_transaction_rejected() {
|
|
assert_eq!(EthTransaction::parse(&Vec::new()), Err(ExchangeError::InvalidTransaction),);
|
|
}
|
|
|
|
#[test]
|
|
fn transaction_with_invalid_peer_recipient_rejected() {
|
|
assert_eq!(
|
|
EthTransaction::parse(
|
|
&prepare_ethereum_transaction(&ferdie(), |tx| {
|
|
tx.to = None;
|
|
})
|
|
.0
|
|
),
|
|
Err(ExchangeError::InvalidTransaction),
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn transaction_with_invalid_recipient_rejected() {
|
|
assert_eq!(
|
|
EthTransaction::parse(
|
|
&prepare_ethereum_transaction(&ferdie(), |tx| {
|
|
tx.payload.clear();
|
|
})
|
|
.0
|
|
),
|
|
Err(ExchangeError::InvalidRecipient),
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn transaction_with_invalid_amount_rejected() {
|
|
assert_eq!(
|
|
EthTransaction::parse(
|
|
&prepare_ethereum_transaction(&ferdie(), |tx| {
|
|
tx.value = sp_core::U256::from(u128::max_value()) + sp_core::U256::from(1);
|
|
})
|
|
.0
|
|
),
|
|
Err(ExchangeError::InvalidAmount),
|
|
);
|
|
}
|
|
}
|