margin-account-oracle 0.1.0

A cargo-generate template for Rust + Sway integration testing.
use fuels::{
    accounts::{
        signers::private_key::PrivateKeySigner,
        wallet::Unlocked,
    },
    prelude::*,
    types::ContractId,
};

// Load abi from json
abigen!(
    Contract(
        name = "MarginAccountOracle",
        abi =
            "contracts/margin-account-oracle/out/release/margin-account-oracle-abi.json"
    ),
    Contract(
        name = "MarginAccount",
        abi = "contracts/margin-account/out/release/margin-account-abi.json"
    ),
    Contract(
        name = "LargeContract",
        abi =
            "contracts/test_artifacts/large_contract/out/release/large-contract-abi.json"
    )
);

pub async fn deploy_blob(wallet: &Wallet<Unlocked<PrivateKeySigner>>) -> ContractId {
    let max_words_per_blob = 10_000;
    let blobs = Contract::load_from(
        "../test_artifacts/large_contract/out/release/large-contract.bin",
        LoadConfiguration::default(),
    )
    .unwrap()
    .convert_to_loader(max_words_per_blob)
    .unwrap()
    .blobs()
    .to_vec();

    let blob = blobs[0].clone();
    let mut builder = BlobTransactionBuilder::default().with_blob(blob.clone());

    wallet.adjust_for_fee(&mut builder, 0).await.unwrap();
    wallet.add_witnesses(&mut builder).unwrap();

    let tx = builder
        .build(&wallet.try_provider().unwrap())
        .await
        .unwrap();
    wallet
        .try_provider()
        .unwrap()
        .send_transaction_and_await_commit(tx)
        .await
        .unwrap()
        .check(None)
        .unwrap();

    ContractId::from(blob.id())
}

pub async fn setup_wallets() -> (
    Wallet<Unlocked<PrivateKeySigner>>,
    Wallet<Unlocked<PrivateKeySigner>>,
    Wallet<Unlocked<PrivateKeySigner>>,
) {
    // Launch a local network and deploy the contract
    let mut wallets = launch_custom_provider_and_get_wallets(
        WalletsConfig::new(
            Some(3),
            Some(1),             // Single coin (UTXO)
            Some(1_000_000_000), // Amount per coin
        ),
        None,
        None,
    )
    .await
    .unwrap();
    let wallet_1 = wallets.pop().unwrap();
    let wallet_2 = wallets.pop().unwrap();
    let wallet_3 = wallets.pop().unwrap();

    (wallet_1, wallet_2, wallet_3)
}

pub async fn setup_oracle(
    wallet: &Wallet<Unlocked<PrivateKeySigner>>,
) -> (
    MarginAccountOracle<Wallet<Unlocked<PrivateKeySigner>>>,
    ContractId,
) {
    let id = Contract::load_from(
        "./out/release/margin-account-oracle.bin",
        LoadConfiguration::default(),
    )
    .unwrap()
    .deploy(wallet, TxPolicies::default())
    .await
    .unwrap()
    .contract_id;

    let instance = MarginAccountOracle::new(id, wallet.clone());

    (instance, id)
}

pub async fn setup_margin_account(
    wallet: &Wallet<Unlocked<PrivateKeySigner>>,
) -> (
    MarginAccount<Wallet<Unlocked<PrivateKeySigner>>>,
    ContractId,
) {
    let id = Contract::load_from(
        "../margin-account/out/release/margin-account.bin",
        LoadConfiguration::default(),
    )
    .unwrap()
    .deploy(wallet, TxPolicies::default())
    .await
    .unwrap()
    .contract_id;

    let instance = MarginAccount::new(id, wallet.clone());

    (instance, id)
}