use crate::contract_wrapper_trait::ContractWrapper; use crate::dao_types; use crate::utils::status_as_success_decoded; use eth_types::eth2::LightClientUpdate; use near_primitives::views::FinalExecutionOutcomeView; use near_sdk::json_types::Base64VecU8; use near_sdk::{AccountId, Gas}; use serde_json::json; use std::error::Error; /// Implementation for interaction with DAO Contract on NEAR. pub struct DAOContract { /// Wrapper for interacting with NEAR Contract pub contract_wrapper: Box, } impl DAOContract { /// Constructor for DAOContract pub fn new(contract_wrapper: Box) -> Self { DAOContract { contract_wrapper } } /// Gets last proposal ID in DAO contract pub fn get_last_proposal_id(&self) -> Result> { let response = self .contract_wrapper .call_view_function("get_last_proposal_id".to_string(), vec![])?; Ok(serde_json::from_slice(response.as_slice())?) } /// Gets the proposal for a given proposal ID pub fn get_proposal(&self, id: u64) -> Result> { let response = self.contract_wrapper.call_view_function( "get_proposal".to_string(), json!({ "id": id }).to_string().into_bytes(), )?; Ok(serde_json::from_slice(response.as_slice())?) } /// Gets policy of the DAO contract pub fn get_policy(&self) -> Result> { let response = self .contract_wrapper .call_view_function("get_policy".to_string(), json!({}).to_string().into_bytes())?; Ok(serde_json::from_slice(response.as_slice())?) } /// Submits a new proposal to the DAO contract pub fn add_proposal( &mut self, proposal: dao_types::ProposalInput, ) -> Result<(u64, FinalExecutionOutcomeView), Box> { let policy = self.get_policy()?; let response = self.contract_wrapper.call_change_method( "add_proposal".to_string(), json!({ "proposal": json!(proposal) }) .to_string() .into_bytes(), Some(policy.proposal_bond.0), None, )?; Ok(( serde_json::from_slice( status_as_success_decoded(response.clone().status) .ok_or("Failed to add proposal")? .as_slice(), )?, response, )) } /// Votes for a specific `Action` in the `Proposal` with the given ID pub fn act_proposal( &self, id: u64, action: dao_types::Action, ) -> Result> { self.contract_wrapper.call_change_method( "act_proposal".to_string(), json!({ "id": id, "action": action }) .to_string() .into_bytes(), None, None, ) } /// Submits Light Client Update to DAO /// /// # Arguments /// * `receiver_id` - account ID of the Ethereum Light Client Contract on NEAR. /// * `update` - Light Client Update. pub fn submit_light_client_update_proposal( &mut self, receiver_id: AccountId, update: LightClientUpdate, ) -> Result<(u64, FinalExecutionOutcomeView), Box> { let raw_update = borsh::to_vec(&update)?; let update_hash = near_primitives::hash::hash(&raw_update); let args = Base64VecU8::from(raw_update); const GAS_FOR_SUBMIT_LIGHT_CLIENT_UPDATE: u64 = Gas::from_tgas(270).as_gas(); let action = dao_types::ActionCall { method_name: "submit_beacon_chain_light_client_update".to_string(), args, deposit: 0.into(), gas: GAS_FOR_SUBMIT_LIGHT_CLIENT_UPDATE.into(), }; let proposal_input = dao_types::ProposalInput { description: json!({ "finalized slot": update.finality_update.header_update.beacon_header.slot, "update_hash": update_hash.to_string() }) .to_string(), kind: dao_types::ProposalKind::FunctionCall { receiver_id, actions: vec![action], }, }; self.add_proposal(proposal_input) } } #[cfg(test)] mod tests { use crate::contract_wrapper_trait::ContractWrapper; use crate::dao_contract::DAOContract; use crate::dao_types::{ProposalInput, ProposalKind}; use crate::near_contract_wrapper::NearContractWrapper; use eth_types::eth2::{ BeaconBlockHeader, FinalizedHeaderUpdate, HeaderUpdate, LightClientUpdate, SignatureBytes, SyncAggregate, SyncCommitteeBits, }; use near_crypto::{KeyType, PublicKey}; use near_primitives::types::AccountId; use near_primitives::views::{ ExecutionOutcomeView, ExecutionOutcomeWithIdView, ExecutionStatusView, FinalExecutionOutcomeView, FinalExecutionStatus, SignedTransactionView, }; use near_sdk::Gas; use serde_json::Value; use std::error::Error; use std::thread::sleep; use std::time::Duration; fn get_default_result() -> FinalExecutionOutcomeView { let status_str = "215"; FinalExecutionOutcomeView { status: FinalExecutionStatus::SuccessValue(status_str.into()), transaction: SignedTransactionView { signer_id: "accout.testnet".parse().unwrap(), public_key: PublicKey::empty(KeyType::ED25519), nonce: 0, receiver_id: "accout.testnet".parse().unwrap(), actions: vec![], signature: Default::default(), hash: Default::default(), priority_fee: Default::default(), }, transaction_outcome: ExecutionOutcomeWithIdView { proof: vec![], block_hash: Default::default(), id: Default::default(), outcome: ExecutionOutcomeView { logs: vec![], receipt_ids: vec![], gas_burnt: 0, tokens_burnt: 0, executor_id: "accout.testnet".parse().unwrap(), status: ExecutionStatusView::Unknown, metadata: Default::default(), }, }, receipts_outcome: vec![], } } pub struct MockContractWrapper {} impl ContractWrapper for MockContractWrapper { fn get_account_id(&self) -> AccountId { panic!("Unexpected request of AccountId"); } fn get_signer_account_id(&self) -> AccountId { panic!("Unexpected request of signer AccountId"); } fn call_view_function( &self, method_name: String, args: Vec, ) -> Result, Box> { match method_name.as_str() { "get_last_proposal_id" => { assert_eq!(args.len(), 0); Ok(vec![51, 48, 50]) } "get_policy" => Ok(vec![ 123, 34, 114, 111, 108, 101, 115, 34, 58, 91, 123, 34, 110, 97, 109, 101, 34, 58, 34, 97, 108, 108, 34, 44, 34, 107, 105, 110, 100, 34, 58, 34, 69, 118, 101, 114, 121, 111, 110, 101, 34, 44, 34, 112, 101, 114, 109, 105, 115, 115, 105, 111, 110, 115, 34, 58, 91, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 118, 111, 116, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 97, 108, 108, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 93, 44, 34, 118, 111, 116, 101, 95, 112, 111, 108, 105, 99, 121, 34, 58, 123, 125, 125, 44, 123, 34, 110, 97, 109, 101, 34, 58, 34, 118, 111, 116, 101, 114, 34, 44, 34, 107, 105, 110, 100, 34, 58, 123, 34, 71, 114, 111, 117, 112, 34, 58, 91, 34, 100, 97, 111, 49, 45, 100, 101, 118, 46, 116, 101, 115, 116, 110, 101, 116, 34, 44, 34, 100, 97, 111, 50, 45, 100, 101, 118, 46, 116, 101, 115, 116, 110, 101, 116, 34, 93, 125, 44, 34, 112, 101, 114, 109, 105, 115, 115, 105, 111, 110, 115, 34, 58, 91, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 99, 97, 108, 108, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 42, 58, 70, 105, 110, 97, 108, 105, 122, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 93, 44, 34, 118, 111, 116, 101, 95, 112, 111, 108, 105, 99, 121, 34, 58, 123, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 118, 111, 116, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 99, 97, 108, 108, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 112, 111, 108, 105, 99, 121, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 44, 34, 99, 111, 110, 102, 105, 103, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 51, 44, 49, 48, 93, 125, 125, 125, 44, 123, 34, 110, 97, 109, 101, 34, 58, 34, 99, 111, 117, 110, 99, 105, 108, 34, 44, 34, 107, 105, 110, 100, 34, 58, 123, 34, 71, 114, 111, 117, 112, 34, 58, 91, 34, 116, 101, 115, 116, 49, 45, 100, 101, 118, 46, 116, 101, 115, 116, 110, 101, 116, 34, 93, 125, 44, 34, 112, 101, 114, 109, 105, 115, 115, 105, 111, 110, 115, 34, 58, 91, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 42, 58, 70, 105, 110, 97, 108, 105, 122, 101, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 112, 111, 108, 105, 99, 121, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 99, 97, 108, 108, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 99, 97, 108, 108, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 118, 111, 116, 101, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 58, 86, 111, 116, 101, 65, 112, 112, 114, 111, 118, 101, 34, 44, 34, 99, 111, 110, 102, 105, 103, 58, 86, 111, 116, 101, 82, 101, 109, 111, 118, 101, 34, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 58, 65, 100, 100, 80, 114, 111, 112, 111, 115, 97, 108, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 58, 86, 111, 116, 101, 82, 101, 106, 101, 99, 116, 34, 93, 44, 34, 118, 111, 116, 101, 95, 112, 111, 108, 105, 99, 121, 34, 58, 123, 34, 97, 100, 100, 95, 109, 101, 109, 98, 101, 114, 95, 116, 111, 95, 114, 111, 108, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 112, 111, 108, 105, 99, 121, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 118, 111, 116, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 115, 101, 116, 95, 118, 111, 116, 101, 95, 116, 111, 107, 101, 110, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 114, 101, 109, 111, 118, 101, 95, 109, 101, 109, 98, 101, 114, 95, 102, 114, 111, 109, 95, 114, 111, 108, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 116, 114, 97, 110, 115, 102, 101, 114, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 97, 100, 100, 95, 98, 111, 117, 110, 116, 121, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 115, 101, 108, 102, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 98, 111, 117, 110, 116, 121, 95, 100, 111, 110, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 99, 97, 108, 108, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 99, 111, 110, 102, 105, 103, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 117, 112, 103, 114, 97, 100, 101, 95, 114, 101, 109, 111, 116, 101, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 125, 125, 93, 44, 34, 100, 101, 102, 97, 117, 108, 116, 95, 118, 111, 116, 101, 95, 112, 111, 108, 105, 99, 121, 34, 58, 123, 34, 119, 101, 105, 103, 104, 116, 95, 107, 105, 110, 100, 34, 58, 34, 82, 111, 108, 101, 87, 101, 105, 103, 104, 116, 34, 44, 34, 113, 117, 111, 114, 117, 109, 34, 58, 34, 48, 34, 44, 34, 116, 104, 114, 101, 115, 104, 111, 108, 100, 34, 58, 91, 49, 44, 50, 93, 125, 44, 34, 112, 114, 111, 112, 111, 115, 97, 108, 95, 98, 111, 110, 100, 34, 58, 34, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 34, 44, 34, 112, 114, 111, 112, 111, 115, 97, 108, 95, 112, 101, 114, 105, 111, 100, 34, 58, 34, 54, 48, 52, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 98, 111, 110, 100, 34, 58, 34, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 34, 44, 34, 98, 111, 117, 110, 116, 121, 95, 102, 111, 114, 103, 105, 118, 101, 110, 101, 115, 115, 95, 112, 101, 114, 105, 111, 100, 34, 58, 34, 54, 48, 52, 56, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 34, 125, ]), "get_proposal" => Ok(vec![ 123, 34, 105, 100, 34, 58, 51, 48, 48, 44, 34, 112, 114, 111, 112, 111, 115, 101, 114, 34, 58, 34, 116, 101, 115, 116, 95, 101, 116, 104, 50, 110, 101, 97, 114, 95, 114, 101, 108, 97, 121, 46, 116, 101, 115, 116, 110, 101, 116, 34, 44, 34, 100, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 34, 58, 34, 123, 92, 34, 102, 105, 110, 97, 108, 105, 122, 101, 100, 32, 115, 108, 111, 116, 92, 34, 58, 48, 44, 92, 34, 117, 112, 100, 97, 116, 101, 95, 104, 97, 115, 104, 92, 34, 58, 92, 34, 70, 119, 56, 82, 105, 110, 89, 116, 84, 111, 57, 71, 113, 101, 90, 68, 67, 53, 71, 99, 74, 118, 99, 67, 98, 118, 72, 75, 119, 117, 69, 97, 84, 65, 52, 109, 52, 53, 98, 97, 69, 117, 116, 54, 92, 34, 125, 34, 44, 34, 107, 105, 110, 100, 34, 58, 123, 34, 70, 117, 110, 99, 116, 105, 111, 110, 67, 97, 108, 108, 34, 58, 123, 34, 114, 101, 99, 101, 105, 118, 101, 114, 95, 105, 100, 34, 58, 34, 102, 97, 107, 101, 95, 97, 99, 99, 111, 117, 110, 116, 46, 116, 101, 115, 116, 110, 101, 116, 34, 44, 34, 97, 99, 116, 105, 111, 110, 115, 34, 58, 91, 123, 34, 109, 101, 116, 104, 111, 100, 95, 110, 97, 109, 101, 34, 58, 34, 115, 117, 98, 109, 105, 116, 95, 98, 101, 97, 99, 111, 110, 95, 99, 104, 97, 105, 110, 95, 108, 105, 103, 104, 116, 95, 99, 108, 105, 101, 110, 116, 95, 117, 112, 100, 97, 116, 101, 34, 44, 34, 97, 114, 103, 115, 34, 58, 34, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 61, 61, 34, 44, 34, 100, 101, 112, 111, 115, 105, 116, 34, 58, 34, 48, 34, 44, 34, 103, 97, 115, 34, 58, 34, 50, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 34, 125, 93, 125, 125, 44, 34, 115, 116, 97, 116, 117, 115, 34, 58, 34, 82, 101, 106, 101, 99, 116, 101, 100, 34, 44, 34, 118, 111, 116, 101, 95, 99, 111, 117, 110, 116, 115, 34, 58, 123, 34, 118, 111, 116, 101, 114, 34, 58, 91, 48, 44, 49, 44, 48, 93, 44, 34, 97, 108, 108, 34, 58, 91, 48, 44, 49, 44, 48, 93, 125, 44, 34, 118, 111, 116, 101, 115, 34, 58, 123, 34, 100, 97, 111, 50, 45, 100, 101, 118, 46, 116, 101, 115, 116, 110, 101, 116, 34, 58, 34, 82, 101, 106, 101, 99, 116, 34, 125, 44, 34, 115, 117, 98, 109, 105, 115, 115, 105, 111, 110, 95, 116, 105, 109, 101, 34, 58, 34, 49, 54, 54, 48, 49, 51, 48, 49, 49, 55, 54, 50, 49, 57, 56, 50, 57, 57, 49, 34, 125, ]), _ => panic!("Call unexpected view method {}", method_name), } } fn call_change_method_batch( &self, _method_name: Vec, _args: Vec>, _deposit: Option>, _gas: Option, ) -> Result> { panic!("Unexpected use of batch change method"); } fn call_change_method( &self, method_name: String, args: Vec, _deposit: Option, _gas: Option, ) -> Result> { if method_name == "add_proposal" { let v: Value = serde_json::from_slice(&*args).unwrap(); assert!(match &v { Value::Object(ref vmap) => vmap.contains_key("proposal"), _ => panic!("Expected Object"), }); assert!(match &v["proposal"] { Value::Object(ref vmap) => vmap.contains_key("description"), _ => panic!("Expected object"), }); let proposal_input: ProposalInput = serde_json::from_str(&serde_json::to_string(&v["proposal"]).unwrap()).unwrap(); match proposal_input.kind { ProposalKind::FunctionCall { receiver_id: _, actions, } => { assert_eq!(actions.len(), 1); assert_eq!( actions[0].method_name, "submit_beacon_chain_light_client_update" ); } _ => { panic!("Unexpected ProposalKind"); } } } Ok(get_default_result()) } } fn get_mock_light_client_update() -> LightClientUpdate { LightClientUpdate { attested_beacon_header: BeaconBlockHeader { slot: 0, proposer_index: 0, parent_root: Default::default(), state_root: Default::default(), body_root: Default::default(), }, sync_aggregate: SyncAggregate { sync_committee_bits: SyncCommitteeBits([0; 64]), sync_committee_signature: SignatureBytes([0; 96]), }, signature_slot: 0, finality_update: FinalizedHeaderUpdate { header_update: HeaderUpdate { beacon_header: BeaconBlockHeader { slot: 0, proposer_index: 0, parent_root: Default::default(), state_root: Default::default(), body_root: Default::default(), }, execution_block_hash: Default::default(), execution_hash_branch: vec![], }, finality_branch: vec![], }, sync_committee_update: None, } } #[test] fn test_dao_contract_with_mock_contract_wrapper() { let mut dao_contract = DAOContract::new(Box::new(MockContractWrapper {})); let proposal_id = dao_contract.get_last_proposal_id().unwrap(); dao_contract.get_proposal(proposal_id - 1).unwrap(); dao_contract.get_policy().unwrap(); let mock_light_client_update = get_mock_light_client_update(); dao_contract .submit_light_client_update_proposal( near_sdk::AccountId::try_from("fake_account.testnet".to_string()).unwrap(), mock_light_client_update, ) .unwrap(); } #[ignore] #[test] fn test_dao_contract_with_near_contract_wrapper() { // mnemonic words: print resist region shadow front velvet actor rib march dilemma oil general const SIGNER_PRIVATE_KEY: &str = "ed25519:2d27kd85Ndc2TxaVPjE8deTFFiAprRFLhFMZ513MEKLmyrXkZoKHz8PzEwrYSGoExWE5i7G179ngVnbnLfCVeMEA"; const SIGNER_ACCOUNT_ID: &str = "test_eth2near_relay.testnet"; const DAO_CONTRACT_ACCOUNT_ID: &str = "eth2-test.sputnikv2.testnet"; const NEAR_ENDPOINT: &str = "https://rpc.testnet.near.org"; let near_contract_wrapper = NearContractWrapper::new_with_raw_secret_key( NEAR_ENDPOINT, SIGNER_ACCOUNT_ID, SIGNER_PRIVATE_KEY, DAO_CONTRACT_ACCOUNT_ID, None, ); let mut dao_contract = DAOContract::new(Box::new(near_contract_wrapper)); let proposal_id = dao_contract.get_last_proposal_id().unwrap(); dao_contract.get_proposal(proposal_id - 1).unwrap(); dao_contract.get_policy().unwrap(); let mock_light_client_update = get_mock_light_client_update(); dao_contract .submit_light_client_update_proposal( near_sdk::AccountId::try_from("fake_account.testnet".to_string()).unwrap(), mock_light_client_update, ) .unwrap(); sleep(Duration::from_secs(10)); let new_proposal_id = dao_contract.get_last_proposal_id().unwrap(); assert!(new_proposal_id > proposal_id); } }