use std::ops::Deref;
use alloy::primitives::Address;
use crate::{Token, TokenId};
use super::{Entry, StoreIter};
pub trait TokenStore<'a>: Sized {
type Item: Deref<Target = Token>;
fn get(&'a self, chain_id: u64, id: TokenId) -> Option<Self::Item>;
fn get_mut(&mut self, chain_id: u64, id: TokenId) -> Option<&mut Token>;
fn insert(&mut self, chain_id: u64, token: Token);
fn contains(&self, chain_id: u64, id: TokenId) -> bool;
fn symbols(&'a self, chain_id: Option<u64>) -> Vec<String>;
fn addresses(&'a self, chain_id: Option<u64>) -> Vec<Address>;
fn entry(&'a mut self, chain_id: u64, id: TokenId) -> Entry<'a, Self> {
Entry::new(chain_id, id, self)
}
fn iter(&'a self, chain_id: u64) -> StoreIter<'a, Self> {
StoreIter::new(self, chain_id)
}
#[cfg(feature = "known-tokens")]
fn insert_known_tokens(&mut self, chain_id: u64) {
use crate::{arbitrum, mainnet};
if chain_id == 1 {
self.insert(chain_id, mainnet::WETH.to_owned());
self.insert(chain_id, mainnet::WBTC.to_owned());
self.insert(chain_id, mainnet::USDC.to_owned());
self.insert(chain_id, mainnet::USDT.to_owned());
self.insert(chain_id, mainnet::DAI.to_owned());
} else if chain_id == 42161 {
self.insert(chain_id, arbitrum::WETH.to_owned());
self.insert(chain_id, arbitrum::USDC.to_owned());
self.insert(chain_id, arbitrum::USDT.to_owned());
}
}
}