Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.24484436323220714 ETH
Eth Value
$846.30 (@ $3,456.48/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,495 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Bridge ERC20 | 20216365 | 42 mins ago | IN | 0 ETH | 0.00137665 | ||||
Bridge ERC20 | 20216225 | 1 hr ago | IN | 0 ETH | 0.00135747 | ||||
Bridge ERC20 | 20216051 | 1 hr ago | IN | 0 ETH | 0.00109474 | ||||
Bridge ERC20 | 20215969 | 2 hrs ago | IN | 0 ETH | 0.0006262 | ||||
Bridge ERC20 | 20215947 | 2 hrs ago | IN | 0 ETH | 0.0008413 | ||||
Bridge ERC20 | 20215884 | 2 hrs ago | IN | 0 ETH | 0.00086975 | ||||
Bridge ERC20 | 20215656 | 3 hrs ago | IN | 0 ETH | 0.00069831 | ||||
Bridge ERC20 | 20215444 | 3 hrs ago | IN | 0 ETH | 0.00107804 | ||||
Bridge ERC20 | 20215388 | 3 hrs ago | IN | 0 ETH | 0.00070463 | ||||
Bridge ERC20 | 20215019 | 5 hrs ago | IN | 0 ETH | 0.00077476 | ||||
Bridge ERC20 | 20215011 | 5 hrs ago | IN | 0 ETH | 0.001113 | ||||
Bridge ERC20 | 20214916 | 5 hrs ago | IN | 0 ETH | 0.00128891 | ||||
Bridge ERC20 | 20213987 | 8 hrs ago | IN | 0 ETH | 0.00345497 | ||||
Bridge ERC20 | 20213938 | 8 hrs ago | IN | 0 ETH | 0.00357898 | ||||
Bridge ERC20 | 20213815 | 9 hrs ago | IN | 0 ETH | 0.006311 | ||||
Bridge ERC20 | 20213766 | 9 hrs ago | IN | 0 ETH | 0.00543455 | ||||
Bridge ERC20 | 20213738 | 9 hrs ago | IN | 0 ETH | 0.00589909 | ||||
Bridge ERC20 | 20213440 | 10 hrs ago | IN | 0 ETH | 0.00680045 | ||||
Bridge ERC20 | 20213289 | 11 hrs ago | IN | 0 ETH | 0.00278987 | ||||
Bridge ERC20 | 20213264 | 11 hrs ago | IN | 0 ETH | 0.00282838 | ||||
Bridge ERC20 | 20213202 | 11 hrs ago | IN | 0 ETH | 0.00390177 | ||||
Bridge ERC20 | 20213190 | 11 hrs ago | IN | 0 ETH | 0.00413212 | ||||
Bridge ERC20 | 20213137 | 11 hrs ago | IN | 0 ETH | 0.00382038 | ||||
Bridge ERC20 | 20213117 | 11 hrs ago | IN | 0 ETH | 0.0036218 | ||||
Bridge ERC20 | 20213003 | 11 hrs ago | IN | 0 ETH | 0.00256448 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
20216365 | 42 mins ago | 0 ETH | ||||
20216365 | 42 mins ago | Contract Creation | 0 ETH | |||
20216051 | 1 hr ago | 0 ETH | ||||
20216051 | 1 hr ago | Contract Creation | 0 ETH | |||
20215947 | 2 hrs ago | 0 ETH | ||||
20215947 | 2 hrs ago | Contract Creation | 0 ETH | |||
20215884 | 2 hrs ago | 0 ETH | ||||
20215884 | 2 hrs ago | Contract Creation | 0 ETH | |||
20215444 | 3 hrs ago | 0 ETH | ||||
20215444 | 3 hrs ago | Contract Creation | 0 ETH | |||
20215011 | 5 hrs ago | 0 ETH | ||||
20215011 | 5 hrs ago | Contract Creation | 0 ETH | |||
20214916 | 5 hrs ago | 0 ETH | ||||
20214916 | 5 hrs ago | Contract Creation | 0 ETH | |||
20213815 | 9 hrs ago | 0 ETH | ||||
20213815 | 9 hrs ago | Contract Creation | 0 ETH | |||
20213766 | 9 hrs ago | 0 ETH | ||||
20213766 | 9 hrs ago | Contract Creation | 0 ETH | |||
20213738 | 9 hrs ago | 0 ETH | ||||
20213738 | 9 hrs ago | Contract Creation | 0 ETH | |||
20213440 | 10 hrs ago | 0 ETH | ||||
20213440 | 10 hrs ago | Contract Creation | 0 ETH | |||
20213202 | 11 hrs ago | 0 ETH | ||||
20213202 | 11 hrs ago | Contract Creation | 0 ETH | |||
20213190 | 11 hrs ago | 0 ETH |
Loading...
Loading
Contract Name:
T2BRouter
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.13; import "./utils/Ownable.sol"; import "./T2BApproval.sol"; import "./interfaces/IT2BRequest.sol"; import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol"; import {ERC20} from "lib/solmate/src/tokens/ERC20.sol"; import "lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol"; contract T2BRouter is Ownable { using SafeTransferLib for ERC20; // Errors error VerificationCallFailed(); error InvalidTokenAddress(); error BalanceMismatch(); error BridgingFailed(); error UnsupportedBridge(); error ZeroAddress(); error SignerMismatch(); error InvalidNonce(); /** * @dev The address used to identify ETH. */ address public constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); // Socket Gateway. address public immutable socketGateway; address public feeTakerAddress; address[] public supportedTokens; address public signerAddress; // mapping of routeids against verifier contracts mapping(uint32 => address) public bridgeVerifiers; // nonce used in fee update signatures mapping(address => uint256) public nextNonce; // Constructor constructor( address _owner, address _socketGateway, address _feeTakerAddress ) Ownable(_owner) { socketGateway = _socketGateway; feeTakerAddress = _feeTakerAddress; } // Set the t2b factory address function setFeeTakerAddress(address _feeTakerAddress) external onlyOwner { feeTakerAddress = _feeTakerAddress; } // Set the signer address function setSignerAddress(address _signerAddress) external onlyOwner { signerAddress = _signerAddress; } // Set bridge verifier contract address against routeId function setBridgeVerifier( uint32 routeId, address bridgeVerifier ) external onlyOwner { bridgeVerifiers[routeId] = bridgeVerifier; } // function to add tokens to supportedTokens function setSupportedTokens(address[] memory _tokens) external onlyOwner { for (uint256 i = 0; i < _tokens.length; i++) { supportedTokens.push(_tokens[i]); } supportedTokens.push(address(0)); } // function to empty supported tokens array function emptyTokenList() external onlyOwner { address[] memory emptyList; supportedTokens = emptyList; } // Function that bridges taking amount from the t2bAddress where the user funds are parked. function bridgeERC20( uint256 fees, uint256 nonce, bytes calldata bridgeData, bytes calldata signature ) external { // recovering signer. address recoveredSigner = ECDSA.recover( keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256( abi.encode( address(this), nonce, block.chainid, // uint256 fees, bridgeData ) ) ) ), signature ); if (signerAddress != recoveredSigner) revert SignerMismatch(); // nonce is used by gated roles and we don't expect nonce to reach the max value of uint256 unchecked { if (nonce != nextNonce[signerAddress]++) revert InvalidNonce(); } if (bridgeVerifiers[uint32(bytes4(bridgeData[0:4]))] == address(0)) revert UnsupportedBridge(); (bool parseSuccess, bytes memory parsedData) = bridgeVerifiers[ uint32(bytes4(bridgeData[0:4])) ].call(bridgeData[4:bridgeData.length - 1]); if (!parseSuccess) revert VerificationCallFailed(); IT2BRequest.T2BRequest memory t2bRequest = abi.decode( parsedData, (IT2BRequest.T2BRequest) ); address t2bAddress = getAddressFor( t2bRequest.recipient, t2bRequest.toChainId ); if ( ERC20(t2bRequest.token).allowance(t2bAddress, address(this)) < t2bRequest.amount ) { bytes32 uniqueSalt = keccak256( abi.encode(t2bRequest.recipient, t2bRequest.toChainId) ); new T2BApproval{salt: uniqueSalt}(address(this)); } ERC20(t2bRequest.token).safeTransferFrom( t2bAddress, address(this), t2bRequest.amount + fees ); if (fees > 0) ERC20(t2bRequest.token).safeTransfer(feeTakerAddress, fees); if ( t2bRequest.amount > ERC20(t2bRequest.token).allowance(address(this), socketGateway) ) { ERC20(t2bRequest.token).safeApprove( address(socketGateway), type(uint256).max ); } (bool bridgeSuccess, ) = socketGateway.call(bridgeData); if (!bridgeSuccess) revert BridgingFailed(); } function deployApprovalContract( address receiver, uint256 toChainId ) public returns (address approvalAddress) { bytes32 uniqueSalt = keccak256(abi.encode(receiver, toChainId)); approvalAddress = address(new T2BApproval{salt: uniqueSalt}(address(this))); } function getAddressFor( address receiver, uint256 toChainId ) public view returns (address) { bytes32 salt = keccak256(abi.encode(receiver, toChainId)); return address( uint160( uint256( keccak256( abi.encodePacked( bytes1(0xff), address(this), salt, keccak256( abi.encodePacked( type(T2BApproval).creationCode, abi.encode(address(this)) ) ) ) ) ) ) ); } /******************************************* * RESTRICTED RESCUE FUNCTION * *******************************************/ /** * @dev Rescues funds from a contract. * @param token_ The address of the token contract. * @param userAddress_ The address of the user. * @param amount_ The amount of tokens to be rescued. */ function rescueFunds( address token_, address userAddress_, uint256 amount_ ) external onlyOwner { if (userAddress_ == address(0)) revert ZeroAddress(); if (token_ == ETH_ADDRESS) { SafeTransferLib.safeTransferETH(userAddress_, amount_); } else { if (token_.code.length == 0) revert InvalidTokenAddress(); SafeTransferLib.safeTransfer(ERC20(token_), userAddress_, amount_); } } function rescueFromT2BReceiver( address t2bReceiver_, address token_, address userAddress_, uint256 amount_ ) external onlyOwner { if (userAddress_ == address(0)) revert ZeroAddress(); if (token_.code.length == 0) revert InvalidTokenAddress(); SafeTransferLib.safeTransferFrom( ERC20(token_), t2bReceiver_, userAddress_, amount_ ); } }
pragma solidity ^0.8.13; import "./interfaces/IT2BRouter.sol"; import {SafeTransferLib} from "lib/solmate/src/utils/SafeTransferLib.sol"; import {ERC20} from "lib/solmate/src/tokens/ERC20.sol"; contract T2BApproval { using SafeTransferLib for ERC20; error ZeroAddress(); error InvalidTokenAddress(); // Constructor constructor(address _t2bRouter) { // Set T2b Router. IT2BRouter t2bRouter = IT2BRouter(_t2bRouter); // Set Max Approvals for supported tokens. uint256 tokenIndex = 0; while (t2bRouter.supportedTokens(tokenIndex) != address(0)) { ERC20(t2bRouter.supportedTokens(tokenIndex)).safeApprove( address(t2bRouter), type(uint256).max ); unchecked { ++tokenIndex; } } selfdestruct(payable(msg.sender)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** * @title IT2BRouter * @notice Interface for T2B Router. * @dev functions can be added here for invocation from external contracts or off-chain * @author Socket dot tech. */ abstract contract IT2BRouter { // tokenlist in IT2BRouter address[] public supportedTokens; }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. /// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument. mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) ) } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "APPROVE_FAILED"); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.4; abstract contract Ownable { address private _owner; address private _nominee; event OwnerNominated(address indexed nominee); event OwnerClaimed(address indexed claimer); error OnlyOwner(); error OnlyNominee(); constructor(address owner_) { _claimOwner(owner_); } modifier onlyOwner() { if (msg.sender != _owner) { revert OnlyOwner(); } _; } function owner() public view returns (address) { return _owner; } function nominee() public view returns (address) { return _nominee; } function nominateOwner(address nominee_) external { if (msg.sender != _owner) { revert OnlyOwner(); } _nominee = nominee_; emit OwnerNominated(_nominee); } function claimOwner() external { if (msg.sender != _nominee) { revert OnlyNominee(); } _claimOwner(msg.sender); } function _claimOwner(address claimer_) internal { _owner = claimer_; _nominee = address(0); } }
pragma solidity ^0.8.13; interface IT2BRequest { struct T2BRequest { uint256 amount; address recipient; uint256 toChainId; address token; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @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 ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. 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] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { 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. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @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. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} 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.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @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) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @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 // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; import "../interfaces/ISynapseImpl.sol"; contract SynapseVerifier { address NATIVE_TOKEN_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; function bridgeERC20To( uint256 amount, bytes32 metadata, address receiverAddress, address token, uint256 toChainId, ISynapseImpl.SwapQuery calldata originQuery, ISynapseImpl.SwapQuery calldata destinationQuery ) external payable returns (ISynapseImpl.T2BRequest memory) { return ISynapseImpl.T2BRequest(amount, receiverAddress, toChainId, token); } function bridgeNativeTo( uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, ISynapseImpl.SwapQuery calldata originQuery, ISynapseImpl.SwapQuery calldata destinationQuery ) external view returns (ISynapseImpl.T2BRequest memory) { return ISynapseImpl.T2BRequest( amount, receiverAddress, toChainId, NATIVE_TOKEN_ADDRESS ); } }
pragma solidity ^0.8.13; interface ISynapseImpl { struct SwapQuery { address swapAdapter; address tokenOut; uint256 minAmountOut; uint256 deadline; bytes rawParams; } struct T2BRequest { uint256 amount; address recipient; uint256 toChainId; address token; } function bridgeERC20To( uint256 amount, bytes32 metadata, address receiverAddress, address token, uint256 toChainId, SwapQuery calldata originQuery, SwapQuery calldata destinationQuery ) external view returns (T2BRequest memory); function bridgeNativeTo( uint256 amount, bytes32 metadata, address receiverAddress, uint256 toChainId, SwapQuery calldata originQuery, SwapQuery calldata destinationQuery ) external view returns (T2BRequest memory); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_socketGateway","type":"address"},{"internalType":"address","name":"_feeTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceMismatch","type":"error"},{"inputs":[],"name":"BridgingFailed","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidTokenAddress","type":"error"},{"inputs":[],"name":"OnlyNominee","type":"error"},{"inputs":[],"name":"OnlyOwner","type":"error"},{"inputs":[],"name":"SignerMismatch","type":"error"},{"inputs":[],"name":"UnsupportedBridge","type":"error"},{"inputs":[],"name":"VerificationCallFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"}],"name":"OwnerClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"nominee","type":"address"}],"name":"OwnerNominated","type":"event"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fees","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"bridgeData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"bridgeERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"bridgeVerifiers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"deployApprovalContract","outputs":[{"internalType":"address","name":"approvalAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emptyTokenList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"toChainId","type":"uint256"}],"name":"getAddressFor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nextNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nominee_","type":"address"}],"name":"nominateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"t2bReceiver_","type":"address"},{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"userAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"rescueFromT2BReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"userAddress_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"routeId","type":"uint32"},{"internalType":"address","name":"bridgeVerifier","type":"address"}],"name":"setBridgeVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTakerAddress","type":"address"}],"name":"setFeeTakerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"setSupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"socketGateway","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200259f3803806200259f833981016040819052620000349162000091565b600080546001600160a01b039485166001600160a01b031991821617909155600180548216905591831660805260028054919093169116179055620000db565b80516001600160a01b03811681146200008c57600080fd5b919050565b600080600060608486031215620000a757600080fd5b620000b28462000074565b9250620000c26020850162000074565b9150620000d26040850162000074565b90509250925092565b6080516124936200010c600039600081816102d801528181611013015281816110b501526110ff01526124936000f3fe60806040523480156200001157600080fd5b5060043610620001955760003560e01c80636ccae05411620000e9578063c97093ae1162000097578063d9620611116200006e578063d962061114620003c9578063de81ea3014620003d3578063f3597fa314620003ea57600080fd5b8063c97093ae146200037a578063cdebe0c6146200039b578063d28e270f14620003b257600080fd5b8063a734f06e11620000cc578063a734f06e1462000330578063b9bb2f40146200034c578063c6255626146200036357600080fd5b80636ccae05414620002fa5780638da5cb5b146200031157600080fd5b80633bd1adec11620001475780635b7633d0116200012a5780635b7633d0146200029a5780635b94db2714620002bb578063678fcd6114620002d257600080fd5b80633bd1adec1462000279578063471b609c146200028357600080fd5b80630cd55abf116200017c5780630cd55abf14620001ca57806320f99c0a14620002005780632bdaca47146200024057600080fd5b8063046dc166146200019a5780630865d28614620001b3575b600080fd5b620001b1620001ab36600462001bd2565b62000401565b005b620001b1620001c436600462001c13565b6200049a565b620001ed620001db36600462001bd2565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001f7565b6200021a6200025136600462001c4f565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b620001b162000547565b620001b16200029436600462001c6d565b620005d1565b6004546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620002cc36600462001bd2565b620006d7565b6200021a7f000000000000000000000000000000000000000000000000000000000000000081565b620001b16200030b36600462001cc5565b62000798565b60005473ffffffffffffffffffffffffffffffffffffffff166200021a565b6200021a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6200021a6200035d36600462001d0b565b620008e6565b6200021a6200037436600462001d3a565b62000a84565b6002546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620003ac36600462001d99565b62000abc565b620001b1620003c336600462001ea4565b620011d4565b620001b16200131b565b6200021a620003e436600462001d0b565b62001386565b620001b1620003fb36600462001bd2565b62001423565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000453576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314620004ec576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff91909116600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331462000599576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000623576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000671576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163b600003620006c3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006d183858484620014bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000729576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314620007ea576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000838576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8416016200088757620008828282620015b4565b505050565b8273ffffffffffffffffffffffffffffffffffffffff163b600003620008d9576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008828383836200162b565b6040805173ffffffffffffffffffffffffffffffffffffffff84166020820152908101829052600090819060600160405160208183030381529060405280519060200120905060ff60f81b308260405180602001620009459062001afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815230602083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620009bd929160200162001fa1565b6040516020818303038152906040528051906020012060405160200162000a4694939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6003818154811062000a9557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600062000b993087468a898960405160200162000adf9695949392919062001fc2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620016fc92505050565b60045490915073ffffffffffffffffffffffffffffffffffffffff80831691161462000bf1576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045473ffffffffffffffffffffffffffffffffffffffff166000908152600660205260409020805460018101909155861462000c5a576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060058162000c6e600482898b62002041565b62000c79916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff160362000cdb576040517f1da5310500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060058162000cf06004828a8c62002041565b62000cfb916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff168760048862000d36600182620020e5565b9262000d459392919062002041565b60405162000d55929190620020ff565b6000604051808303816000865af19150503d806000811462000d94576040519150601f19603f3d011682016040523d82523d6000602084013e62000d99565b606091505b50915091508162000dd6576040517f9cd56f3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008180602001905181019062000dee91906200210f565b9050600062000e0682602001518360400151620008e6565b825160608401516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301523060248301529394509192169063dd62ed3e90604401602060405180830381865afa15801562000e84573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000eaa91906200218a565b101562000f5a5760008260200151836040015160405160200162000ef092919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604051602081830303815290604052805190602001209050803060405162000f189062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f590508015801562000f56573d6000803e3d6000fd5b5050505b62000f9681308d856000015162000f729190620021a4565b606086015173ffffffffffffffffffffffffffffffffffffffff16929190620014bc565b8a1562000fcb57600254606083015162000fcb9173ffffffffffffffffffffffffffffffffffffffff91821691168d6200162b565b60608201516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248301529091169063dd62ed3e90604401602060405180830381865afa15801562001064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200108a91906200218a565b82511115620010fb576060820151620010fb9073ffffffffffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001724565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a8a60405162001146929190620020ff565b6000604051808303816000865af19150503d806000811462001185576040519150601f19603f3d011682016040523d82523d6000602084013e6200118a565b606091505b5050905080620011c6576040517f143fd2cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001226576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015620012bf5760038282815181106200124a576200124a620021bf565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905580620012b681620021ee565b91505062001229565b5050600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146200136d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608051620013829060039060809062001b09565b5050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602082015290810182905260009081906060016040516020818303038152906040528051906020012090508030604051620013dc9062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f59050801580156200141a573d6000803e3d6000fd5b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001475576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080620015ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064015b60405180910390fd5b5050505050565b600080600080600085875af190508062000882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401620015a4565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401620015a4565b60008060006200170d8585620017f5565b915091506200171c816200183e565b509392505050565b60006040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152606401620015a4565b60008082516041036200182f5760208301516040840151606085015160001a620018228782858562001a07565b9450945050505062001837565b506000905060025b9250929050565b600081600481111562001855576200185562002229565b036200185e5750565b600181600481111562001875576200187562002229565b03620018de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620015a4565b6002816004811115620018f557620018f562002229565b036200195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620015a4565b600381600481111562001975576200197562002229565b0362001a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620015a4565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111562001a40575060009050600362001af2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562001a95573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811662001aeb5760006001925092505062001af2565b9150600090505b94509492505050565b610205806200225983390190565b82805482825590600052602060002090810192821562001b86579160200282015b8281111562001b8657825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019062001b2a565b5062001b9492915062001b98565b5090565b5b8082111562001b94576000815560010162001b99565b73ffffffffffffffffffffffffffffffffffffffff8116811462001a0457600080fd5b60006020828403121562001be557600080fd5b813562001bf28162001baf565b9392505050565b803563ffffffff8116811462001c0e57600080fd5b919050565b6000806040838503121562001c2757600080fd5b62001c328362001bf9565b9150602083013562001c448162001baf565b809150509250929050565b60006020828403121562001c6257600080fd5b62001bf28262001bf9565b6000806000806080858703121562001c8457600080fd5b843562001c918162001baf565b9350602085013562001ca38162001baf565b9250604085013562001cb58162001baf565b9396929550929360600135925050565b60008060006060848603121562001cdb57600080fd5b833562001ce88162001baf565b9250602084013562001cfa8162001baf565b929592945050506040919091013590565b6000806040838503121562001d1f57600080fd5b823562001d2c8162001baf565b946020939093013593505050565b60006020828403121562001d4d57600080fd5b5035919050565b60008083601f84011262001d6757600080fd5b50813567ffffffffffffffff81111562001d8057600080fd5b6020830191508360208285010111156200183757600080fd5b6000806000806000806080878903121562001db357600080fd5b8635955060208701359450604087013567ffffffffffffffff8082111562001dda57600080fd5b62001de88a838b0162001d54565b9096509450606089013591508082111562001e0257600080fd5b5062001e1189828a0162001d54565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562001e9c5762001e9c62001e23565b604052919050565b6000602080838503121562001eb857600080fd5b823567ffffffffffffffff8082111562001ed157600080fd5b818501915085601f83011262001ee657600080fd5b81358181111562001efb5762001efb62001e23565b8060051b915062001f0e84830162001e52565b818152918301840191848101908884111562001f2957600080fd5b938501935b8385101562001f57578435925062001f468362001baf565b828252938501939085019062001f2e565b98975050505050505050565b6000815160005b8181101562001f86576020818501810151868301520162001f6a565b8181111562001f96576000828601525b509290920192915050565b600062001fba62001fb3838662001f63565b8462001f63565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015284604082015283606082015260a060808201528160a0820152818360c0830137600081830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b600080858511156200205257600080fd5b838611156200206057600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620020ae5780818660040360031b1b83161692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015620020fa57620020fa620020b6565b500390565b8183823760009101908152919050565b6000608082840312156200212257600080fd5b6040516080810181811067ffffffffffffffff8211171562002148576200214862001e23565b6040528251815260208301516200215f8162001baf565b60208201526040838101519082015260608301516200217e8162001baf565b60608201529392505050565b6000602082840312156200219d57600080fd5b5051919050565b60008219821115620021ba57620021ba620020b6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620022225762002222620020b6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfe608060405234801561001057600080fd5b5060405161020538038061020583398101604081905261002f916101d4565b8060005b604051636312ab1360e11b8152600481018290526000906001600160a01b0384169063c625562690602401602060405180830381865afa15801561007b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061009f91906101d4565b6001600160a01b0316146101475761013f82600019846001600160a01b031663c6255626856040518263ffffffff1660e01b81526004016100e291815260200190565b602060405180830381865afa1580156100ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012391906101d4565b6001600160a01b031661014a60201b610009179092919060201c565b600101610033565b33ff5b600060405163095ea7b360e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806101ce5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b604482015260640160405180910390fd5b50505050565b6000602082840312156101e657600080fd5b81516001600160a01b03811681146101fd57600080fd5b939250505056fea2646970667358221220857383cce2fe96ed338a0c6f2b3640bc7b712135e46fea7ac41f3528e903e4db64736f6c634300080d0033000000000000000000000000e8dd38e673a93ccfc2e3d7053efccb5c93f493650000000000000000000000003a23f943181408eac424116af7b7790c94cb97a50000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e53
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620001955760003560e01c80636ccae05411620000e9578063c97093ae1162000097578063d9620611116200006e578063d962061114620003c9578063de81ea3014620003d3578063f3597fa314620003ea57600080fd5b8063c97093ae146200037a578063cdebe0c6146200039b578063d28e270f14620003b257600080fd5b8063a734f06e11620000cc578063a734f06e1462000330578063b9bb2f40146200034c578063c6255626146200036357600080fd5b80636ccae05414620002fa5780638da5cb5b146200031157600080fd5b80633bd1adec11620001475780635b7633d0116200012a5780635b7633d0146200029a5780635b94db2714620002bb578063678fcd6114620002d257600080fd5b80633bd1adec1462000279578063471b609c146200028357600080fd5b80630cd55abf116200017c5780630cd55abf14620001ca57806320f99c0a14620002005780632bdaca47146200024057600080fd5b8063046dc166146200019a5780630865d28614620001b3575b600080fd5b620001b1620001ab36600462001bd2565b62000401565b005b620001b1620001c436600462001c13565b6200049a565b620001ed620001db36600462001bd2565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b60015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001620001f7565b6200021a6200025136600462001c4f565b60056020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b620001b162000547565b620001b16200029436600462001c6d565b620005d1565b6004546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620002cc36600462001bd2565b620006d7565b6200021a7f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a581565b620001b16200030b36600462001cc5565b62000798565b60005473ffffffffffffffffffffffffffffffffffffffff166200021a565b6200021a73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6200021a6200035d36600462001d0b565b620008e6565b6200021a6200037436600462001d3a565b62000a84565b6002546200021a9073ffffffffffffffffffffffffffffffffffffffff1681565b620001b1620003ac36600462001d99565b62000abc565b620001b1620003c336600462001ea4565b620011d4565b620001b16200131b565b6200021a620003e436600462001d0b565b62001386565b620001b1620003fb36600462001bd2565b62001423565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000453576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314620004ec576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff91909116600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff16331462000599576040517f7c91ccdd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600180549091169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000623576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000671576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163b600003620006c3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620006d183858484620014bc565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462000729576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314620007ea576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821662000838576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffff111111111111111111111111111111111111111273ffffffffffffffffffffffffffffffffffffffff8416016200088757620008828282620015b4565b505050565b8273ffffffffffffffffffffffffffffffffffffffff163b600003620008d9576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620008828383836200162b565b6040805173ffffffffffffffffffffffffffffffffffffffff84166020820152908101829052600090819060600160405160208183030381529060405280519060200120905060ff60f81b308260405180602001620009459062001afb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081815230602083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052620009bd929160200162001fa1565b6040516020818303038152906040528051906020012060405160200162000a4694939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6003818154811062000a9557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600062000b993087468a898960405160200162000adf9695949392919062001fc2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000091830191909152603c820152605c016040516020818303038152906040528051906020012084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250620016fc92505050565b60045490915073ffffffffffffffffffffffffffffffffffffffff80831691161462000bf1576040517f10c74b0300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045473ffffffffffffffffffffffffffffffffffffffff166000908152600660205260409020805460018101909155861462000c5a576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060058162000c6e600482898b62002041565b62000c79916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff160362000cdb576040517f1da5310500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060058162000cf06004828a8c62002041565b62000cfb916200206d565b60e01c815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff168760048862000d36600182620020e5565b9262000d459392919062002041565b60405162000d55929190620020ff565b6000604051808303816000865af19150503d806000811462000d94576040519150601f19603f3d011682016040523d82523d6000602084013e62000d99565b606091505b50915091508162000dd6576040517f9cd56f3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008180602001905181019062000dee91906200210f565b9050600062000e0682602001518360400151620008e6565b825160608401516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80851660048301523060248301529394509192169063dd62ed3e90604401602060405180830381865afa15801562000e84573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000eaa91906200218a565b101562000f5a5760008260200151836040015160405160200162000ef092919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b604051602081830303815290604052805190602001209050803060405162000f189062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f590508015801562000f56573d6000803e3d6000fd5b5050505b62000f9681308d856000015162000f729190620021a4565b606086015173ffffffffffffffffffffffffffffffffffffffff16929190620014bc565b8a1562000fcb57600254606083015162000fcb9173ffffffffffffffffffffffffffffffffffffffff91821691168d6200162b565b60608201516040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a5811660248301529091169063dd62ed3e90604401602060405180830381865afa15801562001064573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200108a91906200218a565b82511115620010fb576060820151620010fb9073ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62001724565b60007f0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a573ffffffffffffffffffffffffffffffffffffffff168a8a60405162001146929190620020ff565b6000604051808303816000865af19150503d806000811462001185576040519150601f19603f3d011682016040523d82523d6000602084013e6200118a565b606091505b5050905080620011c6576040517f143fd2cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001226576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015620012bf5760038282815181106200124a576200124a620021bf565b60209081029190910181015182546001810184556000938452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691909117905580620012b681620021ee565b91505062001229565b5050600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146200136d576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608051620013829060039060809062001b09565b5050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602082015290810182905260009081906060016040516020818303038152906040528051906020012090508030604051620013dc9062001afb565b73ffffffffffffffffffffffffffffffffffffffff90911681526020018190604051809103906000f59050801580156200141a573d6000803e3d6000fd5b50949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331462001475576040517f5fc483c500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015273ffffffffffffffffffffffffffffffffffffffff841660248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080620015ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064015b60405180910390fd5b5050505050565b600080600080600085875af190508062000882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401620015a4565b60006040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401620015a4565b60008060006200170d8585620017f5565b915091506200171c816200183e565b509392505050565b60006040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080620006d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152606401620015a4565b60008082516041036200182f5760208301516040840151606085015160001a620018228782858562001a07565b9450945050505062001837565b506000905060025b9250929050565b600081600481111562001855576200185562002229565b036200185e5750565b600181600481111562001875576200187562002229565b03620018de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401620015a4565b6002816004811115620018f557620018f562002229565b036200195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401620015a4565b600381600481111562001975576200197562002229565b0362001a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401620015a4565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111562001a40575060009050600362001af2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562001a95573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811662001aeb5760006001925092505062001af2565b9150600090505b94509492505050565b610205806200225983390190565b82805482825590600052602060002090810192821562001b86579160200282015b8281111562001b8657825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019062001b2a565b5062001b9492915062001b98565b5090565b5b8082111562001b94576000815560010162001b99565b73ffffffffffffffffffffffffffffffffffffffff8116811462001a0457600080fd5b60006020828403121562001be557600080fd5b813562001bf28162001baf565b9392505050565b803563ffffffff8116811462001c0e57600080fd5b919050565b6000806040838503121562001c2757600080fd5b62001c328362001bf9565b9150602083013562001c448162001baf565b809150509250929050565b60006020828403121562001c6257600080fd5b62001bf28262001bf9565b6000806000806080858703121562001c8457600080fd5b843562001c918162001baf565b9350602085013562001ca38162001baf565b9250604085013562001cb58162001baf565b9396929550929360600135925050565b60008060006060848603121562001cdb57600080fd5b833562001ce88162001baf565b9250602084013562001cfa8162001baf565b929592945050506040919091013590565b6000806040838503121562001d1f57600080fd5b823562001d2c8162001baf565b946020939093013593505050565b60006020828403121562001d4d57600080fd5b5035919050565b60008083601f84011262001d6757600080fd5b50813567ffffffffffffffff81111562001d8057600080fd5b6020830191508360208285010111156200183757600080fd5b6000806000806000806080878903121562001db357600080fd5b8635955060208701359450604087013567ffffffffffffffff8082111562001dda57600080fd5b62001de88a838b0162001d54565b9096509450606089013591508082111562001e0257600080fd5b5062001e1189828a0162001d54565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562001e9c5762001e9c62001e23565b604052919050565b6000602080838503121562001eb857600080fd5b823567ffffffffffffffff8082111562001ed157600080fd5b818501915085601f83011262001ee657600080fd5b81358181111562001efb5762001efb62001e23565b8060051b915062001f0e84830162001e52565b818152918301840191848101908884111562001f2957600080fd5b938501935b8385101562001f57578435925062001f468362001baf565b828252938501939085019062001f2e565b98975050505050505050565b6000815160005b8181101562001f86576020818501810151868301520162001f6a565b8181111562001f96576000828601525b509290920192915050565b600062001fba62001fb3838662001f63565b8462001f63565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015284604082015283606082015260a060808201528160a0820152818360c0830137600081830160c090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010195945050505050565b600080858511156200205257600080fd5b838611156200206057600080fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015620020ae5780818660040360031b1b83161692505b505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015620020fa57620020fa620020b6565b500390565b8183823760009101908152919050565b6000608082840312156200212257600080fd5b6040516080810181811067ffffffffffffffff8211171562002148576200214862001e23565b6040528251815260208301516200215f8162001baf565b60208201526040838101519082015260608301516200217e8162001baf565b60608201529392505050565b6000602082840312156200219d57600080fd5b5051919050565b60008219821115620021ba57620021ba620020b6565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620022225762002222620020b6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfe608060405234801561001057600080fd5b5060405161020538038061020583398101604081905261002f916101d4565b8060005b604051636312ab1360e11b8152600481018290526000906001600160a01b0384169063c625562690602401602060405180830381865afa15801561007b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061009f91906101d4565b6001600160a01b0316146101475761013f82600019846001600160a01b031663c6255626856040518263ffffffff1660e01b81526004016100e291815260200190565b602060405180830381865afa1580156100ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061012391906101d4565b6001600160a01b031661014a60201b610009179092919060201c565b600101610033565b33ff5b600060405163095ea7b360e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806101ce5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b604482015260640160405180910390fd5b50505050565b6000602082840312156101e657600080fd5b81516001600160a01b03811681146101fd57600080fd5b939250505056fea2646970667358221220857383cce2fe96ed338a0c6f2b3640bc7b712135e46fea7ac41f3528e903e4db64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e8dd38e673a93ccfc2e3d7053efccb5c93f493650000000000000000000000003a23f943181408eac424116af7b7790c94cb97a50000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e53
-----Decoded View---------------
Arg [0] : _owner (address): 0xe8dD38E673A93ccFC2E3d7053efcCb5c93F49365
Arg [1] : _socketGateway (address): 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
Arg [2] : _feeTakerAddress (address): 0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e8dd38e673a93ccfc2e3d7053efccb5c93f49365
Arg [1] : 0000000000000000000000003a23f943181408eac424116af7b7790c94cb97a5
Arg [2] : 0000000000000000000000000e1b5ab67af1c99f8c7ebc71f41f75d4d6211e53
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,456.48 | 0.2448 | $846.3 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.