Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
Portal
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IBridge.sol"; import "@uniswap/lib/contracts/libraries/TransferHelper.sol"; import "../utils/RelayRecipientUpgradeable.sol"; import "./interfaces/IWrapper.sol"; import "./metarouter/interfaces/IMetaRouter.sol"; /** * @title A contract that synthesizes tokens * @notice In order to create a synthetic representation on another network, the user must call synthesize function here * @dev All function calls are currently implemented without side effects */ contract Portal is RelayRecipientUpgradeable { /// ** PUBLIC states ** address public wrapper; address public bridge; uint256 public requestCount; bool public paused; mapping(bytes32 => TxState) public requests; mapping(bytes32 => UnsynthesizeState) public unsynthesizeStates; mapping(address => uint256) public balanceOf; mapping(address => uint256) public tokenThreshold; mapping(address => bool) public tokenWhitelist; IMetaRouter public metaRouter; /// ** STRUCTS ** enum RequestState { Default, Sent, Reverted } enum UnsynthesizeState { Default, Unsynthesized, RevertRequest } struct TxState { address recipient; address chain2address; uint256 amount; address rtoken; RequestState state; } struct SynthesizeWithPermitTransaction { uint256 stableBridgingFee; bytes approvalData; address token; uint256 amount; address chain2address; address receiveSide; address oppositeBridge; address revertableAddress; uint256 chainID; bytes32 clientID; } /// ** EVENTS ** event SynthesizeRequest( bytes32 id, // todo it wasn't indexed address indexed from, uint256 indexed chainID, address indexed revertableAddress, // todo it was indexed address to, uint256 amount, address token ); event RevertBurnRequest(bytes32 indexed id, address indexed to); event ClientIdLog(bytes32 requestId, bytes32 indexed clientId); event MetaRevertRequest(bytes32 indexed id, address indexed to); event BurnCompleted( bytes32 indexed id, bytes32 indexed crossChainID, address indexed to, uint256 amount, uint256 bridgingFee, address token ); event RevertSynthesizeCompleted( bytes32 indexed id, address indexed to, uint256 amount, uint256 bridgingFee, address token ); event Paused(address account); event Unpaused(address account); event SetWhitelistToken(address token, bool activate); event SetTokenThreshold(address token, uint256 threshold); event SetMetaRouter(address metaRouter); event SetWrapper(address wrapper); event SetBalanceOf(address[] tokens); /// ** MODIFIERs ** modifier onlyBridge() { require(bridge == msg.sender, "Symb: caller is not the bridge"); _; } modifier whenNotPaused() { require(!paused, "Symb: paused"); _; } /// ** INITIALIZER ** /** * init */ function initialize( address _bridge, address _trustedForwarder, address _wrapper, address _whitelistedToken, IMetaRouter _metaRouter ) public virtual initializer { __RelayRecipient_init(_trustedForwarder); bridge = _bridge; wrapper = _wrapper; metaRouter = _metaRouter; if (_whitelistedToken != address(0)) { tokenWhitelist[_whitelistedToken] = true; } } /// ** EXTERNAL PURE functions ** /** * @notice Returns version */ function versionRecipient() external pure returns (string memory) { return "2.0.1"; } // ** EXTERNAL functions ** /** * @notice Sends synthesize request * @dev Token -> sToken on a second chain * @param _stableBridgingFee Bridging fee on another network * @param _token The address of the token that the user wants to synthesize * @param _amount Number of tokens to synthesize * @param _chain2address The address to which the user wants to receive the synth asset on another network * @param _receiveSide Synthesis address on another network * @param _oppositeBridge Bridge address on another network * @param _revertableAddress An address on another network that allows the user to revert a stuck request * @param _chainID Chain id of the network where synthesization will take place */ function synthesize( uint256 _stableBridgingFee, address _token, uint256 _amount, address _chain2address, address _receiveSide, address _oppositeBridge, address _revertableAddress, uint256 _chainID, bytes32 _clientID ) external whenNotPaused returns (bytes32) { require(tokenWhitelist[_token], "Symb: unauthorized token"); require(_amount >= tokenThreshold[_token], "Symb: amount under threshold"); TransferHelper.safeTransferFrom( _token, _msgSender(), address(this), _amount ); return sendSynthesizeRequest( _stableBridgingFee, _token, _amount, _chain2address, _receiveSide, _oppositeBridge, _revertableAddress, _chainID, _clientID ); } /** * @notice Sends metaSynthesizeOffchain request * @dev Token -> sToken on a second chain -> final token on a second chain * @param _metaSynthesizeTransaction metaSynthesize offchain transaction data */ function metaSynthesize( MetaRouteStructs.MetaSynthesizeTransaction memory _metaSynthesizeTransaction ) external whenNotPaused returns (bytes32) { require(tokenWhitelist[_metaSynthesizeTransaction.rtoken], "Symb: unauthorized token"); require(_metaSynthesizeTransaction.amount >= tokenThreshold[_metaSynthesizeTransaction.rtoken], "Symb: amount under threshold"); TransferHelper.safeTransferFrom( _metaSynthesizeTransaction.rtoken, _msgSender(), address(this), _metaSynthesizeTransaction.amount ); return sendMetaSynthesizeRequest(_metaSynthesizeTransaction); } /** * @notice Emergency unsynthesize * @dev Can called only by bridge after initiation on a second chain * @dev If a transaction arrives at the synthesization chain with an already completed revert synthesize contract will fail this transaction, * since the state was changed during the call to the desynthesis request * @param _stableBridgingFee Bridging fee * @param _externalID the synthesize transaction that was received from the event when it was originally called synthesize on the Portal contract */ function revertSynthesize(uint256 _stableBridgingFee, bytes32 _externalID) external onlyBridge whenNotPaused { TxState storage txState = requests[_externalID]; require( txState.state == RequestState.Sent, "Symb: state not open or tx does not exist" ); txState.state = RequestState.Reverted; // close balanceOf[txState.rtoken] = balanceOf[txState.rtoken] - txState.amount; TransferHelper.safeTransfer( txState.rtoken, txState.recipient, txState.amount - _stableBridgingFee ); TransferHelper.safeTransfer( txState.rtoken, bridge, _stableBridgingFee ); emit RevertSynthesizeCompleted( _externalID, txState.recipient, txState.amount - _stableBridgingFee, _stableBridgingFee, txState.rtoken ); } /** * @notice Revert synthesize * @dev After revertSynthesizeRequest in Synthesis this method is called * @param _stableBridgingFee Bridging fee * @param _externalID the burn transaction that was received from the event when it was originally called burn on the Synthesis contract * @param _token The address of the token to unsynthesize * @param _amount Number of tokens to unsynthesize * @param _to The address to receive tokens */ function unsynthesize( uint256 _stableBridgingFee, bytes32 _externalID, bytes32 _crossChainID, address _token, uint256 _amount, address _to ) external onlyBridge whenNotPaused { require( unsynthesizeStates[_externalID] == UnsynthesizeState.Default, "Symb: synthetic tokens emergencyUnburn" ); balanceOf[_token] = balanceOf[_token] - _amount; unsynthesizeStates[_externalID] = UnsynthesizeState.Unsynthesized; TransferHelper.safeTransfer(_token, _to, _amount - _stableBridgingFee); TransferHelper.safeTransfer(_token, bridge, _stableBridgingFee); emit BurnCompleted(_externalID, _crossChainID, _to, _amount - _stableBridgingFee, _stableBridgingFee, _token); } /** * @notice Unsynthesize and final call on second chain * @dev Token -> sToken on a first chain -> final token on a second chain * @param _stableBridgingFee Number of tokens to send to bridge (fee) * @param _externalID the metaBurn transaction that was received from the event when it was originally called metaBurn on the Synthesis contract * @param _to The address to receive tokens * @param _amount Number of tokens to unsynthesize * @param _rToken The address of the token to unsynthesize * @param _finalReceiveSide router for final call * @param _finalCalldata encoded call of a final function * @param _finalOffset offset to patch _amount to _finalCalldata */ function metaUnsynthesize( uint256 _stableBridgingFee, bytes32 _crossChainID, bytes32 _externalID, address _to, uint256 _amount, address _rToken, address _finalReceiveSide, bytes memory _finalCalldata, uint256 _finalOffset ) external onlyBridge whenNotPaused { require( unsynthesizeStates[_externalID] == UnsynthesizeState.Default, "Symb: synthetic tokens emergencyUnburn" ); balanceOf[_rToken] = balanceOf[_rToken] - _amount; unsynthesizeStates[_externalID] = UnsynthesizeState.Unsynthesized; TransferHelper.safeTransfer(_rToken, bridge, _stableBridgingFee); _amount = _amount - _stableBridgingFee; if (_finalCalldata.length == 0) { TransferHelper.safeTransfer(_rToken, _to, _amount); emit BurnCompleted(_externalID, _crossChainID, _to, _amount, _stableBridgingFee, _rToken); return; } // transfer ERC20 tokens to MetaRouter TransferHelper.safeTransfer( _rToken, address(metaRouter), _amount ); // metaRouter call metaRouter.externalCall(_rToken, _amount, _finalReceiveSide, _finalCalldata, _finalOffset, _to); emit BurnCompleted(_externalID, _crossChainID, _to, _amount, _stableBridgingFee, _rToken); } /** * @notice Revert burnSyntheticToken() operation * @dev Can called only by bridge after initiation on a second chain * @dev Further, this transaction also enters the relay network and is called on the other side under the method "revertBurn" * @param _stableBridgingFee Bridging fee on another network * @param _internalID the synthesize transaction that was received from the event when it was originally called burn on the Synthesize contract * @param _receiveSide Synthesis address on another network * @param _oppositeBridge Bridge address on another network * @param _chainId Chain id of the network */ function revertBurnRequest( uint256 _stableBridgingFee, bytes32 _internalID, address _receiveSide, address _oppositeBridge, uint256 _chainId, bytes32 _clientID ) external whenNotPaused { bytes32 externalID = keccak256(abi.encodePacked(_internalID, address(this), _msgSender(), block.chainid)); require( unsynthesizeStates[externalID] != UnsynthesizeState.Unsynthesized, "Symb: Real tokens already transfered" ); unsynthesizeStates[externalID] = UnsynthesizeState.RevertRequest; { bytes memory out = abi.encodeWithSelector( bytes4(keccak256(bytes("revertBurn(uint256,bytes32)"))), _stableBridgingFee, externalID ); IBridge(bridge).transmitRequestV2( out, _receiveSide, _oppositeBridge, _chainId ); } emit RevertBurnRequest(_internalID, _msgSender()); emit ClientIdLog(_internalID, _clientID); } function metaRevertRequest( MetaRouteStructs.MetaRevertTransaction memory _metaRevertTransaction ) external whenNotPaused { if (_metaRevertTransaction.swapCalldata.length != 0){ bytes32 externalID = keccak256(abi.encodePacked(_metaRevertTransaction.internalID, address(this), _msgSender(), block.chainid)); require( unsynthesizeStates[externalID] != UnsynthesizeState.Unsynthesized, "Symb: Real tokens already transfered" ); unsynthesizeStates[externalID] = UnsynthesizeState.RevertRequest; { bytes memory out = abi.encodeWithSelector( bytes4(keccak256(bytes("revertMetaBurn(uint256,bytes32,address,bytes,address,address,bytes)"))), _metaRevertTransaction.stableBridgingFee, externalID, _metaRevertTransaction.router, _metaRevertTransaction.swapCalldata, _metaRevertTransaction.sourceChainSynthesis, _metaRevertTransaction.burnToken, _metaRevertTransaction.burnCalldata ); IBridge(bridge).transmitRequestV2( out, _metaRevertTransaction.receiveSide, _metaRevertTransaction.managerChainBridge, _metaRevertTransaction.managerChainId ); emit RevertBurnRequest(_metaRevertTransaction.internalID, _msgSender()); emit ClientIdLog(_metaRevertTransaction.internalID, _metaRevertTransaction.clientID); } } else { if (_metaRevertTransaction.burnCalldata.length != 0){ bytes32 externalID = keccak256(abi.encodePacked(_metaRevertTransaction.internalID, address(this), _msgSender(), block.chainid)); require( unsynthesizeStates[externalID] != UnsynthesizeState.Unsynthesized, "Symb: Real tokens already transfered" ); unsynthesizeStates[externalID] = UnsynthesizeState.RevertRequest; bytes memory out = abi.encodeWithSelector( bytes4(keccak256(bytes("revertBurnAndBurn(uint256,bytes32,address,address,uint256,address)"))), _metaRevertTransaction.stableBridgingFee, externalID, address(this), _metaRevertTransaction.sourceChainBridge, block.chainid, _msgSender() ); IBridge(bridge).transmitRequestV2( out, _metaRevertTransaction.sourceChainSynthesis, _metaRevertTransaction.managerChainBridge, _metaRevertTransaction.managerChainId ); emit RevertBurnRequest(_metaRevertTransaction.internalID, _msgSender()); emit ClientIdLog(_metaRevertTransaction.internalID, _metaRevertTransaction.clientID); } else { bytes memory out = abi.encodeWithSelector( bytes4(keccak256(bytes("revertSynthesizeRequestByBridge(uint256,bytes32,address,address,uint256,address,bytes32)"))), _metaRevertTransaction.stableBridgingFee, _metaRevertTransaction.internalID, _metaRevertTransaction.receiveSide, _metaRevertTransaction.sourceChainBridge, block.chainid, _msgSender(), _metaRevertTransaction.clientID ); IBridge(bridge).transmitRequestV2( out, _metaRevertTransaction.sourceChainSynthesis, _metaRevertTransaction.managerChainBridge, _metaRevertTransaction.managerChainId ); } } emit MetaRevertRequest(_metaRevertTransaction.internalID, _msgSender()); } // ** ONLYOWNER functions ** /** * @notice Set paused flag to true */ function pause() external onlyOwner { paused = true; emit Paused(_msgSender()); } /** * @notice Set paused flag to false */ function unpause() external onlyOwner { paused = false; emit Unpaused(_msgSender()); } /** * @notice Sets token to tokenWhitelist * @param _token Address of token to add to whitelist * @param _activate true - add to whitelist, false - remove from whitelist */ function setWhitelistToken(address _token, bool _activate) external onlyOwner { tokenWhitelist[_token] = _activate; emit SetWhitelistToken(_token, _activate); } /** * @notice Sets minimal price for token * @param _token Address of token to set threshold * @param _threshold threshold to set */ function setTokenThreshold(address _token, uint256 _threshold) external onlyOwner { tokenThreshold[_token] = _threshold; emit SetTokenThreshold(_token, _threshold); } function setWrapper(address _wrapper) external onlyOwner { wrapper = _wrapper; emit SetWrapper(_wrapper); } function setBalanceOf(address[] memory _tokens) external onlyOwner { for (uint256 i = 0; i < _tokens.length; i++) { require(tokenWhitelist[_tokens[i]], "Symb: unauthorized token"); balanceOf[_tokens[i]] = IERC20(_tokens[i]).balanceOf(address(this)); } emit SetBalanceOf(_tokens); } /** * @notice Sets MetaRouter address * @param _metaRouter Address of metaRouter */ function setMetaRouter(IMetaRouter _metaRouter) external onlyOwner { require(address(_metaRouter) != address(0), "Symb: metaRouter cannot be zero address"); metaRouter = _metaRouter; emit SetMetaRouter(address(_metaRouter)); } /// ** INTERNAL functions ** /** * @dev Sends synthesize request * @dev Internal function used in synthesize, synthesizeNative, synthesizeWithPermit */ function sendSynthesizeRequest( uint256 _stableBridgingFee, address _token, uint256 _amount, address _chain2address, address _receiveSide, address _oppositeBridge, address _revertableAddress, uint256 _chainID, bytes32 _clientID ) internal returns (bytes32 internalID) { balanceOf[_token] = balanceOf[_token] + _amount; if (_revertableAddress == address(0)) { _revertableAddress = _chain2address; } internalID = keccak256(abi.encodePacked(this, requestCount, block.chainid)); { bytes32 externalID = keccak256(abi.encodePacked(internalID, _receiveSide, _revertableAddress, _chainID)); { bytes memory out = abi.encodeWithSelector( bytes4( keccak256( bytes( "mintSyntheticToken(uint256,bytes32,bytes32,address,uint256,uint256,address)" ) ) ), _stableBridgingFee, externalID, internalID, _token, block.chainid, _amount, _chain2address ); requests[externalID] = TxState({ recipient : _msgSender(), chain2address : _chain2address, rtoken : _token, amount : _amount, state : RequestState.Sent }); requestCount++; IBridge(bridge).transmitRequestV2( out, _receiveSide, _oppositeBridge, _chainID ); } } emit SynthesizeRequest( internalID, _msgSender(), _chainID, _revertableAddress, _chain2address, _amount, _token ); emit ClientIdLog(internalID, _clientID); } /** * @dev Sends metaSynthesizeOffchain request * @dev Internal function used in metaSynthesizeOffchain */ function sendMetaSynthesizeRequest( MetaRouteStructs.MetaSynthesizeTransaction memory _metaSynthesizeTransaction ) internal returns (bytes32 internalID) { balanceOf[_metaSynthesizeTransaction.rtoken] = balanceOf[_metaSynthesizeTransaction.rtoken] + _metaSynthesizeTransaction.amount; if (_metaSynthesizeTransaction.revertableAddress == address(0)) { _metaSynthesizeTransaction.revertableAddress = _metaSynthesizeTransaction.chain2address; } internalID = keccak256(abi.encodePacked(this, requestCount, block.chainid)); bytes32 externalID = keccak256( abi.encodePacked(internalID, _metaSynthesizeTransaction.receiveSide, _metaSynthesizeTransaction.revertableAddress, _metaSynthesizeTransaction.chainID) ); MetaRouteStructs.MetaMintTransaction memory _metaMintTransaction = MetaRouteStructs.MetaMintTransaction( _metaSynthesizeTransaction.stableBridgingFee, _metaSynthesizeTransaction.amount, internalID, externalID, _metaSynthesizeTransaction.rtoken, block.chainid, _metaSynthesizeTransaction.chain2address, _metaSynthesizeTransaction.swapTokens, _metaSynthesizeTransaction.secondDexRouter, _metaSynthesizeTransaction.secondSwapCalldata, _metaSynthesizeTransaction.finalReceiveSide, _metaSynthesizeTransaction.finalCalldata, _metaSynthesizeTransaction.finalOffset ); { bytes memory out = abi.encodeWithSignature( "metaMintSyntheticToken((uint256,uint256,bytes32,bytes32,address,uint256,address,address[]," "address,bytes,address,bytes,uint256))", _metaMintTransaction ); requests[externalID] = TxState({ recipient : _metaSynthesizeTransaction.syntCaller, chain2address : _metaSynthesizeTransaction.chain2address, rtoken : _metaSynthesizeTransaction.rtoken, amount : _metaSynthesizeTransaction.amount, state : RequestState.Sent }); requestCount++; IBridge(bridge).transmitRequestV2( out, _metaSynthesizeTransaction.receiveSide, _metaSynthesizeTransaction.oppositeBridge, _metaSynthesizeTransaction.chainID ); } emit SynthesizeRequest( internalID, _metaSynthesizeTransaction.syntCaller, _metaSynthesizeTransaction.chainID, _metaSynthesizeTransaction.revertableAddress, _metaSynthesizeTransaction.chain2address, _metaSynthesizeTransaction.amount, _metaSynthesizeTransaction.rtoken ); emit ClientIdLog(internalID, _metaSynthesizeTransaction.clientID); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) 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 onlyInitializing { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "../../utils/AddressUpgradeable.sol"; /** * @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. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ 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() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) 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 onlyInitializing { __Context_init_unchained(); } function __Context_init_unchained() internal onlyInitializing { } 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 // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) 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 IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; import "../types/BtcSerial.sol"; interface IBridge { function transmitRequestV2( bytes memory _callData, address _receiveSide, address _oppositeBridge, uint256 _chainId ) external; function transmitRequestBTC( address _from, bytes calldata _to, uint256 _amount, BtcSerial _burnSerial ) external; function receiveRequestV2( bytes memory _callData, address _receiveSide ) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; interface IWrapper { function deposit() external payable; function withdraw(uint256 amount) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; import "../MetaRouteStructs.sol"; interface IMetaRouter { function metaRoute( MetaRouteStructs.MetaRouteTransaction calldata _metarouteTransaction ) external payable; function externalCall( address _token, uint256 _amount, address _receiveSide, bytes calldata _calldata, uint256 _offset, address _revertableAddress ) external; function returnSwap( address _token, uint256 _amount, address _router, bytes calldata _swapCalldata, address _burnToken, address _synthesis, bytes calldata _burnCalldata ) external; function metaMintSwap( MetaRouteStructs.MetaMintTransaction calldata _metaMintTransaction ) external; function metaMintCallBTC( address _token, uint256 _amount, address _receiveSide, bytes calldata _calldata, uint256 _offset, address _to ) external; function sendTransitToken(address _token, address _to, uint256 _amount) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; import "../types/BtcSerial.sol"; library MetaRouteStructs { struct MetaBurnTransaction { uint256 stableBridgingFee; uint256 amount; bytes32 crossChainID; address syntCaller; address finalReceiveSide; address sToken; bytes finalCallData; uint256 finalOffset; address chain2address; address receiveSide; address oppositeBridge; address revertableAddress; uint256 chainID; bytes32 clientID; } struct MetaMintTransaction { uint256 stableBridgingFee; uint256 amount; bytes32 crossChainID; bytes32 externalID; address tokenReal; uint256 chainID; address to; address[] swapTokens; address secondDexRouter; bytes secondSwapCalldata; address finalReceiveSide; bytes finalCalldata; uint256 finalOffset; } struct MetaMintTransactionBTC { uint256 stableBridgingFee; uint256 amount; BtcSerial serial; bytes32 crossChainID; bytes32 externalID; address tokenReal; uint256 chainID; address to; address receiveSide; bytes receiveSideCalldata; uint256 receiveSideOffset; } struct MetaRouteTransaction { bytes firstSwapCalldata; bytes secondSwapCalldata; address[] approvedTokens; address firstDexRouter; address secondDexRouter; uint256 amount; bool nativeIn; address relayRecipient; bytes otherSideCalldata; } struct MetaSynthesizeTransaction { uint256 stableBridgingFee; uint256 amount; address rtoken; address chain2address; address receiveSide; address oppositeBridge; address syntCaller; uint256 chainID; address[] swapTokens; address secondDexRouter; bytes secondSwapCalldata; address finalReceiveSide; bytes finalCalldata; uint256 finalOffset; address revertableAddress; bytes32 clientID; } struct MetaRevertTransaction { uint256 stableBridgingFee; bytes32 internalID; address receiveSide; address managerChainBridge; address sourceChainBridge; uint256 managerChainId; uint256 sourceChainId; address router; bytes swapCalldata; address sourceChainSynthesis; address burnToken; bytes burnCalldata; bytes32 clientID; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.19; type BtcSerial is uint64; using {inc, equal as ==} for BtcSerial global; function inc(BtcSerial a) pure returns (BtcSerial) { return BtcSerial.wrap(BtcSerial.unwrap(a) + 1); } function equal(BtcSerial a, BtcSerial b) pure returns (bool) { return BtcSerial.unwrap(a) == BtcSerial.unwrap(b); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; abstract contract RelayRecipientUpgradeable is OwnableUpgradeable { address private _trustedForwarder; function __RelayRecipient_init(address trustedForwarder) internal onlyInitializing { __Ownable_init(); _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual override returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return super._msgSender(); } } function _msgData() internal view virtual override returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return super._msgData(); } } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"crossChainID","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgingFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"BurnCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"clientId","type":"bytes32"}],"name":"ClientIdLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"MetaRevertRequest","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"RevertBurnRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bridgingFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"RevertSynthesizeCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"SetBalanceOf","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"metaRouter","type":"address"}],"name":"SetMetaRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"SetTokenThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"activate","type":"bool"}],"name":"SetWhitelistToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wrapper","type":"address"}],"name":"SetWrapper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"chainID","type":"uint256"},{"indexed":true,"internalType":"address","name":"revertableAddress","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"SynthesizeRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"address","name":"_trustedForwarder","type":"address"},{"internalType":"address","name":"_wrapper","type":"address"},{"internalType":"address","name":"_whitelistedToken","type":"address"},{"internalType":"contract IMetaRouter","name":"_metaRouter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stableBridgingFee","type":"uint256"},{"internalType":"bytes32","name":"internalID","type":"bytes32"},{"internalType":"address","name":"receiveSide","type":"address"},{"internalType":"address","name":"managerChainBridge","type":"address"},{"internalType":"address","name":"sourceChainBridge","type":"address"},{"internalType":"uint256","name":"managerChainId","type":"uint256"},{"internalType":"uint256","name":"sourceChainId","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"bytes","name":"swapCalldata","type":"bytes"},{"internalType":"address","name":"sourceChainSynthesis","type":"address"},{"internalType":"address","name":"burnToken","type":"address"},{"internalType":"bytes","name":"burnCalldata","type":"bytes"},{"internalType":"bytes32","name":"clientID","type":"bytes32"}],"internalType":"struct MetaRouteStructs.MetaRevertTransaction","name":"_metaRevertTransaction","type":"tuple"}],"name":"metaRevertRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metaRouter","outputs":[{"internalType":"contract IMetaRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stableBridgingFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"rtoken","type":"address"},{"internalType":"address","name":"chain2address","type":"address"},{"internalType":"address","name":"receiveSide","type":"address"},{"internalType":"address","name":"oppositeBridge","type":"address"},{"internalType":"address","name":"syntCaller","type":"address"},{"internalType":"uint256","name":"chainID","type":"uint256"},{"internalType":"address[]","name":"swapTokens","type":"address[]"},{"internalType":"address","name":"secondDexRouter","type":"address"},{"internalType":"bytes","name":"secondSwapCalldata","type":"bytes"},{"internalType":"address","name":"finalReceiveSide","type":"address"},{"internalType":"bytes","name":"finalCalldata","type":"bytes"},{"internalType":"uint256","name":"finalOffset","type":"uint256"},{"internalType":"address","name":"revertableAddress","type":"address"},{"internalType":"bytes32","name":"clientID","type":"bytes32"}],"internalType":"struct MetaRouteStructs.MetaSynthesizeTransaction","name":"_metaSynthesizeTransaction","type":"tuple"}],"name":"metaSynthesize","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stableBridgingFee","type":"uint256"},{"internalType":"bytes32","name":"_crossChainID","type":"bytes32"},{"internalType":"bytes32","name":"_externalID","type":"bytes32"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_rToken","type":"address"},{"internalType":"address","name":"_finalReceiveSide","type":"address"},{"internalType":"bytes","name":"_finalCalldata","type":"bytes"},{"internalType":"uint256","name":"_finalOffset","type":"uint256"}],"name":"metaUnsynthesize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"requests","outputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"chain2address","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"rtoken","type":"address"},{"internalType":"enum Portal.RequestState","name":"state","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stableBridgingFee","type":"uint256"},{"internalType":"bytes32","name":"_internalID","type":"bytes32"},{"internalType":"address","name":"_receiveSide","type":"address"},{"internalType":"address","name":"_oppositeBridge","type":"address"},{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"bytes32","name":"_clientID","type":"bytes32"}],"name":"revertBurnRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stableBridgingFee","type":"uint256"},{"internalType":"bytes32","name":"_externalID","type":"bytes32"}],"name":"revertSynthesize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"setBalanceOf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMetaRouter","name":"_metaRouter","type":"address"}],"name":"setMetaRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setTokenThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"bool","name":"_activate","type":"bool"}],"name":"setWhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wrapper","type":"address"}],"name":"setWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stableBridgingFee","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_chain2address","type":"address"},{"internalType":"address","name":"_receiveSide","type":"address"},{"internalType":"address","name":"_oppositeBridge","type":"address"},{"internalType":"address","name":"_revertableAddress","type":"address"},{"internalType":"uint256","name":"_chainID","type":"uint256"},{"internalType":"bytes32","name":"_clientID","type":"bytes32"}],"name":"synthesize","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stableBridgingFee","type":"uint256"},{"internalType":"bytes32","name":"_externalID","type":"bytes32"},{"internalType":"bytes32","name":"_crossChainID","type":"bytes32"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"unsynthesize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"unsynthesizeStates","outputs":[{"internalType":"enum Portal.UnsynthesizeState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"versionRecipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"wrapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60808060405234610016576131e6908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b6000803560e01c806308759e9b146123e25780631459457a146122035780631ebe53ef146120cb5780633f4ba83a1461206c578063486ff0cd1461200a5780634a91366414611eb1578063572b6c0514611e7d5780635badbe4c14611e5f5780635c975abb14611e3c5780636877527814611e0457806370a0823114611dcc578063715018a614611d55578063753d756314611d185780637c374f9914611c895780638456cb5914611c1c5780638bb3980214611b8a5780638da5cb5b14611b635780639d86698514611af3578063ac210cc714611acc578063b1659a3c1461168f578063c2167d931461160e578063c23a4c881461157c578063c42a2894146113ab578063ce654c1714610c31578063dbec15bb14610c0a578063e78cea9214610be3578063eadd5c3414610af1578063f2fde38b14610a3a578063fab9289414610a045763fce633c21461016757600080fd5b34610a01576003196020813601126105ee5767ffffffffffffffff600435116105ee576101a09060043536030112610a01576040516101a581612726565b6004356004013581526024600435013560208201526101c86044600435016126a2565b60408201526101db6064600435016126a2565b60608201526101ee6084600435016126a2565b608082015260043560a481013560a083015260c481013560c08301526102169060e4016126a2565b60e0820152610104600435013567ffffffffffffffff81116109fd57610243906004369181350101612866565b610100820152610258610124600435016126a2565b61012082015261026d610144600435016126a2565b610140820152610164600435013567ffffffffffffffff81116109fd5761029b906004369181350101612866565b61016082015261018460043501356101808201526102be60ff606954161561294d565b6101008101515115610601578160208201516103226103306102de61316d565b926040519283916020830195469130908892606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b03601f198101835282612798565b519020808252606b602052610358600160ff6040852054166103518161282a565b1415612fb6565b808252606b60205260408220600260ff198254161790556104c57fffffffff0000000000000000000000000000000000000000000000000000000060436040516103a18161275f565b8181527f6573290000000000000000000000000000000000000000000000000000000000606060208301927f7265766572744d6574614275726e2875696e743235362c627974657333322c6184527f6464726573732c62797465732c616464726573732c616464726573732c6279746040820152015220166103228551936001600160a01b0360e088015116906101008801519161048b6001600160a01b036101208b015116936001600160a01b036101408c015116926101608c0151946040519a8b9960208b015260248a01526044890152606488015260e060848801526101048701906126b6565b9260a486015260c48501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8483030160e48501526126b6565b6001600160a01b0360675416906001600160a01b03604085015116916001600160a01b036060860151169060a086015193813b156105fd5785809461052060405197889687958694633675e4e160e11b865260048601613026565b03925af180156105f2576105da575b5050806020809201517f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f5836001600160a01b0361056a61316d565b1660405190847f40590cc12db0488520ce425059f83f8caed91bdf98de5ff829dc57c63843161b8980a3610180850151938152a25b01516001600160a01b036105b161316d565b16907fbd03c66ec5bd3d01fbf22bc794f68ac88b693023b438724019205a4b42aefb208380a380f35b6105e3906126f6565b6105ee57813861052f565b5080fd5b6040513d84823e3d90fd5b8580fd5b61016081015151156108765760208101516103226106206102de61316d565b519020808352606b602052610641600160ff6040862054166103518161282a565b808352606b60205260408320600260ff198254161790556001600160a01b037fffffffff00000000000000000000000000000000000000000000000000000000604260405161068f8161275f565b8181527f7329000000000000000000000000000000000000000000000000000000000000606060208301927f7265766572744275726e416e644275726e2875696e743235362c62797465733384527f322c616464726573732c616464726573732c75696e743235362c61646472657360408201520152201691835190826080860151169061071b61316d565b926040519560208701526024860152604485015230606485015260848401524660a48401521660c482015260c48152610100810181811067ffffffffffffffff821117610860578391816040526001600160a01b0360675416906001600160a01b0361012086015116916001600160a01b036060870151169260a0870151823b1561085c5760ff1986946107c489979388948896633675e4e160e11b8852846101048101613026565b0301925af180156105f257610848575b5050806020809201517f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f5836001600160a01b0361080f61316d565b1660405190847f40590cc12db0488520ce425059f83f8caed91bdf98de5ff829dc57c63843161b8980a3610180850151938152a261059f565b610851906126f6565b6105ee5781386107d4565b8680fd5b634e487b7160e01b600052604160045260246000fd5b817fffffffff0000000000000000000000000000000000000000000000000000000060586040516108a68161275f565b8181527f75696e743235362c616464726573732c62797465733332290000000000000000606060208301927f72657665727453796e74686573697a655265717565737442794272696467652884527f75696e743235362c627974657333322c616464726573732c616464726573732c6040820152015220168251906020840151916001600160a01b03809381604088015116826080890151169061094861316d565b926101808a01519560405197602089015260248801526044870152606486015260848501524660a48501521660c483015260e482015260e4815261098b8161277b565b81606754168261012086015116926060860151169060a086015193813b156105fd578580946109d060405197889687958694633675e4e160e11b865260048601613026565b03925af180156105f2576109e9575b505060209061059f565b6109f2906126f6565b6105ee5781386109df565b8280fd5b80fd5b5034610a01576020600319360112610a015760ff60406020926004358152606b845220541660405190610a368161282a565b8152f35b5034610a01576020600319360112610a0157610a54612634565b6001600160a01b03610a74816033541682610a6d61316d565b16146128ad565b811615610a8757610a84906128f8565b80f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b5034610a01576020600319360112610a0157610b0b612634565b6001600160a01b0390610b25826033541683610a6d61316d565b168015610b79576020817fd5c54ab1d37bfef4dd2253d9d73c292e46f5bd8a67ca5920aab4c2e1993178e79273ffffffffffffffffffffffffffffffffffffffff19606f541617606f55604051908152a180f35b608460405162461bcd60e51b815260206004820152602760248201527f53796d623a206d657461526f757465722063616e6e6f74206265207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152fd5b5034610a015780600319360112610a015760206001600160a01b0360675416604051908152f35b5034610a015780600319360112610a015760206001600160a01b03606f5416604051908152f35b5034610a015760031990602082360112610a015767ffffffffffffffff60043511610a0157610200809260043536030112610a015760405191820182811067ffffffffffffffff82111761086057604052600435600401358252602460043501356020830152610ca56044600435016126a2565b6040830152610cb86064600435016126a2565b6060830152610ccb6084600435016126a2565b6080830152610cde60a4600435016126a2565b60a0830152610cf160c4600435016126a2565b60c083015260e4600435013560e083015267ffffffffffffffff610104600435013511610a0157610d2d366004803561010481013501016127bb565b610100830152610d42610124600435016126a2565b61012083015267ffffffffffffffff610144600435013511610a0157610d7336600480356101448101350101612866565b610140830152610d88610164600435016126a2565b61016083015267ffffffffffffffff610184600435013511610a0157610db936600480356101848101350101612866565b6101808301526101a460043501356101a0830152610ddc6101c4600435016126a2565b6101c08301526101e460043501356101e0830152610dff60ff606954161561294d565b6001600160a01b036040830151168152606e602052610e2460ff604083205416612998565b610e4d60208301516001600160a01b036040850151168352606d602052604083205411156129e3565b610e746001600160a01b03604084015116610e6661316d565b906020850151913091612a76565b6001600160a01b036040830151168152606c602052610e9c60408220546020840151906130ef565b6001600160a01b036040840151168252606c60205260408220556001600160a01b036101c08301511615611392575b6068546040513060601b6bffffffffffffffffffffffff191660208201526034810191909152466054820152610f048160748101610322565b60208151910120906001600160a01b036080840151166001600160a01b036101c085015116610f7560e0860151916103226040519384926020840196898892606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b51902061122d8451916020860151866001600160a01b036040820151166001600160a01b036060830151166101008301516001600160a01b036101208501511690610140850151926001600160a01b0361016087015116946101a0610180880151970151976040519b610fe78d612726565b8c5260208c01528c60408c01528860608c015260808b01524660a08b015260c08a015260e089015261010088015261012087015261014086015261016085015261018084015261116e60405180947fc29a91bc00000000000000000000000000000000000000000000000000000000602083015260206024830152805160448301526020810151606483015260408101516084830152606081015160a48301526001600160a01b0360808201511660c483015260a081015160e48301526001600160a01b0360c0820151166101048301526101806111576110da60e08401516101a06101248701526101e48601906130b2565b6001600160a01b036101008501511661014486015261112b610120850151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc9283888303016101648901526126b6565b906001600160a01b036101408601511661018487015261016085015190868303016101a48701526126b6565b9101516101c483015203601f198101855284612798565b6001600160a01b0360c087015116906001600160a01b036060880151166001600160a01b0360038160408b0151169460208b0151604051916111af8361270a565b82526020820194855260408201908152606082019687526080820195600187528a52606a6020528360408b209251169473ffffffffffffffffffffffffffffffffffffffff199586845416178355846001840191511686825416179055516002820155019351169083541617825551906112288261282a565b612bd1565b61123860685461305b565b6068556001600160a01b03606754166001600160a01b03608086015116906001600160a01b0360a0870151169160e087015193823b156105fd5790858094939261129860405197889687958694633675e4e160e11b865260048601613026565b03925af180156105f25761137e575b6020836101e0866001600160a01b0360c08201511660e08201516001600160a01b036101c084015116917f31325fe0a1a2e6a5b1e41572156ba5b4e94f0fae7e7f63ec21e9b5ce1e4b3eab6001600160a01b0360608601511688860151906113486001600160a01b036040890151166040519384938c859293606092919594608085019685526001600160a01b038093166020860152604085015216910152565b0390a401517f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f583604051848152a2604051908152f35b61138882916126f6565b610a0157806112a7565b6001600160a01b036060830151166101c0830152610ecb565b5034610a01576040600319360112610a01576004356024356001600160a01b036113da81606754163314612b86565b6113e960ff606954161561294d565b818452606a6020526040842092600384018054600160ff8260a01c1661140e8161282a565b0361151257836114e184827fefcdf9ea4e65571d2ce9c030c46954e950662df8a7d8bd039fc4417e37b2f88c9785740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff61150c981617885516998a8c52606c60205260408c20549a61149b600283019c8d5490612c20565b908d52606c60205260408d20556114c5828854168c6114bf86868654169254612c20565b91612c43565b6114d88383895416846067541690612c43565b54169854612c20565b925416604051938493849160409194936001600160a01b039160608501968552602085015216910152565b0390a380f35b608460405162461bcd60e51b815260206004820152602960248201527f53796d623a207374617465206e6f74206f70656e206f7220747820646f65732060448201527f6e6f7420657869737400000000000000000000000000000000000000000000006064820152fd5b5034610a0157610120600319360112610a015761159761261e565b61159f612660565b906115a861268c565b9160e4359267ffffffffffffffff841161160a576115cd610a84943690600401612866565b916115e46001600160a01b03606754163314612b86565b6115f360ff606954161561294d565b610104359360843590604435602435600435612dbf565b8480fd5b5034610a01576020600319360112610a01577fce42f6a6b3d7a9e5602623686f752d848285a87b22f0168a666c9c6064d2d230602061164b612634565b6001600160a01b0390611665826033541683610a6d61316d565b168073ffffffffffffffffffffffffffffffffffffffff196066541617606655604051908152a180f35b5034610a0157610120600319360112610a01576116aa61264a565b6116b261261e565b906116bb612676565b916116c4612660565b926116cd61268c565b906116dd60ff606954161561294d565b6001600160a01b0384168652606e6020526116fe60ff604088205416612998565b6001600160a01b0384168652606d602052611721604087205460443510156129e3565b61173861172c61316d565b60443590309087612a76565b6001600160a01b03828186168852606c60205261175b60443560408a20546130ef565b8287168952606c60205260408920551615611ac4575b856068546040516117af81610322602082019446903087916bffffffffffffffffffffffff196054949260601b168352601483015260348201520190565b519020956040516117fa8161032260e43588888d6020860192606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b60208151910120906119a3877fffffffff00000000000000000000000000000000000000000000000000000000604b6040516118358161275f565b8181527f35362c6164647265737329000000000000000000000000000000000000000000606060208301927f6d696e7453796e746865746963546f6b656e2875696e743235362c627974657384527f33322c627974657333322c616464726573732c75696e743235362c75696e74326040820152015220169360405194602086015260043560248601528060448601528a60648601526001600160a01b03821660848601524660a486015260443560c48601526001600160a01b0389168060e487015260e486526119058661277b565b6001600160a01b03600361191761316d565b82604051916119258361270a565b168152602081019384526040810160443581528360608301971687526080820195600187528b52606a6020528360408c209251169473ffffffffffffffffffffffffffffffffffffffff199586845416178355846001840191511686825416179055516002820155019351169083541617825551906112288261282a565b6119ae60685461305b565b6068556001600160a01b036067541690813b15611ac057836119eb9560405196879586948593633675e4e160e11b855260e4359260048601613026565b03925af18015611ab557611aa1575b50602094507f31325fe0a1a2e6a5b1e41572156ba5b4e94f0fae7e7f63ec21e9b5ce1e4b3eab6001600160a01b0380611a3161316d565b604080518981526001600160a01b0397881660208201526044359181019190915296909516606087015292169360e435939290921691608090a46040518181527f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f5836101043592a2604051908152f35b611aab86916126f6565b61160a57846119fa565b6040513d88823e3d90fd5b8380fd5b829150611771565b5034610a015780600319360112610a015760206001600160a01b0360665416604051908152f35b5034610a01576020600319360112610a0157604060a0916004358152606a602052206001600160a01b039081815416918060018301541691600360028201549101549060ff82871c169360405195865260208601526040850152166060830152611b5c8161282a565b6080820152f35b5034610a015780600319360112610a015760206001600160a01b0360335416604051908152f35b5034610a01576040600319360112610a01577fa6742efd4f410d6fd9688a6cf6a15b6d51121097a263056a3576baaacdc4a9ae611bc5612634565b602435906001600160a01b03611be2816033541682610a6d61316d565b81168452606d602052816040852055611c1660405192839283602090939291936001600160a01b0360408201951681520152565b0390a180f35b5034610a015780600319360112610a01577f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860206001600160a01b03611c69816033541682610a6d61316d565b600160ff196069541617606955611c7e61316d565b60405191168152a180f35b5034610a01576040600319360112610a0157611ca3612634565b602435908115158092036109fd577f0a4552f1105808db6a44587c9ef0a7c4064bf620b9d843b514ad7365bd52239a916040916001600160a01b0390611cf0826033541683610a6d61316d565b1690818552606e60205282852060ff1981541660ff831617905582519182526020820152a180f35b5034610a01576020600319360112610a015760ff60406020926001600160a01b03611d41612634565b168152606e84522054166040519015158152f35b5034610a015780600319360112610a0157600060335473ffffffffffffffffffffffffffffffffffffffff196001600160a01b0391611da183821693611d9961316d565b1684146128ad565b166033557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610a01576020600319360112610a015760406020916001600160a01b03611df3612634565b168152606c83522054604051908152f35b5034610a01576020600319360112610a015760406020916001600160a01b03611e2b612634565b168152606d83522054604051908152f35b5034610a015780600319360112610a0157602060ff606954166040519015158152f35b5034610a015780600319360112610a01576020606854604051908152f35b5034610a01576020600319360112610a01576020611e99612634565b6001600160a01b038060655416911614604051908152f35b5034610a01576020806003193601126105ee5760043567ffffffffffffffff81116109fd57611ee49036906004016127bb565b906001600160a01b0390611eff826033541683610a6d61316d565b835b8351811015611fd3578083611f1860249387613088565b51168652606e8352611f3060ff604088205416612998565b8284611f3c8388613088565b5116604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa8015611ab5578690611fa4575b611f9f925084611f8d8388613088565b51168752606c8452604087205561305b565b611f01565b508282813d8311611fcc575b611fba8183612798565b810103126105fd57611f9f9151611f7d565b503d611fb0565b60405182815285907f5a980ed3bb4dd09162988674fd35c7002fa70e44dd03d2942ac38c074b1a638e9080611c16818701896130b2565b5034610a015780600319360112610a015761206860405161202a81612743565b600581527f322e302e3100000000000000000000000000000000000000000000000000000060208201526040519182916020835260208301906126b6565b0390f35b5034610a015780600319360112610a01577f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60206001600160a01b036120b9816033541682610a6d61316d565b60ff1960695416606955611c7e61316d565b5034610a015760c0600319360112610a01576004356024356120eb61261e565b907faeef64b7687b985665b6620c7fa271b6f051a3fbe2bfc366fb9c964602eb6d26608435612118612660565b6121fd6121ce876001600160a01b039461213786606754163314612b86565b61214660ff606954161561294d565b878b52606b60205261216860ff60408d2054166121628161282a565b15612d4e565b8a612182826040898d1693848152606c6020522054612c20565b908c52606c60205260408c2055878b52606b60205260408b20600160ff198254161790556121ba6121b38383612c20565b868b612c43565b6121c98287606754168b612c43565b612c20565b95604051938493169760443597849160409194936001600160a01b039160608501968552602085015216910152565b0390a480f35b5034610a015760a0600319360112610a015761221d612634565b61222561264a565b61222d612603565b9061223661261e565b9061223f612676565b9385549460ff8660081c16806000146123d857303b155b1561236e57159586612340575b5061228f60ff885460081c16612278816130fc565b612281816130fc565b61228a816130fc565b6130fc565b61229f61229a61316d565b6128f8565b6001600160a01b0380958180948173ffffffffffffffffffffffffffffffffffffffff19971687606554161760655516856067541617606755168360665416176066551690606f541617606f551680612324575b506122fb5780f35b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff815416815580f35b8252606e60205260408220600160ff19825416179055386122f3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117875538612263565b608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff871615612256565b5034610a015760c0600319360112610a01576024356123ff612603565b61240761261e565b61241660ff606954161561294d565b61241e61316d565b91846040519360209461246a81610322888201944690308c8892606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b519020808252606b855261248a600160ff6040852054166103518161282a565b808252606b855260408220600260ff198254161790557f7265766572744275726e2875696e743235362c62797465733332290000000000856040516124ce81612743565b601b81520152604051907ff70519ae000000000000000000000000000000000000000000000000000000008683015260043560248301526044820152604481526125178161275f565b6001600160a01b0393846067541690813b15611ac057836125539560405196879586948593633675e4e160e11b85526084359260048601613026565b03925af180156125f8576125c3575b50907f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f59161258e61316d565b169260405193817f40590cc12db0488520ce425059f83f8caed91bdf98de5ff829dc57c63843161b8780a3835260a43592a280f35b936125f07f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f59392956126f6565b939091612562565b6040513d87823e3d90fd5b604435906001600160a01b038216820361261957565b600080fd5b606435906001600160a01b038216820361261957565b600435906001600160a01b038216820361261957565b602435906001600160a01b038216820361261957565b60a435906001600160a01b038216820361261957565b608435906001600160a01b038216820361261957565b60c435906001600160a01b038216820361261957565b35906001600160a01b038216820361261957565b919082519283825260005b8481106126e2575050601f19601f8460006020809697860101520116010190565b6020818301810151848301820152016126c1565b67ffffffffffffffff811161086057604052565b60a0810190811067ffffffffffffffff82111761086057604052565b6101a0810190811067ffffffffffffffff82111761086057604052565b6040810190811067ffffffffffffffff82111761086057604052565b6080810190811067ffffffffffffffff82111761086057604052565b610120810190811067ffffffffffffffff82111761086057604052565b90601f601f19910116810190811067ffffffffffffffff82111761086057604052565b9080601f830112156126195781359067ffffffffffffffff8211610860578160051b604051936020936127f085840187612798565b85528380860192820101928311612619578301905b828210612813575050505090565b83809161281f846126a2565b815201910190612805565b6003111561283457565b634e487b7160e01b600052602160045260246000fd5b67ffffffffffffffff811161086057601f01601f191660200190565b81601f820112156126195780359061287d8261284a565b9261288b6040519485612798565b8284526020838301011161261957816000926020809301838601378301015290565b156128b457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603354906001600160a01b03809116918273ffffffffffffffffffffffffffffffffffffffff19821617603355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b1561295457565b606460405162461bcd60e51b815260206004820152600c60248201527f53796d623a2070617573656400000000000000000000000000000000000000006044820152fd5b1561299f57565b606460405162461bcd60e51b815260206004820152601860248201527f53796d623a20756e617574686f72697a656420746f6b656e00000000000000006044820152fd5b156129ea57565b606460405162461bcd60e51b815260206004820152601c60248201527f53796d623a20616d6f756e7420756e646572207468726573686f6c64000000006044820152fd5b3d15612a59573d90612a3f8261284a565b91612a4d6040519384612798565b82523d6000602084013e565b606090565b90816020910312612619575180151581036126195790565b9091600080949381946040519160208301947f23b872dd0000000000000000000000000000000000000000000000000000000086526001600160a01b038092166024850152166044830152606482015260648152612ad38161270a565b51925af1612adf612a2e565b81612b57575b5015612aed57565b608460405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152fd5b8051801592508215612b6c575b505038612ae5565b612b7f9250602080918301019101612a5e565b3880612b64565b15612b8d57565b606460405162461bcd60e51b815260206004820152601e60248201527f53796d623a2063616c6c6572206973206e6f74207468652062726964676500006044820152fd5b90612bdb8161282a565b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000083549260a01b169116179055565b91908203918211612c2d57565b634e487b7160e01b600052601160045260246000fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082019081526001600160a01b03909316602482015260448101939093526000928392908390612c9b8160648101610322565b51925af1612ca7612a2e565b81612d1f575b5015612cb557565b608460405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152fd5b8051801592508215612d34575b505038612cad565b612d479250602080918301019101612a5e565b3880612d2c565b15612d5557565b608460405162461bcd60e51b815260206004820152602660248201527f53796d623a2073796e74686574696320746f6b656e7320656d657267656e637960448201527f556e6275726e00000000000000000000000000000000000000000000000000006064820152fd5b9492939195969096600091878352606b602052612de660ff6040852054166121628161282a565b6001600160a01b0393612e408886881692838752606c602052612e0d816040892054612c20565b848852606c60205260408820558b8752606b60205260408720600160ff198254161790556121c98289606754168b612c43565b96825115612f4f57612e578887606f541689612c43565b85606f541692833b156105fd5785949392878a93612ebe88946040519b8c998a9889977ff5b697a50000000000000000000000000000000000000000000000000000000089526004890152602488015216604486015260c0606486015260c48501906126b6565b9f6084840152169d8e60a483015203925af1908115612f43575091612f2f917faeef64b7687b985665b6620c7fa271b6f051a3fbe2bfc366fb9c964602eb6d26959493612f34575b50604051938493849160409194936001600160a01b039160608501968552602085015216910152565b0390a4565b612f3d906126f6565b38612f06565b604051903d90823e3d90fd5b879b5086819795507faeef64b7687b985665b6620c7fa271b6f051a3fbe2bfc366fb9c964602eb6d26999450612f8c9350612f2f96989250612c43565b6040519485941698849160409194936001600160a01b039160608501968552602085015216910152565b15612fbd57565b608460405162461bcd60e51b8152602060048201526024808201527f53796d623a205265616c20746f6b656e7320616c7265616479207472616e736660448201527f65726564000000000000000000000000000000000000000000000000000000006064820152fd5b9091613040606093969594966080845260808401906126b6565b956001600160a01b0380921660208401521660408201520152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612c2d5760010190565b805182101561309c5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815180825260208080930193019160005b8281106130d2575050505090565b83516001600160a01b0316855293810193928101926001016130c4565b91908201809211612c2d57565b1561310357565b608460405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152fd5b6001600160a01b036065541633146000146131ac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b339056fea2646970667358221220080e4d5b8882aac7d44da471059a343edf507da38bb13b30b4c63fe5ad59030564736f6c63430008130033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b6000803560e01c806308759e9b146123e25780631459457a146122035780631ebe53ef146120cb5780633f4ba83a1461206c578063486ff0cd1461200a5780634a91366414611eb1578063572b6c0514611e7d5780635badbe4c14611e5f5780635c975abb14611e3c5780636877527814611e0457806370a0823114611dcc578063715018a614611d55578063753d756314611d185780637c374f9914611c895780638456cb5914611c1c5780638bb3980214611b8a5780638da5cb5b14611b635780639d86698514611af3578063ac210cc714611acc578063b1659a3c1461168f578063c2167d931461160e578063c23a4c881461157c578063c42a2894146113ab578063ce654c1714610c31578063dbec15bb14610c0a578063e78cea9214610be3578063eadd5c3414610af1578063f2fde38b14610a3a578063fab9289414610a045763fce633c21461016757600080fd5b34610a01576003196020813601126105ee5767ffffffffffffffff600435116105ee576101a09060043536030112610a01576040516101a581612726565b6004356004013581526024600435013560208201526101c86044600435016126a2565b60408201526101db6064600435016126a2565b60608201526101ee6084600435016126a2565b608082015260043560a481013560a083015260c481013560c08301526102169060e4016126a2565b60e0820152610104600435013567ffffffffffffffff81116109fd57610243906004369181350101612866565b610100820152610258610124600435016126a2565b61012082015261026d610144600435016126a2565b610140820152610164600435013567ffffffffffffffff81116109fd5761029b906004369181350101612866565b61016082015261018460043501356101808201526102be60ff606954161561294d565b6101008101515115610601578160208201516103226103306102de61316d565b926040519283916020830195469130908892606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b03601f198101835282612798565b519020808252606b602052610358600160ff6040852054166103518161282a565b1415612fb6565b808252606b60205260408220600260ff198254161790556104c57fffffffff0000000000000000000000000000000000000000000000000000000060436040516103a18161275f565b8181527f6573290000000000000000000000000000000000000000000000000000000000606060208301927f7265766572744d6574614275726e2875696e743235362c627974657333322c6184527f6464726573732c62797465732c616464726573732c616464726573732c6279746040820152015220166103228551936001600160a01b0360e088015116906101008801519161048b6001600160a01b036101208b015116936001600160a01b036101408c015116926101608c0151946040519a8b9960208b015260248a01526044890152606488015260e060848801526101048701906126b6565b9260a486015260c48501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8483030160e48501526126b6565b6001600160a01b0360675416906001600160a01b03604085015116916001600160a01b036060860151169060a086015193813b156105fd5785809461052060405197889687958694633675e4e160e11b865260048601613026565b03925af180156105f2576105da575b5050806020809201517f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f5836001600160a01b0361056a61316d565b1660405190847f40590cc12db0488520ce425059f83f8caed91bdf98de5ff829dc57c63843161b8980a3610180850151938152a25b01516001600160a01b036105b161316d565b16907fbd03c66ec5bd3d01fbf22bc794f68ac88b693023b438724019205a4b42aefb208380a380f35b6105e3906126f6565b6105ee57813861052f565b5080fd5b6040513d84823e3d90fd5b8580fd5b61016081015151156108765760208101516103226106206102de61316d565b519020808352606b602052610641600160ff6040862054166103518161282a565b808352606b60205260408320600260ff198254161790556001600160a01b037fffffffff00000000000000000000000000000000000000000000000000000000604260405161068f8161275f565b8181527f7329000000000000000000000000000000000000000000000000000000000000606060208301927f7265766572744275726e416e644275726e2875696e743235362c62797465733384527f322c616464726573732c616464726573732c75696e743235362c61646472657360408201520152201691835190826080860151169061071b61316d565b926040519560208701526024860152604485015230606485015260848401524660a48401521660c482015260c48152610100810181811067ffffffffffffffff821117610860578391816040526001600160a01b0360675416906001600160a01b0361012086015116916001600160a01b036060870151169260a0870151823b1561085c5760ff1986946107c489979388948896633675e4e160e11b8852846101048101613026565b0301925af180156105f257610848575b5050806020809201517f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f5836001600160a01b0361080f61316d565b1660405190847f40590cc12db0488520ce425059f83f8caed91bdf98de5ff829dc57c63843161b8980a3610180850151938152a261059f565b610851906126f6565b6105ee5781386107d4565b8680fd5b634e487b7160e01b600052604160045260246000fd5b817fffffffff0000000000000000000000000000000000000000000000000000000060586040516108a68161275f565b8181527f75696e743235362c616464726573732c62797465733332290000000000000000606060208301927f72657665727453796e74686573697a655265717565737442794272696467652884527f75696e743235362c627974657333322c616464726573732c616464726573732c6040820152015220168251906020840151916001600160a01b03809381604088015116826080890151169061094861316d565b926101808a01519560405197602089015260248801526044870152606486015260848501524660a48501521660c483015260e482015260e4815261098b8161277b565b81606754168261012086015116926060860151169060a086015193813b156105fd578580946109d060405197889687958694633675e4e160e11b865260048601613026565b03925af180156105f2576109e9575b505060209061059f565b6109f2906126f6565b6105ee5781386109df565b8280fd5b80fd5b5034610a01576020600319360112610a015760ff60406020926004358152606b845220541660405190610a368161282a565b8152f35b5034610a01576020600319360112610a0157610a54612634565b6001600160a01b03610a74816033541682610a6d61316d565b16146128ad565b811615610a8757610a84906128f8565b80f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b5034610a01576020600319360112610a0157610b0b612634565b6001600160a01b0390610b25826033541683610a6d61316d565b168015610b79576020817fd5c54ab1d37bfef4dd2253d9d73c292e46f5bd8a67ca5920aab4c2e1993178e79273ffffffffffffffffffffffffffffffffffffffff19606f541617606f55604051908152a180f35b608460405162461bcd60e51b815260206004820152602760248201527f53796d623a206d657461526f757465722063616e6e6f74206265207a65726f2060448201527f61646472657373000000000000000000000000000000000000000000000000006064820152fd5b5034610a015780600319360112610a015760206001600160a01b0360675416604051908152f35b5034610a015780600319360112610a015760206001600160a01b03606f5416604051908152f35b5034610a015760031990602082360112610a015767ffffffffffffffff60043511610a0157610200809260043536030112610a015760405191820182811067ffffffffffffffff82111761086057604052600435600401358252602460043501356020830152610ca56044600435016126a2565b6040830152610cb86064600435016126a2565b6060830152610ccb6084600435016126a2565b6080830152610cde60a4600435016126a2565b60a0830152610cf160c4600435016126a2565b60c083015260e4600435013560e083015267ffffffffffffffff610104600435013511610a0157610d2d366004803561010481013501016127bb565b610100830152610d42610124600435016126a2565b61012083015267ffffffffffffffff610144600435013511610a0157610d7336600480356101448101350101612866565b610140830152610d88610164600435016126a2565b61016083015267ffffffffffffffff610184600435013511610a0157610db936600480356101848101350101612866565b6101808301526101a460043501356101a0830152610ddc6101c4600435016126a2565b6101c08301526101e460043501356101e0830152610dff60ff606954161561294d565b6001600160a01b036040830151168152606e602052610e2460ff604083205416612998565b610e4d60208301516001600160a01b036040850151168352606d602052604083205411156129e3565b610e746001600160a01b03604084015116610e6661316d565b906020850151913091612a76565b6001600160a01b036040830151168152606c602052610e9c60408220546020840151906130ef565b6001600160a01b036040840151168252606c60205260408220556001600160a01b036101c08301511615611392575b6068546040513060601b6bffffffffffffffffffffffff191660208201526034810191909152466054820152610f048160748101610322565b60208151910120906001600160a01b036080840151166001600160a01b036101c085015116610f7560e0860151916103226040519384926020840196898892606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b51902061122d8451916020860151866001600160a01b036040820151166001600160a01b036060830151166101008301516001600160a01b036101208501511690610140850151926001600160a01b0361016087015116946101a0610180880151970151976040519b610fe78d612726565b8c5260208c01528c60408c01528860608c015260808b01524660a08b015260c08a015260e089015261010088015261012087015261014086015261016085015261018084015261116e60405180947fc29a91bc00000000000000000000000000000000000000000000000000000000602083015260206024830152805160448301526020810151606483015260408101516084830152606081015160a48301526001600160a01b0360808201511660c483015260a081015160e48301526001600160a01b0360c0820151166101048301526101806111576110da60e08401516101a06101248701526101e48601906130b2565b6001600160a01b036101008501511661014486015261112b610120850151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc9283888303016101648901526126b6565b906001600160a01b036101408601511661018487015261016085015190868303016101a48701526126b6565b9101516101c483015203601f198101855284612798565b6001600160a01b0360c087015116906001600160a01b036060880151166001600160a01b0360038160408b0151169460208b0151604051916111af8361270a565b82526020820194855260408201908152606082019687526080820195600187528a52606a6020528360408b209251169473ffffffffffffffffffffffffffffffffffffffff199586845416178355846001840191511686825416179055516002820155019351169083541617825551906112288261282a565b612bd1565b61123860685461305b565b6068556001600160a01b03606754166001600160a01b03608086015116906001600160a01b0360a0870151169160e087015193823b156105fd5790858094939261129860405197889687958694633675e4e160e11b865260048601613026565b03925af180156105f25761137e575b6020836101e0866001600160a01b0360c08201511660e08201516001600160a01b036101c084015116917f31325fe0a1a2e6a5b1e41572156ba5b4e94f0fae7e7f63ec21e9b5ce1e4b3eab6001600160a01b0360608601511688860151906113486001600160a01b036040890151166040519384938c859293606092919594608085019685526001600160a01b038093166020860152604085015216910152565b0390a401517f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f583604051848152a2604051908152f35b61138882916126f6565b610a0157806112a7565b6001600160a01b036060830151166101c0830152610ecb565b5034610a01576040600319360112610a01576004356024356001600160a01b036113da81606754163314612b86565b6113e960ff606954161561294d565b818452606a6020526040842092600384018054600160ff8260a01c1661140e8161282a565b0361151257836114e184827fefcdf9ea4e65571d2ce9c030c46954e950662df8a7d8bd039fc4417e37b2f88c9785740200000000000000000000000000000000000000007fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff61150c981617885516998a8c52606c60205260408c20549a61149b600283019c8d5490612c20565b908d52606c60205260408d20556114c5828854168c6114bf86868654169254612c20565b91612c43565b6114d88383895416846067541690612c43565b54169854612c20565b925416604051938493849160409194936001600160a01b039160608501968552602085015216910152565b0390a380f35b608460405162461bcd60e51b815260206004820152602960248201527f53796d623a207374617465206e6f74206f70656e206f7220747820646f65732060448201527f6e6f7420657869737400000000000000000000000000000000000000000000006064820152fd5b5034610a0157610120600319360112610a015761159761261e565b61159f612660565b906115a861268c565b9160e4359267ffffffffffffffff841161160a576115cd610a84943690600401612866565b916115e46001600160a01b03606754163314612b86565b6115f360ff606954161561294d565b610104359360843590604435602435600435612dbf565b8480fd5b5034610a01576020600319360112610a01577fce42f6a6b3d7a9e5602623686f752d848285a87b22f0168a666c9c6064d2d230602061164b612634565b6001600160a01b0390611665826033541683610a6d61316d565b168073ffffffffffffffffffffffffffffffffffffffff196066541617606655604051908152a180f35b5034610a0157610120600319360112610a01576116aa61264a565b6116b261261e565b906116bb612676565b916116c4612660565b926116cd61268c565b906116dd60ff606954161561294d565b6001600160a01b0384168652606e6020526116fe60ff604088205416612998565b6001600160a01b0384168652606d602052611721604087205460443510156129e3565b61173861172c61316d565b60443590309087612a76565b6001600160a01b03828186168852606c60205261175b60443560408a20546130ef565b8287168952606c60205260408920551615611ac4575b856068546040516117af81610322602082019446903087916bffffffffffffffffffffffff196054949260601b168352601483015260348201520190565b519020956040516117fa8161032260e43588888d6020860192606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b60208151910120906119a3877fffffffff00000000000000000000000000000000000000000000000000000000604b6040516118358161275f565b8181527f35362c6164647265737329000000000000000000000000000000000000000000606060208301927f6d696e7453796e746865746963546f6b656e2875696e743235362c627974657384527f33322c627974657333322c616464726573732c75696e743235362c75696e74326040820152015220169360405194602086015260043560248601528060448601528a60648601526001600160a01b03821660848601524660a486015260443560c48601526001600160a01b0389168060e487015260e486526119058661277b565b6001600160a01b03600361191761316d565b82604051916119258361270a565b168152602081019384526040810160443581528360608301971687526080820195600187528b52606a6020528360408c209251169473ffffffffffffffffffffffffffffffffffffffff199586845416178355846001840191511686825416179055516002820155019351169083541617825551906112288261282a565b6119ae60685461305b565b6068556001600160a01b036067541690813b15611ac057836119eb9560405196879586948593633675e4e160e11b855260e4359260048601613026565b03925af18015611ab557611aa1575b50602094507f31325fe0a1a2e6a5b1e41572156ba5b4e94f0fae7e7f63ec21e9b5ce1e4b3eab6001600160a01b0380611a3161316d565b604080518981526001600160a01b0397881660208201526044359181019190915296909516606087015292169360e435939290921691608090a46040518181527f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f5836101043592a2604051908152f35b611aab86916126f6565b61160a57846119fa565b6040513d88823e3d90fd5b8380fd5b829150611771565b5034610a015780600319360112610a015760206001600160a01b0360665416604051908152f35b5034610a01576020600319360112610a0157604060a0916004358152606a602052206001600160a01b039081815416918060018301541691600360028201549101549060ff82871c169360405195865260208601526040850152166060830152611b5c8161282a565b6080820152f35b5034610a015780600319360112610a015760206001600160a01b0360335416604051908152f35b5034610a01576040600319360112610a01577fa6742efd4f410d6fd9688a6cf6a15b6d51121097a263056a3576baaacdc4a9ae611bc5612634565b602435906001600160a01b03611be2816033541682610a6d61316d565b81168452606d602052816040852055611c1660405192839283602090939291936001600160a01b0360408201951681520152565b0390a180f35b5034610a015780600319360112610a01577f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25860206001600160a01b03611c69816033541682610a6d61316d565b600160ff196069541617606955611c7e61316d565b60405191168152a180f35b5034610a01576040600319360112610a0157611ca3612634565b602435908115158092036109fd577f0a4552f1105808db6a44587c9ef0a7c4064bf620b9d843b514ad7365bd52239a916040916001600160a01b0390611cf0826033541683610a6d61316d565b1690818552606e60205282852060ff1981541660ff831617905582519182526020820152a180f35b5034610a01576020600319360112610a015760ff60406020926001600160a01b03611d41612634565b168152606e84522054166040519015158152f35b5034610a015780600319360112610a0157600060335473ffffffffffffffffffffffffffffffffffffffff196001600160a01b0391611da183821693611d9961316d565b1684146128ad565b166033557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610a01576020600319360112610a015760406020916001600160a01b03611df3612634565b168152606c83522054604051908152f35b5034610a01576020600319360112610a015760406020916001600160a01b03611e2b612634565b168152606d83522054604051908152f35b5034610a015780600319360112610a0157602060ff606954166040519015158152f35b5034610a015780600319360112610a01576020606854604051908152f35b5034610a01576020600319360112610a01576020611e99612634565b6001600160a01b038060655416911614604051908152f35b5034610a01576020806003193601126105ee5760043567ffffffffffffffff81116109fd57611ee49036906004016127bb565b906001600160a01b0390611eff826033541683610a6d61316d565b835b8351811015611fd3578083611f1860249387613088565b51168652606e8352611f3060ff604088205416612998565b8284611f3c8388613088565b5116604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa8015611ab5578690611fa4575b611f9f925084611f8d8388613088565b51168752606c8452604087205561305b565b611f01565b508282813d8311611fcc575b611fba8183612798565b810103126105fd57611f9f9151611f7d565b503d611fb0565b60405182815285907f5a980ed3bb4dd09162988674fd35c7002fa70e44dd03d2942ac38c074b1a638e9080611c16818701896130b2565b5034610a015780600319360112610a015761206860405161202a81612743565b600581527f322e302e3100000000000000000000000000000000000000000000000000000060208201526040519182916020835260208301906126b6565b0390f35b5034610a015780600319360112610a01577f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa60206001600160a01b036120b9816033541682610a6d61316d565b60ff1960695416606955611c7e61316d565b5034610a015760c0600319360112610a01576004356024356120eb61261e565b907faeef64b7687b985665b6620c7fa271b6f051a3fbe2bfc366fb9c964602eb6d26608435612118612660565b6121fd6121ce876001600160a01b039461213786606754163314612b86565b61214660ff606954161561294d565b878b52606b60205261216860ff60408d2054166121628161282a565b15612d4e565b8a612182826040898d1693848152606c6020522054612c20565b908c52606c60205260408c2055878b52606b60205260408b20600160ff198254161790556121ba6121b38383612c20565b868b612c43565b6121c98287606754168b612c43565b612c20565b95604051938493169760443597849160409194936001600160a01b039160608501968552602085015216910152565b0390a480f35b5034610a015760a0600319360112610a015761221d612634565b61222561264a565b61222d612603565b9061223661261e565b9061223f612676565b9385549460ff8660081c16806000146123d857303b155b1561236e57159586612340575b5061228f60ff885460081c16612278816130fc565b612281816130fc565b61228a816130fc565b6130fc565b61229f61229a61316d565b6128f8565b6001600160a01b0380958180948173ffffffffffffffffffffffffffffffffffffffff19971687606554161760655516856067541617606755168360665416176066551690606f541617606f551680612324575b506122fb5780f35b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff815416815580f35b8252606e60205260408220600160ff19825416179055386122f3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661010117875538612263565b608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152fd5b60ff871615612256565b5034610a015760c0600319360112610a01576024356123ff612603565b61240761261e565b61241660ff606954161561294d565b61241e61316d565b91846040519360209461246a81610322888201944690308c8892606894929184526bffffffffffffffffffffffff19809260601b16602085015260601b16603483015260488201520190565b519020808252606b855261248a600160ff6040852054166103518161282a565b808252606b855260408220600260ff198254161790557f7265766572744275726e2875696e743235362c62797465733332290000000000856040516124ce81612743565b601b81520152604051907ff70519ae000000000000000000000000000000000000000000000000000000008683015260043560248301526044820152604481526125178161275f565b6001600160a01b0393846067541690813b15611ac057836125539560405196879586948593633675e4e160e11b85526084359260048601613026565b03925af180156125f8576125c3575b50907f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f59161258e61316d565b169260405193817f40590cc12db0488520ce425059f83f8caed91bdf98de5ff829dc57c63843161b8780a3835260a43592a280f35b936125f07f5a297b2c9a9f94a0f4e5a796c74ad38e219d1185fccf5f79c18726a830c2b6f59392956126f6565b939091612562565b6040513d87823e3d90fd5b604435906001600160a01b038216820361261957565b600080fd5b606435906001600160a01b038216820361261957565b600435906001600160a01b038216820361261957565b602435906001600160a01b038216820361261957565b60a435906001600160a01b038216820361261957565b608435906001600160a01b038216820361261957565b60c435906001600160a01b038216820361261957565b35906001600160a01b038216820361261957565b919082519283825260005b8481106126e2575050601f19601f8460006020809697860101520116010190565b6020818301810151848301820152016126c1565b67ffffffffffffffff811161086057604052565b60a0810190811067ffffffffffffffff82111761086057604052565b6101a0810190811067ffffffffffffffff82111761086057604052565b6040810190811067ffffffffffffffff82111761086057604052565b6080810190811067ffffffffffffffff82111761086057604052565b610120810190811067ffffffffffffffff82111761086057604052565b90601f601f19910116810190811067ffffffffffffffff82111761086057604052565b9080601f830112156126195781359067ffffffffffffffff8211610860578160051b604051936020936127f085840187612798565b85528380860192820101928311612619578301905b828210612813575050505090565b83809161281f846126a2565b815201910190612805565b6003111561283457565b634e487b7160e01b600052602160045260246000fd5b67ffffffffffffffff811161086057601f01601f191660200190565b81601f820112156126195780359061287d8261284a565b9261288b6040519485612798565b8284526020838301011161261957816000926020809301838601378301015290565b156128b457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603354906001600160a01b03809116918273ffffffffffffffffffffffffffffffffffffffff19821617603355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b1561295457565b606460405162461bcd60e51b815260206004820152600c60248201527f53796d623a2070617573656400000000000000000000000000000000000000006044820152fd5b1561299f57565b606460405162461bcd60e51b815260206004820152601860248201527f53796d623a20756e617574686f72697a656420746f6b656e00000000000000006044820152fd5b156129ea57565b606460405162461bcd60e51b815260206004820152601c60248201527f53796d623a20616d6f756e7420756e646572207468726573686f6c64000000006044820152fd5b3d15612a59573d90612a3f8261284a565b91612a4d6040519384612798565b82523d6000602084013e565b606090565b90816020910312612619575180151581036126195790565b9091600080949381946040519160208301947f23b872dd0000000000000000000000000000000000000000000000000000000086526001600160a01b038092166024850152166044830152606482015260648152612ad38161270a565b51925af1612adf612a2e565b81612b57575b5015612aed57565b608460405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152fd5b8051801592508215612b6c575b505038612ae5565b612b7f9250602080918301019101612a5e565b3880612b64565b15612b8d57565b606460405162461bcd60e51b815260206004820152601e60248201527f53796d623a2063616c6c6572206973206e6f74207468652062726964676500006044820152fd5b90612bdb8161282a565b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000083549260a01b169116179055565b91908203918211612c2d57565b634e487b7160e01b600052601160045260246000fd5b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082019081526001600160a01b03909316602482015260448101939093526000928392908390612c9b8160648101610322565b51925af1612ca7612a2e565b81612d1f575b5015612cb557565b608460405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152fd5b8051801592508215612d34575b505038612cad565b612d479250602080918301019101612a5e565b3880612d2c565b15612d5557565b608460405162461bcd60e51b815260206004820152602660248201527f53796d623a2073796e74686574696320746f6b656e7320656d657267656e637960448201527f556e6275726e00000000000000000000000000000000000000000000000000006064820152fd5b9492939195969096600091878352606b602052612de660ff6040852054166121628161282a565b6001600160a01b0393612e408886881692838752606c602052612e0d816040892054612c20565b848852606c60205260408820558b8752606b60205260408720600160ff198254161790556121c98289606754168b612c43565b96825115612f4f57612e578887606f541689612c43565b85606f541692833b156105fd5785949392878a93612ebe88946040519b8c998a9889977ff5b697a50000000000000000000000000000000000000000000000000000000089526004890152602488015216604486015260c0606486015260c48501906126b6565b9f6084840152169d8e60a483015203925af1908115612f43575091612f2f917faeef64b7687b985665b6620c7fa271b6f051a3fbe2bfc366fb9c964602eb6d26959493612f34575b50604051938493849160409194936001600160a01b039160608501968552602085015216910152565b0390a4565b612f3d906126f6565b38612f06565b604051903d90823e3d90fd5b879b5086819795507faeef64b7687b985665b6620c7fa271b6f051a3fbe2bfc366fb9c964602eb6d26999450612f8c9350612f2f96989250612c43565b6040519485941698849160409194936001600160a01b039160608501968552602085015216910152565b15612fbd57565b608460405162461bcd60e51b8152602060048201526024808201527f53796d623a205265616c20746f6b656e7320616c7265616479207472616e736660448201527f65726564000000000000000000000000000000000000000000000000000000006064820152fd5b9091613040606093969594966080845260808401906126b6565b956001600160a01b0380921660208401521660408201520152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612c2d5760010190565b805182101561309c5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b90815180825260208080930193019160005b8281106130d2575050505090565b83516001600160a01b0316855293810193928101926001016130c4565b91908201809211612c2d57565b1561310357565b608460405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152fd5b6001600160a01b036065541633146000146131ac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b339056fea2646970667358221220080e4d5b8882aac7d44da471059a343edf507da38bb13b30b4c63fe5ad59030564736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 31.63% | $1 | 207,544.5812 | $207,555.31 | |
BSC | 25.02% | $0.015224 | 10,782,574.4383 | $164,153.16 | |
BSC | 7.41% | $1,881.19 | 25.849 | $48,626.81 | |
BSC | 5.55% | $83,694.27 | 0.4349 | $36,398.72 | |
BSC | 4.90% | $1 | 32,074.0344 | $32,127.36 | |
BSC | 0.70% | $0.063448 | 71,993.8759 | $4,567.87 | |
BSC | 0.01% | $3.73 | 22.5627 | $84.16 | |
BSC | <0.01% | $0.000189 | 15,408.6611 | $2.91 | |
SCROLL | 11.07% | $1,878.62 | 38.6619 | $72,631.03 | |
SCROLL | 6.03% | $0.999989 | 39,576.8587 | $39,576.42 | |
SCROLL | 0.02% | $1,960.33 | 0.0822 | $161.21 | |
BLAST | 3.97% | $1,880.94 | 13.8409 | $26,033.87 | |
TAIKO | 3.69% | $1,851.25 | 13.0772 | $24,209.1 | |
BASE | <0.01% | $1,880.94 | 0.0109 | $20.51 |
Loading...
Loading
Loading...
Loading
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.