pub struct PswapNote { /* private fields */ }Expand description
A partially-fillable swap note for decentralized asset exchange.
A PSWAP note allows a creator to offer one fungible asset in exchange for another. Unlike a regular SWAP note, consumers may fill it partially — the unfilled portion is re-created as a remainder note with an updated serial number, while the creator receives the filled portion via a payback note.
The note can be consumed both in local transactions (where the consumer provides
fill amounts via note_args) and in network transactions (where note_args default to
[0, 0, 0, 0], triggering a full fill). To route a PSWAP note to a network account,
set the attachment to a NetworkAccountTarget
via the builder.
Implementations§
Source§impl PswapNote
impl PswapNote
Sourcepub const NUM_STORAGE_ITEMS: usize = PswapNoteStorage::NUM_STORAGE_ITEMS
pub const NUM_STORAGE_ITEMS: usize = PswapNoteStorage::NUM_STORAGE_ITEMS
Expected number of storage items for the PSWAP note.
Sourcepub const PSWAP_ATTACHMENT_SCHEME: NoteAttachmentScheme
pub const PSWAP_ATTACHMENT_SCHEME: NoteAttachmentScheme
Attachment scheme stamped on both PSWAP output notes (the payback P2ID and the remainder PSWAP).
Sourcepub fn script() -> NoteScript
pub fn script() -> NoteScript
Returns the compiled PSWAP note script.
Sourcepub fn script_root() -> NoteScriptRoot
pub fn script_root() -> NoteScriptRoot
Returns the root hash of the PSWAP note script.
Sourcepub fn create_args(account_fill: u64, note_fill: u64) -> Result<Word, NoteError>
pub fn create_args(account_fill: u64, note_fill: u64) -> Result<Word, NoteError>
Builds the NOTE_ARGS word that the PSWAP script expects when a
consumer wants to fill part of the swap:
[account_fill, note_fill, 0, 0]
account_fillis the portion of the requested asset the consumer pays out of their own vault.note_fillis the portion sourced from another note in the same transaction (cross-swap / net-zero flow).
Both values are in the requested asset’s base units. In a network
transaction the kernel defaults NOTE_ARGS to [0, 0, 0, 0] and the
script falls back to a full fill, so this helper is only needed for
local transactions where the consumer is choosing the fill split.
§Errors
Returns an error if either value exceeds the Goldilocks field size
(i.e. cannot be represented as a Felt). In practice this cannot
happen for any amount that fits in a FungibleAsset —
FungibleAsset::MAX_AMOUNT is comfortably below 2^63 — but the
conversion is surfaced explicitly rather than hidden behind a panic.
Sourcepub fn storage(&self) -> &PswapNoteStorage
pub fn storage(&self) -> &PswapNoteStorage
Returns a reference to the PSWAP note storage.
Sourcepub fn serial_number(&self) -> Word
pub fn serial_number(&self) -> Word
Returns the serial number of this note.
Sourcepub fn offered_asset(&self) -> &FungibleAsset
pub fn offered_asset(&self) -> &FungibleAsset
Returns a reference to the offered FungibleAsset.
Sourcepub fn attachments(&self) -> Option<&NoteAttachment>
pub fn attachments(&self) -> Option<&NoteAttachment>
Returns a reference to the note attachments.
For notes targeting a network account, this may contain a
NetworkAccountTarget with scheme = 2. For a
remainder PSWAP this contains the Self::PSWAP_ATTACHMENT_SCHEME word
[amt_payout, order_id, depth, 0]. For an original PSWAP (no prior fill),
this is typically empty.
Sourcepub fn order_id(&self) -> Felt
pub fn order_id(&self) -> Felt
Returns the order_id of this lineage, equal to serial_number()[1].
Sourcepub fn parent_depth(&self) -> u64
pub fn parent_depth(&self) -> u64
Returns the depth carried in this note’s Self::PSWAP_ATTACHMENT_SCHEME attachment,
or 0 if the note has no such attachment (i.e., it is the original PSWAP, not a
remainder produced by an earlier fill).
The next round’s current_depth is computed as parent_depth() + 1, matching the
on-chain get_current_depth MASM procedure.
Sourcepub fn execute_full_fill(
&self,
consumer_account_id: AccountId,
) -> Result<Note, NoteError>
pub fn execute_full_fill( &self, consumer_account_id: AccountId, ) -> Result<Note, NoteError>
Executes the swap as a full fill, producing only the payback note (no remainder).
Equivalent to calling Self::execute with account_fill_asset set to the full
requested amount and note_fill_asset = None. It also matches the on-chain
behavior when a note is consumed without explicit note_args (e.g. in a network
transaction, where the kernel defaults note_args to [0, 0, 0, 0] and the MASM
script falls back to a full fill).
Sourcepub fn execute(
&self,
consumer_account_id: AccountId,
account_fill_asset: Option<FungibleAsset>,
note_fill_asset: Option<FungibleAsset>,
) -> Result<(Note, Option<PswapNote>), NoteError>
pub fn execute( &self, consumer_account_id: AccountId, account_fill_asset: Option<FungibleAsset>, note_fill_asset: Option<FungibleAsset>, ) -> Result<(Note, Option<PswapNote>), NoteError>
Executes the swap, producing the output notes for a given fill.
account_fill_asset is debited from the consumer’s vault; note_fill_asset arrives
from another note in the same transaction (cross-swap). At least one must be
provided.
Returns (payback_note, Option<remainder_pswap_note>). The remainder is
None when the fill equals the total requested amount (full fill).
§Errors
Returns an error if:
- Both assets are
None. - The fill amount is zero.
- The fill amount exceeds the total requested amount.
Sourcepub fn calculate_offered_for_requested(
&self,
fill_amount: u64,
) -> Result<u64, NoteError>
pub fn calculate_offered_for_requested( &self, fill_amount: u64, ) -> Result<u64, NoteError>
Returns how many offered tokens a consumer receives for fill_amount of the
requested asset, based on this note’s current offered/requested ratio.
§Errors
Returns an error if the calculated payout is not a valid asset amount.
Sourcepub fn payback_note(
&self,
consumer_account_id: AccountId,
attachment: &PswapNoteAttachment,
) -> Result<Note, NoteError>
pub fn payback_note( &self, consumer_account_id: AccountId, attachment: &PswapNoteAttachment, ) -> Result<Note, NoteError>
Reconstructs the depth-d payback P2ID Note, so the creator can consume it as an
unauthenticated input note.
consumer_account_id must be the account that consumed the parent PSWAP in round
depth: the MASM stamps it as the payback’s metadata sender, which feeds into
Note::details_commitment.
§Errors
Returns an error if attachment.depth() == 0 or if the fill amount is not a valid
asset amount.
Sourcepub fn remainder_note(
&self,
consumer_account_id: AccountId,
attachment: &PswapNoteAttachment,
remaining_offered: AssetAmount,
remaining_requested: AssetAmount,
) -> Result<Note, NoteError>
pub fn remainder_note( &self, consumer_account_id: AccountId, attachment: &PswapNoteAttachment, remaining_offered: AssetAmount, remaining_requested: AssetAmount, ) -> Result<Note, NoteError>
Reconstructs the depth-d remainder PSWAP Note in this lineage.
Called on the original PSWAP, this returns the full Note for the remainder produced
in round depth. The returned Note matches the created note exactly.
consumer_account_id— the account that consumed the parent PSWAP in rounddepth, used as the remainder’s sender.attachment— the on-chain[amount, order_id, depth, 0]attachment for this round, whereamountis the offered-asset units paid out.remaining_offered/remaining_requested— the leftover amounts that survive into this remainder. Both are required because the price formula uses floor division, so one isn’t derivable from the other across rounds in general.
§Errors
Returns an error if attachment.depth() == 0 or if any amount is not a valid asset
amount.
Sourcepub fn create_tag(
note_type: NoteType,
offered_asset: &FungibleAsset,
requested_asset: &FungibleAsset,
) -> NoteTag
pub fn create_tag( note_type: NoteType, offered_asset: &FungibleAsset, requested_asset: &FungibleAsset, ) -> NoteTag
Builds the 32-bit NoteTag for a PSWAP note.
[31..30] note_type (2 bits)
[29..16] script_root MSBs (14 bits)
[15..8] offered faucet ID (8 bits, top byte of prefix)
[7..0] requested faucet ID (8 bits, top byte of prefix)Trait Implementations§
Auto Trait Implementations§
impl Freeze for PswapNote
impl RefUnwindSafe for PswapNote
impl Send for PswapNote
impl Sync for PswapNote
impl Unpin for PswapNote
impl UnsafeUnpin for PswapNote
impl UnwindSafe for PswapNote
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> 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::RequestSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§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 moreSource§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