Source Code
Overview
GLMR Balance
GLMR Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3959458 | 934 days ago | 1.22129062 GLMR | ||||
| 3959145 | 934 days ago | 1.40816046 GLMR | ||||
| 3959145 | 934 days ago | 100 GLMR | ||||
| 3958995 | 934 days ago | 1.49599757 GLMR | ||||
| 3958995 | 934 days ago | 2 GLMR | ||||
| 3958866 | 934 days ago | 0.33587768 GLMR | ||||
| 3958866 | 934 days ago | 7.06820678 GLMR | ||||
| 3958725 | 934 days ago | 2.13229204 GLMR | ||||
| 3958675 | 934 days ago | 1.10089182 GLMR | ||||
| 3958675 | 934 days ago | 225 GLMR | ||||
| 3958449 | 934 days ago | 13.40580908 GLMR | ||||
| 3958449 | 934 days ago | 50 GLMR | ||||
| 3958300 | 934 days ago | 14.34073445 GLMR | ||||
| 3958300 | 934 days ago | 300.6729062 GLMR | ||||
| 3958126 | 934 days ago | 4.26180185 GLMR | ||||
| 3957900 | 934 days ago | 7.96536048 GLMR | ||||
| 3957458 | 934 days ago | 5.34576671 GLMR | ||||
| 3957458 | 934 days ago | 112 GLMR | ||||
| 3957440 | 934 days ago | 1.05450723 GLMR | ||||
| 3957375 | 934 days ago | 2.83238085 GLMR | ||||
| 3957365 | 934 days ago | 2.92011568 GLMR | ||||
| 3957261 | 934 days ago | 4.22834168 GLMR | ||||
| 3957261 | 934 days ago | 44 GLMR | ||||
| 3956590 | 934 days ago | 0.42859081 GLMR | ||||
| 3956590 | 934 days ago | 390.71008694 GLMR |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SquidRouter
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 99999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import {ISquidRouter} from "./interfaces/ISquidRouter.sol";
import {ISquidMulticall} from "./interfaces/ISquidMulticall.sol";
import {AxelarForecallable} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/executables/AxelarForecallable.sol";
import {IAxelarGasService} from "@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGasService.sol";
import {IAxelarGateway} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol";
import {AddressToString} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/StringAddressUtils.sol";
import {Upgradable} from "@axelar-network/axelar-gmp-sdk-solidity/contracts/upgradables/Upgradable.sol";
import {RoledPausable} from "./RoledPausable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract SquidRouter is ISquidRouter, AxelarForecallable, Upgradable, RoledPausable {
using AddressToString for address;
IAxelarGasService private immutable gasService;
IAxelarGasService private immutable forecallGasService;
ISquidMulticall private immutable squidMulticall;
error ZeroAddressProvided();
constructor(
address _gateway,
address _gasService,
address _forecallGasService,
address _multicall
) AxelarForecallable(_gateway) {
if (
_gateway == address(0) ||
_gasService == address(0) ||
_forecallGasService == address(0) ||
_multicall == address(0)
) revert ZeroAddressProvided();
gasService = IAxelarGasService(_gasService);
forecallGasService = IAxelarGasService(_forecallGasService);
squidMulticall = ISquidMulticall(_multicall);
}
function bridgeCall(
string calldata destinationChain,
string calldata bridgedTokenSymbol,
uint256 amount,
ISquidMulticall.Call[] calldata calls,
address refundRecipient,
bool enableForecall
) external payable whenNotPaused {
address bridgedTokenAddress = gateway.tokenAddresses(bridgedTokenSymbol);
_safeTransferFrom(bridgedTokenAddress, msg.sender, amount);
_bridgeCall(destinationChain, bridgedTokenSymbol, bridgedTokenAddress, calls, refundRecipient, enableForecall);
}
function callBridge(
address token,
uint256 amount,
string calldata destinationChain,
string calldata destinationAddress,
string calldata bridgedTokenSymbol,
ISquidMulticall.Call[] calldata calls
) external payable whenNotPaused {
fundAndRunMulticall(token, amount, calls);
address bridgedTokenAddress = gateway.tokenAddresses(bridgedTokenSymbol);
uint256 bridgedTokenAmount = IERC20(bridgedTokenAddress).balanceOf(address(this));
_approve(bridgedTokenAddress, address(gateway), bridgedTokenAmount);
gateway.sendToken(destinationChain, destinationAddress, bridgedTokenSymbol, bridgedTokenAmount);
}
function callBridgeCall(
address token,
uint256 amount,
string calldata destinationChain,
string calldata bridgedTokenSymbol,
ISquidMulticall.Call[] calldata sourceCalls,
ISquidMulticall.Call[] calldata destinationCalls,
address refundRecipient,
bool enableForecall
) external payable whenNotPaused {
fundAndRunMulticall(token, amount, sourceCalls);
address bridgedTokenAddress = gateway.tokenAddresses(bridgedTokenSymbol);
_bridgeCall(
destinationChain,
bridgedTokenSymbol,
bridgedTokenAddress,
destinationCalls,
refundRecipient,
enableForecall
);
}
function contractId() external pure override returns (bytes32 id) {
id = keccak256("squid-router");
}
function fundAndRunMulticall(
address token,
uint256 amount,
ISquidMulticall.Call[] memory calls
) public payable whenNotPaused {
uint256 valueToSend;
if (token == address(0)) {
valueToSend = amount;
} else {
_transferTokenToMulticall(token, amount);
}
squidMulticall.run{value: valueToSend}(calls);
}
function _executeWithToken(
string calldata,
string calldata,
bytes calldata payload,
string calldata bridgedTokenSymbol,
uint256
) internal override {
(ISquidMulticall.Call[] memory calls, address refundRecipient) = abi.decode(
payload,
(ISquidMulticall.Call[], address)
);
address bridgedTokenAddress = gateway.tokenAddresses(bridgedTokenSymbol);
uint256 contractBalance = IERC20(bridgedTokenAddress).balanceOf(address(this));
_approve(bridgedTokenAddress, address(squidMulticall), contractBalance);
try squidMulticall.run(calls) {
emit CrossMulticallExecuted(keccak256(payload));
} catch (bytes memory reason) {
// Refund tokens to refund recepient if swap fails
_safeTransfer(bridgedTokenAddress, refundRecipient, contractBalance);
emit CrossMulticallFailed(keccak256(payload), reason, refundRecipient);
}
}
function _bridgeCall(
string calldata destinationChain,
string calldata bridgedTokenSymbol,
address bridgedTokenAddress,
ISquidMulticall.Call[] calldata calls,
address refundRecipient,
bool enableForecall
) private {
if (refundRecipient == address(0)) revert ZeroAddressProvided();
bytes memory payload = abi.encode(calls, refundRecipient);
// Only works if destination router has same address
string memory destinationContractAddress = address(this).toString();
uint256 bridgedTokenBalance = IERC20(bridgedTokenAddress).balanceOf(address(this));
if (address(this).balance > 0) {
IAxelarGasService executionService = enableForecall ? forecallGasService : gasService;
executionService.payNativeGasForContractCallWithToken{value: address(this).balance}(
address(this),
destinationChain,
destinationContractAddress,
payload,
bridgedTokenSymbol,
bridgedTokenBalance,
refundRecipient
);
}
_approve(bridgedTokenAddress, address(gateway), bridgedTokenBalance);
gateway.callContractWithToken(
destinationChain,
destinationContractAddress,
payload,
bridgedTokenSymbol,
bridgedTokenBalance
);
}
function _approve(address tokenAddress, address spender, uint256 amount) private {
if (IERC20(tokenAddress).allowance(address(this), spender) < amount) {
// Not a security issue since the contract doesn't store tokens
IERC20(tokenAddress).approve(spender, type(uint256).max);
}
}
function _transferTokenToMulticall(address token, uint256 amount) private {
(bool success, bytes memory returnData) = token.call(
abi.encodeWithSelector(IERC20.transferFrom.selector, msg.sender, address(squidMulticall), amount)
);
bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
if (!transferred || token.code.length == 0) revert TransferFailed();
}
function _setup(bytes calldata data) internal override {
address _pauser = abi.decode(data, (address));
if (_pauser == address(0)) revert("Invalid pauser address");
_setPauser(_pauser);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import './IUpgradable.sol';
// This should be owned by the microservice that is paying for gas.
interface IAxelarGasService is IUpgradable {
error NothingReceived();
error TransferFailed();
error InvalidAddress();
event GasPaidForContractCall(
address indexed sourceAddress,
string destinationChain,
string destinationAddress,
bytes32 indexed payloadHash,
address gasToken,
uint256 gasFeeAmount,
address refundAddress
);
event GasPaidForContractCallWithToken(
address indexed sourceAddress,
string destinationChain,
string destinationAddress,
bytes32 indexed payloadHash,
string symbol,
uint256 amount,
address gasToken,
uint256 gasFeeAmount,
address refundAddress
);
event NativeGasPaidForContractCall(
address indexed sourceAddress,
string destinationChain,
string destinationAddress,
bytes32 indexed payloadHash,
uint256 gasFeeAmount,
address refundAddress
);
event NativeGasPaidForContractCallWithToken(
address indexed sourceAddress,
string destinationChain,
string destinationAddress,
bytes32 indexed payloadHash,
string symbol,
uint256 amount,
uint256 gasFeeAmount,
address refundAddress
);
event GasAdded(bytes32 indexed txHash, uint256 indexed logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress);
event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);
// This is called on the source chain before calling the gateway to execute a remote contract.
function payGasForContractCall(
address sender,
string calldata destinationChain,
string calldata destinationAddress,
bytes calldata payload,
address gasToken,
uint256 gasFeeAmount,
address refundAddress
) external;
// This is called on the source chain before calling the gateway to execute a remote contract.
function payGasForContractCallWithToken(
address sender,
string calldata destinationChain,
string calldata destinationAddress,
bytes calldata payload,
string calldata symbol,
uint256 amount,
address gasToken,
uint256 gasFeeAmount,
address refundAddress
) external;
// This is called on the source chain before calling the gateway to execute a remote contract.
function payNativeGasForContractCall(
address sender,
string calldata destinationChain,
string calldata destinationAddress,
bytes calldata payload,
address refundAddress
) external payable;
// This is called on the source chain before calling the gateway to execute a remote contract.
function payNativeGasForContractCallWithToken(
address sender,
string calldata destinationChain,
string calldata destinationAddress,
bytes calldata payload,
string calldata symbol,
uint256 amount,
address refundAddress
) external payable;
function addGas(
bytes32 txHash,
uint256 txIndex,
address gasToken,
uint256 gasFeeAmount,
address refundAddress
) external;
function addNativeGas(
bytes32 txHash,
uint256 logIndex,
address refundAddress
) external payable;
function collectFees(address payable receiver, address[] calldata tokens) external;
function refund(
address payable receiver,
address token,
uint256 amount
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
// General interface for upgradable contracts
interface IUpgradable {
error NotOwner();
error InvalidOwner();
error InvalidCodeHash();
error InvalidImplementation();
error SetupFailed();
error NotProxy();
event Upgraded(address indexed newImplementation);
event OwnershipTransferred(address indexed newOwner);
// Get current owner
function owner() external view returns (address);
function contractId() external pure returns (bytes32);
function implementation() external view returns (address);
function upgrade(
address newImplementation,
bytes32 newImplementationCodeHash,
bytes calldata params
) external;
function setup(bytes calldata data) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';
import { IERC20 } from '../interfaces/IERC20.sol';
import { IAxelarForecallable } from '../interfaces/IAxelarForecallable.sol';
contract AxelarForecallable is IAxelarForecallable {
IAxelarGateway public immutable gateway;
//keccak256('forecallers');
uint256 public constant FORECALLERS_SALT = 0xdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f;
constructor(address gateway_) {
if (gateway_ == address(0)) revert InvalidAddress();
gateway = IAxelarGateway(gateway_);
}
function getForecaller(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) public view override returns (address forecaller) {
bytes32 pos = keccak256(abi.encode(sourceChain, sourceAddress, payload, FORECALLERS_SALT));
// solhint-disable-next-line no-inline-assembly
assembly {
forecaller := sload(pos)
}
}
function _setForecaller(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
address forecaller
) internal {
bytes32 pos = keccak256(abi.encode(sourceChain, sourceAddress, payload, FORECALLERS_SALT));
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(pos, forecaller)
}
}
function forecall(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external {
_checkForecall(sourceChain, sourceAddress, payload, msg.sender);
if (getForecaller(sourceChain, sourceAddress, payload) != address(0)) revert AlreadyForecalled();
_setForecaller(sourceChain, sourceAddress, payload, msg.sender);
_execute(sourceChain, sourceAddress, payload);
}
function execute(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external override {
bytes32 payloadHash = keccak256(payload);
if (!gateway.validateContractCall(commandId, sourceChain, sourceAddress, payloadHash))
revert NotApprovedByGateway();
address forecaller = getForecaller(sourceChain, sourceAddress, payload);
if (forecaller != address(0)) {
_setForecaller(sourceChain, sourceAddress, payload, address(0));
} else {
_execute(sourceChain, sourceAddress, payload);
}
}
function getForecallerWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata symbol,
uint256 amount
) public view override returns (address forecaller) {
bytes32 pos = keccak256(abi.encode(sourceChain, sourceAddress, payload, symbol, amount, FORECALLERS_SALT));
// solhint-disable-next-line no-inline-assembly
assembly {
forecaller := sload(pos)
}
}
function _setForecallerWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata symbol,
uint256 amount,
address forecaller
) internal {
bytes32 pos = keccak256(abi.encode(sourceChain, sourceAddress, payload, symbol, amount, FORECALLERS_SALT));
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(pos, forecaller)
}
}
function forecallWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata tokenSymbol,
uint256 amount
) external override {
address token = gateway.tokenAddresses(tokenSymbol);
uint256 amountPost = amountPostFee(amount, payload);
_safeTransferFrom(token, msg.sender, amountPost);
_checkForecallWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount, msg.sender);
if (getForecallerWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount) != address(0))
revert AlreadyForecalled();
_setForecallerWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount, msg.sender);
_executeWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amountPost);
}
function executeWithToken(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata tokenSymbol,
uint256 amount
) external override {
bytes32 payloadHash = keccak256(payload);
if (
!gateway.validateContractCallAndMint(
commandId,
sourceChain,
sourceAddress,
payloadHash,
tokenSymbol,
amount
)
) revert NotApprovedByGateway();
address forecaller = getForecallerWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount);
if (forecaller != address(0)) {
_setForecallerWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount, address(0));
address token = gateway.tokenAddresses(tokenSymbol);
_safeTransfer(token, forecaller, amount);
} else {
_executeWithToken(sourceChain, sourceAddress, payload, tokenSymbol, amount);
}
}
function _execute(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) internal virtual {}
function _executeWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata tokenSymbol,
uint256 amount
) internal virtual {}
// Override this to keep a fee.
function amountPostFee(
uint256 amount,
bytes calldata /*payload*/
) public virtual override returns (uint256) {
return amount;
}
// Override this and revert if you want to only allow certain people/calls to be able to forecall.
function _checkForecall(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
address forecaller
) internal virtual {}
// Override this and revert if you want to only allow certain people/calls to be able to forecall.
function _checkForecallWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata tokenSymbol,
uint256 amount,
address forecaller
) internal virtual {}
function _safeTransfer(
address tokenAddress,
address receiver,
uint256 amount
) internal {
(bool success, bytes memory returnData) = tokenAddress.call(
abi.encodeWithSelector(IERC20.transfer.selector, receiver, amount)
);
bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
if (!transferred || tokenAddress.code.length == 0) revert TransferFailed();
}
function _safeTransferFrom(
address tokenAddress,
address from,
uint256 amount
) internal {
(bool success, bytes memory returnData) = tokenAddress.call(
abi.encodeWithSelector(IERC20.transferFrom.selector, from, address(this), amount)
);
bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
if (!transferred || tokenAddress.code.length == 0) revert TransferFailed();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';
interface IAxelarExecutable {
error InvalidAddress();
error NotApprovedByGateway();
function gateway() external view returns (IAxelarGateway);
function execute(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external;
function executeWithToken(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata tokenSymbol,
uint256 amount
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { IAxelarExecutable } from '../interfaces/IAxelarExecutable.sol';
interface IAxelarForecallable is IAxelarExecutable {
error AlreadyForecalled();
error TransferFailed();
function forecall(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external;
function forecallWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata tokenSymbol,
uint256 amount
) external;
function getForecaller(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload
) external returns (address forecaller);
function getForecallerWithToken(
string calldata sourceChain,
string calldata sourceAddress,
bytes calldata payload,
string calldata symbol,
uint256 amount
) external returns (address forecaller);
function amountPostFee(uint256 amount, bytes calldata payload) external returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IAxelarGateway {
/**********\
|* Errors *|
\**********/
error NotSelf();
error NotProxy();
error InvalidCodeHash();
error SetupFailed();
error InvalidAuthModule();
error InvalidTokenDeployer();
error InvalidAmount();
error InvalidChainId();
error InvalidCommands();
error TokenDoesNotExist(string symbol);
error TokenAlreadyExists(string symbol);
error TokenDeployFailed(string symbol);
error TokenContractDoesNotExist(address token);
error BurnFailed(string symbol);
error MintFailed(string symbol);
error InvalidSetMintLimitsParams();
error ExceedMintLimit(string symbol);
/**********\
|* Events *|
\**********/
event TokenSent(
address indexed sender,
string destinationChain,
string destinationAddress,
string symbol,
uint256 amount
);
event ContractCall(
address indexed sender,
string destinationChain,
string destinationContractAddress,
bytes32 indexed payloadHash,
bytes payload
);
event ContractCallWithToken(
address indexed sender,
string destinationChain,
string destinationContractAddress,
bytes32 indexed payloadHash,
bytes payload,
string symbol,
uint256 amount
);
event Executed(bytes32 indexed commandId);
event TokenDeployed(string symbol, address tokenAddresses);
event ContractCallApproved(
bytes32 indexed commandId,
string sourceChain,
string sourceAddress,
address indexed contractAddress,
bytes32 indexed payloadHash,
bytes32 sourceTxHash,
uint256 sourceEventIndex
);
event ContractCallApprovedWithMint(
bytes32 indexed commandId,
string sourceChain,
string sourceAddress,
address indexed contractAddress,
bytes32 indexed payloadHash,
string symbol,
uint256 amount,
bytes32 sourceTxHash,
uint256 sourceEventIndex
);
event TokenMintLimitUpdated(string symbol, uint256 limit);
event OperatorshipTransferred(bytes newOperatorsData);
event Upgraded(address indexed implementation);
/********************\
|* Public Functions *|
\********************/
function sendToken(
string calldata destinationChain,
string calldata destinationAddress,
string calldata symbol,
uint256 amount
) external;
function callContract(
string calldata destinationChain,
string calldata contractAddress,
bytes calldata payload
) external;
function callContractWithToken(
string calldata destinationChain,
string calldata contractAddress,
bytes calldata payload,
string calldata symbol,
uint256 amount
) external;
function isContractCallApproved(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
address contractAddress,
bytes32 payloadHash
) external view returns (bool);
function isContractCallAndMintApproved(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
address contractAddress,
bytes32 payloadHash,
string calldata symbol,
uint256 amount
) external view returns (bool);
function validateContractCall(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes32 payloadHash
) external returns (bool);
function validateContractCallAndMint(
bytes32 commandId,
string calldata sourceChain,
string calldata sourceAddress,
bytes32 payloadHash,
string calldata symbol,
uint256 amount
) external returns (bool);
/***********\
|* Getters *|
\***********/
function authModule() external view returns (address);
function tokenDeployer() external view returns (address);
function tokenMintLimit(string memory symbol) external view returns (uint256);
function tokenMintAmount(string memory symbol) external view returns (uint256);
function allTokensFrozen() external view returns (bool);
function implementation() external view returns (address);
function tokenAddresses(string memory symbol) external view returns (address);
function tokenFrozen(string memory symbol) external view returns (bool);
function isCommandExecuted(bytes32 commandId) external view returns (bool);
function adminEpoch() external view returns (uint256);
function adminThreshold(uint256 epoch) external view returns (uint256);
function admins(uint256 epoch) external view returns (address[] memory);
/*******************\
|* Admin Functions *|
\*******************/
function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;
function upgrade(
address newImplementation,
bytes32 newImplementationCodeHash,
bytes calldata setupParams
) external;
/**********************\
|* External Functions *|
\**********************/
function setup(bytes calldata params) external;
function execute(bytes calldata input) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
error InvalidAccount();
/**
* @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
pragma solidity ^0.8.0;
// General interface for upgradable contracts
interface IUpgradable {
error NotOwner();
error InvalidOwner();
error InvalidCodeHash();
error InvalidImplementation();
error SetupFailed();
error NotProxy();
event Upgraded(address indexed newImplementation);
event OwnershipTransferred(address indexed newOwner);
// Get current owner
function owner() external view returns (address);
function contractId() external pure returns (bytes32);
function upgrade(
address newImplementation,
bytes32 newImplementationCodeHash,
bytes calldata params
) external;
function setup(bytes calldata data) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library StringToAddress {
function toAddress(string memory _a) internal pure returns (address) {
bytes memory tmp = bytes(_a);
if (tmp.length != 42) return address(0);
uint160 iaddr = 0;
uint8 b;
for (uint256 i = 2; i < 42; i++) {
b = uint8(tmp[i]);
if ((b >= 97) && (b <= 102)) b -= 87;
else if ((b >= 65) && (b <= 70)) b -= 55;
else if ((b >= 48) && (b <= 57)) b -= 48;
else return address(0);
iaddr |= uint160(uint256(b) << ((41 - i) << 2));
}
return address(iaddr);
}
}
library AddressToString {
function toString(address a) internal pure returns (string memory) {
bytes memory data = abi.encodePacked(a);
bytes memory characters = '0123456789abcdef';
bytes memory byteString = new bytes(2 + data.length * 2);
byteString[0] = '0';
byteString[1] = 'x';
for (uint256 i; i < data.length; ++i) {
byteString[2 + i * 2] = characters[uint256(uint8(data[i] >> 4))];
byteString[3 + i * 2] = characters[uint256(uint8(data[i] & 0x0f))];
}
return string(byteString);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '../interfaces/IUpgradable.sol';
abstract contract Upgradable is IUpgradable {
// bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)
bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
// keccak256('owner')
bytes32 internal constant _OWNER_SLOT = 0x02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0;
modifier onlyOwner() {
if (owner() != msg.sender) revert NotOwner();
_;
}
function owner() public view returns (address owner_) {
// solhint-disable-next-line no-inline-assembly
assembly {
owner_ := sload(_OWNER_SLOT)
}
}
function transferOwnership(address newOwner) external virtual onlyOwner {
if (newOwner == address(0)) revert InvalidOwner();
emit OwnershipTransferred(newOwner);
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(_OWNER_SLOT, newOwner)
}
}
function implementation() public view returns (address implementation_) {
// solhint-disable-next-line no-inline-assembly
assembly {
implementation_ := sload(_IMPLEMENTATION_SLOT)
}
}
function upgrade(
address newImplementation,
bytes32 newImplementationCodeHash,
bytes calldata params
) external override onlyOwner {
if (IUpgradable(newImplementation).contractId() != IUpgradable(this).contractId())
revert InvalidImplementation();
if (newImplementationCodeHash != newImplementation.codehash) revert InvalidCodeHash();
if (params.length > 0) {
// solhint-disable-next-line avoid-low-level-calls
(bool success, ) = newImplementation.delegatecall(abi.encodeWithSelector(this.setup.selector, params));
if (!success) revert SetupFailed();
}
emit Upgraded(newImplementation);
// solhint-disable-next-line no-inline-assembly
assembly {
sstore(_IMPLEMENTATION_SLOT, newImplementation)
}
}
function setup(bytes calldata data) external override {
// Prevent setup from being called on the implementation
if (implementation() == address(0)) revert NotProxy();
_setup(data);
}
// solhint-disable-next-line no-empty-blocks
function _setup(bytes calldata data) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
interface IRoledPausable {
event PauserProposed(address indexed currentPauser, address indexed pendingPauser);
event PauserUpdated(address indexed pendingPauser);
event Paused();
event Unpaused();
error ContractIsPaused();
error NotPauser();
error NotPendingPauser();
function updatePauser(address _newPauser) external;
function acceptPauser() external;
function pause() external;
function unpause() external;
function paused() external view returns (bool value);
function pauser() external view returns (address value);
function pendingPauser() external view returns (address value);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
interface ISquidMulticall {
enum CallType {
Default,
FullTokenBalance,
FullNativeBalance,
CollectTokenBalance
}
struct Call {
CallType callType;
address target;
uint256 value;
bytes callData;
bytes payload;
}
error AlreadyRunning();
error CallFailed(uint256 callPosition, bytes reason);
function run(Call[] calldata calls) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import {ISquidMulticall} from "./ISquidMulticall.sol";
interface ISquidRouter {
event CrossMulticallExecuted(bytes32 indexed payloadHash);
event CrossMulticallFailed(bytes32 indexed payloadHash, bytes reason, address indexed refundRecipient);
function bridgeCall(
string calldata destinationChain,
string calldata bridgedTokenSymbol,
uint256 amount,
ISquidMulticall.Call[] calldata calls,
address refundRecipient,
bool forecallEnabled
) external payable;
function callBridge(
address token,
uint256 amount,
string calldata destinationChain,
string calldata destinationAddress,
string calldata bridgedTokenSymbol,
ISquidMulticall.Call[] calldata calls
) external payable;
function callBridgeCall(
address token,
uint256 amount,
string calldata destinationChain,
string calldata bridgedTokenSymbol,
ISquidMulticall.Call[] calldata sourceCalls,
ISquidMulticall.Call[] calldata destinationCalls,
address refundRecipient,
bool forecallEnabled
) external payable;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
library StorageSlot {
function setUint256(bytes32 slot, uint256 value) internal {
assembly {
sstore(slot, value)
}
}
function getUint256(bytes32 slot) internal view returns (uint256 value) {
assembly {
value := sload(slot)
}
}
function setAddress(bytes32 slot, address value) internal {
assembly {
sstore(slot, value)
}
}
function getAddress(bytes32 slot) internal view returns (address value) {
assembly {
value := sload(slot)
}
}
function setBool(bytes32 slot, bool value) internal {
assembly {
sstore(slot, value)
}
}
function getBool(bytes32 slot) internal view returns (bool value) {
assembly {
value := sload(slot)
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import {IRoledPausable} from "./interfaces/IRoledPausable.sol";
import {StorageSlot} from "./libraries/StorageSlot.sol";
abstract contract RoledPausable is IRoledPausable {
using StorageSlot for bytes32;
bytes32 internal constant PAUSED_SLOT = keccak256("RoledPausable.paused");
bytes32 internal constant PAUSER_SLOT = keccak256("RoledPausable.pauser");
bytes32 internal constant PENDING_PAUSER_SLOT = keccak256("RoledPausable.pendingPauser");
modifier whenNotPaused() {
if (paused()) revert ContractIsPaused();
_;
}
modifier onlyPauser() {
if (msg.sender != pauser()) revert NotPauser();
_;
}
constructor() {
_setPauser(msg.sender);
}
function updatePauser(address newPauser) external onlyPauser {
PENDING_PAUSER_SLOT.setAddress(newPauser);
emit PauserProposed(msg.sender, newPauser);
}
function acceptPauser() external {
if (msg.sender != pendingPauser()) revert NotPendingPauser();
_setPauser(msg.sender);
PENDING_PAUSER_SLOT.setAddress(address(0));
}
function pause() external virtual onlyPauser {
PAUSED_SLOT.setBool(true);
emit Paused();
}
function unpause() external virtual onlyPauser {
PAUSED_SLOT.setBool(false);
emit Unpaused();
}
function pauser() public view returns (address value) {
value = PAUSER_SLOT.getAddress();
}
function paused() public view returns (bool value) {
value = PAUSED_SLOT.getBool();
}
function pendingPauser() public view returns (address value) {
value = PENDING_PAUSER_SLOT.getAddress();
}
function _setPauser(address _pauser) internal {
PAUSER_SLOT.setAddress(_pauser);
emit PauserUpdated(_pauser);
}
}{
"optimizer": {
"enabled": true,
"runs": 99999
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_gateway","type":"address"},{"internalType":"address","name":"_gasService","type":"address"},{"internalType":"address","name":"_forecallGasService","type":"address"},{"internalType":"address","name":"_multicall","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyForecalled","type":"error"},{"inputs":[],"name":"ContractIsPaused","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidCodeHash","type":"error"},{"inputs":[],"name":"InvalidImplementation","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"NotApprovedByGateway","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotPauser","type":"error"},{"inputs":[],"name":"NotPendingPauser","type":"error"},{"inputs":[],"name":"NotProxy","type":"error"},{"inputs":[],"name":"SetupFailed","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"ZeroAddressProvided","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"name":"CrossMulticallExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"},{"indexed":true,"internalType":"address","name":"refundRecipient","type":"address"}],"name":"CrossMulticallFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"currentPauser","type":"address"},{"indexed":true,"internalType":"address","name":"pendingPauser","type":"address"}],"name":"PauserProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingPauser","type":"address"}],"name":"PauserUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newImplementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"FORECALLERS_SALT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"amountPostFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"bridgedTokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"enum ISquidMulticall.CallType","name":"callType","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct ISquidMulticall.Call[]","name":"calls","type":"tuple[]"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"bool","name":"enableForecall","type":"bool"}],"name":"bridgeCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"string","name":"bridgedTokenSymbol","type":"string"},{"components":[{"internalType":"enum ISquidMulticall.CallType","name":"callType","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct ISquidMulticall.Call[]","name":"calls","type":"tuple[]"}],"name":"callBridge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"bridgedTokenSymbol","type":"string"},{"components":[{"internalType":"enum ISquidMulticall.CallType","name":"callType","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct ISquidMulticall.Call[]","name":"sourceCalls","type":"tuple[]"},{"components":[{"internalType":"enum ISquidMulticall.CallType","name":"callType","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct ISquidMulticall.Call[]","name":"destinationCalls","type":"tuple[]"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"bool","name":"enableForecall","type":"bool"}],"name":"callBridgeCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contractId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commandId","type":"bytes32"},{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"executeWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"forecall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"forecallWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"components":[{"internalType":"enum ISquidMulticall.CallType","name":"callType","type":"uint8"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct ISquidMulticall.Call[]","name":"calls","type":"tuple[]"}],"name":"fundAndRunMulticall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"gateway","outputs":[{"internalType":"contract IAxelarGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"getForecaller","outputs":[{"internalType":"address","name":"forecaller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"sourceChain","type":"string"},{"internalType":"string","name":"sourceAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getForecallerWithToken","outputs":[{"internalType":"address","name":"forecaller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"value","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauser","outputs":[{"internalType":"address","name":"value","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingPauser","outputs":[{"internalType":"address","name":"value","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPauser","type":"address"}],"name":"updatePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes32","name":"newImplementationCodeHash","type":"bytes32"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
61010034620001e157601f62003afc38819003918201601f19168301916001600160401b03831184841017620001e657808492608094604052833981010312620001e1576200004e81620001fc565b906200005d60208201620001fc565b906200007a60606200007260408401620001fc565b9201620001fc565b6001600160a01b039390929084168015620001cf57608052337f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379558360405191337fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab600080a2169081158015620001c4575b8015620001b9575b620001aa575060a052821660c0521660e0526040516138ea9081620002128239608051818181610304015281816107f5015281816113a701528181611bbb01528181611ec70152818161208301528181612185015281816122a0015281816125e3015261331c015260a05181613587015260c0518161344f015260e05181818161028b01528181610559015281816109a3015281816112f10152818161145e0152818161181f015281816118df01526123430152f35b638474420160e01b8152600490fd5b5084841615620000f4565b5084831615620000ec565b60405163e6c4247b60e01b8152600490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001e15756fe604060e08152600436101561001357600080fd5b600090813560e01c806309cc027b1461265f5780630d38218a14612607578063116191b614612599578063167a6f90146124b3578281631a98b2e014611f2f575080633c65974114611daa5780633ca2fd8e14611d4d5780633f4ba83a14611c955780634916065814611aa0578063554bab3c146119db57806358181a80146117775780635c60da1b146117065780635c975abb146116a95780638291286c146116515780638456cb591461156f5780638ca3bf68146111c95780638da5cb5b146111585780639a7165e4146110e75780639ded06df14610f685780639fd0506d14610ef7578063a3499c7314610c27578063d022443414610b9f578063e888e86c14610782578063f2fde38b14610682578063f35af1f8146101805763facd28a91461013f57600080fd5b3461017c5760209073ffffffffffffffffffffffffffffffffffffffff61017461016836612a3d565b94939093929192612b63565b915191168152f35b5080fd5b50907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9160c08336011261017c576101b661279a565b6024359367ffffffffffffffff929160443584811161067e576101dd903690600401612698565b9060643586811161067a576101f6903690600401612698565b96909260843582811161050057610211903690600401612698565b95909260a4359081116104745761022c903690600401612769565b7fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c54610651579061025e91369161290d565b9a8a73ffffffffffffffffffffffffffffffffffffffff92838116156000146105125750509a8a9b905b827f00000000000000000000000000000000000000000000000000000000000000001690813b1561050e578c916102ed918c519485809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af1801561050457908b916104ec575b5050807f000000000000000000000000000000000000000000000000000000000000000016948851917f935b13f6000000000000000000000000000000000000000000000000000000008352602092836004820152838180610365602482018d8b612ac1565b03818b5afa9081156104b25784908e926104bc575b50602491928c51928380927f70a0823100000000000000000000000000000000000000000000000000000000825230600483015286165afa9384156104b2578d94610478575b505082876103cd92613780565b853b15610474578a9761042097899561043061043f948d519e8f9c8d9b8c9a7f26ef699d000000000000000000000000000000000000000000000000000000008c52608060048d015260848c0191612ac1565b91868a84030160248b0152612ac1565b92868403016044870152612ac1565b90606483015203925af190811561046b57506104585750f35b610461906127de565b6104685780f35b80fd5b513d84823e3d90fd5b8a80fd5b819d50809294503d83116104ab575b610491818361283d565b810103126104a65799518b9a909180876103c0565b600080fd5b503d610487565b8b513d8f823e3d90fd5b602492506104df90823d84116104e5575b6104d7818361283d565b810190612c1f565b9161037a565b503d6104cd565b6104f5906127de565b6105005789386102ff565b8980fd5b89513d8d823e3d90fd5b8c80fd5b8a517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815233602483015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000087161660448301526064820194909452919290918d9182916105c581608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261283d565b519082855af16105d3612c4b565b81610622575b5015908115610618575b506105ef578a9b610288565b600489517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b15386105e3565b8051801592508215610637575b5050386105d9565b61064a9250602080918301019101612b86565b388061062f565b60048a517f6d39fcd0000000000000000000000000000000000000000000000000000000008152fd5b8780fd5b8580fd5b503461017c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576106ba61279a565b907f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c090815473ffffffffffffffffffffffffffffffffffffffff90813391160361075957831690811561073057507f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861638480a25580f35b600490517f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b600482517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b503461017c57610791366126c6565b9689989194969293959951977f935b13f6000000000000000000000000000000000000000000000000000000009a8b8a52602060048b01528c8a602081806107dd602482018d8d612ac1565b0373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169e8f5afa918215610b945789898c8e6108528973ffffffffffffffffffffffffffffffffffffffff9861085b98829891610b75575b503390612d75565b878c8b8d612bfe565b16610b4c576108aa929187878a8c8f9561087e96519a8b9860208a019b8c612b9e565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810184528361283d565b339151902055828401908685830312610b485784359567ffffffffffffffff8711610500576108e060209361091e988801612a22565b9373ffffffffffffffffffffffffffffffffffffffff6109018589016127bd565b169989519889948593849384528760048501526024840191612ac1565b03915afa938415610b3e578794610b1d575b50868551917f70a0823100000000000000000000000000000000000000000000000000000000835230600484015260208360248173ffffffffffffffffffffffffffffffffffffffff8a165afa928315610b13578293610adc575b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166109ce848289613780565b803b15610ad857610a1183929183928a519586809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af19182610ac4575b5050610a8657610a80927fdd7b1484db8d21f4fbda2407f2920037dc379dd66e18b0851aa9d6c14ef493b99492610a5f610a669389610a59612c4b565b96612c7b565b36916128b8565b602081519101209351918291602083526020830190612e28565b0390a380f35b50610a96945036935091506128b8565b602081519101207f7c3aa10c5d96985be6de7d2e6fa79bdef95a95a9cb272f4113b3fe1ca89fedae8280a280f35b610acd906127de565b61067a578738610a1c565b8280fd5b915091506020813d602011610b0b575b81610af96020938361283d565b810103126104a657879051913861098b565b3d9150610aec565b87513d84823e3d90fd5b610b3791945060203d6020116104e5576104d7818361283d565b9238610930565b85513d89823e3d90fd5b8880fd5b60048b517f35b7d550000000000000000000000000000000000000000000000000000000008152fd5b610b8e915060203d6020116104e5576104d7818361283d565b3861084a565b8d51903d90823e3d90fd5b503461017c57610bae36612a3d565b929573ffffffffffffffffffffffffffffffffffffffff610bd68584868b8a8c999899612b63565b16610bfe5791610bf594939161087e9351978895602087019889612b00565b33915190205580f35b600490517f35b7d550000000000000000000000000000000000000000000000000000000008152fd5b503461017c5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57610c5f61279a565b9060443567ffffffffffffffff8111610ef357610c80903690600401612698565b7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c09291925473ffffffffffffffffffffffffffffffffffffffff908133911603610eca578416928251907f8291286c0000000000000000000000000000000000000000000000000000000080835260209283816004818a5afa908115610e93578991610e9d575b5085519182528382600481305afa918215610e93578992610e64575b5003610e3b57853f60243503610e12579082918793610d8a575b5050507fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b915080a27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5580f35b610dcd84936105998751938492868401967f9ded06df00000000000000000000000000000000000000000000000000000000885260248501526044840191612ac1565b5190865af4610dda612c4b565b5015610de95783818080610d3d565b600490517f97905dfb000000000000000000000000000000000000000000000000000000008152fd5b600484517f8f84fb24000000000000000000000000000000000000000000000000000000008152fd5b600484517f68155f9a000000000000000000000000000000000000000000000000000000008152fd5b9091508381813d8311610e8c575b610e7c818361283d565b810103126104a657519038610d23565b503d610e72565b86513d8b823e3d90fd5b90508381813d8311610ec3575b610eb4818361283d565b810103126104a6575138610d07565b503d610eaa565b600483517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c37954915191168152f35b503461017c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760043567ffffffffffffffff8111610ad857610fb8903690600401612698565b9073ffffffffffffffffffffffffffffffffffffffff91827f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416156110be578160209181010312610ef35761100d906127bd565b169081156110615750807f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379557fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab600080a280f35b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c6964207061757365722061646472657373000000000000000000006044820152fd5b600484517fbf10dd3a000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7fe330cfee289e568e8774e923acd6e2a00f84be86aa1d02356835d33dbb93970254915191168152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c054915191168152f35b506101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576111fd61279a565b60243567ffffffffffffffff60443581811161067e57611221903690600401612698565b93909160643581811161067a5761123c903690600401612698565b9060843583811161050057611255903690600401612769565b97909360a43590811161047457611270903690600401612769565b96909560c4359873ffffffffffffffffffffffffffffffffffffffff96878b168b036104a65760e4359b8c15158d036104a6577fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c54611546576112d98f9493928f92369161290d565b928985928183161560001461142d5750505050905b877f00000000000000000000000000000000000000000000000000000000000000001690813b15610ef3578391611353918f519485809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af180156114235761140f575b505060208a5180967f935b13f600000000000000000000000000000000000000000000000000000000825282600483015281806113a3602482018a8a612ac1565b03917f0000000000000000000000000000000000000000000000000000000000000000165afa948515611405576113e29a508b956113e5575b50612fb1565b80f35b6113fe91955060203d81116104e5576104d7818361283d565b93386113dc565b8a513d8d823e3d90fd5b611418906127de565b610474578a38611362565b8c513d84823e3d90fd5b517f23b872dd00000000000000000000000000000000000000000000000000000000602082019081523360248301527f00000000000000000000000000000000000000000000000000000000000000009290921673ffffffffffffffffffffffffffffffffffffffff166044820152606481019490945291949092909182916114b98160848101610599565b519082855af16114c7612c4b565b81611517575b501590811561150d575b506114e457908c916112ee565b60048c517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b15386114d7565b805180159250821561152c575b5050386114cd565b61153f9250602080918301019101612b86565b3880611524565b60048e517f6d39fcd0000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5773ffffffffffffffffffffffffffffffffffffffff7f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c37954163303611628575060017fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c557f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7528180a180f35b600490517f492f6781000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57602090517fc097d45e5a99ca772ab5ec2e5457c2e249760944b95b0b97cbb6b03ec55bae848152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576020907fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c5490519015158152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54915191168152f35b509060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610468576117ab61279a565b6024359260443567ffffffffffffffff8111610ef3576117cf903690600401612a22565b7fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c546119b2578373ffffffffffffffffffffffffffffffffffffffff93848116156000146118985750508394925b7f00000000000000000000000000000000000000000000000000000000000000001690813b156118945784916118819184519586809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af190811561046b57506104585750f35b8480fd5b83517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815233602483015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008816166044830152606482019890985294969194909186918291906119268160848101610599565b519082855af1611934612c4b565b81611983575b5015908115611979575b5061195057839461181d565b600482517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b1538611944565b8051801592508215611998575b50503861193a565b6119ab9250602080918301019101612b86565b3880611990565b600482517f6d39fcd0000000000000000000000000000000000000000000000000000000008152fd5b503461017c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57611a1361279a565b73ffffffffffffffffffffffffffffffffffffffff91827f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379541633036116285750807fe330cfee289e568e8774e923acd6e2a00f84be86aa1d02356835d33dbb9397025516337f3210edd3f0fc490ffc59a4adae6f48dbda2d8e89afe5b37a0145a54762f3ecf98380a380f35b503461017c577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc90608082360112610ad85767ffffffffffffffff60243581811161189457611af3903690600401612698565b604493919335838111611c9157611b0e903690600401612698565b92909360643590811161067a57611b29903690600401612698565b9096611b3636838a6128b8565b6020815191012090611b958451917f5f6970c3000000000000000000000000000000000000000000000000000000008352600435600484015260806024840152611b8460848401888c612ac1565b908382030160448401528789612ac1565b9160648201526020818073ffffffffffffffffffffffffffffffffffffffff9403818d867f0000000000000000000000000000000000000000000000000000000000000000165af1908115611c87578a91611c59575b5015611c3057611bff82898789888c612b63565b1615611c2657600096611c1f94610599935196879560208701998a612b00565b5190205580f35b5050505050505080f35b600483517f500c44b4000000000000000000000000000000000000000000000000000000008152fd5b611c7a915060203d8111611c80575b611c72818361283d565b810190612b86565b38611beb565b503d611c68565b84513d8c823e3d90fd5b8680fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5773ffffffffffffffffffffffffffffffffffffffff7f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379541633036116285750807fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c557fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169338180a180f35b503461017c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576024359167ffffffffffffffff83116104685750611da06020923690600401612698565b5050516004358152f35b5060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5767ffffffffffffffff600435818111610ef357611df6903690600401612698565b60249291923582811161067e57611e11903690600401612698565b9092606435908111611c9157611e2b903690600401612769565b9290916084359473ffffffffffffffffffffffffffffffffffffffff9283871687036104a65760a4359788151589036104a6577fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c546106515760208a5180967f935b13f60000000000000000000000000000000000000000000000000000000082528260048301528180611ec3602482018a8a612ac1565b03917f0000000000000000000000000000000000000000000000000000000000000000165afa948515611405576113e29a508b95611f0f575b50611f0a6044353387612d75565b612fb1565b611f2891955060203d81116104e5576104d7818361283d565b9338611efc565b8083346124b0577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60c0813601126124ac5760243567ffffffffffffffff81116124a757611f81903690600401612698565b60449291923567ffffffffffffffff811161067e57611fa4903690600401612698565b9060643567ffffffffffffffff811161067a57611fc5903690600401612698565b60849691963567ffffffffffffffff811161050057611fe8903690600401612698565b998a919736611ff890858c6128b8565b80519060200120908b5193849283927f1876eed900000000000000000000000000000000000000000000000000000000845260043560048501526024840160c0905260c48401612049908d8b612ac1565b8185820301604486015261205e908c8c612ac1565b916064850152838203016084840152612077918c612ac1565b60a43560a483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16935a94602095f1908115610504578b91612488575b501561245f576120e660a4358a88848b89898c8a612bfe565b9673ffffffffffffffffffffffffffffffffffffffff8816156121f2576000936105998897948c60209a8d9e999661212e9661216c9f519889978f89019b60a435978d612b9e565b51902055855194859283927f935b13f60000000000000000000000000000000000000000000000000000000084528560048501526024840191612ac1565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9182156121e5576113e2935084926121c4575b5060a43591612c7b565b6121de91925060203d6020116104e5576104d7818361283d565b90846121ba565b50505051903d90823e3d90fd5b9596509350505050808201928483850312611c915782359367ffffffffffffffff851161067a5761222a602091612287968601612a22565b9173ffffffffffffffffffffffffffffffffffffffff61224b8387016127bd565b1697875196879283927f935b13f60000000000000000000000000000000000000000000000000000000084528560048501526024840191612ac1565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa938415610b3e57879461243e575b50868551917f70a0823100000000000000000000000000000000000000000000000000000000835230600484015260208360248173ffffffffffffffffffffffffffffffffffffffff8a165afa928315610b1357829361240a575b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169061236f848389613780565b813b15610ad85782916123b09189519485809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af190816123f7575b50610a8657610a80927fdd7b1484db8d21f4fbda2407f2920037dc379dd66e18b0851aa9d6c14ef493b99492610a5f610a669389610a59612c4b565b612403909891986127de565b96886123bb565b9092506020813d602011612436575b816124266020938361283d565b8101031261017c5751918961232b565b3d9150612419565b61245891945060203d6020116104e5576104d7818361283d565b92876122d0565b600488517f500c44b4000000000000000000000000000000000000000000000000000000008152fd5b6124a1915060203d602011611c8057611c72818361283d565b8b6120cd565b505050fd5b5050fd5b50fd5b50903461046857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610468577fe330cfee289e568e8774e923acd6e2a00f84be86aa1d02356835d33dbb93970273ffffffffffffffffffffffffffffffffffffffff8154163303612570578190337f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c37955337fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab8380a25580f35b600483517fb3a270d8000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57602090517fdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f8152f35b503461017c5760209073ffffffffffffffffffffffffffffffffffffffff610174612689366126c6565b97969096959195949294612bfe565b9181601f840112156104a65782359167ffffffffffffffff83116104a657602083818601950101116104a657565b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126104a65767ffffffffffffffff906004358281116104a6578161271191600401612698565b939093926024358181116104a6578361272c91600401612698565b939093926044358381116104a6578261274791600401612698565b939093926064359182116104a65761276191600401612698565b909160843590565b9181601f840112156104a65782359167ffffffffffffffff83116104a6576020808501948460051b0101116104a657565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036104a657565b359073ffffffffffffffffffffffffffffffffffffffff821682036104a657565b67ffffffffffffffff81116127f257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff8211176127f257604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176127f257604052565b67ffffffffffffffff81116127f257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926128c48261287e565b916128d2604051938461283d565b8294818452818301116104a6578281602093846000960137010152565b9080601f830112156104a65781602061290a933591016128b8565b90565b9291909267ffffffffffffffff8085116127f2578460051b60408051946020809661293a8286018261283d565b8099815201928501948186116104a65780935b86851061295e575050505050505050565b84358681116104a657820160a09182828603126104a6578551928301838110898211176129f4578652813560048110156104a657835261299f8a83016127bd565b8a84015285820135868401526060808301358981116104a657866129c49185016128ef565b9084015260809283830135938985116104a6576129e5878d968796016128ef565b9082015281520194019361294d565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b9080601f830112156104a65781602061290a9335910161290d565b9060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126104a65767ffffffffffffffff6004358181116104a65783612a8891600401612698565b939093926024358381116104a65782612aa391600401612698565b939093926044359182116104a657612abd91600401612698565b9091565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b969590612b5e93606095612b42612b50937fdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f999660808d5260808d0191612ac1565b918a830360208c0152612ac1565b918783036040890152612ac1565b930152565b94610599919294612b7f9460405196879560208701998a612b00565b5190205490565b908160209103126104a6575180151581036104a65790565b95612b507fdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f999460a09996612b42612bf499959d9e9d612be69760c08d5260c08d0191612ac1565b918483036060860152612ac1565b9460808201520152565b97929461059994612b7f979296989398604051998a9860208a019c8d612b9e565b908160209103126104a6575173ffffffffffffffffffffffffffffffffffffffff811681036104a65790565b3d15612c76573d90612c5c8261287e565b91612c6a604051938461283d565b82523d6000602084013e565b606090565b91906040519173ffffffffffffffffffffffffffffffffffffffff60208401927fa9059cbb000000000000000000000000000000000000000000000000000000008452166024840152604483015260448252608082019082821067ffffffffffffffff8311176127f2576000928392604052519082855af1612cfb612c4b565b81612d46575b5015908115612d3c575b50612d1257565b60046040517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b1538612d0b565b8051801592508215612d5b575b505038612d01565b612d6e9250602080918301019101612b86565b3880612d53565b6040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff90931660248201523060448201526064810193909352916000918291612dde8160848101610599565b519082855af1612cfb612c4b565b906004821015612df95752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b919082519283825260005b848110612e725750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201612e33565b602080820190808352835180925260409283810182858560051b8401019601946000925b858410612ebb575050505050505090565b909192939495968580612f50837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030188528b51612efe828251612dec565b73ffffffffffffffffffffffffffffffffffffffff8482015116848301528781015188830152612f3d6060808301519060a08091860152840190612e28565b9160808092015191818403910152612e28565b990194019401929594939190612eaa565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156104a657016020813591019167ffffffffffffffff82116104a65781360383136104a657565b929391989594600060a05273ffffffffffffffffffffffffffffffffffffffff881615613716576040518096604060208301528060608301526080820160808260051b840101918460a0515b8281106136105750505050613055925073ffffffffffffffffffffffffffffffffffffffff8a166040830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810187528661283d565b6040518060805260203060601b910152601460805152613076608051612821565b6040519761308389612821565b601089527f303132333435363738396162636465660000000000000000000000000000000060208a0152608051518060011b9080820460021490151715613260578060020160021161326057806130ee6130e26130fe9360020161287e565b6040518060c05261283d565b8060020160c0515260020161287e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602060c05101910136823760c05151156135df576030905360c05151600110156135df576078602160c051015360a0515b60805180518210156132915761319461318a837fff0000000000000000000000000000000000000000000000000000000000000093613740565b5160fc1c8c613740565b5116818060011b0460021482151715613260578160011b6002016002116132605760a0511a6131cb8260011b60020160c051613740565b537fff00000000000000000000000000000000000000000000000000000000000000613209600f6131fe84608051613740565b5160f81c168c613740565b51166003908260011b82018211613260576132309060a0511a918360011b0160c051613740565b537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461326057600101613150565b7f4e487b710000000000000000000000000000000000000000000000000000000060a051526011600452602460a051fd5b5050929598919497509295604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff8a165afa93841561341c5760a051946135ab575b504761342f575b50506133438273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168096613780565b833b15613429576133dc96613394966133eb92604051998a998a998a987fb5417084000000000000000000000000000000000000000000000000000000008a5260a060048b015260a48a0191612ac1565b936133cc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc95868a82030160248b015260c051612e28565b90858983030160448a0152612e28565b92868403016064870152612ac1565b90608483015260a05194859103925af1801561341c576134085750565b613411906127de565b60a051806104685750565b6040513d60a051823e3d90fd5b60a05180fd5b60a05190156135705773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000005b16904790823b1561046857506134e2929186899273ffffffffffffffffffffffffffffffffffffffff61353a8e8e61352a6040519a8b998a987fc62c2002000000000000000000000000000000000000000000000000000000008a523060048b015260e060248b015260e48a0191612ac1565b9261351a7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc94858a82030160448b015260c051612e28565b90848983030160648a0152612e28565b918683030160848701528a612ac1565b958960a48501521660c48301528160a0519503925af1801561341c57613561575b806132ff565b61356a906127de565b3861355b565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000061346f565b9093506020813d6020116135d7575b816135c76020938361283d565b81010312613429575192386132f8565b3d91506135ba565b7f4e487b710000000000000000000000000000000000000000000000000000000060a051526032600452602460a051fd5b91939092947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809082030185528535907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6184360301821215613429576004848301351015613429576020613704838361368e8495896001980135612dec565b73ffffffffffffffffffffffffffffffffffffffff6136b0858a8501016127bd565b16848201526040888301013560408201526136f66136e96136d860608b8601018b8601612f61565b60a0606086015260a0850191612ac1565b9289016080810190612f61565b916080818503910152612ac1565b970195019101918a9495939192612ffd565b60046040517f84744201000000000000000000000000000000000000000000000000000000008152fd5b908151811015613751570160200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b909173ffffffffffffffffffffffffffffffffffffffff80921691604051937fdd62ed3e00000000000000000000000000000000000000000000000000000000855230600486015216908160248501526020938481604481875afa90811561387b57600091613887575b50106137f557505050565b6000916044849260405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248401525af1801561387b57613862575050565b8161387892903d10611c8057611c72818361283d565b50565b6040513d6000823e3d90fd5b908582813d83116138ad575b61389d818361283d565b81010312610468575051386137ea565b503d61389356fea2646970667358221220435a2cd2d202b56a1e349f1519d2066605fc90ac8af85f1d31ce75d3fbd8f07964736f6c634300081100330000000000000000000000004f4495243837681061c4743b74b3eedf548d56a50000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827120000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827120000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd3
Deployed Bytecode
0x604060e08152600436101561001357600080fd5b600090813560e01c806309cc027b1461265f5780630d38218a14612607578063116191b614612599578063167a6f90146124b3578281631a98b2e014611f2f575080633c65974114611daa5780633ca2fd8e14611d4d5780633f4ba83a14611c955780634916065814611aa0578063554bab3c146119db57806358181a80146117775780635c60da1b146117065780635c975abb146116a95780638291286c146116515780638456cb591461156f5780638ca3bf68146111c95780638da5cb5b146111585780639a7165e4146110e75780639ded06df14610f685780639fd0506d14610ef7578063a3499c7314610c27578063d022443414610b9f578063e888e86c14610782578063f2fde38b14610682578063f35af1f8146101805763facd28a91461013f57600080fd5b3461017c5760209073ffffffffffffffffffffffffffffffffffffffff61017461016836612a3d565b94939093929192612b63565b915191168152f35b5080fd5b50907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9160c08336011261017c576101b661279a565b6024359367ffffffffffffffff929160443584811161067e576101dd903690600401612698565b9060643586811161067a576101f6903690600401612698565b96909260843582811161050057610211903690600401612698565b95909260a4359081116104745761022c903690600401612769565b7fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c54610651579061025e91369161290d565b9a8a73ffffffffffffffffffffffffffffffffffffffff92838116156000146105125750509a8a9b905b827f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd31690813b1561050e578c916102ed918c519485809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af1801561050457908b916104ec575b5050807f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a516948851917f935b13f6000000000000000000000000000000000000000000000000000000008352602092836004820152838180610365602482018d8b612ac1565b03818b5afa9081156104b25784908e926104bc575b50602491928c51928380927f70a0823100000000000000000000000000000000000000000000000000000000825230600483015286165afa9384156104b2578d94610478575b505082876103cd92613780565b853b15610474578a9761042097899561043061043f948d519e8f9c8d9b8c9a7f26ef699d000000000000000000000000000000000000000000000000000000008c52608060048d015260848c0191612ac1565b91868a84030160248b0152612ac1565b92868403016044870152612ac1565b90606483015203925af190811561046b57506104585750f35b610461906127de565b6104685780f35b80fd5b513d84823e3d90fd5b8a80fd5b819d50809294503d83116104ab575b610491818361283d565b810103126104a65799518b9a909180876103c0565b600080fd5b503d610487565b8b513d8f823e3d90fd5b602492506104df90823d84116104e5575b6104d7818361283d565b810190612c1f565b9161037a565b503d6104cd565b6104f5906127de565b6105005789386102ff565b8980fd5b89513d8d823e3d90fd5b8c80fd5b8a517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815233602483015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd387161660448301526064820194909452919290918d9182916105c581608481015b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261283d565b519082855af16105d3612c4b565b81610622575b5015908115610618575b506105ef578a9b610288565b600489517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b15386105e3565b8051801592508215610637575b5050386105d9565b61064a9250602080918301019101612b86565b388061062f565b60048a517f6d39fcd0000000000000000000000000000000000000000000000000000000008152fd5b8780fd5b8580fd5b503461017c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576106ba61279a565b907f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c090815473ffffffffffffffffffffffffffffffffffffffff90813391160361075957831690811561073057507f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861638480a25580f35b600490517f49e27cff000000000000000000000000000000000000000000000000000000008152fd5b600482517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b503461017c57610791366126c6565b9689989194969293959951977f935b13f6000000000000000000000000000000000000000000000000000000009a8b8a52602060048b01528c8a602081806107dd602482018d8d612ac1565b0373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5169e8f5afa918215610b945789898c8e6108528973ffffffffffffffffffffffffffffffffffffffff9861085b98829891610b75575b503390612d75565b878c8b8d612bfe565b16610b4c576108aa929187878a8c8f9561087e96519a8b9860208a019b8c612b9e565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810184528361283d565b339151902055828401908685830312610b485784359567ffffffffffffffff8711610500576108e060209361091e988801612a22565b9373ffffffffffffffffffffffffffffffffffffffff6109018589016127bd565b169989519889948593849384528760048501526024840191612ac1565b03915afa938415610b3e578794610b1d575b50868551917f70a0823100000000000000000000000000000000000000000000000000000000835230600484015260208360248173ffffffffffffffffffffffffffffffffffffffff8a165afa928315610b13578293610adc575b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd3166109ce848289613780565b803b15610ad857610a1183929183928a519586809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af19182610ac4575b5050610a8657610a80927fdd7b1484db8d21f4fbda2407f2920037dc379dd66e18b0851aa9d6c14ef493b99492610a5f610a669389610a59612c4b565b96612c7b565b36916128b8565b602081519101209351918291602083526020830190612e28565b0390a380f35b50610a96945036935091506128b8565b602081519101207f7c3aa10c5d96985be6de7d2e6fa79bdef95a95a9cb272f4113b3fe1ca89fedae8280a280f35b610acd906127de565b61067a578738610a1c565b8280fd5b915091506020813d602011610b0b575b81610af96020938361283d565b810103126104a657879051913861098b565b3d9150610aec565b87513d84823e3d90fd5b610b3791945060203d6020116104e5576104d7818361283d565b9238610930565b85513d89823e3d90fd5b8880fd5b60048b517f35b7d550000000000000000000000000000000000000000000000000000000008152fd5b610b8e915060203d6020116104e5576104d7818361283d565b3861084a565b8d51903d90823e3d90fd5b503461017c57610bae36612a3d565b929573ffffffffffffffffffffffffffffffffffffffff610bd68584868b8a8c999899612b63565b16610bfe5791610bf594939161087e9351978895602087019889612b00565b33915190205580f35b600490517f35b7d550000000000000000000000000000000000000000000000000000000008152fd5b503461017c5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57610c5f61279a565b9060443567ffffffffffffffff8111610ef357610c80903690600401612698565b7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c09291925473ffffffffffffffffffffffffffffffffffffffff908133911603610eca578416928251907f8291286c0000000000000000000000000000000000000000000000000000000080835260209283816004818a5afa908115610e93578991610e9d575b5085519182528382600481305afa918215610e93578992610e64575b5003610e3b57853f60243503610e12579082918793610d8a575b5050507fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b915080a27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5580f35b610dcd84936105998751938492868401967f9ded06df00000000000000000000000000000000000000000000000000000000885260248501526044840191612ac1565b5190865af4610dda612c4b565b5015610de95783818080610d3d565b600490517f97905dfb000000000000000000000000000000000000000000000000000000008152fd5b600484517f8f84fb24000000000000000000000000000000000000000000000000000000008152fd5b600484517f68155f9a000000000000000000000000000000000000000000000000000000008152fd5b9091508381813d8311610e8c575b610e7c818361283d565b810103126104a657519038610d23565b503d610e72565b86513d8b823e3d90fd5b90508381813d8311610ec3575b610eb4818361283d565b810103126104a6575138610d07565b503d610eaa565b600483517f30cd7471000000000000000000000000000000000000000000000000000000008152fd5b8380fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c37954915191168152f35b503461017c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760043567ffffffffffffffff8111610ad857610fb8903690600401612698565b9073ffffffffffffffffffffffffffffffffffffffff91827f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416156110be578160209181010312610ef35761100d906127bd565b169081156110615750807f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379557fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab600080a280f35b606490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c6964207061757365722061646472657373000000000000000000006044820152fd5b600484517fbf10dd3a000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7fe330cfee289e568e8774e923acd6e2a00f84be86aa1d02356835d33dbb93970254915191168152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c054915191168152f35b506101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576111fd61279a565b60243567ffffffffffffffff60443581811161067e57611221903690600401612698565b93909160643581811161067a5761123c903690600401612698565b9060843583811161050057611255903690600401612769565b97909360a43590811161047457611270903690600401612769565b96909560c4359873ffffffffffffffffffffffffffffffffffffffff96878b168b036104a65760e4359b8c15158d036104a6577fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c54611546576112d98f9493928f92369161290d565b928985928183161560001461142d5750505050905b877f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd31690813b15610ef3578391611353918f519485809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af180156114235761140f575b505060208a5180967f935b13f600000000000000000000000000000000000000000000000000000000825282600483015281806113a3602482018a8a612ac1565b03917f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5165afa948515611405576113e29a508b956113e5575b50612fb1565b80f35b6113fe91955060203d81116104e5576104d7818361283d565b93386113dc565b8a513d8d823e3d90fd5b611418906127de565b610474578a38611362565b8c513d84823e3d90fd5b517f23b872dd00000000000000000000000000000000000000000000000000000000602082019081523360248301527f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd39290921673ffffffffffffffffffffffffffffffffffffffff166044820152606481019490945291949092909182916114b98160848101610599565b519082855af16114c7612c4b565b81611517575b501590811561150d575b506114e457908c916112ee565b60048c517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b15386114d7565b805180159250821561152c575b5050386114cd565b61153f9250602080918301019101612b86565b3880611524565b60048e517f6d39fcd0000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5773ffffffffffffffffffffffffffffffffffffffff7f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c37954163303611628575060017fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c557f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e7528180a180f35b600490517f492f6781000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57602090517fc097d45e5a99ca772ab5ec2e5457c2e249760944b95b0b97cbb6b03ec55bae848152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576020907fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c5490519015158152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5760209073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54915191168152f35b509060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610468576117ab61279a565b6024359260443567ffffffffffffffff8111610ef3576117cf903690600401612a22565b7fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c546119b2578373ffffffffffffffffffffffffffffffffffffffff93848116156000146118985750508394925b7f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd31690813b156118945784916118819184519586809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af190811561046b57506104585750f35b8480fd5b83517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815233602483015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd38816166044830152606482019890985294969194909186918291906119268160848101610599565b519082855af1611934612c4b565b81611983575b5015908115611979575b5061195057839461181d565b600482517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b1538611944565b8051801592508215611998575b50503861193a565b6119ab9250602080918301019101612b86565b3880611990565b600482517f6d39fcd0000000000000000000000000000000000000000000000000000000008152fd5b503461017c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57611a1361279a565b73ffffffffffffffffffffffffffffffffffffffff91827f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379541633036116285750807fe330cfee289e568e8774e923acd6e2a00f84be86aa1d02356835d33dbb9397025516337f3210edd3f0fc490ffc59a4adae6f48dbda2d8e89afe5b37a0145a54762f3ecf98380a380f35b503461017c577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc90608082360112610ad85767ffffffffffffffff60243581811161189457611af3903690600401612698565b604493919335838111611c9157611b0e903690600401612698565b92909360643590811161067a57611b29903690600401612698565b9096611b3636838a6128b8565b6020815191012090611b958451917f5f6970c3000000000000000000000000000000000000000000000000000000008352600435600484015260806024840152611b8460848401888c612ac1565b908382030160448401528789612ac1565b9160648201526020818073ffffffffffffffffffffffffffffffffffffffff9403818d867f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5165af1908115611c87578a91611c59575b5015611c3057611bff82898789888c612b63565b1615611c2657600096611c1f94610599935196879560208701998a612b00565b5190205580f35b5050505050505080f35b600483517f500c44b4000000000000000000000000000000000000000000000000000000008152fd5b611c7a915060203d8111611c80575b611c72818361283d565b810190612b86565b38611beb565b503d611c68565b84513d8c823e3d90fd5b8680fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5773ffffffffffffffffffffffffffffffffffffffff7f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c379541633036116285750807fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c557fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d169338180a180f35b503461017c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576024359167ffffffffffffffff83116104685750611da06020923690600401612698565b5050516004358152f35b5060c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c5767ffffffffffffffff600435818111610ef357611df6903690600401612698565b60249291923582811161067e57611e11903690600401612698565b9092606435908111611c9157611e2b903690600401612769565b9290916084359473ffffffffffffffffffffffffffffffffffffffff9283871687036104a65760a4359788151589036104a6577fa42f2cf999e26109eb49cb7eef3654cc55b677b2db805f3eab8722cc5dd1af0c546106515760208a5180967f935b13f60000000000000000000000000000000000000000000000000000000082528260048301528180611ec3602482018a8a612ac1565b03917f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5165afa948515611405576113e29a508b95611f0f575b50611f0a6044353387612d75565b612fb1565b611f2891955060203d81116104e5576104d7818361283d565b9338611efc565b8083346124b0577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60c0813601126124ac5760243567ffffffffffffffff81116124a757611f81903690600401612698565b60449291923567ffffffffffffffff811161067e57611fa4903690600401612698565b9060643567ffffffffffffffff811161067a57611fc5903690600401612698565b60849691963567ffffffffffffffff811161050057611fe8903690600401612698565b998a919736611ff890858c6128b8565b80519060200120908b5193849283927f1876eed900000000000000000000000000000000000000000000000000000000845260043560048501526024840160c0905260c48401612049908d8b612ac1565b8185820301604486015261205e908c8c612ac1565b916064850152838203016084840152612077918c612ac1565b60a43560a483015203817f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a573ffffffffffffffffffffffffffffffffffffffff16935a94602095f1908115610504578b91612488575b501561245f576120e660a4358a88848b89898c8a612bfe565b9673ffffffffffffffffffffffffffffffffffffffff8816156121f2576000936105998897948c60209a8d9e999661212e9661216c9f519889978f89019b60a435978d612b9e565b51902055855194859283927f935b13f60000000000000000000000000000000000000000000000000000000084528560048501526024840191612ac1565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5165afa9182156121e5576113e2935084926121c4575b5060a43591612c7b565b6121de91925060203d6020116104e5576104d7818361283d565b90846121ba565b50505051903d90823e3d90fd5b9596509350505050808201928483850312611c915782359367ffffffffffffffff851161067a5761222a602091612287968601612a22565b9173ffffffffffffffffffffffffffffffffffffffff61224b8387016127bd565b1697875196879283927f935b13f60000000000000000000000000000000000000000000000000000000084528560048501526024840191612ac1565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5165afa938415610b3e57879461243e575b50868551917f70a0823100000000000000000000000000000000000000000000000000000000835230600484015260208360248173ffffffffffffffffffffffffffffffffffffffff8a165afa928315610b1357829361240a575b5073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd3169061236f848389613780565b813b15610ad85782916123b09189519485809481937ff87ef80000000000000000000000000000000000000000000000000000000000835260048301612e86565b03925af190816123f7575b50610a8657610a80927fdd7b1484db8d21f4fbda2407f2920037dc379dd66e18b0851aa9d6c14ef493b99492610a5f610a669389610a59612c4b565b612403909891986127de565b96886123bb565b9092506020813d602011612436575b816124266020938361283d565b8101031261017c5751918961232b565b3d9150612419565b61245891945060203d6020116104e5576104d7818361283d565b92876122d0565b600488517f500c44b4000000000000000000000000000000000000000000000000000000008152fd5b6124a1915060203d602011611c8057611c72818361283d565b8b6120cd565b505050fd5b5050fd5b50fd5b50903461046857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610468577fe330cfee289e568e8774e923acd6e2a00f84be86aa1d02356835d33dbb93970273ffffffffffffffffffffffffffffffffffffffff8154163303612570578190337f23e06a2ed150be3aaebbce1156aecc5187e5e955ea717a17e165cca37ef8c37955337fa4336c0cb1e245b95ad204faed7e940d6dc999684fd8b5e1ff597a0c4efca8ab8380a25580f35b600483517fb3a270d8000000000000000000000000000000000000000000000000000000008152fd5b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5168152f35b503461017c57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261017c57602090517fdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f8152f35b503461017c5760209073ffffffffffffffffffffffffffffffffffffffff610174612689366126c6565b97969096959195949294612bfe565b9181601f840112156104a65782359167ffffffffffffffff83116104a657602083818601950101116104a657565b60a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126104a65767ffffffffffffffff906004358281116104a6578161271191600401612698565b939093926024358181116104a6578361272c91600401612698565b939093926044358381116104a6578261274791600401612698565b939093926064359182116104a65761276191600401612698565b909160843590565b9181601f840112156104a65782359167ffffffffffffffff83116104a6576020808501948460051b0101116104a657565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036104a657565b359073ffffffffffffffffffffffffffffffffffffffff821682036104a657565b67ffffffffffffffff81116127f257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff8211176127f257604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176127f257604052565b67ffffffffffffffff81116127f257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926128c48261287e565b916128d2604051938461283d565b8294818452818301116104a6578281602093846000960137010152565b9080601f830112156104a65781602061290a933591016128b8565b90565b9291909267ffffffffffffffff8085116127f2578460051b60408051946020809661293a8286018261283d565b8099815201928501948186116104a65780935b86851061295e575050505050505050565b84358681116104a657820160a09182828603126104a6578551928301838110898211176129f4578652813560048110156104a657835261299f8a83016127bd565b8a84015285820135868401526060808301358981116104a657866129c49185016128ef565b9084015260809283830135938985116104a6576129e5878d968796016128ef565b9082015281520194019361294d565b602460007f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b9080601f830112156104a65781602061290a9335910161290d565b9060607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126104a65767ffffffffffffffff6004358181116104a65783612a8891600401612698565b939093926024358381116104a65782612aa391600401612698565b939093926044359182116104a657612abd91600401612698565b9091565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b969590612b5e93606095612b42612b50937fdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f999660808d5260808d0191612ac1565b918a830360208c0152612ac1565b918783036040890152612ac1565b930152565b94610599919294612b7f9460405196879560208701998a612b00565b5190205490565b908160209103126104a6575180151581036104a65790565b95612b507fdb79ee324babd8834c3c1a1a2739c004fce73b812ac9f637241ff47b19e4b71f999460a09996612b42612bf499959d9e9d612be69760c08d5260c08d0191612ac1565b918483036060860152612ac1565b9460808201520152565b97929461059994612b7f979296989398604051998a9860208a019c8d612b9e565b908160209103126104a6575173ffffffffffffffffffffffffffffffffffffffff811681036104a65790565b3d15612c76573d90612c5c8261287e565b91612c6a604051938461283d565b82523d6000602084013e565b606090565b91906040519173ffffffffffffffffffffffffffffffffffffffff60208401927fa9059cbb000000000000000000000000000000000000000000000000000000008452166024840152604483015260448252608082019082821067ffffffffffffffff8311176127f2576000928392604052519082855af1612cfb612c4b565b81612d46575b5015908115612d3c575b50612d1257565b60046040517f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b90503b1538612d0b565b8051801592508215612d5b575b505038612d01565b612d6e9250602080918301019101612b86565b3880612d53565b6040517f23b872dd000000000000000000000000000000000000000000000000000000006020820190815273ffffffffffffffffffffffffffffffffffffffff90931660248201523060448201526064810193909352916000918291612dde8160848101610599565b519082855af1612cfb612c4b565b906004821015612df95752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b919082519283825260005b848110612e725750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201612e33565b602080820190808352835180925260409283810182858560051b8401019601946000925b858410612ebb575050505050505090565b909192939495968580612f50837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030188528b51612efe828251612dec565b73ffffffffffffffffffffffffffffffffffffffff8482015116848301528781015188830152612f3d6060808301519060a08091860152840190612e28565b9160808092015191818403910152612e28565b990194019401929594939190612eaa565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156104a657016020813591019167ffffffffffffffff82116104a65781360383136104a657565b929391989594600060a05273ffffffffffffffffffffffffffffffffffffffff881615613716576040518096604060208301528060608301526080820160808260051b840101918460a0515b8281106136105750505050613055925073ffffffffffffffffffffffffffffffffffffffff8a166040830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810187528661283d565b6040518060805260203060601b910152601460805152613076608051612821565b6040519761308389612821565b601089527f303132333435363738396162636465660000000000000000000000000000000060208a0152608051518060011b9080820460021490151715613260578060020160021161326057806130ee6130e26130fe9360020161287e565b6040518060c05261283d565b8060020160c0515260020161287e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602060c05101910136823760c05151156135df576030905360c05151600110156135df576078602160c051015360a0515b60805180518210156132915761319461318a837fff0000000000000000000000000000000000000000000000000000000000000093613740565b5160fc1c8c613740565b5116818060011b0460021482151715613260578160011b6002016002116132605760a0511a6131cb8260011b60020160c051613740565b537fff00000000000000000000000000000000000000000000000000000000000000613209600f6131fe84608051613740565b5160f81c168c613740565b51166003908260011b82018211613260576132309060a0511a918360011b0160c051613740565b537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461326057600101613150565b7f4e487b710000000000000000000000000000000000000000000000000000000060a051526011600452602460a051fd5b5050929598919497509295604051927f70a0823100000000000000000000000000000000000000000000000000000000845230600485015260208460248173ffffffffffffffffffffffffffffffffffffffff8a165afa93841561341c5760a051946135ab575b504761342f575b50506133438273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5168096613780565b833b15613429576133dc96613394966133eb92604051998a998a998a987fb5417084000000000000000000000000000000000000000000000000000000008a5260a060048b015260a48a0191612ac1565b936133cc7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc95868a82030160248b015260c051612e28565b90858983030160448a0152612e28565b92868403016064870152612ac1565b90608483015260a05194859103925af1801561341c576134085750565b613411906127de565b60a051806104685750565b6040513d60a051823e3d90fd5b60a05180fd5b60a05190156135705773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827125b16904790823b1561046857506134e2929186899273ffffffffffffffffffffffffffffffffffffffff61353a8e8e61352a6040519a8b998a987fc62c2002000000000000000000000000000000000000000000000000000000008a523060048b015260e060248b015260e48a0191612ac1565b9261351a7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc94858a82030160448b015260c051612e28565b90848983030160648a0152612e28565b918683030160848701528a612ac1565b958960a48501521660c48301528160a0519503925af1801561341c57613561575b806132ff565b61356a906127de565b3861355b565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a08271261346f565b9093506020813d6020116135d7575b816135c76020938361283d565b81010312613429575192386132f8565b3d91506135ba565b7f4e487b710000000000000000000000000000000000000000000000000000000060a051526032600452602460a051fd5b91939092947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff809082030185528535907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6184360301821215613429576004848301351015613429576020613704838361368e8495896001980135612dec565b73ffffffffffffffffffffffffffffffffffffffff6136b0858a8501016127bd565b16848201526040888301013560408201526136f66136e96136d860608b8601018b8601612f61565b60a0606086015260a0850191612ac1565b9289016080810190612f61565b916080818503910152612ac1565b970195019101918a9495939192612ffd565b60046040517f84744201000000000000000000000000000000000000000000000000000000008152fd5b908151811015613751570160200190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b909173ffffffffffffffffffffffffffffffffffffffff80921691604051937fdd62ed3e00000000000000000000000000000000000000000000000000000000855230600486015216908160248501526020938481604481875afa90811561387b57600091613887575b50106137f557505050565b6000916044849260405194859384927f095ea7b300000000000000000000000000000000000000000000000000000000845260048401527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248401525af1801561387b57613862575050565b8161387892903d10611c8057611c72818361283d565b50565b6040513d6000823e3d90fd5b908582813d83116138ad575b61389d818361283d565b81010312610468575051386137ea565b503d61389356fea2646970667358221220435a2cd2d202b56a1e349f1519d2066605fc90ac8af85f1d31ce75d3fbd8f07964736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a50000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827120000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827120000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd3
-----Decoded View---------------
Arg [0] : _gateway (address): 0x4F4495243837681061C4743b74B3eEdf548D56A5
Arg [1] : _gasService (address): 0x2d5d7d31F671F86C782533cc367F14109a082712
Arg [2] : _forecallGasService (address): 0x2d5d7d31F671F86C782533cc367F14109a082712
Arg [3] : _multicall (address): 0x4fd39C9E151e50580779bd04B1f7eCc310079fd3
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5
Arg [1] : 0000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712
Arg [2] : 0000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712
Arg [3] : 0000000000000000000000004fd39c9e151e50580779bd04b1f7ecc310079fd3
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.