1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
pub use serai_abi::genesis_liquidity::primitives;
use primitives::{Values, LiquidityAmount};

use serai_abi::primitives::*;

use sp_core::sr25519::Signature;

use scale::Encode;

use crate::{Serai, SeraiError, TemporalSerai, Transaction};

pub type GenesisLiquidityEvent = serai_abi::genesis_liquidity::Event;

const PALLET: &str = "GenesisLiquidity";

#[derive(Clone, Copy)]
pub struct SeraiGenesisLiquidity<'a>(pub(crate) &'a TemporalSerai<'a>);
impl<'a> SeraiGenesisLiquidity<'a> {
  pub async fn events(&self) -> Result<Vec<GenesisLiquidityEvent>, SeraiError> {
    self
      .0
      .events(|event| {
        if let serai_abi::Event::GenesisLiquidity(event) = event {
          Some(event.clone())
        } else {
          None
        }
      })
      .await
  }

  pub fn oraclize_values(values: Values, signature: Signature) -> Transaction {
    Serai::unsigned(serai_abi::Call::GenesisLiquidity(
      serai_abi::genesis_liquidity::Call::oraclize_values { values, signature },
    ))
  }

  pub fn remove_coin_liquidity(balance: ExternalBalance) -> serai_abi::Call {
    serai_abi::Call::GenesisLiquidity(serai_abi::genesis_liquidity::Call::remove_coin_liquidity {
      balance,
    })
  }

  pub async fn liquidity(
    &self,
    address: &SeraiAddress,
    coin: ExternalCoin,
  ) -> Result<LiquidityAmount, SeraiError> {
    Ok(
      self
        .0
        .storage(
          PALLET,
          "Liquidity",
          (coin, sp_core::hashing::blake2_128(&address.encode()), &address.0),
        )
        .await?
        .unwrap_or(LiquidityAmount::zero()),
    )
  }

  pub async fn supply(&self, coin: ExternalCoin) -> Result<LiquidityAmount, SeraiError> {
    Ok(self.0.storage(PALLET, "Supply", coin).await?.unwrap_or(LiquidityAmount::zero()))
  }

  pub async fn genesis_complete_block(&self) -> Result<Option<u64>, SeraiError> {
    self.0.storage(PALLET, "GenesisCompleteBlock", ()).await
  }
}