Skip to main content

Libraries

Struct Libraries 

Source
pub struct Libraries { /* private fields */ }
Expand description

External libraries deployed once per distinct bytecode, and the address each linked contract substitutes for its placeholders.

Solidity links a contract against a library by <File>.sol:<Name>, so two files that each carry a copy of the same library — bb writes RelationsLib and ZKTranscriptLib into every verifier it generates — link by different keys. This groups those keys by the hash of the library’s creation code, and that hash is the whole rule: identical bytecode is one deployment, and every contract whose artifact names that bytecode links against it; bytecode that differs is a deployment of its own. No version, release or list of which libraries happen to match takes part — a bb or solc bump that leaves a library identical keeps it shared, one that changes it separates it, and a contract can only ever link the bytes it was compiled against.

Each distinct library lands through the canonical CREATE2 deployer under LIBRARY_SALT, so its address is library_address of its creation code: the same on every chain, and already holding code on a re-run, which is how a library that is deployed is found and reused with no record kept off chain. The deployer is installed if the chain lacks it, as ensure_factory does; there is no plain-CREATE fallback, because an address that is not a function of the code is one a later run cannot find.

Creation code rather than runtime code, because it is what the chain receives and what the address derives from, and equal creation code is equal runtime code.

Implementations§

Source§

impl Libraries

Source

pub async fn deploy<P: Provider>( provider: &P, artifacts: &Artifacts, contracts: &[(&str, &str)], sender: Option<Address>, ) -> Result<Self>

Deploy every library the (file, contract) artifacts link, once per distinct bytecode, skipping any whose code is already at its address. A library that links libraries of its own has those resolved first. Contracts that link nothing contribute nothing and cost nothing.

sender opts into explicit nonce management (see deploy_contract_from).

Source

pub fn address(&self, file: &str, library: &str) -> Option<Address>

The address <file>.sol:<library> links against, if it is in the set.

Source

pub fn distinct(&self) -> impl Iterator<Item = (B256, Address)> + '_

Every distinct library, as the hash of its creation code and its address. One entry per deployment, however many files name it.

Source

pub fn deployed(&self) -> impl Iterator<Item = Address> + '_

The addresses this call sent a deploy for, as opposed to found.

The creation bytecode of <file>.sol:<contract> with every library it links substituted from the set. Pure: no transaction. Errors when the artifact names a library the set does not hold.

Trait Implementations§

Source§

impl Clone for Libraries

Source§

fn clone(&self) -> Libraries

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Libraries

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Libraries

Source§

fn default() -> Libraries

Returns the “default value” for a type. Read more
Source§

impl Eq for Libraries

Source§

impl PartialEq for Libraries

Source§

fn eq(&self, other: &Libraries) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Libraries

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more