Skip to content
This repository was archived by the owner on Mar 20, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
146a710
Update dependencies
fewensa Nov 4, 2021
4289f54
fix compile
fewensa Nov 4, 2021
af0448f
Update dependencies
fewensa Nov 5, 2021
cd3a2e5
Add custom relay strategy
fewensa Nov 5, 2021
123b7e3
test client substrate
fewensa Nov 5, 2021
3ede4cb
test client substrate
fewensa Nov 7, 2021
51da5f6
Update lock
fewensa Nov 8, 2021
20ac672
Update lock
fewensa Nov 8, 2021
c5822a3
fee market strategy
fewensa Nov 8, 2021
fe4351a
clippy
fewensa Nov 8, 2021
a6bce9b
Update dependencies
fewensa Nov 9, 2021
d698f94
test and fix api bug
fewensa Nov 9, 2021
70266e8
Remove unused dependency
fewensa Nov 9, 2021
e4ec0bd
fix test
fewensa Nov 9, 2021
9aecf1d
Update dependencies
fewensa Nov 10, 2021
962f7ba
Merge remote-tracking branch 'origin/master' into darwinia-feemarket-…
fewensa Nov 10, 2021
6b2e427
Merge branch 'master' into darwinia-feemarket-strategy
hackfisher Nov 10, 2021
37abc2f
Update dependencies
fewensa Nov 12, 2021
4634e76
New api: `update_relay_fee` `update_locked_collateral`
fewensa Nov 12, 2021
f7c7af9
crazy strategy
fewensa Nov 12, 2021
b9bf5a0
subscan component
fewensa Nov 12, 2021
c267f44
price api
fewensa Nov 12, 2021
c4358ed
add reasonable strategy (unfinished), fix compile
fewensa Nov 12, 2021
38511ba
update fee service
fewensa Nov 14, 2021
81789db
use blocking api
fewensa Nov 15, 2021
81ffefa
test update fee
fewensa Nov 15, 2021
a689a33
Update lock
fewensa Nov 16, 2021
5e0b712
Merge remote-tracking branch 'origin/master' into darwinia-feemarket-…
fewensa Nov 16, 2021
432de8e
Update dependencies
fewensa Nov 16, 2021
e95ed51
Update dependencies
fewensa Nov 16, 2021
d471d7d
Update storage key
fewensa Nov 16, 2021
b26fb6e
test update fee
fewensa Nov 16, 2021
911c5da
clippy
fewensa Nov 16, 2021
8102da7
docs
fewensa Nov 16, 2021
9352ecf
docs
fewensa Nov 16, 2021
36928ae
fix tests
fewensa Nov 16, 2021
95c4cdd
Update dependencies
fewensa Nov 17, 2021
44b04a7
Merge remote-tracking branch 'origin/master' into darwinia-feemarket-…
fewensa Nov 19, 2021
e50477a
fix conflicts
fewensa Nov 19, 2021
fcd8e19
Just test
fewensa Nov 19, 2021
ef45a60
Revert CI
fewensa Nov 19, 2021
e214e97
Change use futures_timer instead thread sleep
fewensa Nov 22, 2021
0050860
Merge remote-tracking branch 'origin/master' into darwinia-feemarket-…
fewensa Nov 22, 2021
db9df97
fix conflicts
fewensa Nov 22, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .maintain/config/task-pangolin-pangoro.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,18 @@ create_relayers_fund_accounts = false
no_prometheus = false
prometheus_host = "127.0.0.1"
prometheus_port = 9616

[pangolin_subscan]
endpoint = "https://pangolin.api.subscan.io"
token = "12345abcde"
timeout = 30

[pangoro_subscan]
endpoint = "https://pangoro.api.subscan.io"
token = "12345abcde"
timeout = 30

[task]
# 1800 seconds, 30 minutes
interval_update_fee = 1800
update_fee_strategy = "Nothing"
2,252 changes: 838 additions & 1,414 deletions Cargo.lock

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions bin/src/initialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,14 @@ fn init_log() {
"darwinia_bridge=debug",
"bridge=info",
"component_pangolin_subxt=trace",
"subscan=debug",
"support_tracker_evm_log=info",
"task-darwinia-ethereum=trace",
"task-pangolin-ropsten=trace",
"task-pangolin-pangoro=trace",
"jsonrpsee_ws_client=error",
"component_pangoro_s2s=trace",
"component_pangolin_s2s=trace",
]
.join(","),
);
Expand Down
3 changes: 2 additions & 1 deletion components/client-darwinia-subxt/src/component.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ impl DarwiniaSubxtComponent {
#[async_trait::async_trait]
impl BridgeComponent<DarwiniaSubxtConfig, Darwinia> for DarwiniaSubxtComponent {
fn restore_with_namespace<T: BridgeSand>(namespace: String) -> BridgeResult<Self> {
let config: DarwiniaSubxtConfig = Config::restore_with_namespace(T::NAME, namespace)?;
let config: DarwiniaSubxtConfig =
Config::restore_with_namespace_unwrap(T::NAME, namespace)?;
Ok(Self::new(config))
}

Expand Down
43 changes: 29 additions & 14 deletions components/client-pangolin-s2s/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,42 @@ readme = 'README.md'
edition = "2018"

[dependencies]
anyhow = "1"
async-trait = "0.1"
log = "0.4"

bridge-traits = { path = "../../traits" }

codec = { package = "parity-scale-codec", version = "2.0.0" }
headers-relay = { git = "https://github.com/darwinia-network/parity-bridges-common.git", tag = "darwinia-v0.11.6" }
relay-substrate-client = { git = "https://github.com/darwinia-network/parity-bridges-common.git", tag = "darwinia-v0.11.6" }
relay-utils = { git = "https://github.com/darwinia-network/parity-bridges-common.git", tag = "darwinia-v0.11.6" }
headers-relay = { git = "https://github.com/darwinia-network/parity-bridges-common.git", branch = "darwinia-feemarket-strategy" }
relay-substrate-client = { git = "https://github.com/darwinia-network/parity-bridges-common.git", branch = "darwinia-feemarket-strategy" }
relay-utils = { git = "https://github.com/darwinia-network/parity-bridges-common.git", branch = "darwinia-feemarket-strategy" }
messages-relay = { git = "https://github.com/darwinia-network/parity-bridges-common.git", branch = "darwinia-feemarket-strategy" }
bp-messages = { git = "https://github.com/darwinia-network/parity-bridges-common.git", branch = "darwinia-feemarket-strategy" }
bp-runtime = { git = "https://github.com/darwinia-network/parity-bridges-common.git", branch = "darwinia-feemarket-strategy" }

## Bridge dependencies
pangolin-runtime = { git = "https://github.com/darwinia-network/darwinia-common.git", tag = "v2.6.10" }
common-primitives = { git = "https://github.com/darwinia-network/darwinia-common.git", tag = "v2.6.10" }
bridge-primitives = { git = "https://github.com/darwinia-network/darwinia-common.git", tag = "v2.6.10" }
darwinia-bridge-ethereum = { git = "https://github.com/darwinia-network/darwinia-common.git", tag = "v2.6.10" }
pangolin-constants = { git = "https://github.com/darwinia-network/darwinia-common.git", tag = "v2.6.10" }
pangolin-runtime = { git = "https://github.com/darwinia-network/darwinia-common.git", branch = "s2s" }
common-primitives = { git = "https://github.com/darwinia-network/darwinia-common.git", branch = "s2s" }
bridge-primitives = { git = "https://github.com/darwinia-network/darwinia-common.git", branch = "s2s" }
darwinia-bridge-ethereum = { git = "https://github.com/darwinia-network/darwinia-common.git", branch = "s2s" }
pangolin-constants = { git = "https://github.com/darwinia-network/darwinia-common.git", branch = "s2s" }
dp-fee = { git = "https://github.com/darwinia-network/darwinia-common.git", branch = "s2s" }



## Substrate Dependencies
frame-system = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6" }
frame-support = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6" }
pallet-transaction-payment = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6" }
sp-core = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6" }
sp-keyring = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6" }
sp-runtime = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6" }
frame-system = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6-1" }
frame-support = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6-1" }
pallet-transaction-payment = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6-1" }
sp-core = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6-1" }
sp-keyring = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6-1" }
sp-runtime = { git = "https://github.com/darwinia-network/substrate.git", tag = "darwinia-v0.11.6-1" }


[dev-dependencies]
anyhow = "1"
futures-test = "0.3"
tokio = { version = "1", features = ["time"] }
codec = { package = "parity-scale-codec", version = "2.2.0" }

160 changes: 160 additions & 0 deletions components/client-pangolin-s2s/src/api.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
use bp_messages::{LaneId, MessageNonce};
use codec::Encode;
use common_primitives::AccountId;
use common_primitives::Balance;
use common_primitives::BlockNumber;
use dp_fee::{Order, Relayer};
use relay_substrate_client::{ChainBase, Client, TransactionSignScheme, UnsignedTransaction};
use sp_core::storage::StorageKey;
use sp_core::{Bytes, Pair};

use crate::{patch, PangolinChain};

#[derive(Clone)]
pub struct PangolinApi {
client: Client<PangolinChain>,
}

impl PangolinApi {
pub fn new(client: Client<PangolinChain>) -> Self {
Self { client }
}
}

impl PangolinApi {
pub async fn client(&self) -> &Client<PangolinChain> {
&self.client
}

/// Query assigned relayers
pub async fn assigned_relayers(&self) -> anyhow::Result<Vec<Relayer<AccountId, Balance>>> {
Ok(self
.client
.storage_value(
StorageKey(
patch::storage_prefix("FeeMarket".as_bytes(), "AssignedRelayers".as_bytes())
.to_vec(),
),
None,
)
.await?
.unwrap_or_else(Vec::new))
}

/// Query all relayers
pub async fn relayers(&self) -> anyhow::Result<Vec<AccountId>> {
Ok(self
.client
.storage_value(
StorageKey(
patch::storage_prefix("FeeMarket".as_bytes(), "Relayers".as_bytes()).to_vec(),
),
None,
)
.await?
.unwrap_or_else(Vec::new))
}

/// Query relayer info by account id
pub async fn relayer(
&self,
account: AccountId,
) -> anyhow::Result<Option<Relayer<AccountId, Balance>>> {
Ok(self
.client
.storage_value(
bp_runtime::storage_map_final_key_blake2_128concat(
"FeeMarket",
"RelayersMap",
account.encode().as_slice(),
),
None,
)
.await?)
}

pub async fn is_relayer(&self, account: AccountId) -> anyhow::Result<bool> {
self.relayer(account).await.map(|item| item.is_some())
}

/// Query order
pub async fn order(
&self,
laned_id: LaneId,
message_nonce: MessageNonce,
) -> anyhow::Result<Option<Order<AccountId, BlockNumber, Balance>>> {
Ok(self
.client
.storage_value(
bp_runtime::storage_map_final_key_blake2_128concat(
"FeeMarket",
"Orders",
(laned_id, message_nonce).encode().as_slice(),
),
None,
)
.await?)
}
Comment thread
hackfisher marked this conversation as resolved.

/// Return number of the best finalized block.
pub async fn best_finalized_header_number(
&self,
) -> anyhow::Result<common_primitives::BlockNumber> {
Ok(self.client.best_finalized_header_number().await?)
}

/// Update relay fee
pub async fn update_relay_fee(
&self,
signer: <PangolinChain as TransactionSignScheme>::AccountKeyPair,
amount: <PangolinChain as ChainBase>::Balance,
) -> anyhow::Result<()> {
let signer_id = (*signer.public().as_array_ref()).into();
let genesis_hash = *self.client.genesis_hash();
self.client
.submit_signed_extrinsic(signer_id, move |_, transaction_nonce| {
Bytes(
PangolinChain::sign_transaction(
genesis_hash,
&signer,
relay_substrate_client::TransactionEra::immortal(),
UnsignedTransaction::new(
pangolin_runtime::FeeMarketCall::update_relay_fee(amount).into(),
transaction_nonce,
),
)
.encode(),
)
})
.await?;
Ok(())
}

/// Update locked collateral
pub async fn update_locked_collateral(
&self,
signer: <PangolinChain as TransactionSignScheme>::AccountKeyPair,
amount: <PangolinChain as ChainBase>::Balance,
) -> anyhow::Result<()> {
let signer_id = (*signer.public().as_array_ref()).into();
let genesis_hash = *self.client.genesis_hash();
self.client
.submit_signed_extrinsic(signer_id, move |_, transaction_nonce| {
Bytes(
PangolinChain::sign_transaction(
genesis_hash,
&signer,
relay_substrate_client::TransactionEra::immortal(),
UnsignedTransaction::new(
pangolin_runtime::FeeMarketCall::update_locked_collateral(amount)
.into(),
transaction_nonce,
),
)
.encode(),
)
})
.await?;
Ok(())
}
}
109 changes: 109 additions & 0 deletions components/client-pangolin-s2s/src/feemarket.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
use std::ops::Range;

use common_primitives::AccountId;
use messages_relay::message_lane::MessageLane;
use messages_relay::message_lane_loop::{
SourceClient as MessageLaneSourceClient, TargetClient as MessageLaneTargetClient,
};
use messages_relay::relay_strategy::{RelayReference, RelayStrategy};
use relay_substrate_client::Client;

use crate::api::PangolinApi;
use crate::PangolinChain;

#[derive(Clone)]
pub struct PangolinRelayStrategy {
api: PangolinApi,
account: AccountId,
}

impl PangolinRelayStrategy {
pub fn new(client: Client<PangolinChain>, account: AccountId) -> Self {
Self {
api: PangolinApi::new(client),
account,
}
}
}

#[async_trait::async_trait]
impl RelayStrategy for PangolinRelayStrategy {
async fn decide<
P: MessageLane,
SourceClient: MessageLaneSourceClient<P>,
TargetClient: MessageLaneTargetClient<P>,
>(
&self,
reference: &mut RelayReference<P, SourceClient, TargetClient>,
) -> bool {
let nonce = &reference.nonce;
let order = self
.api
.order(bridge_primitives::PANGORO_PANGOLIN_LANE, *nonce)
.await
.map_err(|e| {
log::error!("Failed to query order: {:?}", e);
})
.unwrap_or(None);

// If the order is not exists.
// 1. You are too behind.
// 2. The network question
// So, you can skip this currently
// Related: https://github.com/darwinia-network/darwinia-common/blob/90add536ed320ec7e17898e695c65ee9d7ce79b0/frame/fee-market/src/lib.rs?#L177
if order.is_none() {
return false;
}
// -----

let order = order.unwrap();
let relayers = order.relayers;

// If not have any assigned relayers, everyone participates in the relay.
if relayers.is_empty() {
return true;
}

// -----

let prior_relayer = relayers.iter().find(|item| item.id == self.account);
let is_assigned_relayer = prior_relayer.is_some();

// If you are assigned relayer, you must relay this nonce.
// If you don't do that, the fee market pallet will slash your deposit.
// Even though it is a timeout, although it will slash your deposit after the timeout is delivered,
// you can still get relay rewards.
if is_assigned_relayer {
return true;
}

// -----

// If you aren't assigned relayer, only participate in the part about time out, earn more rewards
let latest_block_number = self
.api
.best_finalized_header_number()
.await
.map_err(|e| {
log::error!(
"Failed to query latest block, unable to decide whether to participate: {:?}",
e
);
})
.unwrap_or(0);
let ranges = relayers
.iter()
.map(|item| item.valid_range.clone())
.collect::<Vec<Range<common_primitives::BlockNumber>>>();

let mut maximum_timeout = 0;
for range in ranges {
maximum_timeout = std::cmp::max(maximum_timeout, range.end);
}
// If this order has timed out, decide to relay
if latest_block_number > maximum_timeout {
return true;
}
false
}
}
Loading