138 lines
4.1 KiB
Rust

//! This crate provides [`Program`]s and associated utilities used by LEZ.
#[cfg(feature = "artifacts")]
pub use inner::*;
#[cfg(feature = "artifacts")]
mod inner {
use std::borrow::Cow;
use guests::{
AMM_ELF, AMM_ID, ASSOCIATED_TOKEN_ACCOUNT_ELF, ASSOCIATED_TOKEN_ACCOUNT_ID,
AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID, BRIDGE_ELF, BRIDGE_ID, CLOCK_ELF,
CLOCK_ID, FAUCET_ELF, FAUCET_ID, PINATA_ELF, PINATA_ID, PINATA_TOKEN_ELF, PINATA_TOKEN_ID,
TOKEN_ELF, TOKEN_ID, VAULT_ELF, VAULT_ID,
};
use lee::program::Program;
mod guests {
include!(concat!(env!("OUT_DIR"), "/lez/programs/mod.rs"));
}
#[must_use]
#[inline]
pub const fn authenticated_transfer() -> Program {
Program::new_unchecked(
AUTHENTICATED_TRANSFER_ID,
Cow::Borrowed(AUTHENTICATED_TRANSFER_ELF),
)
}
#[must_use]
#[inline]
pub const fn token() -> Program {
Program::new_unchecked(TOKEN_ID, Cow::Borrowed(TOKEN_ELF))
}
#[must_use]
#[inline]
pub const fn pinata() -> Program {
Program::new_unchecked(PINATA_ID, Cow::Borrowed(PINATA_ELF))
}
// TODO: Not used anywhere?
#[must_use]
#[inline]
pub const fn pinata_token() -> Program {
Program::new_unchecked(PINATA_TOKEN_ID, Cow::Borrowed(PINATA_TOKEN_ELF))
}
#[must_use]
#[inline]
pub const fn amm() -> Program {
Program::new_unchecked(AMM_ID, Cow::Borrowed(AMM_ELF))
}
#[must_use]
#[inline]
pub const fn clock() -> Program {
Program::new_unchecked(CLOCK_ID, Cow::Borrowed(CLOCK_ELF))
}
#[must_use]
#[inline]
pub const fn ata() -> Program {
Program::new_unchecked(
ASSOCIATED_TOKEN_ACCOUNT_ID,
Cow::Borrowed(ASSOCIATED_TOKEN_ACCOUNT_ELF),
)
}
#[must_use]
#[inline]
pub const fn vault() -> Program {
Program::new_unchecked(VAULT_ID, Cow::Borrowed(VAULT_ELF))
}
#[must_use]
#[inline]
pub const fn faucet() -> Program {
Program::new_unchecked(FAUCET_ID, Cow::Borrowed(FAUCET_ELF))
}
#[must_use]
#[inline]
pub const fn bridge() -> Program {
Program::new_unchecked(BRIDGE_ID, Cow::Borrowed(BRIDGE_ELF))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn builtin_programs() {
let auth_transfer_program = authenticated_transfer();
let token_program = token();
let vault_program = vault();
let faucet_program = faucet();
let bridge_program = bridge();
let pinata_program = pinata();
assert_eq!(auth_transfer_program.id(), AUTHENTICATED_TRANSFER_ID);
assert_eq!(auth_transfer_program.elf(), AUTHENTICATED_TRANSFER_ELF);
assert_eq!(token_program.id(), TOKEN_ID);
assert_eq!(token_program.elf(), TOKEN_ELF);
assert_eq!(vault_program.id(), VAULT_ID);
assert_eq!(vault_program.elf(), VAULT_ELF);
assert_eq!(faucet_program.id(), FAUCET_ID);
assert_eq!(faucet_program.elf(), FAUCET_ELF);
assert_eq!(bridge_program.id(), BRIDGE_ID);
assert_eq!(bridge_program.elf(), BRIDGE_ELF);
assert_eq!(pinata_program.id(), PINATA_ID);
assert_eq!(pinata_program.elf(), PINATA_ELF);
}
#[test]
fn builtin_program_ids_match_elfs() {
let cases: &[(&[u8], [u32; 8])] = &[
(AMM_ELF, AMM_ID),
(AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID),
(ASSOCIATED_TOKEN_ACCOUNT_ELF, ASSOCIATED_TOKEN_ACCOUNT_ID),
(CLOCK_ELF, CLOCK_ID),
(FAUCET_ELF, FAUCET_ID),
(BRIDGE_ELF, BRIDGE_ID),
(PINATA_ELF, PINATA_ID),
(PINATA_TOKEN_ELF, PINATA_TOKEN_ID),
(TOKEN_ELF, TOKEN_ID),
(VAULT_ELF, VAULT_ID),
];
for (elf, expected_id) in cases {
let program = Program::new((*elf).into()).unwrap();
assert_eq!(program.id(), *expected_id);
}
}
}
}