Token Stake DAO Token

 

Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
65.352118 SDT

Holders:
3 addresses

Transfers:
-

Contract:
0x07715EE7219B07b8e01CC7d2787f4e5e758603830x07715EE7219B07b8e01CC7d2787f4e5e75860383

Decimals:
18

Social Profiles:
Not Available, Update ?

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SDT

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
/**
 *Submitted for verification at Arbiscan.io on 2024-01-30
*/

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.19;

/// @notice Simple ERC20 + EIP-2612 implementation.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)
///
/// @dev Note:
/// - The ERC20 standard allows minting and transferring to and from the zero address,
///   minting and transferring zero tokens, as well as self-approvals.
///   For performance, this implementation WILL NOT revert for such actions.
///   Please add any checks with overrides if desired.
/// - The `permit` function uses the ecrecover precompile (0x1).
///
/// If you are overriding:
/// - NEVER violate the ERC20 invariant:
///   the total sum of all balances must be equal to `totalSupply()`.
/// - Check that the overridden function is actually used in the function you want to
///   change the behavior of. Much of the code has been manually inlined for performance.
abstract contract ERC20 {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The total supply has overflowed.
    error TotalSupplyOverflow();

    /// @dev The allowance has overflowed.
    error AllowanceOverflow();

    /// @dev The allowance has underflowed.
    error AllowanceUnderflow();

    /// @dev Insufficient balance.
    error InsufficientBalance();

    /// @dev Insufficient allowance.
    error InsufficientAllowance();

    /// @dev The permit is invalid.
    error InvalidPermit();

    /// @dev The permit has expired.
    error PermitExpired();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Emitted when `amount` tokens is transferred from `from` to `to`.
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @dev Emitted when `amount` tokens is approved by `owner` to be used by `spender`.
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /// @dev `keccak256(bytes("Transfer(address,address,uint256)"))`.
    uint256 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    /// @dev `keccak256(bytes("Approval(address,address,uint256)"))`.
    uint256 private constant _APPROVAL_EVENT_SIGNATURE =
        0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The storage slot for the total supply.
    uint256 private constant _TOTAL_SUPPLY_SLOT = 0x05345cdf77eb68f44c;

    /// @dev The balance slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _BALANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let balanceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _BALANCE_SLOT_SEED = 0x87a211a2;

    /// @dev The allowance slot of (`owner`, `spender`) is given by:
    /// ```
    ///     mstore(0x20, spender)
    ///     mstore(0x0c, _ALLOWANCE_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let allowanceSlot := keccak256(0x0c, 0x34)
    /// ```
    uint256 private constant _ALLOWANCE_SLOT_SEED = 0x7f5e9f20;

    /// @dev The nonce slot of `owner` is given by:
    /// ```
    ///     mstore(0x0c, _NONCES_SLOT_SEED)
    ///     mstore(0x00, owner)
    ///     let nonceSlot := keccak256(0x0c, 0x20)
    /// ```
    uint256 private constant _NONCES_SLOT_SEED = 0x38377508;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         CONSTANTS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev `(_NONCES_SLOT_SEED << 16) | 0x1901`.
    uint256 private constant _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX = 0x383775081901;

    /// @dev `keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)")`.
    bytes32 private constant _DOMAIN_TYPEHASH =
        0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    /// @dev `keccak256("1")`.
    bytes32 private constant _VERSION_HASH =
        0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6;

    /// @dev `keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")`.
    bytes32 private constant _PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       ERC20 METADATA                       */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the name of the token.
    function name() public view virtual returns (string memory);

    /// @dev Returns the symbol of the token.
    function symbol() public view virtual returns (string memory);

    /// @dev Returns the decimals places of the token.
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           ERC20                            */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the amount of tokens in existence.
    function totalSupply() public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_TOTAL_SUPPLY_SLOT)
        }
    }

    /// @dev Returns the amount of tokens owned by `owner`.
    function balanceOf(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Returns the amount of tokens that `spender` can spend on behalf of `owner`.
    function allowance(address owner, address spender)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x34))
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
    ///
    /// Emits a {Approval} event.
    function approve(address spender, uint256 amount) public virtual returns (bool) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, caller(), shr(96, mload(0x2c)))
        }
        return true;
    }

    /// @dev Transfer `amount` tokens from the caller to `to`.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    ///
    /// Emits a {Transfer} event.
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        _beforeTokenTransfer(msg.sender, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, caller())
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, caller(), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(msg.sender, to, amount);
        return true;
    }

    /// @dev Transfers `amount` tokens from `from` to `to`.
    ///
    /// Note: Does not update the allowance if it is the maximum uint256 value.
    ///
    /// Requirements:
    /// - `from` must at least have `amount`.
    /// - The caller must have at least `amount` of allowance to transfer the tokens of `from`.
    ///
    /// Emits a {Transfer} event.
    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        _beforeTokenTransfer(from, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the allowance slot and load its value.
            mstore(0x20, caller())
            mstore(0x0c, or(from_, _ALLOWANCE_SLOT_SEED))
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if add(allowance_, 1) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(from, to, amount);
        return true;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          EIP-2612                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev For more performance, override to return the constant value
    /// of `keccak256(bytes(name()))` if `name()` will never change.
    function _constantNameHash() internal view virtual returns (bytes32 result) {}

    /// @dev Returns the current nonce for `owner`.
    /// This value is used to compute the signature for EIP-2612 permit.
    function nonces(address owner) public view virtual returns (uint256 result) {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the nonce slot and load its value.
            mstore(0x0c, _NONCES_SLOT_SEED)
            mstore(0x00, owner)
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /// @dev Sets `value` as the allowance of `spender` over the tokens of `owner`,
    /// authorized by a signed approval by `owner`.
    ///
    /// Emits a {Approval} event.
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        bytes32 nameHash = _constantNameHash();
        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.
        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
        /// @solidity memory-safe-assembly
        assembly {
            // Revert if the block timestamp is greater than `deadline`.
            if gt(timestamp(), deadline) {
                mstore(0x00, 0x1a15a3cc) // `PermitExpired()`.
                revert(0x1c, 0x04)
            }
            let m := mload(0x40) // Grab the free memory pointer.
            // Clean the upper 96 bits.
            owner := shr(96, shl(96, owner))
            spender := shr(96, shl(96, spender))
            // Compute the nonce slot and load its value.
            mstore(0x0e, _NONCES_SLOT_SEED_WITH_SIGNATURE_PREFIX)
            mstore(0x00, owner)
            let nonceSlot := keccak256(0x0c, 0x20)
            let nonceValue := sload(nonceSlot)
            // Prepare the domain separator.
            mstore(m, _DOMAIN_TYPEHASH)
            mstore(add(m, 0x20), nameHash)
            mstore(add(m, 0x40), _VERSION_HASH)
            mstore(add(m, 0x60), chainid())
            mstore(add(m, 0x80), address())
            mstore(0x2e, keccak256(m, 0xa0))
            // Prepare the struct hash.
            mstore(m, _PERMIT_TYPEHASH)
            mstore(add(m, 0x20), owner)
            mstore(add(m, 0x40), spender)
            mstore(add(m, 0x60), value)
            mstore(add(m, 0x80), nonceValue)
            mstore(add(m, 0xa0), deadline)
            mstore(0x4e, keccak256(m, 0xc0))
            // Prepare the ecrecover calldata.
            mstore(0x00, keccak256(0x2c, 0x42))
            mstore(0x20, and(0xff, v))
            mstore(0x40, r)
            mstore(0x60, s)
            let t := staticcall(gas(), 1, 0, 0x80, 0x20, 0x20)
            // If the ecrecover fails, the returndatasize will be 0x00,
            // `owner` will be checked if it equals the hash at 0x00,
            // which evaluates to false (i.e. 0), and we will revert.
            // If the ecrecover succeeds, the returndatasize will be 0x20,
            // `owner` will be compared against the returned address at 0x20.
            if iszero(eq(mload(returndatasize()), owner)) {
                mstore(0x00, 0xddafbaef) // `InvalidPermit()`.
                revert(0x1c, 0x04)
            }
            // Increment and store the updated nonce.
            sstore(nonceSlot, add(nonceValue, t)) // `t` is 1 if ecrecover succeeds.
            // Compute the allowance slot and store the value.
            // The `owner` is already at slot 0x20.
            mstore(0x40, or(shl(160, _ALLOWANCE_SLOT_SEED), spender))
            sstore(keccak256(0x2c, 0x34), value)
            // Emit the {Approval} event.
            log3(add(m, 0x60), 0x20, _APPROVAL_EVENT_SIGNATURE, owner, spender)
            mstore(0x40, m) // Restore the free memory pointer.
            mstore(0x60, 0) // Restore the zero pointer.
        }
    }

    /// @dev Returns the EIP-712 domain separator for the EIP-2612 permit.
    function DOMAIN_SEPARATOR() public view virtual returns (bytes32 result) {
        bytes32 nameHash = _constantNameHash();
        //  We simply calculate it on-the-fly to allow for cases where the `name` may change.
        if (nameHash == bytes32(0)) nameHash = keccak256(bytes(name()));
        /// @solidity memory-safe-assembly
        assembly {
            let m := mload(0x40) // Grab the free memory pointer.
            mstore(m, _DOMAIN_TYPEHASH)
            mstore(add(m, 0x20), nameHash)
            mstore(add(m, 0x40), _VERSION_HASH)
            mstore(add(m, 0x60), chainid())
            mstore(add(m, 0x80), address())
            result := keccak256(m, 0xa0)
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL MINT FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Mints `amount` tokens to `to`, increasing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _mint(address to, uint256 amount) internal virtual {
        _beforeTokenTransfer(address(0), to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let totalSupplyBefore := sload(_TOTAL_SUPPLY_SLOT)
            let totalSupplyAfter := add(totalSupplyBefore, amount)
            // Revert if the total supply overflows.
            if lt(totalSupplyAfter, totalSupplyBefore) {
                mstore(0x00, 0xe5cfe957) // `TotalSupplyOverflow()`.
                revert(0x1c, 0x04)
            }
            // Store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, totalSupplyAfter)
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, 0, shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(address(0), to, amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  INTERNAL BURN FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Burns `amount` tokens from `from`, reducing the total supply.
    ///
    /// Emits a {Transfer} event.
    function _burn(address from, uint256 amount) internal virtual {
        _beforeTokenTransfer(from, address(0), amount);
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the balance slot and load its value.
            mstore(0x0c, _BALANCE_SLOT_SEED)
            mstore(0x00, from)
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Subtract and store the updated total supply.
            sstore(_TOTAL_SUPPLY_SLOT, sub(sload(_TOTAL_SUPPLY_SLOT), amount))
            // Emit the {Transfer} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, shl(96, from)), 0)
        }
        _afterTokenTransfer(from, address(0), amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL TRANSFER FUNCTIONS                 */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Moves `amount` of tokens from `from` to `to`.
    function _transfer(address from, address to, uint256 amount) internal virtual {
        _beforeTokenTransfer(from, to, amount);
        /// @solidity memory-safe-assembly
        assembly {
            let from_ := shl(96, from)
            // Compute the balance slot and load its value.
            mstore(0x0c, or(from_, _BALANCE_SLOT_SEED))
            let fromBalanceSlot := keccak256(0x0c, 0x20)
            let fromBalance := sload(fromBalanceSlot)
            // Revert if insufficient balance.
            if gt(amount, fromBalance) {
                mstore(0x00, 0xf4d678b8) // `InsufficientBalance()`.
                revert(0x1c, 0x04)
            }
            // Subtract and store the updated balance.
            sstore(fromBalanceSlot, sub(fromBalance, amount))
            // Compute the balance slot of `to`.
            mstore(0x00, to)
            let toBalanceSlot := keccak256(0x0c, 0x20)
            // Add and store the updated balance of `to`.
            // Will not overflow because the sum of all user balances
            // cannot exceed the maximum uint256 value.
            sstore(toBalanceSlot, add(sload(toBalanceSlot), amount))
            // Emit the {Transfer} event.
            mstore(0x20, amount)
            log3(0x20, 0x20, _TRANSFER_EVENT_SIGNATURE, shr(96, from_), shr(96, mload(0x0c)))
        }
        _afterTokenTransfer(from, to, amount);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                INTERNAL ALLOWANCE FUNCTIONS                */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Updates the allowance of `owner` for `spender` based on spent `amount`.
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the allowance slot and load its value.
            mstore(0x20, spender)
            mstore(0x0c, _ALLOWANCE_SLOT_SEED)
            mstore(0x00, owner)
            let allowanceSlot := keccak256(0x0c, 0x34)
            let allowance_ := sload(allowanceSlot)
            // If the allowance is not the maximum uint256 value.
            if add(allowance_, 1) {
                // Revert if the amount to be transferred exceeds the allowance.
                if gt(amount, allowance_) {
                    mstore(0x00, 0x13be252b) // `InsufficientAllowance()`.
                    revert(0x1c, 0x04)
                }
                // Subtract and store the updated allowance.
                sstore(allowanceSlot, sub(allowance_, amount))
            }
        }
    }

    /// @dev Sets `amount` as the allowance of `spender` over the tokens of `owner`.
    ///
    /// Emits a {Approval} event.
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        /// @solidity memory-safe-assembly
        assembly {
            let owner_ := shl(96, owner)
            // Compute the allowance slot and store the amount.
            mstore(0x20, spender)
            mstore(0x0c, or(owner_, _ALLOWANCE_SLOT_SEED))
            sstore(keccak256(0x0c, 0x34), amount)
            // Emit the {Approval} event.
            mstore(0x00, amount)
            log3(0x00, 0x20, _APPROVAL_EVENT_SIGNATURE, shr(96, owner_), shr(96, mload(0x2c)))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     HOOKS TO OVERRIDE                      */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Hook that is called before any transfer of tokens.
    /// This includes minting and burning.
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /// @dev Hook that is called after any transfer of tokens.
    /// This includes minting and burning.
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

/// @notice Contract for the Stake DAO Token (SDT), used on sidechains.
/// @dev Simple ERC20 with minting and burning rights, for Chainlink CCIP compatibility.
/// @author [email protected]
contract SDT is ERC20 {
    /// @notice Mapping of addresses that are allowed to mint SDT.
    mapping(address => bool) public minters;

    /// @notice Mapping of addresses that are allowed to burn SDT.
    mapping(address => bool) public burners;

    /// @notice Address of the governance contract.
    address public governance;

    /// @notice Address of the future governance contract, for two-step governance transfer.
    address public futureGovernance;

    ////////////////////////////////////////////////////////////////
    /// --- EVENTS & ERRORS
    ///////////////////////////////////////////////////////////////

    /// @notice Throws if called by any account other than a minter.
    error NOT_MINTER();

    /// @notice Throws if called by any account other than a burner.
    error NOT_BURNER();

    /// @notice Throws if called by any account other than the governance.
    error GOVERNANCE();

    /// @notice Emits when the governance is changed.
    event GovernanceChanged(address newGovernance);

    /// @notice Emits when a minter is added.
    event AddMinter(address minter);

    /// @notice Emits when a minter is removed.
    event RemoveMinter(address minter);

    /// @notice Emits when a burner is added.
    event AddBurner(address burner);

    /// @notice Emits when a burner is removed.
    event RemoveBurner(address burner);

    ////////////////////////////////////////////////////////////////
    /// --- MODIFIERS
    ///////////////////////////////////////////////////////////////

    /// @notice Modifier to check if the caller is a minter.
    modifier onlyMinter() {
        if (!minters[msg.sender]) {
            revert NOT_MINTER();
        }
        _;
    }

    /// @notice Modifier to check if the caller is a burner.
    modifier onlyBurner() {
        if (!burners[msg.sender]) {
            revert NOT_BURNER();
        }
        _;
    }

    constructor(address _governance) {
        governance = _governance;
    }

    /// @notice Modifier to check if the caller is the governance.
    modifier onlyGovernance() {
        if (msg.sender != governance) revert GOVERNANCE();
        _;
    }

    function name() public pure override returns (string memory) {
        return "Stake DAO Token";
    }

    function symbol() public pure override returns (string memory) {
        return "SDT";
    }

    ////////////////////////////////////////////////////////////////
    /// --- MINT & BURN
    ///////////////////////////////////////////////////////////////

    /// @notice Mint SDT to an address.
    /// @param to Address to mint SDT to.
    /// @param amount Amount of SDT to mint.
    function mint(address to, uint256 amount) external onlyMinter {
        _mint(to, amount);
    }

    /// @notice Burn SDT.
    /// @param amount Amount of SDT to burn.
    function burn(uint256 amount) external onlyBurner {
        _burn(msg.sender, amount);
    }

    ////////////////////////////////////////////////////////////////
    /// --- GOVERNANCE & MINTER MANAGEMENT
    ///////////////////////////////////////////////////////////////

    /// @notice Add a minter.
    /// @param minter Address of the minter to add.
    function addMinter(address minter) external onlyGovernance {
        minters[minter] = true;

        emit AddMinter(minter);
    }

    /// @notice Remove a minter.
    /// @param minter Address of the minter to remove.
    function removeMinter(address minter) external onlyGovernance {
        minters[minter] = false;

        emit RemoveMinter(minter);
    }

    /// @notice Add a burner.
    /// @param burner Address of the burner to add.
    function addBurner(address burner) external onlyGovernance {
        burners[burner] = true;

        emit AddBurner(burner);
    }

    /// @notice Remove a burner.
    /// @param burner Address of the burner to remove.
    function removeBurner(address burner) external onlyGovernance {
        burners[burner] = false;

        emit RemoveBurner(burner);
    }

    /// @notice Add a minter and burner.
    /// @param minter Address of the minter and burner to add.
    function addMinterAndBurn(address minter) external onlyGovernance {
        minters[minter] = true;
        burners[minter] = true;

        emit AddMinter(minter);
        emit AddBurner(minter);
    }

    /// @notice Remove a minter and burner.
    /// @param minter Address of the minter and burner to remove.
    function removeMinterAndBurn(address minter) external onlyGovernance {
        minters[minter] = false;
        burners[minter] = false;

        emit RemoveMinter(minter);
        emit RemoveBurner(minter);
    }

    /// @notice Transfer the governance to a new address.
    /// @param _governance Address of the new governance.
    function transferGovernance(address _governance) external onlyGovernance {
        futureGovernance = _governance;
    }

    /// @notice Accept the governance transfer.
    function acceptGovernance() external {
        if (msg.sender != futureGovernance) revert GOVERNANCE();

        governance = msg.sender;
        futureGovernance = address(0);

        emit GovernanceChanged(msg.sender);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllowanceOverflow","type":"error"},{"inputs":[],"name":"AllowanceUnderflow","type":"error"},{"inputs":[],"name":"GOVERNANCE","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidPermit","type":"error"},{"inputs":[],"name":"NOT_BURNER","type":"error"},{"inputs":[],"name":"NOT_MINTER","type":"error"},{"inputs":[],"name":"PermitExpired","type":"error"},{"inputs":[],"name":"TotalSupplyOverflow","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"burner","type":"address"}],"name":"AddBurner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"AddMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"burner","type":"address"}],"name":"RemoveBurner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"}],"name":"RemoveMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinterAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"futureGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinterAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051610fde380380610fde83398101604081905261002f91610054565b600280546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b610f4b806100936000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063983b2d5611610097578063d505accf11610071578063d505accf14610395578063dd62ed3e146103a8578063f44637ba146103d1578063f46eccc4146103e457600080fd5b8063983b2d561461035c578063a9059cbb1461036f578063d38bfff41461038257600080fd5b806370a08231146102b85780637ecebe00146102de5780638070c5031461030457806385f6e50c1461031757806394e629be1461032a57806395d89b411461033d57600080fd5b806323b872dd1161014b5780633644e515116101255780633644e5151461025f57806340c10f191461026757806342966c681461027a5780635aa6e6751461028d57600080fd5b806323b872dd1461022a5780633092afd51461023d578063313ce5671461025057600080fd5b8063028468581461019357806303d41e0e146101a857806306fdde03146101e0578063095ea7b3146101f557806318160ddd14610208578063238efcbc14610222575b600080fd5b6101a66101a1366004610d60565b610407565b005b6101cb6101b6366004610d60565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101e861048a565b6040516101d79190610d82565b6101cb610203366004610dd0565b6104b3565b6805345cdf77eb68f44c545b6040519081526020016101d7565b6101a6610506565b6101cb610238366004610dfa565b610585565b6101a661024b366004610d60565b610631565b604051601281526020016101d7565b6102146106ab565b6101a6610275366004610dd0565b610728565b6101a6610288366004610e36565b610765565b6002546102a0906001600160a01b031681565b6040516001600160a01b0390911681526020016101d7565b6102146102c6366004610d60565b6387a211a2600c908152600091909152602090205490565b6102146102ec366004610d60565b6338377508600c908152600091909152602090205490565b6003546102a0906001600160a01b031681565b6101a6610325366004610d60565b6107a2565b6101a6610338366004610d60565b61086a565b60408051808201909152600381526214d11560ea1b60208201526101e8565b6101a661036a366004610d60565b610936565b6101cb61037d366004610dd0565b6109b3565b6101a6610390366004610d60565b610a1c565b6101a66103a3366004610e4f565b610a69565b6102146103b6366004610ec2565b602052637f5e9f20600c908152600091909152603490205490565b6101a66103df366004610d60565b610bf2565b6101cb6103f2366004610d60565b60006020819052908152604090205460ff1681565b6002546001600160a01b03163314610432576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b038116600081815260016020908152604091829020805460ff1916905590519182527faaa6f69bc76110b2804f7b88baa48f63b68d33979a039065d90d1cf8488d692191015b60405180910390a150565b60408051808201909152600f81526e29ba30b5b2902220a7902a37b5b2b760891b602082015290565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6003546001600160a01b03163314610531576040516305189e0d60e21b815260040160405180910390fd5b60028054336001600160a01b031991821681179092556003805490911690556040519081527fa6a85f15b976d399f39ad43e515e75910bac714bc55eeff6131fb90780d6f7469060200160405180910390a1565b60008360601b33602052637f5e9f208117600c526034600c20805460018101156105c557808511156105bf576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156105ee5763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c600080516020610ef6833981519152602080a3505060019392505050565b6002546001600160a01b0316331461065c576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b03811660008181526020818152604091829020805460ff1916905590519182527f2f91b591fc56ac0917953ad01ec225524ee5ef0555213e4c8a9d8c9728ee7ffb910161047f565b6000806106b661048a565b8051906020012090506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81528160208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015260a081209250505090565b3360009081526020819052604090205460ff1661075757604051622450cd60e21b815260040160405180910390fd5b6107618282610c72565b5050565b3360009081526001602052604090205460ff1661079557604051636f21a11560e01b815260040160405180910390fd5b61079f3382610cdf565b50565b6002546001600160a01b031633146107cd576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b038116600081815260208181526040808320805460ff199081169091556001835292819020805490931690925590519182527f2f91b591fc56ac0917953ad01ec225524ee5ef0555213e4c8a9d8c9728ee7ffb910160405180910390a16040516001600160a01b03821681527faaa6f69bc76110b2804f7b88baa48f63b68d33979a039065d90d1cf8488d69219060200161047f565b6002546001600160a01b03163314610895576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b0381166000818152602081815260408083208054600160ff1991821681179092558184529382902080549094161790925590519182527f16baa937b08d58713325f93ac58b8a9369a4359bbefb4957d6d9b402735722ab910160405180910390a16040516001600160a01b03821681527f2a85edc5fabdd9bbaa6d309617215d5b6905e0ed8a48d656d86fc9863e3c4b779060200161047f565b6002546001600160a01b03163314610961576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b03811660008181526020818152604091829020805460ff1916600117905590519182527f16baa937b08d58713325f93ac58b8a9369a4359bbefb4957d6d9b402735722ab910161047f565b60006387a211a2600c52336000526020600c208054808411156109de5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c33600080516020610ef6833981519152602080a350600192915050565b6002546001600160a01b03163314610a47576040516305189e0d60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a7361048a565b80519060200120905084421115610a9257631a15a3cc6000526004601cfd5b6040518860601b60601c98508760601b60601c975065383775081901600e52886000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83528360208401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a60208401528960408401528860608401528060808401528760a084015260c08320604e526042602c206000528660ff1660205285604052846060526020806080600060015afa8b3d5114610b9e5763ddafbaef6000526004601cfd5b0190556303faf4f960a51b88176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b6002546001600160a01b03163314610c1d576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b038116600081815260016020818152604092839020805460ff191690921790915590519182527f2a85edc5fabdd9bbaa6d309617215d5b6905e0ed8a48d656d86fc9863e3c4b77910161047f565b6805345cdf77eb68f44c5481810181811015610c965763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c6000600080516020610ef6833981519152602080a35050565b6387a211a2600c52816000526020600c20805480831115610d085763f4d678b86000526004601cfd5b82900390556805345cdf77eb68f44c8054829003905560008181526001600160a01b038316600080516020610ef6833981519152602083a35050565b80356001600160a01b0381168114610d5b57600080fd5b919050565b600060208284031215610d7257600080fd5b610d7b82610d44565b9392505050565b600060208083528351808285015260005b81811015610daf57858101830151858201604001528201610d93565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215610de357600080fd5b610dec83610d44565b946020939093013593505050565b600080600060608486031215610e0f57600080fd5b610e1884610d44565b9250610e2660208501610d44565b9150604084013590509250925092565b600060208284031215610e4857600080fd5b5035919050565b600080600080600080600060e0888a031215610e6a57600080fd5b610e7388610d44565b9650610e8160208901610d44565b95506040880135945060608801359350608088013560ff81168114610ea557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610ed557600080fd5b610ede83610d44565b9150610eec60208401610d44565b9050925092905056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c9e4acc013571987357c5af8c501f4d66cb172639a8517232aecfdb2263c28a464736f6c63430008130033000000000000000000000000000755fbe4a24d7478bfcfc1e561afce82d1ff62

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063983b2d5611610097578063d505accf11610071578063d505accf14610395578063dd62ed3e146103a8578063f44637ba146103d1578063f46eccc4146103e457600080fd5b8063983b2d561461035c578063a9059cbb1461036f578063d38bfff41461038257600080fd5b806370a08231146102b85780637ecebe00146102de5780638070c5031461030457806385f6e50c1461031757806394e629be1461032a57806395d89b411461033d57600080fd5b806323b872dd1161014b5780633644e515116101255780633644e5151461025f57806340c10f191461026757806342966c681461027a5780635aa6e6751461028d57600080fd5b806323b872dd1461022a5780633092afd51461023d578063313ce5671461025057600080fd5b8063028468581461019357806303d41e0e146101a857806306fdde03146101e0578063095ea7b3146101f557806318160ddd14610208578063238efcbc14610222575b600080fd5b6101a66101a1366004610d60565b610407565b005b6101cb6101b6366004610d60565b60016020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101e861048a565b6040516101d79190610d82565b6101cb610203366004610dd0565b6104b3565b6805345cdf77eb68f44c545b6040519081526020016101d7565b6101a6610506565b6101cb610238366004610dfa565b610585565b6101a661024b366004610d60565b610631565b604051601281526020016101d7565b6102146106ab565b6101a6610275366004610dd0565b610728565b6101a6610288366004610e36565b610765565b6002546102a0906001600160a01b031681565b6040516001600160a01b0390911681526020016101d7565b6102146102c6366004610d60565b6387a211a2600c908152600091909152602090205490565b6102146102ec366004610d60565b6338377508600c908152600091909152602090205490565b6003546102a0906001600160a01b031681565b6101a6610325366004610d60565b6107a2565b6101a6610338366004610d60565b61086a565b60408051808201909152600381526214d11560ea1b60208201526101e8565b6101a661036a366004610d60565b610936565b6101cb61037d366004610dd0565b6109b3565b6101a6610390366004610d60565b610a1c565b6101a66103a3366004610e4f565b610a69565b6102146103b6366004610ec2565b602052637f5e9f20600c908152600091909152603490205490565b6101a66103df366004610d60565b610bf2565b6101cb6103f2366004610d60565b60006020819052908152604090205460ff1681565b6002546001600160a01b03163314610432576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b038116600081815260016020908152604091829020805460ff1916905590519182527faaa6f69bc76110b2804f7b88baa48f63b68d33979a039065d90d1cf8488d692191015b60405180910390a150565b60408051808201909152600f81526e29ba30b5b2902220a7902a37b5b2b760891b602082015290565b600082602052637f5e9f20600c5233600052816034600c205581600052602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560206000a350600192915050565b6003546001600160a01b03163314610531576040516305189e0d60e21b815260040160405180910390fd5b60028054336001600160a01b031991821681179092556003805490911690556040519081527fa6a85f15b976d399f39ad43e515e75910bac714bc55eeff6131fb90780d6f7469060200160405180910390a1565b60008360601b33602052637f5e9f208117600c526034600c20805460018101156105c557808511156105bf576313be252b6000526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156105ee5763f4d678b86000526004601cfd5b84810382555050836000526020600c208381540181555082602052600c5160601c8160601c600080516020610ef6833981519152602080a3505060019392505050565b6002546001600160a01b0316331461065c576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b03811660008181526020818152604091829020805460ff1916905590519182527f2f91b591fc56ac0917953ad01ec225524ee5ef0555213e4c8a9d8c9728ee7ffb910161047f565b6000806106b661048a565b8051906020012090506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81528160208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015260a081209250505090565b3360009081526020819052604090205460ff1661075757604051622450cd60e21b815260040160405180910390fd5b6107618282610c72565b5050565b3360009081526001602052604090205460ff1661079557604051636f21a11560e01b815260040160405180910390fd5b61079f3382610cdf565b50565b6002546001600160a01b031633146107cd576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b038116600081815260208181526040808320805460ff199081169091556001835292819020805490931690925590519182527f2f91b591fc56ac0917953ad01ec225524ee5ef0555213e4c8a9d8c9728ee7ffb910160405180910390a16040516001600160a01b03821681527faaa6f69bc76110b2804f7b88baa48f63b68d33979a039065d90d1cf8488d69219060200161047f565b6002546001600160a01b03163314610895576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b0381166000818152602081815260408083208054600160ff1991821681179092558184529382902080549094161790925590519182527f16baa937b08d58713325f93ac58b8a9369a4359bbefb4957d6d9b402735722ab910160405180910390a16040516001600160a01b03821681527f2a85edc5fabdd9bbaa6d309617215d5b6905e0ed8a48d656d86fc9863e3c4b779060200161047f565b6002546001600160a01b03163314610961576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b03811660008181526020818152604091829020805460ff1916600117905590519182527f16baa937b08d58713325f93ac58b8a9369a4359bbefb4957d6d9b402735722ab910161047f565b60006387a211a2600c52336000526020600c208054808411156109de5763f4d678b86000526004601cfd5b83810382555050826000526020600c208281540181555081602052600c5160601c33600080516020610ef6833981519152602080a350600192915050565b6002546001600160a01b03163314610a47576040516305189e0d60e21b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000610a7361048a565b80519060200120905084421115610a9257631a15a3cc6000526004601cfd5b6040518860601b60601c98508760601b60601c975065383775081901600e52886000526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83528360208401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a60208401528960408401528860608401528060808401528760a084015260c08320604e526042602c206000528660ff1660205285604052846060526020806080600060015afa8b3d5114610b9e5763ddafbaef6000526004601cfd5b0190556303faf4f960a51b88176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250506000606052505050505050565b6002546001600160a01b03163314610c1d576040516305189e0d60e21b815260040160405180910390fd5b6001600160a01b038116600081815260016020818152604092839020805460ff191690921790915590519182527f2a85edc5fabdd9bbaa6d309617215d5b6905e0ed8a48d656d86fc9863e3c4b77910161047f565b6805345cdf77eb68f44c5481810181811015610c965763e5cfe9576000526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52816000526020600c208181540181555080602052600c5160601c6000600080516020610ef6833981519152602080a35050565b6387a211a2600c52816000526020600c20805480831115610d085763f4d678b86000526004601cfd5b82900390556805345cdf77eb68f44c8054829003905560008181526001600160a01b038316600080516020610ef6833981519152602083a35050565b80356001600160a01b0381168114610d5b57600080fd5b919050565b600060208284031215610d7257600080fd5b610d7b82610d44565b9392505050565b600060208083528351808285015260005b81811015610daf57858101830151858201604001528201610d93565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060408385031215610de357600080fd5b610dec83610d44565b946020939093013593505050565b600080600060608486031215610e0f57600080fd5b610e1884610d44565b9250610e2660208501610d44565b9150604084013590509250925092565b600060208284031215610e4857600080fd5b5035919050565b600080600080600080600060e0888a031215610e6a57600080fd5b610e7388610d44565b9650610e8160208901610d44565b95506040880135945060608801359350608088013560ff81168114610ea557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610ed557600080fd5b610ede83610d44565b9150610eec60208401610d44565b9050925092905056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c9e4acc013571987357c5af8c501f4d66cb172639a8517232aecfdb2263c28a464736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000755fbe4a24d7478bfcfc1e561afce82d1ff62

-----Decoded View---------------
Arg [0] : _governance (address): 0x000755Fbe4A24d7478bfcFC1E561AfCE82d1ff62

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000000755fbe4a24d7478bfcfc1e561afce82d1ff62


Deployed ByteCode Sourcemap

25640:5340:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29635:142;;;;;;:::i;:::-;;:::i;:::-;;25853:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;548:14:1;;541:22;523:41;;511:2;496:18;25853:39:0;;;;;;;;27875:104;;;:::i;:::-;;;;;;;:::i;7617:586::-;;;;;;:::i;:::-;;:::i;6433:200::-;6596:18;6590:25;6433:200;;;1533:25:1;;;1521:2;1506:18;6433:200:0;1387:177:1;30743:234:0;;;:::i;10212:2235::-;;;;;;:::i;:::-;;:::i;29168:142::-;;;;;;:::i;:::-;;:::i;5997:84::-;;;6071:2;2044:36:1;;2032:2;2017:18;5997:84:0;1902:184:1;17005:707:0;;;:::i;28385:98::-;;;;;;:::i;:::-;;:::i;28564:94::-;;;;;;:::i;:::-;;:::i;25954:25::-;;;;;-1:-1:-1;;;;;25954:25:0;;;;;;-1:-1:-1;;;;;2622:32:1;;;2604:51;;2592:2;2577:18;25954:25:0;2458:203:1;6702:293:0;;;;;;:::i;:::-;6873:18;6867:4;6860:32;;;6765:14;6906:19;;;;6971:4;6955:21;;6949:28;;6702:293;13099:348;;;;;;:::i;:::-;13326:17;13320:4;13313:31;;;13159:14;13358:19;;;;13423:4;13407:21;;13401:28;;13099:348;26082:31;;;;;-1:-1:-1;;;;;26082:31:0;;;30219:219;;;;;;:::i;:::-;;:::i;29891:208::-;;;;;;:::i;:::-;;:::i;27987:94::-;28061:12;;;;;;;;;;;;-1:-1:-1;;;28061:12:0;;;;27987:94;;28935:135;;;;;;:::i;:::-;;:::i;8398:1435::-;;;;;;:::i;:::-;;:::i;30564:122::-;;;;;;:::i;:::-;;:::i;13637:3284::-;;;;;;:::i;:::-;;:::i;7093:388::-;;;;;;:::i;:::-;7316:4;7309:21;7357:20;7351:4;7344:34;;;7209:14;7392:19;;;;7457:4;7441:21;;7435:28;;7093:388;29402:135;;;;;;:::i;:::-;;:::i;25737:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;29635:142;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;-1:-1:-1;;;;;29708:15:0;::::1;29726:5;29708:15:::0;;;:7:::1;:15;::::0;;;;;;;;:23;;-1:-1:-1;;29708:23:0::1;::::0;;29749:20;;2604:51:1;;;29749:20:0::1;::::0;2577:18:1;29749:20:0::1;;;;;;;;29635:142:::0;:::o;27875:104::-;27947:24;;;;;;;;;;;;-1:-1:-1;;;27947:24:0;;;;;27875:104::o;7617:586::-;7691:4;7854:7;7848:4;7841:21;7889:20;7883:4;7876:34;7937:8;7931:4;7924:22;7990:6;7983:4;7977;7967:21;7960:37;8067:6;8061:4;8054:20;8156:4;8150:11;8146:2;8142:20;8132:8;8105:25;8099:4;8093;8088:75;-1:-1:-1;8191:4:0;7617:586;;;;:::o;30743:234::-;30809:16;;-1:-1:-1;;;;;30809:16:0;30795:10;:30;30791:55;;30834:12;;-1:-1:-1;;;30834:12:0;;;;;;;;;;;30791:55;30859:10;:23;;30872:10;-1:-1:-1;;;;;;30859:23:0;;;;;;;;30893:16;:29;;;;;;;30940;;2604:51:1;;;30940:29:0;;2592:2:1;2577:18;30940:29:0;;;;;;;30743:234::o;10212:2235::-;10300:4;10455;10451:2;10447:13;10550:8;10544:4;10537:22;10596:20;10589:5;10586:31;10580:4;10573:45;10669:4;10663;10653:21;10712:13;10706:20;10826:1;10814:10;10810:18;10807:426;;;10944:10;10936:6;10933:22;10930:162;;;10992:10;10986:4;10979:24;11068:4;11062;11055:18;10930:162;11210:6;11198:10;11194:23;11179:13;11172:46;10807:426;;;11331:18;11324:5;11321:29;11315:4;11308:43;11404:4;11398;11388:21;11448:15;11442:22;11540:11;11532:6;11529:23;11526:149;;;11585:10;11579:4;11572:24;11655:4;11649;11642:18;11526:149;11786:6;11773:11;11769:24;11752:15;11745:49;;;11871:2;11865:4;11858:16;11925:4;11919;11909:21;12179:6;12163:13;12157:20;12153:33;12138:13;12131:56;;12257:6;12251:4;12244:20;12352:4;12346:11;12342:2;12338:20;12330:5;12326:2;12322:14;-1:-1:-1;;;;;;;;;;;12289:4:0;12283;12278:81;;-1:-1:-1;12435:4:0;10212:2235;;;;;:::o;29168:142::-;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;-1:-1:-1;;;;;29241:15:0;::::1;29259:5;29241:15:::0;;;::::1;::::0;;;;;;;;:23;;-1:-1:-1;;29241:23:0::1;::::0;;29282:20;;2604:51:1;;;29282:20:0::1;::::0;2577:18:1;29282:20:0::1;2458:203:1::0;17005:707:0;17062:14;;17288:6;:4;:6::i;:::-;17272:24;;;;;;17261:35;;17390:4;17384:11;17452:16;17449:1;17442:27;17504:8;17497:4;17494:1;17490:12;17483:30;17548:13;17541:4;17538:1;17534:12;17527:35;17597:9;17590:4;17587:1;17583:12;17576:31;17642:9;17635:4;17632:1;17628:12;17621:31;17689:4;17686:1;17676:18;17666:28;;;17360:345;17005:707;:::o;28385:98::-;27329:10;27321:7;:19;;;;;;;;;;;;;27316:72;;27364:12;;-1:-1:-1;;;27364:12:0;;;;;;;;;;;27316:72;28458:17:::1;28464:2;28468:6;28458:5;:17::i;:::-;28385:98:::0;;:::o;28564:94::-;27523:10;27515:19;;;;:7;:19;;;;;;;;27510:72;;27558:12;;-1:-1:-1;;;27558:12:0;;;;;;;;;;;27510:72;28625:25:::1;28631:10;28643:6;28625:5;:25::i;:::-;28564:94:::0;:::o;30219:219::-;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;-1:-1:-1;;;;;30299:15:0;::::1;30317:5;30299:15:::0;;;::::1;::::0;;;;;;;:23;;-1:-1:-1;;30299:23:0;;::::1;::::0;;;-1:-1:-1;30333:15:0;;;;;;:23;;;;::::1;::::0;;;30374:20;;2604:51:1;;;30374:20:0::1;::::0;2577:18:1;30374:20:0::1;;;;;;;30410;::::0;-1:-1:-1;;;;;2622:32:1;;2604:51;;30410:20:0::1;::::0;2592:2:1;2577:18;30410:20:0::1;2458:203:1::0;29891:208:0;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;-1:-1:-1;;;;;29968:15:0;::::1;:7;:15:::0;;;::::1;::::0;;;;;;;:22;;29986:4:::1;-1:-1:-1::0;;29968:22:0;;::::1;::::0;::::1;::::0;;;30001:15;;;;;;;:22;;;;::::1;;::::0;;;30041:17;;2604:51:1;;;30041:17:0::1;::::0;2577:18:1;30041:17:0::1;;;;;;;30074;::::0;-1:-1:-1;;;;;2622:32:1;;2604:51;;30074:17:0::1;::::0;2592:2:1;2577:18;30074:17:0::1;2458:203:1::0;28935:135:0;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;-1:-1:-1;;;;;29005:15:0;::::1;:7;:15:::0;;;::::1;::::0;;;;;;;;:22;;-1:-1:-1;;29005:22:0::1;29023:4;29005:22;::::0;;29045:17;;2604:51:1;;;29045:17:0::1;::::0;2577:18:1;29045:17:0::1;2458:203:1::0;8398:1435:0;8468:4;8682:18;8676:4;8669:32;8728:8;8722:4;8715:22;8790:4;8784;8774:21;8834:15;8828:22;8926:11;8918:6;8915:23;8912:149;;;8971:10;8965:4;8958:24;9041:4;9035;9028:18;8912:149;9172:6;9159:11;9155:24;9138:15;9131:49;;;9257:2;9251:4;9244:16;9311:4;9305;9295:21;9565:6;9549:13;9543:20;9539:33;9524:13;9517:56;;9643:6;9637:4;9630:20;9732:4;9726:11;9722:2;9718:20;9708:8;-1:-1:-1;;;;;;;;;;;9675:4:0;9669;9664:75;-1:-1:-1;9821:4:0;8398:1435;;;;:::o;30564:122::-;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;30648:16:::1;:30:::0;;-1:-1:-1;;;;;;30648:30:0::1;-1:-1:-1::0;;;;;30648:30:0;;;::::1;::::0;;;::::1;::::0;;30564:122::o;13637:3284::-;13845:16;14044:6;:4;:6::i;:::-;14028:24;;;;;;14017:35;;14224:8;14211:11;14208:25;14205:145;;;14266:10;14260:4;14253:24;14330:4;14324;14317:18;14205:145;14379:4;14373:11;14497:5;14493:2;14489:14;14485:2;14481:23;14472:32;;14545:7;14541:2;14537:16;14533:2;14529:25;14518:36;;14640:39;14634:4;14627:53;14707:5;14701:4;14694:19;14760:4;14754;14744:21;14803:9;14797:16;14883;14880:1;14873:27;14935:8;14928:4;14925:1;14921:12;14914:30;14979:13;14972:4;14969:1;14965:12;14958:35;15028:9;15021:4;15018:1;15014:12;15007:31;15073:9;15066:4;15063:1;15059:12;15052:31;15123:4;15120:1;15110:18;15104:4;15097:32;15194:16;15191:1;15184:27;15246:5;15239:4;15236:1;15232:12;15225:27;15287:7;15280:4;15277:1;15273:12;15266:29;15330:5;15323:4;15320:1;15316:12;15309:27;15371:10;15364:4;15361:1;15357:12;15350:32;15417:8;15410:4;15407:1;15403:12;15396:30;15466:4;15463:1;15453:18;15447:4;15440:32;15563:4;15557;15547:21;15541:4;15534:35;15606:1;15600:4;15596:12;15590:4;15583:26;15636:1;15630:4;15623:15;15665:1;15659:4;15652:15;15726:4;15720;15714;15711:1;15708;15701:5;15690:41;16153:5;16134:16;16128:23;16125:34;16115:162;;16193:10;16187:4;16180:24;16257:4;16251;16244:18;16115:162;16364:18;16346:37;;-1:-1:-1;;;16562:43:0;;16556:4;16549:57;16643:4;16637;16627:21;16620:36;;;16597:7;16765:5;16738:25;-1:-1:-1;16725:4:0;16718:12;;16713:67;16801:4;16794:15;-1:-1:-1;;16872:1:0;16866:4;16859:15;-1:-1:-1;;;;;;13637:3284:0:o;29402:135::-;27816:10;;-1:-1:-1;;;;;27816:10:0;27802;:24;27798:49;;27835:12;;-1:-1:-1;;;27835:12:0;;;;;;;;;;;27798:49;-1:-1:-1;;;;;29472:15:0;::::1;;::::0;;;29490:4:::1;29472:15;::::0;;;;;;;;:22;;-1:-1:-1;;29472:22:0::1;::::0;;::::1;::::0;;;29512:17;;2604:51:1;;;29512:17:0::1;::::0;2577:18:1;29512:17:0::1;2458:203:1::0;18125:1196:0;18350:18;18344:25;18430:6;18411:17;18407:30;18529:17;18511:16;18508:39;18505:165;;;18580:10;18574:4;18567:24;18650:4;18644;18637:18;18505:165;18759:16;18739:18;18732:44;;;18864:18;18858:4;18851:32;18910:2;18904:4;18897:16;18964:4;18958;18948:21;19082:6;19066:13;19060:20;19056:33;19041:13;19034:56;;19160:6;19154:4;19147:20;19242:4;19236:11;19232:2;19228:20;19225:1;-1:-1:-1;;;;;;;;;;;19192:4:0;19186;19181:68;28385:98;;:::o;19736:1142::-;20008:18;20002:4;19995:32;20054:4;20048;20041:18;20112:4;20106;20096:21;20156:15;20150:22;20248:11;20240:6;20237:23;20234:149;;;20293:10;20287:4;20280:24;20363:4;20357;20350:18;20234:149;20477:24;;;20453:49;;20614:18;20608:25;;20604:38;;;20577:66;;-1:-1:-1;20700:20:0;;;-1:-1:-1;;;;;20778:22:0;;-1:-1:-1;;;;;;;;;;;20745:4:0;-1:-1:-1;20734:70:0;28385:98;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;575:548::-;687:4;716:2;745;734:9;727:21;777:6;771:13;820:6;815:2;804:9;800:18;793:34;845:1;855:140;869:6;866:1;863:13;855:140;;;964:14;;;960:23;;954:30;930:17;;;949:2;926:26;919:66;884:10;;855:140;;;859:3;1044:1;1039:2;1030:6;1019:9;1015:22;1011:31;1004:42;1114:2;1107;1103:7;1098:2;1090:6;1086:15;1082:29;1071:9;1067:45;1063:54;1055:62;;;;575:548;;;;:::o;1128:254::-;1196:6;1204;1257:2;1245:9;1236:7;1232:23;1228:32;1225:52;;;1273:1;1270;1263:12;1225:52;1296:29;1315:9;1296:29;:::i;:::-;1286:39;1372:2;1357:18;;;;1344:32;;-1:-1:-1;;;1128:254:1:o;1569:328::-;1646:6;1654;1662;1715:2;1703:9;1694:7;1690:23;1686:32;1683:52;;;1731:1;1728;1721:12;1683:52;1754:29;1773:9;1754:29;:::i;:::-;1744:39;;1802:38;1836:2;1825:9;1821:18;1802:38;:::i;:::-;1792:48;;1887:2;1876:9;1872:18;1859:32;1849:42;;1569:328;;;;;:::o;2273:180::-;2332:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:52;;;2401:1;2398;2391:12;2353:52;-1:-1:-1;2424:23:1;;2273:180;-1:-1:-1;2273:180:1:o;2666:693::-;2777:6;2785;2793;2801;2809;2817;2825;2878:3;2866:9;2857:7;2853:23;2849:33;2846:53;;;2895:1;2892;2885:12;2846:53;2918:29;2937:9;2918:29;:::i;:::-;2908:39;;2966:38;3000:2;2989:9;2985:18;2966:38;:::i;:::-;2956:48;;3051:2;3040:9;3036:18;3023:32;3013:42;;3102:2;3091:9;3087:18;3074:32;3064:42;;3156:3;3145:9;3141:19;3128:33;3201:4;3194:5;3190:16;3183:5;3180:27;3170:55;;3221:1;3218;3211:12;3170:55;2666:693;;;;-1:-1:-1;2666:693:1;;;;3244:5;3296:3;3281:19;;3268:33;;-1:-1:-1;3348:3:1;3333:19;;;3320:33;;2666:693;-1:-1:-1;;2666:693:1:o;3364:260::-;3432:6;3440;3493:2;3481:9;3472:7;3468:23;3464:32;3461:52;;;3509:1;3506;3499:12;3461:52;3532:29;3551:9;3532:29;:::i;:::-;3522:39;;3580:38;3614:2;3603:9;3599:18;3580:38;:::i;:::-;3570:48;;3364:260;;;;;:::o

Metadata Hash

ipfs://c9e4acc013571987357c5af8c501f4d66cb172639a8517232aecfdb2263c28a4
Loading