Skip to content
This repository was archived by the owner on Mar 20, 2024. It is now read-only.

Complete guard service #6

Merged
merged 6 commits into from
Oct 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
90 changes: 56 additions & 34 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ features = ["full"]
package = "darwinia-bridge-primitives"
version = "0.0.10"
git = "https://github.com/darwinia-network/bridge-primitives.git"
# branch = "bump"
# branch = "sudo"
# path = "../bridge-primitives"
features = ["runtime"]

Expand Down
84 changes: 78 additions & 6 deletions src/api/darwinia.rs
Original file line number Diff line number Diff line change
@@ -1,27 +1,51 @@
//! Darwinia API
use crate::{pool::EthereumTransaction, result::Result, Config};
use core::marker::PhantomData;
use primitives::{
chain::eth::{EthereumReceiptProofThing, HeaderStuff, RedeemFor},
frame::ethereum::{
backing::{RedeemCallExt, VerifiedProofStoreExt},
game::{EthereumRelayerGame, PendingHeadersStoreExt, ProposalsStoreExt},
relay::{ConfirmedBlockNumbersStoreExt, SubmitProposalCallExt},
frame::{
collective::{ExecuteCallExt, MembersStoreExt},
ethereum::{
backing::{RedeemCallExt, VerifiedProofStoreExt},
game::{EthereumRelayerGame, PendingHeadersStoreExt, ProposalsStoreExt},
relay::{
ApprovePendingHeader, ConfirmedBlockNumbersStoreExt, RejectPendingHeader,
SubmitProposalCallExt,
},
},
sudo::{KeyStoreExt, SudoCallExt},
},
runtime::DarwiniaRuntime,
};
use sp_keyring::sr25519::sr25519::Pair;
use substrate_subxt::{sp_core::Pair as PairTrait, Client, ClientBuilder, PairSigner};
use substrate_subxt::{
sp_core::{Encode, Pair as PairTrait},
Client, ClientBuilder, PairSigner,
};
use web3::types::H256;

// Types
type PendingHeader = <DarwiniaRuntime as EthereumRelayerGame>::PendingHeader;
type RelayProposal = <DarwiniaRuntime as EthereumRelayerGame>::RelayProposal;

/// Account Role
#[derive(PartialEq, Eq)]
pub enum Role {
/// Sudo Account
Sudo,
/// Council Member
Council,
/// Normal Account
Normal,
}

/// Dawrinia API
pub struct Darwinia {
client: Client<DarwiniaRuntime>,
/// Keyring signer
pub signer: PairSigner<DarwiniaRuntime, Pair>,
/// Account Role
pub role: Role,
}

impl Darwinia {
Expand All @@ -34,7 +58,55 @@ impl Darwinia {
.build()
.await?;

Ok(Darwinia { client, signer })
let pk = signer.signer().public().to_string();
let sudo = client.key(None).await?.to_string();
let council = client.members(None).await?;

Ok(Darwinia {
client,
signer,
role: if sudo == pk {
Role::Sudo
} else if council.iter().any(|cpk| cpk.to_string() == pk) {
Role::Council
} else {
Role::Normal
},
})
}

/// Approve pending header
pub async fn approve_pending_header(&self, pending: u64) -> Result<H256> {
let ex = self.client.encode(ApprovePendingHeader {
pending,
_runtime: PhantomData::default(),
})?;
Ok(match self.role {
Role::Sudo => self.client.sudo(&self.signer, &ex).await?,
Role::Council => {
self.client
.execute(&self.signer, &ex, ex.size_hint() as u32)
.await?
}
Role::Normal => H256::from([0; 32]),
})
}

/// Reject pending header
pub async fn reject_pending_header(&self, pending: u64) -> Result<H256> {
let ex = self.client.encode(RejectPendingHeader {
pending,
_runtime: PhantomData::default(),
})?;
Ok(match self.role {
Role::Sudo => self.client.sudo(&self.signer, &ex).await?,
Role::Council => {
self.client
.execute(&self.signer, &ex, ex.size_hint() as u32)
.await?
}
Role::Normal => H256::from([0; 32]),
})
}

/// Get relay proposals
Expand Down
5 changes: 4 additions & 1 deletion src/api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@
mod darwinia;
mod shadow;

pub use self::{darwinia::Darwinia, shadow::Shadow};
pub use self::{
darwinia::{Darwinia, Role},
shadow::Shadow,
};
Loading