2017-06-25 04:21:13 -07:00
|
|
|
#[macro_use]
|
|
|
|
extern crate futures;
|
2017-08-03 15:48:12 -07:00
|
|
|
extern crate futures_cpupool;
|
2017-08-02 03:45:15 -07:00
|
|
|
extern crate futures_after;
|
2017-06-25 04:21:13 -07:00
|
|
|
extern crate serde;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate serde_derive;
|
|
|
|
extern crate toml;
|
|
|
|
extern crate web3;
|
|
|
|
extern crate docopt;
|
2017-08-01 02:36:48 -07:00
|
|
|
extern crate tokio_core;
|
2017-08-02 03:45:15 -07:00
|
|
|
#[macro_use]
|
|
|
|
extern crate log;
|
|
|
|
extern crate env_logger;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate error_chain;
|
2017-08-10 08:55:46 -07:00
|
|
|
extern crate ethabi;
|
2017-06-25 04:21:13 -07:00
|
|
|
|
2017-08-01 02:36:48 -07:00
|
|
|
mod api;
|
|
|
|
mod app;
|
2017-06-25 04:21:13 -07:00
|
|
|
mod config;
|
2017-08-01 02:36:48 -07:00
|
|
|
mod database;
|
2017-08-02 03:45:15 -07:00
|
|
|
pub mod error;
|
2017-08-10 08:55:46 -07:00
|
|
|
mod bridge;
|
|
|
|
mod state;
|
2017-06-25 04:21:13 -07:00
|
|
|
|
|
|
|
use std::env;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use docopt::Docopt;
|
2017-08-03 15:48:12 -07:00
|
|
|
use tokio_core::reactor::Core;
|
2017-08-04 08:57:09 -07:00
|
|
|
use app::{App, Deployed};
|
2017-06-25 04:21:13 -07:00
|
|
|
use config::Config;
|
|
|
|
use error::Error;
|
|
|
|
|
|
|
|
const USAGE: &'static str = r#"
|
|
|
|
Ethereum-Kovan bridge.
|
|
|
|
Copyright 2017 Parity Technologies (UK) Limited
|
|
|
|
|
|
|
|
Usage:
|
|
|
|
bridge --config <config> --database <database>
|
|
|
|
bridge -h | --help
|
|
|
|
|
|
|
|
Options:
|
|
|
|
-h, --help Display help message and exit.
|
|
|
|
"#;
|
|
|
|
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
|
|
pub struct Args {
|
2017-08-10 08:55:46 -07:00
|
|
|
arg_config: PathBuf,
|
2017-06-25 04:21:13 -07:00
|
|
|
arg_database: PathBuf,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
2017-08-02 03:45:15 -07:00
|
|
|
let _ = env_logger::init();
|
2017-06-25 04:21:13 -07:00
|
|
|
let result = execute(env::args());
|
|
|
|
|
|
|
|
match result {
|
|
|
|
Ok(s) => println!("{}", s),
|
2017-08-02 03:45:15 -07:00
|
|
|
Err(err) => print_err(err),
|
2017-06-25 04:21:13 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-02 03:45:15 -07:00
|
|
|
fn print_err(err: Error) {
|
|
|
|
let message = err.iter().map(|e| e.to_string()).collect::<Vec<_>>().join("\n\nCaused by:\n ");
|
|
|
|
println!("{}", message);
|
|
|
|
}
|
|
|
|
|
2017-06-25 04:21:13 -07:00
|
|
|
fn execute<S, I>(command: I) -> Result<String, Error> where I: IntoIterator<Item=S>, S: AsRef<str> {
|
2017-08-03 15:48:12 -07:00
|
|
|
trace!(target: "bridge", "Parsing cli arguments");
|
2017-06-25 04:21:13 -07:00
|
|
|
let args: Args = Docopt::new(USAGE)
|
|
|
|
.and_then(|d| d.argv(command).deserialize())?;
|
|
|
|
|
2017-08-03 15:48:12 -07:00
|
|
|
trace!(target: "bridge", "Loading config");
|
2017-08-10 08:55:46 -07:00
|
|
|
let config = Config::load(args.arg_config)?;
|
2017-06-25 04:21:13 -07:00
|
|
|
|
2017-08-03 15:48:12 -07:00
|
|
|
trace!(target: "bridge", "Starting event loop");
|
|
|
|
let mut event_loop = Core::new().unwrap();
|
|
|
|
|
|
|
|
trace!(target: "bridge", "Establishing ipc connection");
|
2017-08-04 08:57:09 -07:00
|
|
|
let app = App::new_ipc(config, &args.arg_database, &event_loop.handle())?;
|
2017-08-03 15:48:12 -07:00
|
|
|
|
|
|
|
trace!(target: "bridge", "Deploying contracts (if needed)");
|
2017-08-04 08:57:09 -07:00
|
|
|
let deployed = event_loop.run(app.ensure_deployed())?;
|
|
|
|
|
|
|
|
match deployed {
|
|
|
|
Deployed::New(database) => {
|
|
|
|
trace!(target: "bridge", "Deployed new bridge contracts");
|
|
|
|
trace!(target: "bridge", "\n\n{}\n", database);
|
|
|
|
},
|
|
|
|
Deployed::None(database) => {
|
|
|
|
trace!(target: "bridge", "Loaded database");
|
|
|
|
},
|
|
|
|
}
|
2017-08-01 02:36:48 -07:00
|
|
|
|
2017-06-25 04:21:13 -07:00
|
|
|
Ok("Done".into())
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
}
|