Source Code
Latest 25 from a total of 80,285 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Bridge | 109774603 | 807 days ago | IN | 0 ETH | 0.000260986002 | ||||
| Bridge | 109774595 | 807 days ago | IN | 0.0755 ETH | 0.000080629011 | ||||
| Bridge | 109774392 | 807 days ago | IN | 0.007 ETH | 0.000079630209 | ||||
| Bridge | 109773967 | 807 days ago | IN | 0 ETH | 0.000156247129 | ||||
| Bridge | 109773781 | 807 days ago | IN | 0.07 ETH | 0.000082492371 | ||||
| Bridge | 109773766 | 807 days ago | IN | 0 ETH | 0.000268364163 | ||||
| Bridge | 109773763 | 807 days ago | IN | 0.011 ETH | 0.000079545351 | ||||
| Bridge | 109773584 | 807 days ago | IN | 0 ETH | 0.000100139122 | ||||
| Bridge | 109773106 | 807 days ago | IN | 0.065 ETH | 0.000087318722 | ||||
| Bridge | 109772675 | 807 days ago | IN | 0.159 ETH | 0.000099953241 | ||||
| Bridge | 109772514 | 807 days ago | IN | 0 ETH | 0.000383765841 | ||||
| Bridge | 109772380 | 807 days ago | IN | 0 ETH | 0.00015500927 | ||||
| Bridge | 109772159 | 807 days ago | IN | 1.05 ETH | 0.000125198486 | ||||
| Bridge | 109772066 | 807 days ago | IN | 0.015 ETH | 0.000146851319 | ||||
| Bridge | 109771884 | 807 days ago | IN | 0.35 ETH | 0.000108154276 | ||||
| Bridge | 109771608 | 807 days ago | IN | 0.134 ETH | 0.000152623132 | ||||
| Bridge | 109771568 | 807 days ago | IN | 0 ETH | 0.000150048623 | ||||
| Bridge | 109771563 | 807 days ago | IN | 0.037 ETH | 0.000128423642 | ||||
| Bridge | 109771394 | 807 days ago | IN | 0.0088 ETH | 0.000131609697 | ||||
| Bridge | 109771232 | 807 days ago | IN | 0.007 ETH | 0.000140318742 | ||||
| Bridge | 109771194 | 807 days ago | IN | 0 ETH | 0.000186835013 | ||||
| Bridge | 109771164 | 807 days ago | IN | 0 ETH | 0.000185880893 | ||||
| Bridge | 109771162 | 807 days ago | IN | 0.04 ETH | 0.000148662489 | ||||
| Bridge | 109770413 | 807 days ago | IN | 0 ETH | 0.000314272318 | ||||
| Bridge | 109770335 | 807 days ago | IN | 0 ETH | 0.000387391517 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 109774595 | 807 days ago | 0.0755 ETH | ||||
| 109774392 | 807 days ago | 0.007 ETH | ||||
| 109773781 | 807 days ago | 0.07 ETH | ||||
| 109773763 | 807 days ago | 0.011 ETH | ||||
| 109773106 | 807 days ago | 0.065 ETH | ||||
| 109772675 | 807 days ago | 0.159 ETH | ||||
| 109772159 | 807 days ago | 1.05 ETH | ||||
| 109772066 | 807 days ago | 0.015 ETH | ||||
| 109771884 | 807 days ago | 0.35 ETH | ||||
| 109771608 | 807 days ago | 0.134 ETH | ||||
| 109771563 | 807 days ago | 0.037 ETH | ||||
| 109771394 | 807 days ago | 0.0088 ETH | ||||
| 109771232 | 807 days ago | 0.007 ETH | ||||
| 109771162 | 807 days ago | 0.04 ETH | ||||
| 109769818 | 807 days ago | 0.025011 ETH | ||||
| 109769791 | 807 days ago | 0.59 ETH | ||||
| 109769330 | 807 days ago | 0.44 ETH | ||||
| 109768719 | 807 days ago | 0.057 ETH | ||||
| 109768677 | 807 days ago | 0.615 ETH | ||||
| 109768553 | 807 days ago | 0.394 ETH | ||||
| 109768466 | 807 days ago | 0.68 ETH | ||||
| 109768174 | 807 days ago | 0.1334 ETH | ||||
| 109767515 | 808 days ago | 0.1477 ETH | ||||
| 109767449 | 808 days ago | 0.3492 ETH | ||||
| 109767385 | 808 days ago | 0.151 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MetaBridge
Compiler Version
v0.8.1+commit.df193b15
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IAdapter, IBridge, ISpender} from "contracts/interfaces/Exports.sol";
import {Constants} from "contracts/utils/Exports.sol";
import "./Spender.sol";
contract MetaBridge is IBridge, Ownable, Pausable, ReentrancyGuard {
using SafeERC20 for IERC20;
using Address for address;
ISpender public immutable spender;
// Mapping of adapterId to adapter
mapping(string => address) public adapters;
mapping(string => bool) public adapterRemoved;
constructor() {
spender = new Spender();
}
/**
* @notice Sets the adapter for an aggregator. It can't be changed later.
* @param adapterId Aggregator's identifier
* @param adapterAddress Address of the contract that contains the logic for this aggregator
*/
function setAdapter(string calldata adapterId, address adapterAddress)
external
override
onlyOwner
{
require(adapterAddress.isContract(), "ADAPTER_IS_NOT_A_CONTRACT");
require(!adapterRemoved[adapterId], "ADAPTER_REMOVED");
require(adapters[adapterId] == address(0), "ADAPTER_EXISTS");
require(bytes(adapterId).length > 0, "INVALID_ADAPTED_ID");
adapters[adapterId] = adapterAddress;
emit AdapterSet(adapterId, adapterAddress);
}
/**
* @notice Removes the adapter for an existing aggregator. This can't be undone.
* @param adapterId Adapter's identifier
*/
function removeAdapter(string calldata adapterId)
external
override
onlyOwner
{
require(adapters[adapterId] != address(0), "ADAPTER_DOES_NOT_EXIST");
delete adapters[adapterId];
adapterRemoved[adapterId] = true;
emit AdapterRemoved(adapterId);
}
/**
* @notice Performs a bridge
* @param adapterId Identifier of the aggregator to be used for the bridge
* @param srcToken Identifier of the source chain
* @param amount Amount of tokens to be transferred from the destination chain
* @param data Dynamic data which is passed in to the delegatecall made to the adapter
*/
function bridge(
string calldata adapterId,
address srcToken,
uint256 amount,
bytes calldata data
) external payable override whenNotPaused nonReentrant {
address adapter = adapters[adapterId];
require(adapter != address(0), "ADAPTER_NOT_FOUND");
// Move ERC20 funds to the spender
if (srcToken != Constants.NATIVE_TOKEN) {
require(msg.value == 0, "NATIVE_ASSET_SENT");
IERC20(srcToken).safeTransferFrom(
msg.sender,
address(spender),
amount
);
} else {
require(msg.value == amount, "MSGVALUE_AMOUNT_MISMATCH");
}
spender.bridge{value: msg.value}(
adapter,
abi.encodePacked(
// bridge signature
IAdapter.bridge.selector,
abi.encode(msg.sender),
data
)
);
}
/**
* @notice Prevents the bridge function from being executed until the contract is unpaused.
*/
function pauseBridge() external onlyOwner {
_pause();
}
/**
* @notice Unpauses the contract to make the bridge function callable by owner.
*/
function unpauseBridge() external onlyOwner {
_unpause();
}
}// 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 (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(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 (last updated v4.5.0) (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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
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/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}pragma solidity ^0.8.0;
import { IAdapter } from "./IAdapter.sol";
import { IBridge } from "./IBridge.sol";
import { ISpender } from "./ISpender.sol";pragma solidity ^0.8.0;
import { Constants } from "./Constants.sol";pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Address.sol";
import {IBridge, ISpender} from "contracts/interfaces/Exports.sol";
contract Spender is ISpender {
using Address for address;
IBridge public immutable metabridge;
constructor() public {
metabridge = IBridge(msg.sender);
}
/**
* @notice Performs a bridge
* @param adapter Address of the aggregator to be used for the bridge
* @param data Dynamic data which is passed in to the delegatecall made to the adapter
*/
function bridge(address adapter, bytes calldata data)
external
payable
override
{
require(msg.sender == address(metabridge), "FORBIDDEN");
adapter.functionDelegateCall(data, "ADAPTER_DELEGATECALL_FAILED");
}
}// 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;
}
}pragma solidity ^0.8.0;
interface IAdapter {
event Bridge(
address recipient,
address aggregator,
uint256 destChain,
address srcToken,
address destToken,
uint256 srcAmount
);
event Fee(address srcToken, address feeWallet, uint256 fee);
function bridge(
address recipient,
address aggregator,
address spender,
uint256 destChain,
address srcToken,
address destToken,
uint256 srcAmount,
bytes calldata data,
uint256 fee,
address payable feeWallet
) external payable;
}pragma solidity ^0.8.0;
interface IBridge {
event AdapterSet(
string adapterId,
address addr
);
event AdapterRemoved(string adapterId);
function setAdapter(string calldata adapterId, address adapterAddress) external;
function removeAdapter(string calldata adapterId) external;
function bridge(
string calldata adapterId,
address tokenFrom,
uint256 amount,
bytes calldata data
) external payable;
}pragma solidity ^0.8.0;
interface ISpender {
function bridge(address adapterAddress, bytes calldata data) external payable;
}pragma solidity ^0.8.0;
library Constants {
address internal constant NATIVE_TOKEN = 0x0000000000000000000000000000000000000000;
}{
"optimizer": {
"enabled": true,
"runs": 999999
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}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":"string","name":"adapterId","type":"string"}],"name":"AdapterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"adapterId","type":"string"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"AdapterSet","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"adapterRemoved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"adapters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"adapterId","type":"string"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"bridge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"adapterId","type":"string"}],"name":"removeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"adapterId","type":"string"},{"internalType":"address","name":"adapterAddress","type":"address"}],"name":"setAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spender","outputs":[{"internalType":"contract ISpender","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseBridge","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b50620000266200002062000079565b6200007d565b6000805460ff60a01b19169055600180556040516200004590620000cd565b604051809103906000f08015801562000062573d6000803e3d6000fd5b5060601b6001600160601b031916608052620000db565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105248062001afc83390190565b60805160601c6119f4620001086000396000818161061b015281816106800152610b5601526119f46000f3fe6080604052600436106100c75760003560e01c80638da5cb5b11610074578063b84f5d1e1161004e578063b84f5d1e146101cd578063e8edc816146101ed578063f2fde38b14610202576100c7565b80638da5cb5b14610176578063a82f143c14610198578063b5268389146101ad576100c7565b80635c975abb116100a55780635c975abb14610121578063715018a61461014c5780637dd0480f14610161576100c7565b806339122461146100cc5780633ce33bff146100ee5780633ef11fd714610101575b600080fd5b3480156100d857600080fd5b506100ec6100e73660046111e0565b610222565b005b6100ec6100fc366004611232565b6104b3565b34801561010d57600080fd5b506100ec61011c3660046111a0565b610780565b34801561012d57600080fd5b5061013661094f565b6040516101439190611517565b60405180910390f35b34801561015857600080fd5b506100ec610970565b34801561016d57600080fd5b506100ec6109ef565b34801561018257600080fd5b5061018b610a6a565b6040516101439190611496565b3480156101a457600080fd5b506100ec610a86565b3480156101b957600080fd5b506101366101c83660046112bc565b610b01565b3480156101d957600080fd5b5061018b6101e83660046112bc565b610b21565b3480156101f957600080fd5b5061018b610b54565b34801561020e57600080fd5b506100ec61021d366004611166565b610b78565b61022a610c44565b73ffffffffffffffffffffffffffffffffffffffff16610248610a6a565b73ffffffffffffffffffffffffffffffffffffffff161461029e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b60405180910390fd5b6102bd8173ffffffffffffffffffffffffffffffffffffffff16610c48565b6102f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611583565b60038383604051610305929190611486565b9081526040519081900360200190205460ff161561034f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611898565b600073ffffffffffffffffffffffffffffffffffffffff1660028484604051610379929190611486565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16146103d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906117f5565b8161040d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906117be565b8060028484604051610420929190611486565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909316929092179091557ff9648cbc19f288e0f271f7e95311238912bf1ea8225e636a13bb1d2591260021906104a690859085908590611536565b60405180910390a1505050565b6104bb61094f565b156104f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611787565b6002600154141561052f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061192c565b600260018190555060006002878760405161054b929190611486565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff169050806105aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906116bc565b73ffffffffffffffffffffffffffffffffffffffff8516156106455734156105fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906116f3565b61064073ffffffffffffffffffffffffffffffffffffffff8616337f000000000000000000000000000000000000000000000000000000000000000087610c68565b61067e565b83341461067e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906115f1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634cfee326348363ab13824060e01b336040516020016106d59190611496565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261071592918a908a90602001611416565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016107419291906114e8565b6000604051808303818588803b15801561075a57600080fd5b505af115801561076e573d6000803e3d6000fd5b50506001805550505050505050505050565b610788610c44565b73ffffffffffffffffffffffffffffffffffffffff166107a6610a6a565b73ffffffffffffffffffffffffffffffffffffffff16146107f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b600073ffffffffffffffffffffffffffffffffffffffff166002838360405161081d929190611486565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16141561087b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611628565b6002828260405161088d929190611486565b90815260405190819003602001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556001906003906108d59085908590611486565b90815260405190819003602001812080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091557fb00061f7cc154fc23eb34671ab724fc7eb7b806abae871abae8f1eafce972135906109439084908490611522565b60405180910390a15050565b60005474010000000000000000000000000000000000000000900460ff1690565b610978610c44565b73ffffffffffffffffffffffffffffffffffffffff16610996610a6a565b73ffffffffffffffffffffffffffffffffffffffff16146109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b6109ed6000610d11565b565b6109f7610c44565b73ffffffffffffffffffffffffffffffffffffffff16610a15610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614610a62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b6109ed610d86565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b610a8e610c44565b73ffffffffffffffffffffffffffffffffffffffff16610aac610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614610af9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b6109ed610e44565b805160208183018101805160038252928201919093012091525460ff1681565b805160208183018101805160028252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b610b80610c44565b73ffffffffffffffffffffffffffffffffffffffff16610b9e610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b73ffffffffffffffffffffffffffffffffffffffff8116610c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061165f565b610c4181610d11565b50565b3390565b73ffffffffffffffffffffffffffffffffffffffff81163b15155b919050565b610d0b846323b872dd60e01b858585604051602401610c89939291906114b7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610ed3565b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610d8e61094f565b15610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611787565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e2d610c44565b604051610e3a9190611496565b60405180910390a1565b610e4c61094f565b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906115ba565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610e2d610c44565b6000610f35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610f8e9092919063ffffffff16565b805190915015610f895780806020019051810190610f539190611180565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906118cf565b505050565b6060610f9d8484600085610fa7565b90505b9392505050565b606082471015610fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061172a565b610fec85610c48565b611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611861565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161104b919061146a565b60006040518083038185875af1925050503d8060008114611088576040519150601f19603f3d011682016040523d82523d6000602084013e61108d565b606091505b509150915061109d8282866110a8565b979650505050505050565b606083156110b7575081610fa0565b8251156110c75782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959190611570565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c6357600080fd5b60008083601f840112611130578081fd5b50813567ffffffffffffffff811115611147578182fd5b60208301915083602082850101111561115f57600080fd5b9250929050565b600060208284031215611177578081fd5b610fa0826110fb565b600060208284031215611191578081fd5b81518015158114610fa0578182fd5b600080602083850312156111b2578081fd5b823567ffffffffffffffff8111156111c8578182fd5b6111d48582860161111f565b90969095509350505050565b6000806000604084860312156111f4578081fd5b833567ffffffffffffffff81111561120a578182fd5b6112168682870161111f565b90945092506112299050602085016110fb565b90509250925092565b6000806000806000806080878903121561124a578182fd5b863567ffffffffffffffff80821115611261578384fd5b61126d8a838b0161111f565b909850965086915061128160208a016110fb565b955060408901359450606089013591508082111561129d578384fd5b506112aa89828a0161111f565b979a9699509497509295939492505050565b6000602082840312156112cd578081fd5b813567ffffffffffffffff808211156112e4578283fd5b818401915084601f8301126112f7578283fd5b8135818111156113095761130961198f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561134f5761134f61198f565b81604052828152876020848701011115611367578586fd5b826020860160208301379182016020019490945295945050505050565b6000815180845261139c816020860160208601611963565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60007fffffffff00000000000000000000000000000000000000000000000000000000861682528451611450816004850160208901611963565b820183856004830137909201600401918252509392505050565b6000825161147c818460208701611963565b9190910192915050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8416825260406020830152610f9d6040830184611384565b901515815260200190565b600060208252610f9d6020830184866113ce565b60006040825261154a6040830185876113ce565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060208252610fa06020830184611384565b60208082526019908201527f414441505445525f49535f4e4f545f415f434f4e545241435400000000000000604082015260600190565b60208082526014908201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604082015260600190565b60208082526018908201527f4d534756414c55455f414d4f554e545f4d49534d415443480000000000000000604082015260600190565b60208082526016908201527f414441505445525f444f45535f4e4f545f455849535400000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f414441505445525f4e4f545f464f554e44000000000000000000000000000000604082015260600190565b60208082526011908201527f4e41544956455f41535345545f53454e54000000000000000000000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f5061757361626c653a2070617573656400000000000000000000000000000000604082015260600190565b60208082526012908201527f494e56414c49445f414441505445445f49440000000000000000000000000000604082015260600190565b6020808252600e908201527f414441505445525f455849535453000000000000000000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201527f414441505445525f52454d4f5645440000000000000000000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60005b8381101561197e578181015183820152602001611966565b83811115610d0b5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea2646970667358221220505946ba2bd7cb2fe6d7753585b08d0024602d2567641bc083ebe5843142141d64736f6c6343000801003360a060405234801561001057600080fd5b5033606081901b6080526104ec610038600039600081816086015261017a01526104ec6000f3fe6080604052600436106100295760003560e01c80634cfee3261461002e5780634ed6ef1914610043575b600080fd5b61004161003c3660046102d0565b61006e565b005b34801561004f57600080fd5b50610058610178565b6040516100659190610384565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100dd906103f6565b60405180910390fd5b61017282828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f414441505445525f44454c454741544543414c4c5f4641494c45440000000000602082015273ffffffffffffffffffffffffffffffffffffffff8816939250905061019c565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606101a784610261565b6101dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100dd9061042d565b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516102059190610368565b600060405180830381855af49150503d8060008114610240576040519150601f19603f3d011682016040523d82523d6000602084013e610245565b606091505b509150915061025582828661027d565b925050505b9392505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6060831561028c57508161025a565b82511561029c5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100dd91906103a5565b6000806000604084860312156102e4578283fd5b833573ffffffffffffffffffffffffffffffffffffffff81168114610307578384fd5b9250602084013567ffffffffffffffff80821115610323578384fd5b818601915086601f830112610336578384fd5b813581811115610344578485fd5b876020828501011115610355578485fd5b6020830194508093505050509250925092565b6000825161037a81846020870161048a565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60006020825282518060208401526103c481604085016020870161048a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526009908201527f464f5242494444454e0000000000000000000000000000000000000000000000604082015260600190565b60208082526026908201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60408201527f6e74726163740000000000000000000000000000000000000000000000000000606082015260800190565b60005b838110156104a557818101518382015260200161048d565b83811115610172575050600091015256fea26469706673582212207b15f79ea531aad4e9e60d594edff2ca83facf03d4fe3ed2661383326dfffe3f64736f6c63430008010033
Deployed Bytecode
0x6080604052600436106100c75760003560e01c80638da5cb5b11610074578063b84f5d1e1161004e578063b84f5d1e146101cd578063e8edc816146101ed578063f2fde38b14610202576100c7565b80638da5cb5b14610176578063a82f143c14610198578063b5268389146101ad576100c7565b80635c975abb116100a55780635c975abb14610121578063715018a61461014c5780637dd0480f14610161576100c7565b806339122461146100cc5780633ce33bff146100ee5780633ef11fd714610101575b600080fd5b3480156100d857600080fd5b506100ec6100e73660046111e0565b610222565b005b6100ec6100fc366004611232565b6104b3565b34801561010d57600080fd5b506100ec61011c3660046111a0565b610780565b34801561012d57600080fd5b5061013661094f565b6040516101439190611517565b60405180910390f35b34801561015857600080fd5b506100ec610970565b34801561016d57600080fd5b506100ec6109ef565b34801561018257600080fd5b5061018b610a6a565b6040516101439190611496565b3480156101a457600080fd5b506100ec610a86565b3480156101b957600080fd5b506101366101c83660046112bc565b610b01565b3480156101d957600080fd5b5061018b6101e83660046112bc565b610b21565b3480156101f957600080fd5b5061018b610b54565b34801561020e57600080fd5b506100ec61021d366004611166565b610b78565b61022a610c44565b73ffffffffffffffffffffffffffffffffffffffff16610248610a6a565b73ffffffffffffffffffffffffffffffffffffffff161461029e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b60405180910390fd5b6102bd8173ffffffffffffffffffffffffffffffffffffffff16610c48565b6102f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611583565b60038383604051610305929190611486565b9081526040519081900360200190205460ff161561034f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611898565b600073ffffffffffffffffffffffffffffffffffffffff1660028484604051610379929190611486565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16146103d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906117f5565b8161040d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906117be565b8060028484604051610420929190611486565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909316929092179091557ff9648cbc19f288e0f271f7e95311238912bf1ea8225e636a13bb1d2591260021906104a690859085908590611536565b60405180910390a1505050565b6104bb61094f565b156104f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611787565b6002600154141561052f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061192c565b600260018190555060006002878760405161054b929190611486565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff169050806105aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906116bc565b73ffffffffffffffffffffffffffffffffffffffff8516156106455734156105fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906116f3565b61064073ffffffffffffffffffffffffffffffffffffffff8616337f000000000000000000000000e6e3f947ccd0add1effde3bf3d210e5d711beace87610c68565b61067e565b83341461067e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906115f1565b7f000000000000000000000000e6e3f947ccd0add1effde3bf3d210e5d711beace73ffffffffffffffffffffffffffffffffffffffff16634cfee326348363ab13824060e01b336040516020016106d59190611496565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261071592918a908a90602001611416565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016107419291906114e8565b6000604051808303818588803b15801561075a57600080fd5b505af115801561076e573d6000803e3d6000fd5b50506001805550505050505050505050565b610788610c44565b73ffffffffffffffffffffffffffffffffffffffff166107a6610a6a565b73ffffffffffffffffffffffffffffffffffffffff16146107f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b600073ffffffffffffffffffffffffffffffffffffffff166002838360405161081d929190611486565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16141561087b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611628565b6002828260405161088d929190611486565b90815260405190819003602001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556001906003906108d59085908590611486565b90815260405190819003602001812080549215157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179091557fb00061f7cc154fc23eb34671ab724fc7eb7b806abae871abae8f1eafce972135906109439084908490611522565b60405180910390a15050565b60005474010000000000000000000000000000000000000000900460ff1690565b610978610c44565b73ffffffffffffffffffffffffffffffffffffffff16610996610a6a565b73ffffffffffffffffffffffffffffffffffffffff16146109e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b6109ed6000610d11565b565b6109f7610c44565b73ffffffffffffffffffffffffffffffffffffffff16610a15610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614610a62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b6109ed610d86565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b610a8e610c44565b73ffffffffffffffffffffffffffffffffffffffff16610aac610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614610af9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b6109ed610e44565b805160208183018101805160038252928201919093012091525460ff1681565b805160208183018101805160028252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000e6e3f947ccd0add1effde3bf3d210e5d711beace81565b610b80610c44565b73ffffffffffffffffffffffffffffffffffffffff16610b9e610a6a565b73ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061182c565b73ffffffffffffffffffffffffffffffffffffffff8116610c38576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061165f565b610c4181610d11565b50565b3390565b73ffffffffffffffffffffffffffffffffffffffff81163b15155b919050565b610d0b846323b872dd60e01b858585604051602401610c89939291906114b7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152610ed3565b50505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610d8e61094f565b15610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611787565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610e2d610c44565b604051610e3a9190611496565b60405180910390a1565b610e4c61094f565b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906115ba565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610e2d610c44565b6000610f35826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610f8e9092919063ffffffff16565b805190915015610f895780806020019051810190610f539190611180565b610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610295906118cf565b505050565b6060610f9d8484600085610fa7565b90505b9392505050565b606082471015610fe3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959061172a565b610fec85610c48565b611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029590611861565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161104b919061146a565b60006040518083038185875af1925050503d8060008114611088576040519150601f19603f3d011682016040523d82523d6000602084013e61108d565b606091505b509150915061109d8282866110a8565b979650505050505050565b606083156110b7575081610fa0565b8251156110c75782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102959190611570565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c6357600080fd5b60008083601f840112611130578081fd5b50813567ffffffffffffffff811115611147578182fd5b60208301915083602082850101111561115f57600080fd5b9250929050565b600060208284031215611177578081fd5b610fa0826110fb565b600060208284031215611191578081fd5b81518015158114610fa0578182fd5b600080602083850312156111b2578081fd5b823567ffffffffffffffff8111156111c8578182fd5b6111d48582860161111f565b90969095509350505050565b6000806000604084860312156111f4578081fd5b833567ffffffffffffffff81111561120a578182fd5b6112168682870161111f565b90945092506112299050602085016110fb565b90509250925092565b6000806000806000806080878903121561124a578182fd5b863567ffffffffffffffff80821115611261578384fd5b61126d8a838b0161111f565b909850965086915061128160208a016110fb565b955060408901359450606089013591508082111561129d578384fd5b506112aa89828a0161111f565b979a9699509497509295939492505050565b6000602082840312156112cd578081fd5b813567ffffffffffffffff808211156112e4578283fd5b818401915084601f8301126112f7578283fd5b8135818111156113095761130961198f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561134f5761134f61198f565b81604052828152876020848701011115611367578586fd5b826020860160208301379182016020019490945295945050505050565b6000815180845261139c816020860160208601611963565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60007fffffffff00000000000000000000000000000000000000000000000000000000861682528451611450816004850160208901611963565b820183856004830137909201600401918252509392505050565b6000825161147c818460208701611963565b9190910192915050565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff8416825260406020830152610f9d6040830184611384565b901515815260200190565b600060208252610f9d6020830184866113ce565b60006040825261154a6040830185876113ce565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060208252610fa06020830184611384565b60208082526019908201527f414441505445525f49535f4e4f545f415f434f4e545241435400000000000000604082015260600190565b60208082526014908201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604082015260600190565b60208082526018908201527f4d534756414c55455f414d4f554e545f4d49534d415443480000000000000000604082015260600190565b60208082526016908201527f414441505445525f444f45535f4e4f545f455849535400000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f414441505445525f4e4f545f464f554e44000000000000000000000000000000604082015260600190565b60208082526011908201527f4e41544956455f41535345545f53454e54000000000000000000000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f5061757361626c653a2070617573656400000000000000000000000000000000604082015260600190565b60208082526012908201527f494e56414c49445f414441505445445f49440000000000000000000000000000604082015260600190565b6020808252600e908201527f414441505445525f455849535453000000000000000000000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201527f414441505445525f52454d4f5645440000000000000000000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60005b8381101561197e578181015183820152602001611966565b83811115610d0b5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea2646970667358221220505946ba2bd7cb2fe6d7753585b08d0024602d2567641bc083ebe5843142141d64736f6c63430008010033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.