Skip to content
7 changes: 2 additions & 5 deletions core/src/box_kind/ballot_box.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use ergo_lib::{
ergo_chain_types::{Digest32, EcPoint},
ergotree_ir::{
chain::{
address::{Address, AddressEncoder, AddressEncoderError},
address::{Address, AddressEncoderError},
ergo_box::{box_value::BoxValue, ErgoBox, ErgoBoxCandidate, NonMandatoryRegisterId},
token::{Token, TokenId},
},
Expand Down Expand Up @@ -80,10 +80,7 @@ impl BallotBoxWrapper {
.get_register(NonMandatoryRegisterId::R4.into())
.ok_or(BallotBoxError::NoGroupElementInR4)?
.try_extract_into::<EcPoint>()?;
let prefix = inputs.parameters.contract_parameters.p2s.network();
let config_from_address = AddressEncoder::new(prefix)
.parse_address_from_str(&inputs.parameters.ballot_token_owner_address)?;
if config_from_address != Address::P2Pk(ProveDlog::from(ec)) {
if inputs.parameters.ballot_token_owner_address != Address::P2Pk(ProveDlog::from(ec)) {
return Err(BallotBoxError::UnexpectedGroupElementInR4);
}

Expand Down
76 changes: 17 additions & 59 deletions core/src/cli_commands/bootstrap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ use ergo_lib::{
},
ergotree_ir::{
chain::{
address::{
Address, AddressEncoder, AddressEncoderError, NetworkAddress, NetworkPrefix,
},
address::{Address, AddressEncoder, AddressEncoderError, NetworkPrefix},
ergo_box::{
box_value::{BoxValue, BoxValueError},
ErgoBox,
Expand Down Expand Up @@ -43,6 +41,7 @@ use crate::{
},
node_interface::{assert_wallet_unlocked, SignTransaction, SubmitTransaction},
oracle_config::TokenIds,
serde::BootstrapConfigSerde,
wallet::WalletDataSource,
};

Expand All @@ -57,18 +56,13 @@ pub fn bootstrap(config_file_name: String) -> Result<(), BootstrapError> {
// `oracle_config.yaml` file to work from here.
let node = NodeInterface::new(&config.node_api_key, &config.node_ip, &config.node_port);
assert_wallet_unlocked(&node);
let prefix = if config.on_mainnet {
NetworkPrefix::Mainnet
} else {
NetworkPrefix::Testnet
};
let change_address_str = node
.wallet_status()?
.change_address
.ok_or(BootstrapError::NoChangeAddressSetInNode)?;
debug!("Change address: {}", change_address_str);

let change_address = AddressEncoder::new(prefix).parse_address_from_str(&change_address_str)?;
let change_address = AddressEncoder::unchecked_parse_address_from_str(&change_address_str)?;
let input = BootstrapInput {
config,
wallet: &node as &dyn WalletDataSource,
Expand Down Expand Up @@ -101,42 +95,6 @@ pub fn generate_bootstrap_config_template(
let address = AddressEncoder::new(NetworkPrefix::Mainnet)
.parse_address_from_str("9hEQHEMyY1K1vs79vJXFtNjr2dbQbtWXF99oVWGJ5c4xbcLdBsw")?;

let refresh_contract_parameters = if !testnet {
RefreshContractParameters::default()
} else {
let default = RefreshContractParameters::default();
RefreshContractParameters {
p2s: NetworkAddress::new(NetworkPrefix::Testnet, &default.p2s.address()),
..default
}
};
let pool_contract_parameters = if !testnet {
PoolContractParameters::default()
} else {
let default = PoolContractParameters::default();
PoolContractParameters {
p2s: NetworkAddress::new(NetworkPrefix::Testnet, &default.p2s.address()),
..default
}
};
let update_contract_parameters = if !testnet {
UpdateContractParameters::default()
} else {
let default = UpdateContractParameters::default();
UpdateContractParameters {
p2s: NetworkAddress::new(NetworkPrefix::Testnet, &default.p2s.address()),
..default
}
};
let ballot_contract_parameters = if !testnet {
BallotContractParameters::default()
} else {
let default = BallotContractParameters::default();
BallotContractParameters {
p2s: NetworkAddress::new(NetworkPrefix::Testnet, &default.p2s.address()),
..default
}
};
let config = BootstrapConfig {
tokens_to_mint: TokensToMint {
pool_nft: NftMintDetails {
Expand Down Expand Up @@ -174,14 +132,20 @@ pub fn generate_bootstrap_config_template(
node_ip: "127.0.0.1".into(),
node_port: "9053".into(),
node_api_key: "hello".into(),
on_mainnet: !testnet,
refresh_contract_parameters,
pool_contract_parameters,
update_contract_parameters,
ballot_contract_parameters,
refresh_contract_parameters: RefreshContractParameters::default(),
pool_contract_parameters: PoolContractParameters::default(),
update_contract_parameters: UpdateContractParameters::default(),
ballot_contract_parameters: BallotContractParameters::default(),
};

let network_prefix = if testnet {
Comment thread
kettlebell marked this conversation as resolved.
Outdated
NetworkPrefix::Testnet
} else {
NetworkPrefix::Mainnet
};
let config_serde = BootstrapConfigSerde::from((config, network_prefix));

let s = serde_yaml::to_string(&config)?;
let s = serde_yaml::to_string(&config_serde)?;
let mut file = std::fs::File::create(&config_file_name)?;
file.write_all(s.as_bytes())?;
Ok(())
Expand Down Expand Up @@ -619,11 +583,8 @@ pub(crate) fn perform_bootstrap_chained_transaction(
}

/// An instance of this struct is created from an operator-provided YAML file.
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(
try_from = "crate::serde::BootstrapConfigSerde",
into = "crate::serde::BootstrapConfigSerde"
)]
#[derive(Debug, Clone, Deserialize)]
#[serde(try_from = "crate::serde::BootstrapConfigSerde")]
pub struct BootstrapConfig {
pub refresh_contract_parameters: RefreshContractParameters,
pub pool_contract_parameters: PoolContractParameters,
Expand All @@ -633,7 +594,6 @@ pub struct BootstrapConfig {
pub node_ip: String,
pub node_port: String,
pub node_api_key: String,
pub on_mainnet: bool,
pub addresses: Addresses,
}

Expand Down Expand Up @@ -745,7 +705,6 @@ pub(crate) mod tests {
let height = ctx.pre_header.height;
let secret = force_any_val::<DlogProverInput>();
let address = Address::P2Pk(secret.public_image());
let is_mainnet = address.content_bytes()[0] < NetworkPrefix::Testnet as u8;
let wallet = Wallet::from_secrets(vec![secret.clone().into()]);
let ergo_tree = address.script().unwrap();

Expand Down Expand Up @@ -806,7 +765,6 @@ pub(crate) mod tests {
node_ip: "127.0.0.1".into(),
node_port: "9053".into(),
node_api_key: "hello".into(),
on_mainnet: is_mainnet,
};

let height = ctx.pre_header.height;
Expand Down
17 changes: 6 additions & 11 deletions core/src/cli_commands/extract_reward_tokens.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use ergo_lib::{
ergotree_interpreter::sigma_protocol::prover::ContextExtension,
ergotree_ir::{
chain::{
address::{Address, AddressEncoder, AddressEncoderError, NetworkPrefix},
address::{Address, AddressEncoder, AddressEncoderError},
ergo_box::box_value::BoxValue,
token::Token,
},
Expand All @@ -27,7 +27,6 @@ use crate::{
box_kind::{make_oracle_box_candidate, OracleBox},
cli_commands::ergo_explorer_transaction_link,
node_interface::{current_block_height, get_wallet_status, sign_and_submit_transaction},
oracle_config::ORACLE_CONFIG,
oracle_state::{LocalDatapointBoxSource, OraclePool, StageError},
wallet::WalletDataSource,
};
Expand Down Expand Up @@ -66,24 +65,20 @@ pub fn extract_reward_tokens(
) -> Result<(), ExtractRewardTokensActionError> {
let op = OraclePool::new().unwrap();
if let Some(local_datapoint_box_source) = op.get_local_datapoint_box_source() {
let prefix = if ORACLE_CONFIG.on_mainnet {
NetworkPrefix::Mainnet
} else {
NetworkPrefix::Testnet
};
let rewards_destination =
AddressEncoder::new(prefix).parse_address_from_str(&rewards_destination_str)?;
AddressEncoder::unchecked_parse_network_address_from_str(&rewards_destination_str)?;
let network_prefix = rewards_destination.network();

let change_address_str = get_wallet_status()?
.change_address
.ok_or(ExtractRewardTokensActionError::NoChangeAddressSetInNode)?;

let change_address =
AddressEncoder::new(prefix).parse_address_from_str(&change_address_str)?;
AddressEncoder::new(network_prefix).parse_address_from_str(&change_address_str)?;
let (unsigned_tx, num_reward_tokens) = build_extract_reward_tokens_tx(
local_datapoint_box_source,
wallet,
rewards_destination,
rewards_destination.address(),
current_block_height()? as u32,
change_address,
)?;
Expand All @@ -98,7 +93,7 @@ pub fn extract_reward_tokens(
let tx_id_str = sign_and_submit_transaction(&unsigned_tx)?;
println!(
"Transaction made. Check status here: {}",
ergo_explorer_transaction_link(tx_id_str, prefix)
ergo_explorer_transaction_link(tx_id_str, network_prefix)
);
} else {
println!("Aborting the transaction.")
Expand Down
37 changes: 21 additions & 16 deletions core/src/cli_commands/prepare_update.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
use std::{convert::TryInto, io::Write};
use std::{
convert::{TryFrom, TryInto},
io::Write,
};

use derive_more::From;
use ergo_lib::{
Expand All @@ -8,7 +11,7 @@ use ergo_lib::{
},
ergotree_ir::{
chain::{
address::{Address, AddressEncoder, AddressEncoderError, NetworkPrefix},
address::{Address, AddressEncoder, AddressEncoderError},
ergo_box::{
box_value::{BoxValue, BoxValueError},
ErgoBox,
Expand Down Expand Up @@ -40,6 +43,7 @@ use crate::{
},
node_interface::{new_node_interface, SignTransaction, SubmitTransaction},
oracle_config::{OracleConfig, ORACLE_CONFIG},
serde::{OracleConfigSerde, SerdeConversionError, UpdateBootstrapConfigSerde},
wallet::WalletDataSource,
};

Expand All @@ -54,8 +58,7 @@ pub struct UpdateTokensToMint {
pub reward_tokens: Option<TokenMintDetails>,
}

#[derive(Clone, Deserialize)]
#[serde(try_from = "crate::serde::UpdateBootstrapConfigSerde")]
#[derive(Clone)]
pub struct UpdateBootstrapConfig {
pub pool_contract_parameters: Option<PoolContractParameters>, // New pool script, etc. Note that we don't actually mint any new pool NFT in the update step, instead this is simply passed to the new oracle config for convenience
pub refresh_contract_parameters: Option<RefreshContractParameters>,
Expand All @@ -66,20 +69,19 @@ pub struct UpdateBootstrapConfig {

pub fn prepare_update(config_file_name: String) -> Result<(), PrepareUpdateError> {
let s = std::fs::read_to_string(config_file_name)?;
let config: UpdateBootstrapConfig = serde_yaml::from_str(&s)?;
let config_serde: UpdateBootstrapConfigSerde = serde_yaml::from_str(&s)?;

let node_interface = new_node_interface();
let prefix = if ORACLE_CONFIG.on_mainnet {
NetworkPrefix::Mainnet
} else {
NetworkPrefix::Testnet
let (change_address, network_prefix) = {
let a = AddressEncoder::unchecked_parse_network_address_from_str(
&node_interface
.wallet_status()?
.change_address
.ok_or(PrepareUpdateError::NoChangeAddressSetInNode)?,
)?;
(a.address(), a.network())
};
let change_address = AddressEncoder::new(prefix).parse_address_from_str(
&node_interface
.wallet_status()?
.change_address
.ok_or(PrepareUpdateError::NoChangeAddressSetInNode)?,
)?;
let config = UpdateBootstrapConfig::try_from((config_serde, network_prefix))?;
let update_bootstrap_input = PrepareUpdateInput {
config: config.clone(),
wallet: &node_interface,
Expand All @@ -100,7 +102,8 @@ pub fn prepare_update(config_file_name: String) -> Result<(), PrepareUpdateError

info!("Update chain-transaction complete");
info!("Writing new config file to oracle_config_updated.yaml");
let s = serde_yaml::to_string(&new_config)?;
let config = OracleConfigSerde::from((new_config, network_prefix));
let s = serde_yaml::to_string(&config)?;
let mut file = std::fs::File::create("oracle_config_updated.yaml")?;
file.write_all(s.as_bytes())?;
info!("Updated oracle configuration file oracle_config_updated.yaml");
Expand Down Expand Up @@ -373,6 +376,8 @@ pub enum PrepareUpdateError {
NoOpUpgrade,
#[error("No mint details were provided for update/refresh contract in tokens_to_mint")]
NoMintDetails,
#[error("Serde conversion error {0}")]
SerdeConversion(SerdeConversionError),
}

#[cfg(test)]
Expand Down
17 changes: 6 additions & 11 deletions core/src/cli_commands/transfer_oracle_token.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use ergo_lib::{
ergotree_interpreter::sigma_protocol::prover::ContextExtension,
ergotree_ir::{
chain::{
address::{Address, AddressEncoder, AddressEncoderError, NetworkPrefix},
address::{Address, AddressEncoder, AddressEncoderError},
ergo_box::box_value::BoxValue,
},
serialization::SigmaParsingError,
Expand All @@ -26,7 +26,6 @@ use crate::{
box_kind::{make_oracle_box_candidate, OracleBox},
cli_commands::ergo_explorer_transaction_link,
node_interface::{current_block_height, get_wallet_status, sign_and_submit_transaction},
oracle_config::ORACLE_CONFIG,
oracle_state::{LocalDatapointBoxSource, OraclePool, StageError},
wallet::WalletDataSource,
};
Expand Down Expand Up @@ -65,24 +64,20 @@ pub fn transfer_oracle_token(
) -> Result<(), TransferOracleTokenActionError> {
let op = OraclePool::new().unwrap();
if let Some(local_datapoint_box_source) = op.get_local_datapoint_box_source() {
let prefix = if ORACLE_CONFIG.on_mainnet {
NetworkPrefix::Mainnet
} else {
NetworkPrefix::Testnet
};
let rewards_destination =
AddressEncoder::new(prefix).parse_address_from_str(&rewards_destination_str)?;
AddressEncoder::unchecked_parse_network_address_from_str(&rewards_destination_str)?;
let network_prefix = rewards_destination.network();

let change_address_str = get_wallet_status()?
.change_address
.ok_or(TransferOracleTokenActionError::NoChangeAddressSetInNode)?;

let change_address =
AddressEncoder::new(prefix).parse_address_from_str(&change_address_str)?;
AddressEncoder::new(network_prefix).parse_address_from_str(&change_address_str)?;
Comment thread
kettlebell marked this conversation as resolved.
Outdated
let unsigned_tx = build_transfer_oracle_token_tx(
local_datapoint_box_source,
wallet,
rewards_destination,
rewards_destination.address(),
current_block_height()? as u32,
change_address,
)?;
Expand All @@ -97,7 +92,7 @@ pub fn transfer_oracle_token(
let tx_id_str = sign_and_submit_transaction(&unsigned_tx)?;
println!(
"Transaction made. Check status here: {}",
ergo_explorer_transaction_link(tx_id_str, prefix)
ergo_explorer_transaction_link(tx_id_str, network_prefix)
);
} else {
println!("Aborting the transaction.")
Expand Down
Loading