Source Code
Overview
ETH Balance
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GovernedOwnerProxy
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./proxies/CommonOwnerProxy.sol";
import "./proxies/BridgeOwnerProxy.sol";
import "./proxies/MessageOwnerProxy.sol";
import "./proxies/SgnOwnerProxy.sol";
import "./proxies/UpgradeableOwnerProxy.sol";
contract GovernedOwnerProxy is
CommonOwnerProxy,
BridgeOwnerProxy,
MessageOwnerProxy,
SgnOwnerProxy,
UpgradeableOwnerProxy
{
constructor(address _initializer) OwnerProxyBase(_initializer) {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface IBridgeOwner {
// for bridges
function resetSigners(address[] calldata _signers, uint256[] calldata _powers) external;
function notifyResetSigners() external;
function increaseNoticePeriod(uint256 _period) external;
function setWrap(address _token) external;
function setSupply(address _token, uint256 _supply) external;
function increaseSupply(address _token, uint256 _delta) external;
function decreaseSupply(address _token, uint256 _delta) external;
function addGovernor(address _account) external;
function removeGovernor(address _account) external;
// for bridge tokens
function updateBridge(address _bridge) external;
function updateBridgeSupplyCap(address _bridge, uint256 _cap) external;
function setBridgeTokenSwapCap(address _bridgeToken, uint256 _swapCap) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface ICommonOwner {
function transferOwnership(address _newOwner) external;
function addPauser(address _account) external;
function removePauser(address _account) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface IMessageOwner {
function setFeePerByte(uint256 _fee) external;
function setFeeBase(uint256 _fee) external;
function setLiquidityBridge(address _addr) external;
function setPegBridge(address _addr) external;
function setPegVault(address _addr) external;
function setPegBridgeV2(address _addr) external;
function setPegVaultV2(address _addr) external;
function setPreExecuteMessageGasUsage(uint256 _usage) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface ISgnOwner {
function setWhitelistEnabled(bool _whitelistEnabled) external;
function addWhitelisted(address _account) external;
function removeWhitelisted(address _account) external;
function setGovContract(address _addr) external;
function setRewardContract(address _addr) external;
function setMaxSlashFactor(uint256 _maxSlashFactor) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
interface IUpgradeableOwner {
function changeProxyAdmin(address _proxy, address _newAdmin) external;
function upgrade(address _proxy, address _implementation) external;
function upgradeAndCall(
address _proxy,
address _implementation,
bytes calldata _data
) external;
function upgradeTo(address _implementation) external;
function upgradeToAndCall(address _implementation, bytes calldata _data) external;
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./OwnerProxyBase.sol";
import "../interfaces/IBridgeOwner.sol";
import {SimpleGovernance as sg} from "../SimpleGovernance.sol";
import {OwnerDataTypes as dt} from "./OwnerDataTypes.sol";
abstract contract BridgeOwnerProxy is OwnerProxyBase {
// for bridges
event ResetSignersProposalCreated(uint256 proposalId, address target, address[] signers, uint256[] powers);
event NotifyResetSignersProposalCreated(uint256 proposalId, address target);
event IncreaseNoticePeriodProposalCreated(uint256 proposalId, address target, uint256 period);
event SetNativeWrapProposalCreated(uint256 proposalId, address target, address token);
event UpdateSupplyProposalCreated(
uint256 proposalId,
address target,
dt.Action action,
address token,
uint256 supply
);
event UpdateGovernorProposalCreated(uint256 proposalId, address target, dt.Action action, address account);
// for bridge tokens
event UpdateBridgeProposalCreated(uint256 proposalId, address target, address bridgeAddr);
event UpdateBridgeSupplyCapProposalCreated(uint256 proposalId, address target, address bridge, uint256 cap);
event SetBridgeTokenSwapCapProposalCreated(uint256 proposalId, address target, address bridgeToken, uint256 cap);
function proposeResetSigners(
address _target,
address[] calldata _signers,
uint256[] calldata _powers
) external {
bytes memory data = abi.encodeWithSelector(IBridgeOwner.resetSigners.selector, _signers, _powers);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit ResetSignersProposalCreated(proposalId, _target, _signers, _powers);
}
function proposeNotifyResetSigners(address _target) external {
bytes memory data = abi.encodeWithSelector(IBridgeOwner.notifyResetSigners.selector);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalFastPass);
emit NotifyResetSignersProposalCreated(proposalId, _target);
}
function proposeIncreaseNoticePeriod(address _target, uint256 _period) external {
bytes memory data = abi.encodeWithSelector(IBridgeOwner.increaseNoticePeriod.selector, _period);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit IncreaseNoticePeriodProposalCreated(proposalId, _target, _period);
}
function proposeSetNativeWrap(address _target, address _token) external {
bytes memory data = abi.encodeWithSelector(IBridgeOwner.setWrap.selector, _token);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetNativeWrapProposalCreated(proposalId, _target, _token);
}
function proposeUpdateSupply(
address _target,
dt.Action _action,
address _token,
uint256 _supply
) external {
bytes4 selector;
if (_action == dt.Action.Set) {
selector = IBridgeOwner.setSupply.selector;
} else if (_action == dt.Action.Add) {
selector = IBridgeOwner.increaseSupply.selector;
} else if (_action == dt.Action.Remove) {
selector = IBridgeOwner.decreaseSupply.selector;
} else {
revert("invalid action");
}
bytes memory data = abi.encodeWithSelector(selector, _token, _supply);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalFastPass);
emit UpdateSupplyProposalCreated(proposalId, _target, _action, _token, _supply);
}
function proposeUpdateGovernor(
address _target,
dt.Action _action,
address _account
) external {
bytes4 selector;
if (_action == dt.Action.Add) {
selector = IBridgeOwner.addGovernor.selector;
} else if (_action == dt.Action.Remove) {
selector = IBridgeOwner.removeGovernor.selector;
} else {
revert("invalid action");
}
bytes memory data = abi.encodeWithSelector(selector, _account);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalFastPass);
emit UpdateGovernorProposalCreated(proposalId, _target, _action, _account);
}
function proposeUpdateBridgeSupplyCap(
address _target,
address _bridge,
uint256 _cap
) external {
bytes memory data = abi.encodeWithSelector(IBridgeOwner.updateBridgeSupplyCap.selector, _bridge, _cap);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit UpdateBridgeSupplyCapProposalCreated(proposalId, _target, _bridge, _cap);
}
function proposeSetBridgeTokenSwapCap(
address _target,
address _bridgeToken,
uint256 _swapCap
) external {
bytes memory data = abi.encodeWithSelector(IBridgeOwner.setBridgeTokenSwapCap.selector, _bridgeToken, _swapCap);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetBridgeTokenSwapCapProposalCreated(proposalId, _target, _bridgeToken, _swapCap);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./OwnerProxyBase.sol";
import "../interfaces/ICommonOwner.sol";
import {SimpleGovernance as sg} from "../SimpleGovernance.sol";
import {OwnerDataTypes as dt} from "./OwnerDataTypes.sol";
abstract contract CommonOwnerProxy is OwnerProxyBase {
event TransferOwnershipProposalCreated(uint256 proposalId, address target, address newOwner);
event UpdatePauserProposalCreated(uint256 proposalId, address target, dt.Action action, address account);
function proposeTransferOwnership(address _target, address _newOwner) external {
bytes memory data = abi.encodeWithSelector(ICommonOwner.transferOwnership.selector, _newOwner);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit TransferOwnershipProposalCreated(proposalId, _target, _newOwner);
}
function proposeUpdatePauser(
address _target,
dt.Action _action,
address _account
) external {
bytes4 selector;
if (_action == dt.Action.Add) {
selector = ICommonOwner.addPauser.selector;
} else if (_action == dt.Action.Remove) {
selector = ICommonOwner.removePauser.selector;
} else {
revert("invalid action");
}
bytes memory data = abi.encodeWithSelector(selector, _account);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalFastPass);
emit UpdatePauserProposalCreated(proposalId, _target, _action, _account);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./OwnerProxyBase.sol";
import "../interfaces/IMessageOwner.sol";
import {SimpleGovernance as sg} from "../SimpleGovernance.sol";
import {OwnerDataTypes as dt} from "./OwnerDataTypes.sol";
abstract contract MessageOwnerProxy is OwnerProxyBase {
event SetMsgFeeProposalCreated(uint256 proposalId, address target, dt.MsgFeeType feeType, uint256 fee);
event SetBridgeAddressProposalCreated(
uint256 proposalId,
address target,
dt.BridgeType bridgeType,
address bridgeAddr
);
event SetPreExecuteMessageGasUsageProposalCreated(uint256 proposalId, address target, uint256 usage);
function proposeSetMsgFee(
address _target,
dt.MsgFeeType _feeType,
uint256 _fee
) external {
bytes4 selector;
if (_feeType == dt.MsgFeeType.PerByte) {
selector = IMessageOwner.setFeePerByte.selector;
} else if (_feeType == dt.MsgFeeType.Base) {
selector = IMessageOwner.setFeeBase.selector;
} else {
revert("invalid fee type");
}
bytes memory data = abi.encodeWithSelector(selector, _fee);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalFastPass);
emit SetMsgFeeProposalCreated(proposalId, _target, _feeType, _fee);
}
function proposeSetBridgeAddress(
address _target,
dt.BridgeType _bridgeType,
address _bridgeAddr
) external {
bytes4 selector;
if (_bridgeType == dt.BridgeType.Liquidity) {
selector = IMessageOwner.setLiquidityBridge.selector;
} else if (_bridgeType == dt.BridgeType.PegBridge) {
selector = IMessageOwner.setPegBridge.selector;
} else if (_bridgeType == dt.BridgeType.PegVault) {
selector = IMessageOwner.setPegVault.selector;
} else if (_bridgeType == dt.BridgeType.PegBridgeV2) {
selector = IMessageOwner.setPegBridgeV2.selector;
} else if (_bridgeType == dt.BridgeType.PegVaultV2) {
selector = IMessageOwner.setPegVaultV2.selector;
} else {
revert("invalid bridge type");
}
bytes memory data = abi.encodeWithSelector(selector, _bridgeAddr);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetBridgeAddressProposalCreated(proposalId, _target, _bridgeType, _bridgeAddr);
}
function proposeSetPreExecuteMessageGasUsage(address _target, uint256 _usage) external {
bytes memory data = abi.encodeWithSelector(IMessageOwner.setPreExecuteMessageGasUsage.selector, _usage);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetPreExecuteMessageGasUsageProposalCreated(proposalId, _target, _usage);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
library OwnerDataTypes {
enum Action {
Set,
Add,
Remove
}
enum MsgFeeType {
PerByte,
Base
}
enum BridgeType {
Liquidity,
PegBridge,
PegVault,
PegBridgeV2,
PegVaultV2
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
import "../SimpleGovernance.sol";
abstract contract OwnerProxyBase {
SimpleGovernance public gov;
address private initializer;
constructor(address _initializer) {
initializer = _initializer;
}
function initGov(SimpleGovernance _gov) public {
require(msg.sender == initializer, "only initializer can init");
require(address(gov) == address(0), "gov addr already set");
gov = _gov;
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./OwnerProxyBase.sol";
import "../interfaces/ISgnOwner.sol";
import {SimpleGovernance as sg} from "../SimpleGovernance.sol";
import {OwnerDataTypes as dt} from "./OwnerDataTypes.sol";
abstract contract SgnOwnerProxy is OwnerProxyBase {
event SetWhitelistEnableProposalCreated(uint256 proposalId, address target, bool enabled);
event UpdateWhitelistedProposalCreated(uint256 proposalId, address target, dt.Action action, address account);
event SetGovContractProposalCreated(uint256 proposalId, address target, address addr);
event SetRewardContractProposalCreated(uint256 proposalId, address target, address addr);
event SetMaxSlashFactorProposalCreated(uint256 proposalId, address target, uint256 maxSlashFactor);
event DrainTokenProposalCreated(uint256 proposalId, address target, address token, uint256 amount);
function proposeSetWhitelistEnable(address _target, bool _enable) external {
bytes memory data = abi.encodeWithSelector(ISgnOwner.setWhitelistEnabled.selector, _enable);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetWhitelistEnableProposalCreated(proposalId, _target, _enable);
}
function proposeUpdateWhitelisted(
address _target,
dt.Action _action,
address _account
) external {
bytes4 selector;
if (_action == dt.Action.Add) {
selector = ISgnOwner.addWhitelisted.selector;
} else if (_action == dt.Action.Remove) {
selector = ISgnOwner.removeWhitelisted.selector;
} else {
revert("invalid action");
}
bytes memory data = abi.encodeWithSelector(selector, _account);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalFastPass);
emit UpdateWhitelistedProposalCreated(proposalId, _target, _action, _account);
}
function proposeSetGovContract(address _target, address _addr) external {
bytes memory data = abi.encodeWithSelector(ISgnOwner.setGovContract.selector, _addr);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetGovContractProposalCreated(proposalId, _target, _addr);
}
function proposeSetRewardContract(address _target, address _addr) external {
bytes memory data = abi.encodeWithSelector(ISgnOwner.setRewardContract.selector, _addr);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetRewardContractProposalCreated(proposalId, _target, _addr);
}
function proposeSetMaxSlashFactor(address _target, uint256 _maxSlashFactor) external {
bytes memory data = abi.encodeWithSelector(ISgnOwner.setMaxSlashFactor.selector, _maxSlashFactor);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit SetMaxSlashFactorProposalCreated(proposalId, _target, _maxSlashFactor);
}
function proposeDrainToken(
address _target,
address _token,
uint256 _amount
) external {
bytes memory data;
if (_token == address(0)) {
data = abi.encodeWithSelector(bytes4(keccak256(bytes("drainToken(uint256"))), _amount);
} else {
data = abi.encodeWithSelector(bytes4(keccak256(bytes("drainToken(address,uint256"))), _token, _amount);
}
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit DrainTokenProposalCreated(proposalId, _target, _token, _amount);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "./OwnerProxyBase.sol";
import "../interfaces/IUpgradeableOwner.sol";
import {SimpleGovernance as sg} from "../SimpleGovernance.sol";
import {OwnerDataTypes as dt} from "./OwnerDataTypes.sol";
abstract contract UpgradeableOwnerProxy is OwnerProxyBase {
event ChangeProxyAdminProposalCreated(uint256 proposalId, address target, address proxy, address newAdmin);
event UpgradeProposalCreated(uint256 proposalId, address target, address proxy, address implementation);
event UpgradeAndCallProposalCreated(
uint256 proposalId,
address target,
address proxy,
address implementation,
bytes data
);
event UpgradeToProposalCreated(uint256 proposalId, address target, address implementation);
event UpgradeToAndCallProposalCreated(uint256 proposalId, address target, address implementation, bytes data);
function proposeChangeProxyAdmin(
address _target,
address _proxy,
address _newAdmin
) external {
bytes memory data = abi.encodeWithSelector(IUpgradeableOwner.changeProxyAdmin.selector, _proxy, _newAdmin);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit ChangeProxyAdminProposalCreated(proposalId, _target, _proxy, _newAdmin);
}
function proposeUpgrade(
address _target,
address _proxy,
address _implementation
) external {
bytes memory data = abi.encodeWithSelector(IUpgradeableOwner.upgrade.selector, _proxy, _implementation);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit UpgradeProposalCreated(proposalId, _target, _proxy, _implementation);
}
function proposeUpgradeAndCall(
address _target,
address _proxy,
address _implementation,
bytes calldata _data
) external {
bytes memory data = abi.encodeWithSelector(
IUpgradeableOwner.upgradeAndCall.selector,
_proxy,
_implementation,
_data
);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit UpgradeAndCallProposalCreated(proposalId, _target, _proxy, _implementation, _data);
}
function proposeUpgradeTo(address _target, address _implementation) external {
bytes memory data = abi.encodeWithSelector(IUpgradeableOwner.upgradeTo.selector, _implementation);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit UpgradeToProposalCreated(proposalId, _target, _implementation);
}
function proposeUpgradeToAndCall(
address _target,
address _implementation,
bytes calldata _data
) external {
bytes memory data = abi.encodeWithSelector(IUpgradeableOwner.upgradeToAndCall.selector, _implementation, _data);
uint256 proposalId = gov.createProposal(msg.sender, _target, data, sg.ProposalType.ExternalDefault);
emit UpgradeToAndCallProposalCreated(proposalId, _target, _implementation, _data);
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity 0.8.17;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../libraries/Utils.sol";
// mainly used for governed-owner to do infrequent sgn/cbridge owner operations,
// relatively prefer easy-to-use over gas-efficiency
contract SimpleGovernance {
uint256 public constant THRESHOLD_DECIMAL = 100;
uint256 public constant MIN_ACTIVE_PERIOD = 3600; // one hour
uint256 public constant MAX_ACTIVE_PERIOD = 2419200; // four weeks
using SafeERC20 for IERC20;
enum ParamName {
ActivePeriod,
QuorumThreshold, // default threshold for votes to pass
FastPassThreshold // lower threshold for less critical operations
}
enum ProposalType {
ExternalDefault,
ExternalFastPass,
InternalParamChange,
InternalVoterUpdate,
InternalProxyUpdate,
InternalTransferToken
}
mapping(ParamName => uint256) public params;
struct Proposal {
bytes32 dataHash; // hash(proposalType, targetAddress, calldata)
uint256 deadline;
mapping(address => bool) votes;
}
mapping(uint256 => Proposal) public proposals;
uint256 public nextProposalId;
address[] public voters;
mapping(address => uint256) public voterPowers; // voter addr -> voting power
// NOTE: proxies must be audited open-source non-upgradable contracts with following requirements:
// 1. Truthfully pass along tx sender who called the proxy function as the governance proposer.
// 2. Do not allow arbitrary fastpass proposal with calldata constructed by the proxy callers.
// See ./proxies/CommonOwnerProxy.sol for example.
mapping(address => bool) public proposerProxies;
event Initiated(
address[] voters,
uint256[] powers,
address[] proxies,
uint256 activePeriod,
uint256 quorumThreshold,
uint256 fastPassThreshold
);
event ProposalCreated(
uint256 proposalId,
ProposalType proposalType,
address target,
bytes data,
uint256 deadline,
address proposer
);
event ProposalVoted(uint256 proposalId, address voter, bool vote);
event ProposalExecuted(uint256 proposalId);
event ParamChangeProposalCreated(uint256 proposalId, ParamName name, uint256 value);
event VoterUpdateProposalCreated(uint256 proposalId, address[] voters, uint256[] powers);
event ProxyUpdateProposalCreated(uint256 proposalId, address[] addrs, bool[] ops);
event TransferTokenProposalCreated(uint256 proposalId, address receiver, address token, uint256 amount);
constructor(
address[] memory _voters,
uint256[] memory _powers,
address[] memory _proxies,
uint256 _activePeriod,
uint256 _quorumThreshold,
uint256 _fastPassThreshold
) {
require(_voters.length > 0 && _voters.length == _powers.length, "invalid init voters");
require(_activePeriod <= MAX_ACTIVE_PERIOD && _activePeriod >= MIN_ACTIVE_PERIOD, "invalid active period");
require(
_quorumThreshold < THRESHOLD_DECIMAL && _fastPassThreshold <= _quorumThreshold,
"invalid init thresholds"
);
for (uint256 i = 0; i < _voters.length; i++) {
_setVoter(_voters[i], _powers[i]);
}
for (uint256 i = 0; i < _proxies.length; i++) {
proposerProxies[_proxies[i]] = true;
}
params[ParamName.ActivePeriod] = _activePeriod;
params[ParamName.QuorumThreshold] = _quorumThreshold;
params[ParamName.FastPassThreshold] = _fastPassThreshold;
emit Initiated(_voters, _powers, _proxies, _activePeriod, _quorumThreshold, _fastPassThreshold);
}
/*********************************
* External and Public Functions *
*********************************/
function createProposal(address _target, bytes memory _data) external returns (uint256) {
return _createProposal(msg.sender, _target, _data, ProposalType.ExternalDefault);
}
// create proposal through proxy
function createProposal(
address _proposer,
address _target,
bytes memory _data,
ProposalType _type
) external returns (uint256) {
require(proposerProxies[msg.sender], "sender is not a valid proxy");
require(_type == ProposalType.ExternalDefault || _type == ProposalType.ExternalFastPass, "invalid type");
return _createProposal(_proposer, _target, _data, _type);
}
function createParamChangeProposal(ParamName _name, uint256 _value) external returns (uint256) {
bytes memory data = abi.encode(_name, _value);
uint256 proposalId = _createProposal(msg.sender, address(0), data, ProposalType.InternalParamChange);
emit ParamChangeProposalCreated(proposalId, _name, _value);
return proposalId;
}
function createVoterUpdateProposal(address[] calldata _voters, uint256[] calldata _powers)
external
returns (uint256)
{
require(_voters.length == _powers.length, "voters and powers length not match");
bytes memory data = abi.encode(_voters, _powers);
uint256 proposalId = _createProposal(msg.sender, address(0), data, ProposalType.InternalVoterUpdate);
emit VoterUpdateProposalCreated(proposalId, _voters, _powers);
return proposalId;
}
function createProxyUpdateProposal(address[] calldata _addrs, bool[] calldata _ops) external returns (uint256) {
require(_addrs.length == _ops.length, "_addrs and _ops length not match");
bytes memory data = abi.encode(_addrs, _ops);
uint256 proposalId = _createProposal(msg.sender, address(0), data, ProposalType.InternalProxyUpdate);
emit ProxyUpdateProposalCreated(proposalId, _addrs, _ops);
return proposalId;
}
function createTransferTokenProposal(
address _receiver,
address _token,
uint256 _amount
) external returns (uint256) {
bytes memory data = abi.encode(_receiver, _token, _amount);
uint256 proposalId = _createProposal(msg.sender, address(0), data, ProposalType.InternalTransferToken);
emit TransferTokenProposalCreated(proposalId, _receiver, _token, _amount);
return proposalId;
}
function voteProposal(uint256 _proposalId, bool _vote) external {
require(voterPowers[msg.sender] > 0, "invalid voter");
Proposal storage p = proposals[_proposalId];
require(block.timestamp < p.deadline, "deadline passed");
p.votes[msg.sender] = _vote;
emit ProposalVoted(_proposalId, msg.sender, _vote);
}
function executeProposal(
uint256 _proposalId,
ProposalType _type,
address _target,
bytes calldata _data
) external {
require(voterPowers[msg.sender] > 0, "only voter can execute a proposal");
Proposal storage p = proposals[_proposalId];
require(block.timestamp < p.deadline, "deadline passed");
require(keccak256(abi.encodePacked(_type, _target, _data)) == p.dataHash, "data hash not match");
p.deadline = 0;
p.votes[msg.sender] = true;
(, , bool pass) = countVotes(_proposalId, _type);
require(pass, "not enough votes");
if (_type == ProposalType.ExternalDefault || _type == ProposalType.ExternalFastPass) {
(bool success, bytes memory res) = _target.call(_data);
require(success, Utils.getRevertMsg(res));
} else if (_type == ProposalType.InternalParamChange) {
(ParamName name, uint256 value) = abi.decode((_data), (ParamName, uint256));
params[name] = value;
if (name == ParamName.ActivePeriod) {
require(value <= MAX_ACTIVE_PERIOD && value >= MIN_ACTIVE_PERIOD, "invalid active period");
} else if (name == ParamName.QuorumThreshold || name == ParamName.FastPassThreshold) {
require(
params[ParamName.QuorumThreshold] >= params[ParamName.FastPassThreshold] &&
value < THRESHOLD_DECIMAL &&
value > 0,
"invalid threshold"
);
}
} else if (_type == ProposalType.InternalVoterUpdate) {
(address[] memory addrs, uint256[] memory powers) = abi.decode((_data), (address[], uint256[]));
for (uint256 i = 0; i < addrs.length; i++) {
if (powers[i] > 0) {
_setVoter(addrs[i], powers[i]);
} else {
_removeVoter(addrs[i]);
}
}
} else if (_type == ProposalType.InternalProxyUpdate) {
(address[] memory addrs, bool[] memory ops) = abi.decode((_data), (address[], bool[]));
for (uint256 i = 0; i < addrs.length; i++) {
if (ops[i]) {
proposerProxies[addrs[i]] = true;
} else {
delete proposerProxies[addrs[i]];
}
}
} else if (_type == ProposalType.InternalTransferToken) {
(address receiver, address token, uint256 amount) = abi.decode((_data), (address, address, uint256));
_transfer(receiver, token, amount);
}
emit ProposalExecuted(_proposalId);
}
receive() external payable {}
/**************************
* Public View Functions *
**************************/
function getVoters() public view returns (address[] memory, uint256[] memory) {
address[] memory addrs = new address[](voters.length);
uint256[] memory powers = new uint256[](voters.length);
for (uint32 i = 0; i < voters.length; i++) {
addrs[i] = voters[i];
powers[i] = voterPowers[voters[i]];
}
return (addrs, powers);
}
function getVote(uint256 _proposalId, address _voter) public view returns (bool) {
return proposals[_proposalId].votes[_voter];
}
function countVotes(uint256 _proposalId, ProposalType _type)
public
view
returns (
uint256,
uint256,
bool
)
{
uint256 yesVotes;
uint256 totalPower;
for (uint32 i = 0; i < voters.length; i++) {
if (getVote(_proposalId, voters[i])) {
yesVotes += voterPowers[voters[i]];
}
totalPower += voterPowers[voters[i]];
}
uint256 threshold;
if (_type == ProposalType.ExternalFastPass) {
threshold = params[ParamName.FastPassThreshold];
} else {
threshold = params[ParamName.QuorumThreshold];
}
bool pass = (yesVotes >= (totalPower * threshold) / THRESHOLD_DECIMAL);
return (totalPower, yesVotes, pass);
}
/**********************************
* Internal and Private Functions *
**********************************/
// create a proposal and vote yes
function _createProposal(
address _proposer,
address _target,
bytes memory _data,
ProposalType _type
) private returns (uint256) {
require(voterPowers[_proposer] > 0, "only voter can create a proposal");
uint256 proposalId = nextProposalId;
nextProposalId += 1;
Proposal storage p = proposals[proposalId];
p.dataHash = keccak256(abi.encodePacked(_type, _target, _data));
p.deadline = block.timestamp + params[ParamName.ActivePeriod];
p.votes[_proposer] = true;
emit ProposalCreated(proposalId, _type, _target, _data, p.deadline, _proposer);
return proposalId;
}
function _setVoter(address _voter, uint256 _power) private {
require(_power > 0, "zero power");
if (voterPowers[_voter] == 0) {
// add new voter
voters.push(_voter);
}
voterPowers[_voter] = _power;
}
function _removeVoter(address _voter) private {
require(voterPowers[_voter] > 0, "not a voter");
uint256 lastIndex = voters.length - 1;
for (uint256 i = 0; i < voters.length; i++) {
if (voters[i] == _voter) {
if (i < lastIndex) {
voters[i] = voters[lastIndex];
}
voters.pop();
voterPowers[_voter] = 0;
return;
}
}
revert("voter not found"); // this should never happen
}
function _transfer(
address _receiver,
address _token,
uint256 _amount
) private {
if (_token == address(0)) {
(bool sent, ) = _receiver.call{value: _amount, gas: 50000}("");
require(sent, "failed to send native token");
} else {
IERC20(_token).safeTransfer(_receiver, _amount);
}
}
}// SPDX-License-Identifier: GPL-3.0-only
pragma solidity >=0.8.0;
library Utils {
// https://ethereum.stackexchange.com/a/83577
// https://github.com/Uniswap/v3-periphery/blob/v1.0.0/contracts/base/Multicall.sol
function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
// If the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68) return "Transaction reverted silently";
assembly {
// Slice the sighash.
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // All that remains is the revert string
}
}{
"optimizer": {
"enabled": true,
"runs": 800
},
"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":"_initializer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"ChangeProxyAdminProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DrainTokenProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"period","type":"uint256"}],"name":"IncreaseNoticePeriodProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"}],"name":"NotifyResetSignersProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"name":"ResetSignersProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"enum OwnerDataTypes.BridgeType","name":"bridgeType","type":"uint8"},{"indexed":false,"internalType":"address","name":"bridgeAddr","type":"address"}],"name":"SetBridgeAddressProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"bridgeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"SetBridgeTokenSwapCapProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"SetGovContractProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxSlashFactor","type":"uint256"}],"name":"SetMaxSlashFactorProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"enum OwnerDataTypes.MsgFeeType","name":"feeType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"SetMsgFeeProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"SetNativeWrapProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"usage","type":"uint256"}],"name":"SetPreExecuteMessageGasUsageProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"SetRewardContractProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetWhitelistEnableProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnershipProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"bridgeAddr","type":"address"}],"name":"UpdateBridgeProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"bridge","type":"address"},{"indexed":false,"internalType":"uint256","name":"cap","type":"uint256"}],"name":"UpdateBridgeSupplyCapProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"enum OwnerDataTypes.Action","name":"action","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"UpdateGovernorProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"enum OwnerDataTypes.Action","name":"action","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"UpdatePauserProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"enum OwnerDataTypes.Action","name":"action","type":"uint8"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"UpdateSupplyProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"enum OwnerDataTypes.Action","name":"action","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"UpdateWhitelistedProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"UpgradeAndCallProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"proxy","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"UpgradeProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"UpgradeToAndCallProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"UpgradeToProposalCreated","type":"event"},{"inputs":[],"name":"gov","outputs":[{"internalType":"contract SimpleGovernance","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract SimpleGovernance","name":"_gov","type":"address"}],"name":"initGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_proxy","type":"address"},{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"proposeChangeProxyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"proposeDrainToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"proposeIncreaseNoticePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"proposeNotifyResetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"proposeResetSigners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"enum OwnerDataTypes.BridgeType","name":"_bridgeType","type":"uint8"},{"internalType":"address","name":"_bridgeAddr","type":"address"}],"name":"proposeSetBridgeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_bridgeToken","type":"address"},{"internalType":"uint256","name":"_swapCap","type":"uint256"}],"name":"proposeSetBridgeTokenSwapCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_addr","type":"address"}],"name":"proposeSetGovContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_maxSlashFactor","type":"uint256"}],"name":"proposeSetMaxSlashFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"enum OwnerDataTypes.MsgFeeType","name":"_feeType","type":"uint8"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"proposeSetMsgFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"proposeSetNativeWrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_usage","type":"uint256"}],"name":"proposeSetPreExecuteMessageGasUsage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_addr","type":"address"}],"name":"proposeSetRewardContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"proposeSetWhitelistEnable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"proposeTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_bridge","type":"address"},{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"proposeUpdateBridgeSupplyCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"enum OwnerDataTypes.Action","name":"_action","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"proposeUpdateGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"enum OwnerDataTypes.Action","name":"_action","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"proposeUpdatePauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"enum OwnerDataTypes.Action","name":"_action","type":"uint8"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"proposeUpdateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"enum OwnerDataTypes.Action","name":"_action","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"proposeUpdateWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_proxy","type":"address"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"proposeUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_proxy","type":"address"},{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"proposeUpgradeAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_implementation","type":"address"}],"name":"proposeUpgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"proposeUpgradeToAndCall","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002a0938038062002a0983398101604081905262000034916200005a565b600180546001600160a01b0319166001600160a01b03929092169190911790556200008c565b6000602082840312156200006d57600080fd5b81516001600160a01b03811681146200008557600080fd5b9392505050565b61296d806200009c6000396000f3fe608060405234801561001057600080fd5b50600436106101ad5760003560e01c806377e96d21116100ee578063a71ac5f011610097578063adf43efb11610071578063adf43efb14610372578063bcf612fc14610385578063d19bf98b14610398578063dc797ce3146103ab57600080fd5b8063a71ac5f014610339578063a9ed9d161461034c578063aa9f79431461035f57600080fd5b806382887e02116100c857806382887e02146103005780639f492e7c14610313578063a2ac8d861461032657600080fd5b806377e96d21146102c757806378a4f076146102da5780637f1f1990146102ed57600080fd5b8063215a5b9c1161015b57806338cd4d091161013557806338cd4d091461027b57806339acf6951461028e57806339f2b651146102a1578063656fe066146102b457600080fd5b8063215a5b9c14610242578063224468a8146102555780632ef754af1461026857600080fd5b8063173a06f91161018c578063173a06f9146102095780631a6ca6da1461021c5780631de8a0161461022f57600080fd5b8062395f11146101b25780630de54802146101c757806312d43a51146101da575b600080fd5b6101c56101c0366004612153565b6103be565b005b6101c56101d536600461217f565b6104c5565b6000546101ed906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b6101c5610217366004612204565b6105c9565b6101c561022a36600461217f565b6106e3565b6101c561023d366004612287565b6107e7565b6101c561025036600461217f565b610907565b6101c561026336600461217f565b610a0b565b6101c56102763660046122e6565b610b0f565b6101c5610289366004612153565b610cca565b6101c561029c366004612377565b610dc7565b6101c56102af366004612153565b610edc565b6101c56102c23660046123dc565b610fd9565b6101c56102d5366004612421565b61116b565b6101c56102e8366004612451565b61127a565b6101c56102fb36600461247f565b6113c5565b6101c561030e3660046124b3565b6115cf565b6101c5610321366004612451565b6116d4565b6101c56103343660046124e6565b61181f565b6101c561034736600461250a565b61190d565b6101c561035a3660046124e6565b611a16565b6101c561036d366004612287565b611b03565b6101c5610380366004612451565b611c18565b6101c561039336600461217f565b611d63565b6101c56103a6366004612421565b611e67565b6101c56103b9366004612421565b61202c565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316631a20325760e01b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd4802749061042f90339088908790879060040161258b565b6020604051808303816000875af115801561044e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610472919061260d565b604080518281526001600160a01b03871660208201529081018590529091507f170cfbd4ca14e4c07750912ad957e666499c81fdfef63021cde154c6ffaac2d7906060015b60405180910390a150505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631a1c1b9560e21b179052600080549351633f52009d60e21b81529293909291169063fd4802749061053990339088908790879060040161258b565b6020604051808303816000875af1158015610558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057c919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f0440d8b8371306b54b33893631962ccab8e82436d91eb4a2c481454cc2ed4781906060016104b7565b600063a7bdf45a60e01b858585856040516024016105ea94939291906126ba565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906106549033908b908790879060040161258b565b6020604051808303816000875af1158015610673573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610697919061260d565b90507f4c42642dbb775b1ef06ad1492581510de04ccfb5ad078338d6ae369b56f356a08188888888886040516106d2969594939291906126ec565b60405180910390a150505050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631b2ce7f360e11b179052600080549351633f52009d60e21b81529293909291169063fd4802749061075790339088908790879060040161258b565b6020604051808303816000875af1158015610776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079a919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f322efec8297181586148e7711ed39e230b706795edf152fd4e3a3a8fc009d33b906060016104b7565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b0316633f7f93af60e11b179052600080549351633f52009d60e21b81529293909291169063fd4802749061086390339089908790879060040161258b565b6020604051808303816000875af1158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a6919061260d565b604080518281526001600160a01b0380891660208301528088169282019290925290851660608201529091507f892ed68a932643ffae382937ae40947f858726f5014c80e6612255d981508090906080015b60405180910390a15050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663f2fde38b60e01b179052600080549351633f52009d60e21b81529293909291169063fd4802749061097b90339088908790879060040161258b565b6020604051808303816000875af115801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f666b010a757cac3ae1a73c875457e65b327e73589feb2d450b6d703a4ec588d9906060016104b7565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316634ffc800d60e11b179052600080549351633f52009d60e21b81529293909291169063fd48027490610a7f90339088908790879060040161258b565b6020604051808303816000875af1158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f0691c48365957fae1547e6922078da4127a4ec5beedd4aca7b80a5c793722556906060016104b7565b600080846002811115610b2457610b24612575565b03610b375750632d3633b760e21b610bd2565b6001846002811115610b4b57610b4b612575565b03610b5e5750633cfe6c7760e11b610bd2565b6002846002811115610b7257610b72612575565b03610b85575063057425d760e21b610bd2565b60405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616374696f6e00000000000000000000000000000000000060448201526064015b60405180910390fd5b604080516001600160a01b038581166024830152604480830186905283518084039091018152606490920183526020820180516001600160e01b03166001600160e01b03198616179052600080549351633f52009d60e21b81529293909291169063fd48027490610c4e9033908b90879060019060040161258b565b6020604051808303816000875af1158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c91919061260d565b90507f68a1245119792f0c0b4396c9d85ed7e432c53279527235d14c64bc4e801d2bb081888888886040516106d2959493929190612749565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316634586f33160e01b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd48027490610d3b90339088908790879060040161258b565b6020604051808303816000875af1158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e919061260d565b604080518281526001600160a01b03871660208201529081018590529091507fa140c5e7d56a62eaaaa3aeb3b9d49c5fc85004d8d25920be0bce5e08a0b7ec9b906060016104b7565b6000634f1ef28660e01b848484604051602401610de6939291906127ab565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd48027490610e509033908a908790879060040161258b565b6020604051808303816000875af1158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e93919061260d565b90507f7936bef0e4e9424795215dbcddd145b5f6ccbe6d35ed9ceacc3c9cec1b1a1ed18187878787604051610ecc9594939291906127d7565b60405180910390a1505050505050565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316637906491560e11b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd48027490610f4d90339088908790879060040161258b565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061260d565b604080518281526001600160a01b03871660208201529081018590529091507f27cc981a956034897b297d307eaa4e907654717913a238daf3e32a5bd0e18aea906060016104b7565b600080836001811115610fee57610fee612575565b03611001575063e2c1ed2560e01b611070565b600183600181111561101557611015612575565b03611028575063036145eb60e11b611070565b60405162461bcd60e51b815260206004820152601060248201527f696e76616c6964206665652074797065000000000000000000000000000000006044820152606401610bc9565b6000818360405160240161108691815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906110f19033908a90879060019060040161258b565b6020604051808303816000875af1158015611110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611134919061260d565b90507f924ed1dc9162d297ef826f4eb457b22796e62033fea2fb6f201c13661d04c64181878787604051610ecc949392919061280a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663cd04611960e01b179052600080549351633f52009d60e21b81529293909291169063fd480274906111e390339089908790879060040161258b565b6020604051808303816000875af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611226919061260d565b604080518281526001600160a01b038089166020830152871691810191909152606081018590529091507fbbf294b7b2aadbd73c0198ccea847bbc640871eb1ad2a0b01ac080d077f088e7906080016108f8565b6000600183600281111561129057611290612575565b036112a357506320b707b160e21b6112c6565b60028360028111156112b7576112b7612575565b03610b855750636b2c0f5560e01b5b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd4802749061134b9033908a90879060019060040161258b565b6020604051808303816000875af115801561136a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138e919061260d565b90507f9fe02e73a05d9dc9d3f3cb9423f6531a055a6083c43978dc2b64d6e505e4366581878787604051610ecc9493929190612842565b6000808360048111156113da576113da612575565b036113ed575063588be02b60e01b6114d1565b600183600481111561140157611401612575565b0361141457506301e5ff3360e11b6114d1565b600283600481111561142857611428612575565b0361143b5750639b05a77560e01b6114d1565b600383600481111561144f5761144f612575565b036114625750634177ea8160e11b6114d1565b600483600481111561147657611476612575565b03611489575063f83b0fb960e01b6114d1565b60405162461bcd60e51b815260206004820152601360248201527f696e76616c6964206272696467652074797065000000000000000000000000006044820152606401610bc9565b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906115559033908a908790879060040161258b565b6020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611598919061260d565b90507f1605f3e8c96ab34dc0790b6937e2f0c59bb340db6e689a77bc500789d32314f881878787604051610ecc9493929190612879565b6040805182151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316630296cf3f60e11b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd4802749061164490339088908790879060040161258b565b6020604051808303816000875af1158015611663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611687919061260d565b604080518281526001600160a01b0387166020820152851515918101919091529091507fb415e98e9740cf326dbeb0b43f0fa7d742ab13c6c2fc4e0042b6289cca074526906060016104b7565b600060018360028111156116ea576116ea612575565b036116fd57506310154bad60e01b611720565b600283600281111561171157611711612575565b03610b85575063291d954960e01b5b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906117a59033908a90879060019060040161258b565b6020604051808303816000875af11580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e8919061260d565b90507f4336c9be2e5abfad187a39a7f7346158c644f54824688bb5a5b335f9306fb9bb81878787604051610ecc9493929190612842565b6040805160048082526024820183526020820180516001600160e01b03166325c38b9f60e01b179052600080549351633f52009d60e21b8152929390926001600160a01b039091169163fd48027491611881913391889188916001910161258b565b6020604051808303816000875af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c4919061260d565b604080518281526001600160a01b03861660208201529192507f149a32d950b4bc0cb34725d5a842addc6f3e428807357a578301e078cc644357910160405180910390a1505050565b6000639623609d60e01b8585858560405160240161192e94939291906128b9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906119989033908b908790879060040161258b565b6020604051808303816000875af11580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db919061260d565b90507ff6b46465ce70c6b53ccde6e33cdd45c1906ded1e8553ff64ebdadf97d3ac29518188888888886040516106d2969594939291906128f0565b6001546001600160a01b03163314611a705760405162461bcd60e51b815260206004820152601960248201527f6f6e6c7920696e697469616c697a65722063616e20696e6974000000000000006044820152606401610bc9565b6000546001600160a01b031615611ac95760405162461bcd60e51b815260206004820152601460248201527f676f76206164647220616c7265616479207365740000000000000000000000006044820152606401610bc9565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663266a23b160e21b179052600080549351633f52009d60e21b81529293909291169063fd48027490611b7f90339089908790879060040161258b565b6020604051808303816000875af1158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc2919061260d565b604080518281526001600160a01b0380891660208301528088169282019290925290851660608201529091507fc1dead51ac2e9fa286784eeefebacaf915332934c6d6fd290ec2c8de51c78632906080016108f8565b60006001836002811115611c2e57611c2e612575565b03611c4157506303c4a25d60e41b611c64565b6002836002811115611c5557611c55612575565b03610b855750631dd9b59160e31b5b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd48027490611ce99033908a90879060019060040161258b565b6020604051808303816000875af1158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c919061260d565b90507f725ab9c9498b34fa1336448b0dc8dfb419461e03707ace510d44e8bb63d8485181878787604051610ecc9493929190612842565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166328a8478560e11b179052600080549351633f52009d60e21b81529293909291169063fd48027490611dd790339088908790879060040161258b565b6020604051808303816000875af1158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f8aaee1ae0ee9b8019d672115e172cd8fd03686f0f117ce65aa0ed224ca6d12b3906060016104b7565b60606001600160a01b038316611ee55750604080518082018252601281527f647261696e546f6b656e2875696e74323536000000000000000000000000000060209182015281516024808201859052835180830390910181526044909101909252810180516001600160e01b031663a76cd1bb60e01b179052611f5e565b50604080518082018252601a81527f647261696e546f6b656e28616464726573732c75696e7432353600000000000060209182015281516001600160a01b03851660248201526044808201859052835180830390910181526064909101909252810180516001600160e01b0316634dd256db60e11b1790525b60008054604051633f52009d60e21b81526001600160a01b039091169063fd48027490611f9590339089908790879060040161258b565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd8919061260d565b604080518281526001600160a01b038089166020830152871691810191909152606081018590529091507f07315b20d3a4862680a34cedf6a8b62bd45bdf98fa602f664417d8a84d47c1bc906080016108f8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03166326717b8d60e11b179052600080549351633f52009d60e21b81529293909291169063fd480274906120a490339089908790879060040161258b565b6020604051808303816000875af11580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e7919061260d565b604080518281526001600160a01b038089166020830152871691810191909152606081018590529091507fdf93094bf7ed4f11758b798f8463ab250ae3db9edc392c26b92443f3cf731004906080016108f8565b6001600160a01b038116811461215057600080fd5b50565b6000806040838503121561216657600080fd5b82356121718161213b565b946020939093013593505050565b6000806040838503121561219257600080fd5b823561219d8161213b565b915060208301356121ad8161213b565b809150509250929050565b60008083601f8401126121ca57600080fd5b50813567ffffffffffffffff8111156121e257600080fd5b6020830191508360208260051b85010111156121fd57600080fd5b9250929050565b60008060008060006060868803121561221c57600080fd5b85356122278161213b565b9450602086013567ffffffffffffffff8082111561224457600080fd5b61225089838a016121b8565b9096509450604088013591508082111561226957600080fd5b50612276888289016121b8565b969995985093965092949392505050565b60008060006060848603121561229c57600080fd5b83356122a78161213b565b925060208401356122b78161213b565b915060408401356122c78161213b565b809150509250925092565b8035600381106122e157600080fd5b919050565b600080600080608085870312156122fc57600080fd5b84356123078161213b565b9350612315602086016122d2565b925060408501356123258161213b565b9396929550929360600135925050565b60008083601f84011261234757600080fd5b50813567ffffffffffffffff81111561235f57600080fd5b6020830191508360208285010111156121fd57600080fd5b6000806000806060858703121561238d57600080fd5b84356123988161213b565b935060208501356123a88161213b565b9250604085013567ffffffffffffffff8111156123c457600080fd5b6123d087828801612335565b95989497509550505050565b6000806000606084860312156123f157600080fd5b83356123fc8161213b565b925060208401356002811061241057600080fd5b929592945050506040919091013590565b60008060006060848603121561243657600080fd5b83356124418161213b565b925060208401356124108161213b565b60008060006060848603121561246657600080fd5b83356124718161213b565b92506122b7602085016122d2565b60008060006060848603121561249457600080fd5b833561249f8161213b565b92506020840135600581106122b757600080fd5b600080604083850312156124c657600080fd5b82356124d18161213b565b9150602083013580151581146121ad57600080fd5b6000602082840312156124f857600080fd5b81356125038161213b565b9392505050565b60008060008060006080868803121561252257600080fd5b853561252d8161213b565b9450602086013561253d8161213b565b9350604086013561254d8161213b565b9250606086013567ffffffffffffffff81111561256957600080fd5b61227688828901612335565b634e487b7160e01b600052602160045260246000fd5b60006001600160a01b038087168352602081871681850152608060408501528551915081608085015260005b828110156125d35786810182015185820160a0015281016125b7565b5050600060a0828501015260a0601f19601f830116840101915050600683106125fe576125fe612575565b82606083015295945050505050565b60006020828403121561261f57600080fd5b5051919050565b8183526000602080850194508260005b858110156126645781356126498161213b565b6001600160a01b031687529582019590820190600101612636565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156126a157600080fd5b8260051b80836020870137939093016020019392505050565b6040815260006126ce604083018688612626565b82810360208401526126e181858761266f565b979650505050505050565b8681526001600160a01b0386166020820152608060408201526000612715608083018688612626565b828103606084015261272881858761266f565b9998505050505050505050565b6003811061274557612745612575565b9052565b8581526001600160a01b03858116602083015260a082019061276e6040840187612735565b939093166060820152608001529392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082015260006127ce604083018486612782565b95945050505050565b85815260006001600160a01b038087166020840152808616604084015250608060608301526126e1608083018486612782565b8481526001600160a01b0384166020820152608081016002841061283057612830612575565b60408201939093526060015292915050565b8481526001600160a01b03848116602083015260808201906128676040840186612735565b80841660608401525095945050505050565b8481526001600160a01b0384811660208301526080820190600585106128a1576128a1612575565b84604084015280841660608401525095945050505050565b60006001600160a01b038087168352808616602084015250606060408301526128e6606083018486612782565b9695505050505050565b86815260006001600160a01b038088166020840152808716604084015280861660608401525060a0608083015261292b60a083018486612782565b9897505050505050505056fea264697066735822122040fd291fb80dd9b7f06829bdfed554db902d3d02f43b04b2a9ce22850c82e42e64736f6c634300081100330000000000000000000000001b9dfc56e38b0f92448659c114e2347bd803911c
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c806377e96d21116100ee578063a71ac5f011610097578063adf43efb11610071578063adf43efb14610372578063bcf612fc14610385578063d19bf98b14610398578063dc797ce3146103ab57600080fd5b8063a71ac5f014610339578063a9ed9d161461034c578063aa9f79431461035f57600080fd5b806382887e02116100c857806382887e02146103005780639f492e7c14610313578063a2ac8d861461032657600080fd5b806377e96d21146102c757806378a4f076146102da5780637f1f1990146102ed57600080fd5b8063215a5b9c1161015b57806338cd4d091161013557806338cd4d091461027b57806339acf6951461028e57806339f2b651146102a1578063656fe066146102b457600080fd5b8063215a5b9c14610242578063224468a8146102555780632ef754af1461026857600080fd5b8063173a06f91161018c578063173a06f9146102095780631a6ca6da1461021c5780631de8a0161461022f57600080fd5b8062395f11146101b25780630de54802146101c757806312d43a51146101da575b600080fd5b6101c56101c0366004612153565b6103be565b005b6101c56101d536600461217f565b6104c5565b6000546101ed906001600160a01b031681565b6040516001600160a01b03909116815260200160405180910390f35b6101c5610217366004612204565b6105c9565b6101c561022a36600461217f565b6106e3565b6101c561023d366004612287565b6107e7565b6101c561025036600461217f565b610907565b6101c561026336600461217f565b610a0b565b6101c56102763660046122e6565b610b0f565b6101c5610289366004612153565b610cca565b6101c561029c366004612377565b610dc7565b6101c56102af366004612153565b610edc565b6101c56102c23660046123dc565b610fd9565b6101c56102d5366004612421565b61116b565b6101c56102e8366004612451565b61127a565b6101c56102fb36600461247f565b6113c5565b6101c561030e3660046124b3565b6115cf565b6101c5610321366004612451565b6116d4565b6101c56103343660046124e6565b61181f565b6101c561034736600461250a565b61190d565b6101c561035a3660046124e6565b611a16565b6101c561036d366004612287565b611b03565b6101c5610380366004612451565b611c18565b6101c561039336600461217f565b611d63565b6101c56103a6366004612421565b611e67565b6101c56103b9366004612421565b61202c565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316631a20325760e01b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd4802749061042f90339088908790879060040161258b565b6020604051808303816000875af115801561044e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610472919061260d565b604080518281526001600160a01b03871660208201529081018590529091507f170cfbd4ca14e4c07750912ad957e666499c81fdfef63021cde154c6ffaac2d7906060015b60405180910390a150505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631a1c1b9560e21b179052600080549351633f52009d60e21b81529293909291169063fd4802749061053990339088908790879060040161258b565b6020604051808303816000875af1158015610558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057c919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f0440d8b8371306b54b33893631962ccab8e82436d91eb4a2c481454cc2ed4781906060016104b7565b600063a7bdf45a60e01b858585856040516024016105ea94939291906126ba565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906106549033908b908790879060040161258b565b6020604051808303816000875af1158015610673573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610697919061260d565b90507f4c42642dbb775b1ef06ad1492581510de04ccfb5ad078338d6ae369b56f356a08188888888886040516106d2969594939291906126ec565b60405180910390a150505050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316631b2ce7f360e11b179052600080549351633f52009d60e21b81529293909291169063fd4802749061075790339088908790879060040161258b565b6020604051808303816000875af1158015610776573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079a919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f322efec8297181586148e7711ed39e230b706795edf152fd4e3a3a8fc009d33b906060016104b7565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b0316633f7f93af60e11b179052600080549351633f52009d60e21b81529293909291169063fd4802749061086390339089908790879060040161258b565b6020604051808303816000875af1158015610882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a6919061260d565b604080518281526001600160a01b0380891660208301528088169282019290925290851660608201529091507f892ed68a932643ffae382937ae40947f858726f5014c80e6612255d981508090906080015b60405180910390a15050505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b031663f2fde38b60e01b179052600080549351633f52009d60e21b81529293909291169063fd4802749061097b90339088908790879060040161258b565b6020604051808303816000875af115801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f666b010a757cac3ae1a73c875457e65b327e73589feb2d450b6d703a4ec588d9906060016104b7565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b0316634ffc800d60e11b179052600080549351633f52009d60e21b81529293909291169063fd48027490610a7f90339088908790879060040161258b565b6020604051808303816000875af1158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac2919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f0691c48365957fae1547e6922078da4127a4ec5beedd4aca7b80a5c793722556906060016104b7565b600080846002811115610b2457610b24612575565b03610b375750632d3633b760e21b610bd2565b6001846002811115610b4b57610b4b612575565b03610b5e5750633cfe6c7760e11b610bd2565b6002846002811115610b7257610b72612575565b03610b85575063057425d760e21b610bd2565b60405162461bcd60e51b815260206004820152600e60248201527f696e76616c696420616374696f6e00000000000000000000000000000000000060448201526064015b60405180910390fd5b604080516001600160a01b038581166024830152604480830186905283518084039091018152606490920183526020820180516001600160e01b03166001600160e01b03198616179052600080549351633f52009d60e21b81529293909291169063fd48027490610c4e9033908b90879060019060040161258b565b6020604051808303816000875af1158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c91919061260d565b90507f68a1245119792f0c0b4396c9d85ed7e432c53279527235d14c64bc4e801d2bb081888888886040516106d2959493929190612749565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316634586f33160e01b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd48027490610d3b90339088908790879060040161258b565b6020604051808303816000875af1158015610d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7e919061260d565b604080518281526001600160a01b03871660208201529081018590529091507fa140c5e7d56a62eaaaa3aeb3b9d49c5fc85004d8d25920be0bce5e08a0b7ec9b906060016104b7565b6000634f1ef28660e01b848484604051602401610de6939291906127ab565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd48027490610e509033908a908790879060040161258b565b6020604051808303816000875af1158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e93919061260d565b90507f7936bef0e4e9424795215dbcddd145b5f6ccbe6d35ed9ceacc3c9cec1b1a1ed18187878787604051610ecc9594939291906127d7565b60405180910390a1505050505050565b60408051602480820184905282518083039091018152604490910182526020810180516001600160e01b0316637906491560e11b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd48027490610f4d90339088908790879060040161258b565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061260d565b604080518281526001600160a01b03871660208201529081018590529091507f27cc981a956034897b297d307eaa4e907654717913a238daf3e32a5bd0e18aea906060016104b7565b600080836001811115610fee57610fee612575565b03611001575063e2c1ed2560e01b611070565b600183600181111561101557611015612575565b03611028575063036145eb60e11b611070565b60405162461bcd60e51b815260206004820152601060248201527f696e76616c6964206665652074797065000000000000000000000000000000006044820152606401610bc9565b6000818360405160240161108691815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906110f19033908a90879060019060040161258b565b6020604051808303816000875af1158015611110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611134919061260d565b90507f924ed1dc9162d297ef826f4eb457b22796e62033fea2fb6f201c13661d04c64181878787604051610ecc949392919061280a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663cd04611960e01b179052600080549351633f52009d60e21b81529293909291169063fd480274906111e390339089908790879060040161258b565b6020604051808303816000875af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611226919061260d565b604080518281526001600160a01b038089166020830152871691810191909152606081018590529091507fbbf294b7b2aadbd73c0198ccea847bbc640871eb1ad2a0b01ac080d077f088e7906080016108f8565b6000600183600281111561129057611290612575565b036112a357506320b707b160e21b6112c6565b60028360028111156112b7576112b7612575565b03610b855750636b2c0f5560e01b5b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd4802749061134b9033908a90879060019060040161258b565b6020604051808303816000875af115801561136a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138e919061260d565b90507f9fe02e73a05d9dc9d3f3cb9423f6531a055a6083c43978dc2b64d6e505e4366581878787604051610ecc9493929190612842565b6000808360048111156113da576113da612575565b036113ed575063588be02b60e01b6114d1565b600183600481111561140157611401612575565b0361141457506301e5ff3360e11b6114d1565b600283600481111561142857611428612575565b0361143b5750639b05a77560e01b6114d1565b600383600481111561144f5761144f612575565b036114625750634177ea8160e11b6114d1565b600483600481111561147657611476612575565b03611489575063f83b0fb960e01b6114d1565b60405162461bcd60e51b815260206004820152601360248201527f696e76616c6964206272696467652074797065000000000000000000000000006044820152606401610bc9565b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906115559033908a908790879060040161258b565b6020604051808303816000875af1158015611574573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611598919061260d565b90507f1605f3e8c96ab34dc0790b6937e2f0c59bb340db6e689a77bc500789d32314f881878787604051610ecc9493929190612879565b6040805182151560248083019190915282518083039091018152604490910182526020810180516001600160e01b0316630296cf3f60e11b179052600080549251633f52009d60e21b8152919290916001600160a01b039091169063fd4802749061164490339088908790879060040161258b565b6020604051808303816000875af1158015611663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611687919061260d565b604080518281526001600160a01b0387166020820152851515918101919091529091507fb415e98e9740cf326dbeb0b43f0fa7d742ab13c6c2fc4e0042b6289cca074526906060016104b7565b600060018360028111156116ea576116ea612575565b036116fd57506310154bad60e01b611720565b600283600281111561171157611711612575565b03610b85575063291d954960e01b5b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906117a59033908a90879060019060040161258b565b6020604051808303816000875af11580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e8919061260d565b90507f4336c9be2e5abfad187a39a7f7346158c644f54824688bb5a5b335f9306fb9bb81878787604051610ecc9493929190612842565b6040805160048082526024820183526020820180516001600160e01b03166325c38b9f60e01b179052600080549351633f52009d60e21b8152929390926001600160a01b039091169163fd48027491611881913391889188916001910161258b565b6020604051808303816000875af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c4919061260d565b604080518281526001600160a01b03861660208201529192507f149a32d950b4bc0cb34725d5a842addc6f3e428807357a578301e078cc644357910160405180910390a1505050565b6000639623609d60e01b8585858560405160240161192e94939291906128b9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd480274906119989033908b908790879060040161258b565b6020604051808303816000875af11580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db919061260d565b90507ff6b46465ce70c6b53ccde6e33cdd45c1906ded1e8553ff64ebdadf97d3ac29518188888888886040516106d2969594939291906128f0565b6001546001600160a01b03163314611a705760405162461bcd60e51b815260206004820152601960248201527f6f6e6c7920696e697469616c697a65722063616e20696e6974000000000000006044820152606401610bc9565b6000546001600160a01b031615611ac95760405162461bcd60e51b815260206004820152601460248201527f676f76206164647220616c7265616479207365740000000000000000000000006044820152606401610bc9565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b604080516001600160a01b03848116602483015283811660448084019190915283518084039091018152606490920183526020820180516001600160e01b031663266a23b160e21b179052600080549351633f52009d60e21b81529293909291169063fd48027490611b7f90339089908790879060040161258b565b6020604051808303816000875af1158015611b9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc2919061260d565b604080518281526001600160a01b0380891660208301528088169282019290925290851660608201529091507fc1dead51ac2e9fa286784eeefebacaf915332934c6d6fd290ec2c8de51c78632906080016108f8565b60006001836002811115611c2e57611c2e612575565b03611c4157506303c4a25d60e41b611c64565b6002836002811115611c5557611c55612575565b03610b855750631dd9b59160e31b5b6040516001600160a01b0383166024820152600090829060440160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600080549251633f52009d60e21b8152919350916001600160a01b03169063fd48027490611ce99033908a90879060019060040161258b565b6020604051808303816000875af1158015611d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2c919061260d565b90507f725ab9c9498b34fa1336448b0dc8dfb419461e03707ace510d44e8bb63d8485181878787604051610ecc9493929190612842565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166328a8478560e11b179052600080549351633f52009d60e21b81529293909291169063fd48027490611dd790339088908790879060040161258b565b6020604051808303816000875af1158015611df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1a919061260d565b604080518281526001600160a01b0380881660208301528616918101919091529091507f8aaee1ae0ee9b8019d672115e172cd8fd03686f0f117ce65aa0ed224ca6d12b3906060016104b7565b60606001600160a01b038316611ee55750604080518082018252601281527f647261696e546f6b656e2875696e74323536000000000000000000000000000060209182015281516024808201859052835180830390910181526044909101909252810180516001600160e01b031663a76cd1bb60e01b179052611f5e565b50604080518082018252601a81527f647261696e546f6b656e28616464726573732c75696e7432353600000000000060209182015281516001600160a01b03851660248201526044808201859052835180830390910181526064909101909252810180516001600160e01b0316634dd256db60e11b1790525b60008054604051633f52009d60e21b81526001600160a01b039091169063fd48027490611f9590339089908790879060040161258b565b6020604051808303816000875af1158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd8919061260d565b604080518281526001600160a01b038089166020830152871691810191909152606081018590529091507f07315b20d3a4862680a34cedf6a8b62bd45bdf98fa602f664417d8a84d47c1bc906080016108f8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03166326717b8d60e11b179052600080549351633f52009d60e21b81529293909291169063fd480274906120a490339089908790879060040161258b565b6020604051808303816000875af11580156120c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e7919061260d565b604080518281526001600160a01b038089166020830152871691810191909152606081018590529091507fdf93094bf7ed4f11758b798f8463ab250ae3db9edc392c26b92443f3cf731004906080016108f8565b6001600160a01b038116811461215057600080fd5b50565b6000806040838503121561216657600080fd5b82356121718161213b565b946020939093013593505050565b6000806040838503121561219257600080fd5b823561219d8161213b565b915060208301356121ad8161213b565b809150509250929050565b60008083601f8401126121ca57600080fd5b50813567ffffffffffffffff8111156121e257600080fd5b6020830191508360208260051b85010111156121fd57600080fd5b9250929050565b60008060008060006060868803121561221c57600080fd5b85356122278161213b565b9450602086013567ffffffffffffffff8082111561224457600080fd5b61225089838a016121b8565b9096509450604088013591508082111561226957600080fd5b50612276888289016121b8565b969995985093965092949392505050565b60008060006060848603121561229c57600080fd5b83356122a78161213b565b925060208401356122b78161213b565b915060408401356122c78161213b565b809150509250925092565b8035600381106122e157600080fd5b919050565b600080600080608085870312156122fc57600080fd5b84356123078161213b565b9350612315602086016122d2565b925060408501356123258161213b565b9396929550929360600135925050565b60008083601f84011261234757600080fd5b50813567ffffffffffffffff81111561235f57600080fd5b6020830191508360208285010111156121fd57600080fd5b6000806000806060858703121561238d57600080fd5b84356123988161213b565b935060208501356123a88161213b565b9250604085013567ffffffffffffffff8111156123c457600080fd5b6123d087828801612335565b95989497509550505050565b6000806000606084860312156123f157600080fd5b83356123fc8161213b565b925060208401356002811061241057600080fd5b929592945050506040919091013590565b60008060006060848603121561243657600080fd5b83356124418161213b565b925060208401356124108161213b565b60008060006060848603121561246657600080fd5b83356124718161213b565b92506122b7602085016122d2565b60008060006060848603121561249457600080fd5b833561249f8161213b565b92506020840135600581106122b757600080fd5b600080604083850312156124c657600080fd5b82356124d18161213b565b9150602083013580151581146121ad57600080fd5b6000602082840312156124f857600080fd5b81356125038161213b565b9392505050565b60008060008060006080868803121561252257600080fd5b853561252d8161213b565b9450602086013561253d8161213b565b9350604086013561254d8161213b565b9250606086013567ffffffffffffffff81111561256957600080fd5b61227688828901612335565b634e487b7160e01b600052602160045260246000fd5b60006001600160a01b038087168352602081871681850152608060408501528551915081608085015260005b828110156125d35786810182015185820160a0015281016125b7565b5050600060a0828501015260a0601f19601f830116840101915050600683106125fe576125fe612575565b82606083015295945050505050565b60006020828403121561261f57600080fd5b5051919050565b8183526000602080850194508260005b858110156126645781356126498161213b565b6001600160a01b031687529582019590820190600101612636565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156126a157600080fd5b8260051b80836020870137939093016020019392505050565b6040815260006126ce604083018688612626565b82810360208401526126e181858761266f565b979650505050505050565b8681526001600160a01b0386166020820152608060408201526000612715608083018688612626565b828103606084015261272881858761266f565b9998505050505050505050565b6003811061274557612745612575565b9052565b8581526001600160a01b03858116602083015260a082019061276e6040840187612735565b939093166060820152608001529392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b03841681526040602082015260006127ce604083018486612782565b95945050505050565b85815260006001600160a01b038087166020840152808616604084015250608060608301526126e1608083018486612782565b8481526001600160a01b0384166020820152608081016002841061283057612830612575565b60408201939093526060015292915050565b8481526001600160a01b03848116602083015260808201906128676040840186612735565b80841660608401525095945050505050565b8481526001600160a01b0384811660208301526080820190600585106128a1576128a1612575565b84604084015280841660608401525095945050505050565b60006001600160a01b038087168352808616602084015250606060408301526128e6606083018486612782565b9695505050505050565b86815260006001600160a01b038088166020840152808716604084015280861660608401525060a0608083015261292b60a083018486612782565b9897505050505050505056fea264697066735822122040fd291fb80dd9b7f06829bdfed554db902d3d02f43b04b2a9ce22850c82e42e64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001b9dfc56e38b0f92448659c114e2347bd803911c
-----Decoded View---------------
Arg [0] : _initializer (address): 0x1b9dFC56e38b0F92448659C114e2347Bd803911c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001b9dfc56e38b0f92448659c114e2347bd803911c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
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.