diff --git a/beacon_node/eth1/src/http.rs b/beacon_node/eth1/src/http.rs index 404e357d19..b0de6542db 100644 --- a/beacon_node/eth1/src/http.rs +++ b/beacon_node/eth1/src/http.rs @@ -23,7 +23,7 @@ use types::Hash256; pub const DEPOSIT_EVENT_TOPIC: &str = "0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5"; /// `keccak("get_deposit_root()")[0..4]` -pub const DEPOSIT_ROOT_FN_SIGNATURE: &str = "0x863a311b"; +pub const DEPOSIT_ROOT_FN_SIGNATURE: &str = "0xc5f2892f"; /// `keccak("get_deposit_count()")[0..4]` pub const DEPOSIT_COUNT_FN_SIGNATURE: &str = "0x621fd130"; diff --git a/eth2/utils/deposit_contract/.gitignore b/eth2/utils/deposit_contract/.gitignore index 81b46ff033..2af4fb80c7 100644 --- a/eth2/utils/deposit_contract/.gitignore +++ b/eth2/utils/deposit_contract/.gitignore @@ -1 +1 @@ -contract/ +contracts/ diff --git a/eth2/utils/deposit_contract/build.rs b/eth2/utils/deposit_contract/build.rs index 5923788793..f5b059983e 100644 --- a/eth2/utils/deposit_contract/build.rs +++ b/eth2/utils/deposit_contract/build.rs @@ -3,21 +3,23 @@ //! //! These files are required for some `include_bytes` calls used in this crate. -use reqwest::Response; use serde_json::Value; use std::env; use std::fs::File; use std::io::Write; use std::path::PathBuf; -const GITHUB_RAW: &str = "https://raw.githubusercontent.com"; -const SPEC_REPO: &str = "ethereum/eth2.0-specs"; -const SPEC_TAG: &str = "v0.8.3"; -const ABI_FILE: &str = "validator_registration.json"; -const BYTECODE_FILE: &str = "validator_registration.bytecode"; +const TAG: &str = "v0.9.2"; + +fn spec_url() -> String { + format!("https://raw.githubusercontent.com/ethereum/eth2.0-specs/{}/deposit_contract/contracts/validator_registration.json", TAG) +} +fn testnet_url() -> String { + format!("https://raw.githubusercontent.com/sigp/unsafe-eth2-deposit-contract/{}/unsafe_validator_registration.json", TAG) +} fn main() { - match init_deposit_contract_abi() { + match get_all_contracts() { Ok(()) => (), Err(e) => panic!(e), } @@ -25,14 +27,33 @@ fn main() { /// Attempts to download the deposit contract ABI from github if a local copy is not already /// present. -pub fn init_deposit_contract_abi() -> Result<(), String> { - let abi_file = abi_dir().join(format!("{}_{}", SPEC_TAG, ABI_FILE)); - let bytecode_file = abi_dir().join(format!("{}_{}", SPEC_TAG, BYTECODE_FILE)); +pub fn get_all_contracts() -> Result<(), String> { + download_deposit_contract( + &spec_url(), + "validator_registration.json", + "validator_registration.bytecode", + )?; + download_deposit_contract( + &testnet_url(), + "testnet_validator_registration.json", + "testnet_validator_registration.bytecode", + ) +} + +/// Attempts to download the deposit contract ABI from github if a local copy is not already +/// present. +pub fn download_deposit_contract( + url: &str, + abi_file: &str, + bytecode_file: &str, +) -> Result<(), String> { + let abi_file = abi_dir().join(format!("{}_{}", TAG, abi_file)); + let bytecode_file = abi_dir().join(format!("{}_{}", TAG, bytecode_file)); if abi_file.exists() { // Nothing to do. } else { - match download_abi() { + match reqwest::get(url) { Ok(mut response) => { let mut abi_file = File::create(abi_file) .map_err(|e| format!("Failed to create local abi file: {:?}", e))?; @@ -71,22 +92,13 @@ pub fn init_deposit_contract_abi() -> Result<(), String> { Ok(()) } -/// Attempts to download the deposit contract file from the Ethereum github. -fn download_abi() -> Result { - reqwest::get(&format!( - "{}/{}/{}/deposit_contract/contracts/{}", - GITHUB_RAW, SPEC_REPO, SPEC_TAG, ABI_FILE - )) - .map_err(|e| format!("Failed to download deposit ABI from github: {:?}", e)) -} - /// Returns the directory that will be used to store the deposit contract ABI. fn abi_dir() -> PathBuf { let base = env::var("CARGO_MANIFEST_DIR") .expect("should know manifest dir") .parse::() .expect("should parse manifest dir as path") - .join("contract"); + .join("contracts"); std::fs::create_dir_all(base.clone()) .expect("should be able to create abi directory in manifest"); diff --git a/eth2/utils/deposit_contract/src/lib.rs b/eth2/utils/deposit_contract/src/lib.rs index c4f2f1ef68..b0c052ede6 100644 --- a/eth2/utils/deposit_contract/src/lib.rs +++ b/eth2/utils/deposit_contract/src/lib.rs @@ -1,21 +1,32 @@ use ethabi::{Contract, Token}; use ssz::Encode; +use tree_hash::TreeHash; use types::DepositData; pub use ethabi::Error; pub const CONTRACT_DEPLOY_GAS: usize = 4_000_000; pub const DEPOSIT_GAS: usize = 4_000_000; -pub const ABI: &[u8] = include_bytes!("../contract/v0.8.3_validator_registration.json"); -pub const BYTECODE: &[u8] = include_bytes!("../contract/v0.8.3_validator_registration.bytecode"); +pub const ABI: &[u8] = include_bytes!("../contracts/v0.9.2_validator_registration.json"); +pub const BYTECODE: &[u8] = include_bytes!("../contracts/v0.9.2_validator_registration.bytecode"); + +pub mod testnet { + pub const ABI: &[u8] = + include_bytes!("../contracts/v0.9.2_testnet_validator_registration.json"); + pub const BYTECODE: &[u8] = + include_bytes!("../contracts/v0.9.2_testnet_validator_registration.bytecode"); +} pub fn eth1_tx_data(deposit_data: &DepositData) -> Result, Error> { let params = vec![ Token::Bytes(deposit_data.pubkey.as_ssz_bytes()), Token::Bytes(deposit_data.withdrawal_credentials.as_ssz_bytes()), Token::Bytes(deposit_data.signature.as_ssz_bytes()), + Token::FixedBytes(deposit_data.tree_hash_root().as_ssz_bytes()), ]; + // Here we make an assumption that the `crate::testnet::ABI` has a superset of the features of + // the crate::ABI`. let abi = Contract::load(ABI)?; let function = abi.function("deposit")?; function.encode_input(¶ms)