#![no_std]
#![deny(unsafe_op_in_unsafe_fn)]
#[cfg(test)]
extern crate std;
pub mod abi;
pub mod account;
pub mod accounts;
pub mod check;
#[cfg(feature = "collections")]
pub mod collections;
pub mod cpi;
pub mod dispatch;
pub mod event;
pub mod field_map;
pub mod invariant;
pub mod math;
pub mod segment_map;
pub mod state;
pub mod sysvar;
pub mod time;
#[cfg(feature = "diff")]
pub mod diff;
#[cfg(feature = "frame")]
pub mod frame;
#[cfg(feature = "migrate")]
pub mod migrate;
#[cfg(feature = "policy")]
pub mod policy;
#[cfg(feature = "receipt")]
pub mod receipt;
#[cfg(feature = "virtual-state")]
pub mod virtual_state;
pub use field_map::*;
#[doc(hidden)]
pub use hopper_runtime as __runtime;
#[doc(hidden)]
pub const fn __sha256_const(data: &[u8]) -> [u8; 32] {
#[cfg(feature = "sha2-layout-id")]
{
sha2_const_stable::Sha256::new().update(data).finalize()
}
#[cfg(not(feature = "sha2-layout-id"))]
{
__fnv_expand_const(data)
}
}
#[doc(hidden)]
#[cfg(not(feature = "sha2-layout-id"))]
pub const fn __fnv_expand_const(data: &[u8]) -> [u8; 32] {
const FNV_OFFSET: u64 = 0xcbf2_9ce4_8422_2325;
const FNV_PRIME: u64 = 0x0000_0100_0000_01b3;
let mut out = [0u8; 32];
let mut block: u8 = 0;
while block < 4 {
let mut h: u64 = FNV_OFFSET ^ (block as u64).wrapping_mul(0x9E37_79B9_7F4A_7C15);
let mut i = 0;
while i < data.len() {
h ^= data[i] as u64;
h = h.wrapping_mul(FNV_PRIME);
i += 1;
}
let le = h.to_le_bytes();
let base = (block as usize) * 8;
out[base] = le[0];
out[base + 1] = le[1];
out[base + 2] = le[2];
out[base + 3] = le[3];
out[base + 4] = le[4];
out[base + 5] = le[5];
out[base + 6] = le[6];
out[base + 7] = le[7];
block += 1;
}
out
}
#[doc(hidden)]
pub const fn __str_eq(a: &str, b: &str) -> bool {
let a = a.as_bytes();
let b = b.as_bytes();
if a.len() != b.len() {
return false;
}
let mut i = 0;
while i < a.len() {
if a[i] != b[i] {
return false;
}
i += 1;
}
true
}
#[doc(hidden)]
pub const fn const_str_eq(a: &str, b: &str) -> bool {
__str_eq(a, b)
}
#[cfg(feature = "anchor-compat")]
pub const fn anchor_discriminator(instruction_name: &str) -> [u8; 8] {
let hash = sha2_const_stable::Sha256::new()
.update(b"global:")
.update(instruction_name.as_bytes())
.finalize();
[
hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7],
]
}
#[cfg(feature = "anchor-compat")]
pub const fn anchor_account_discriminator(type_name: &str) -> [u8; 8] {
let hash = sha2_const_stable::Sha256::new()
.update(b"account:")
.update(type_name.as_bytes())
.finalize();
[
hash[0], hash[1], hash[2], hash[3], hash[4], hash[5], hash[6], hash[7],
]
}
pub mod prelude_core {
pub use crate::abi::{
Authority, LayoutFingerprint, Mint, Program, Token, TokenAccount, TypedAddress,
UntypedAddress,
};
pub use crate::account::{
cast_unchecked, cast_unchecked_mut, pod_from_bytes, pod_from_bytes_mut, pod_read,
pod_write, read_layout_id, write_header, zero_init, AccountHeader, AccountReader,
FixedLayout, Pod, ReallocGuard, VerifiedAccount, VerifiedAccountMut, CLOSE_SENTINEL,
HEADER_LEN,
};
pub use crate::accounts::{
hopper_entry, AccountMetaProvider, HopperAccount, HopperAccounts, HopperCtx, HopperIx,
ProgramAccount, ProgramRef, SegmentedAccount, SignerAccount, UncheckedAccount,
ValidateAccount,
};
pub use crate::check::fast::{
check_account_fast, check_authority_fast, check_executable_fast, check_signer_fast,
check_writable_fast, HEADER_EXECUTABLE, HEADER_SIGNER, HEADER_SIGNER_WRITABLE,
HEADER_WRITABLE,
};
pub use crate::check::modifier::{
Account, AccountMut, FromAccount, HasView, HopperLayout, Mut, Signer,
};
pub use crate::check::{
check_account, check_discriminator, check_executable, check_has_one, check_keys_eq,
check_owner, check_owner_multi, check_program, check_rent_exempt, check_signer, check_size,
check_writable, find_and_verify_pda, is_zero_address, keys_eq_fast, rent_exempt_min,
verify_pda, verify_pda_cached,
};
pub use crate::dispatch::{
dispatch_instruction, dispatch_instruction_8, dispatch_instruction_u16, EVENT_CPI_PREFIX,
};
#[cfg(feature = "cpi")]
pub use crate::event::emit_event_cpi;
pub use crate::event::{emit_event, emit_event_tagged, emit_slices};
pub use crate::field_map::{FieldInfo, FieldMap};
pub use crate::segment_map::{assert_segment_field_alignment, SegmentMap, StaticSegment};
pub use hopper_runtime::segment_borrow::{AccessKind, SegmentBorrow, SegmentBorrowRegistry};
pub use hopper_runtime::Segment;
pub use crate::cpi::{HopperCpi, HopperCpiBuf};
pub use crate::invariant::{check_invariant, check_invariant_fn, InvariantSet};
pub use crate::math::{
bps_of, bps_of_ceil, checked_add, checked_div, checked_div_ceil, checked_mul,
checked_mul_div, checked_mul_div_ceil, checked_pow, checked_sub, div_ceil, scale_amount,
scale_amount_ceil, scale_bps, scale_fraction, to_u64,
};
pub use crate::state::check_state_transition;
pub use crate::sysvar::{CachedClock, CachedRent, SysvarContext};
pub use crate::time::{check_cooldown_elapsed, check_deadline_not_passed, check_staleness};
pub use crate::account::segment_role::{
SegmentRole, SEG_ROLE_AUDIT, SEG_ROLE_CACHE, SEG_ROLE_CORE, SEG_ROLE_EXTENSION,
SEG_ROLE_INDEX, SEG_ROLE_JOURNAL, SEG_ROLE_SHARD,
};
pub use crate::account::{
segment_id, SegmentEntry, SegmentId, SegmentRegistry, SegmentRegistryMut,
};
#[cfg(feature = "anchor-compat")]
pub use crate::{anchor_account_discriminator, anchor_discriminator};
#[cfg(feature = "collections")]
pub use crate::collections::journal::{Journal, JournalReader};
#[cfg(feature = "collections")]
pub use crate::collections::slab::Slab;
#[cfg(feature = "collections")]
pub use crate::collections::{BitSet, FixedVec, PackedMap, RingBuffer, SlotMap, SortedVec};
}
pub mod prelude_advanced {
pub use crate::check::guards::{
check_lamport_conservation, check_writable_coherence, require_all_unique,
require_authority, require_owned_writable, require_payer, require_unique_signers,
require_unique_writable, snapshot_lamports,
};
pub use crate::check::trust::{
load_foreign_with_profile, TrustFlags, TrustLevel, TrustProfile,
};
pub use crate::check::{
check_no_subsequent_invocation, detect_flash_loan_bracket, require_top_level,
};
#[cfg(feature = "diff")]
pub use crate::diff::{StateDiff, StateSnapshot};
#[cfg(feature = "explain")]
pub use crate::accounts::{AccountExplain, ContextExplain, ExplainAccount};
#[cfg(feature = "migrate")]
pub use crate::accounts::MigratingAccount;
#[cfg(feature = "frame")]
pub use crate::frame::args::{InstructionArgs, ValidateArgs};
#[cfg(feature = "frame")]
pub use crate::frame::phase::{ExecutionContext, PhasedFrame, ResolvedFrame, ValidatedFrame};
#[cfg(feature = "frame")]
pub use crate::frame::{Frame, FrameAccount, FrameAccountMut};
#[cfg(feature = "graph")]
pub use crate::check::graph::{
require_all_unique_accounts, require_data_min, require_keys_equal, require_lamports_gte,
require_owned_at, require_signer_at, require_unique, require_unique_signer_accounts,
require_unique_writable_accounts, require_writable_at, AccountConstraint,
PostMutationValidator, TransactionConstraint, TransitionRulePack, Validatable,
ValidationBundle, ValidationContext, ValidationGraph, ValidationGroup,
};
#[cfg(feature = "migrate")]
pub use crate::migrate::{migrate_append, MigrationKind};
#[cfg(feature = "policy")]
pub use crate::policy::{
Capability, CapabilitySet, InstructionPolicy, PolicyPackDescriptor, PolicyRequirement,
RequirementSet, ACCOUNT_CLOSE_CAPS, ACCOUNT_CLOSE_POLICY, ACCOUNT_INIT_CAPS,
ACCOUNT_INIT_POLICY, AUTHORITY_CHANGE_CAPS, AUTHORITY_CHANGE_POLICY, EXTERNAL_CALL_CAPS,
EXTERNAL_CALL_POLICY, JOURNAL_TOUCH_CAPS, JOURNAL_TOUCH_POLICY, MIGRATION_SENSITIVE_CAPS,
MIGRATION_SENSITIVE_POLICY, NAMED_POLICY_PACKS, READ_ONLY_AUDIT_CAPS,
READ_ONLY_AUDIT_POLICY, SHARD_MUTATION_CAPS, SHARD_MUTATION_POLICY, TREASURY_WRITE_CAPS,
TREASURY_WRITE_POLICY,
};
#[cfg(feature = "receipt")]
pub use crate::receipt::{
CompatImpact, DecodedReceipt, FailureStage, Phase, ReceiptExplain, StateReceipt,
FAILED_INVARIANT_NONE, RECEIPT_SIZE, RECEIPT_SIZE_LEGACY,
};
#[cfg(feature = "virtual-state")]
pub use crate::virtual_state::{ShardedAccess, VirtualSlot, VirtualState};
}
pub mod prelude {
pub use crate::abi::*;
pub use crate::abi::{
Authority, Mint, Program, Token, TokenAccount, TypedAddress, UntypedAddress,
};
pub use crate::abi::{FingerprintTransition, LayoutFingerprint};
pub use crate::account::segment_role::{
SegmentRole, SEG_ROLE_AUDIT, SEG_ROLE_CACHE, SEG_ROLE_CORE, SEG_ROLE_EXTENSION,
SEG_ROLE_INDEX, SEG_ROLE_JOURNAL, SEG_ROLE_SHARD,
};
pub use crate::account::{
cast_unchecked, cast_unchecked_mut, pod_from_bytes, pod_from_bytes_mut, pod_read,
pod_write, read_layout_id, write_header, zero_init, AccountHeader, AccountReader,
FixedLayout, Pod, ReallocGuard, VerifiedAccount, VerifiedAccountMut, CLOSE_SENTINEL,
HEADER_LEN,
};
pub use crate::account::{
segment_id, SegmentEntry, SegmentId, SegmentRegistry, SegmentRegistryMut,
};
#[cfg(feature = "migrate")]
pub use crate::accounts::MigratingAccount;
pub use crate::accounts::{
hopper_entry, AccountMetaProvider, HopperAccount, HopperAccounts, HopperCtx, HopperIx,
ProgramAccount, ProgramRef, SegmentedAccount, SignerAccount, UncheckedAccount,
ValidateAccount,
};
#[cfg(feature = "explain")]
pub use crate::accounts::{AccountExplain, ContextExplain, ExplainAccount};
#[cfg(feature = "anchor-compat")]
pub use crate::anchor_account_discriminator;
#[cfg(feature = "anchor-compat")]
pub use crate::anchor_discriminator;
pub use crate::check::fast::{
check_account_fast, check_authority_fast, check_executable_fast, check_signer_fast,
check_writable_fast, HEADER_EXECUTABLE, HEADER_SIGNER, HEADER_SIGNER_WRITABLE,
HEADER_WRITABLE,
};
#[cfg(feature = "graph")]
pub use crate::check::graph::{
require_all_unique_accounts, require_data_min, require_keys_equal, require_lamports_gte,
require_owned_at, require_signer_at, require_unique, require_unique_signer_accounts,
require_unique_writable_accounts, require_writable_at, AccountConstraint,
PostMutationValidator, TransactionConstraint, TransitionRulePack, Validatable,
ValidationBundle, ValidationContext, ValidationGraph, ValidationGroup,
};
pub use crate::check::guards::{
check_lamport_conservation, check_writable_coherence, require_all_unique,
require_authority, require_owned_writable, require_payer, require_unique_signers,
require_unique_writable, snapshot_lamports,
};
pub use crate::check::modifier::{
Account, AccountMut, FromAccount, HasView, HopperLayout, Mut, Signer,
};
pub use crate::check::trust::{
load_foreign_with_profile, TrustFlags, TrustLevel, TrustProfile,
};
pub use crate::check::{
check_account, check_discriminator, check_has_one, check_keys_eq,
check_no_subsequent_invocation, check_owner, check_owner_multi, check_rent_exempt,
check_signer, check_size, check_writable, detect_flash_loan_bracket, find_and_verify_pda,
is_zero_address, keys_eq_fast, rent_exempt_min, require_top_level, verify_pda,
verify_pda_cached,
};
#[cfg(feature = "collections")]
pub use crate::collections::journal::{Journal, JournalReader};
#[cfg(feature = "collections")]
pub use crate::collections::slab::Slab;
#[cfg(feature = "collections")]
pub use crate::collections::{BitSet, FixedVec, PackedMap, RingBuffer, SlotMap, SortedVec};
pub use crate::cpi::{HopperCpi, HopperCpiBuf};
#[cfg(feature = "diff")]
pub use crate::diff::{StateDiff, StateSnapshot};
pub use crate::dispatch::{
dispatch_instruction, dispatch_instruction_8, dispatch_instruction_u16, EVENT_CPI_PREFIX,
};
#[cfg(feature = "cpi")]
pub use crate::event::emit_event_cpi;
pub use crate::event::{emit_event, emit_event_tagged, emit_slices};
pub use crate::field_map::{FieldInfo, FieldMap};
#[cfg(feature = "frame")]
pub use crate::frame::args::{InstructionArgs, ValidateArgs};
#[cfg(feature = "frame")]
pub use crate::frame::phase::{ExecutionContext, PhasedFrame, ResolvedFrame, ValidatedFrame};
#[cfg(feature = "frame")]
pub use crate::frame::{Frame, FrameAccount, FrameAccountMut};
pub use crate::invariant::{check_invariant, check_invariant_fn, InvariantSet};
pub use crate::math::{
bps_of, bps_of_ceil, checked_add, checked_div, checked_div_ceil, checked_mul,
checked_mul_div, checked_mul_div_ceil, checked_pow, checked_sub, div_ceil, scale_amount,
scale_amount_ceil, scale_bps, scale_fraction, to_u64,
};
#[cfg(feature = "migrate")]
pub use crate::migrate::{migrate_append, MigrationKind};
#[cfg(feature = "policy")]
pub use crate::policy::{
Capability,
CapabilitySet,
InstructionPolicy,
PolicyPackDescriptor,
PolicyRequirement,
RequirementSet,
ACCOUNT_CLOSE_CAPS,
ACCOUNT_CLOSE_POLICY,
ACCOUNT_INIT_CAPS,
ACCOUNT_INIT_POLICY,
AUTHORITY_CHANGE_CAPS,
AUTHORITY_CHANGE_POLICY,
EXTERNAL_CALL_CAPS,
EXTERNAL_CALL_POLICY,
JOURNAL_TOUCH_CAPS,
JOURNAL_TOUCH_POLICY,
MIGRATION_SENSITIVE_CAPS,
MIGRATION_SENSITIVE_POLICY,
NAMED_POLICY_PACKS,
READ_ONLY_AUDIT_CAPS,
READ_ONLY_AUDIT_POLICY,
SHARD_MUTATION_CAPS,
SHARD_MUTATION_POLICY,
TREASURY_WRITE_CAPS,
TREASURY_WRITE_POLICY,
};
#[cfg(feature = "receipt")]
pub use crate::receipt::{
CompatImpact, DecodedReceipt, FailureStage, Phase, ReceiptExplain, StateReceipt,
FAILED_INVARIANT_NONE, RECEIPT_SIZE, RECEIPT_SIZE_LEGACY,
};
pub use crate::segment_map::{assert_segment_field_alignment, SegmentMap, StaticSegment};
pub use crate::state::check_state_transition;
pub use crate::sysvar::{CachedClock, CachedRent, SysvarContext};
pub use crate::time::{check_cooldown_elapsed, check_deadline_not_passed, check_staleness};
#[cfg(feature = "virtual-state")]
pub use crate::virtual_state::{ShardedAccess, VirtualSlot, VirtualState};
pub use hopper_runtime::segment_borrow::{AccessKind, SegmentBorrow, SegmentBorrowRegistry};
}