Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
53297 | 41 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
TetherTokenV2
Compiler Version
v0.8.4+commit.c7e474f2
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode z
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache 2.0 import "./TetherToken.sol"; import "./EIP3009.sol"; import "./util/SignatureChecker.sol"; pragma solidity 0.8.4; contract TetherTokenV2 is TetherToken, EIP3009 { bytes32 internal constant _PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); constructor () initializer {} function domainSeparator() internal view virtual override returns (bytes32) { return _domainSeparatorV4(); } /** * The following applies to the following function and comments to that function: * * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ function _permit( address owner_, address spender, uint256 value, uint256 deadline, bytes memory signature ) internal { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256( abi.encode( _PERMIT_TYPEHASH, owner_, spender, value, _useNonce(owner_), deadline ) ); bytes32 hash = _hashTypedDataV4(structHash); require( SignatureChecker.isValidSignatureNow(owner_, hash, signature), "EIP2612: invalid signature" ); _approve(owner_, spender, value); } /** * @notice Update allowance with a signed permit * @param owner_ Token owner's address * @param spender Spender's address * @param value Amount of allowance * @param deadline The time at which the signature expires (unix time) * @param v signature component v * @param r signature component r * @param s signature component s */ function permit( address owner_, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { _permit(owner_, spender, value, deadline, abi.encodePacked(r, s, v)); } /** * The following applies to the following function and comments to that function: * * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ /** * @notice Update allowance with a signed permit * @dev EOA wallet signatures should be packed in the order of r, s, v. * @param owner_ Token owner's address (Authorizer) * @param spender Spender's address * @param value Amount of allowance * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration * @param signature Signature bytes signed by an EOA wallet or a contract wallet */ function permit( address owner_, address spender, uint256 value, uint256 deadline, bytes memory signature ) external { _permit(owner_, spender, value, deadline, signature); } /** * The following applies to the following function and comments to that function: * * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ /** * @notice Execute a transfer with a signed authorization * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function transferWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) public onlyNotBlocked { _transferWithAuthorizationValidityCheck( from, to, value, validAfter, validBefore, nonce, abi.encodePacked(r, s, v) ); _transfer(from, to, value); } /** * The following applies to the following function and comments to that function: * * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ /** * @notice Execute a transfer with a signed authorization * @dev EOA wallet signatures should be packed in the order of r, s, v. * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param signature Signature bytes signed by an EOA wallet or a contract wallet */ function transferWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, bytes memory signature ) external onlyNotBlocked { _transferWithAuthorizationValidityCheck( from, to, value, validAfter, validBefore, nonce, signature ); _transfer(from, to, value); } /** * The following applies to the following function and comments to that function: * * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ /** * @notice Receive a transfer with a signed authorization from the payer * @dev This has an additional check to ensure that the payee's address * matches the caller of this function to prevent front-running attacks. * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function receiveWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) public onlyNotBlocked { _receiveWithAuthorizationValidityCheck( from, to, value, validAfter, validBefore, nonce, abi.encodePacked(r, s, v) ); _transfer(from, to, value); } /** * The following applies to the following function and comments to that function: * * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ /** * @notice Receive a transfer with a signed authorization from the payer * @dev This has an additional check to ensure that the payee's address * matches the caller of this function to prevent front-running attacks. * EOA wallet signatures should be packed in the order of r, s, v. * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param signature Signature bytes signed by an EOA wallet or a contract wallet */ function receiveWithAuthorization( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, bytes memory signature ) external onlyNotBlocked { _receiveWithAuthorizationValidityCheck( from, to, value, validAfter, validBefore, nonce, signature ); _transfer(from, to, value); } uint256[48] private __gap; }
/** * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ pragma solidity >=0.6.12 <0.9.0; import { SignatureChecker } from "./util/SignatureChecker.sol"; import { MessageHashUtils } from "./util/MessageHashUtils.sol"; /** * @title EIP-3009 * @notice Provide internal implementation for gas-abstracted transfers * @dev Contracts that inherit from this must wrap these with publicly * accessible functions, optionally adding modifiers where necessary */ abstract contract EIP3009 { bytes32 public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)"); bytes32 public constant RECEIVE_WITH_AUTHORIZATION_TYPEHASH = keccak256("ReceiveWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)"); bytes32 public constant CANCEL_AUTHORIZATION_TYPEHASH = keccak256("CancelAuthorization(address authorizer,bytes32 nonce)"); /** * @dev authorizer address => nonce => bool (true if nonce is used) */ mapping(address => mapping(bytes32 => bool)) private _authorizationStates; event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce); event AuthorizationCanceled( address indexed authorizer, bytes32 indexed nonce ); function domainSeparator() internal virtual view returns (bytes32); /** * @notice Returns the state of an authorization * @dev Nonces are randomly generated 32-byte data unique to the * authorizer's address * @param authorizer Authorizer's address * @param nonce Nonce of the authorization * @return True if the nonce is used */ function authorizationState(address authorizer, bytes32 nonce) external view returns (bool) { return _authorizationStates[authorizer][nonce]; } /** * @notice Execute a transfer with a signed authorization * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param signature signature in bytes */ function _transferWithAuthorizationValidityCheck( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, bytes memory signature ) internal { _requireValidAuthorization(from, nonce, validAfter, validBefore); _requireValidSignature( from, keccak256( abi.encode( TRANSFER_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce ) ), signature ); _markAuthorizationAsUsed(from, nonce); } /** * @notice Receive a transfer with a signed authorization from the payer * @dev This has an additional check to ensure that the payee's address * matches the caller of this function to prevent front-running attacks. * @param from Payer's address (Authorizer) * @param to Payee's address * @param value Amount to be transferred * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) * @param nonce Unique nonce * @param signature signature in bytes */ function _receiveWithAuthorizationValidityCheck( address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, bytes memory signature ) internal { require(to == msg.sender, "TetherToken: to != msg.sender"); _requireValidAuthorization(from, nonce, validAfter, validBefore); _requireValidSignature( from, keccak256( abi.encode( RECEIVE_WITH_AUTHORIZATION_TYPEHASH, from, to, value, validAfter, validBefore, nonce ) ), signature ); _markAuthorizationAsUsed(from, nonce); } function _cancelAuthorization( address authorizer, bytes32 nonce, bytes memory signature ) internal { _requireUnusedAuthorization(authorizer, nonce); _requireValidSignature( authorizer, keccak256( abi.encode(CANCEL_AUTHORIZATION_TYPEHASH, authorizer, nonce) ), signature ); _authorizationStates[authorizer][nonce] = true; emit AuthorizationCanceled(authorizer, nonce); } /** * @notice Attempt to cancel an authorization * @param authorizer Authorizer's address * @param nonce Nonce of the authorization * @param v v of the signature * @param r r of the signature * @param s s of the signature */ function cancelAuthorization( address authorizer, bytes32 nonce, uint8 v, bytes32 r, bytes32 s ) public { _cancelAuthorization(authorizer, nonce, abi.encodePacked(r,s,v)); } /** * @notice Attempt to cancel an authorization * @dev Works only if the authorization is not yet used. * EOA wallet signatures should be packed in the order of r, s, v. * @param authorizer Authorizer's address * @param nonce Nonce of the authorization * @param signature Signature bytes signed by an EOA wallet or a contract wallet */ function cancelAuthorization( address authorizer, bytes32 nonce, bytes memory signature ) external { _cancelAuthorization(authorizer, nonce, signature); } /** * @notice Validates that signature against input data struct * @param signer Signer's address * @param dataHash Hash of encoded data struct * @param signature signature in bytes */ function _requireValidSignature( address signer, bytes32 dataHash, bytes memory signature ) private view { require( SignatureChecker.isValidSignatureNow( signer, MessageHashUtils.toTypedDataHash(domainSeparator(), dataHash), signature ), "TetherToken: invalid signature" ); } /** * @notice Check that an authorization is unused * @param authorizer Authorizer's address * @param nonce Nonce of the authorization */ function _requireUnusedAuthorization(address authorizer, bytes32 nonce) private view { require( !_authorizationStates[authorizer][nonce], "TetherToken: auth invalid" ); } /** * @notice Check that authorization is valid * @param authorizer Authorizer's address * @param nonce Nonce of the authorization * @param validAfter The time after which this is valid (unix time) * @param validBefore The time before which this is valid (unix time) */ function _requireValidAuthorization( address authorizer, bytes32 nonce, uint256 validAfter, uint256 validBefore ) private view { require( block.timestamp > validAfter, "TetherToken: auth early" ); require(block.timestamp < validBefore, "TetherToken: auth expired"); _requireUnusedAuthorization(authorizer, nonce); } /** * @notice Mark an authorization as used * @param authorizer Authorizer's address * @param nonce Nonce of the authorization */ function _markAuthorizationAsUsed(address authorizer, bytes32 nonce) private { _authorizationStates[authorizer][nonce] = true; emit AuthorizationUsed(authorizer, nonce); } uint256[49] private __gap; }
// SPDX-License-Identifier: Apache 2.0 pragma solidity 0.8.4; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; import "./WithBlockedList.sol"; /* Copyright Tether.to 2024 Version 2.0(a) Licensed under the Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 */ contract TetherToken is Initializable, ERC20PermitUpgradeable, OwnableUpgradeable, WithBlockedList { // Unused variable retained to preserve storage slots across upgrades mapping(address => bool) public isTrusted; uint8 private tetherDecimals; function initialize( string memory _name, string memory _symbol, uint8 _decimals ) public initializer { tetherDecimals = _decimals; __Ownable_init(); __ERC20_init(_name, _symbol); __ERC20Permit_init(_name); } function decimals() public view virtual override returns (uint8) { return tetherDecimals; } function _beforeTokenTransfer( address from, address to, uint256 ) internal virtual override { require(!isBlocked[from] || msg.sender == owner(), "TetherToken: from is blocked"); require( to != address(this), "TetherToken: transfer to the contract address" ); } function transferFrom( address _sender, address _recipient, uint256 _amount ) public virtual override onlyNotBlocked returns (bool) { return super.transferFrom(_sender, _recipient, _amount); } function multiTransfer ( address[] calldata _recipients, uint256[] calldata _values ) external { require( _recipients.length == _values.length, "TetherToken: multiTransfer mismatch" ); for (uint256 i = 0; i < _recipients.length; i++) { transfer(_recipients[i], _values[i]); } } function mint(address _destination, uint256 _amount) public onlyOwner { _mint(_destination, _amount); emit Mint(_destination, _amount); } function burnFrom(address _from, uint256 _amount) public onlyOwner { _burn(_from, _amount); emit Burn(_from, _amount); } function redeem(uint256 _amount) public onlyOwner { _burn(owner(), _amount); emit Redeem(_amount); } function destroyBlockedFunds(address _blockedUser) public onlyOwner { require(isBlocked[_blockedUser], "TetherToken: user is not blocked"); uint256 blockedFunds = balanceOf(_blockedUser); _burn(_blockedUser, blockedFunds); emit DestroyedBlockedFunds(_blockedUser, blockedFunds); } event Mint(address indexed _destination, uint256 _amount); event Burn(address indexed _from, uint256 _amount); event Redeem(uint256 _amount); event DestroyedBlockedFunds(address indexed _blockedUser, uint256 _balance); }
/** * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ pragma solidity >=0.6.12 <0.9.0; import { ECRecover } from "./ECRecover.sol"; import { IERC1271 } from "../interfaces/IERC1271.sol"; /** * @dev Signature verification helper that can be used instead of `ECRecover.recover` to seamlessly support both ECDSA * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets. * * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/SignatureChecker.sol */ library SignatureChecker { /** * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECRecover.recover`. * @param signer Address of the claimed signer * @param digest Keccak-256 hash digest of the signed message * @param signature signature byte array associated with hash */ function isValidSignatureNow( address signer, bytes32 digest, bytes memory signature ) internal view returns (bool) { if (!isContract(signer)) { return ECRecover.recover(digest, signature) == signer; } return isValidERC1271SignatureNow(signer, digest, signature); } /** * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated * against the signer smart contract using ERC1271. * @param signer Address of the claimed signer * @param digest Keccak-256 hash digest of the signed message * @param signature Signature byte array associated with hash * * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus * change through time. It could return true at block N and false at block N+1 (or the opposite). */ function isValidERC1271SignatureNow( address signer, bytes32 digest, bytes memory signature ) internal view returns (bool) { (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector( IERC1271.isValidSignature.selector, digest, signature ) ); return (success && result.length >= 32 && abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector)); } /** * @dev Checks if the input address is a smart contract. */ function isContract(address addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(addr) } return size > 0; } }
// SPDX-License-Identifier: Apache 2.0 pragma solidity 0.8.4; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; /* Copyright Tether.to 2020 Author Will Harborne Licensed under the Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 */ contract WithBlockedList is OwnableUpgradeable { /** * @dev Reverts if called by a blocked account */ modifier onlyNotBlocked() { require(!isBlocked[_msgSender()], "Blocked: msg.sender is blocked"); _; } mapping (address => bool) public isBlocked; function addToBlockedList (address _user) public onlyOwner { isBlocked[_user] = true; emit BlockPlaced(_user); } function removeFromBlockedList (address _user) public onlyOwner { isBlocked[_user] = false; emit BlockReleased(_user); } event BlockPlaced(address indexed _user); event BlockReleased(address indexed _user); }
/** * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ pragma solidity >=0.6.12 <0.9.0; /** * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. * * The library provides methods for generating a hash of a message that conforms to the * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] * specifications. */ library MessageHashUtils { /** * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`). * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/MessageHashUtils.sol * * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with * `\x19\x01` and hashing the result. It corresponds to the hash signed by the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712. * * @param domainSeparator Domain separator * @param structHash Hashed EIP-712 data struct * @return digest The keccak256 digest of an EIP-712 typed data */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) digest := keccak256(ptr, 0x42) } } }
/** * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ pragma solidity >=0.6.12 <0.9.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with the provided data hash * @return magicValue bytes4 magic value 0x1626ba7e when function passes */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); }
/** * SPDX-License-Identifier: Apache-2.0 * * Copyright (c) 2023, Circle Internet Financial, LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * --------------------------------------------------------------------- * * Adapted by Tether.to 2024 for greater flexibility and reusability */ pragma solidity >=0.6.12 <0.9.0; /** * @title ECRecover * @notice A library that provides a safe ECDSA recovery function */ library ECRecover { /** * @notice Recover signer's address from a signed message * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/65e4ffde586ec89af3b7e9140bdc9235d1254853/contracts/cryptography/ECDSA.sol * Modifications: Accept v, r, and s as separate arguments * @param digest Keccak-256 hash digest of the signed message * @param v v of the signature * @param r r of the signature * @param s s of the signature * @return Signer address */ function recover( bytes32 digest, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if ( uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) { revert("ECRecover: invalid signature 's' value"); } if (v != 27 && v != 28) { revert("ECRecover: invalid signature 'v' value"); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(digest, v, r, s); require(signer != address(0), "ECRecover: invalid signature"); return signer; } /** * @notice Recover signer's address from a signed message * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/0053ee040a7ff1dbc39691c9e67a69f564930a88/contracts/utils/cryptography/ECDSA.sol * @param digest Keccak-256 hash digest of the signed message * @param signature Signature byte array associated with hash * @return Signer address */ function recover(bytes32 digest, bytes memory signature) internal pure returns (address) { require(signature.length == 65, "ECRecover: invalid signature length"); bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(digest, v, r, s); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20Upgradeable.sol"; import "./extensions/IERC20MetadataUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ 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. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} uint256[45] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./draft-IERC20PermitUpgradeable.sol"; import "../ERC20Upgradeable.sol"; import "../../../utils/cryptography/draft-EIP712Upgradeable.sol"; import "../../../utils/cryptography/ECDSAUpgradeable.sol"; import "../../../utils/CountersUpgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; mapping(address => CountersUpgradeable.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private _PERMIT_TYPEHASH; /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ function __ERC20Permit_init(string memory name) internal initializer { __Context_init_unchained(); __EIP712_init_unchained(name, "1"); __ERC20Permit_init_unchained(name); } function __ERC20Permit_init_unchained(string memory name) internal initializer { _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSAUpgradeable.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { CountersUpgradeable.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /* * @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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ECDSAUpgradeable.sol"; import "../../proxy/utils/Initializable.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712Upgradeable is Initializable { /* solhint-disable var-name-mixedcase */ bytes32 private _HASHED_NAME; bytes32 private _HASHED_VERSION; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal initializer { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal initializer { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash()); } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712NameHash() internal virtual view returns (bytes32) { return _HASHED_NAME; } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712VersionHash() internal virtual view returns (bytes32) { return _HASHED_VERSION; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return recover(hash, r, vs); } else { revert("ECDSA: invalid signature length"); } } /** * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library CountersUpgradeable { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20Upgradeable.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20PermitUpgradeable { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
{ "optimizer": { "enabled": true, "mode": "z" }, "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "detectMissingLibraries": false, "forceEVMLA": false, "enableEraVMExtensions": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authorizer","type":"address"},{"indexed":true,"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"AuthorizationUsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"}],"name":"BlockPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"}],"name":"BlockReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_blockedUser","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"DestroyedBlockedFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Mint","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Redeem","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANCEL_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RECEIVE_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_WITH_AUTHORIZATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"addToBlockedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","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":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"}],"name":"authorizationState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorizer","type":"address"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"cancelAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_blockedUser","type":"address"}],"name":"destroyBlockedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTrusted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"receiveWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"removeFromBlockedList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"validAfter","type":"uint256"},{"internalType":"uint256","name":"validBefore","type":"uint256"},{"internalType":"bytes32","name":"nonce","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"transferWithAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010003759d709cc3b066528dbd5035f7fdf4e702abd03f73186bc59faa45689d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0003000000000002000a0000000000020000006003100270000002eb0a3001970002000000a1035500010000000103550000008003000039000000400030043f000000010020019000000000030004160000002005000039000000780000c13d0000000400a0008c000004800000413d000000000201043b000000e004200270000002f20040009c000000e40000613d000002f30040009c000000910000613d000002f40040009c0000000402100370000000ec0000613d000002f50040009c0000004106000039000001000c000039000001000b00008a00000036090000390000003708000039000000200700008a0000009b0000613d000002f60040009c000001080000613d000002f70040009c0000010d0000613d000002f80040009c000001290000613d000002f90040009c000001650000613d000002fa0040009c000001970000613d000002fb0040009c0000019c0000613d000002fc0040009c000001a30000613d000002fd0040009c000001b50000613d000002fe0040009c000001d20000613d000002ff0040009c000001f00000613d000003000040009c0000020a0000613d000003010040009c000002120000613d000003020040009c000002310000613d000003030040009c000002510000613d000003040040009c0000025c0000613d000003050040009c000002600000613d000003060040009c000002660000613d000003070040009c0000026c0000613d000003080040009c000002780000613d000003090040009c000002830000613d0000030a0040009c000002a30000613d0000030b0040009c000002a70000613d0000030c0040009c000002c00000613d0000030d0040009c000002c60000613d0000030e0040009c000002dd0000613d0000030f0040009c000002e60000613d000003100040009c000003080000613d000003110040009c0000030e0000613d000003120040009c0000032f0000613d000003130040009c000003400000613d000003140040009c0000034c0000613d000003150040009c000003600000613d000003160040009c0000036a0000613d000003170040009c000004800000c13d000000000003004b000004800000c13d000000000209041a000100680000003d00000b940000013d000000000043004b000002740000c13d000000800010043f000000000003004b000003aa0000613d000000000090043f00000339030000410000000002000019000000000012004b000003ae0000813d000000000403041a000000a005200039000000000045043500000020022000390000000103300039000000700000013d000000000003004b000004800000c13d000000000100041a0000ff0000100190000000820000c13d000000ff00100190000000860000c13d000002f00110019700000001011001bf000000000010041b00000100005004430000012000000443000002f10100004100000ba80001042e000002ec01000041000000800010043f000000840050043f0000002e01000039000000a40010043f000002ed01000041000000c40010043f000002ee01000041000000e40010043f000002ef0100004100000ba900010430000000000003004b000004800000c13d00000000010a00190ba706370000040f000000000301001900000000040200190000000001000411000000000203001900000000030400190000039a0000013d0000006400a0008c000004800000413d000000000003004b000004800000c13d000000000102043b0000031f0010009c000004800000213d000000040110003900000000020a0019000a0000000a001d0ba7059b0000040f0000000a02000029000900000001001d00000024010000390000000101100367000000000101043b0000031f0010009c000004800000213d00000004011000390ba7059b0000040f000800000001001d00000044010000390000000101100367000000000101043b000a00000001001d000000ff0010008c000004800000213d000000000100041a0000000802100270000700ff00200193000000ff0010019000000000010000390000000101006039000000070000006b000000070100c0290ba70a2a0000040f000000000100041a000000070000006b000000c50000c13d000002f00110019700000101011001bf000000000010041b000001000300008a0000010004000039000000000204041a000000000232016f0000000a022001af000000000024041b000100cd0000003d00000af90000013d000000d10000c13d000002f00110019700000101011001bf000000000010041b000100d30000003d00000b540000013d000000d70000c13d000002f00110019700000001011001bf000000000010041b000100d90000003d00000b700000013d0000000001000411000000060000006b0000040f0000c13d000000000200041a000002f00220019700000101022001bf000000000020041b0ba7087a0000040f000100e30000003d00000b8f0000013d000004120000013d000000000003004b000004800000c13d00000000010a00190ba705e50000040f0000031801100197000000000010043f000000fe010000390000027f0000013d0000002400a0008c000004800000413d000000000003004b000004800000c13d000000000102043b000a00000001001d000003180010009c000004800000213d000000cc01000039000000000101041a0000031801100197000100f90000003d00000ba00000013d000000000010043f000100fc0000003d00000b040000013d000003b20000c13d000000400100043d00000044021000390000033f030000410000000000320435000002ec0200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000001ed0000013d000000000003004b000004800000c13d0000003501000039000000000101041a0000030b0000013d0000002400a0008c000004800000413d000000000003004b000004800000c13d000000000102043b000a00000001001d000003180010009c000004800000213d000000cc01000039000000000101041a00000318011001970001011a0000003d00000b1d0000013d000000000021041b000000400100043d000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000329011001c70000800d0200003900000002030000390000033704000041000003c60000013d0000004400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b0000031f0020009c000004800000213d00000023032000390000000000a3004b000004800000813d0000000403200039000000000331034f000000000303043b000900000003001d0000031f0030009c000004800000213d000800240020003d0000000902000029000000050220021000000008022000290000000000a2004b000004800000213d0000002402100370000000000202043b0000031f0020009c000004800000213d00000023032000390000000000a3004b000004800000813d0000000403200039000000000131034f000000000101043b0000031f0010009c000004800000213d000700240020003d000000050210021000000007022000290000000000a2004b000004800000213d000000090010006b0000049d0000c13d0000000004000019000000090040006c000003ca0000813d000000050140021000000008021000290000000103000367000000000223034f000000000202043b000003180020009c000004800000213d000a00000004001d0000000701100029000000000113034f000000000301043b00000000010004110ba708ca0000040f0000000a040000290000000104400039000001530000013d0000006400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d0000002402100370000000000202043b000900000002001d000003180020009c000004800000213d0000004401100370000000000101043b000800000001001d0000000001000411000000000010043f000101790000003d00000b040000013d000000000100003900000001010060390ba70a490000040f0000000a01000029000000090200002900000008030000290ba708ca0000040f0000000a01000029000000000010043f0000003401000039000000200010043f000000000100001900000040020000390ba70a770000040f000000000200041100000318022001970001018b0000003d00000b410000013d000000080310006c0000040c0000813d000000400100043d00000064021000390000033303000041000000000032043500000044021000390000033403000041000000000032043500000024021000390000002803000039000003820000013d000000000003004b000004800000c13d00000000010c041a000000ff0110018f0000030b0000013d000000000003004b000004800000c13d0ba707310000040f000000400300043d00000000001304350000002002000039000004090000013d0000004400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d000101ad0000003d00000b0c0000013d0000000903000029000000010200008a000000000223013f000000000101041a000000000021004b000003f50000213d0000000003310019000003980000013d0000002400a0008c000004800000413d000000000003004b000004800000c13d000000000102043b000a00000001001d000003180010009c000004800000213d000000cc01000039000000000101041a0000031801100197000101c20000003d00000b1d0000013d00000001022001bf000000000021041b000000400100043d000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000329011001c70000800d0200003900000002030000390000033004000041000003c60000013d0000004400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d000000cc02000039000000000202041a0000031802200197000101df0000003d00000b660000013d0000000a02000029000000000002004b000003cd0000c13d000000400100043d00000044021000390000032f03000041000000000032043500000024021000390000001f030000390000000000320435000002ec02000041000000000021043500000004021000390000002003000039000000000032043500000064020000390ba70a650000040f000000a400a0008c000004800000413d000000000003004b000004800000c13d000000000402043b000003180040009c000004800000213d0000004402100370000000000302043b000000ff0030008c000004800000213d0000002402100370000000000202043b0000008405100370000000000505043b0000006401100370000000000101043b000000a00010043f000000c00050043f000000f801300210000000e00010043f000000800060043f0000004000c0043f00000080030000390000000001040019000002db0000013d000000000003004b000004800000c13d00000000010a00190ba705e50000040f0000031801100197000000000010043f0000003301000039000002580000013d000000000003004b000004800000c13d000000cc01000039000000000101041a000900000001001d000a03180010019b00000000010004110000000a0010006b000000000100003900000001010060390ba70a390000040f00000009010000290000032801100197000000cc02000039000000000012041b000000400100043d000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000329011001c70000800d0200003900000003030000390000032a040000410000000a050000290000000006000019000003c70000013d0000004400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d000000cc02000039000000000202041a00000318022001970001023e0000003d00000b660000013d0000000a0100002900000009020000290ba7069e0000040f000000400100043d00000009020000290000000000210435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000002030000390000032704000041000003c60000013d000000000003004b000004800000c13d00000000010a00190ba705e50000040f0000031801100197000000000010043f00000099010000390001025a0000003d00000b480000013d000000000201041a0000039c0000013d000000000003004b000004800000c13d00000326010000410000030b0000013d000000000003004b000004800000c13d000102640000003d00000ad60000013d0ba707e00000040f000002e20000013d000000000003004b000004800000c13d000000cc01000039000000000101041a00000318011001970000030b0000013d000000000003004b000004800000c13d000000000208041a000102710000003d00000b940000013d000000000442013f00000001004001900000038a0000613d0000033101000041000000000010043f0000002201000039000003f80000013d000000000003004b000004800000c13d00000000010a00190ba705e50000040f0000031801100197000000000010043f000000ff01000039000000200010043f000000400200003900000000010000190000035a0000013d000000a400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d0000002402100370000000000202043b000900000002001d000003180020009c000004800000213d0000008402100370000000000202043b0000031f0020009c000004800000213d0000004403100370000000000303043b000800000003001d0000006401100370000000000101043b000700000001001d000000040120003900000000020a00190ba7059b0000040f00000000050100190000000a01000029000000090200002900000008030000290000000704000029000003060000013d000000000003004b000004800000c13d00000322010000410000030b0000013d0000004400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d000102b10000003d00000b0c0000013d000000000101041a000000090310006c000003980000813d000002ec01000041000000800010043f0000002001000039000000840010043f0000002501000039000000a40010043f0000032001000041000000c40010043f0000032101000041000000e40010043f0000008001000039000003880000013d000000000003004b000004800000c13d00000000010a00190ba706370000040f0ba70a1e0000040f0000039b0000013d0000006400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000a00000002001d000003180020009c000004800000213d0000004402100370000000000202043b0000031f0020009c000004800000213d0000002401100370000000000101043b000900000001001d000000040120003900000000020a00190ba7059b0000040f00000000030100190000000a0100002900000009020000290ba706f80000040f000003ca0000013d000000000003004b000004800000c13d000102e10000003d00000ad60000013d0ba708940000040f0000000a0100002900000009020000290000000803000029000003a80000013d000000e400a0008c000004800000413d000000000003004b000004800000c13d0000000008060019000000000602043b000003180060009c000004800000213d0000002402100370000000000202043b000003180020009c000004800000213d0000008403100370000000000503043b000000ff0050008c000004800000213d0000004403100370000000000303043b0000006404100370000000000404043b000000c407100370000000000707043b000000a401100370000000000101043b000000a00010043f000000c00070043f000000f801500210000000e00010043f000000800080043f0000004000c0043f000000800500003900000000010600190ba707790000040f000003ca0000013d000000000003004b000004800000c13d0000031e01000041000000800010043f00000080010000390000039e0000013d0000002400a0008c000004800000413d000000000003004b000004800000c13d000000cc01000039000000000101041a000903180010019b0000000001000411000000090010006b00000000010000390000000101006039000000000202043b000a00000002001d0ba70a390000040f00000009010000290000000a020000290ba7069e0000040f000000400100043d0000000a020000290000000000210435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000001030000390000031d04000041000003c70000013d0000004400a0008c000004800000413d000000000003004b000004800000c13d000000000202043b000003180020009c000004800000213d0000002401100370000000000101043b000a00000001001d000003180010009c000004800000213d00000000010200190ba70a230000040f0000000a020000290ba70a270000040f0000025a0000013d000000000003004b000004800000c13d000103440000003d00000ab20000013d0000031b0070009c000003660000213d0000008001700039000000400010043f0001034a0000003d00000b5f0000013d0ba708940000040f000003a50000013d000000000003004b000004800000c13d00000000010a00190ba706370000040f000a00000002001d0000031801100197000000000010043f000103550000003d00000b3b0000013d0000000a02000029000000000020043f000000200010043f000000000100001900000040020000390ba70a770000040f000000000101041a000000ff001001900000000002000039000000010200c0390000039c0000013d000000000003004b000004800000c13d000103640000003d00000ab20000013d0000031b0070009c000003a00000a13d0000033101000041000000000010043f000000040060043f000003f90000013d0000002400a0008c000004800000413d000000000003004b000004800000c13d000000000102043b000a00000001001d000003180010009c000004800000213d000000cc01000039000000000101041a0000031801100197000103770000003d00000ba00000013d000000000001004b000003fb0000c13d000000400100043d00000064021000390000031903000041000000000032043500000044021000390000031a030000410000000000320435000000240210003900000026030000390000000000320435000002ec02000041000000000021043500000004021000390000002003000039000000000032043500000084020000390ba70a650000040f000000800010043f000000000003004b000003aa0000613d000000000080043f00000323030000410000000002000019000000000012004b000003fd0000813d000000000403041a000000a005200039000000000045043500000020022000390000000103300039000003900000013d00000000010004110000000a020000290ba7065d0000040f0000000102000039000000400100043d000000000021043500000020020000390000040a0000013d0000008001700039000000400010043f000103a40000003d00000b5f0000013d0ba707e00000040f0000000701000029000000060200002900000005030000290ba708ca0000040f000003ca0000013d0000000001b2016f000000a00010043f000000c001000039000004030000013d000003240120009a000003400010009c000003660000a13d000004000000013d000103b40000003d00000b4d0000013d000900000002001d0000000a010000290ba7069e0000040f000000400100043d00000009020000290000000000210435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000002030000390000033e040000410000000a050000290ba70aa20000040f0000000100200190000004800000613d000000400100043d00000000020000190000040a0000013d000000000000043f000000fe01000039000000200010043f0000032b01000041000000000101041a000000ff001001900000002004000039000003db0000613d000000cc01000039000000000101041a00000318011001970000000003000411000000000013004b000004510000c13d0000000001000410000000000012004b0000000001000039000000010100c0390ba70a550000040f000000010100008a0000000903000029000000000413013f0000003501000039000000000201041a000000000042004b000003f50000213d0000000002320019000000000021041b0000000a01000029000000000010043f0000003301000039000000200010043f00000040020000390000000001000019000800000004001d0ba70a770000040f0000000903000029000000000201041a000000080020006c0000045b0000a13d0000033101000041000000000010043f0000001101000039000000040010043f000003320100004100000ba9000104300ba7087a0000040f000003ca0000013d000003240120009a000003250010009c000003660000413d0000003f01200039000000000171016f0000008001100039000000400010043f0000008002000039000a00000001001d0ba706570000040f0000000a030000290000000002310049000000000103001900000000030000190ba70a6d0000040f0000000a0100002900000000020004110000039a0000013d0ba7087a0000040f000000000100041a0000ff010200008a0000000a0000006b000004160000c13d000000000121016f000000000010041b000104180000003d00000af90000013d0000041c0000c13d000002f00110019700000101011001bf000000000010041b0001041e0000003d00000b540000013d000004220000c13d000002f00110019700000001011001bf000000000010041b000104240000003d00000b700000013d000000060a000029000000060000006b0000042b0000c13d000000000100041a000002f00110019700000101011001bf000000000010041b000000090500002900000000020504330000031f0020009c00000041060000390000003607000039000003660000213d000000000107041a000000010010019000000001041002700000007f0440618f0000001f0040008c00000000030000390000000103002039000000000131013f0000000100100190000002740000c13d000000000124019f000000200010008c000500200050003d00000001012002100000000303200210000004920000413d000000000070043f000000200040008c000004810000413d0000001f052000390000000505500270000003380550009a000000200020008c00000339050040410000001f044000390000000504400270000003380440009a000000000045004b000004810000813d000000000005041b00000001055000390000044c0000013d000000400100043d00000044021000390000032c03000041000104560000003d00000b790000013d000002ec02000041000000000021043500000004021000390000000000420435000001ee0000013d0000000002320019000000000021041b000000400100043d0000000000310435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000003030000390000032d0400004100000000050000190000000a060000290ba70aa20000040f0000000100200190000004800000613d000000400100043d00000009020000290000000000210435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000002030000390000032e04000041000003c60000013d00000b2d0000013d0000001f0020008c0000000909000029000004920000a13d000000200400008a000000000542016f000000200600003900000339040000410000000007000019000000000057004b0000000008960019000004a60000813d0000000008080433000000000084041b000000200770003900000020066000390000000104400039000004890000013d000000000002004b0000000002000019000004970000613d00000005020000290000000002020433000000010400008a000000000334022f000000000343013f000000000232016f000000000112019f000004b00000013d000002ec01000041000000800010043f000000840050043f0000002301000039000000a40010043f0000033501000041000000c40010043f0000033601000041000002bd0000013d000000000025004b000004af0000813d000000f80230018f000000010300008a000000000223022f000000000232013f0000000003080433000000000223016f000000000024041b00000001011001bf0000003602000039000000000012041b000000080100002900000000010104330000031f0010009c00000041060000390000003702000039000003660000213d000000000302041a000000010030019000000001023002700000007f0220618f0000001f0020008c00000000040000390000000104002039000000000343013f0000000100300190000002740000c13d000000000312019f000000200030008c000004e70000413d0000003703000039000000000030043f000000200020008c000004d60000413d0000001f0310003900000005033002700000033a0330009a000000200010008c00000323030040410000001f0220003900000005022002700000033a0220009a000000000023004b000004d60000813d000000000003041b0000000103300039000004d10000013d0000001f0010008c000004e70000a13d000000200200008a000000000321016f0000032302000041000000000400001900000020060000390000000807000029000000000034004b0000000005760019000004f50000813d0000000005050433000000000052041b000000200440003900000020066000390000000102200039000004de0000013d000000000001004b0000000002000019000004ed0000613d0000000802000029000000200220003900000000020204330000000303100210000000010400008a000000000334022f000000000343013f000000000232016f0000000101100210000000000112019f000005010000013d000000000013004b000004ff0000813d0000000303100210000000f80330018f000000010400008a000000000334022f000000000343013f0000000004050433000000000334016f000000000032041b000000010110021000000001011001bf0000003702000039000000000012041b00000000000a004b000000000100003900000001010060390000000a0000006b0000000002000039000000010200603900000000001201a0000000000100041a0000ff010200008a000000000121c16f0000000a0000006b000005110000613d00000000000a004b000005120000c13d000000000010041b000105140000003d00000af90000013d000005180000c13d000002f00110019700000101011001bf000000000010041b0000000802100270000800ff00200193000000ff0010019000000000010000390000000101006039000000080000006b000000080100c0290ba70a2a0000040f000000080000006b000005260000c13d000000000100041a000002f00110019700000001011001bf000000000010041b000000400100043d000800000001001d0000033b0010009c0000004106000039000003660000213d00000008020000290000004001200039000000400010043f000000010100003900000000021204360000033c01000041000600000002001d0000000000120435000000000100041a0000000802100270000400ff00200193000000ff0010019000000000010000390000000101006039000000040000006b000000040100c0290ba70a2a0000040f00000009010000290000000002010433000000040000006b0000054b0000c13d000000000100041a000002f001100197000400000001001d00000101011001bf000000000010041b000105470000003d00000b7e0000013d000000040200002900000001022001bf000000000020041b0000054e0000013d0001054d0000003d00000b7e0000013d000000000200041a00000065030000390000000904000029000000000043041b0000006603000039000000000013041b0000000801200270000900ff00100193000000ff0020019000000000010000390000000101006039000000090000006b000000090100c0290ba70a2a0000040f000000090000006b000005610000c13d000000000100041a000002f00110019700000001011001bf000000000010041b0000033d010000410000009a02000039000000000012041b0000000a0000006b000005680000c13d000105680000003d00000b8f0000013d000000070000006b000003ca0000c13d0001056c0000003d00000b8f0000013d000003ca0000013d0001000000000002000100000005001d000002eb0030009c000002eb030080410000004003300210000002eb0040009c000002eb040080410000006004400210000000000334019f000002eb0010009c000002eb01008041000000c001100210000000000113019f0ba70aa70000040f0000006003100270000002eb03300197000000010030006c000000010400002900000000040340190000001f0540018f0000034104400198000005890000613d000000000601034f0000000007000019000000006806043c0000000007870436000000000047004b000005850000c13d000000010220018f000000000005004b000005970000613d000000000641034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000000000003001f00020000000103550000000001020019000000000001042d000100000000000200000000030100190000001f01100039000000000021004b0000000004000019000003420400404100000342052001970000034201100197000000000651013f000000000051004b00000000010000190000034201002041000003420060009c000000000104c019000000000001004b000005e40000613d0000000106000367000000000136034f000000000401043b000003430040009c000005df0000813d0000001f01400039000000200700008a000000000171016f0000003f01100039000000000571016f000000400100043d0000000005510019000000000015004b000000000800003900000001080040390000031f0050009c000005df0000213d0000000100800190000005df0000c13d000000400050043f000000000541043600000020033000390000000008430019000000000028004b000005e40000213d000000000336034f00000000067401700000001f0740018f0000000002650019000005cf0000613d000000000803034f0000000009050019000000008a08043c0000000009a90436000000000029004b000005cb0000c13d000000000007004b000005dc0000613d000000000363034f0000000306700210000000000702043300000000076701cf000000000767022f000000000303043b0000010006600089000000000363022f00000000036301cf000000000373019f000000000032043500000000024500190000000000020435000000000001042d0000033101000041000105e20000003d00000b860000013d000003320100004100000ba90001043000000b2d0000013d000003440010009c000005ef0000213d000000230010008c000005ef0000a13d00000004010000390000000101100367000000000101043b000003180010009c000005ef0000213d000000000001042d00000b2d0000013d0007000000000002000003440010009c000006170000213d0000000002010019000000e30010008c000006170000a13d00000001010003670000000403100370000000000303043b000700000003001d000003180030009c000006170000213d0000002403100370000000000303043b000600000003001d000003180030009c000006170000213d000000c403100370000000000303043b0000031f0030009c000006170000213d0000004404100370000000000404043b000500000004001d0000006404100370000000000404043b000400000004001d0000008404100370000000000404043b000300000004001d000000a401100370000000000101043b000200000001001d00000004013000390ba7059b0000040f0000000007010019000106160000003d00000b5f0000013d000000000001042d00000b2d0000013d000003440010009c000006360000213d000001230010008c000006360000a13d00000001090003670000000401900370000000000101043b000003180010009c000006360000213d0000002402900370000000000202043b000003180020009c000006360000213d000000c403900370000000000703043b000000ff0070008c000006360000213d0000004403900370000000000303043b0000006404900370000000000404043b0000008405900370000000000505043b000000a406900370000000000606043b000000e408900370000000000808043b0000010409900370000000000909043b000000000001042d00000b2d0000013d000003440010009c000006430000213d000000430010008c000006430000a13d00000001020003670000000401200370000000000101043b000003180010009c000006430000213d0000002402200370000000000202043b000000000001042d00000b2d0000013d000000004301043400000000013204360000000002000019000000000032004b0000064f0000813d00000000052100190000000006240019000000000606043300000000006504350000002002200039000006470000013d000006520000a13d000000000231001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d00000000030200190000002002000039000000000221043600000000010300190ba706440000040f000000000001042d00040000000000020000031804100198000006870000613d000200000003001d000300000001001d000400000002001d000103180020019c000006910000613d000000000040043f0000003401000039000000200010043f000000400200003900000000010000190ba70a770000040f0000000102000029000000000020043f000000200010043f000000000100001900000040020000390ba70a770000040f0000000202000029000000000021041b000000400100043d0000000000210435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000003030000390000034504000041000000030500002900000004060000290ba70aa20000040f00000001002001900000069d0000613d000000000001042d000000400100043d000000640210003900000348030000410000000000320435000000440210003900000349030000410000000000320435000000240210003900000024030000390000069a0000013d000000400100043d000000640210003900000346030000410000000000320435000000440210003900000347030000410000000000320435000000240210003900000022030000390000000000320435000002ec0200004100000af30000013d00000b2d0000013d0004000000000002000400000002001d000200000001001d0000031801100198000006d40000613d000300000001001d000000000010043f000106a70000003d00000b040000013d000006ae0000613d000000cc01000039000000000101041a00000318011001970000000002000411000000000012004b000006f10000c13d0000000001000410000000000001004b0000000001000039000000010100c0390ba70a550000040f0000000301000029000000000010043f000106b70000003d00000b4d0000013d0000000403000029000000000232004b000006de0000413d000000000021041b0000003501000039000000000201041a000000000232004b000006ea0000413d000000000021041b000000400100043d0000000000310435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000003030000390000032d04000041000000020500002900000000060000190ba70aa20000040f0000000100200190000006f00000613d000000000001042d000000400100043d00000064021000390000034c03000041000000000032043500000044021000390000034d03000041000000000032043500000024021000390000002103000039000006e70000013d000000400100043d00000064021000390000034a03000041000000000032043500000044021000390000034b030000410000000000320435000000240210003900000022030000390000000000320435000002ec0200004100000af30000013d0000033101000041000000000010043f0000001101000039000000040010043f000003320100004100000ba90001043000000b2d0000013d000000400100043d00000044021000390000032c03000041000106f60000003d00000b790000013d000002ec0200004100000aac0000013d0005000000000002000300000003001d000500000002001d000400000001001d0ba708210000040f000000400200043d00000060012000390000000503000029000000000031043500000060010000390000000001120436000000040300002900000318043001970000004003200039000200000004001d00000000004304350000031e0300004100000000003104350000034e0020009c0000072b0000813d00000080032000390001070f0000003d00000b9b0000013d000000040100002900000003030000290ba7085a0000040f0000000201000029000000000010043f000107160000003d00000b3b0000013d0000000502000029000107190000003d00000b2f0000013d000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000329011001c70000800d0200003900000003030000390000034f04000041000000040500002900000005060000290ba70aa20000040f0000000100200190000007300000613d000000000001042d00000331010000410001072e0000003d00000b860000013d000003320100004100000ba90001043000000b2d0000013d00040000000000020000006501000039000000000101041a0000006602000039000000000202041a000000400400043d000300000004001d000000600340003900000000002304350000004002400039000000000012043500000020024000390000035001000041000200000002001d00000000001204350000800b0100003900000004030000390000000004000415000000040440008a000000050440021000000351020000410ba70a8b0000040f0000000304000029000000a0024000390000000003000410000000000032043500000080024000390000000000120435000000a0010000390000000000140435000003520040009c000007570000813d000000c001400039000000400010043f000000000204043300000002010000290ba70a770000040f000000000001042d00000331010000410001075a0000003d00000b860000013d000003320100004100000ba9000104300003000000000002000300000002001d000200000001001d0000031802100197000000000020043f000107630000003d00000b3b0000013d0000000302000029000107660000003d00000b2f0000013d000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000329011001c70000800d0200003900000003030000390000035304000041000000020500002900000003060000290ba70aa20000040f0000000100200190000007780000613d000000000001042d00000b2d0000013d0008000000000002000200000005001d000600000004001d000500000003001d000400000002001d000700000001001d0000800b0100003900000004030000390000000004000415000000080440008a000000050440021000000354020000410ba70a8b0000040f000000060010006c000007d00000213d00000007010000290000031801100197000300000001001d000000000010043f00000099010000390001078f0000003d00000b480000013d000000000301041a0000000102300039000000000021041b000000400200043d000000a00120003900000000003104350000004001200039000000030300002900000000003104350000000401000029000003180110019700000060032000390000000000130435000000800120003900000005030000290000000000310435000000c00120003900000006030000290000000000310435000000c00100003900000000011204360000033d030000410000000000310435000003550020009c000007cb0000813d000000e003200039000000400030043f00000000020204330ba70a770000040f000600000001001d0ba707310000040f000000400200043d00000042032000390000000604000029000000000043043500000356040000410000002003200039000000000043043500000022042000390000000000140435000000420100003900000000001204350000031b0020009c000007cb0000213d0000008001200039000000400010043f000000000202043300000000010300190ba70a770000040f0000000002010019000000070100002900000002030000290ba709380000040f000000000001004b000007d70000613d0000000701000029000000040200002900000005030000290ba7065d0000040f000000000001042d0000033101000041000107ce0000003d00000b860000013d000003320100004100000ba900010430000000400100043d00000044021000390000035803000041000000000032043500000024021000390000001d03000039000007dd0000013d000000400100043d00000044021000390000035703000041000000000032043500000024021000390000001a030000390000000000320435000002ec0200004100000aac0000013d0008000000000002000400000007001d000800000006001d000600000003001d000503180020019b0000000002000411000000050020006b000008130000c13d0000000802000029000700000001001d0000000003040019000300000004001d0000000004050019000200000005001d0ba708360000040f000000400200043d000000e00120003900000008030000290000000000310435000000c00120003900000002030000290000000000310435000000a001200039000000030300002900000000003104350000008001200039000000060300002900000000003104350000006001200039000000050300002900000000003104350000000701000029000003180110019700000040032000390000000000130435000000e0010000390000000001120436000003260300004100000000003104350000035a0020009c0000081c0000813d00000100032000390001080c0000003d00000b9b0000013d000000070100002900000004030000290ba7085a0000040f000000070100002900000008020000290ba7075c0000040f000000000001042d000000400100043d00000044021000390000035903000041000000000032043500000024021000390000001d030000390000000000320435000002ec0200004100000aac0000013d00000331010000410001081f0000003d00000b860000013d000003320100004100000ba9000104300002000000000002000200000002001d0000031801100197000000000010043f000108270000003d00000b3b0000013d00000002020000290001082a0000003d00000b410000013d000000ff001001900000082d0000c13d000000000001042d000000400100043d00000044021000390000035b030000410000000000320435000000240210003900000019030000390000000000320435000002ec0200004100000aac0000013d0005000000000002000300000004001d000400000003001d000200000002001d000100000001001d0000800b0100003900000004030000390000000004000415000000050440008a000000050440021000000354020000410ba70a8b0000040f000000040010006c0000084a0000a13d000000030010006c000008510000813d000000010100002900000002020000290ba708210000040f000000000001042d000000400100043d00000044021000390000035c03000041000000000032043500000024021000390000001703000039000008570000013d000000400100043d00000044021000390000035d030000410000000000320435000000240210003900000019030000390000000000320435000002ec0200004100000aac0000013d0003000000000002000300000003001d000100000002001d000200000001001d0ba707310000040f0000035602000041000000400300043d000000000023043500000002023000390000000000120435000000220130003900000001020000290000000000210435000000420200003900000000010300190ba70a770000040f0000000002010019000000020100002900000003030000290ba709380000040f000000000001004b000008710000613d000000000001042d000000400100043d00000044021000390000035e03000041000000000032043500000024021000390000001e030000390000000000320435000002ec0200004100000aac0000013d00000000060100190000031801100197000000cc02000039000000000302041a0000032804300197000000000114019f000000000012041b000000400100043d000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f000003180530019700000329011001c70000800d0200003900000003030000390000032a040000410ba70aa20000040f0000000100200190000008930000613d000000000001042d00000b2d0000013d0008000000000002000200000007001d000700000006001d000300000005001d000400000004001d000500000003001d000600000002001d000800000001001d0000000002060019000000000304001900000000040500190ba708360000040f000000400200043d000000e00120003900000007030000290000000000310435000000c00120003900000003030000290000000000310435000000a0012000390000000403000029000000000031043500000080012000390000000503000029000000000031043500000006010000290000031801100197000000600320003900000000001304350000000801000029000003180110019700000040032000390000000000130435000000e0010000390000000001120436000003220300004100000000003104350000035a0020009c000008c50000813d0000010003200039000108be0000003d00000b9b0000013d000000080100002900000002030000290ba7085a0000040f000000080100002900000007020000290ba7075c0000040f000000000001042d0000033101000041000108c80000003d00000b860000013d000003320100004100000ba900010430000600000000000200000318041001980000090a0000613d000600000003001d000200000001001d000300000002001d000503180020019c000009140000613d000400000004001d000000000040043f000108d60000003d00000b040000013d000008dd0000613d000000cc01000039000000000101041a00000318011001970000000002000411000000000012004b000009310000c13d0000000001000410000000050010006b0000000001000039000000010100c0390ba70a550000040f0000000401000029000000000010043f000108e60000003d00000b4d0000013d000000060220006c0000091e0000413d000000000021041b0000000501000029000000000010043f0000003301000039000108ee0000003d00000b480000013d000000010200008a0000000604000029000000000324013f000000000201041a000000000032004b0000092a0000213d0000000002420019000000000021041b000000400100043d0000000000410435000002eb0010009c000002eb0100804100000040011002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f0000031c011001c70000800d0200003900000003030000390000032d04000041000000020500002900000003060000290ba70aa20000040f0000000100200190000009300000613d000000000001042d000000400100043d00000064021000390000036303000041000000000032043500000044021000390000036403000041000000000032043500000024021000390000002503000039000009270000013d000000400100043d00000064021000390000036103000041000000000032043500000044021000390000036203000041000000000032043500000024021000390000002303000039000009270000013d000000400100043d00000064021000390000035f030000410000000000320435000000440210003900000360030000410000000000320435000000240210003900000026030000390000000000320435000002ec0200004100000af30000013d0000033101000041000000000010043f0000001101000039000000040010043f000003320100004100000ba90001043000000b2d0000013d000000400100043d00000044021000390000032c03000041000109360000003d00000b790000013d000002ec0200004100000aac0000013d0006000000000002000500000003001d000400000002001d000300000001001d000600000001001d000080020100003900000024030000390000000004000415000000060440008a000000050440021000000365020000410ba70a8b0000040f000000400300043d000000000001004b0000096c0000613d00000044013000390000004002000039000000000021043500000020023000390000036601000041000200000002001d000000000012043500000024013000390000000402000029000000000021043500000064023000390000000501000029000500000003001d0ba706440000040f00000005030000290000000001310049000000200210008a00000000002304350000001f01100039000000200600008a000000000261016f0000000001320019000000000021004b000000000200003900000001020040390000031f0010009c000009d60000213d0000000100200190000009d60000c13d000000400010043f000000000403043300000000010004140000000302000029000000040020008c000009920000c13d0000000101000039000009960000013d000000040600002900000005040000290000000012040434000000410020008c000009db0000c13d00000040024000390000000002020433000003690020009c000009e40000813d00000060044000390000000004040433000000f8054002700000001b0450008a000000020040008c000009ea0000813d00000000010104330000006004300039000000000024043500000040023000390000000000120435000000200130003900000000005104350000000000630435000000000000043f00000000010004140000000102000039000000800400003900000020050000390ba7056d0000040f000000000001004b000009fb0000613d000000000100043d0000031800100198000000030200002900000a160000613d000000000121013f0000031800100198000009d00000013d000000020300002900000000050000190ba7056d0000040f000000200600008a0000000004000032000009c20000613d0000031f0040009c000009d60000213d0000001f02400039000000000262016f0000003f02200039000000000262016f000000400300043d0000000002230019000000000032004b000000000500003900000001050040390000031f0020009c000009d60000213d0000000100500190000009d60000c13d000000400020043f000000000243043600000000056401700000001f0640018f00000000045200190000000207000367000009b40000613d000000000807034f0000000009020019000000008a08043c0000000009a90436000000000049004b000009b00000c13d000000000006004b000009c40000613d000000000557034f0000000306600210000000000704043300000000076701cf000000000767022f000000000505043b0000010006600089000000000565022f00000000056501cf000000000575019f0000000000540435000009c40000013d00000060030000390000008002000039000000000001004b000009d30000613d0000000003030433000000200030008c0000000001000019000009d40000413d000003440030009c00000a1d0000213d0000001f0030008c00000a1d0000a13d0000000001020433000003660010009c00000000010000390000000101006039000009d40000013d0000000001000019000000010110018f000000000001042d0000033101000041000109d90000003d00000b860000013d000003320100004100000ba90001043000000064013000390000036702000041000000000021043500000044013000390000036802000041000000000021043500000024013000390000002302000039000009f20000013d00000064013000390000036a02000041000000000021043500000044013000390000036d02000041000009ef0000013d00000064013000390000036a02000041000000000021043500000044013000390000036b020000410000000000210435000000240130003900000026020000390000000000210435000002ec010000410000000000130435000000040130003900000020020000390000000000210435000000840200003900000000010300190ba70a650000040f0000000203000367000000200100008a000000000200003100000000011201700000001f0420018f00000a070000613d000000000503034f0000000006000019000000005705043c0000000006760436000000000016004b00000a030000c13d000000000004004b00000a140000613d000000000313034f0000000304400210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000000010000190ba70a650000040f000000400100043d00000044021000390000036c0300004100010a1b0000003d00000b790000013d000002ec0200004100000aac0000013d00000b2d0000013d0000000003020019000000000201001900000000010004110ba708ca0000040f000000000001042d0000031801100197000000000010043f000000340100003900000b8a0000013d0000031802200197000000000020043f00000b8a0000013d000000000001004b00000a2d0000613d000000000001042d000000400100043d0000006402100039000002ee0300004100000000003204350000004402100039000002ed03000041000000000032043500000024021000390000002e030000390000000000320435000002ec0200004100000af30000013d000000000001004b00000a3c0000613d000000000001042d000000400100043d00000044021000390000036e030000410000000000320435000002ec0200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000000000032043500000064020000390ba70a650000040f000000000001004b00000a4c0000613d000000000001042d000000400100043d00000044021000390000036f03000041000000000032043500000024021000390000001e030000390000000000320435000002ec0200004100000aac0000013d000000000001004b00000a580000613d000000000001042d000000400100043d00000064021000390000037003000041000000000032043500000044021000390000037103000041000000000032043500000024021000390000002d030000390000000000320435000002ec0200004100000af30000013d000000000001042f000002eb0010009c000002eb010080410000004001100210000002eb0020009c000002eb020080410000006002200210000000000112019f00000ba900010430000002eb0010009c000002eb010080410000004001100210000002eb0020009c000002eb020080410000006002200210000000000112019f000000e002300210000000000121019f00000ba80001042e000002eb0010009c000002eb010080410000004001100210000002eb0020009c000002eb020080410000006002200210000000000112019f0000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000329011001c700008010020000390ba70aa70000040f000000010020019000000a8a0000613d000000000101043b000000000001042d00000b2d0000013d00000000050100190000000000200443000000040030008c00000a920000a13d000000050140027000000000010100310000000400100443000002eb0030009c000002eb0300804100000060013002100000000002000414000002eb0020009c000002eb02008041000000c002200210000000000112019f00000372011001c700000000020500190ba70aa70000040f000000010020019000000aa10000613d000000000101043b000000000001042d000000000001042f00000aa5002104210000000102000039000000000001042d0000000002000019000000000001042d00000aaa002104230000000102000039000000000001042d0000000002000019000000000001042d000000000021043500000004021000390000002003000039000000000032043500000064020000390ba70a650000040f00000000010a00190ba706180000040f000000000a0004110000000000a0043f000000fe0a0000390000002000a0043f000700000001001d000600000002001d000500000003001d000400000004001d000300000005001d000200000006001d000800000007001d000a00000008001d000900000009001d000000400200003900000000010000190ba70a770000040f000000000101041a000000ff00100190000000000100003900000001010060390ba70a490000040f0000000801000029000000f801100210000000400700043d00000060027000390000000000120435000000410600003900000000016704360000004002700039000000090300002900000000003204350000000a020000290000000000210435000000010000013b00000000010a00190ba705f00000040f0000000008000411000000000080043f000000fe08000039000000200080043f000a00000001001d000900000002001d000800000003001d000700000004001d000600000005001d000500000006001d000400000007001d000000400200003900000000010000190ba70a770000040f000000000101041a000000ff00100190000000000100003900000001010060390ba70a490000040f0000000a01000029000000090200002900000008030000290000000704000029000000060500002900000005060000290000000407000029000000010000013b000000000021043500000004021000390000002003000039000000000032043500000084020000390ba70a650000040f0000000802100270000a00ff00200193000000ff00100190000000000100003900000001010060390000000a0000006b0000000a0100c0290ba70a2a0000040f000000000100041a0000000a0000006b000000010000013b000000fe01000039000000200010043f000000400200003900000000010000190ba70a770000040f000000000101041a000000ff00100190000000010000013b0000002401100370000000000101043b000900000001001d0000000001000411000000000010043f0000003401000039000000200010043f000000400200003900000000010000190ba70a770000040f0000000a02000029000000000020043f000000200010043f000000000100001900000040020000390ba70a770000040f000000010000013b0000000002000411000000000021004b000000000100003900000001010060390ba70a390000040f0000000a01000029000000000010043f000000fe01000039000000200010043f000000400200003900000000010000190ba70a770000040f000000000201041a000001000300008a000000000232016f000000010000013b000000000100001900000ba900010430000000000020043f000000200010043f000000000100001900000040020000390ba70a770000040f000001000200008a000000000301041a000000000223016f00000001022001bf000000000021041b000000400100043d000000010000013b0000010101000039000000200010043f000000400200003900000000010000190ba70a770000040f000000010000013b000000000020043f000000200010043f000000000100001900000040020000390ba70a770000040f000000000101041a000000010000013b000000200010043f000000400200003900000000010000190ba70a770000040f000000010000013b0000003301000039000000200010043f000000400200003900000000010000190ba70a770000040f000000000201041a000000010000013b0000000802100270000600ff00200193000000ff0010019000000000010000390000000101006039000000060000006b000000060100c0290ba70a2a0000040f000000000100041a000000060000006b000000010000013b000000070100002900000006020000290000000503000029000000040400002900000003050000290000000206000029000000010000013b0000000003000411000000000032004b000000000200003900000001020060390000002401100370000000000101043b000900000001001d00000000010200190ba70a390000040f000000010000013b0000000802100270000600ff00200193000000ff0010019000000000010000390000000101006039000000060000006b000000060100c0290ba70a2a0000040f000000010000013b000000000032043500000024021000390000001c030000390000000000320435000000010000013b00000005010000290ba70a770000040f00000008020000290000000002020433000900000001001d00000006010000290ba70a770000040f000000010000013b000000000010043f0000004101000039000000040010043f000000010000013b000000200010043f000000400200003900000000010000190ba70a770000040f000000000001042d000000000100041a0000ff010200008a000000000121016f000000000010041b000000010000013b000000010320019000000001012002700000007f0110618f0000001f0010008c00000000040000390000000104002039000000010000013b000000400030043f00000000020204330ba70a770000040f0000000002010019000000010000013b0000000002000411000000000021004b000000000100003900000001010060390ba70a390000040f0000000a01000029000000010000013b00000ba70000043200000ba80001042e00000ba9000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff08c379a000000000000000000000000000000000000000000000000000000000496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a65640000000000000000000000000000000000000000000000000000000000000000000000000084000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000fbac395100000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000e27a385000000000000000000000000000000000000000000000000000000001624f6c60000000000000000000000000000000000000000000000000000000018160ddd000000000000000000000000000000000000000000000000000000001a14f449000000000000000000000000000000000000000000000000000000001e89d5450000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000313ce567000000000000000000000000000000000000000000000000000000003644e5150000000000000000000000000000000000000000000000000000000039509351000000000000000000000000000000000000000000000000000000003c7c9b900000000000000000000000000000000000000000000000000000000040c10f19000000000000000000000000000000000000000000000000000000005a049a700000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000715018a60000000000000000000000000000000000000000000000000000000079cc6790000000000000000000000000000000000000000000000000000000007ecebe00000000000000000000000000000000000000000000000000000000007f2eecc30000000000000000000000000000000000000000000000000000000088b7ab63000000000000000000000000000000000000000000000000000000008da5cb5b0000000000000000000000000000000000000000000000000000000095d89b410000000000000000000000000000000000000000000000000000000096d64879000000000000000000000000000000000000000000000000000000009fd5a6cf00000000000000000000000000000000000000000000000000000000a0cc6a6800000000000000000000000000000000000000000000000000000000a457c2d700000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000b7b7289900000000000000000000000000000000000000000000000000000000cf09299500000000000000000000000000000000000000000000000000000000d505accf00000000000000000000000000000000000000000000000000000000d916948700000000000000000000000000000000000000000000000000000000db006a7500000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000e3ee160e00000000000000000000000000000000000000000000000000000000e94a010200000000000000000000000000000000000000000000000000000000ef55bec600000000000000000000000000000000000000000000000000000000f2fde38b0000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000ffffffffffffffffffffffffffffffffffffffff64647265737300000000000000000000000000000000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061000000000000000000000000000000000000000000000000ffffffffffffff7f0200000000000000000000000000000000000020000000000000000000000000702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a44158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429000000000000000000000000000000000000000000000000ffffffffffffffff45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000000000000000000000000000000000000000000000000000007c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a226742a7b7dd785cd69714a189dffb3fd7d7174edc9ece837694ce50f7078f7c31ae000000000000000000000000000000000000000000000000ffffffffffffff41ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000080d099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8cc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5ffffffffffffffffffffffff000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e032796e36004994222362c2f9423d5e208bb848170964890784a8d59ed40f50af546574686572546f6b656e3a2066726f6d20697320626c6f636b656400000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688545524332303a206d696e7420746f20746865207a65726f206164647265737300406bbf2d8d145125adf1198d2cf8a67c66cc4bb0ab01c37dccd4f7c0aae1e7c74e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000006c6c6f77616e636500000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732061546574686572546f6b656e3a206d756c74695472616e73666572206d69736d617463680000000000000000000000000000000000000000000000000000000000665918c9e02eb2fd85acca3969cb054fc84c138e60ec4af22ab6ef2fd4c93c27b5ee06b1df56c38609138bc5e6ab13b03d3f7bd651deddee740dcb4de7a37e484a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b8bd58482287a32968eb5e762004c02828e8b12361317c896b31af08f87083ce52000000000000000000000000000000000000000000000000ffffffffffffffbf31000000000000000000000000000000000000000000000000000000000000006e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c96a2859ae7902313752498feb80a014e6e7275fe964c79aa965db815db1c7f1e9546574686572546f6b656e3a2075736572206973206e6f7420626c6f636b6564ffffffffffffffffffffffffffffffffffffffffffffffff000000000000007f00000000000000000000000000000000000000000000000000000000ffffffe0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925737300000000000000000000000000000000000000000000000000000000000045524332303a20617070726f766520746f20746865207a65726f206164647265726573730000000000000000000000000000000000000000000000000000000045524332303a20617070726f76652066726f6d20746865207a65726f20616464636500000000000000000000000000000000000000000000000000000000000045524332303a206275726e20616d6f756e7420657863656564732062616c616e730000000000000000000000000000000000000000000000000000000000000045524332303a206275726e2066726f6d20746865207a65726f20616464726573000000000000000000000000000000000000000000000000ffffffffffffff801cdd46ff242716cdaa72d159d339a485b3438398348d68f09d7c8c0a59353d818b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9a8a0592ac89c5ad3bc6df8224c17b485976f597df104ee20d0df415241f670b000000000000000000000000000000000000000000000000ffffffffffffff4098de503528ee59b575ef0c0a2576a82497bfc029a5685b209e9ec333479b10a5796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132000000000000000000000000000000000000000000000000ffffffffffffff201901000000000000000000000000000000000000000000000000000000000000454950323631323a20696e76616c6964207369676e617475726500000000000045524332305065726d69743a206578706972656420646561646c696e65000000546574686572546f6b656e3a20746f20213d206d73672e73656e646572000000000000000000000000000000000000000000000000000000ffffffffffffff00546574686572546f6b656e3a206175746820696e76616c696400000000000000546574686572546f6b656e3a2061757468206561726c79000000000000000000546574686572546f6b656e3a2061757468206578706972656400000000000000546574686572546f6b656e3a20696e76616c6964207369676e61747572650000616c616e6365000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062657373000000000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220746f20746865207a65726f2061646472647265737300000000000000000000000000000000000000000000000000000045524332303a207472616e736665722066726f6d20746865207a65726f2061641806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b831626ba7e00000000000000000000000000000000000000000000000000000000677468000000000000000000000000000000000000000000000000000000000045435265636f7665723a20696e76616c6964207369676e6174757265206c656e7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a12076616c7565000000000000000000000000000000000000000000000000000045435265636f7665723a20696e76616c6964207369676e61747572652027762745435265636f7665723a20696e76616c6964207369676e61747572650000000045435265636f7665723a20696e76616c6964207369676e6174757265202773274f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572426c6f636b65643a206d73672e73656e64657220697320626c6f636b656400007472616374206164647265737300000000000000000000000000000000000000546574686572546f6b656e3a207472616e7366657220746f2074686520636f6e02000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000675524288e7b529febfa504910a42c632581fada17846ca999cb33ec211ece4b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.