Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 260 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Meta Route | 18253267 | 2 days ago | IN | 0 ETH | 0.00000161 | ||||
| Meta Route | 18253053 | 2 days ago | IN | 0 ETH | 0.00000177 | ||||
| Meta Route | 18252597 | 2 days ago | IN | 0 ETH | 0.00000166 | ||||
| Meta Route | 18252450 | 2 days ago | IN | 0 ETH | 0.00000196 | ||||
| Meta Route | 18252300 | 2 days ago | IN | 0 ETH | 0.00000202 | ||||
| Meta Route | 18252083 | 2 days ago | IN | 0 ETH | 0.00000161 | ||||
| Meta Route | 18251920 | 2 days ago | IN | 0 ETH | 0.00000161 | ||||
| Meta Route | 18216057 | 2 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 18159802 | 3 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 18119719 | 4 days ago | IN | 0 ETH | 0.00000176 | ||||
| Meta Route | 17984883 | 5 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 17951038 | 5 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 17717916 | 8 days ago | IN | 0.4037 ETH | 0.00000162 | ||||
| Meta Route | 17714801 | 8 days ago | IN | 0.0053 ETH | 0.00000135 | ||||
| Meta Route | 17641168 | 9 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 17611882 | 9 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 17596157 | 10 days ago | IN | 0 ETH | 0.00000199 | ||||
| Meta Route | 17587167 | 10 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 17586883 | 10 days ago | IN | 0.095 ETH | 0.00000135 | ||||
| Meta Route | 17582548 | 10 days ago | IN | 0 ETH | 0.00000165 | ||||
| Meta Route | 17427389 | 12 days ago | IN | 0.009 ETH | 0.00000162 | ||||
| Meta Route | 17407052 | 12 days ago | IN | 0 ETH | 0.00000135 | ||||
| Meta Route | 17358194 | 12 days ago | IN | 0 ETH | 0.00000203 | ||||
| Meta Route | 17358054 | 12 days ago | IN | 0 ETH | 0.00000161 | ||||
| Meta Route | 17349853 | 12 days ago | IN | 0 ETH | 0.000002 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 18458771 | 2 hrs ago | 0 ETH | |||||
| 18458771 | 2 hrs ago | 0 ETH | |||||
| 18458771 | 2 hrs ago | 0 ETH | |||||
| 18297975 | 47 hrs ago | 0 ETH | |||||
| 18297975 | 47 hrs ago | 0 ETH | |||||
| 18297975 | 47 hrs ago | 0 ETH | |||||
| 18268815 | 2 days ago | 0 ETH | |||||
| 18268815 | 2 days ago | 0 ETH | |||||
| 18268815 | 2 days ago | 0 ETH | |||||
| 18253267 | 2 days ago | 0 ETH | |||||
| 18253267 | 2 days ago | 0 ETH | |||||
| 18253267 | 2 days ago | 0 ETH | |||||
| 18253053 | 2 days ago | 0 ETH | |||||
| 18253053 | 2 days ago | 0 ETH | |||||
| 18253053 | 2 days ago | 0 ETH | |||||
| 18252597 | 2 days ago | 0 ETH | |||||
| 18252597 | 2 days ago | 0 ETH | |||||
| 18252597 | 2 days ago | 0 ETH | |||||
| 18252450 | 2 days ago | 0 ETH | |||||
| 18252450 | 2 days ago | 0 ETH | |||||
| 18252450 | 2 days ago | 0 ETH | |||||
| 18252300 | 2 days ago | 0 ETH | |||||
| 18252300 | 2 days ago | 0 ETH | |||||
| 18252300 | 2 days ago | 0 ETH | |||||
| 18252083 | 2 days ago | 0 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0
// uni -> stable -> uni scheme
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import "./MetaRouteStructs.sol";
import "./MetaRouterGateway.sol";
import "../../utils/RevertMessageParser.sol";
/**
* @title MetaRouterV3
* @notice Users must give approve on their tokens to `MetaRoutetGateway` contract,
* not to `MetaRouter` contract.
*/
contract MetaRouter is Context {
MetaRouterGateway public immutable metaRouterGateway;
event TransitTokenSent(
address to,
uint256 amount,
address token
);
constructor() {
metaRouterGateway = new MetaRouterGateway(address(this));
}
/**
* @notice Method that starts the Meta Routing
* @dev external + internal swap for burn scheme, only external for synth scheme
* @dev calls the next method on the other side
* @param _metarouteTransaction metaRoute offchain transaction data
*/
function metaRoute(
MetaRouteStructs.MetaRouteTransaction calldata _metarouteTransaction
) external payable {
uint256 approvedTokensLength = _metarouteTransaction.approvedTokens.length;
if (!_metarouteTransaction.nativeIn) {
metaRouterGateway.claimTokens(
_metarouteTransaction.approvedTokens[0],
_msgSender(),
_metarouteTransaction.amount
);
}
uint256 secondSwapAmountIn = _metarouteTransaction.amount;
if (_metarouteTransaction.firstSwapCalldata.length != 0) {
if (!_metarouteTransaction.nativeIn) {
_lazyApprove(
_metarouteTransaction.approvedTokens[0],
_metarouteTransaction.firstDexRouter,
_metarouteTransaction.amount
);
}
require(
_metarouteTransaction.firstDexRouter != address(metaRouterGateway),
"MetaRouter: invalid first router"
);
{
uint256 size;
address toCheck = _metarouteTransaction.firstDexRouter;
assembly {
size := extcodesize(toCheck)
}
require(size != 0, "MetaRouter: call for a non-contract account");
}
(bool firstSwapSuccess, bytes memory swapData) = _metarouteTransaction.firstDexRouter.call{value: msg.value}(
_metarouteTransaction.firstSwapCalldata
);
if (!firstSwapSuccess) {
revert(RevertMessageParser.getRevertMessage(swapData, "MetaRouter: first swap failed"));
}
secondSwapAmountIn = IERC20(_metarouteTransaction.approvedTokens[1]).balanceOf(address(this));
}
uint256 finalSwapAmountIn = secondSwapAmountIn;
if (_metarouteTransaction.secondSwapCalldata.length != 0) {
bytes memory secondSwapCalldata = _metarouteTransaction.secondSwapCalldata;
assembly {
mstore(add(secondSwapCalldata, 36), secondSwapAmountIn)
}
_lazyApprove(
_metarouteTransaction.approvedTokens[approvedTokensLength - 2],
_metarouteTransaction.secondDexRouter,
secondSwapAmountIn
);
require(
_metarouteTransaction.secondDexRouter != address(metaRouterGateway),
"MetaRouter: invalid second router"
);
{
uint256 size;
address toCheck = _metarouteTransaction.secondDexRouter;
assembly {
size := extcodesize(toCheck)
}
require(size != 0, "MetaRouter: call for a non-contract account");
}
(bool secondSwapSuccess, bytes memory swapData) = _metarouteTransaction.secondDexRouter.call(secondSwapCalldata);
if (!secondSwapSuccess) {
revert(RevertMessageParser.getRevertMessage(swapData, "MetaRouter: second swap failed"));
}
finalSwapAmountIn = IERC20(
_metarouteTransaction.approvedTokens[approvedTokensLength - 1]
).balanceOf(address(this));
}
_lazyApprove(
_metarouteTransaction.approvedTokens[approvedTokensLength - 1],
_metarouteTransaction.relayRecipient,
finalSwapAmountIn
);
bytes memory otherSideCalldata = _metarouteTransaction.otherSideCalldata;
assembly {
mstore(add(otherSideCalldata, 100), finalSwapAmountIn)
}
require(
_metarouteTransaction.relayRecipient != address(metaRouterGateway),
"MetaRouter: invalid recipient"
);
{
uint256 size;
address toCheck = _metarouteTransaction.relayRecipient;
assembly {
size := extcodesize(toCheck)
}
require(size != 0, "MetaRouter: call for a non-contract account");
}
(bool otherSideCallSuccess, bytes memory data) = _metarouteTransaction.relayRecipient.call(otherSideCalldata);
if (!otherSideCallSuccess) {
revert(RevertMessageParser.getRevertMessage(data, "MetaRouter: other side call failed"));
}
}
/**
* @notice Implements an external call on some contract
* @dev called by Portal in metaUnsynthesize() method
* @param _token address of token
* @param _amount amount of _token
* @param _receiveSide contract on which call will take place
* @param _calldata encoded method to call
* @param _offset shift to patch the amount to calldata
*/
function externalCall(
address _token,
uint256 _amount,
address _receiveSide,
bytes calldata _calldata,
uint256 _offset,
address _to
) external {
(bool success,) = _externalCall(_token, _amount, _receiveSide, _calldata, _offset);
if (!success) {
TransferHelper.safeTransfer(
_token,
_to,
_amount
);
emit TransitTokenSent(_to, _amount, _token);
}
}
function returnSwap(
address _token,
uint256 _amount,
address _router,
bytes calldata _swapCalldata,
address _burnToken,
address _synthesis,
bytes calldata _burnCalldata
) external {
(bool success, bytes memory data) = _externalCall(_token, _amount, _router, _swapCalldata, 36);
if (!success) {
revert(RevertMessageParser.getRevertMessage(data, "MetaRouterV2: internal swap failed"));
}
uint256 internalSwapAmountOut = IERC20(_burnToken).balanceOf(address(this));
bytes memory burnCalldata = _burnCalldata;
assembly {
mstore(add(burnCalldata, 100), internalSwapAmountOut)
}
require(
_synthesis != address(metaRouterGateway),
"MetaRouterV2: invalid recipient"
);
{
uint256 size;
address toCheck = _synthesis;
assembly {
size := extcodesize(toCheck)
}
require(size != 0, "MetaRouter: call for a non-contract account");
}
(bool otherSideCallSuccess, bytes memory burnData) = _synthesis.call(burnCalldata);
if (!otherSideCallSuccess) {
revert(RevertMessageParser.getRevertMessage(burnData, "MetaRouterV2: revertSynthesizeRequest call failed"));
}
}
/**
* @notice Implements an internal swap on stable router and final method call
* @dev called by Synthesis in metaMint() method
* @param _metaMintTransaction metaMint offchain transaction data
*/
function metaMintSwap(
MetaRouteStructs.MetaMintTransaction calldata _metaMintTransaction
) external {
address finalCallToken = _metaMintTransaction.swapTokens[0];
if (_metaMintTransaction.secondSwapCalldata.length != 0) {
// internal swap
(bool internalSwapSuccess, bytes memory internalSwapData) = _externalCall(
_metaMintTransaction.swapTokens[0],
_metaMintTransaction.amount,
_metaMintTransaction.secondDexRouter,
_metaMintTransaction.secondSwapCalldata,
36
);
if (!internalSwapSuccess) {
revert(RevertMessageParser.getRevertMessage(internalSwapData, "MetaRouter: internal swap failed"));
}
finalCallToken = _metaMintTransaction.swapTokens[1];
}
if (_metaMintTransaction.finalCalldata.length != 0) {
// patch crossChainID
bytes32 crossChainID = _metaMintTransaction.crossChainID;
bytes memory calldata_ = _metaMintTransaction.finalCalldata;
assembly {
mstore(add(calldata_, 132), crossChainID)
}
uint256 finalAmountIn = IERC20(finalCallToken).balanceOf(address(this));
// external call
(bool finalSuccess, bytes memory finalData) = _externalCall(
finalCallToken,
finalAmountIn,
_metaMintTransaction.finalReceiveSide,
calldata_,
_metaMintTransaction.finalOffset
);
if (!finalSuccess) {
revert(RevertMessageParser.getRevertMessage(finalData, "MetaRouter: final call failed"));
}
}
uint256 amountOut = IERC20(_metaMintTransaction.swapTokens[_metaMintTransaction.swapTokens.length - 1]).balanceOf(address(this));
if (amountOut != 0) {
TransferHelper.safeTransfer(
_metaMintTransaction.swapTokens[_metaMintTransaction.swapTokens.length - 1],
_metaMintTransaction.to,
amountOut
);
}
}
function sendTransitToken(address _token, address _to, uint256 _amount) external {
TransferHelper.safeTransfer(
_token,
_to,
_amount
);
emit TransitTokenSent(_to, _amount, _token);
}
/**
* @notice Implements call of some operation with token
* @dev Internal function used in metaMintSwap() and externalCall()
* @param _token token address
* @param _amount amount of _token
* @param _receiveSide address of contract on which method will be called
* @param _calldata encoded method call
* @param _offset shift to patch the _amount to calldata
*/
function _externalCall(
address _token,
uint256 _amount,
address _receiveSide,
bytes memory _calldata,
uint256 _offset
) internal returns (bool success, bytes memory data) {
require(_receiveSide != address(metaRouterGateway), "MetaRouter: invalid receiveSide");
_lazyApprove(_token, _receiveSide, _amount);
if(_offset != 0) {
assembly {
mstore(add(_calldata, _offset), _amount)
}
}
{
uint256 size;
address toCheck = _receiveSide;
assembly {
size := extcodesize(toCheck)
}
require(size != 0, "MetaRouter: call for a non-contract account");
}
(success, data) = _receiveSide.call(_calldata);
}
/**
* @notice Implements approve
* @dev Internal function used to approve the token spending
* @param _token token address
* @param _to address to approve
* @param _amount amount for which approve will be given
*/
function _lazyApprove(address _token, address _to, uint256 _amount) internal {
if (IERC20(_token).allowance(address(this), _to) < _amount) {
TransferHelper.safeApprove(_token, _to, type(uint256).max);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "../types/BtcSerial.sol";
library MetaRouteStructs {
struct MetaBurnTransaction {
uint256 stableBridgingFee;
uint256 amount;
bytes32 crossChainID;
address syntCaller;
address finalReceiveSide;
address sToken;
bytes finalCallData;
uint256 finalOffset;
address chain2address;
address receiveSide;
address oppositeBridge;
address revertableAddress;
uint256 chainID;
bytes32 clientID;
}
struct MetaMintTransaction {
uint256 stableBridgingFee;
uint256 amount;
bytes32 crossChainID;
bytes32 externalID;
address tokenReal;
uint256 chainID;
address to;
address[] swapTokens;
address secondDexRouter;
bytes secondSwapCalldata;
address finalReceiveSide;
bytes finalCalldata;
uint256 finalOffset;
}
struct MetaMintTransactionBTC {
uint256 stableBridgingFee;
uint256 amount;
BtcSerial serial;
bytes32 crossChainID;
bytes32 externalID;
address tokenReal;
uint256 chainID;
address to;
address receiveSide;
bytes receiveSideCalldata;
uint256 receiveSideOffset;
}
struct MetaRouteTransaction {
bytes firstSwapCalldata;
bytes secondSwapCalldata;
address[] approvedTokens;
address firstDexRouter;
address secondDexRouter;
uint256 amount;
bool nativeIn;
address relayRecipient;
bytes otherSideCalldata;
}
struct MetaSynthesizeTransaction {
uint256 stableBridgingFee;
uint256 amount;
address rtoken;
address chain2address;
address receiveSide;
address oppositeBridge;
address syntCaller;
uint256 chainID;
address[] swapTokens;
address secondDexRouter;
bytes secondSwapCalldata;
address finalReceiveSide;
bytes finalCalldata;
uint256 finalOffset;
address revertableAddress;
bytes32 clientID;
}
struct MetaRevertTransaction {
uint256 stableBridgingFee;
bytes32 internalID;
address receiveSide;
address managerChainBridge;
address sourceChainBridge;
uint256 managerChainId;
uint256 sourceChainId;
address router;
bytes swapCalldata;
address sourceChainSynthesis;
address burnToken;
bytes burnCalldata;
bytes32 clientID;
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
/**
* @title MetaRouterGateway
* @notice During the `metaRoute` transaction `MetaRouter` (only) claims user's tokens
* from `MetaRoutetGateway` contract and then operates with them.
*/
contract MetaRouterGateway {
address public immutable metaRouter;
modifier onlyMetarouter() {
require(metaRouter == msg.sender, "Symb: caller is not the metarouter");
_;
}
constructor(address _metaRouter) {
metaRouter = _metaRouter;
}
function claimTokens(
address _token,
address _from,
uint256 _amount
) external onlyMetarouter {
TransferHelper.safeTransferFrom(_token, _from, metaRouter, _amount);
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.19;
type BtcSerial is uint64;
using {inc, equal as ==} for BtcSerial global;
function inc(BtcSerial a) pure returns (BtcSerial) {
return BtcSerial.wrap(BtcSerial.unwrap(a) + 1);
}
function equal(BtcSerial a, BtcSerial b) pure returns (bool) {
return BtcSerial.unwrap(a) == BtcSerial.unwrap(b);
}// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
library RevertMessageParser {
function getRevertMessage(bytes memory _data, string memory _defaultMessage) internal pure returns (string memory) {
// If the _data length is less than 68, then the transaction failed silently (without a revert message)
if (_data.length < 68) return _defaultMessage;
assembly {
// Slice the sighash
_data := add(_data, 0x04)
}
return abi.decode(_data, (string));
}
}{
"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[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"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":"TransitTokenSent","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_receiveSide","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"},{"internalType":"uint256","name":"_offset","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"externalCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"stableBridgingFee","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"crossChainID","type":"bytes32"},{"internalType":"bytes32","name":"externalID","type":"bytes32"},{"internalType":"address","name":"tokenReal","type":"address"},{"internalType":"uint256","name":"chainID","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"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":"struct MetaRouteStructs.MetaMintTransaction","name":"_metaMintTransaction","type":"tuple"}],"name":"metaMintSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"firstSwapCalldata","type":"bytes"},{"internalType":"bytes","name":"secondSwapCalldata","type":"bytes"},{"internalType":"address[]","name":"approvedTokens","type":"address[]"},{"internalType":"address","name":"firstDexRouter","type":"address"},{"internalType":"address","name":"secondDexRouter","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"nativeIn","type":"bool"},{"internalType":"address","name":"relayRecipient","type":"address"},{"internalType":"bytes","name":"otherSideCalldata","type":"bytes"}],"internalType":"struct MetaRouteStructs.MetaRouteTransaction","name":"_metarouteTransaction","type":"tuple"}],"name":"metaRoute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"metaRouterGateway","outputs":[{"internalType":"contract MetaRouterGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"bytes","name":"_swapCalldata","type":"bytes"},{"internalType":"address","name":"_burnToken","type":"address"},{"internalType":"address","name":"_synthesis","type":"address"},{"internalType":"bytes","name":"_burnCalldata","type":"bytes"}],"name":"returnSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendTransitToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a080604052346100aa57610414818101906001600160401b0382118383101761009457602091839161170983393081520301906000f080156100885760805260405161165990816100b08239608051818181610511015281816106a30152818161076b015281816108a7015281816109b801528181610aa10152818161130d01526113bd0152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe608060405260048036101561001357600080fd5b6000803560e01c9182633bc788351461007c575050806362770ff814610077578063732cffe914610072578063a11b11981461006d578063c394a5da146100685763f5b697a51461006357600080fd5b610ac5565b610a81565b6105a6565b610414565b61035a565b34610340576020600319818136011261033c5782359067ffffffffffffffff8211610338576101a08285019183360301126103385760e4820193836100d26100cd6100c78886610b71565b90610bbe565b610bfc565b61012485016100e18186610c9c565b90506102ca575b5061016485016100f88186610c9c565b90506101f3575b5050610165916101446101386101386100cd8a61012b610132610122838c610b71565b9290938c610b71565b9050610eb3565b91610bec565b6001600160a01b031690565b6040516370a0823160e01b8152309281019283529384928391829160200190565b03915afa9384156101ee5786946101bf575b505082610182578480f35b60c46101aa6100cd838761013261012b6101a26101b79b6101b199610b71565b939094610b71565b9201610bfc565b9061106e565b818080808480f35b6101df929450803d106101e7575b6101d78183610c6d565b810190610e6d565b918580610177565b503d6101cd565b610c90565b61020a9192506102039085610c9c565b3691610e7c565b604485013560848201526040516370a0823160e01b8152308482019081529092919087908490819060200103816001600160a01b0386165afa80156101ee5761026f938a916102ad575b506102626101448801610bfc565b90610184880135936113af565b901561027d578085916100ff565b61028f906102896112c5565b906115a1565b906102a960405192839262461bcd60e51b84528301610e41565b0390fd5b6102c49150883d8a116101e7576101d78183610c6d565b8a610254565b905061030891506102e16100cd6100c78987610b71565b906102fc6102036102f56101048901610bfc565b9287610c9c565b916024870135906112fe565b901561032c5750836103266100cd6103208886610b71565b90610bdd565b886100e8565b61028f9061028961128c565b8480fd5b8380fd5b5080fd5b6001600160a01b0381160361035557565b600080fd5b34610355576060600319360112610355577f0ac368c799fd87078497a837c3b184349108599d7c108f68710d3321ba416c6f60043561039881610344565b6024356103a481610344565b6103e1604435926103b684848361106e565b604051938493849193929060409160608401956001600160a01b038093168552602085015216910152565b0390a1005b9181601f840112156103555782359167ffffffffffffffff8311610355576020838186019501011161035557565b346103555760e0600319360112610355576004803561043281610344565b6044359061043f82610344565b67ffffffffffffffff916064358381116103555761046090369086016103e6565b9190936084359361047085610344565b60a4359261047d84610344565b60c435928311610355576104a461049a6104ae9436908b016103e6565b9890963691610e7c565b91602435906112fe565b901561059957506040516370a0823160e01b81523086820190815290939060209085908190830103816001600160a01b038095165afa9283156101ee576000958695869561056d575b5061053b9291610508913691610e7c565b936064850152807f00000000000000000000000000000000000000000000000000000000000000001690831614156111e2565b610547813b1515610d1a565b82602083519301915af1610559610db5565b901561056157005b61028f9061028961122d565b6105089195509161058f61053b949360203d81116101e7576101d78183610c6d565b95915091926104f7565b61028f8691610289611183565b60206003199080823601126103555760049182359167ffffffffffffffff8311610355576101208385019284360301126103555760448301916105e98382610b71565b905060c48501936106006105fc86610bb1565b1590565b6109ae575b60a4860135946106158480610c9c565b9050610871575b50846024870161062c8186610c9c565b9050610704575b5050600095610686610203856101046106666100cd8c9b9a999861013261065e6106e09a8f9c610b71565b919092610eb3565b9461067f8a60e483019761067989610bfc565b90611412565b0190610c9c565b9460648601526106cc61069882610bfc565b6001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001691161415610faf565b6100cd6106d882610bfc565b3b1515610d1a565b9183519301915af16106f0610db5565b90156106f857005b61028f90610289610ffa565b849396509061079461071f6102036000959897948695610c9c565b918060248401526107546107456100cd8b61013261073d8d8c610b71565b919092610ed8565b9160848c019261067984610bfc565b6106cc61076082610bfc565b6001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001691161415610f05565b828683519301915af16107a5610db5565b901561086457506107cb6101386101386100cd6107c28786610b71565b6101328a610eb3565b938260405180966370a0823160e01b825281806107fa308d83019190916001600160a01b036020820193169052565b03915afa9586156101ee57610686610203600098946101046106666100cd6106e09761013261065e8f9e9b8f9c8e8e92610847575b50509e50505098505050509596935050819750610633565b61085d9250803d106101e7576101d78183610c6d565b388e61082f565b61028f8791610289610f76565b6105fc61088091969296610bb1565b610988575b506000806108d0606488016106cc61089c82610bfc565b6001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001691161415610ccf565b6108da8580610c9c565b906108ea60405180938193610d8b565b039134905af16108f8610db5565b901561097b57506109156101386101386100cd6103208887610b71565b8360405180926370a0823160e01b82528180610943308d83019190916001600160a01b036020820193169052565b03915afa9081156101ee5760009161095e575b50933861061c565b6109759150843d86116101e7576101d78183610c6d565b38610956565b61028f8791610289610de5565b6109a89061099c6100cd6100c78887610b71565b61067960648901610bfc565b38610885565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166109e86100cd6100c78487610b71565b90803b1561035557604080517f9fc314c80000000000000000000000000000000000000000000000000000000081526001600160a01b03909316838b0190815233602082015260a48a013591810191909152600091839182908490829060600103925af180156101ee57610a5d575b50610605565b80610a6a610a7092610c1c565b80610a76565b38610a57565b600091031261035557565b346103555760006003193601126103555760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103555760c060031936011261035557600435610ae281610344565b602435604435610af181610344565b60643567ffffffffffffffff811161035557610b14610b399136906004016103e6565b9092610b3160a43594610b2686610344565b608435933691610e7c565b9085876113af565b5015610b4157005b6103e1836103b684847f0ac368c799fd87078497a837c3b184349108599d7c108f68710d3321ba416c6f9761106e565b903590601e1981360301821215610355570180359067ffffffffffffffff821161035557602001918160051b3603831361035557565b8015150361035557565b35610bbb81610ba7565b90565b9015610bc75790565b634e487b7160e01b600052603260045260246000fd5b9060011015610bc75760200190565b9190811015610bc75760051b0190565b35610bbb81610344565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610c3057604052565b610c06565b6040810190811067ffffffffffffffff821117610c3057604052565b6060810190811067ffffffffffffffff821117610c3057604052565b90601f601f19910116810190811067ffffffffffffffff821117610c3057604052565b6040513d6000823e3d90fd5b903590601e1981360301821215610355570180359067ffffffffffffffff82116103555760200191813603831361035557565b15610cd657565b606460405162461bcd60e51b815260206004820152602060248201527f4d657461526f757465723a20696e76616c696420666972737420726f757465726044820152fd5b15610d2157565b608460405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201527f616374206163636f756e740000000000000000000000000000000000000000006064820152fd5b908092918237016000815290565b67ffffffffffffffff8111610c3057601f01601f191660200190565b3d15610de0573d90610dc682610d99565b91610dd46040519384610c6d565b82523d6000602084013e565b606090565b60405190610df282610c35565b601d82527f4d657461526f757465723a2066697273742073776170206661696c65640000006020830152565b60005b838110610e315750506000910152565b8181015183820152602001610e21565b601f19601f60409360208452610e668151809281602088015260208888019101610e1e565b0116010190565b90816020910312610355575190565b929192610e8882610d99565b91610e966040519384610c6d565b829481845281830111610355578281602093846000960137010152565b906000198201918211610ec257565b634e487b7160e01b600052601160045260246000fd5b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8201918211610ec257565b15610f0c57565b608460405162461bcd60e51b815260206004820152602160248201527f4d657461526f757465723a20696e76616c6964207365636f6e6420726f75746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b60405190610f8382610c35565b601e82527f4d657461526f757465723a207365636f6e642073776170206661696c656400006020830152565b15610fb657565b606460405162461bcd60e51b815260206004820152601d60248201527f4d657461526f757465723a20696e76616c696420726563697069656e740000006044820152fd5b6040519061100782610c51565b602282527f65640000000000000000000000000000000000000000000000000000000000006040837f4d657461526f757465723a206f7468657220736964652063616c6c206661696c60208201520152565b908160209103126103555751610bbb81610ba7565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082019081526001600160a01b039093166024820152604481019390935260009283929083906110d081606481015b03601f198101835282610c6d565b51925af16110dc610db5565b81611154575b50156110ea57565b608460405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152fd5b8051801592508215611169575b5050386110e2565b61117c9250602080918301019101611059565b3880611161565b6040519061119082610c51565b602282527f65640000000000000000000000000000000000000000000000000000000000006040837f4d657461526f7574657256323a20696e7465726e616c2073776170206661696c60208201520152565b156111e957565b606460405162461bcd60e51b815260206004820152601f60248201527f4d657461526f7574657256323a20696e76616c696420726563697069656e74006044820152fd5b6040519061123a82610c51565b603182527f71756573742063616c6c206661696c65640000000000000000000000000000006040837f4d657461526f7574657256323a2072657665727453796e74686573697a65526560208201520152565b6040519061129982610c35565b602082527f4d657461526f757465723a20696e7465726e616c2073776170206661696c65646020830152565b604051906112d282610c35565b601d82527f4d657461526f757465723a2066696e616c2063616c6c206661696c65640000006020830152565b919290926001600160a01b03807f0000000000000000000000000000000000000000000000000000000000000000169082161461136b5783611344600095838796611412565b6024830152611355813b1515610d1a565b82602083519301915af1611367610db5565b9091565b606460405162461bcd60e51b815260206004820152601f60248201527f4d657461526f757465723a20696e76616c6964207265636569766553696465006044820152fd5b9291906001600160a01b03807f0000000000000000000000000000000000000000000000000000000000000000169083161461136b576000946113f482848897611412565b80611408575b5050611355813b1515610d1a565b83015238806113fa565b90604051927fdd62ed3e000000000000000000000000000000000000000000000000000000008452306004850152836001600160a01b038084166024830152816044602097889388165afa9081156101ee57600091611584575b501061147757505050565b6000918291826040516114cf816110c2898201957f095ea7b3000000000000000000000000000000000000000000000000000000008752602483016020600019919392936001600160a01b0360408201951681520152565b51925af16114db610db5565b81611554575b50156114ea5750565b6084906040519062461bcd60e51b82526004820152602b60248201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060448201527f726f7665206661696c65640000000000000000000000000000000000000000006064820152fd5b8051801592508390831561156c575b505050386114e1565b61157c9350820181019101611059565b388281611563565b61159b9150853d87116101e7576101d78183610c6d565b3861146c565b90604482511061161e57506004810151810190602081602484019303126103555760248101519067ffffffffffffffff82116103555701816043820112156103555760248101516115f181610d99565b926115ff6040519485610c6d565b8184526044828401011161035557610bbb916044602085019101610e1e565b90509056fea26469706673582212208ae2e7ee29ac155a6f194db475f55ef17ac8bb432ff52dcf00bd286524e2ab8564736f6c6343000813003360a03461006f57601f61041438819003918201601f19168301916001600160401b038311848410176100745780849260209460405283398101031261006f57516001600160a01b038116810361006f57608052604051610389908161008b82396080518181816066015260d50152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe608060408181526004918236101561001657600080fd5b600092833560e01c9182639fc314c81461008e57505063dbec15bb1461003b57600080fd5b3461008a578160031936011261008a576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5080fd5b9150913461034f57606060031936011261034f5773ffffffffffffffffffffffffffffffffffffffff918335838116810361034b57602493843590808216809203610347577f000000000000000000000000000000000000000000000000000000000000000016923384036102c7575083519260208401917f23b872dd00000000000000000000000000000000000000000000000000000000835286850152604484015260443560648401526064835260a083019267ffffffffffffffff93818110858211176102b557855251879283929083905af1903d156102ad573d81811161029b578351917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f85011601168301908382109082111761028957845281523d86602083013e5b8161024d575b50156101cb578380f35b60849291602060319251937f08c379a00000000000000000000000000000000000000000000000000000000085528401528201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152fd5b8051801592508215610262575b5050386101c1565b81925090602091810103126102855760200151801515810361028557388061025a565b8480fd5b8588604189634e487b7160e01b835252fd5b8487604188634e487b7160e01b835252fd5b5060606101bb565b868960418a634e487b7160e01b835252fd5b8060228760208a7f08c379a000000000000000000000000000000000000000000000000000000000608496528401528201527f53796d623a2063616c6c6572206973206e6f7420746865206d657461726f757460448201527f65720000000000000000000000000000000000000000000000000000000000006064820152fd5b8780fd5b8580fd5b8380fdfea26469706673582212209687b8b71f09666b6e9bfc783feec19346340094ca8cf0d17818f12086e4de7e64736f6c63430008130033
Deployed Bytecode
0x608060405260048036101561001357600080fd5b6000803560e01c9182633bc788351461007c575050806362770ff814610077578063732cffe914610072578063a11b11981461006d578063c394a5da146100685763f5b697a51461006357600080fd5b610ac5565b610a81565b6105a6565b610414565b61035a565b34610340576020600319818136011261033c5782359067ffffffffffffffff8211610338576101a08285019183360301126103385760e4820193836100d26100cd6100c78886610b71565b90610bbe565b610bfc565b61012485016100e18186610c9c565b90506102ca575b5061016485016100f88186610c9c565b90506101f3575b5050610165916101446101386101386100cd8a61012b610132610122838c610b71565b9290938c610b71565b9050610eb3565b91610bec565b6001600160a01b031690565b6040516370a0823160e01b8152309281019283529384928391829160200190565b03915afa9384156101ee5786946101bf575b505082610182578480f35b60c46101aa6100cd838761013261012b6101a26101b79b6101b199610b71565b939094610b71565b9201610bfc565b9061106e565b818080808480f35b6101df929450803d106101e7575b6101d78183610c6d565b810190610e6d565b918580610177565b503d6101cd565b610c90565b61020a9192506102039085610c9c565b3691610e7c565b604485013560848201526040516370a0823160e01b8152308482019081529092919087908490819060200103816001600160a01b0386165afa80156101ee5761026f938a916102ad575b506102626101448801610bfc565b90610184880135936113af565b901561027d578085916100ff565b61028f906102896112c5565b906115a1565b906102a960405192839262461bcd60e51b84528301610e41565b0390fd5b6102c49150883d8a116101e7576101d78183610c6d565b8a610254565b905061030891506102e16100cd6100c78987610b71565b906102fc6102036102f56101048901610bfc565b9287610c9c565b916024870135906112fe565b901561032c5750836103266100cd6103208886610b71565b90610bdd565b886100e8565b61028f9061028961128c565b8480fd5b8380fd5b5080fd5b6001600160a01b0381160361035557565b600080fd5b34610355576060600319360112610355577f0ac368c799fd87078497a837c3b184349108599d7c108f68710d3321ba416c6f60043561039881610344565b6024356103a481610344565b6103e1604435926103b684848361106e565b604051938493849193929060409160608401956001600160a01b038093168552602085015216910152565b0390a1005b9181601f840112156103555782359167ffffffffffffffff8311610355576020838186019501011161035557565b346103555760e0600319360112610355576004803561043281610344565b6044359061043f82610344565b67ffffffffffffffff916064358381116103555761046090369086016103e6565b9190936084359361047085610344565b60a4359261047d84610344565b60c435928311610355576104a461049a6104ae9436908b016103e6565b9890963691610e7c565b91602435906112fe565b901561059957506040516370a0823160e01b81523086820190815290939060209085908190830103816001600160a01b038095165afa9283156101ee576000958695869561056d575b5061053b9291610508913691610e7c565b936064850152807f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c2781690831614156111e2565b610547813b1515610d1a565b82602083519301915af1610559610db5565b901561056157005b61028f9061028961122d565b6105089195509161058f61053b949360203d81116101e7576101d78183610c6d565b95915091926104f7565b61028f8691610289611183565b60206003199080823601126103555760049182359167ffffffffffffffff8311610355576101208385019284360301126103555760448301916105e98382610b71565b905060c48501936106006105fc86610bb1565b1590565b6109ae575b60a4860135946106158480610c9c565b9050610871575b50846024870161062c8186610c9c565b9050610704575b5050600095610686610203856101046106666100cd8c9b9a999861013261065e6106e09a8f9c610b71565b919092610eb3565b9461067f8a60e483019761067989610bfc565b90611412565b0190610c9c565b9460648601526106cc61069882610bfc565b6001600160a01b03807f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c2781691161415610faf565b6100cd6106d882610bfc565b3b1515610d1a565b9183519301915af16106f0610db5565b90156106f857005b61028f90610289610ffa565b849396509061079461071f6102036000959897948695610c9c565b918060248401526107546107456100cd8b61013261073d8d8c610b71565b919092610ed8565b9160848c019261067984610bfc565b6106cc61076082610bfc565b6001600160a01b03807f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c2781691161415610f05565b828683519301915af16107a5610db5565b901561086457506107cb6101386101386100cd6107c28786610b71565b6101328a610eb3565b938260405180966370a0823160e01b825281806107fa308d83019190916001600160a01b036020820193169052565b03915afa9586156101ee57610686610203600098946101046106666100cd6106e09761013261065e8f9e9b8f9c8e8e92610847575b50509e50505098505050509596935050819750610633565b61085d9250803d106101e7576101d78183610c6d565b388e61082f565b61028f8791610289610f76565b6105fc61088091969296610bb1565b610988575b506000806108d0606488016106cc61089c82610bfc565b6001600160a01b03807f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c2781691161415610ccf565b6108da8580610c9c565b906108ea60405180938193610d8b565b039134905af16108f8610db5565b901561097b57506109156101386101386100cd6103208887610b71565b8360405180926370a0823160e01b82528180610943308d83019190916001600160a01b036020820193169052565b03915afa9081156101ee5760009161095e575b50933861061c565b6109759150843d86116101e7576101d78183610c6d565b38610956565b61028f8791610289610de5565b6109a89061099c6100cd6100c78887610b71565b61067960648901610bfc565b38610885565b6001600160a01b037f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c278166109e86100cd6100c78487610b71565b90803b1561035557604080517f9fc314c80000000000000000000000000000000000000000000000000000000081526001600160a01b03909316838b0190815233602082015260a48a013591810191909152600091839182908490829060600103925af180156101ee57610a5d575b50610605565b80610a6a610a7092610c1c565b80610a76565b38610a57565b600091031261035557565b346103555760006003193601126103555760206040516001600160a01b037f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c278168152f35b346103555760c060031936011261035557600435610ae281610344565b602435604435610af181610344565b60643567ffffffffffffffff811161035557610b14610b399136906004016103e6565b9092610b3160a43594610b2686610344565b608435933691610e7c565b9085876113af565b5015610b4157005b6103e1836103b684847f0ac368c799fd87078497a837c3b184349108599d7c108f68710d3321ba416c6f9761106e565b903590601e1981360301821215610355570180359067ffffffffffffffff821161035557602001918160051b3603831361035557565b8015150361035557565b35610bbb81610ba7565b90565b9015610bc75790565b634e487b7160e01b600052603260045260246000fd5b9060011015610bc75760200190565b9190811015610bc75760051b0190565b35610bbb81610344565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610c3057604052565b610c06565b6040810190811067ffffffffffffffff821117610c3057604052565b6060810190811067ffffffffffffffff821117610c3057604052565b90601f601f19910116810190811067ffffffffffffffff821117610c3057604052565b6040513d6000823e3d90fd5b903590601e1981360301821215610355570180359067ffffffffffffffff82116103555760200191813603831361035557565b15610cd657565b606460405162461bcd60e51b815260206004820152602060248201527f4d657461526f757465723a20696e76616c696420666972737420726f757465726044820152fd5b15610d2157565b608460405162461bcd60e51b815260206004820152602b60248201527f4d657461526f757465723a2063616c6c20666f722061206e6f6e2d636f6e747260448201527f616374206163636f756e740000000000000000000000000000000000000000006064820152fd5b908092918237016000815290565b67ffffffffffffffff8111610c3057601f01601f191660200190565b3d15610de0573d90610dc682610d99565b91610dd46040519384610c6d565b82523d6000602084013e565b606090565b60405190610df282610c35565b601d82527f4d657461526f757465723a2066697273742073776170206661696c65640000006020830152565b60005b838110610e315750506000910152565b8181015183820152602001610e21565b601f19601f60409360208452610e668151809281602088015260208888019101610e1e565b0116010190565b90816020910312610355575190565b929192610e8882610d99565b91610e966040519384610c6d565b829481845281830111610355578281602093846000960137010152565b906000198201918211610ec257565b634e487b7160e01b600052601160045260246000fd5b907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8201918211610ec257565b15610f0c57565b608460405162461bcd60e51b815260206004820152602160248201527f4d657461526f757465723a20696e76616c6964207365636f6e6420726f75746560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152fd5b60405190610f8382610c35565b601e82527f4d657461526f757465723a207365636f6e642073776170206661696c656400006020830152565b15610fb657565b606460405162461bcd60e51b815260206004820152601d60248201527f4d657461526f757465723a20696e76616c696420726563697069656e740000006044820152fd5b6040519061100782610c51565b602282527f65640000000000000000000000000000000000000000000000000000000000006040837f4d657461526f757465723a206f7468657220736964652063616c6c206661696c60208201520152565b908160209103126103555751610bbb81610ba7565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082019081526001600160a01b039093166024820152604481019390935260009283929083906110d081606481015b03601f198101835282610c6d565b51925af16110dc610db5565b81611154575b50156110ea57565b608460405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152fd5b8051801592508215611169575b5050386110e2565b61117c9250602080918301019101611059565b3880611161565b6040519061119082610c51565b602282527f65640000000000000000000000000000000000000000000000000000000000006040837f4d657461526f7574657256323a20696e7465726e616c2073776170206661696c60208201520152565b156111e957565b606460405162461bcd60e51b815260206004820152601f60248201527f4d657461526f7574657256323a20696e76616c696420726563697069656e74006044820152fd5b6040519061123a82610c51565b603182527f71756573742063616c6c206661696c65640000000000000000000000000000006040837f4d657461526f7574657256323a2072657665727453796e74686573697a65526560208201520152565b6040519061129982610c35565b602082527f4d657461526f757465723a20696e7465726e616c2073776170206661696c65646020830152565b604051906112d282610c35565b601d82527f4d657461526f757465723a2066696e616c2063616c6c206661696c65640000006020830152565b919290926001600160a01b03807f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c278169082161461136b5783611344600095838796611412565b6024830152611355813b1515610d1a565b82602083519301915af1611367610db5565b9091565b606460405162461bcd60e51b815260206004820152601f60248201527f4d657461526f757465723a20696e76616c6964207265636569766553696465006044820152fd5b9291906001600160a01b03807f000000000000000000000000adb2d3b711bb8d8ea92ff70292c466140432c278169083161461136b576000946113f482848897611412565b80611408575b5050611355813b1515610d1a565b83015238806113fa565b90604051927fdd62ed3e000000000000000000000000000000000000000000000000000000008452306004850152836001600160a01b038084166024830152816044602097889388165afa9081156101ee57600091611584575b501061147757505050565b6000918291826040516114cf816110c2898201957f095ea7b3000000000000000000000000000000000000000000000000000000008752602483016020600019919392936001600160a01b0360408201951681520152565b51925af16114db610db5565b81611554575b50156114ea5750565b6084906040519062461bcd60e51b82526004820152602b60248201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060448201527f726f7665206661696c65640000000000000000000000000000000000000000006064820152fd5b8051801592508390831561156c575b505050386114e1565b61157c9350820181019101611059565b388281611563565b61159b9150853d87116101e7576101d78183610c6d565b3861146c565b90604482511061161e57506004810151810190602081602484019303126103555760248101519067ffffffffffffffff82116103555701816043820112156103555760248101516115f181610d99565b926115ff6040519485610c6d565b8184526044828401011161035557610bbb916044602085019101610e1e565b90509056fea26469706673582212208ae2e7ee29ac155a6f194db475f55ef17ac8bb432ff52dcf00bd286524e2ab8564736f6c63430008130033
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.