From 006c0000a6e8d44ba0397e9ee7051e6905c80e42 Mon Sep 17 00:00:00 2001 From: Alexander Chepurnoy Date: Sun, 19 Nov 2023 21:44:56 +0300 Subject: [PATCH 1/4] dev_reward_ergo_tree_bytes added --- core/src/pool_config.rs | 2 ++ core/src/serde.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/core/src/pool_config.rs b/core/src/pool_config.rs index 33312579..94e5bdc3 100644 --- a/core/src/pool_config.rs +++ b/core/src/pool_config.rs @@ -49,6 +49,7 @@ pub struct PoolConfig { pub ballot_box_wrapper_inputs: BallotBoxWrapperInputs, pub token_ids: TokenIds, pub buyback_token_id: Option, + pub dev_reward_ergo_tree_bytes: Option } #[derive(serde::Serialize, serde::Deserialize, Debug, Copy, Clone)] @@ -153,6 +154,7 @@ impl PoolConfig { update_box_wrapper_inputs, token_ids, buyback_token_id: None, + dev_reward_ergo_tree_bytes: None, }) } diff --git a/core/src/serde.rs b/core/src/serde.rs index ba666a47..6a8f0af3 100644 --- a/core/src/serde.rs +++ b/core/src/serde.rs @@ -43,6 +43,7 @@ pub(crate) struct PoolConfigSerde { ballot_contract_parameters: BallotContractParametersSerde, token_ids: TokenIds, buyback_token_id: Option, + dev_reward_ergo_tree_bytes: Option, } #[derive(Debug, Error)] @@ -109,6 +110,7 @@ impl From for PoolConfigSerde { token_ids: c.token_ids, data_point_source: c.data_point_source, buyback_token_id: c.buyback_token_id, + dev_reward_ergo_tree_bytes: c.dev_reward_ergo_tree_bytes, } } } @@ -212,6 +214,7 @@ impl TryFrom for PoolConfig { ballot_box_wrapper_inputs, token_ids: c.token_ids, buyback_token_id: c.buyback_token_id, + dev_reward_ergo_tree_bytes: c.dev_reward_ergo_tree_bytes, }) } } From 371d8e7e01c30e3691fcc0a1301b9e7a3b7c399a Mon Sep 17 00:00:00 2001 From: Alexander Chepurnoy Date: Mon, 20 Nov 2023 01:17:19 +0300 Subject: [PATCH 2/4] creating out with dev reward --- core/src/pool_commands.rs | 1 + core/src/pool_commands/refresh.rs | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/src/pool_commands.rs b/core/src/pool_commands.rs index f992854c..4c3b7a4e 100644 --- a/core/src/pool_commands.rs +++ b/core/src/pool_commands.rs @@ -120,6 +120,7 @@ pub fn build_action( change_address, &oracle_public_key, op.get_buyback_box_source(), + POOL_CONFIG.dev_reward_ergo_tree_bytes.clone(), ) .map_err(Into::into) .map(|(action, report)| (action.into(), report.into())), diff --git a/core/src/pool_commands/refresh.rs b/core/src/pool_commands/refresh.rs index f4393926..5c4c2ff8 100644 --- a/core/src/pool_commands/refresh.rs +++ b/core/src/pool_commands/refresh.rs @@ -23,7 +23,10 @@ use crate::spec_token::SpecToken; use crate::wallet::WalletDataError; use crate::wallet::WalletDataSource; +use ergo_lib::ergotree_ir::serialization::SigmaSerializable; +use ergo_lib::chain::ergo_box::box_builder::ErgoBoxCandidateBuilder; use ergo_lib::chain::ergo_box::box_builder::ErgoBoxCandidateBuilderError; +use ergo_lib::ergotree_ir::ergo_tree::ErgoTree; use ergo_lib::ergo_chain_types::EcPoint; use ergo_lib::ergotree_interpreter::sigma_protocol::prover::ContextExtension; use ergo_lib::ergotree_ir::chain::address::Address; @@ -75,6 +78,7 @@ pub fn build_refresh_action( change_address: Address, my_oracle_pk: &EcPoint, buyback_box_source: Option<&dyn BuybackBoxSource>, + dev_reward_ergo_tree_bytes: Option, ) -> Result<(RefreshAction, RefreshActionReport), RefreshActionError> { let tx_fee = *BASE_FEE; let in_pool_box = pool_box_source.get_pool_box()?; @@ -175,6 +179,23 @@ pub fn build_refresh_action( input_boxes.append(selection.boxes.as_vec().clone().as_mut()); output_candidates.append(&mut out_oracle_boxes); + match dev_reward_ergo_tree_bytes { + // The division was valid + Some(tbs) => { + let tb = base16::decode(tbs.as_str()).unwrap(); + let t: ErgoTree = ErgoTree::sigma_parse_bytes(tb.as_slice()).unwrap(); + let mut builder = ErgoBoxCandidateBuilder::new(*BASE_FEE, t, height.0); + let mut dev_reward_token = in_pool_box.reward_token(); + dev_reward_token.amount = TokenAmount::try_from((valid_in_oracle_boxes.len() as u64) - (1 as u64)).unwrap(); + builder.add_token(dev_reward_token.into()); + let devout = builder.build().unwrap(); + output_candidates.push(devout); + }, + + // The division was invalid + None => {} + } + let box_selection = BoxSelection { boxes: input_boxes.clone().try_into().unwrap(), change_boxes: selection.change_boxes, @@ -339,9 +360,8 @@ fn build_out_oracle_boxes( .map(|in_ob| { let mut reward_token_new = in_ob.reward_token(); reward_token_new.amount = if &in_ob.public_key() == my_public_key { - let increment: TokenAmount = - // additional 1 reward token per collected oracle box goes to the collector - (1 + valid_oracle_boxes.len() as u64).try_into().unwrap(); + // 2 reward tokens per collected oracle box goes to the collector + let increment: TokenAmount = (2 as u64).try_into().unwrap(); reward_token_new.amount.checked_add(&increment).unwrap() } else { reward_token_new @@ -585,6 +605,7 @@ mod tests { change_address.address(), &oracle_pub_key, None, + None, ) .unwrap(); @@ -632,6 +653,7 @@ mod tests { change_address.address(), &oracle_pub_key, None, + None, ); dbg!(&wrong_epoch_res); assert!(matches!( @@ -681,6 +703,7 @@ mod tests { change_address.address(), &oracle_pub_key, Some(&buyback_source), + None, ) .unwrap(); From 8dd2f487b0d8140a0c11585fbec6c5dc319a9156 Mon Sep 17 00:00:00 2001 From: Alexander Chepurnoy Date: Wed, 6 Dec 2023 21:58:24 +0300 Subject: [PATCH 3/4] idea added to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0054e0c9..3ee24bb9 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ oracle-config.yaml /.vim/ /oracles/ /.vscode/ +/.idea/ \ No newline at end of file From f285c02c82c65d5146c9a158185ce4e57c5d3ab9 Mon Sep 17 00:00:00 2001 From: Alexander Chepurnoy Date: Sat, 30 Mar 2024 21:01:44 +0300 Subject: [PATCH 4/4] working extraction of gort to dev reward contract --- .gitignore | 10 +++++- core/src/box_kind.rs | 2 ++ core/src/box_kind/buyback_box.rs | 11 +++--- core/src/box_kind/devreward_box.rs | 49 +++++++++++++++++++++++++ core/src/oracle_state.rs | 42 ++++++++++++++++++++-- core/src/pool_commands.rs | 2 +- core/src/pool_commands/refresh.rs | 57 ++++++++++++++++++------------ core/src/pool_config.rs | 5 +-- core/src/scans/registry.rs | 15 +++++++- core/src/serde.rs | 8 ++--- core/src/spec_token.rs | 12 +++++++ 11 files changed, 174 insertions(+), 39 deletions(-) create mode 100644 core/src/box_kind/devreward_box.rs diff --git a/.gitignore b/.gitignore index 3ee24bb9..0c5aa83e 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,12 @@ oracle-config.yaml /.vim/ /oracles/ /.vscode/ -/.idea/ \ No newline at end of file +/.idea/ +/bootstrap.yaml +/oracle_config.yaml +/pool_config.yaml +/pool_config_updated.yaml +/prepare_update_conf.yaml +/prepare_update_conf.yaml.bk +/rustup +/send.sh diff --git a/core/src/box_kind.rs b/core/src/box_kind.rs index 239536b6..be873dc4 100644 --- a/core/src/box_kind.rs +++ b/core/src/box_kind.rs @@ -4,6 +4,7 @@ mod oracle_box; mod pool_box; mod refresh_box; mod update_box; +mod devreward_box; pub use ballot_box::*; pub use buyback_box::*; @@ -11,3 +12,4 @@ pub use oracle_box::*; pub use pool_box::*; pub use refresh_box::*; pub use update_box::*; +pub use devreward_box::*; diff --git a/core/src/box_kind/buyback_box.rs b/core/src/box_kind/buyback_box.rs index cfda19f5..90fcc553 100644 --- a/core/src/box_kind/buyback_box.rs +++ b/core/src/box_kind/buyback_box.rs @@ -43,23 +43,22 @@ impl BuybackBoxWrapper { } pub fn new_without_reward_token(&self) -> ErgoBoxCandidate { - // take only buyback nft - let tokens = vec![self + // take only buyback nft - todo: 1 gort should remain as well + let tokens_vec = vec![self .ergo_box .tokens .as_ref() .unwrap() .get(0) .unwrap() - .clone()] - .try_into() - .unwrap(); + .clone()]; + let tokens = tokens_vec.try_into().unwrap(); ErgoBoxCandidate { value: self.ergo_box.value, ergo_tree: self.ergo_box.ergo_tree.clone(), tokens: Some(tokens), additional_registers: self.ergo_box.additional_registers.clone(), - creation_height: self.ergo_box.creation_height, + creation_height: self.ergo_box.creation_height, // todo: should be increased!!! } } } diff --git a/core/src/box_kind/devreward_box.rs b/core/src/box_kind/devreward_box.rs new file mode 100644 index 00000000..0983980d --- /dev/null +++ b/core/src/box_kind/devreward_box.rs @@ -0,0 +1,49 @@ + +use ergo_lib::ergotree_ir::chain::ergo_box::{BoxTokens, ErgoBoxCandidate}; +use ergo_lib::ergotree_ir::chain::ergo_box::ErgoBox; +use thiserror::Error; +use ergo_lib::ergotree_ir::chain::token::Token; + +use crate::spec_token::RewardTokenId; +use crate::TokenAmount; + +#[derive(Debug, Error)] +pub enum DevRewardBoxError {} + +#[derive(Debug, Clone)] +pub struct DevRewardBoxWrapper { + ergo_box: ErgoBox, + reward_token_id: RewardTokenId, +} + + +#[allow(clippy::todo)] +impl DevRewardBoxWrapper { + pub fn new(ergo_box: ErgoBox, reward_token_id: RewardTokenId) -> Self { + Self { + ergo_box, + reward_token_id, + } + } + + pub fn get_box(&self) -> &ErgoBox { + &self.ergo_box + } + + pub fn add_reward_tokens(&self, to_add: TokenAmount, height: u32) -> ErgoBoxCandidate { + let tokens_vec = self.ergo_box.tokens.as_ref().unwrap(); + let reward_token = tokens_vec.get(1).unwrap().clone(); + let upd_amt: TokenAmount = (reward_token.amount.as_u64() + to_add.as_u64()).try_into().unwrap(); + let upd_token: Token = (reward_token.token_id, upd_amt).into(); + + let tokens: BoxTokens = vec![tokens_vec.get(0).unwrap().clone(), upd_token].try_into().unwrap(); + + ErgoBoxCandidate { + value: self.ergo_box.value, + ergo_tree: self.ergo_box.ergo_tree.clone(), + tokens: Some(tokens), + additional_registers: self.ergo_box.additional_registers.clone(), + creation_height: height, + } + } +} diff --git a/core/src/oracle_state.rs b/core/src/oracle_state.rs index c4c8fd2c..5a235942 100644 --- a/core/src/oracle_state.rs +++ b/core/src/oracle_state.rs @@ -3,7 +3,7 @@ use crate::box_kind::{ BuybackBoxWrapper, CollectedOracleBox, OracleBox, OracleBoxError, OracleBoxWrapper, OracleBoxWrapperInputs, PoolBox, PoolBoxError, PoolBoxWrapper, PoolBoxWrapperInputs, PostedOracleBox, RefreshBoxError, RefreshBoxWrapper, RefreshBoxWrapperInputs, UpdateBoxError, - UpdateBoxWrapper, UpdateBoxWrapperInputs, VoteBallotBoxWrapper, + UpdateBoxWrapper, UpdateBoxWrapperInputs, VoteBallotBoxWrapper, DevRewardBoxWrapper, }; use crate::datapoint_source::DataPointSourceError; use crate::oracle_config::ORACLE_CONFIG; @@ -12,7 +12,7 @@ use crate::pool_config::POOL_CONFIG; use crate::scans::{GenericTokenScan, NodeScanRegistry, ScanError, ScanGetBoxes}; use crate::spec_token::{ BallotTokenId, BuybackTokenId, OracleTokenId, PoolTokenId, RefreshTokenId, RewardTokenId, - TokenIdKind, UpdateTokenId, + TokenIdKind, UpdateTokenId, DevRewardTokenId }; use crate::util::get_token_count; use anyhow::Error; @@ -87,6 +87,11 @@ pub trait BuybackBoxSource { fn get_buyback_box(&self) -> Result>; } +pub trait DevRewardBoxSource { + fn get_dev_reward_box(&self) -> Result>; +} + + /// Overarching struct which allows for acquiring the state of the whole oracle pool protocol #[derive(Debug)] pub struct OraclePool { @@ -98,6 +103,7 @@ pub struct OraclePool { ballot_boxes_scan: BallotBoxesScan, update_box_scan: UpdateBoxScan, buyback_box_scan: Option, + dev_reward_box_scan: Option, } #[derive(Debug)] @@ -150,6 +156,13 @@ pub struct BuybackBoxScan { reward_token_id: RewardTokenId, } +#[derive(Debug)] +pub struct DevRewardBoxScan { + scan: GenericTokenScan, + reward_token_id: RewardTokenId, +} + + /// The state of the oracle pool when it is in the Live Epoch stage #[derive(Debug, Clone)] pub struct LiveEpochState { @@ -223,6 +236,15 @@ impl OraclePool { reward_token_id: pool_config.token_ids.reward_token_id.clone(), }); + let dev_reward_box_scan = + node_scan_registry + .dev_reward_token_scan + .clone() + .map(|scan| DevRewardBoxScan { + scan, + reward_token_id: pool_config.token_ids.reward_token_id.clone(), + }); + log::debug!("Scans loaded"); Ok(OraclePool { @@ -234,6 +256,7 @@ impl OraclePool { refresh_box_scan, update_box_scan, buyback_box_scan, + dev_reward_box_scan, }) } @@ -312,6 +335,12 @@ impl OraclePool { .map(|b| b as &dyn BuybackBoxSource) } + pub fn get_dev_reward_box_source(&self) -> Option<&dyn DevRewardBoxSource> { + self.dev_reward_box_scan + .as_ref() + .map(|b| b as &dyn DevRewardBoxSource) + } + pub fn get_total_oracle_token_count(&self) -> Result { Ok(self .oracle_datapoint_scan @@ -442,3 +471,12 @@ impl BuybackBoxSource for BuybackBoxScan { .map(|ergo_box| BuybackBoxWrapper::new(ergo_box, self.reward_token_id.clone()))) } } + +impl DevRewardBoxSource for DevRewardBoxScan { + fn get_dev_reward_box(&self) -> Result> { + Ok(self + .scan + .get_box()? + .map(|ergo_box| DevRewardBoxWrapper::new(ergo_box, self.reward_token_id.clone()))) + } +} diff --git a/core/src/pool_commands.rs b/core/src/pool_commands.rs index 4c3b7a4e..36cd474d 100644 --- a/core/src/pool_commands.rs +++ b/core/src/pool_commands.rs @@ -120,7 +120,7 @@ pub fn build_action( change_address, &oracle_public_key, op.get_buyback_box_source(), - POOL_CONFIG.dev_reward_ergo_tree_bytes.clone(), + op.get_dev_reward_box_source() ) .map_err(Into::into) .map(|(action, report)| (action.into(), report.into())), diff --git a/core/src/pool_commands/refresh.rs b/core/src/pool_commands/refresh.rs index 5c4c2ff8..9f407c84 100644 --- a/core/src/pool_commands/refresh.rs +++ b/core/src/pool_commands/refresh.rs @@ -10,6 +10,7 @@ use crate::box_kind::RefreshBox; use crate::box_kind::RefreshBoxWrapper; use crate::oracle_config::BASE_FEE; use crate::oracle_state::BuybackBoxSource; +use crate::oracle_state::DevRewardBoxSource; use crate::oracle_state::DataSourceError; use crate::oracle_state::PoolBoxSource; use crate::oracle_state::PostedDatapointBoxesSource; @@ -23,10 +24,7 @@ use crate::spec_token::SpecToken; use crate::wallet::WalletDataError; use crate::wallet::WalletDataSource; -use ergo_lib::ergotree_ir::serialization::SigmaSerializable; -use ergo_lib::chain::ergo_box::box_builder::ErgoBoxCandidateBuilder; use ergo_lib::chain::ergo_box::box_builder::ErgoBoxCandidateBuilderError; -use ergo_lib::ergotree_ir::ergo_tree::ErgoTree; use ergo_lib::ergo_chain_types::EcPoint; use ergo_lib::ergotree_interpreter::sigma_protocol::prover::ContextExtension; use ergo_lib::ergotree_ir::chain::address::Address; @@ -78,7 +76,7 @@ pub fn build_refresh_action( change_address: Address, my_oracle_pk: &EcPoint, buyback_box_source: Option<&dyn BuybackBoxSource>, - dev_reward_ergo_tree_bytes: Option, + dev_reward_box_source: Option<&dyn DevRewardBoxSource> ) -> Result<(RefreshAction, RefreshActionReport), RefreshActionError> { let tx_fee = *BASE_FEE; let in_pool_box = pool_box_source.get_pool_box()?; @@ -125,6 +123,11 @@ pub fn build_refresh_action( .transpose()? .flatten(); + let in_dev_reward_box_opt = dev_reward_box_source + .map(|s| s.get_dev_reward_box()) + .transpose()? + .flatten(); + let unspent_boxes = wallet.get_unspent_wallet_boxes()?; let box_selector = SimpleBoxSelector::new(); let selection = box_selector.select(unspent_boxes, tx_fee, &[])?; @@ -175,26 +178,26 @@ pub fn build_refresh_action( log::debug!("No reward tokens in buyback box"); } }; + input_boxes.append(&mut valid_in_oracle_raw_boxes); input_boxes.append(selection.boxes.as_vec().clone().as_mut()); output_candidates.append(&mut out_oracle_boxes); - match dev_reward_ergo_tree_bytes { - // The division was valid - Some(tbs) => { - let tb = base16::decode(tbs.as_str()).unwrap(); - let t: ErgoTree = ErgoTree::sigma_parse_bytes(tb.as_slice()).unwrap(); - let mut builder = ErgoBoxCandidateBuilder::new(*BASE_FEE, t, height.0); - let mut dev_reward_token = in_pool_box.reward_token(); - dev_reward_token.amount = TokenAmount::try_from((valid_in_oracle_boxes.len() as u64) - (1 as u64)).unwrap(); - builder.add_token(dev_reward_token.into()); - let devout = builder.build().unwrap(); - output_candidates.push(devout); - }, - - // The division was invalid - None => {} - } + + let mut dev_reward_in_position: i16 = -1; + let mut dev_reward_out_position: i16 = -1; + + if let Some(dev_reward_box) = in_dev_reward_box_opt { + log::info!("Found dev reward box id {:?}", dev_reward_box.get_box().box_id()); + println!("here 1"); + input_boxes.push(dev_reward_box.get_box().clone()); + dev_reward_in_position = (input_boxes.len() as i16) - 1; + let dev_reward_amount = TokenAmount::try_from((valid_in_oracle_boxes.len() as u64) - (1 as u64)).unwrap(); + let out_dev_reward_box = dev_reward_box.add_reward_tokens(dev_reward_amount, height.0); + output_candidates.push(out_dev_reward_box); + dev_reward_out_position = (output_candidates.len() as i16) - 1; + println!("here 2"); + }; let box_selection = BoxSelection { boxes: input_boxes.clone().try_into().unwrap(), @@ -217,12 +220,22 @@ pub fn build_refresh_action( .iter() .enumerate() .for_each(|(idx, ob)| { - let outindex = (idx as i32 + 2).into(); // first two output boxes are pool box and refresh box + let outindex = (idx as i32 + 2).into(); // first two output boxes are pool box and refresh box // todo: buyback fix let ob_ctx_ext = ContextExtension { values: vec![(0, outindex)].into_iter().collect(), }; b.set_context_extension(ob.get_box().box_id(), ob_ctx_ext); }); + + if (dev_reward_in_position > -1) { + let box_id = input_boxes.get(dev_reward_in_position as usize).unwrap().box_id(); + let ctx_ext = ContextExtension { + values: vec![(0 as u8, dev_reward_out_position.into()), + (1 as u8, (0 as i8).into())].into_iter().collect(), + }; + b.set_context_extension(box_id, ctx_ext); + } + let tx = b.build()?; let report = RefreshActionReport { oracle_boxes_collected: valid_in_oracle_boxes @@ -703,7 +716,7 @@ mod tests { change_address.address(), &oracle_pub_key, Some(&buyback_source), - None, + None ) .unwrap(); diff --git a/core/src/pool_config.rs b/core/src/pool_config.rs index 94e5bdc3..1b2c5c97 100644 --- a/core/src/pool_config.rs +++ b/core/src/pool_config.rs @@ -26,6 +26,7 @@ use crate::spec_token::PoolTokenId; use crate::spec_token::RefreshTokenId; use crate::spec_token::RewardTokenId; use crate::spec_token::UpdateTokenId; +use crate::spec_token::DevRewardTokenId; pub const DEFAULT_POOL_CONFIG_FILE_NAME: &str = "pool_config.yaml"; pub static POOL_CONFIG_FILE_PATH: sync::OnceCell = sync::OnceCell::new(); @@ -49,7 +50,7 @@ pub struct PoolConfig { pub ballot_box_wrapper_inputs: BallotBoxWrapperInputs, pub token_ids: TokenIds, pub buyback_token_id: Option, - pub dev_reward_ergo_tree_bytes: Option + pub dev_reward_token_id: Option } #[derive(serde::Serialize, serde::Deserialize, Debug, Copy, Clone)] @@ -154,7 +155,7 @@ impl PoolConfig { update_box_wrapper_inputs, token_ids, buyback_token_id: None, - dev_reward_ergo_tree_bytes: None, + dev_reward_token_id: None, }) } diff --git a/core/src/scans/registry.rs b/core/src/scans/registry.rs index a99a71af..fcc02111 100644 --- a/core/src/scans/registry.rs +++ b/core/src/scans/registry.rs @@ -9,6 +9,7 @@ use crate::spec_token::OracleTokenId; use crate::spec_token::PoolTokenId; use crate::spec_token::RefreshTokenId; use crate::spec_token::UpdateTokenId; +use crate::spec_token::DevRewardTokenId; use crate::oracle_config::ORACLE_CONFIG; use ::serde::Deserialize; @@ -39,6 +40,7 @@ pub struct NodeScanRegistry { #[serde(rename = "Update Box Scan")] pub update_token_scan: GenericTokenScan, pub buyback_token_scan: Option>, + pub dev_reward_token_scan: Option>, } impl NodeScanRegistry { @@ -79,6 +81,12 @@ impl NodeScanRegistry { } else { None }; + let dev_reward_token_scan = + if let Some(dev_reward_token_id) = pool_config.dev_reward_token_id.clone() { + Some(GenericTokenScan::register(node_api, &dev_reward_token_id)?) + } else { + None + }; let registry = Self { oracle_token_scan, pool_token_scan, @@ -86,6 +94,7 @@ impl NodeScanRegistry { refresh_token_scan, update_token_scan, buyback_token_scan, + dev_reward_token_scan }; registry.save_to_json_file(&get_scans_file_path())?; node_api.rescan_from_height(ORACLE_CONFIG.scan_start_height)?; @@ -230,6 +239,7 @@ mod tests { refresh_token_scan: GenericTokenScan::new(ScanId::from(188)), update_token_scan: GenericTokenScan::new(ScanId::from(186)), buyback_token_scan: None, + dev_reward_token_scan: None }; let json_str = registry.save_to_json_str(); expect_json( @@ -241,7 +251,8 @@ mod tests { "Ballot Box Scan": "191", "Refresh Box Scan": "188", "Update Box Scan": "186", - "buyback_token_scan": null + "buyback_token_scan": null, + "dev_reward_token_scan": null }"#]], ); } @@ -255,6 +266,7 @@ mod tests { refresh_token_scan: GenericTokenScan::new(ScanId::from(188)), update_token_scan: GenericTokenScan::new(ScanId::from(186)), buyback_token_scan: None, + dev_reward_token_scan: None }; let json_str = registry.save_to_json_str(); let registry2 = NodeScanRegistry::load_from_json_str(&json_str).unwrap(); @@ -270,6 +282,7 @@ mod tests { refresh_token_scan: GenericTokenScan::new(ScanId::from(188)), update_token_scan: GenericTokenScan::new(ScanId::from(186)), buyback_token_scan: Some(GenericTokenScan::new(ScanId::from(192))), + dev_reward_token_scan: Some(GenericTokenScan::new(ScanId::from(194))), }; let json_str = registry.save_to_json_str(); let registry2 = NodeScanRegistry::load_from_json_str(&json_str).unwrap(); diff --git a/core/src/serde.rs b/core/src/serde.rs index 6a8f0af3..5a9bd052 100644 --- a/core/src/serde.rs +++ b/core/src/serde.rs @@ -30,7 +30,7 @@ use crate::{ }, oracle_types::{EpochLength, MinDatapoints}, pool_config::{PoolConfig, PoolConfigError, PredefinedDataPointSource, TokenIds}, - spec_token::{BuybackTokenId, TokenIdKind}, + spec_token::{BuybackTokenId, DevRewardTokenId, TokenIdKind}, }; #[derive(Debug, Clone, Deserialize, Serialize)] @@ -43,7 +43,7 @@ pub(crate) struct PoolConfigSerde { ballot_contract_parameters: BallotContractParametersSerde, token_ids: TokenIds, buyback_token_id: Option, - dev_reward_ergo_tree_bytes: Option, + dev_reward_token_id: Option, } #[derive(Debug, Error)] @@ -110,7 +110,7 @@ impl From for PoolConfigSerde { token_ids: c.token_ids, data_point_source: c.data_point_source, buyback_token_id: c.buyback_token_id, - dev_reward_ergo_tree_bytes: c.dev_reward_ergo_tree_bytes, + dev_reward_token_id: c.dev_reward_token_id, } } } @@ -214,7 +214,7 @@ impl TryFrom for PoolConfig { ballot_box_wrapper_inputs, token_ids: c.token_ids, buyback_token_id: c.buyback_token_id, - dev_reward_ergo_tree_bytes: c.dev_reward_ergo_tree_bytes, + dev_reward_token_id: c.dev_reward_token_id, }) } } diff --git a/core/src/spec_token.rs b/core/src/spec_token.rs index 5d5d7827..35797dda 100644 --- a/core/src/spec_token.rs +++ b/core/src/spec_token.rs @@ -122,3 +122,15 @@ impl TokenIdKind for BuybackTokenId { Self(token) } } + +#[derive(Serialize, Deserialize, Eq, PartialEq, Clone, Debug)] +#[serde(transparent)] +pub struct DevRewardTokenId(TokenId); +impl TokenIdKind for DevRewardTokenId { + fn token_id(&self) -> TokenId { + self.0 + } + fn from_token_id_unchecked(token: TokenId) -> Self { + Self(token) + } +}