Skip to main content

TIP20Token

Struct TIP20Token 

Source
pub struct TIP20Token {
Show 21 fields pub roles: <Mapping<Address, Mapping<B256, bool>> as StorableType>::Handler, pub role_admins: <Mapping<B256, B256> as StorableType>::Handler, pub name: <String as StorableType>::Handler, pub symbol: <String as StorableType>::Handler, pub currency: <String as StorableType>::Handler, pub logo_uri: <String as StorableType>::Handler, pub quote_token: <Address as StorableType>::Handler, pub next_quote_token: <Address as StorableType>::Handler, pub transfer_policy_id: <u64 as StorableType>::Handler, pub total_supply: <U256 as StorableType>::Handler, pub balances: <Mapping<Address, U256> as StorableType>::Handler, pub allowances: <Mapping<Address, Mapping<Address, U256>> as StorableType>::Handler, pub permit_nonces: <Mapping<Address, U256> as StorableType>::Handler, pub paused: <bool as StorableType>::Handler, pub supply_cap: <U256 as StorableType>::Handler, pub _salts: <Mapping<B256, bool> as StorableType>::Handler, pub global_reward_per_token: <U256 as StorableType>::Handler, pub opted_in_supply: <u128 as StorableType>::Handler, pub user_reward_info: <Mapping<Address, UserRewardInfo> as StorableType>::Handler, address: Address, storage: StorageCtx,
}

Fields§

§roles: <Mapping<Address, Mapping<B256, bool>> as StorableType>::Handler§role_admins: <Mapping<B256, B256> as StorableType>::Handler§name: <String as StorableType>::Handler§symbol: <String as StorableType>::Handler§currency: <String as StorableType>::Handler§logo_uri: <String as StorableType>::Handler§quote_token: <Address as StorableType>::Handler§next_quote_token: <Address as StorableType>::Handler§transfer_policy_id: <u64 as StorableType>::Handler§total_supply: <U256 as StorableType>::Handler§balances: <Mapping<Address, U256> as StorableType>::Handler§allowances: <Mapping<Address, Mapping<Address, U256>> as StorableType>::Handler§permit_nonces: <Mapping<Address, U256> as StorableType>::Handler§paused: <bool as StorableType>::Handler§supply_cap: <U256 as StorableType>::Handler§_salts: <Mapping<B256, bool> as StorableType>::Handler§global_reward_per_token: <U256 as StorableType>::Handler§opted_in_supply: <u128 as StorableType>::Handler§user_reward_info: <Mapping<Address, UserRewardInfo> as StorableType>::Handler§address: Address§storage: StorageCtx

Implementations§

Source§

impl TIP20Token

Source

pub fn distribute_reward( &mut self, msg_sender: Address, call: distributeRewardCall, ) -> Result<()>

Distributes amount of reward tokens from the caller into the opted-in reward pool. Transfers tokens to the contract and increases the global reward-per-token accumulator proportionally to the opted-in supply.

§Errors
  • Paused — token transfers are currently paused
  • InvalidAmountamount is zero
  • PolicyForbids — TIP-403 policy rejects the transfer
  • SpendingLimitExceeded — access key spending limit exceeded
  • InsufficientBalance — caller balance lower than amount
  • NoOptedInSupply — no tokens are currently opted into rewards
Source

pub fn update_rewards(&mut self, holder: Address) -> Result<Address>

Updates and accumulates accrued rewards for a specific token holder.

This function calculates the rewards earned by a holder based on their balance and the reward per token difference since their last update. Rewards are accumulated in the delegated recipient’s rewardBalance. Returns the holder’s delegated recipient address.

T8+: no-op, as rewards are disabled.

Source

pub fn set_reward_recipient( &mut self, msg_sender: Address, call: setRewardRecipientCall, ) -> Result<()>

Sets or changes the reward recipient for a token holder.

This function allows a token holder to designate who should receive their share of rewards. Setting to zero address opts out of rewards.

§Errors
  • Paused — token transfers are currently paused
  • PolicyForbids — TIP-403 policy rejects the sender→recipient transfer authorization
  • InvalidRecipient — TIP-1022 virtual addresses are rejected
Source

pub fn claim_rewards(&mut self, msg_sender: Address) -> Result<U256>

Claims accumulated rewards for a recipient.

Pays out the lesser of the accrued reward balance and the contract’s token balance. Any remainder stays stored for future claims.

§Errors
  • Paused — token transfers are currently paused
  • PolicyForbids — TIP-403 policy rejects the contract→caller transfer authorization
Source

pub fn get_global_reward_per_token(&self) -> Result<U256>

Gets the accumulated global reward per token.

Source

fn set_global_reward_per_token(&mut self, value: U256) -> Result<()>

Sets the accumulated global reward per token in storage.

Source

pub fn get_opted_in_supply(&self) -> Result<u128>

Gets the total supply of tokens opted into rewards from storage.

Source

pub fn set_opted_in_supply(&mut self, value: u128) -> Result<()>

Sets the total supply of tokens opted into rewards.

Source

pub fn handle_rewards_on_transfer( &mut self, from: Address, to: Address, amount: U256, ) -> Result<()>

Handles reward accounting for both sender and receiver during token transfers.

Source

pub fn handle_rewards_on_mint( &mut self, to: Address, amount: U256, ) -> Result<()>

Handles reward accounting when tokens are minted to an address.

Source

pub fn get_user_reward_info(&self, account: Address) -> Result<UserRewardInfo>

Retrieves user reward information for a given account.

Source

pub fn get_pending_rewards(&self, account: Address) -> Result<u128>

Calculates the pending claimable rewards for an account without modifying state.

This function returns the total pending claimable reward amount, which includes:

  1. The stored reward balance from previous updates
  2. Newly accrued rewards based on the current global reward per token

For accounts that have delegated their rewards to another recipient, only the stored reward balance is returned (new accrual is skipped since it goes to the delegate).

Source§

impl TIP20Token

Source

pub fn initialize_roles(&mut self) -> Result<()>

Initializes the roles precompile by setting UNGRANTABLE_ROLE to be self-administered.

Source

pub fn grant_default_admin( &mut self, msg_sender: Address, admin: Address, ) -> Result<()>

Grants DEFAULT_ADMIN_ROLE to admin. Used during token initialization.

Source

pub fn has_role(&self, call: hasRoleCall) -> Result<bool>

Returns whether account holds the given role.

Source

pub fn get_role_admin(&self, call: getRoleAdminCall) -> Result<B256>

Returns the admin role that governs role.

Source

pub fn grant_role( &mut self, msg_sender: Address, call: grantRoleCall, ) -> Result<()>

Grants role to account.

§Errors
  • Unauthorized — caller does not hold the admin role for role
Source

pub fn revoke_role( &mut self, msg_sender: Address, call: revokeRoleCall, ) -> Result<()>

Revokes role from account.

§Errors
  • Unauthorized — caller does not hold the admin role for role
Source

pub fn renounce_role( &mut self, msg_sender: Address, call: renounceRoleCall, ) -> Result<()>

Allows the caller to voluntarily give up their own role.

§Errors
  • Unauthorized — caller does not hold role
Source

pub fn set_role_admin( &mut self, msg_sender: Address, call: setRoleAdminCall, ) -> Result<()>

Changes the admin role that governs role.

§Errors
  • Unauthorized — caller does not hold the current admin role for role
Source

pub fn check_role(&self, account: Address, role: B256) -> Result<()>

Reverts if account does not hold role.

§Errors
  • Unauthorized — account does not hold role
Source

pub fn has_role_internal(&self, account: Address, role: B256) -> Result<bool>

Low-level role check without calldata decoding.

Source

pub fn grant_role_internal( &mut self, account: Address, role: B256, ) -> Result<()>

Low-level role grant without authorization checks or events.

Source

fn revoke_role_internal(&mut self, account: Address, role: B256) -> Result<()>

Source

fn get_role_admin_internal(&self, role: B256) -> Result<B256>

Returns the admin role for role. An unset entry reads as zero, which is DEFAULT_ADMIN_ROLE.

Source

fn set_role_admin_internal( &mut self, role: B256, admin_role: B256, ) -> Result<()>

Source

fn check_role_internal(&self, account: Address, role: B256) -> Result<()>

Source§

impl TIP20Token

Source

fn __new(address: Address) -> Self

Source

fn __initialize(&mut self) -> Result<()>

Source

fn emit_event(&mut self, event: impl IntoLogData) -> Result<()>

Source

pub fn emitted_events(&self) -> &Vec<LogData>

Available on crate features test-utils only.
Source

pub fn clear_emitted_events(&mut self)

Available on crate features test-utils only.
Source

pub fn assert_emitted_events(&self, expected: Vec<impl IntoLogData>)

Available on crate features test-utils only.
Source§

impl TIP20Token

Source

pub const MAX_LOGO_URI_BYTES: usize = 256

Maximum byte length of a token logo URI (TIP-1026).

Source

pub const ALLOWED_LOGO_URI_SCHEMES: &'static [&'static str]

Allowlist of ASCII-case-insensitive URI schemes accepted for Self::set_logo_uri.

TIP-1026 guarantees that the protocol validates the scheme prefix to make integration easier and reject obviously dangerous values (e.g. javascript:). What the consumer does with the URI afterwards (rendering, fetching, etc.) is out of scope and remains the consumer’s responsibility.

Source

pub fn name(&self) -> Result<String>

Returns the token name.

Source

pub fn symbol(&self) -> Result<String>

Returns the token symbol.

Source

pub fn decimals(&self) -> Result<u8>

Returns the token decimals (always 6 for TIP-20).

Source

pub fn currency(&self) -> Result<String>

Returns the token’s currency denomination (e.g. "USD").

Source

pub fn logo_uri(&self) -> Result<String>

Returns the logo URI for this token (TIP-1026).

Returns an empty string if not set.

Source

pub fn total_supply(&self) -> Result<U256>

Returns the current total supply.

Source

pub fn quote_token(&self) -> Result<Address>

Returns the active quote token address used for pricing.

Source

pub fn next_quote_token(&self) -> Result<Address>

Returns the pending next quote token address (set but not yet finalized).

Source

pub fn supply_cap(&self) -> Result<U256>

Returns the maximum mintable supply.

Source

pub fn paused(&self) -> Result<bool>

Returns whether the token is currently paused.

Source

pub fn transfer_policy_id(&self) -> Result<u64>

Returns the TIP-403 transfer policy ID governing this token’s transfers.

Source

pub fn pause_role() -> B256

Returns the PAUSE_ROLE constant

This role identifier grants permission to pause the token contract. The role is computed as keccak256("PAUSE_ROLE").

Source

pub fn unpause_role() -> B256

Returns the UNPAUSE_ROLE constant

This role identifier grants permission to unpause the token contract. The role is computed as keccak256("UNPAUSE_ROLE").

Source

pub fn issuer_role() -> B256

Returns the ISSUER_ROLE constant

This role identifier grants permission to mint and burn tokens. The role is computed as keccak256("ISSUER_ROLE").

Source

pub fn burn_blocked_role() -> B256

Returns the BURN_BLOCKED_ROLE constant

This role identifier grants permission to burn tokens from blocked accounts. The role is computed as keccak256("BURN_BLOCKED_ROLE").

Source

pub fn balance_of(&self, call: balanceOfCall) -> Result<U256>

Returns the token balance of account.

Source

pub fn allowance(&self, call: allowanceCall) -> Result<U256>

Returns the remaining allowance that spender can transfer on behalf of owner.

Source

pub fn change_transfer_policy_id( &mut self, msg_sender: Address, call: changeTransferPolicyIdCall, ) -> Result<()>

Updates the TIP403Registry transfer policy governing this token’s transfers.

§Errors
  • Unauthorized — caller does not hold DEFAULT_ADMIN_ROLE
  • InvalidTransferPolicyId — policy does not exist in the TIP403Registry
Source

pub fn set_supply_cap( &mut self, msg_sender: Address, call: setSupplyCapCall, ) -> Result<()>

Sets a new supply cap. Must be ≥ current total supply and ≤ U128_MAX.

§Errors
  • Unauthorized — caller does not hold DEFAULT_ADMIN_ROLE
  • InvalidSupplyCap — new cap is below current total supply
  • SupplyCapExceeded — new cap exceeds U128_MAX
Source

pub(crate) fn validate_logo_uri(uri: &str) -> Result<()>

Validates a logo URI against the TIP-1026 protocol rules:

Empty strings are accepted unconditionally.

Source

fn is_allowed_logo_uri(uri: &str) -> bool

Source

pub fn set_logo_uri( &mut self, msg_sender: Address, call: setLogoURICall, ) -> Result<()>

Sets the logo URI for this token (TIP-1026). Empty strings are valid and clear the URI.

§Errors
  • Unauthorized — caller does not hold DEFAULT_ADMIN_ROLE
  • LogoURITooLongbytes(newLogoURI).length > 256
  • InvalidLogoURInewLogoURI is non-empty and either has no parseable scheme (RFC 3986 §3.1) or its scheme is not in Self::ALLOWED_LOGO_URI_SCHEMES
Source

pub(crate) fn write_logo_uri( &mut self, updater: Address, new_logo_uri: String, ) -> Result<()>

Internal helper: runs Self::validate_logo_uri (length cap + scheme allowlist), stores the value, and emits LogoURIUpdated.

IMPORTANT: this function performs NO role check. It is the caller’s responsibility.

Source

pub fn pause(&mut self, msg_sender: Address, _call: pauseCall) -> Result<()>

Pauses all token transfers.

§Errors
  • Unauthorized — caller does not hold PAUSE_ROLE
Source

pub fn unpause(&mut self, msg_sender: Address, _call: unpauseCall) -> Result<()>

Unpauses token transfers.

§Errors
  • Unauthorized — caller does not hold UNPAUSE_ROLE
Source

pub fn set_next_quote_token( &mut self, msg_sender: Address, call: setNextQuoteTokenCall, ) -> Result<()>

Stages a new quote token. Must be finalized via Self::complete_quote_token_update. Validates that the candidate is a deployed TIP-20 token (via TIP20Factory) and, for USD-denominated tokens, that the candidate is also USD-denominated.

§Errors
  • Unauthorized — caller does not hold DEFAULT_ADMIN_ROLE
  • InvalidQuoteToken — token is pathUSD, candidate is not a deployed TIP-20, or USD currency mismatch
Source

pub fn complete_quote_token_update( &mut self, msg_sender: Address, _call: completeQuoteTokenUpdateCall, ) -> Result<()>

Finalizes the staged quote token update. Walks the quote-token chain to detect cycles before committing the change.

§Errors
  • Unauthorized — caller does not hold DEFAULT_ADMIN_ROLE
  • InvalidQuoteToken — update would create a cycle in the quote-token graph
Source

pub fn mint(&mut self, msg_sender: Address, call: mintCall) -> Result<()>

Mints amount tokens to the resolved target to address:

  • Enforces mint-recipient compliance via TIP403Registry and validates against supply cap
  • Resolves to via the AddressRegistry. If to is a virtual address, credits the resolved master and emits a two-hop Transfer and Mint(virtual, amount) events
§Errors
  • Unauthorized — caller does not hold the ISSUER_ROLE role
  • ContractPaused — (+T3) token is paused
  • InvalidRecipient — (+T3) recipient is zero or a TIP-20 prefix address
  • PolicyForbids — TIP-403 policy rejects the mint recipient
  • SupplyCapExceeded — minting would push total supply above the cap
Source

pub fn mint_with_memo( &mut self, msg_sender: Address, call: mintWithMemoCall, ) -> Result<()>

Like Self::mint, but attaches a 32-byte memo.

Source

pub(crate) fn _mint( &mut self, to: &Recipient, total_supply: U256, amount: U256, ) -> Result<()>

Internal helper to mint new tokens and update balances.

Source

pub fn burn(&mut self, msg_sender: Address, call: burnCall) -> Result<()>

Burns amount from the caller’s balance and reduces total supply.

§Errors
  • ContractPaused — (+T3) token is paused
  • Unauthorized — caller does not hold the ISSUER_ROLE role
  • InsufficientBalance — caller balance lower than burn amount
Source

pub fn burn_with_memo( &mut self, msg_sender: Address, call: burnWithMemoCall, ) -> Result<()>

Like Self::burn, but attaches a 32-byte memo.

Source

pub fn burn_blocked( &mut self, msg_sender: Address, owner: Address, amount: U256, check_protected: bool, ) -> Result<()>

Burns tokens from addresses blocked by TIP403Registry policy. Where owner refers to the account with ownership of the funds, either directly, or via the ReceivePolicyGuard.

§Errors
  • ContractPaused — (+T3) token is paused
  • Unauthorized — caller does not hold BURN_BLOCKED_ROLE
  • PolicyForbids — target address is not blocked by policy
  • ProtectedAddress — cannot burn from protected system custody addresses
Source

fn _burn(&mut self, msg_sender: Address, amount: U256) -> Result<()>

Source

pub fn approve( &mut self, msg_sender: Address, call: approveCall, ) -> Result<bool>

Sets spender’s allowance to amount for the caller’s tokens. Deducts from the caller’s AccountKeychain spending limit when the new allowance exceeds the previous one.

§Errors
  • SpendingLimitExceeded — new allowance exceeds access key spending limit
Source

pub fn nonces(&self, call: noncesCall) -> Result<U256>

Returns the current nonce for an address (EIP-2612)

Source

pub fn domain_separator(&self) -> Result<B256>

Returns the EIP-712 domain separator, computed dynamically from the token name and chain ID.

Source

pub fn permit(&mut self, call: permitCall) -> Result<()>

Sets allowance via a signed EIP-2612 permit. Validates the ECDSA signature, checks the deadline, and increments the nonce. Allowed even when the token is paused.

§Errors
  • PermitExpired — current timestamp exceeds permit deadline
  • InvalidSignature — ECDSA recovery failed or recovered signer ≠ owner
Source

pub fn transfer( &mut self, msg_sender: Address, call: transferCall, ) -> Result<bool>

Transfers amount tokens from the caller to to. Enforces compliance via the TIP403Registry and deducts from the caller’s AccountKeychain spending limit.

§Errors
  • Paused — token transfers are currently paused
  • InvalidRecipient — recipient address is zero
  • PolicyForbids — TIP-403 policy rejects sender or recipient
  • SpendingLimitExceeded — access key spending limit exceeded
  • InsufficientBalance — sender balance lower than transfer amount
Source

pub fn transfer_from( &mut self, msg_sender: Address, call: transferFromCall, ) -> Result<bool>

Transfers amount on behalf of from using the caller’s allowance. Enforces compliance via the TIP403Registry.

§Errors
  • Paused — token transfers are currently paused
  • InvalidRecipient — recipient address is zero
  • PolicyForbids — TIP-403 policy rejects sender or recipient
  • InsufficientAllowance — caller allowance lower than transfer amount
  • InsufficientBalancefrom balance lower than transfer amount
Source

pub fn transfer_from_with_memo( &mut self, msg_sender: Address, call: transferFromWithMemoCall, ) -> Result<bool>

Like Self::transfer_from, but attaches a 32-byte memo.

Source

pub fn system_transfer_from( &mut self, caller: Address, from: Address, amount: U256, ) -> Result<bool>

Transfers amount from from to to without checking allowances. For use by precompiles on the crate::address_registry::IMPLICIT_APPROVAL_LIST only — not exposed via ABI. Enforces compliance via the TIP403Registry and AccountKeychain.

caller is the address of the precompile invoking this function. Starting at TempoHardfork::T5 (TIP-1035), the call returns Unauthorized unless caller is on the Implicit Approval List. Pre-T5, caller is unchecked (preserves pre-TIP-1035 behavior of the existing internal-only caller, TipFeeManager).

Callers are also expected to pull only from the current msg.sender; this is a security guideline of TIP-1035 enforced at the call site, not by this function.

§Errors
  • Unauthorizedcaller is not on the Implicit Approval List (T5+)
  • Paused — token transfers are currently paused
  • InvalidRecipient — recipient address is zero
  • PolicyForbids — TIP-403 policy rejects sender or recipient
  • SpendingLimitExceeded — access key spending limit exceeded
  • InsufficientBalancefrom balance lower than transfer amount
Source

fn consume_allowance( &mut self, owner: Address, spender: Address, amount: U256, ) -> Result<()>

Debits spender’s allowance on owner. No-op when unlimited.

Source

pub fn transfer_with_memo( &mut self, msg_sender: Address, call: transferWithMemoCall, ) -> Result<()>

Like Self::transfer, but attaches a 32-byte memo.

Source§

impl TIP20Token

Source

pub fn from_address(address: Address) -> Result<Self>

Creates a TIP20Token handle from a raw address.

§Errors
  • InvalidToken — address does not carry the 0x20C0 TIP-20 prefix
Source

pub fn from_address_unchecked(address: Address) -> Self

Creates a TIP20Token without validating the prefix.

§Safety

Caller must ensure is_tip20_prefix(address) returns true.

Source

pub fn initialize( &mut self, msg_sender: Address, name: &str, symbol: &str, currency: &str, quote_token: Address, admin: Address, ) -> Result<()>

Initializes the TIP-20 token precompile with metadata, quote token, supply cap, and default admin role. Called once by TIP20Factory during token creation.

Source

fn get_balance(&self, account: Address) -> Result<U256>

Source

fn set_balance(&mut self, account: Address, amount: U256) -> Result<()>

Source

fn increment_balance(&mut self, account: Address, amount: U256) -> Result<()>

Source

fn decrement_balance(&mut self, account: Address, amount: U256) -> Result<()>

Source

fn get_allowance(&self, owner: Address, spender: Address) -> Result<U256>

Source

fn set_allowance( &mut self, owner: Address, spender: Address, amount: U256, ) -> Result<()>

Source

fn set_total_supply(&mut self, amount: U256) -> Result<()>

Source

pub fn check_not_paused(&self) -> Result<()>

Source

fn validate_transfer( &mut self, spender: Option<Address>, from: Address, to: Address, amount: U256, memo: B256, ) -> Result<Option<Recipient>>

Resolves to, checks pause state and recipient validity, ensures TIP-403 transfer authorization, and runs the caller-specific spend check. Additionally (+T6) applies TIP-1028 address-level receive policies.

Updates the sender’s AccountKeychain spending limit for direct transfers, and consumes allowance for transfer_from style calls.

Returns Some(to) when the caller should perform the normal transfer. Returns None when funds were blocked, and the caller should return immediately.

Source

fn validate_mint( &mut self, msg_sender: Address, to: Address, amount: U256, memo: B256, ) -> Result<Option<(U256, Recipient)>>

Resolves to, checks the issuer role, and ensures TIP-403 mint-recipient authorization. Additionally (+T3) checks pause state and validates the effective recipient; also (+T6) applies TIP-1028 address-level receive policies.

Returns Some(to) when the caller should proceed with the regular mint. Returns None when funds were minted and blocked, and the caller should return immediately.

Source

pub fn is_transfer_authorized(&self, from: Address, to: Address) -> Result<bool>

Check whether a transfer is authorized by the token’s TIP403Registry policy. TIP-1015: For T2+, uses directional sender/recipient checks.

Source

pub fn ensure_transfer_authorized( &self, from: Address, to: Address, ) -> Result<()>

Ensures the transfer is authorized by the token’s TIP403Registry policy.

§Errors
  • PolicyForbids — sender or recipient is not authorized by the active transfer policy
Source

pub fn ensure_authorized_as(&self, user: Address, role: AuthRole) -> Result<()>

Check whether a user is authorized by the token’s TIP403Registry policy for a given role.

§Errors
  • PolicyForbids — user is not authorized for the requested role by the active transfer policy
Source

pub fn check_and_update_spending_limit( &mut self, from: Address, amount: U256, ) -> Result<()>

Checks and deducts amount from the caller’s AccountKeychain spending limit.

§Errors
  • SpendingLimitExceeded — access key spending limit exceeded
Source

pub(crate) fn _transfer( &mut self, from: Address, to: &Recipient, amount: U256, ) -> Result<()>

Core transfer: debits from, credits to.target, emits Transfer(from, event_addr, amount).

For virtual recipients the event address is the virtual alias; the balance update always targets to.target (the resolved master).

Source

pub(crate) fn validate_inbound_or_block( &mut self, originator: Address, to: &Recipient, amount: U256, mint_total_supply: Option<U256>, memo: B256, ) -> Result<bool>

Validates the receive policy of to.target. If blocked, moves the funds into the guard account and stores a claim receipt; returns true. Returns false when the inbound is authorized and the caller should proceed with the normal transfer or mint.

Source

pub(crate) fn release_blocked_funds( &mut self, originator: Address, receiver: Address, to: Address, amount: U256, recovery_mode: RecoveryMode, recovery_auth: Address, ) -> Result<()>

Releases guarded funds to to. Resumes skip policy checks. Reroutes revalidate the transfer and receive policies and meter the spending limit.

Source

pub fn transfer_fee_pre_tx(&mut self, from: Address, amount: U256) -> Result<()>

Transfers fee tokens from from to the fee manager before transaction execution. Respects the token’s pause state and deducts from the AccountKeychain spending limit.

§Errors
  • Paused — token transfers are currently paused
  • InsufficientBalance — sender balance lower than fee amount
  • SpendingLimitExceeded — access key spending limit exceeded
Source

pub fn transfer_fee_post_tx( &mut self, to: Address, refund: U256, actual_spending: U256, ) -> Result<()>

Refunds unused fee tokens from the fee manager back to to and emits a transfer event for the actual gas spent. Intentionally allowed when paused so that a pause transaction can still receive its fee refund. On T1C+, also restores the AccountKeychain spending limit by the refund amount.

Source§

impl TIP20Token

Source

pub fn create_precompile( address: Address, cfg: &CfgEnv<TempoHardfork>, actions: StorageActions, ) -> DynPrecompile

Creates the EVM precompile for this type.

Trait Implementations§

Source§

impl ContractStorage for TIP20Token

Source§

fn address(&self) -> Address

Contract address.
Source§

fn storage(&self) -> &StorageCtx

Contract storage accessor.
Source§

fn storage_mut(&mut self) -> &mut StorageCtx

Contract storage mutable accessor.
Source§

fn is_initialized(&self) -> Result<bool>

Returns true if the contract has been initialized (has bytecode deployed).
Source§

impl Precompile for TIP20Token

Source§

fn call(&mut self, calldata: &[u8], msg_sender: Address) -> PrecompileResult

Dispatches an EVM call to this precompile. Read more

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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<TxEnv, T> FromRecoveredTx<&T> for TxEnv
where TxEnv: FromRecoveredTx<T>,

§

fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv

Builds a [TxEnv] from a transaction and a sender address.
§

impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnv
where TxEnv: FromTxWithEncoded<T>,

§

fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv

Builds a [TxEnv] from a transaction, its sender, and encoded transaction bytes.
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

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

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

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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
§

impl<T> IntoRequest<T> for T

§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<L> LayerExt<L> for L

§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in [Layered].
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

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

§

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
§

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> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> ServiceExt for T

§

fn propagate_header(self, header: HeaderName) -> PropagateHeader<Self>
where Self: Sized,

Available on crate feature propagate-header only.
Propagate a header from the request to the response. Read more
§

fn add_extension<T>(self, value: T) -> AddExtension<Self, T>
where Self: Sized,

Available on crate feature add-extension only.
Add some shareable value to request extensions. Read more
§

fn map_request_body<F>(self, f: F) -> MapRequestBody<Self, F>
where Self: Sized,

Available on crate feature map-request-body only.
Apply a transformation to the request body. Read more
§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Available on crate feature map-response-body only.
Apply a transformation to the response body. Read more
§

fn compression(self) -> Compression<Self>
where Self: Sized,

Available on crate features compression-br or compression-deflate or compression-gzip or compression-zstd only.
Compresses response bodies. Read more
§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Available on crate features decompression-br or decompression-deflate or decompression-gzip or decompression-zstd only.
Decompress response bodies. Read more
§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

Available on crate feature trace only.
High level tracing that classifies responses using HTTP status codes. Read more
§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

Available on crate feature trace only.
High level tracing that classifies responses using gRPC headers. Read more
§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Available on crate feature follow-redirect only.
Follow redirect resposes using the Standard policy. Read more
§

fn sensitive_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>
where Self: Sized,

Available on crate feature sensitive-headers only.
Mark headers as sensitive on both requests and responses. Read more
§

fn sensitive_request_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<Self>
where Self: Sized,

Available on crate feature sensitive-headers only.
Mark headers as sensitive on requests. Read more
§

fn sensitive_response_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveResponseHeaders<Self>
where Self: Sized,

Available on crate feature sensitive-headers only.
Mark headers as sensitive on responses. Read more
§

fn override_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Available on crate feature set-header only.
Insert a header into the request. Read more
§

fn append_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Available on crate feature set-header only.
Append a header into the request. Read more
§

fn insert_request_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Available on crate feature set-header only.
Insert a header into the request, if the header is not already present. Read more
§

fn override_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Available on crate feature set-header only.
Insert a header into the response. Read more
§

fn append_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Available on crate feature set-header only.
Append a header into the response. Read more
§

fn insert_response_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Available on crate feature set-header only.
Insert a header into the response, if the header is not already present. Read more
§

fn set_request_id<M>( self, header_name: HeaderName, make_request_id: M, ) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Available on crate feature request-id only.
Add request id header and extension. Read more
§

fn set_x_request_id<M>(self, make_request_id: M) -> SetRequestId<Self, M>
where Self: Sized, M: MakeRequestId,

Available on crate feature request-id only.
Add request id header and extension, using x-request-id as the header name. Read more
§

fn propagate_request_id( self, header_name: HeaderName, ) -> PropagateRequestId<Self>
where Self: Sized,

Available on crate feature request-id only.
Propgate request ids from requests to responses. Read more
§

fn propagate_x_request_id(self) -> PropagateRequestId<Self>
where Self: Sized,

Available on crate feature request-id only.
Propgate request ids from requests to responses, using x-request-id as the header name. Read more
§

fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>
where Self: Sized,

Available on crate feature catch-panic only.
Catch panics and convert them into 500 Internal Server responses. Read more
§

fn request_body_limit(self, limit: usize) -> RequestBodyLimit<Self>
where Self: Sized,

Available on crate feature limit only.
Intercept requests with over-sized payloads and convert them into 413 Payload Too Large responses. Read more
§

fn trim_trailing_slash(self) -> NormalizePath<Self>
where Self: Sized,

Available on crate feature normalize-path only.
Remove trailing slashes from paths. Read more
§

fn append_trailing_slash(self) -> NormalizePath<Self>
where Self: Sized,

Available on crate feature normalize-path only.
Append trailing slash to paths. Read more
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
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

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 1488 bytes