redgold-schema 0.1.48

Decentralized Portfolio Contracts & Data Lake
Documentation
use crate::structs::{Address, CurrencyAmount, DepositRequest, Output, PortfolioFulfillmentParams, PortfolioRequest, PortfolioWeighting, StakeDeposit, StakeRequest, StandardData, StandardRequest, SupportedCurrency, Weighting};
use crate::tx::tx_builder::TransactionBuilder;
use crate::structs;
use itertools::Itertools;

impl TransactionBuilder {

    pub fn with_portfolio_request(
        &mut self,
        weights: Vec<(SupportedCurrency, f64)>,
        redgold_to_party_payment_amount: &CurrencyAmount,
        party_address: &Address,
        name: &String
    ) -> Self {
        let updated = self.with_output(party_address, redgold_to_party_payment_amount);
        let mut pr = PortfolioRequest::default();
        let transformed_weights = weights.into_iter().map(|(c, w)| {
            let mut wee = PortfolioWeighting::default();
            let w2 = Weighting::from_float(w);
            wee.weight = Some(w2);
            wee.currency = Some(c as i32);
            wee
        }).collect_vec();
        let mut pi = crate::structs::PortfolioInfo::default();
        pi.portfolio_weightings = transformed_weights;
        pr.portfolio_info = Some(pi);
        let mut o = Output::default();
        o.address = updated.input_addresses.clone().get(0).cloned();
        let mut data = StandardData::default();
        let mut req = StandardRequest::default();

        let mut pid = structs::PortfolioId::default();
        pid.name = Some(name.clone());
        pr.portfolio_id = Some(pid);
        req.portfolio_request = Some(pr);
        data.standard_request = Some(req);
        o.data = Some(data);
        updated.transaction.outputs.push(o);
        updated.clone()
    }

    pub fn with_portfolio_stake_fullfillment(&mut self,
                                             stake_control_address: &Address,
                                             external_address: &Address,
                                             external_amount: &CurrencyAmount,
                                             pool_address: &Address,
                                             pool_fee: &CurrencyAmount,
    ) -> &mut Self {
        self.with_output(pool_address, pool_fee);
        self.with_last_output_stake();
        let mut o = Output::default();
        o.address = Some(stake_control_address.clone());
        let mut d = StandardData::default();
        let mut lq = StakeRequest::default();
        let mut deposit = StakeDeposit::default();
        deposit.portfolio_fulfillment_params = Some(PortfolioFulfillmentParams::default());
        let mut dr = DepositRequest::default();
        let mut external = external_address.clone();
        external.mark_external();
        dr.address = Some(external);
        dr.amount = Some(external_amount.clone());
        deposit.deposit = Some(dr);
        lq.deposit = Some(deposit);

        let mut sr = StandardRequest::default();
        sr.stake_request = Some(lq);
        d.standard_request = Some(sr);
        o.data = Some(d);
        self.transaction.outputs.push(o);
        self
    }

}