Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Bank
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only // ██████████████ ▐████▌ ██████████████ // ██████████████ ▐████▌ ██████████████ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ██████████████ ▐████▌ ██████████████ // ██████████████ ▐████▌ ██████████████ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ pragma solidity 0.8.17; import "@openzeppelin/contracts/access/Ownable.sol"; import "./IReceiveBalanceApproval.sol"; import "../vault/IVault.sol"; /// @title Bitcoin Bank /// @notice Bank is a central component tracking Bitcoin balances. Balances can /// be transferred between balance owners, and balance owners can /// approve their balances to be spent by others. Balances in the Bank /// are updated for depositors who deposited their Bitcoin into the /// Bridge and only the Bridge can increase balances. /// @dev Bank is a governable contract and the Governance can upgrade the Bridge /// address. contract Bank is Ownable { address public bridge; /// @notice The balance of the given account in the Bank. Zero by default. mapping(address => uint256) public balanceOf; /// @notice The remaining amount of balance a spender will be /// allowed to transfer on behalf of an owner using /// `transferBalanceFrom`. Zero by default. mapping(address => mapping(address => uint256)) public allowance; /// @notice Returns the current nonce for an EIP2612 permission for the /// provided balance owner to protect against replay attacks. Used /// to construct an EIP2612 signature provided to the `permit` /// function. mapping(address => uint256) public nonces; uint256 public immutable cachedChainId; bytes32 public immutable cachedDomainSeparator; /// @notice Returns an EIP2612 Permit message hash. Used to construct /// an EIP2612 signature provided to the `permit` function. bytes32 public constant PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); event BalanceTransferred( address indexed from, address indexed to, uint256 amount ); event BalanceApproved( address indexed owner, address indexed spender, uint256 amount ); event BalanceIncreased(address indexed owner, uint256 amount); event BalanceDecreased(address indexed owner, uint256 amount); event BridgeUpdated(address newBridge); modifier onlyBridge() { require(msg.sender == address(bridge), "Caller is not the bridge"); _; } constructor() { cachedChainId = block.chainid; cachedDomainSeparator = buildDomainSeparator(); } /// @notice Allows the Governance to upgrade the Bridge address. /// @dev The function does not implement any governance delay and does not /// check the status of the Bridge. The Governance implementation needs /// to ensure all requirements for the upgrade are satisfied before /// executing this function. /// Requirements: /// - The new Bridge address must not be zero. /// @param _bridge The new Bridge address. function updateBridge(address _bridge) external onlyOwner { require(_bridge != address(0), "Bridge address must not be 0x0"); bridge = _bridge; emit BridgeUpdated(_bridge); } /// @notice Moves the given `amount` of balance from the caller to /// `recipient`. /// @dev Requirements: /// - `recipient` cannot be the zero address, /// - the caller must have a balance of at least `amount`. /// @param recipient The recipient of the balance. /// @param amount The amount of the balance transferred. function transferBalance(address recipient, uint256 amount) external { _transferBalance(msg.sender, recipient, amount); } /// @notice Sets `amount` as the allowance of `spender` over the caller's /// balance. Does not allow updating an existing allowance to /// a value that is non-zero to avoid someone using both the old and /// the new allowance by unfortunate transaction ordering. To update /// an allowance to a non-zero value please set it to zero first or /// use `increaseBalanceAllowance` or `decreaseBalanceAllowance` for /// an atomic update. /// @dev If the `amount` is set to `type(uint256).max`, /// `transferBalanceFrom` will not reduce an allowance. /// @param spender The address that will be allowed to spend the balance. /// @param amount The amount the spender is allowed to spend. function approveBalance(address spender, uint256 amount) external { require( amount == 0 || allowance[msg.sender][spender] == 0, "Non-atomic allowance change not allowed" ); _approveBalance(msg.sender, spender, amount); } /// @notice Sets the `amount` as an allowance of a smart contract `spender` /// over the caller's balance and calls the `spender` via /// `receiveBalanceApproval`. /// @dev If the `amount` is set to `type(uint256).max`, the potential /// `transferBalanceFrom` executed in `receiveBalanceApproval` of /// `spender` will not reduce an allowance. Beware that changing an /// allowance with this function brings the risk that `spender` may use /// both the old and the new allowance by unfortunate transaction /// ordering. Please use `increaseBalanceAllowance` and /// `decreaseBalanceAllowance` to eliminate the risk. /// @param spender The smart contract that will be allowed to spend the /// balance. /// @param amount The amount the spender contract is allowed to spend. /// @param extraData Extra data passed to the `spender` contract via /// `receiveBalanceApproval` call. function approveBalanceAndCall( address spender, uint256 amount, bytes calldata extraData ) external { _approveBalance(msg.sender, spender, amount); IReceiveBalanceApproval(spender).receiveBalanceApproval( msg.sender, amount, extraData ); } /// @notice Atomically increases the caller's balance allowance granted to /// `spender` by the given `addedValue`. /// @param spender The spender address for which the allowance is increased. /// @param addedValue The amount by which the allowance is increased. function increaseBalanceAllowance(address spender, uint256 addedValue) external { _approveBalance( msg.sender, spender, allowance[msg.sender][spender] + addedValue ); } /// @notice Atomically decreases the caller's balance allowance granted to /// `spender` by the given `subtractedValue`. /// @dev Requirements: /// - `spender` must not be the zero address, /// - the current allowance for `spender` must not be lower than /// the `subtractedValue`. /// @param spender The spender address for which the allowance is decreased. /// @param subtractedValue The amount by which the allowance is decreased. function decreaseBalanceAllowance(address spender, uint256 subtractedValue) external { uint256 currentAllowance = allowance[msg.sender][spender]; require( currentAllowance >= subtractedValue, "Can not decrease balance allowance below zero" ); unchecked { _approveBalance( msg.sender, spender, currentAllowance - subtractedValue ); } } /// @notice Moves `amount` of balance from `spender` to `recipient` using the /// allowance mechanism. `amount` is then deducted from the caller's /// allowance unless the allowance was made for `type(uint256).max`. /// @dev Requirements: /// - `recipient` cannot be the zero address, /// - `spender` must have a balance of at least `amount`, /// - the caller must have an allowance for `spender`'s balance of at /// least `amount`. /// @param spender The address from which the balance is transferred. /// @param recipient The address to which the balance is transferred. /// @param amount The amount of balance that is transferred. function transferBalanceFrom( address spender, address recipient, uint256 amount ) external { uint256 currentAllowance = allowance[spender][msg.sender]; if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "Transfer amount exceeds allowance" ); unchecked { _approveBalance(spender, msg.sender, currentAllowance - amount); } } _transferBalance(spender, recipient, amount); } /// @notice An EIP2612 approval made with secp256k1 signature. Users can /// authorize a transfer of their balance with a signature /// conforming to the EIP712 standard, rather than an on-chain /// transaction from their address. Anyone can submit this signature /// on the user's behalf by calling the `permit` function, paying /// gas fees, and possibly performing other actions in the same /// transaction. /// @dev The deadline argument can be set to `type(uint256).max to create /// permits that effectively never expire. If the `amount` is set /// to `type(uint256).max` then `transferBalanceFrom` will not /// reduce an allowance. Beware that changing an allowance with this /// function brings the risk that someone may use both the old and the /// new allowance by unfortunate transaction ordering. Please use /// `increaseBalanceAllowance` and `decreaseBalanceAllowance` to /// eliminate the risk. /// @param owner The balance owner who signed the permission. /// @param spender The address that will be allowed to spend the balance. /// @param amount The amount the spender is allowed to spend. /// @param deadline The UNIX time until which the permit is valid. /// @param v V part of the permit signature. /// @param r R part of the permit signature. /// @param s S part of the permit signature. function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { /* solhint-disable-next-line not-rely-on-time */ require(deadline >= block.timestamp, "Permission expired"); // Validate `s` and `v` values for a malleability concern described in EIP2. // Only signatures with `s` value in the lower half of the secp256k1 // curve's order and `v` value of 27 or 28 are considered valid. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "Invalid signature 's' value" ); require(v == 27 || v == 28, "Invalid signature 'v' value"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, amount, nonces[owner]++, deadline ) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require( recoveredAddress != address(0) && recoveredAddress == owner, "Invalid signature" ); _approveBalance(owner, spender, amount); } /// @notice Increases balances of the provided `recipients` by the provided /// `amounts`. Can only be called by the Bridge. /// @dev Requirements: /// - length of `recipients` and `amounts` must be the same, /// - none of `recipients` addresses must point to the Bank. /// @param recipients Balance increase recipients. /// @param amounts Amounts by which balances are increased. function increaseBalances( address[] calldata recipients, uint256[] calldata amounts ) external onlyBridge { require( recipients.length == amounts.length, "Arrays must have the same length" ); for (uint256 i = 0; i < recipients.length; i++) { _increaseBalance(recipients[i], amounts[i]); } } /// @notice Increases balance of the provided `recipient` by the provided /// `amount`. Can only be called by the Bridge. /// @dev Requirements: /// - `recipient` address must not point to the Bank. /// @param recipient Balance increase recipient. /// @param amount Amount by which the balance is increased. function increaseBalance(address recipient, uint256 amount) external onlyBridge { _increaseBalance(recipient, amount); } /// @notice Increases the given smart contract `vault`'s balance and /// notifies the `vault` contract about it. /// Can be called only by the Bridge. /// @dev Requirements: /// - `vault` must implement `IVault` interface, /// - length of `recipients` and `amounts` must be the same. /// @param vault Address of `IVault` recipient contract. /// @param recipients Balance increase recipients. /// @param amounts Amounts by which balances are increased. function increaseBalanceAndCall( address vault, address[] calldata recipients, uint256[] calldata amounts ) external onlyBridge { require( recipients.length == amounts.length, "Arrays must have the same length" ); uint256 totalAmount = 0; for (uint256 i = 0; i < amounts.length; i++) { totalAmount += amounts[i]; } _increaseBalance(vault, totalAmount); IVault(vault).receiveBalanceIncrease(recipients, amounts); } /// @notice Decreases caller's balance by the provided `amount`. There is no /// way to restore the balance so do not call this function unless /// you really know what you are doing! /// @dev Requirements: /// - The caller must have a balance of at least `amount`. /// @param amount The amount by which the balance is decreased. function decreaseBalance(uint256 amount) external { balanceOf[msg.sender] -= amount; emit BalanceDecreased(msg.sender, amount); } /// @notice Returns hash of EIP712 Domain struct with `TBTC Bank` as /// a signing domain and Bank contract as a verifying contract. /// Used to construct an EIP2612 signature provided to the `permit` /// function. /* solhint-disable-next-line func-name-mixedcase */ function DOMAIN_SEPARATOR() public view returns (bytes32) { // As explained in EIP-2612, if the DOMAIN_SEPARATOR contains the // chainId and is defined at contract deployment instead of // reconstructed for every signature, there is a risk of possible replay // attacks between chains in the event of a future chain split. // To address this issue, we check the cached chain ID against the // current one and in case they are different, we build domain separator // from scratch. if (block.chainid == cachedChainId) { return cachedDomainSeparator; } else { return buildDomainSeparator(); } } function _increaseBalance(address recipient, uint256 amount) internal { require( recipient != address(this), "Can not increase balance for Bank" ); balanceOf[recipient] += amount; emit BalanceIncreased(recipient, amount); } function _transferBalance( address spender, address recipient, uint256 amount ) private { require( recipient != address(0), "Can not transfer to the zero address" ); require( recipient != address(this), "Can not transfer to the Bank address" ); uint256 spenderBalance = balanceOf[spender]; require(spenderBalance >= amount, "Transfer amount exceeds balance"); unchecked { balanceOf[spender] = spenderBalance - amount; } balanceOf[recipient] += amount; emit BalanceTransferred(spender, recipient, amount); } function _approveBalance( address owner, address spender, uint256 amount ) private { require(spender != address(0), "Can not approve to the zero address"); allowance[owner][spender] = amount; emit BalanceApproved(owner, spender, amount); } function buildDomainSeparator() private view returns (bytes32) { return keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes("TBTC Bank")), keccak256(bytes("1")), block.chainid, address(this) ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: GPL-3.0-only // ██████████████ ▐████▌ ██████████████ // ██████████████ ▐████▌ ██████████████ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ██████████████ ▐████▌ ██████████████ // ██████████████ ▐████▌ ██████████████ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ pragma solidity 0.8.17; /// @title IReceiveBalanceApproval /// @notice `IReceiveBalanceApproval` is an interface for a smart contract /// consuming Bank balances approved to them in the same transaction by /// other contracts or externally owned accounts (EOA). interface IReceiveBalanceApproval { /// @notice Called by the Bank in `approveBalanceAndCall` function after /// the balance `owner` approved `amount` of their balance in the /// Bank for the contract. This way, the depositor can approve /// balance and call the contract to use the approved balance in /// a single transaction. /// @param owner Address of the Bank balance owner who approved their /// balance to be used by the contract. /// @param amount The amount of the Bank balance approved by the owner /// to be used by the contract. /// @param extraData The `extraData` passed to `Bank.approveBalanceAndCall`. /// @dev The implementation must ensure this function can only be called /// by the Bank. The Bank does _not_ guarantee that the `amount` /// approved by the `owner` currently exists on their balance. That is, /// the `owner` could approve more balance than they currently have. /// This works the same as `Bank.approve` function. The contract must /// ensure the actual balance is checked before performing any action /// based on it. function receiveBalanceApproval( address owner, uint256 amount, bytes calldata extraData ) external; }
// SPDX-License-Identifier: GPL-3.0-only // ██████████████ ▐████▌ ██████████████ // ██████████████ ▐████▌ ██████████████ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ██████████████ ▐████▌ ██████████████ // ██████████████ ▐████▌ ██████████████ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ // ▐████▌ ▐████▌ pragma solidity 0.8.17; import "../bank/IReceiveBalanceApproval.sol"; /// @title Bank Vault interface /// @notice `IVault` is an interface for a smart contract consuming Bank /// balances of other contracts or externally owned accounts (EOA). interface IVault is IReceiveBalanceApproval { /// @notice Called by the Bank in `increaseBalanceAndCall` function after /// increasing the balance in the Bank for the vault. It happens in /// the same transaction in which deposits were swept by the Bridge. /// This allows the depositor to route their deposit revealed to the /// Bridge to the particular smart contract (vault) in the same /// transaction in which the deposit is revealed. This way, the /// depositor does not have to execute additional transaction after /// the deposit gets swept by the Bridge to approve and transfer /// their balance to the vault. /// @param depositors Addresses of depositors whose deposits have been swept. /// @param depositedAmounts Amounts deposited by individual depositors and /// swept. /// @dev The implementation must ensure this function can only be called /// by the Bank. The Bank guarantees that the vault's balance was /// increased by the sum of all deposited amounts before this function /// is called, in the same transaction. function receiveBalanceIncrease( address[] calldata depositors, uint256[] calldata depositedAmounts ) external; }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"BalanceApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceDecreased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BalanceIncreased","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":"BalanceTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newBridge","type":"address"}],"name":"BridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"approveBalanceAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cachedChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cachedDomainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decreaseBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseBalanceAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseBalanceAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"increaseBalanceAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"increaseBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferBalanceFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"}],"name":"updateBridge","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b5061001a336100f9565b466080526100f16040805180820182526009815268544254432042616e6b60b81b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fa1cc9cffb2f2444066e5c95caef7925ee7ef97efc6002db29d3637e98e2f0dd2818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b60a052610149565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805160a05161195161017c6000396000818161032d01526105b80152600081816102ae015261059001526119516000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806370a08231116100e3578063b4f94b2e1161008c578063dd62ed3e11610066578063dd62ed3e14610375578063e78cea92146103a0578063f2fde38b146103b357600080fd5b8063b4f94b2e14610328578063bb7e61bc1461034f578063d505accf1461036257600080fd5b80637c6db49c116100bd5780637c6db49c146102d05780637ecebe00146102e35780638da5cb5b1461030357600080fd5b806370a0823114610281578063715018a6146102a1578063771da5c5146102a957600080fd5b806346b05e09116101455780635b86f5991161011f5780635b86f599146102485780635bfd99b91461025b5780636eb382121461026e57600080fd5b806346b05e091461020f5780634a38757e1461022257806356a6d9ef1461023557600080fd5b806330adf81f1161017657806330adf81f146101ba5780633644e515146101f4578063392aee43146101fc57600080fd5b80630b6d324c14610192578063266a123a146101a7575b600080fd5b6101a56101a03660046114c8565b6103c6565b005b6101a56101b536600461153e565b610477565b6101e17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6040519081526020015b60405180910390f35b6101e161058c565b6101a561020a3660046115aa565b6106db565b6101a561021d3660046114c8565b610737565b6101a56102303660046115c3565b6107e6565b6101a56102433660046114c8565b610874565b6101a56102563660046114c8565b61087f565b6101a56102693660046114c8565b6108e3565b6101a561027c36600461164a565b61091e565b6101e161028f36600461164a565b60026020526000908152604090205481565b6101a5610a2f565b6101e17f000000000000000000000000000000000000000000000000000000000000000081565b6101a56102de36600461166c565b610a95565b6101e16102f136600461164a565b60046020526000908152604090205481565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101eb565b6101e17f000000000000000000000000000000000000000000000000000000000000000081565b6101a561035d3660046116a8565b610b56565b6101a5610370366004611729565b610cd3565b6101e161038336600461179c565b600360209081526000928352604080842090915290825290205481565b600154610310906001600160a01b031681565b6101a56103c136600461164a565b610fe3565b3360009081526003602090815260408083206001600160a01b0386168452909152902054818110156104655760405162461bcd60e51b815260206004820152602d60248201527f43616e206e6f742064656372656173652062616c616e636520616c6c6f77616e60448201527f63652062656c6f77207a65726f0000000000000000000000000000000000000060648201526084015b60405180910390fd5b61047233848484036110c5565b505050565b6001546001600160a01b031633146104d15760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420746865206272696467650000000000000000604482015260640161045c565b8281146105205760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e677468604482015260640161045c565b60005b8381101561058557610573858583818110610540576105406117cf565b9050602002016020810190610555919061164a565b848484818110610567576105676117cf565b905060200201356111a2565b8061057d816117fb565b915050610523565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046036105da57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080518082018252600981527f544254432042616e6b000000000000000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fa1cc9cffb2f2444066e5c95caef7925ee7ef97efc6002db29d3637e98e2f0dd2818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b33600090815260026020526040812080548392906106fa908490611814565b909155505060405181815233907f9c6be7c4260e52ea2e41d7f17932147ab78756f1bb2247a2554796d969741aff9060200160405180910390a250565b80158061076557503360009081526003602090815260408083206001600160a01b0386168452909152902054155b6107d75760405162461bcd60e51b815260206004820152602760248201527f4e6f6e2d61746f6d696320616c6c6f77616e6365206368616e6765206e6f742060448201527f616c6c6f77656400000000000000000000000000000000000000000000000000606482015260840161045c565b6107e23383836110c5565b5050565b6107f13385856110c5565b6040517f475d05700000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063475d05709061083c90339087908790879060040161182d565b600060405180830381600087803b15801561085657600080fd5b505af115801561086a573d6000803e3d6000fd5b5050505050505050565b6107e233838361128f565b6001546001600160a01b031633146108d95760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420746865206272696467650000000000000000604482015260640161045c565b6107e282826111a2565b3360008181526003602090815260408083206001600160a01b03871684529091529020546107e291908490610919908590611873565b6110c5565b6000546001600160a01b031633146109785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b6001600160a01b0381166109ce5760405162461bcd60e51b815260206004820152601e60248201527f4272696467652061646472657373206d757374206e6f74206265203078300000604482015260640161045c565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fe1694c0b21fdceff6411daed547c7463c2341b9695387bc82595b5b9b1851d4a9060200160405180910390a150565b6000546001600160a01b03163314610a895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b610a93600061144f565b565b6001600160a01b03831660009081526003602090815260408083203384529091529020546000198114610b455781811015610b385760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6360448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161045c565b610b4584338484036110c5565b610b5084848461128f565b50505050565b6001546001600160a01b03163314610bb05760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420746865206272696467650000000000000000604482015260640161045c565b828114610bff5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e677468604482015260640161045c565b6000805b82811015610c4357838382818110610c1d57610c1d6117cf565b9050602002013582610c2f9190611873565b915080610c3b816117fb565b915050610c03565b50610c4e86826111a2565b6040517f461c63730000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063461c637390610c99908890889088908890600401611886565b600060405180830381600087803b158015610cb357600080fd5b505af1158015610cc7573d6000803e3d6000fd5b50505050505050505050565b42841015610d235760405162461bcd60e51b815260206004820152601260248201527f5065726d697373696f6e20657870697265640000000000000000000000000000604482015260640161045c565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610d935760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207369676e6174757265202773272076616c75650000000000604482015260640161045c565b8260ff16601b1480610da857508260ff16601c145b610df45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207369676e6174757265202776272076616c75650000000000604482015260640161045c565b6000610dfe61058c565b6001600160a01b038916600090815260046020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190610e4c836117fb565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610ee09291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610f4b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610f815750886001600160a01b0316816001600160a01b0316145b610fcd5760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015260640161045c565b610fd88989896110c5565b505050505050505050565b6000546001600160a01b0316331461103d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b6001600160a01b0381166110b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161045c565b6110c28161144f565b50565b6001600160a01b0382166111415760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f7420617070726f766520746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161045c565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f2fe5e8e7796010737e636f63b35a0383dc160b68483984f2df987c78e842b405910160405180910390a3505050565b306001600160a01b038316036112205760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f7420696e6372656173652062616c616e636520666f722042616e60448201527f6b00000000000000000000000000000000000000000000000000000000000000606482015260840161045c565b6001600160a01b03821660009081526002602052604081208054839290611248908490611873565b90915550506040518181526001600160a01b038316907f7a702e80a9c183a6ce9d6732991df2e914555ba35a364a70aed2433984e7544b9060200160405180910390a25050565b6001600160a01b0382166112f15760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161045c565b306001600160a01b038316036113555760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e7366657220746f207468652042616e6b206164646044820152637265737360e01b606482015260840161045c565b6001600160a01b038316600090815260026020526040902054818110156113be5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220616d6f756e7420657863656564732062616c616e636500604482015260640161045c565b6001600160a01b038085166000908152600260205260408082208585039055918516815290812080548492906113f5908490611873565b92505081905550826001600160a01b0316846001600160a01b03167f4163d0b06696468b3d7903f482bcd0097bd38a9a9086157479fd6c6561d242618460405161144191815260200190565b60405180910390a350505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146114c357600080fd5b919050565b600080604083850312156114db57600080fd5b6114e4836114ac565b946020939093013593505050565b60008083601f84011261150457600080fd5b50813567ffffffffffffffff81111561151c57600080fd5b6020830191508360208260051b850101111561153757600080fd5b9250929050565b6000806000806040858703121561155457600080fd5b843567ffffffffffffffff8082111561156c57600080fd5b611578888389016114f2565b9096509450602087013591508082111561159157600080fd5b5061159e878288016114f2565b95989497509550505050565b6000602082840312156115bc57600080fd5b5035919050565b600080600080606085870312156115d957600080fd5b6115e2856114ac565b935060208501359250604085013567ffffffffffffffff8082111561160657600080fd5b818701915087601f83011261161a57600080fd5b81358181111561162957600080fd5b88602082850101111561163b57600080fd5b95989497505060200194505050565b60006020828403121561165c57600080fd5b611665826114ac565b9392505050565b60008060006060848603121561168157600080fd5b61168a846114ac565b9250611698602085016114ac565b9150604084013590509250925092565b6000806000806000606086880312156116c057600080fd5b6116c9866114ac565b9450602086013567ffffffffffffffff808211156116e657600080fd5b6116f289838a016114f2565b9096509450604088013591508082111561170b57600080fd5b50611718888289016114f2565b969995985093965092949392505050565b600080600080600080600060e0888a03121561174457600080fd5b61174d886114ac565b965061175b602089016114ac565b95506040880135945060608801359350608088013560ff8116811461177f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156117af57600080fd5b6117b8836114ac565b91506117c6602084016114ac565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161180d5761180d6117e5565b5060010190565b81810381811115611827576118276117e5565b92915050565b6001600160a01b038516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b80820180821115611827576118276117e5565b6040808252810184905260008560608301825b878110156118c7576001600160a01b036118b2846114ac565b16825260209283019290910190600101611899565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561190057600080fd5b8460051b91508186602083013701602001969550505050505056fea2646970667358221220e0d259eb5abc241c523faa249e0fb75ed40e4e10dbf1b8652907b8e098721d0564736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806370a08231116100e3578063b4f94b2e1161008c578063dd62ed3e11610066578063dd62ed3e14610375578063e78cea92146103a0578063f2fde38b146103b357600080fd5b8063b4f94b2e14610328578063bb7e61bc1461034f578063d505accf1461036257600080fd5b80637c6db49c116100bd5780637c6db49c146102d05780637ecebe00146102e35780638da5cb5b1461030357600080fd5b806370a0823114610281578063715018a6146102a1578063771da5c5146102a957600080fd5b806346b05e09116101455780635b86f5991161011f5780635b86f599146102485780635bfd99b91461025b5780636eb382121461026e57600080fd5b806346b05e091461020f5780634a38757e1461022257806356a6d9ef1461023557600080fd5b806330adf81f1161017657806330adf81f146101ba5780633644e515146101f4578063392aee43146101fc57600080fd5b80630b6d324c14610192578063266a123a146101a7575b600080fd5b6101a56101a03660046114c8565b6103c6565b005b6101a56101b536600461153e565b610477565b6101e17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6040519081526020015b60405180910390f35b6101e161058c565b6101a561020a3660046115aa565b6106db565b6101a561021d3660046114c8565b610737565b6101a56102303660046115c3565b6107e6565b6101a56102433660046114c8565b610874565b6101a56102563660046114c8565b61087f565b6101a56102693660046114c8565b6108e3565b6101a561027c36600461164a565b61091e565b6101e161028f36600461164a565b60026020526000908152604090205481565b6101a5610a2f565b6101e17f000000000000000000000000000000000000000000000000000000000000000181565b6101a56102de36600461166c565b610a95565b6101e16102f136600461164a565b60046020526000908152604090205481565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101eb565b6101e17fe9b2ae7e4daf46f55b67e32cc4e560d0d1f713e3751697373597cf026a3a25dc81565b6101a561035d3660046116a8565b610b56565b6101a5610370366004611729565b610cd3565b6101e161038336600461179c565b600360209081526000928352604080842090915290825290205481565b600154610310906001600160a01b031681565b6101a56103c136600461164a565b610fe3565b3360009081526003602090815260408083206001600160a01b0386168452909152902054818110156104655760405162461bcd60e51b815260206004820152602d60248201527f43616e206e6f742064656372656173652062616c616e636520616c6c6f77616e60448201527f63652062656c6f77207a65726f0000000000000000000000000000000000000060648201526084015b60405180910390fd5b61047233848484036110c5565b505050565b6001546001600160a01b031633146104d15760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420746865206272696467650000000000000000604482015260640161045c565b8281146105205760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e677468604482015260640161045c565b60005b8381101561058557610573858583818110610540576105406117cf565b9050602002016020810190610555919061164a565b848484818110610567576105676117cf565b905060200201356111a2565b8061057d816117fb565b915050610523565b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000146036105da57507fe9b2ae7e4daf46f55b67e32cc4e560d0d1f713e3751697373597cf026a3a25dc90565b50604080518082018252600981527f544254432042616e6b000000000000000000000000000000000000000000000060209182015281518083018352600181527f31000000000000000000000000000000000000000000000000000000000000009082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fa1cc9cffb2f2444066e5c95caef7925ee7ef97efc6002db29d3637e98e2f0dd2818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b33600090815260026020526040812080548392906106fa908490611814565b909155505060405181815233907f9c6be7c4260e52ea2e41d7f17932147ab78756f1bb2247a2554796d969741aff9060200160405180910390a250565b80158061076557503360009081526003602090815260408083206001600160a01b0386168452909152902054155b6107d75760405162461bcd60e51b815260206004820152602760248201527f4e6f6e2d61746f6d696320616c6c6f77616e6365206368616e6765206e6f742060448201527f616c6c6f77656400000000000000000000000000000000000000000000000000606482015260840161045c565b6107e23383836110c5565b5050565b6107f13385856110c5565b6040517f475d05700000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063475d05709061083c90339087908790879060040161182d565b600060405180830381600087803b15801561085657600080fd5b505af115801561086a573d6000803e3d6000fd5b5050505050505050565b6107e233838361128f565b6001546001600160a01b031633146108d95760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420746865206272696467650000000000000000604482015260640161045c565b6107e282826111a2565b3360008181526003602090815260408083206001600160a01b03871684529091529020546107e291908490610919908590611873565b6110c5565b6000546001600160a01b031633146109785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b6001600160a01b0381166109ce5760405162461bcd60e51b815260206004820152601e60248201527f4272696467652061646472657373206d757374206e6f74206265203078300000604482015260640161045c565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fe1694c0b21fdceff6411daed547c7463c2341b9695387bc82595b5b9b1851d4a9060200160405180910390a150565b6000546001600160a01b03163314610a895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b610a93600061144f565b565b6001600160a01b03831660009081526003602090815260408083203384529091529020546000198114610b455781811015610b385760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6360448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161045c565b610b4584338484036110c5565b610b5084848461128f565b50505050565b6001546001600160a01b03163314610bb05760405162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f7420746865206272696467650000000000000000604482015260640161045c565b828114610bff5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e677468604482015260640161045c565b6000805b82811015610c4357838382818110610c1d57610c1d6117cf565b9050602002013582610c2f9190611873565b915080610c3b816117fb565b915050610c03565b50610c4e86826111a2565b6040517f461c63730000000000000000000000000000000000000000000000000000000081526001600160a01b0387169063461c637390610c99908890889088908890600401611886565b600060405180830381600087803b158015610cb357600080fd5b505af1158015610cc7573d6000803e3d6000fd5b50505050505050505050565b42841015610d235760405162461bcd60e51b815260206004820152601260248201527f5065726d697373696f6e20657870697265640000000000000000000000000000604482015260640161045c565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610d935760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207369676e6174757265202773272076616c75650000000000604482015260640161045c565b8260ff16601b1480610da857508260ff16601c145b610df45760405162461bcd60e51b815260206004820152601b60248201527f496e76616c6964207369676e6174757265202776272076616c75650000000000604482015260640161045c565b6000610dfe61058c565b6001600160a01b038916600090815260046020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928c928c928c92909190610e4c836117fb565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610ee09291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610f4b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610f815750886001600160a01b0316816001600160a01b0316145b610fcd5760405162461bcd60e51b815260206004820152601160248201527f496e76616c6964207369676e6174757265000000000000000000000000000000604482015260640161045c565b610fd88989896110c5565b505050505050505050565b6000546001600160a01b0316331461103d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b6001600160a01b0381166110b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161045c565b6110c28161144f565b50565b6001600160a01b0382166111415760405162461bcd60e51b815260206004820152602360248201527f43616e206e6f7420617070726f766520746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161045c565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f2fe5e8e7796010737e636f63b35a0383dc160b68483984f2df987c78e842b405910160405180910390a3505050565b306001600160a01b038316036112205760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f7420696e6372656173652062616c616e636520666f722042616e60448201527f6b00000000000000000000000000000000000000000000000000000000000000606482015260840161045c565b6001600160a01b03821660009081526002602052604081208054839290611248908490611873565b90915550506040518181526001600160a01b038316907f7a702e80a9c183a6ce9d6732991df2e914555ba35a364a70aed2433984e7544b9060200160405180910390a25050565b6001600160a01b0382166112f15760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161045c565b306001600160a01b038316036113555760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e7366657220746f207468652042616e6b206164646044820152637265737360e01b606482015260840161045c565b6001600160a01b038316600090815260026020526040902054818110156113be5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220616d6f756e7420657863656564732062616c616e636500604482015260640161045c565b6001600160a01b038085166000908152600260205260408082208585039055918516815290812080548492906113f5908490611873565b92505081905550826001600160a01b0316846001600160a01b03167f4163d0b06696468b3d7903f482bcd0097bd38a9a9086157479fd6c6561d242618460405161144191815260200190565b60405180910390a350505050565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146114c357600080fd5b919050565b600080604083850312156114db57600080fd5b6114e4836114ac565b946020939093013593505050565b60008083601f84011261150457600080fd5b50813567ffffffffffffffff81111561151c57600080fd5b6020830191508360208260051b850101111561153757600080fd5b9250929050565b6000806000806040858703121561155457600080fd5b843567ffffffffffffffff8082111561156c57600080fd5b611578888389016114f2565b9096509450602087013591508082111561159157600080fd5b5061159e878288016114f2565b95989497509550505050565b6000602082840312156115bc57600080fd5b5035919050565b600080600080606085870312156115d957600080fd5b6115e2856114ac565b935060208501359250604085013567ffffffffffffffff8082111561160657600080fd5b818701915087601f83011261161a57600080fd5b81358181111561162957600080fd5b88602082850101111561163b57600080fd5b95989497505060200194505050565b60006020828403121561165c57600080fd5b611665826114ac565b9392505050565b60008060006060848603121561168157600080fd5b61168a846114ac565b9250611698602085016114ac565b9150604084013590509250925092565b6000806000806000606086880312156116c057600080fd5b6116c9866114ac565b9450602086013567ffffffffffffffff808211156116e657600080fd5b6116f289838a016114f2565b9096509450604088013591508082111561170b57600080fd5b50611718888289016114f2565b969995985093965092949392505050565b600080600080600080600060e0888a03121561174457600080fd5b61174d886114ac565b965061175b602089016114ac565b95506040880135945060608801359350608088013560ff8116811461177f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156117af57600080fd5b6117b8836114ac565b91506117c6602084016114ac565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161180d5761180d6117e5565b5060010190565b81810381811115611827576118276117e5565b92915050565b6001600160a01b038516815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b80820180821115611827576118276117e5565b6040808252810184905260008560608301825b878110156118c7576001600160a01b036118b2846114ac565b16825260209283019290910190600101611899565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561190057600080fd5b8460051b91508186602083013701602001969550505050505056fea2646970667358221220e0d259eb5abc241c523faa249e0fb75ed40e4e10dbf1b8652907b8e098721d0564736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.