pub struct Verifier<C: CitreaClientT> {
rpc: ExtendedBitcoinRpc,
pub(crate) signer: Actor,
pub(crate) db: Database,
pub(crate) config: BridgeConfig,
pub(crate) nonces: Arc<Mutex<AllSessions>>,
pub tx_sender: TxSenderClient,
pub header_chain_prover: HeaderChainProver,
pub citrea_client: C,
}
Fields§
§rpc: ExtendedBitcoinRpc
§signer: Actor
§db: Database
§config: BridgeConfig
§nonces: Arc<Mutex<AllSessions>>
§tx_sender: TxSenderClient
§header_chain_prover: HeaderChainProver
§citrea_client: C
Implementations§
Source§impl<C> Verifier<C>where
C: CitreaClientT,
impl<C> Verifier<C>where
C: CitreaClientT,
Sourcepub async fn create_watchtower_challenge(
&self,
transaction_data: TransactionRequestData,
commit_data: &[u8],
dbtx: Option<DatabaseTransaction<'_, '_>>,
) -> Result<(TransactionType, Transaction, RbfSigningInfo), BridgeError>
pub async fn create_watchtower_challenge( &self, transaction_data: TransactionRequestData, commit_data: &[u8], dbtx: Option<DatabaseTransaction<'_, '_>>, ) -> Result<(TransactionType, Transaction, RbfSigningInfo), BridgeError>
Creates and signs the watchtower challenge with the given commit data.
§Arguments
transaction_data
- Data to identify the deposit and kickoff.commit_data
- Commit data for the watchtower challenge.
§Returns
A tuple of: 1. TransactionType: WatchtowerChallenge 2. Transaction: Signed watchtower challenge transaction 3. RbfSigningInfo: Rbf signing info for the watchtower challenge (for re-signing the transaction after a rbf input is added to the tx)
Sourcepub async fn create_and_sign_unspent_kickoff_connector_txs(
&self,
round_idx: RoundIndex,
operator_xonly_pk: XOnlyPublicKey,
dbtx: Option<DatabaseTransaction<'_, '_>>,
) -> Result<Vec<(TransactionType, Transaction)>, BridgeError>
pub async fn create_and_sign_unspent_kickoff_connector_txs( &self, round_idx: RoundIndex, operator_xonly_pk: XOnlyPublicKey, dbtx: Option<DatabaseTransaction<'_, '_>>, ) -> Result<Vec<(TransactionType, Transaction)>, BridgeError>
Creates and signs all the unspent kickoff connector (using the previously saved signatures from operator during setup) transactions for a single round of an operator.
§Arguments
round_idx
- Index of the round.operator_xonly_pk
- Operator’s x-only public key.
§Returns
A vector of tuples: 1. TransactionType: UnspentKickoff(idx) for idx’th kickoff in the round 2. Transaction: Signed unspent kickoff connector transaction
Source§impl<C> Verifier<C>where
C: CitreaClientT,
impl<C> Verifier<C>where
C: CitreaClientT,
pub async fn new(config: BridgeConfig) -> Result<Self, BridgeError>
Sourcefn verify_unspent_kickoff_sigs(
&self,
collateral_funding_outpoint: OutPoint,
operator_xonly_pk: XOnlyPublicKey,
wallet_reimburse_address: Address,
unspent_kickoff_sigs: Vec<Signature>,
kickoff_wpks: &KickoffWinternitzKeys,
) -> Result<Vec<TaggedSignature>, BridgeError>
fn verify_unspent_kickoff_sigs( &self, collateral_funding_outpoint: OutPoint, operator_xonly_pk: XOnlyPublicKey, wallet_reimburse_address: Address, unspent_kickoff_sigs: Vec<Signature>, kickoff_wpks: &KickoffWinternitzKeys, ) -> Result<Vec<TaggedSignature>, BridgeError>
Verifies all unspent kickoff signatures sent by the operator, converts them to TaggedSignature as they will be saved as TaggedSignatures to the db.
Sourceasync fn is_deposit_valid(
&self,
deposit_data: &mut DepositData,
) -> Result<(), BridgeError>
async fn is_deposit_valid( &self, deposit_data: &mut DepositData, ) -> Result<(), BridgeError>
Checks if all operators in verifier’s db that are still in protocol are in the deposit. Checks if all operators in the deposit data from aggregator are in the verifier’s DB. Afterwards, it checks if the given deposit outpoint is valid. First it checks if the tx exists on chain, then it checks if the amount in TxOut is equal to bridge_amount and if the script is correct.
§Arguments
deposit_data
- The deposit data to check.
§Returns
()
if the deposit is valid,BridgeError::InvalidDeposit
if the deposit is invalid.
pub async fn set_operator( &self, collateral_funding_outpoint: OutPoint, operator_xonly_pk: XOnlyPublicKey, wallet_reimburse_address: Address, operator_winternitz_public_keys: Vec<PublicKey>, unspent_kickoff_sigs: Vec<Signature>, ) -> Result<(), BridgeError>
pub async fn nonce_gen( &self, num_nonces: u32, ) -> Result<(u128, Vec<PublicNonce>), BridgeError>
pub async fn deposit_sign( &self, deposit_data: DepositData, session_id: u128, agg_nonce_rx: Receiver<AggregatedNonce>, ) -> Result<Receiver<PartialSignature>, BridgeError>
pub async fn deposit_finalize( &self, deposit_data: &mut DepositData, session_id: u128, sig_receiver: Receiver<Signature>, agg_nonce_receiver: Receiver<AggregatedNonce>, operator_sig_receiver: Receiver<Signature>, ) -> Result<(PartialSignature, PartialSignature), BridgeError>
pub async fn sign_optimistic_payout( &self, nonce_session_id: u128, agg_nonce: AggregatedNonce, deposit_id: u32, input_signature: Signature, input_outpoint: OutPoint, output_script_pubkey: ScriptBuf, output_amount: Amount, verification_signature: Option<PrimitiveSignature>, ) -> Result<PartialSignature, BridgeError>
pub async fn set_operator_keys( &self, deposit_data: DepositData, keys: OperatorKeys, operator_xonly_pk: XOnlyPublicKey, ) -> Result<(), BridgeError>
Sourceasync fn is_kickoff_malicious(
&self,
kickoff_witness: Witness,
deposit_data: &mut DepositData,
kickoff_data: KickoffData,
dbtx: Option<DatabaseTransaction<'_, '_>>,
) -> Result<bool, BridgeError>
async fn is_kickoff_malicious( &self, kickoff_witness: Witness, deposit_data: &mut DepositData, kickoff_data: KickoffData, dbtx: Option<DatabaseTransaction<'_, '_>>, ) -> Result<bool, BridgeError>
Checks if the operator who sent the kickoff matches the payout data saved in our db Payout data in db is updated during citrea sync.
Sourcepub async fn handle_kickoff<'a>(
&'a self,
dbtx: DatabaseTransaction<'a, '_>,
kickoff_witness: Witness,
deposit_data: DepositData,
kickoff_data: KickoffData,
challenged_before: bool,
) -> Result<bool, BridgeError>
pub async fn handle_kickoff<'a>( &'a self, dbtx: DatabaseTransaction<'a, '_>, kickoff_witness: Witness, deposit_data: DepositData, kickoff_data: KickoffData, challenged_before: bool, ) -> Result<bool, BridgeError>
Checks if the kickoff is malicious and sends the appropriate txs if it is. Returns true if the kickoff is malicious.
async fn send_watchtower_challenge( &self, kickoff_data: KickoffData, deposit_data: DepositData, dbtx: Option<DatabaseTransaction<'_, '_>>, ) -> Result<(), BridgeError>
async fn queue_watchtower_challenge( &self, kickoff_data: KickoffData, deposit_data: DepositData, commit_data: Vec<u8>, dbtx: Option<DatabaseTransaction<'_, '_>>, ) -> Result<(), BridgeError>
async fn update_citrea_deposit_and_withdrawals( &self, dbtx: &mut DatabaseTransaction<'_, '_>, l2_height_start: u64, l2_height_end: u64, block_height: u32, ) -> Result<(), BridgeError>
async fn update_finalized_payouts( &self, dbtx: &mut DatabaseTransaction<'_, '_>, block_id: u32, block_cache: &BlockCache, ) -> Result<(), BridgeError>
async fn send_unspent_kickoff_connectors( &self, round_idx: RoundIndex, operator_xonly_pk: XOnlyPublicKey, used_kickoffs: HashSet<usize>, ) -> Result<(), BridgeError>
Sourceasync fn verify_additional_disprove_conditions(
&self,
deposit_data: &mut DepositData,
kickoff_data: &KickoffData,
latest_blockhash: &Witness,
payout_blockhash: &Witness,
operator_asserts: &HashMap<usize, Witness>,
operator_acks: &HashMap<usize, Witness>,
txhandlers: &BTreeMap<TransactionType, TxHandler>,
dbtx: Option<DatabaseTransaction<'_, '_>>,
) -> Result<Option<Witness>, BridgeError>
async fn verify_additional_disprove_conditions( &self, deposit_data: &mut DepositData, kickoff_data: &KickoffData, latest_blockhash: &Witness, payout_blockhash: &Witness, operator_asserts: &HashMap<usize, Witness>, operator_acks: &HashMap<usize, Witness>, txhandlers: &BTreeMap<TransactionType, TxHandler>, dbtx: Option<DatabaseTransaction<'_, '_>>, ) -> Result<Option<Witness>, BridgeError>
Verifies the conditions required to disprove an operator’s actions using the “additional” disprove path.
This function handles specific, non-Groth16 challenges. It reconstructs a unique challenge script
based on on-chain data and constants (deposit_constant
). It then validates the operator’s
provided assertions (operator_asserts
) and acknowledgements (operator_acks
) against this script.
The goal is to produce a spendable witness for the disprove transaction if the operator is found to be at fault.
§Arguments
deposit_data
- Mutable data for the specific deposit being challenged.kickoff_data
- Information about the kickoff transaction that initiated this challenge.latest_blockhash
- The witness containing Winternitz signature for the latest Bitcoin blockhash.payout_blockhash
- The witness containing Winternitz signature for the payout transaction’s blockhash.operator_asserts
- A map of witnesses from the operator, containing their assertions (claims).operator_acks
- A map of witnesses from the operator, containing their acknowledgements of watchtower challenges.txhandlers
- A map of transaction builders, used here to retrieve TXIDs of dependent transactions.
§Returns
Ok(Some(bitcoin::Witness))
if the operator’s claims are successfully proven false, returning the complete witness needed to spend the disprove script path.Ok(None)
if the operator’s claims are valid under this specific challenge, and no disprove is possible.Err(BridgeError)
if any error occurs during script reconstruction or validation.
Sourceasync fn send_disprove_tx_additional(
&self,
txhandlers: &BTreeMap<TransactionType, TxHandler>,
kickoff_data: KickoffData,
deposit_data: DepositData,
additional_disprove_witness: Witness,
) -> Result<(), BridgeError>
async fn send_disprove_tx_additional( &self, txhandlers: &BTreeMap<TransactionType, TxHandler>, kickoff_data: KickoffData, deposit_data: DepositData, additional_disprove_witness: Witness, ) -> Result<(), BridgeError>
Constructs, signs, and broadcasts the “additional” disprove transaction.
This function is called after verify_additional_disprove_conditions
successfully returns a witness.
It takes this witness, places it into the disprove transaction’s script spend path, adds the required
operator and verifier signatures, and broadcasts the finalized transaction to the Bitcoin network.
§Arguments
txhandlers
- A map containing the pre-builtDisprove
transaction handler.kickoff_data
- Contextual data from the kickoff transaction.deposit_data
- Contextual data for the deposit being challenged.additional_disprove_witness
- The witness generated byverify_additional_disprove_conditions
, proving the operator’s fault.
§Returns
Ok(())
on successful broadcast of the transaction.Err(BridgeError)
if signing or broadcasting fails.
Sourceasync fn verify_disprove_conditions(
&self,
deposit_data: &mut DepositData,
operator_asserts: &HashMap<usize, Witness>,
) -> Result<Option<(usize, StructuredScript)>, BridgeError>
async fn verify_disprove_conditions( &self, deposit_data: &mut DepositData, operator_asserts: &HashMap<usize, Witness>, ) -> Result<Option<(usize, StructuredScript)>, BridgeError>
Performs the primary G16 proof verification to disprove an operator’s claim.
This is a complex function that aggregates all of the operator’s assertions, which are commitments
from a Winternitz one-time signature scheme. It meticulously parses and reorganizes these commitments
into the precise input format required by the underlying Groth16 SNARK verifier (validate_assertions
).
It then invokes the verifier to check for a faulty computation.
§Arguments
deposit_data
- Mutable data for the specific deposit being challenged.operator_asserts
- A map containing all 33 required operator assertion witnesses.
§Returns
Ok(Some((index, script)))
if the ZK proof is faulty. The tuple contains theStructuredScript
that can be executed on-chain and itsindex
in the Taproot tree.Ok(None)
if the ZK proof is valid.Err(BridgeError)
if any error occurs during data processing or ZK proof verification.
Sourceasync fn send_disprove_tx(
&self,
txhandlers: &BTreeMap<TransactionType, TxHandler>,
kickoff_data: KickoffData,
deposit_data: DepositData,
disprove_script: (usize, StructuredScript),
) -> Result<(), BridgeError>
async fn send_disprove_tx( &self, txhandlers: &BTreeMap<TransactionType, TxHandler>, kickoff_data: KickoffData, deposit_data: DepositData, disprove_script: (usize, StructuredScript), ) -> Result<(), BridgeError>
Constructs, signs, and broadcasts the primary disprove transaction based on the operator assertions.
This function takes the StructuredScript
and its index
returned by verify_disprove_conditions
.
It compiles the script, extracts the witness data (the push-only elements), and places it into the correct
script path (index
) of the disprove transaction. It then adds the necessary operator and verifier
signatures before broadcasting the transaction to the Bitcoin network.
§Arguments
txhandlers
- A map containing the pre-builtDisprove
transaction handler.kickoff_data
- Contextual data from the kickoff transaction.deposit_data
- Contextual data for the deposit being challenged.disprove_script
- A tuple containing the executableStructuredScript
and its Taproot leafindex
, as returned byverify_disprove_conditions
.
§Returns
Ok(())
on successful broadcast of the transaction.Err(BridgeError)
if signing or broadcasting fails.
async fn handle_finalized_block( &self, dbtx: DatabaseTransaction<'_, '_>, block_id: u32, block_height: u32, block_cache: Arc<BlockCache>, light_client_proof_wait_interval_secs: Option<u32>, ) -> Result<(), BridgeError>
Trait Implementations§
Source§impl<C> NamedEntity for Verifier<C>where
C: CitreaClientT,
impl<C> NamedEntity for Verifier<C>where
C: CitreaClientT,
Source§const ENTITY_NAME: &'static str = "verifier"
const ENTITY_NAME: &'static str = "verifier"
Source§const TX_SENDER_CONSUMER_ID: &'static str = "verifier_tx_sender"
const TX_SENDER_CONSUMER_ID: &'static str = "verifier_tx_sender"
Source§const FINALIZED_BLOCK_CONSUMER_ID_AUTOMATION: &'static str = "verifier_finalized_block_fetcher_automation"
const FINALIZED_BLOCK_CONSUMER_ID_AUTOMATION: &'static str = "verifier_finalized_block_fetcher_automation"
Source§const FINALIZED_BLOCK_CONSUMER_ID_NO_AUTOMATION: &'static str = "verifier_finalized_block_fetcher_no_automation"
const FINALIZED_BLOCK_CONSUMER_ID_NO_AUTOMATION: &'static str = "verifier_finalized_block_fetcher_no_automation"
Source§impl<C> Owner for Verifier<C>where
C: CitreaClientT,
impl<C> Owner for Verifier<C>where
C: CitreaClientT,
Source§fn handle_duty<'life0, 'async_trait>(
&'life0 self,
duty: Duty,
) -> Pin<Box<dyn Future<Output = Result<DutyResult, BridgeError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn handle_duty<'life0, 'async_trait>(
&'life0 self,
duty: Duty,
) -> Pin<Box<dyn Future<Output = Result<DutyResult, BridgeError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn create_txhandlers<'life0, 'async_trait>(
&'life0 self,
tx_type: TransactionType,
contract_context: ContractContext,
) -> Pin<Box<dyn Future<Output = Result<BTreeMap<TransactionType, TxHandler>, BridgeError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn create_txhandlers<'life0, 'async_trait>(
&'life0 self,
tx_type: TransactionType,
contract_context: ContractContext,
) -> Pin<Box<dyn Future<Output = Result<BTreeMap<TransactionType, TxHandler>, BridgeError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn handle_finalized_block<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
dbtx: DatabaseTransaction<'life1, 'life2>,
block_id: u32,
block_height: u32,
block_cache: Arc<BlockCache>,
light_client_proof_wait_interval_secs: Option<u32>,
) -> Pin<Box<dyn Future<Output = Result<(), BridgeError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn handle_finalized_block<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
dbtx: DatabaseTransaction<'life1, 'life2>,
block_id: u32,
block_height: u32,
block_cache: Arc<BlockCache>,
light_client_proof_wait_interval_secs: Option<u32>,
) -> Pin<Box<dyn Future<Output = Result<(), BridgeError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Auto Trait Implementations§
impl<C> Freeze for Verifier<C>where
C: Freeze,
impl<C> !RefUnwindSafe for Verifier<C>
impl<C> Send for Verifier<C>
impl<C> Sync for Verifier<C>
impl<C> Unpin for Verifier<C>where
C: Unpin,
impl<C> !UnwindSafe for Verifier<C>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T, U> ExactFrom<T> for Uwhere
U: TryFrom<T>,
impl<T, U> ExactFrom<T> for Uwhere
U: TryFrom<T>,
fn exact_from(value: T) -> U
§impl<T, U> ExactInto<U> for Twhere
U: ExactFrom<T>,
impl<T, U> ExactInto<U> for Twhere
U: ExactFrom<T>,
fn exact_into(self) -> U
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
Source§impl<T> L1SyncStatusProvider for T
impl<T> L1SyncStatusProvider for T
fn get_l1_status<'life0, 'life1, 'async_trait>(
db: &'life0 Database,
rpc: &'life1 ExtendedBitcoinRpc,
) -> Pin<Box<dyn Future<Output = Result<L1SyncStatus, BridgeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
§impl<T, U> OverflowingInto<U> for Twhere
U: OverflowingFrom<T>,
impl<T, U> OverflowingInto<U> for Twhere
U: OverflowingFrom<T>,
fn overflowing_into(self) -> (U, bool)
§impl<D> OwoColorize for D
impl<D> OwoColorize for D
§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg
] or
a color-specific method, such as [OwoColorize::green
], Read more§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg
] or
a color-specific method, such as [OwoColorize::on_yellow
], Read more§fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
§fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
§fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
§fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T, U> RoundingInto<U> for Twhere
U: RoundingFrom<T>,
impl<T, U> RoundingInto<U> for Twhere
U: RoundingFrom<T>,
fn rounding_into(self, rm: RoundingMode) -> (U, Ordering)
§impl<T, U> SaturatingInto<U> for Twhere
U: SaturatingFrom<T>,
impl<T, U> SaturatingInto<U> for Twhere
U: SaturatingFrom<T>,
fn saturating_into(self) -> U
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.