Address Contract Verified
Address
0x829dE46686CD24EdFcd28763a70034B3B9B4D7CD
Balance
0 ETH
Nonce
1
Code Size
383 bytes
Creator
0xB9FF687f...19E5 at tx 0x4676d2d7...8cf6e6
Indexed Transactions
0 (1 on-chain, 1.3% indexed)
Contract Bytecode
383 bytes
0x608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063679aefce14610038578063c765f60514610053575b5f80fd5b61004061009f565b6040519081526020015b60405180910390f35b61007a7f00000000000000000000000099999999999999cc837c997b882957dafdcb1af981565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161004a565b5f7f00000000000000000000000099999999999999cc837c997b882957dafdcb1af973ffffffffffffffffffffffffffffffffffffffff1663540385a36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061012d9190610132565b905090565b5f60208284031215610142575f80fd5b505191905056fea264697066735822122036c3f126ce090692ba5297802cb789cceffdb91fd0324c0a5e9a0dc0615fce6d64736f6c634300081a0033
Verified Source Code Full Match
Compiler: v0.8.26+commit.8a97fa7a
EVM: cancun
Optimization: Yes (20000 runs)
WusdnBalancerAdaptor.sol 34 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import { IWusdn } from "./../interfaces/Usdn/IWusdn.sol";
interface IWusdnBalancerAdaptor {
/**
* @notice Gets the WUSDN token.
* @return wusdn_ The WUSDN token.
*/
function WUSDN() external view returns (IWusdn wusdn_);
/**
* @notice Gets the current redemption rate.
* @return rate_ Number of USDN tokens per WUSDN token.
*/
function getRate() external view returns (uint256 rate_);
}
/// @title Balancer.fi Adaptor to Get USDN Redemption Rate
contract WusdnBalancerAdaptor is IWusdnBalancerAdaptor {
/// @inheritdoc IWusdnBalancerAdaptor
IWusdn public immutable WUSDN;
/// @param wusdn The address of the WUSDN token.
constructor(IWusdn wusdn) {
WUSDN = wusdn;
}
/// @inheritdoc IWusdnBalancerAdaptor
function getRate() external view returns (uint256 rate_) {
return WUSDN.redemptionRate();
}
}
IWusdn.sol 120 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
import { IUsdn } from "./IUsdn.sol";
import { IWusdnErrors } from "./IWusdnErrors.sol";
import { IWusdnEvents } from "./IWusdnEvents.sol";
/**
* @title Wusdn Interface
* @notice Interface for the Wrapped Ultimate Synthetic Delta Neutral (WUSDN) token.
*/
interface IWusdn is IERC20Metadata, IERC20Permit, IWusdnEvents, IWusdnErrors {
/**
* @notice Returns the address of the USDN token.
* @return The address of the USDN token.
*/
function USDN() external view returns (IUsdn);
/**
* @notice Returns the ratio used to convert USDN shares to WUSDN amounts.
* @dev This ratio is initialized in the constructor based on the maximum divisor of the USDN token.
* @return The conversion ratio between USDN shares and WUSDN amounts.
*/
function SHARES_RATIO() external view returns (uint256);
/**
* @notice Wraps a given amount of USDN into WUSDN.
* @dev This function may use slightly less than `usdnAmount` due to rounding errors.
* For a more precise operation, use {wrapShares}.
* @param usdnAmount The amount of USDN to wrap.
* @return wrappedAmount_ The amount of WUSDN received.
*/
function wrap(uint256 usdnAmount) external returns (uint256 wrappedAmount_);
/**
* @notice Wraps a given amount of USDN into WUSDN and sends it to a specified address.
* @dev This function may use slightly less than `usdnAmount` due to rounding errors.
* For a more precise operation, use {wrapShares}.
* @param usdnAmount The amount of USDN to wrap.
* @param to The address to receive the WUSDN.
* @return wrappedAmount_ The amount of WUSDN received.
*/
function wrap(uint256 usdnAmount, address to) external returns (uint256 wrappedAmount_);
/**
* @notice Wraps a given amount of USDN shares into WUSDN and sends it to a specified address.
* @param usdnShares The amount of USDN shares to wrap.
* @param to The address to receive the WUSDN.
* @return wrappedAmount_ The amount of WUSDN received.
*/
function wrapShares(uint256 usdnShares, address to) external returns (uint256 wrappedAmount_);
/**
* @notice Unwraps a given amount of WUSDN into USDN.
* @param wusdnAmount The amount of WUSDN to unwrap.
* @return usdnAmount_ The amount of USDN received.
*/
function unwrap(uint256 wusdnAmount) external returns (uint256 usdnAmount_);
/**
* @notice Unwraps a given amount of WUSDN into USDN and sends it to a specified address.
* @param wusdnAmount The amount of WUSDN to unwrap.
* @param to The address to receive the USDN.
* @return usdnAmount_ The amount of USDN received.
*/
function unwrap(uint256 wusdnAmount, address to) external returns (uint256 usdnAmount_);
/**
* @notice Computes the amount of WUSDN that would be received for a given amount of USDN.
* @dev The actual amount received may differ slightly due to rounding errors.
* For a precise value, use {previewWrapShares}.
* @param usdnAmount The amount of USDN to wrap.
* @return wrappedAmount_ The estimated amount of WUSDN that would be received.
*/
function previewWrap(uint256 usdnAmount) external view returns (uint256 wrappedAmount_);
/**
* @notice Computes the amount of WUSDN that would be received for a given amount of USDN shares.
* @param usdnShares The amount of USDN shares to wrap.
* @return wrappedAmount_ The amount of WUSDN that would be received.
*/
function previewWrapShares(uint256 usdnShares) external view returns (uint256 wrappedAmount_);
/**
* @notice Returns the exchange rate between WUSDN and USDN.
* @return usdnAmount_ The amount of USDN that corresponds to 1 WUSDN.
*/
function redemptionRate() external view returns (uint256 usdnAmount_);
/**
* @notice Computes the amount of USDN that would be received for a given amount of WUSDN.
* @dev The actual amount received may differ slightly due to rounding errors.
* For a precise value, use {previewUnwrapShares}.
* @param wusdnAmount The amount of WUSDN to unwrap.
* @return usdnAmount_ The estimated amount of USDN that would be received.
*/
function previewUnwrap(uint256 wusdnAmount) external view returns (uint256 usdnAmount_);
/**
* @notice Computes the amount of USDN shares that would be received for a given amount of WUSDN.
* @param wusdnAmount The amount of WUSDN to unwrap.
* @return usdnSharesAmount_ The amount of USDN shares that would be received.
*/
function previewUnwrapShares(uint256 wusdnAmount) external view returns (uint256 usdnSharesAmount_);
/**
* @notice Returns the total amount of USDN held by the contract.
* @return The total amount of USDN held by the contract.
*/
function totalUsdnBalance() external view returns (uint256);
/**
* @notice Returns the total amount of USDN shares held by the contract.
* @return The total amount of USDN shares held by the contract.
*/
function totalUsdnShares() external view returns (uint256);
}
IERC20Metadata.sol 26 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
IERC20Permit.sol 90 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[ERC-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC-20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
IUsdn.sol 201 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";
import { IRebaseCallback } from "./IRebaseCallback.sol";
import { IUsdnErrors } from "./IUsdnErrors.sol";
import { IUsdnEvents } from "./IUsdnEvents.sol";
/**
* @title USDN token interface
* @notice Implements the ERC-20 token standard as well as the EIP-2612 permit extension. Additional functions related
* to the specifics of this token are included below.
*/
interface IUsdn is IERC20, IERC20Metadata, IERC20Permit, IUsdnEvents, IUsdnErrors {
/**
* @notice Returns the total number of shares in existence.
* @return shares_ The number of shares.
*/
function totalShares() external view returns (uint256 shares_);
/**
* @notice Returns the number of shares owned by `account`.
* @param account The account to query.
* @return shares_ The number of shares.
*/
function sharesOf(address account) external view returns (uint256 shares_);
/**
* @notice Transfers a given amount of shares from the `msg.sender` to `to`.
* @param to Recipient of the shares.
* @param value Number of shares to transfer.
* @return success_ Indicates whether the transfer was successfully executed.
*/
function transferShares(address to, uint256 value) external returns (bool success_);
/**
* @notice Transfers a given amount of shares from the `from` to `to`.
* @dev There should be sufficient allowance for the spender. Be mindful of the rebase logic. The allowance is in
* tokens. So, after a rebase, the same amount of shares will be worth a higher amount of tokens. In that case,
* the allowance of the initial approval will not be enough to transfer the new amount of tokens. This can
* also happen when your transaction is in the mempool and the rebase happens before your transaction. Also note
* that the amount of tokens deduced from the allowance is rounded up, so the `convertToTokensRoundUp` function
* should be used when converting shares into an allowance value.
* @param from The owner of the shares.
* @param to Recipient of the shares.
* @param value Number of shares to transfer.
* @return success_ Indicates whether the transfer was successfully executed.
*/
function transferSharesFrom(address from, address to, uint256 value) external returns (bool success_);
/**
* @notice Mints new shares, providing a token value.
* @dev Caller must have the MINTER_ROLE.
* @param to Account to receive the new shares.
* @param amount Amount of tokens to mint, is internally converted to the proper shares amounts.
*/
function mint(address to, uint256 amount) external;
/**
* @notice Mints new shares, providing a share value.
* @dev Caller must have the MINTER_ROLE.
* @param to Account to receive the new shares.
* @param amount Amount of shares to mint.
* @return mintedTokens_ Amount of tokens that were minted (informational).
*/
function mintShares(address to, uint256 amount) external returns (uint256 mintedTokens_);
/**
* @notice Destroys a `value` amount of tokens from the caller, reducing the total supply.
* @param value Amount of tokens to burn, is internally converted to the proper shares amounts.
*/
function burn(uint256 value) external;
/**
* @notice Destroys a `value` amount of tokens from `account`, deducting from the caller's allowance.
* @param account Account to burn tokens from.
* @param value Amount of tokens to burn, is internally converted to the proper shares amounts.
*/
function burnFrom(address account, uint256 value) external;
/**
* @notice Destroys a `value` amount of shares from the caller, reducing the total supply.
* @param value Amount of shares to burn.
*/
function burnShares(uint256 value) external;
/**
* @notice Destroys a `value` amount of shares from `account`, deducting from the caller's allowance.
* @dev There should be sufficient allowance for the spender. Be mindful of the rebase logic. The allowance is in
* tokens. So, after a rebase, the same amount of shares will be worth a higher amount of tokens. In that case,
* the allowance of the initial approval will not be enough to transfer the new amount of tokens. This can
* also happen when your transaction is in the mempool and the rebase happens before your transaction. Also note
* that the amount of tokens deduced from the allowance is rounded up, so the `convertToTokensRoundUp` function
* should be used when converting shares into an allowance value.
* @param account Account to burn shares from.
* @param value Amount of shares to burn.
*/
function burnSharesFrom(address account, uint256 value) external;
/**
* @notice Converts a number of tokens to the corresponding amount of shares.
* @dev The conversion reverts with `UsdnMaxTokensExceeded` if the corresponding amount of shares overflows.
* @param amountTokens The amount of tokens to convert to shares.
* @return shares_ The corresponding amount of shares.
*/
function convertToShares(uint256 amountTokens) external view returns (uint256 shares_);
/**
* @notice Converts a number of shares to the corresponding amount of tokens.
* @dev The conversion never overflows as we are performing a division. The conversion rounds to the nearest amount
* of tokens that minimizes the error when converting back to shares.
* @param amountShares The amount of shares to convert to tokens.
* @return tokens_ The corresponding amount of tokens.
*/
function convertToTokens(uint256 amountShares) external view returns (uint256 tokens_);
/**
* @notice Converts a number of shares to the corresponding amount of tokens, rounding up.
* @dev Use this function to determine the amount of a token approval, as we always round up when deducting from
* a token transfer allowance.
* @param amountShares The amount of shares to convert to tokens.
* @return tokens_ The corresponding amount of tokens, rounded up.
*/
function convertToTokensRoundUp(uint256 amountShares) external view returns (uint256 tokens_);
/**
* @notice Returns the current maximum tokens supply, given the current divisor.
* @dev This function is used to check if a conversion operation would overflow.
* @return maxTokens_ The maximum number of tokens that can exist.
*/
function maxTokens() external view returns (uint256 maxTokens_);
/**
* @notice Decreases the global divisor, which effectively grows all balances and the total supply.
* @dev If the provided divisor is larger than or equal to the current divisor value, no rebase will happen
* If the new divisor is smaller than `MIN_DIVISOR`, the value will be clamped to `MIN_DIVISOR`.
* Caller must have the `REBASER_ROLE`.
* @param newDivisor The new divisor, should be strictly smaller than the current one and greater or equal to
* `MIN_DIVISOR`.
* @return rebased_ Whether a rebase happened.
* @return oldDivisor_ The previous value of the divisor.
* @return callbackResult_ The result of the callback, if a rebase happened and a callback handler is defined.
*/
function rebase(uint256 newDivisor)
external
returns (bool rebased_, uint256 oldDivisor_, bytes memory callbackResult_);
/**
* @notice Sets the rebase handler address.
* @dev Emits a `RebaseHandlerUpdated` event.
* If set to the zero address, no handler will be called after a rebase.
* Caller must have the `DEFAULT_ADMIN_ROLE`.
* @param newHandler The new handler address.
*/
function setRebaseHandler(IRebaseCallback newHandler) external;
/* -------------------------------------------------------------------------- */
/* Dev view functions */
/* -------------------------------------------------------------------------- */
/**
* @notice Gets the current value of the divisor that converts between tokens and shares.
* @return divisor_ The current divisor.
*/
function divisor() external view returns (uint256 divisor_);
/**
* @notice Gets the rebase handler address, which is called whenever a rebase happens.
* @return rebaseHandler_ The rebase handler address.
*/
function rebaseHandler() external view returns (IRebaseCallback rebaseHandler_);
/**
* @notice Gets the minter role signature.
* @return minter_role_ The role signature.
*/
function MINTER_ROLE() external pure returns (bytes32 minter_role_);
/**
* @notice Gets the rebaser role signature.
* @return rebaser_role_ The role signature.
*/
function REBASER_ROLE() external pure returns (bytes32 rebaser_role_);
/**
* @notice Gets the maximum value of the divisor, which is also the initial value.
* @return maxDivisor_ The maximum divisor.
*/
function MAX_DIVISOR() external pure returns (uint256 maxDivisor_);
/**
* @notice Gets the minimum acceptable value of the divisor.
* @dev The minimum divisor that can be set. This corresponds to a growth of 1B times. Technically, 1e5 would still
* work without precision errors.
* @return minDivisor_ The minimum divisor.
*/
function MIN_DIVISOR() external pure returns (uint256 minDivisor_);
}
IWusdnErrors.sol 20 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
/**
* @title Errors For The WUSDN Token Contract
* @notice Defines all custom errors emitted by the WUSDN token contract.
*/
interface IWusdnErrors {
/**
* @dev The user has insufficient USDN balance to wrap the given `usdnAmount`.
* @param usdnAmount The amount of USDN the user attempted to wrap.
*/
error WusdnInsufficientBalance(uint256 usdnAmount);
/**
* @dev The user is attempting to wrap an amount of USDN shares that is lower than the minimum:
* {IWusdn.SHARES_RATIO}, required by the WUSDN token. This results in a wrapped amount of zero WUSDN.
*/
error WusdnWrapZeroAmount();
}
IWusdnEvents.sol 26 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
/**
* @title Events for the WUSDN Token Contract
* @notice Defines all custom events emitted by the WUSDN token contract.
*/
interface IWusdnEvents {
/**
* @notice The user wrapped USDN to mint WUSDN tokens.
* @param from The address of the user who wrapped the USDN.
* @param to The address of the recipient who received the WUSDN tokens.
* @param usdnAmount The amount of USDN tokens wrapped.
* @param wusdnAmount The amount of WUSDN tokens minted.
*/
event Wrap(address indexed from, address indexed to, uint256 usdnAmount, uint256 wusdnAmount);
/**
* @notice The user unwrapped WUSDN tokens to redeem USDN.
* @param from The address of the user who unwrapped the WUSDN tokens.
* @param to The address of the recipient who received the USDN tokens.
* @param wusdnAmount The amount of WUSDN tokens unwrapped.
* @param usdnAmount The amount of USDN tokens redeemed.
*/
event Unwrap(address indexed from, address indexed to, uint256 wusdnAmount, uint256 usdnAmount);
}
IERC20.sol 79 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
IRebaseCallback.sol 12 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
interface IRebaseCallback {
/**
* @notice Called by the USDN token after a rebase has happened.
* @param oldDivisor The value of the divisor before the rebase.
* @param newDivisor The value of the divisor after the rebase (necessarily smaller than `oldDivisor`).
* @return result_ Arbitrary data that will be forwarded to the caller of `rebase`.
*/
function rebaseCallback(uint256 oldDivisor, uint256 newDivisor) external returns (bytes memory result_);
}
IUsdnErrors.sol 25 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
/**
* @title Errors for the USDN token contract
* @notice Defines all custom errors emitted by the USDN token contract.
*/
interface IUsdnErrors {
/**
* @dev The amount of tokens exceeds the maximum allowed limit.
* @param value The invalid token value.
*/
error UsdnMaxTokensExceeded(uint256 value);
/**
* @dev The sender's share balance is insufficient.
* @param sender The sender's address.
* @param balance The current share balance of the sender.
* @param needed The required amount of shares for the transfer.
*/
error UsdnInsufficientSharesBalance(address sender, uint256 balance, uint256 needed);
/// @dev The divisor value in storage is invalid (< 1).
error UsdnInvalidDivisor();
}
IUsdnEvents.sol 24 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;
import { IRebaseCallback } from "./IRebaseCallback.sol";
/**
* @title Events for the USDN token contract
* @notice Defines all custom events emitted by the USDN token contract.
*/
interface IUsdnEvents {
/**
* @notice The divisor was updated, emitted during a rebase.
* @param oldDivisor The divisor value before the rebase.
* @param newDivisor The new divisor value.
*/
event Rebase(uint256 oldDivisor, uint256 newDivisor);
/**
* @notice The rebase handler address was updated.
* @dev The rebase handler is a contract that is called when a rebase occurs.
* @param newHandler The address of the new rebase handler contract.
*/
event RebaseHandlerUpdated(IRebaseCallback newHandler);
}
Read Contract
WUSDN 0xc765f605 → address
getRate 0x679aefce → uint256
Recent Transactions
This address has 1 on-chain transactions, but only 1.3% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →