use std::path::PathBuf;
use std::sync::Arc;
use miden_agglayer::{
EthAddress,
MetadataHash,
create_existing_agglayer_faucet,
create_existing_bridge_account,
};
use miden_protocol::account::auth::AuthScheme;
use miden_protocol::account::{Account, AccountCode, AccountFile, AccountStorageMode, AccountType};
use miden_protocol::crypto::dsa::falcon512_poseidon2::SecretKey;
use miden_protocol::crypto::rand::RandomCoin;
use miden_protocol::{Felt, Word};
use miden_standards::AuthMethod;
use miden_standards::account::wallets::create_basic_wallet;
fn main() {
build_rs::output::rerun_if_changed("src/db/migrations");
build_rs::output::rerun_if_changed("Cargo.toml");
generate_agglayer_sample_accounts();
}
fn generate_agglayer_sample_accounts() {
let manifest_dir = build_rs::input::cargo_manifest_dir();
let samples_dir: PathBuf =
manifest_dir.join("src/genesis/config/samples/02-with-account-files");
fs_err::create_dir_all(&samples_dir).expect("Failed to create samples directory");
let bridge_seed: Word = Word::new([Felt::new(1u64); 4]);
let eth_faucet_seed: Word = Word::new([Felt::new(2u64); 4]);
let usdc_faucet_seed: Word = Word::new([Felt::new(3u64); 4]);
let bridge_admin_key =
SecretKey::with_rng(&mut RandomCoin::new(Word::new([Felt::new(4u64); 4])));
let ger_manager_key =
SecretKey::with_rng(&mut RandomCoin::new(Word::new([Felt::new(5u64); 4])));
let bridge_admin = create_basic_wallet(
[4u8; 32],
AuthMethod::SingleSig {
approver: (bridge_admin_key.public_key().into(), AuthScheme::Falcon512Poseidon2),
},
AccountType::RegularAccountImmutableCode,
AccountStorageMode::Public,
)
.expect("bridge admin account should be valid");
let ger_manager = create_basic_wallet(
[5u8; 32],
AuthMethod::SingleSig {
approver: (ger_manager_key.public_key().into(), AuthScheme::Falcon512Poseidon2),
},
AccountType::RegularAccountImmutableCode,
AccountStorageMode::Public,
)
.expect("GER manager account should be valid");
let bridge_admin_id = bridge_admin.id();
let ger_manager_id = ger_manager.id();
let bridge_account =
create_existing_bridge_account(bridge_seed, bridge_admin_id, ger_manager_id);
let bridge_account_id = bridge_account.id();
let eth_origin_address = EthAddress::new([1u8; 20]);
let usdc_origin_address = EthAddress::new([2u8; 20]);
let eth_faucet = create_existing_agglayer_faucet(
eth_faucet_seed,
"ETH",
8,
Felt::new(1_000_000_000),
Felt::new(0),
bridge_account_id,
ð_origin_address,
0u32,
10u8,
MetadataHash::from_token_info("Ether", "ETH", 8),
);
let usdc_faucet = create_existing_agglayer_faucet(
usdc_faucet_seed,
"USDC",
6,
Felt::new(10_000_000_000),
Felt::new(0),
bridge_account_id,
&usdc_origin_address,
0u32,
10u8,
MetadataHash::from_token_info("USD Coin", "USDC", 6),
);
let bridge_account = strip_code_decorators(bridge_account);
let eth_faucet = strip_code_decorators(eth_faucet);
let usdc_faucet = strip_code_decorators(usdc_faucet);
let bridge_file = AccountFile::new(bridge_account, vec![]);
let eth_faucet_file = AccountFile::new(eth_faucet, vec![]);
let usdc_faucet_file = AccountFile::new(usdc_faucet, vec![]);
bridge_file
.write(samples_dir.join("bridge.mac"))
.expect("Failed to write bridge.mac");
eth_faucet_file
.write(samples_dir.join("agglayer_faucet_eth.mac"))
.expect("Failed to write agglayer_faucet_eth.mac");
usdc_faucet_file
.write(samples_dir.join("agglayer_faucet_usdc.mac"))
.expect("Failed to write agglayer_faucet_usdc.mac");
}
fn strip_code_decorators(account: Account) -> Account {
let (id, vault, storage, code, nonce, seed) = account.into_parts();
let mut mast = code.mast();
Arc::make_mut(&mut mast).clear_debug_info();
let code = AccountCode::from_parts(mast, code.procedures().to_vec());
Account::new_unchecked(id, vault, storage, code, nonce, seed)
}