pub use crate::generic_proxy::GenericProxyDeployConfig as EvalShopDeployConfig;
use crate::generic_proxy::{
GenericProxyContract,
GenericProxyDeployment,
};
use anyhow::{
Context,
Result,
};
use fuels::prelude::*;
abigen!(Contract(
name = "EvalShopContract",
abi = "artifacts/eval-shop/eval-shop-abi.json"
));
pub const DEFAULT_ADMIN_ROLE: u64 = 0;
pub const PAUSER_ROLE: u64 = 3;
pub const PRICE_MANAGER_ROLE: u64 = 1;
pub const FEE_WITHDRAWER_ROLE: u64 = 2;
pub const DISCOUNT_MANAGER_ROLE: u64 = 4;
pub const EVAL_SHOP_BYTECODE: &[u8] =
include_bytes!("../artifacts/eval-shop/eval-shop.bin");
pub const EVAL_SHOP_STORAGE: &[u8] =
include_bytes!("../artifacts/eval-shop/eval-shop-storage_slots.json");
pub struct EvalShopDeployment<W: Account> {
pub shop: EvalShopContract<W>,
pub proxy: GenericProxyContract<W>,
pub contract_id: ContractId,
pub blob_id: ContractId,
}
impl<W: Account + Clone> EvalShopDeployment<W> {
pub async fn deploy(wallet: &W, config: &EvalShopDeployConfig) -> Result<Self> {
let deployed = GenericProxyDeployment::deploy(
wallet,
config,
EVAL_SHOP_BYTECODE,
EVAL_SHOP_STORAGE,
)
.await?;
let shop = EvalShopContract::new(deployed.contract_id, wallet.clone());
if !shop
.methods()
.initialized()
.simulate(Execution::state_read_only())
.await?
.value
{
shop.methods()
.initialize()
.call()
.await
.context("initialize EvalShop as its proxy owner")?;
}
Ok(Self {
shop,
proxy: deployed.proxy,
contract_id: deployed.contract_id,
blob_id: deployed.blob_id,
})
}
}
#[cfg(test)]
#[path = "eval_shop_tests.rs"]
mod tests;