#[allow(unused_imports)]
use crate::constants::{
BIP54_MAX_SIGOPS_PER_TX, HALVING_INTERVAL, INITIAL_SUBSIDY, LOCKTIME_THRESHOLD,
MAX_BLOCK_SIGOPS_COST, MAX_MONEY, TAPROOT_ACTIVATION_MAINNET, TAPROOT_ACTIVATION_TESTNET,
};
use blvm_spec_lock::spec_locked;
#[spec_locked("6.5", "F_FeeNonNeg")]
#[blvm_spec_lock::requires(total_in >= total_out)]
#[blvm_spec_lock::requires(total_out >= 0)]
pub(crate) fn _verify_f_fee_non_neg(total_in: i64, total_out: i64) -> i64 {
total_in - total_out
}
#[spec_locked("13.3.1", "F_FeeArithmeticNonNeg")]
#[blvm_spec_lock::requires(total_in >= total_out)]
#[blvm_spec_lock::requires(total_in >= 0)]
#[blvm_spec_lock::requires(total_out >= 0)]
pub(crate) fn _verify_f_fee_arithmetic_non_neg(total_in: i64, total_out: i64) -> i64 {
total_in - total_out
}
#[spec_locked("13.3.1", "F_FeeArithmeticBounded")]
#[blvm_spec_lock::requires(total_in >= total_out)]
#[blvm_spec_lock::requires(total_in >= 0)]
#[blvm_spec_lock::requires(total_out >= 0)]
#[blvm_spec_lock::ensures(result <= total_in)]
pub(crate) fn _verify_f_fee_arithmetic_bounded(total_in: i64, total_out: i64) -> i64 {
total_in - total_out
}
#[spec_locked("13.3.3", "F_CoinbaseScriptSigMin")]
#[blvm_spec_lock::requires(len >= 2)]
pub(crate) fn _verify_f_coinbase_scriptsig_min(len: i64) -> i64 {
len - 2
}
#[spec_locked("13.3.3", "F_CoinbaseScriptSigMax")]
#[blvm_spec_lock::requires(len <= 100)]
pub(crate) fn _verify_f_coinbase_scriptsig_max(len: i64) -> i64 {
100 - len
}
#[spec_locked("13.3.3", "F_StackSizeSafe")]
#[blvm_spec_lock::requires(depth >= 0)]
#[blvm_spec_lock::requires(depth < 1000)]
pub(crate) fn _verify_f_stack_size_safe(depth: i64) -> i64 {
999 - depth
}
#[spec_locked("7.1", "F_ExpandTargetZeroMantissa")]
#[blvm_spec_lock::requires((bits & 0x007fffff) == 0)]
#[blvm_spec_lock::ensures(result == 0)]
pub(crate) fn _verify_f_expand_target_zero_mantissa(bits: u64) -> i64 {
let mantissa = bits & 0x007fffff;
if mantissa == 0 {
0
} else {
1
} }
#[spec_locked("7.1", "F_ExpandTargetExponent")]
#[blvm_spec_lock::ensures(result <= 255)]
pub(crate) fn _verify_f_expand_target_exponent(bits: i64) -> i64 {
(bits >> 24) & 0xff
}
#[spec_locked("7.1", "F_ExpandTargetNonZeroMantissa")]
#[blvm_spec_lock::requires((bits & 0x007fffff) != 0)]
#[blvm_spec_lock::ensures(result != 0)]
pub(crate) fn _verify_f_expand_target_non_zero_mantissa(bits: u64) -> i64 {
let mantissa = bits & 0x007fffff;
if mantissa == 0 {
0
} else {
1
}
}
#[spec_locked("6.1", "F_SubsidyZeroAfter64")]
#[blvm_spec_lock::requires(height >= HALVING_INTERVAL * 64)]
#[blvm_spec_lock::ensures(result == 0)]
pub(crate) fn _verify_f_subsidy_zero_after_64(height: u64) -> i64 {
let k = height / HALVING_INTERVAL;
if k >= 64 {
0
} else {
INITIAL_SUBSIDY }
}
#[spec_locked("6.1", "F_SubsidyPiecewise")]
#[blvm_spec_lock::ensures(
result >= 0
)]
#[blvm_spec_lock::ensures(
result <= INITIAL_SUBSIDY
)]
pub(crate) fn _verify_f_subsidy_piecewise(height: u64) -> i64 {
let k = height / HALVING_INTERVAL;
match k {
0 => INITIAL_SUBSIDY,
1 => INITIAL_SUBSIDY >> 1,
2 => INITIAL_SUBSIDY >> 2,
3 => INITIAL_SUBSIDY >> 3,
4 => INITIAL_SUBSIDY >> 4,
5 => INITIAL_SUBSIDY >> 5,
6 => INITIAL_SUBSIDY >> 6,
7 => INITIAL_SUBSIDY >> 7,
8 => INITIAL_SUBSIDY >> 8,
9 => INITIAL_SUBSIDY >> 9,
10 => INITIAL_SUBSIDY >> 10,
11 => INITIAL_SUBSIDY >> 11,
12 => INITIAL_SUBSIDY >> 12,
13 => INITIAL_SUBSIDY >> 13,
14 => INITIAL_SUBSIDY >> 14,
15 => INITIAL_SUBSIDY >> 15,
16 => INITIAL_SUBSIDY >> 16,
17 => INITIAL_SUBSIDY >> 17,
18 => INITIAL_SUBSIDY >> 18,
19 => INITIAL_SUBSIDY >> 19,
20 => INITIAL_SUBSIDY >> 20,
21 => INITIAL_SUBSIDY >> 21,
22 => INITIAL_SUBSIDY >> 22,
23 => INITIAL_SUBSIDY >> 23,
24 => INITIAL_SUBSIDY >> 24,
25 => INITIAL_SUBSIDY >> 25,
26 => INITIAL_SUBSIDY >> 26,
27 => INITIAL_SUBSIDY >> 27,
28 => INITIAL_SUBSIDY >> 28,
29 => INITIAL_SUBSIDY >> 29,
30 => INITIAL_SUBSIDY >> 30,
31 => INITIAL_SUBSIDY >> 31,
32 => INITIAL_SUBSIDY >> 32,
33 => INITIAL_SUBSIDY >> 33,
34 => INITIAL_SUBSIDY >> 34,
35 => INITIAL_SUBSIDY >> 35,
36 => INITIAL_SUBSIDY >> 36,
37 => INITIAL_SUBSIDY >> 37,
38 => INITIAL_SUBSIDY >> 38,
39 => INITIAL_SUBSIDY >> 39,
40 => INITIAL_SUBSIDY >> 40,
41 => INITIAL_SUBSIDY >> 41,
42 => INITIAL_SUBSIDY >> 42,
43 => INITIAL_SUBSIDY >> 43,
44 => INITIAL_SUBSIDY >> 44,
45 => INITIAL_SUBSIDY >> 45,
46 => INITIAL_SUBSIDY >> 46,
47 => INITIAL_SUBSIDY >> 47,
48 => INITIAL_SUBSIDY >> 48,
49 => INITIAL_SUBSIDY >> 49,
50 => INITIAL_SUBSIDY >> 50,
51 => INITIAL_SUBSIDY >> 51,
52 => INITIAL_SUBSIDY >> 52,
53 => INITIAL_SUBSIDY >> 53,
54 => INITIAL_SUBSIDY >> 54,
55 => INITIAL_SUBSIDY >> 55,
56 => INITIAL_SUBSIDY >> 56,
57 => INITIAL_SUBSIDY >> 57,
58 => INITIAL_SUBSIDY >> 58,
59 => INITIAL_SUBSIDY >> 59,
60 => INITIAL_SUBSIDY >> 60,
61 => INITIAL_SUBSIDY >> 61,
62 => INITIAL_SUBSIDY >> 62,
63 => INITIAL_SUBSIDY >> 63,
_ => 0,
}
}
#[spec_locked("6.2", "F_TotalSupplyNonNeg")]
#[blvm_spec_lock::requires(height < HALVING_INTERVAL)]
pub(crate) fn _verify_f_total_supply_non_neg(height: u64) -> i64 {
(height as i64 + 1) * INITIAL_SUBSIDY
}
#[spec_locked("6.2", "F_TotalSupplyBound")]
#[blvm_spec_lock::requires(height < HALVING_INTERVAL)]
#[blvm_spec_lock::ensures(result <= MAX_MONEY)]
pub(crate) fn _verify_f_total_supply_bound(height: u64) -> i64 {
(height as i64 + 1) * INITIAL_SUBSIDY
}
#[spec_locked("5.5", "F_SequenceLockTimeMask")]
#[blvm_spec_lock::ensures(result <= 65535)]
pub(crate) fn _verify_f_sequence_locktime_mask(seq: u64) -> u64 {
seq & 0x0000_ffff
}
#[spec_locked("5.5", "F_EvalSeqLocksDisabled")]
#[blvm_spec_lock::requires(min_height == -1)]
#[blvm_spec_lock::requires(min_time == -1)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_eval_seq_locks_disabled(
height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || height > min_height) && (min_time < 0 || time > min_time)
}
#[spec_locked("13.3.5", "F_LocktimeTypeIsHeight")]
#[blvm_spec_lock::requires(lt >= 0)]
#[blvm_spec_lock::requires(lt < 500000000)]
pub(crate) fn _verify_f_locktime_type_is_height(lt: i64) -> i64 {
500_000_000 - lt
}
#[spec_locked("13.3.5", "F_LocktimeTypeIsTimestamp")]
#[blvm_spec_lock::requires(lt >= 500000000)]
pub(crate) fn _verify_f_locktime_type_is_timestamp(lt: i64) -> i64 {
lt - 500_000_000
}
#[spec_locked("5.5", "F_EvalSeqLocksHeightNotMet")]
#[blvm_spec_lock::requires(min_height >= 0)]
#[blvm_spec_lock::requires(block_height <= min_height)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_eval_seq_locks_height_not_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[spec_locked("5.5", "F_SequenceTimeEncoding")]
#[blvm_spec_lock::requires(value >= 0)]
#[blvm_spec_lock::requires(value <= 65535)]
#[blvm_spec_lock::ensures(result <= 33553920)]
pub(crate) fn _verify_f_sequence_time_encoding(value: i64) -> i64 {
value * 512
}
#[spec_locked("5.4.7", "F_BIP65RejectsZeroLocktime")]
#[blvm_spec_lock::requires(tx_locktime == 0)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_bip65_rejects_zero_locktime(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.4.7", "F_BIP65RejectsTypeMismatch")]
#[blvm_spec_lock::requires(tx_locktime < LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(stack_locktime >= LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_bip65_rejects_type_mismatch(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.4.7", "F_BIP65RejectsTypeMismatchReverse")]
#[blvm_spec_lock::requires(tx_locktime >= LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(stack_locktime < LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_bip65_rejects_type_mismatch_reverse(
tx_locktime: u32,
stack_locktime: u32,
) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.4.7", "F_BIP65RejectsValueTooLow")]
#[blvm_spec_lock::requires(tx_locktime > 0)]
#[blvm_spec_lock::requires(tx_locktime < LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(stack_locktime < LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(tx_locktime < stack_locktime)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_bip65_rejects_value_too_low(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.4.7", "F_BIP65RejectsTimestampValueTooLow")]
#[blvm_spec_lock::requires(tx_locktime >= LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(stack_locktime >= LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(tx_locktime < stack_locktime)]
#[blvm_spec_lock::requires(tx_locktime > 0)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_bip65_rejects_timestamp_value_too_low(
tx_locktime: u32,
stack_locktime: u32,
) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.4.7", "F_BIP65Passes")]
#[blvm_spec_lock::requires(tx_locktime > 0)]
#[blvm_spec_lock::requires(tx_locktime < LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(stack_locktime < LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(tx_locktime >= stack_locktime)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_bip65_passes(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.4.7", "F_BIP65PassesTimestamp")]
#[blvm_spec_lock::requires(tx_locktime >= LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(stack_locktime >= LOCKTIME_THRESHOLD)]
#[blvm_spec_lock::requires(tx_locktime >= stack_locktime)]
#[blvm_spec_lock::requires(tx_locktime > 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_bip65_passes_timestamp(tx_locktime: u32, stack_locktime: u32) -> bool {
let tx_is_height = tx_locktime < LOCKTIME_THRESHOLD;
let sk_is_height = stack_locktime < LOCKTIME_THRESHOLD;
tx_locktime != 0 && (tx_is_height == sk_is_height) && tx_locktime >= stack_locktime
}
#[spec_locked("5.5", "F_EvalSeqLocksHeightMet")]
#[blvm_spec_lock::requires(min_height >= 0)]
#[blvm_spec_lock::requires(block_height > min_height)]
#[blvm_spec_lock::requires(min_time < 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_eval_seq_locks_height_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[spec_locked("5.5", "F_EvalSeqLocksTimeNotMet")]
#[blvm_spec_lock::requires(min_time >= 0)]
#[blvm_spec_lock::requires(time <= min_time)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_eval_seq_locks_time_not_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[spec_locked("5.5", "F_EvalSeqLocksTimeMet")]
#[blvm_spec_lock::requires(min_time >= 0)]
#[blvm_spec_lock::requires(time > min_time)]
#[blvm_spec_lock::requires(min_height < 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_eval_seq_locks_time_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[spec_locked("5.5", "F_EvalSeqLocksBothMet")]
#[blvm_spec_lock::requires(min_height >= 0)]
#[blvm_spec_lock::requires(block_height > min_height)]
#[blvm_spec_lock::requires(min_time >= 0)]
#[blvm_spec_lock::requires(time > min_time)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_eval_seq_locks_both_met(
block_height: i64,
time: i64,
min_height: i64,
min_time: i64,
) -> bool {
(min_height < 0 || block_height > min_height) && (min_time < 0 || time > min_time)
}
#[spec_locked("5.3.1", "F_HeaderVersionFloor")]
#[blvm_spec_lock::requires(block_version == 0)]
#[blvm_spec_lock::ensures(result == 0)]
pub(crate) fn _verify_f_header_version_floor(block_version: i64) -> i64 {
if block_version >= 1 {
1
} else {
0
}
}
#[spec_locked("5.3.1", "F_HeaderBitsFloor")]
#[blvm_spec_lock::requires(bits == 0)]
#[blvm_spec_lock::ensures(result == 0)]
pub(crate) fn _verify_f_header_bits_floor(bits: i64) -> i64 {
if bits != 0 {
1
} else {
0
}
}
#[spec_locked("5.4.1", "F_BIP30DeactivationPass")]
#[blvm_spec_lock::requires(bip30_active == 0)]
#[blvm_spec_lock::ensures(result == 1)]
pub(crate) fn _verify_f_bip30_deactivation_pass(bip30_active: i64) -> i64 {
if bip30_active == 0 {
1
} else {
0
}
}
#[spec_locked("5.4.2", "F_BIP34PreActivationPass")]
#[blvm_spec_lock::requires(bip34_active == 0)]
#[blvm_spec_lock::ensures(result == 1)]
pub(crate) fn _verify_f_bip34_pre_activation_pass(bip34_active: i64) -> i64 {
if bip34_active == 0 {
1
} else {
0
}
}
#[spec_locked("5.4.8", "F_CSFSZeroPubkeyInvalid")]
#[blvm_spec_lock::requires(pk_len == 0)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_csfs_zero_pubkey_invalid(pk_len: u64) -> bool {
pk_len != 0
}
#[spec_locked("5.4.8", "F_CSFSUnknownPubkeyValid")]
#[blvm_spec_lock::requires(pk_len > 0)]
#[blvm_spec_lock::requires(pk_len != 32)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_csfs_unknown_pubkey_valid(pk_len: u64) -> bool {
pk_len != 32
}
#[spec_locked("5.4.8", "F_CSFSEmptySigValid")]
#[blvm_spec_lock::requires(sig_len == 0)]
#[blvm_spec_lock::requires(pk_len > 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_csfs_empty_sig_valid(sig_len: u64, pk_len: u64) -> bool {
if pk_len == 0 {
false } else if sig_len == 0 {
true } else {
false }
}
#[spec_locked("5.4.3", "F_BIP66PreActivationPass")]
#[blvm_spec_lock::requires(bip66_active == 0)]
#[blvm_spec_lock::ensures(result == 1)]
pub(crate) fn _verify_f_bip66_pre_activation_pass(bip66_active: i64) -> i64 {
if bip66_active == 0 {
1
} else {
0
}
}
#[spec_locked("5.4.4", "F_BIP90PreActivationPass")]
#[blvm_spec_lock::requires(bip90_active == 0)]
#[blvm_spec_lock::ensures(result == 1)]
pub(crate) fn _verify_f_bip90_pre_activation_pass(bip90_active: i64) -> i64 {
if bip90_active == 0 {
1
} else {
0
}
}
#[spec_locked("5.4.5", "F_BIP147PreActivationPass")]
#[blvm_spec_lock::requires(bip147_active == 0)]
#[blvm_spec_lock::ensures(result == 1)]
pub(crate) fn _verify_f_bip147_pre_activation_pass(bip147_active: i64) -> i64 {
if bip147_active == 0 {
1
} else {
0
}
}
#[spec_locked("5.4.9", "F_BIP54ActivationThreshold")]
#[blvm_spec_lock::requires(height >= threshold)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_bip54_activation_threshold(height: u64, threshold: u64) -> bool {
height >= threshold
}
#[spec_locked("5.5", "F_SequenceDisabledWhenBit31Set")]
#[blvm_spec_lock::requires((sequence & 0x80000000) != 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_sequence_disabled_when_bit31_set(sequence: u32) -> bool {
(sequence & 0x80000000) != 0
}
#[spec_locked("5.5", "F_SequenceEnabledWhenBit31Clear")]
#[blvm_spec_lock::requires((sequence & 0x80000000) == 0)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_sequence_enabled_when_bit31_clear(sequence: u32) -> bool {
(sequence & 0x80000000) != 0
}
#[spec_locked("5.5", "F_SequenceTypeTimeWhenBit22Set")]
#[blvm_spec_lock::requires((sequence & 0x00400000) != 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_sequence_type_time_when_bit22_set(sequence: u32) -> bool {
(sequence & 0x00400000) != 0
}
#[spec_locked("5.5", "F_SequenceTypeHeightWhenBit22Clear")]
#[blvm_spec_lock::requires((sequence & 0x00400000) == 0)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_sequence_type_height_when_bit22_clear(sequence: u32) -> bool {
(sequence & 0x00400000) != 0
}
#[spec_locked("11.1.1", "F_WeightToVSizeFloor")]
#[blvm_spec_lock::ensures(result >= weight / 4)]
pub(crate) fn _verify_f_weight_to_vsize_floor(weight: u64) -> u64 {
weight.div_ceil(4)
}
#[spec_locked("11.1.1", "F_WeightToVSizeCeiling")]
#[blvm_spec_lock::ensures(result <= weight / 4 + 1)]
pub(crate) fn _verify_f_weight_to_vsize_ceiling(weight: u64) -> u64 {
weight.div_ceil(4)
}
#[spec_locked("11.1.2", "F_WitnessEmptyByLength")]
#[blvm_spec_lock::requires(len == 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_witness_empty_by_length(len: u64) -> bool {
len == 0
}
#[spec_locked("11.1.3", "F_WitnessProgramLength20Valid")]
#[blvm_spec_lock::requires(program_len == 20)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_witness_program_length_20_valid(program_len: u64) -> bool {
program_len == 20 || program_len == 32
}
#[spec_locked("11.1.3", "F_WitnessProgramLength32Valid")]
#[blvm_spec_lock::requires(program_len == 32)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_witness_program_length_32_valid(program_len: u64) -> bool {
program_len == 20 || program_len == 32
}
#[spec_locked("11.1.3", "F_WitnessProgramLengthInvalid")]
#[blvm_spec_lock::requires(program_len != 20)]
#[blvm_spec_lock::requires(program_len != 32)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_witness_program_length_invalid(program_len: u64) -> bool {
program_len == 20 || program_len == 32
}
#[spec_locked("5.2.4", "F_MinimalIfEmptyTrue")]
#[blvm_spec_lock::requires(len == 0)]
#[blvm_spec_lock::ensures(result == true)]
pub(crate) fn _verify_f_minimal_if_empty_true(len: u64) -> bool {
len == 0
}
#[spec_locked("5.2.4", "F_MinimalIfLongFalse")]
#[blvm_spec_lock::requires(len > 1)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_minimal_if_long_false(len: u64) -> bool {
len == 0 || len == 1
}
#[spec_locked("11.2.1", "F_TaprootOutputScriptLengthInvalid")]
#[blvm_spec_lock::requires(script_len != 34)]
#[blvm_spec_lock::ensures(result == false)]
pub(crate) fn _verify_f_taproot_output_script_length_invalid(script_len: u64) -> bool {
script_len == 34
}
#[spec_locked("5.4.9", "F_Bip54SignalBit")]
#[blvm_spec_lock::ensures(result == 15)]
pub(crate) fn _verify_f_bip54_signal_bit() -> u64 {
15
}
#[spec_locked("5.4.9", "F_Bip54StartTimeZero")]
#[blvm_spec_lock::ensures(result == 0)]
pub(crate) fn _verify_f_bip54_start_time_zero() -> u64 {
0
}
#[spec_locked("11.2", "F_TaprootActivationMainnet")]
#[blvm_spec_lock::requires(network == 0)]
#[blvm_spec_lock::ensures(result == TAPROOT_ACTIVATION_MAINNET)]
pub(crate) fn _verify_f_taproot_activation_mainnet(network: u64) -> u64 {
if network == 0 {
TAPROOT_ACTIVATION_MAINNET
} else if network == 1 {
TAPROOT_ACTIVATION_TESTNET
} else {
0
}
}
#[spec_locked("11.2", "F_TaprootActivationTestnet")]
#[blvm_spec_lock::requires(network == 1)]
#[blvm_spec_lock::ensures(result == TAPROOT_ACTIVATION_TESTNET)]
pub(crate) fn _verify_f_taproot_activation_testnet(network: u64) -> u64 {
if network == 0 {
TAPROOT_ACTIVATION_MAINNET
} else if network == 1 {
TAPROOT_ACTIVATION_TESTNET
} else {
0
}
}
#[spec_locked("11.2", "F_TaprootActivationRegtest")]
#[blvm_spec_lock::requires(network != 0)]
#[blvm_spec_lock::requires(network != 1)]
#[blvm_spec_lock::ensures(result == 0)]
pub(crate) fn _verify_f_taproot_activation_regtest(network: u64) -> u64 {
if network == 0 {
TAPROOT_ACTIVATION_MAINNET
} else if network == 1 {
TAPROOT_ACTIVATION_TESTNET
} else {
0
}
}