From 7115b649efdbd68e2b6094490ac2e51b1f158d5f Mon Sep 17 00:00:00 2001 From: debris Date: Sun, 13 Aug 2017 16:15:14 +0200 Subject: [PATCH] WithdrawConfirm --- src/bridge/deposit_relay.rs | 2 +- src/bridge/mod.rs | 4 ++-- src/bridge/withdraw_confirm.rs | 24 +++++++++++++++++++++++- src/contracts/kovan.rs | 7 +++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/bridge/deposit_relay.rs b/src/bridge/deposit_relay.rs index 2f06491..e3e73c1 100644 --- a/src/bridge/deposit_relay.rs +++ b/src/bridge/deposit_relay.rs @@ -18,7 +18,7 @@ enum DepositRelayState { future: JoinAll>>, block: u64, }, - /// All deposits from given block has been relayed. + /// All deposits till given block has been relayed. Yield(Option), } diff --git a/src/bridge/mod.rs b/src/bridge/mod.rs index 604cc74..1e053f1 100644 --- a/src/bridge/mod.rs +++ b/src/bridge/mod.rs @@ -10,7 +10,7 @@ use database::Database; use error::Error; use self::deposit_relay::{DepositRelay, create_deposit_relay}; use self::withdraw_relay::WithdrawRelay; -use self::withdraw_confirm::WithdrawConfirm; +use self::withdraw_confirm::{WithdrawConfirm, create_withdraw_confirm}; #[derive(Clone, Copy)] pub enum BridgeChecked { @@ -28,7 +28,7 @@ pub fn create_bridge(app: Arc>, init: &Database) -> Bridge { deposit_relay: create_deposit_relay(app.clone(), init), withdraw_relay: { unimplemented!(); }, - withdraw_confirm: { unimplemented!(); }, + withdraw_confirm: create_withdraw_confirm(app.clone(), init), state: BridgeStatus::Wait, } } diff --git a/src/bridge/withdraw_confirm.rs b/src/bridge/withdraw_confirm.rs index dd52630..4058e65 100644 --- a/src/bridge/withdraw_confirm.rs +++ b/src/bridge/withdraw_confirm.rs @@ -8,22 +8,44 @@ use web3::types::{H256, H520, Address, TransactionRequest}; use api::{self, LogStream}; use app::App; use contracts::KovanWithdraw; +use database::Database; use error::{Error, ErrorKind}; -pub enum WithdrawConfirmState { +/// State of withdraw confirmation. +enum WithdrawConfirmState { + /// Withdraw confirm is waiting for logs. Wait, + /// Signing withdraws. SignWithraws { withdraws: Vec, future: JoinAll>>, block: u64, }, + /// Confirming withdraws. ConfirmWithdraws { future: JoinAll>>, block: u64, }, + /// All withdraws till given block has been confirmed. Yield(Option), } +pub fn create_withdraw_confirm(app: Arc>, init: &Database) -> WithdrawConfirm { + let logs_init = api::LogStreamInit { + after: init.checked_withdraw_confirm, + poll_interval: app.config.testnet.poll_interval, + confirmations: app.config.testnet.required_confirmations, + filter: app.testnet_bridge().withdraws_filter(init.testnet_contract_address.clone()), + }; + + WithdrawConfirm { + logs: api::log_stream(app.connections.testnet.clone(), logs_init), + testnet_contract: init.testnet_contract_address.clone(), + state: WithdrawConfirmState::Wait, + app, + } +} + pub struct WithdrawConfirm { app: Arc>, logs: LogStream, diff --git a/src/contracts/kovan.rs b/src/contracts/kovan.rs index d6b1108..f0056b0 100644 --- a/src/contracts/kovan.rs +++ b/src/contracts/kovan.rs @@ -45,6 +45,13 @@ impl<'a> KovanBridge<'a> { Ok(result) } + pub fn withdraws_filter(&self, address: Address) -> FilterBuilder { + let event = self.0.event("Withdraw").expect("to find event `Withdraw`"); + FilterBuilder::default() + .address(vec![address]) + .topics(Some(vec![H256(event.signature())]), None, None, None) + } + pub fn withdraw_from_log(&self, log: Log) -> Result { let event = self.0.event("Withdraw").expect("to find event `Withdraw`"); let mut decoded = event.decode_log(