Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 15424846 | 78 days ago | 0 ETH | |||||
| 15422877 | 78 days ago | 0 ETH | |||||
| 15421361 | 78 days ago | 0 ETH | |||||
| 15419129 | 78 days ago | 0 ETH | |||||
| 15417549 | 78 days ago | 0 ETH | |||||
| 15409509 | 78 days ago | 0 ETH | |||||
| 15393645 | 78 days ago | 0 ETH | |||||
| 15392100 | 78 days ago | 0 ETH | |||||
| 15359419 | 79 days ago | 0 ETH | |||||
| 15358591 | 79 days ago | 0 ETH | |||||
| 15356265 | 79 days ago | 0 ETH | |||||
| 15354426 | 79 days ago | 0 ETH | |||||
| 15350748 | 79 days ago | 0 ETH | |||||
| 15338711 | 79 days ago | 0 ETH | |||||
| 15337796 | 79 days ago | 0 ETH | |||||
| 15331340 | 79 days ago | 0 ETH | |||||
| 15323777 | 79 days ago | 0 ETH | |||||
| 15314580 | 79 days ago | 0 ETH | |||||
| 15288071 | 80 days ago | 0 ETH | |||||
| 15270857 | 80 days ago | 0 ETH | |||||
| 15265207 | 80 days ago | 0 ETH | |||||
| 15249026 | 80 days ago | 0 ETH | |||||
| 15240688 | 80 days ago | 0 ETH | |||||
| 15221004 | 80 days ago | 0 ETH | |||||
| 15189587 | 81 days ago | 0 ETH |
Cross-Chain Transactions
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/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 (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 (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;
interface IBridge {
function transmitRequestV2(
bytes memory _callData,
address _receiveSide,
address _oppositeBridge,
uint256 _chainId
) 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;
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 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.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;
}// 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();
}
}
}{
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 2000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"viaIR": true
}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
Loading...
Loading
Net Worth in USD
$928,723.61
Net Worth in ETH
310.656414
Token Allocations
UXLINK
65.82%
USDC
23.68%
WETH
7.86%
Others
2.64%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 65.82% | $0.011136 | 54,892,612.238 | $611,274.8 | |
| ARB | 23.68% | $0.999771 | 219,951.8077 | $219,901.44 | |
| ARB | 7.86% | $2,990.15 | 24.4139 | $73,001.29 | |
| ARB | 1.35% | $0.029627 | 422,518.2996 | $12,518.1 | |
| ARB | 0.62% | $0.999771 | 5,804.4625 | $5,803.13 | |
| ARB | 0.59% | $0.002741 | 2,000,000 | $5,481.05 | |
| ARB | 0.07% | $0.189961 | 3,526.6695 | $669.93 | |
| ARB | <0.01% | <$0.000001 | 6,928,782,556.9453 | $69.98 | |
| ARB | <0.01% | $0.99269 | 3.927 | $3.9 |
Loading...
Loading
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.