Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 9 from a total of 9 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Gateway | 11819575 | 1839 days ago | IN | 0 ETH | 0.02648346 | ||||
| Set Gateway | 11819575 | 1839 days ago | IN | 0 ETH | 0.04150954 | ||||
| Set Gateway | 11819569 | 1839 days ago | IN | 0 ETH | 0.04146136 | ||||
| Set Gateway | 11819558 | 1839 days ago | IN | 0 ETH | 0.04146136 | ||||
| Claim Ownership | 10146658 | 2096 days ago | IN | 0 ETH | 0.00081758 | ||||
| Transfer Ownersh... | 10146627 | 2096 days ago | IN | 0 ETH | 0.00162943 | ||||
| Set Gateway | 9737283 | 2160 days ago | IN | 0 ETH | 0.00056278 | ||||
| Set Gateway | 9737195 | 2160 days ago | IN | 0 ETH | 0.00056282 | ||||
| Set Gateway | 9737093 | 2160 days ago | IN | 0 ETH | 0.00069798 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GatewayRegistry
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-03-25
*/
/**
Deployed by Ren Project, https://renproject.io
Commit hash: 9068f80
Repository: https://github.com/renproject/darknode-sol
Issues: https://github.com/renproject/darknode-sol/issues
Licenses
@openzeppelin/contracts: (MIT) https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/LICENSE
darknode-sol: (GNU GPL V3) https://github.com/renproject/darknode-sol/blob/master/LICENSE
*/
pragma solidity 0.5.16;
contract Initializable {
bool private initialized;
bool private initializing;
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
function isConstructor() private view returns (bool) {
address self = address(this);
uint256 cs;
assembly { cs := extcodesize(self) }
return cs == 0;
}
uint256[50] private ______gap;
}
contract Context is Initializable {
constructor () internal { }
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this;
return msg.data;
}
}
contract Ownable is Initializable, Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function initialize(address sender) public initializer {
_owner = sender;
emit OwnershipTransferred(address(0), _owner);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
function isOwner() public view returns (bool) {
return _msgSender() == _owner;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[50] private ______gap;
}
contract Claimable is Initializable, Ownable {
address public pendingOwner;
function initialize(address _nextOwner) public initializer {
Ownable.initialize(_nextOwner);
}
modifier onlyPendingOwner() {
require(
_msgSender() == pendingOwner,
"Claimable: caller is not the pending owner"
);
_;
}
function transferOwnership(address newOwner) public onlyOwner {
require(
newOwner != owner() && newOwner != pendingOwner,
"Claimable: invalid new owner"
);
pendingOwner = newOwner;
}
function claimOwnership() public onlyPendingOwner {
_transferOwnership(pendingOwner);
delete pendingOwner;
}
}
contract Proxy {
function () payable external {
_fallback();
}
function _implementation() internal view returns (address);
function _delegate(address implementation) internal {
assembly {
calldatacopy(0, 0, calldatasize)
let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)
returndatacopy(0, 0, returndatasize)
switch result
case 0 { revert(0, returndatasize) }
default { return(0, returndatasize) }
}
}
function _willFallback() internal {
}
function _fallback() internal {
_willFallback();
_delegate(_implementation());
}
}
library OpenZeppelinUpgradesAddress {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
}
contract BaseUpgradeabilityProxy is Proxy {
event Upgraded(address indexed implementation);
bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
function _implementation() internal view returns (address impl) {
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
impl := sload(slot)
}
}
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
function _setImplementation(address newImplementation) internal {
require(OpenZeppelinUpgradesAddress.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
sstore(slot, newImplementation)
}
}
}
contract UpgradeabilityProxy is BaseUpgradeabilityProxy {
constructor(address _logic, bytes memory _data) public payable {
assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1));
_setImplementation(_logic);
if(_data.length > 0) {
(bool success,) = _logic.delegatecall(_data);
require(success);
}
}
}
contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
event AdminChanged(address previousAdmin, address newAdmin);
bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
modifier ifAdmin() {
if (msg.sender == _admin()) {
_;
} else {
_fallback();
}
}
function admin() external ifAdmin returns (address) {
return _admin();
}
function implementation() external ifAdmin returns (address) {
return _implementation();
}
function changeAdmin(address newAdmin) external ifAdmin {
require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
emit AdminChanged(_admin(), newAdmin);
_setAdmin(newAdmin);
}
function upgradeTo(address newImplementation) external ifAdmin {
_upgradeTo(newImplementation);
}
function upgradeToAndCall(address newImplementation, bytes calldata data) payable external ifAdmin {
_upgradeTo(newImplementation);
(bool success,) = newImplementation.delegatecall(data);
require(success);
}
function _admin() internal view returns (address adm) {
bytes32 slot = ADMIN_SLOT;
assembly {
adm := sload(slot)
}
}
function _setAdmin(address newAdmin) internal {
bytes32 slot = ADMIN_SLOT;
assembly {
sstore(slot, newAdmin)
}
}
function _willFallback() internal {
require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin");
super._willFallback();
}
}
contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy {
function initialize(address _logic, bytes memory _data) public payable {
require(_implementation() == address(0));
assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1));
_setImplementation(_logic);
if(_data.length > 0) {
(bool success,) = _logic.delegatecall(_data);
require(success);
}
}
}
contract InitializableAdminUpgradeabilityProxy is BaseAdminUpgradeabilityProxy, InitializableUpgradeabilityProxy {
function initialize(address _logic, address _admin, bytes memory _data) public payable {
require(_implementation() == address(0));
InitializableUpgradeabilityProxy.initialize(_logic, _data);
assert(ADMIN_SLOT == bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1));
_setAdmin(_admin);
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract ERC20 is Initializable, Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
}
uint256[50] private ______gap;
}
contract ERC20Detailed is Initializable, IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
function initialize(string memory name, string memory symbol, uint8 decimals) public initializer {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
uint256[50] private ______gap;
}
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
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");
}
}
library SafeERC20 {
using SafeMath for uint256;
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));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
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).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract(), "SafeERC20: call to non-contract");
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
contract CanReclaimTokens is Claimable {
using SafeERC20 for ERC20;
mapping(address => bool) private recoverableTokensBlacklist;
function initialize(address _nextOwner) public initializer {
Claimable.initialize(_nextOwner);
}
function blacklistRecoverableToken(address _token) public onlyOwner {
recoverableTokensBlacklist[_token] = true;
}
function recoverTokens(address _token) external onlyOwner {
require(
!recoverableTokensBlacklist[_token],
"CanReclaimTokens: token is not recoverable"
);
if (_token == address(0x0)) {
msg.sender.transfer(address(this).balance);
} else {
ERC20(_token).safeTransfer(
msg.sender,
ERC20(_token).balanceOf(address(this))
);
}
}
}
contract ERC20WithRate is Initializable, Ownable, ERC20 {
using SafeMath for uint256;
uint256 public constant _rateScale = 1e18;
uint256 internal _rate;
event LogRateChanged(uint256 indexed _rate);
function initialize(address _nextOwner, uint256 _initialRate)
public
initializer
{
Ownable.initialize(_nextOwner);
_setRate(_initialRate);
}
function setExchangeRate(uint256 _nextRate) public onlyOwner {
_setRate(_nextRate);
}
function exchangeRateCurrent() public view returns (uint256) {
require(_rate != 0, "ERC20WithRate: rate has not been initialized");
return _rate;
}
function _setRate(uint256 _nextRate) internal {
require(_nextRate > 0, "ERC20WithRate: rate must be greater than zero");
_rate = _nextRate;
}
function balanceOfUnderlying(address _account)
public
view
returns (uint256)
{
return toUnderlying(balanceOf(_account));
}
function toUnderlying(uint256 _amount) public view returns (uint256) {
return _amount.mul(_rate).div(_rateScale);
}
function fromUnderlying(uint256 _amountUnderlying)
public
view
returns (uint256)
{
return _amountUnderlying.mul(_rateScale).div(_rate);
}
}
contract ERC20WithPermit is Initializable, ERC20, ERC20Detailed {
using SafeMath for uint256;
mapping(address => uint256) public nonces;
string public version;
bytes32 public DOMAIN_SEPARATOR;
bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb;
function initialize(
uint256 _chainId,
string memory _version,
string memory _name,
string memory _symbol,
uint8 _decimals
) public initializer {
ERC20Detailed.initialize(_name, _symbol, _decimals);
version = _version;
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
),
keccak256(bytes(name())),
keccak256(bytes(version)),
_chainId,
address(this)
)
);
}
function permit(
address holder,
address spender,
uint256 nonce,
uint256 expiry,
bool allowed,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
keccak256(
abi.encode(
PERMIT_TYPEHASH,
holder,
spender,
nonce,
expiry,
allowed
)
)
)
);
require(holder != address(0), "ERC20WithRate: address must not be 0x0");
require(
holder == ecrecover(digest, v, r, s),
"ERC20WithRate: invalid signature"
);
require(
expiry == 0 || now <= expiry,
"ERC20WithRate: permit has expired"
);
require(nonce == nonces[holder]++, "ERC20WithRate: invalid nonce");
uint256 amount = allowed ? uint256(-1) : 0;
_approve(holder, spender, amount);
}
}
contract RenERC20LogicV1 is
Initializable,
ERC20,
ERC20Detailed,
ERC20WithRate,
ERC20WithPermit,
Claimable,
CanReclaimTokens
{
function initialize(
uint256 _chainId,
address _nextOwner,
uint256 _initialRate,
string memory _version,
string memory _name,
string memory _symbol,
uint8 _decimals
) public initializer {
ERC20Detailed.initialize(_name, _symbol, _decimals);
ERC20WithRate.initialize(_nextOwner, _initialRate);
ERC20WithPermit.initialize(
_chainId,
_version,
_name,
_symbol,
_decimals
);
Claimable.initialize(_nextOwner);
CanReclaimTokens.initialize(_nextOwner);
}
function mint(address _to, uint256 _amount) public onlyOwner {
_mint(_to, _amount);
}
function burn(address _from, uint256 _amount) public onlyOwner {
_burn(_from, _amount);
}
function transfer(address recipient, uint256 amount) public returns (bool) {
require(
recipient != address(this),
"RenERC20: can't transfer to token address"
);
return super.transfer(recipient, amount);
}
function transferFrom(address sender, address recipient, uint256 amount)
public
returns (bool)
{
require(
recipient != address(this),
"RenERC20: can't transfer to token address"
);
return super.transferFrom(sender, recipient, amount);
}
}
contract RenBTC is InitializableAdminUpgradeabilityProxy {}
contract RenZEC is InitializableAdminUpgradeabilityProxy {}
contract RenBCH is InitializableAdminUpgradeabilityProxy {}
library LinkedList {
address public constant NULL = address(0);
struct Node {
bool inList;
address previous;
address next;
}
struct List {
mapping (address => Node) list;
}
function insertBefore(List storage self, address target, address newNode) internal {
require(newNode != address(0), "LinkedList: invalid address");
require(!isInList(self, newNode), "LinkedList: already in list");
require(isInList(self, target) || target == NULL, "LinkedList: not in list");
address prev = self.list[target].previous;
self.list[newNode].next = target;
self.list[newNode].previous = prev;
self.list[target].previous = newNode;
self.list[prev].next = newNode;
self.list[newNode].inList = true;
}
function insertAfter(List storage self, address target, address newNode) internal {
require(newNode != address(0), "LinkedList: invalid address");
require(!isInList(self, newNode), "LinkedList: already in list");
require(isInList(self, target) || target == NULL, "LinkedList: not in list");
address n = self.list[target].next;
self.list[newNode].previous = target;
self.list[newNode].next = n;
self.list[target].next = newNode;
self.list[n].previous = newNode;
self.list[newNode].inList = true;
}
function remove(List storage self, address node) internal {
require(isInList(self, node), "LinkedList: not in list");
address p = self.list[node].previous;
address n = self.list[node].next;
self.list[p].next = n;
self.list[n].previous = p;
self.list[node].inList = false;
delete self.list[node];
}
function prepend(List storage self, address node) internal {
insertBefore(self, begin(self), node);
}
function append(List storage self, address node) internal {
insertAfter(self, end(self), node);
}
function swap(List storage self, address left, address right) internal {
address previousRight = self.list[right].previous;
remove(self, right);
insertAfter(self, left, right);
remove(self, left);
insertAfter(self, previousRight, left);
}
function isInList(List storage self, address node) internal view returns (bool) {
return self.list[node].inList;
}
function begin(List storage self) internal view returns (address) {
return self.list[NULL].next;
}
function end(List storage self) internal view returns (address) {
return self.list[NULL].previous;
}
function next(List storage self, address node) internal view returns (address) {
require(isInList(self, node), "LinkedList: not in list");
return self.list[node].next;
}
function previous(List storage self, address node) internal view returns (address) {
require(isInList(self, node), "LinkedList: not in list");
return self.list[node].previous;
}
function elements(List storage self, address _start, uint256 _count) internal view returns (address[] memory) {
require(_count > 0, "LinkedList: invalid count");
require(isInList(self, _start) || _start == address(0), "LinkedList: not in list");
address[] memory elems = new address[](_count);
uint256 n = 0;
address nextItem = _start;
if (nextItem == address(0)) {
nextItem = begin(self);
}
while (n < _count) {
if (nextItem == address(0)) {
break;
}
elems[n] = nextItem;
nextItem = next(self, nextItem);
n += 1;
}
return elems;
}
}
interface IMintGateway {
function mint(
bytes32 _pHash,
uint256 _amount,
bytes32 _nHash,
bytes calldata _sig
) external returns (uint256);
function mintFee() external view returns (uint256);
}
interface IBurnGateway {
function burn(bytes calldata _to, uint256 _amountScaled)
external
returns (uint256);
function burnFee() external view returns (uint256);
}
interface IGateway {
function mint(
bytes32 _pHash,
uint256 _amount,
bytes32 _nHash,
bytes calldata _sig
) external returns (uint256);
function mintFee() external view returns (uint256);
function burn(bytes calldata _to, uint256 _amountScaled)
external
returns (uint256);
function burnFee() external view returns (uint256);
}
contract GatewayRegistry is Claimable, CanReclaimTokens {
constructor() public {
Claimable.initialize(msg.sender);
CanReclaimTokens.initialize(msg.sender);
}
event LogGatewayRegistered(
string _symbol,
string indexed _indexedSymbol,
address indexed _token,
address indexed _gatewayContract
);
event LogGatewayDeregistered(
string _symbol,
string indexed _indexedSymbol,
address indexed _token,
address indexed _gatewayContract
);
event LogGatewayUpdated(
address indexed _token,
address indexed _currentGatewayContract,
address indexed _newGatewayContract
);
uint256 numGatewayContracts = 0;
LinkedList.List private gatewayContractList;
LinkedList.List private renTokenList;
mapping(address => address) private gatewayByToken;
mapping(string => address) private tokenBySymbol;
function setGateway(string calldata _symbol, address _token, address _gatewayContract)
external
onlyOwner
{
require(symbolIsValid(_symbol), "GatewayRegistry: symbol must be alphanumeric");
require(
!LinkedList.isInList(gatewayContractList, _gatewayContract),
"GatewayRegistry: gateway already registered"
);
require(
gatewayByToken[_token] == address(0x0),
"GatewayRegistry: token already registered"
);
require(
tokenBySymbol[_symbol] == address(0x0),
"GatewayRegistry: symbol already registered"
);
LinkedList.append(gatewayContractList, _gatewayContract);
LinkedList.append(renTokenList, _token);
tokenBySymbol[_symbol] = _token;
gatewayByToken[_token] = _gatewayContract;
numGatewayContracts += 1;
emit LogGatewayRegistered(_symbol, _symbol, _token, _gatewayContract);
}
function updateGateway(address _token, address _newGatewayContract)
external
onlyOwner
{
address currentGateway = gatewayByToken[_token];
require(
currentGateway != address(0x0),
"GatewayRegistry: token not registered"
);
LinkedList.remove(gatewayContractList, currentGateway);
LinkedList.append(gatewayContractList, _newGatewayContract);
gatewayByToken[_token] = _newGatewayContract;
emit LogGatewayUpdated(_token, currentGateway, _newGatewayContract);
}
function removeGateway(string calldata _symbol) external onlyOwner {
address tokenAddress = tokenBySymbol[_symbol];
require(
tokenAddress != address(0x0),
"GatewayRegistry: symbol not registered"
);
address gatewayAddress = gatewayByToken[tokenAddress];
delete gatewayByToken[tokenAddress];
delete tokenBySymbol[_symbol];
LinkedList.remove(gatewayContractList, gatewayAddress);
LinkedList.remove(renTokenList, tokenAddress);
numGatewayContracts -= 1;
emit LogGatewayDeregistered(
_symbol,
_symbol,
tokenAddress,
gatewayAddress
);
}
function getGateways(address _start, uint256 _count)
external
view
returns (address[] memory)
{
return
LinkedList.elements(
gatewayContractList,
_start,
_count == 0 ? numGatewayContracts : _count
);
}
function getRenTokens(address _start, uint256 _count)
external
view
returns (address[] memory)
{
return
LinkedList.elements(
renTokenList,
_start,
_count == 0 ? numGatewayContracts : _count
);
}
function getGatewayByToken(address _token)
external
view
returns (IGateway)
{
return IGateway(gatewayByToken[_token]);
}
function getGatewayBySymbol(string calldata _tokenSymbol)
external
view
returns (IGateway)
{
return IGateway(gatewayByToken[tokenBySymbol[_tokenSymbol]]);
}
function getTokenBySymbol(string calldata _tokenSymbol)
external
view
returns (IERC20)
{
return IERC20(tokenBySymbol[_tokenSymbol]);
}
function symbolIsValid(string memory _tokenSymbol) public pure returns (bool) {
for (uint i = 0; i < bytes(_tokenSymbol).length; i++) {
uint8 char = uint8(bytes(_tokenSymbol)[i]);
if (!(
(char >= 65 && char <= 90) ||
(char >= 97 && char <= 122) ||
(char >= 48 && char <= 57)
)) {
return false;
}
}
return true;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":true,"internalType":"string","name":"_indexedSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"address","name":"_gatewayContract","type":"address"}],"name":"LogGatewayDeregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_symbol","type":"string"},{"indexed":true,"internalType":"string","name":"_indexedSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"address","name":"_gatewayContract","type":"address"}],"name":"LogGatewayRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":true,"internalType":"address","name":"_currentGatewayContract","type":"address"},{"indexed":true,"internalType":"address","name":"_newGatewayContract","type":"address"}],"name":"LogGatewayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"blacklistRecoverableToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_tokenSymbol","type":"string"}],"name":"getGatewayBySymbol","outputs":[{"internalType":"contract IGateway","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getGatewayByToken","outputs":[{"internalType":"contract IGateway","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_start","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getGateways","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_start","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getRenTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_tokenSymbol","type":"string"}],"name":"getTokenBySymbol","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_nextOwner","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"}],"name":"removeGateway","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_gatewayContract","type":"address"}],"name":"setGateway","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"_tokenSymbol","type":"string"}],"name":"symbolIsValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_newGatewayContract","type":"address"}],"name":"updateGateway","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405260006068553480156200001657600080fd5b506200002d336200004960201b620013861760201c565b62000043336200011360201b62000de11760201c565b620002ce565b600054610100900460ff16806200006e57506200006e6001600160e01b03620001c616565b806200007d575060005460ff16155b620000ba5760405162461bcd60e51b815260040180806020018281038252602e81526020018062001fda602e913960400191505060405180910390fd5b600054610100900460ff16158015620000e6576000805460ff1961ff0019909116610100171660011790555b620000fc82620001cc60201b620019191760201c565b80156200010f576000805461ff00191690555b5050565b600054610100900460ff1680620001385750620001386001600160e01b03620001c616565b8062000147575060005460ff16155b620001845760405162461bcd60e51b815260040180806020018281038252602e81526020018062001fda602e913960400191505060405180910390fd5b600054610100900460ff16158015620001b0576000805460ff1961ff0019909116610100171660011790555b620000fc826200004960201b620013861760201c565b303b1590565b600054610100900460ff1680620001f15750620001f16001600160e01b03620001c616565b8062000200575060005460ff16155b6200023d5760405162461bcd60e51b815260040180806020018281038252602e81526020018062001fda602e913960400191505060405180910390fd5b600054610100900460ff1615801562000269576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a380156200010f576000805461ff00191690555050565b611cfc80620002de6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063b3d0403e116100a2578063e30c397811610071578063e30c397814610488578063efa74f1f14610490578063f2fde38b146104fe578063f4146ba214610524578063f65d901c1461055057610116565b8063b3d0403e14610339578063c4d66de8146103b8578063cf4f775c146103de578063d14230d61461045a57610116565b8063715018a6116100e9578063715018a6146101fb5780638028c92e146102035780638da5cb5b146102715780638f32d59b14610279578063920966a81461029557610116565b806316114acd1461011b5780631b95e305146101435780634e71e0c81461018557806364936b1e1461018d575b600080fd5b6101416004803603602081101561013157600080fd5b50356001600160a01b0316610576565b005b6101696004803603602081101561015957600080fd5b50356001600160a01b03166106e7565b604080516001600160a01b039092168252519081900360200190f35b610141610708565b610169600480360360208110156101a357600080fd5b810190602081018135600160201b8111156101bd57600080fd5b8201836020820111156101cf57600080fd5b803590602001918460018302840111600160201b831117156101f057600080fd5b509092509050610788565b6101416107d8565b6101416004803603602081101561021957600080fd5b810190602081018135600160201b81111561023357600080fd5b82018360208201111561024557600080fd5b803590602001918460018302840111600160201b8311171561026657600080fd5b509092509050610869565b610169610a37565b610281610a46565b604080519115158252519081900360200190f35b610281600480360360208110156102ab57600080fd5b810190602081018135600160201b8111156102c557600080fd5b8201836020820111156102d757600080fd5b803590602001918460018302840111600160201b831117156102f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6c945050505050565b6101416004803603606081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460018302840111600160201b8311171561039c57600080fd5b91935091506001600160a01b0381358116916020013516610b03565b610141600480360360208110156103ce57600080fd5b50356001600160a01b0316610de1565b61040a600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610e8d565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561044657818101518382015260200161042e565b505050509050019250505060405180910390f35b6101416004803603604081101561047057600080fd5b506001600160a01b0381358116916020013516610eb1565b610169610fc4565b610169600480360360208110156104a657600080fd5b810190602081018135600160201b8111156104c057600080fd5b8201836020820111156104d257600080fd5b803590602001918460018302840111600160201b831117156104f357600080fd5b509092509050610fd3565b6101416004803603602081101561051457600080fd5b50356001600160a01b031661100d565b61040a6004803603604081101561053a57600080fd5b506001600160a01b0381351690602001356110fe565b6101416004803603602081101561056657600080fd5b50356001600160a01b0316611112565b61057e610a46565b6105bd576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526067602052604090205460ff16156106155760405162461bcd60e51b815260040180806020018281038252602a815260200180611b07602a913960400191505060405180910390fd5b6001600160a01b0381166106555760405133904780156108fc02916000818181858888f1935050505015801561064f573d6000803e3d6000fd5b506106e4565b604080516370a0823160e01b815230600482015290516106e49133916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d60208110156106cb57600080fd5b50516001600160a01b038416919063ffffffff61117d16565b50565b6001600160a01b038082166000908152606b6020526040902054165b919050565b6066546001600160a01b031661071c6111d4565b6001600160a01b0316146107615760405162461bcd60e51b815260040180806020018281038252602a815260200180611c24602a913960400191505060405180910390fd5b606654610776906001600160a01b03166111d8565b606680546001600160a01b0319169055565b6000606b6000606c8585604051808383808284379190910194855250506040805160209481900385019020546001600160a01b039081168652938501959095525050910160002054169392505050565b6107e0610a46565b61081f576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610871610a46565b6108b0576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6000606c83836040518083838082843791909101948552505060405192839003602001909220546001600160a01b031692505050806109205760405162461bcd60e51b8152600401808060200182810382526026815260200180611c4e6026913960400191505060405180910390fd5b6001600160a01b038082166000908152606b60205260409081902080546001600160a01b031981169091559051911690606c9085908590808383808284379190910194855250506040519283900360200190922080546001600160a01b0319169055506109909050606982611279565b61099b606a83611279565b606880546000190190556040516001600160a01b038083169190841690869086908083838082843760408051939091018390038320602080855284018c905295507fea98e49727cf7c3a8c3926a036a6d41047c9b766d9109f22962950f37a2094aa94508b93508a92915081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a450505050565b6033546001600160a01b031690565b6033546000906001600160a01b0316610a5d6111d4565b6001600160a01b031614905090565b6000805b8251811015610afa576000838281518110610a8757fe5b016020015160f81c905060418110801590610aa65750605a8160ff1611155b80610ac4575060618160ff1610158015610ac45750607a8160ff1611155b80610ae2575060308160ff1610158015610ae2575060398160ff1611155b610af157600092505050610703565b50600101610a70565b50600192915050565b610b0b610a46565b610b4a576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b610b8984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a6c92505050565b610bc45760405162461bcd60e51b815260040180806020018281038252602c815260200180611b56602c913960400191505060405180910390fd5b610bcf60698261134e565b15610c0b5760405162461bcd60e51b815260040180806020018281038252602b815260200180611bcb602b913960400191505060405180910390fd5b6001600160a01b038281166000908152606b60205260409020541615610c625760405162461bcd60e51b8152600401808060200182810382526029815260200180611b826029913960400191505060405180910390fd5b60006001600160a01b0316606c85856040518083838082843791909101948552505060405192839003602001909220546001600160a01b0316929092149150610cde90505760405162461bcd60e51b815260040180806020018281038252602a815260200180611c9e602a913960400191505060405180910390fd5b610ce960698261136d565b610cf4606a8361136d565b81606c85856040518083838082843791909101948552505060408051938490036020908101852080546001600160a01b039788166001600160a01b0319918216179091558887166000818152606b9093529290912080549688169690911686179055606880546001019055928892508791508083838082843760408051939091018390038320602080855284018c905295507fd433aae9ea620c1976ff88f75c629f477dbffe6bf277edad8a31c983117ab32a94508b93508a92915081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a450505050565b600054610100900460ff1680610dfa5750610dfa611380565b80610e08575060005460ff16155b610e435760405162461bcd60e51b815260040180806020018281038252602e815260200180611bf6602e913960400191505060405180910390fd5b600054610100900460ff16158015610e6e576000805460ff1961ff0019909116610100171660011790555b610e7782611386565b8015610e89576000805461ff00191690555b5050565b6060610eaa606a848415610ea15784610ea5565b6068545b61141c565b9392505050565b610eb9610a46565b610ef8576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6001600160a01b038083166000908152606b60205260409020541680610f4f5760405162461bcd60e51b8152600401808060200182810382526025815260200180611b316025913960400191505060405180910390fd5b610f5a606982611279565b610f6560698361136d565b6001600160a01b038381166000818152606b602052604080822080546001600160a01b03191687861690811790915590519093851692917f2dc9e208c924a5b14066ecb7121b371da427e696ad69456ed07a52cd2a710d9991a4505050565b6066546001600160a01b031681565b6000606c83836040518083838082843791909101948552505060405192839003602001909220546001600160a01b03169250505092915050565b611015610a46565b611054576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b61105c610a37565b6001600160a01b0316816001600160a01b03161415801561108b57506066546001600160a01b03828116911614155b6110dc576040805162461bcd60e51b815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6060610eaa6069848415610ea15784610ea5565b61111a610a46565b611159576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152606760205260409020805460ff19166001179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111cf908490611590565b505050565b3390565b6001600160a01b03811661121d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611ae16026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b611283828261134e565b6112ce576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b6001600160a01b0390811660008181526020939093526040808420805460018083018054610100938490048816808a52868a209093018054919098166001600160a01b031991821681179098559688529387208054610100600160a81b031916919092021790559190935280546001600160a81b03191690558154169055565b6001600160a01b03166000908152602091909152604090205460ff1690565b610e898261137a8461174e565b83611770565b303b1590565b600054610100900460ff168061139f575061139f611380565b806113ad575060005460ff16155b6113e85760405162461bcd60e51b815260040180806020018281038252602e815260200180611bf6602e913960400191505060405180910390fd5b600054610100900460ff16158015611413576000805460ff1961ff0019909116610100171660011790555b610e7782611919565b606060008211611473576040805162461bcd60e51b815260206004820152601960248201527f4c696e6b65644c6973743a20696e76616c696420636f756e7400000000000000604482015290519081900360640190fd5b61147d848461134e565b8061148f57506001600160a01b038316155b6114da576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b606082604051908082528060200260200182016040528015611506578160200160208202803883390190505b5090506000846001600160a01b0381166115265761152387611a0a565b90505b84821015611585576001600160a01b03811661154157611585565b8083838151811061154e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506115788782611a29565b9050600182019150611526565b509095945050505050565b6115a2826001600160a01b0316611aa4565b6115f3576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106116315780518252601f199092019160209182019101611612565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b5091509150816116ef576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156117485780806020019051602081101561170b57600080fd5b50516117485760405162461bcd60e51b815260040180806020018281038252602a815260200180611c74602a913960400191505060405180910390fd5b50505050565b60008080526020829052604090205461010090046001600160a01b0316919050565b6001600160a01b0381166117cb576040805162461bcd60e51b815260206004820152601b60248201527f4c696e6b65644c6973743a20696e76616c696420616464726573730000000000604482015290519081900360640190fd5b6117d5838261134e565b15611827576040805162461bcd60e51b815260206004820152601b60248201527f4c696e6b65644c6973743a20616c726561647920696e206c6973740000000000604482015290519081900360640190fd5b611831838361134e565b8061184357506001600160a01b038216155b61188e576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b6001600160a01b0391821660008181526020949094526040808520600190810180549486168088528388208054610100600160a81b03199081166101009788021782558185018054989099166001600160a01b031998891681179099558354909716821790925595875291862080549094169285029290921790925591909252815460ff1916179055565b600054610100900460ff16806119325750611932611380565b80611940575060005460ff16155b61197b5760405162461bcd60e51b815260040180806020018281038252602e815260200180611bf6602e913960400191505060405180910390fd5b600054610100900460ff161580156119a6576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610e89576000805461ff00191690555050565b600080805260209190915260409020600101546001600160a01b031690565b6000611a35838361134e565b611a80576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b506001600160a01b0390811660009081526020929092526040909120600101541690565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611ad85750808214155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c654761746577617952656769737472793a20746f6b656e206e6f7420726567697374657265644761746577617952656769737472793a2073796d626f6c206d75737420626520616c7068616e756d657269634761746577617952656769737472793a20746f6b656e20616c726561647920726567697374657265644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724761746577617952656769737472793a206761746577617920616c72656164792072656769737465726564436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e65724761746577617952656769737472793a2073796d626f6c206e6f7420726567697374657265645361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644761746577617952656769737472793a2073796d626f6c20616c72656164792072656769737465726564a265627a7a723158203e124c020e72e7914e01e46329b5ff7933e28a24336a5d5ffd1d82e7dbea299e64736f6c63430005100032436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063b3d0403e116100a2578063e30c397811610071578063e30c397814610488578063efa74f1f14610490578063f2fde38b146104fe578063f4146ba214610524578063f65d901c1461055057610116565b8063b3d0403e14610339578063c4d66de8146103b8578063cf4f775c146103de578063d14230d61461045a57610116565b8063715018a6116100e9578063715018a6146101fb5780638028c92e146102035780638da5cb5b146102715780638f32d59b14610279578063920966a81461029557610116565b806316114acd1461011b5780631b95e305146101435780634e71e0c81461018557806364936b1e1461018d575b600080fd5b6101416004803603602081101561013157600080fd5b50356001600160a01b0316610576565b005b6101696004803603602081101561015957600080fd5b50356001600160a01b03166106e7565b604080516001600160a01b039092168252519081900360200190f35b610141610708565b610169600480360360208110156101a357600080fd5b810190602081018135600160201b8111156101bd57600080fd5b8201836020820111156101cf57600080fd5b803590602001918460018302840111600160201b831117156101f057600080fd5b509092509050610788565b6101416107d8565b6101416004803603602081101561021957600080fd5b810190602081018135600160201b81111561023357600080fd5b82018360208201111561024557600080fd5b803590602001918460018302840111600160201b8311171561026657600080fd5b509092509050610869565b610169610a37565b610281610a46565b604080519115158252519081900360200190f35b610281600480360360208110156102ab57600080fd5b810190602081018135600160201b8111156102c557600080fd5b8201836020820111156102d757600080fd5b803590602001918460018302840111600160201b831117156102f857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a6c945050505050565b6101416004803603606081101561034f57600080fd5b810190602081018135600160201b81111561036957600080fd5b82018360208201111561037b57600080fd5b803590602001918460018302840111600160201b8311171561039c57600080fd5b91935091506001600160a01b0381358116916020013516610b03565b610141600480360360208110156103ce57600080fd5b50356001600160a01b0316610de1565b61040a600480360360408110156103f457600080fd5b506001600160a01b038135169060200135610e8d565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561044657818101518382015260200161042e565b505050509050019250505060405180910390f35b6101416004803603604081101561047057600080fd5b506001600160a01b0381358116916020013516610eb1565b610169610fc4565b610169600480360360208110156104a657600080fd5b810190602081018135600160201b8111156104c057600080fd5b8201836020820111156104d257600080fd5b803590602001918460018302840111600160201b831117156104f357600080fd5b509092509050610fd3565b6101416004803603602081101561051457600080fd5b50356001600160a01b031661100d565b61040a6004803603604081101561053a57600080fd5b506001600160a01b0381351690602001356110fe565b6101416004803603602081101561056657600080fd5b50356001600160a01b0316611112565b61057e610a46565b6105bd576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526067602052604090205460ff16156106155760405162461bcd60e51b815260040180806020018281038252602a815260200180611b07602a913960400191505060405180910390fd5b6001600160a01b0381166106555760405133904780156108fc02916000818181858888f1935050505015801561064f573d6000803e3d6000fd5b506106e4565b604080516370a0823160e01b815230600482015290516106e49133916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156106a157600080fd5b505afa1580156106b5573d6000803e3d6000fd5b505050506040513d60208110156106cb57600080fd5b50516001600160a01b038416919063ffffffff61117d16565b50565b6001600160a01b038082166000908152606b6020526040902054165b919050565b6066546001600160a01b031661071c6111d4565b6001600160a01b0316146107615760405162461bcd60e51b815260040180806020018281038252602a815260200180611c24602a913960400191505060405180910390fd5b606654610776906001600160a01b03166111d8565b606680546001600160a01b0319169055565b6000606b6000606c8585604051808383808284379190910194855250506040805160209481900385019020546001600160a01b039081168652938501959095525050910160002054169392505050565b6107e0610a46565b61081f576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610871610a46565b6108b0576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6000606c83836040518083838082843791909101948552505060405192839003602001909220546001600160a01b031692505050806109205760405162461bcd60e51b8152600401808060200182810382526026815260200180611c4e6026913960400191505060405180910390fd5b6001600160a01b038082166000908152606b60205260409081902080546001600160a01b031981169091559051911690606c9085908590808383808284379190910194855250506040519283900360200190922080546001600160a01b0319169055506109909050606982611279565b61099b606a83611279565b606880546000190190556040516001600160a01b038083169190841690869086908083838082843760408051939091018390038320602080855284018c905295507fea98e49727cf7c3a8c3926a036a6d41047c9b766d9109f22962950f37a2094aa94508b93508a92915081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a450505050565b6033546001600160a01b031690565b6033546000906001600160a01b0316610a5d6111d4565b6001600160a01b031614905090565b6000805b8251811015610afa576000838281518110610a8757fe5b016020015160f81c905060418110801590610aa65750605a8160ff1611155b80610ac4575060618160ff1610158015610ac45750607a8160ff1611155b80610ae2575060308160ff1610158015610ae2575060398160ff1611155b610af157600092505050610703565b50600101610a70565b50600192915050565b610b0b610a46565b610b4a576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b610b8984848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610a6c92505050565b610bc45760405162461bcd60e51b815260040180806020018281038252602c815260200180611b56602c913960400191505060405180910390fd5b610bcf60698261134e565b15610c0b5760405162461bcd60e51b815260040180806020018281038252602b815260200180611bcb602b913960400191505060405180910390fd5b6001600160a01b038281166000908152606b60205260409020541615610c625760405162461bcd60e51b8152600401808060200182810382526029815260200180611b826029913960400191505060405180910390fd5b60006001600160a01b0316606c85856040518083838082843791909101948552505060405192839003602001909220546001600160a01b0316929092149150610cde90505760405162461bcd60e51b815260040180806020018281038252602a815260200180611c9e602a913960400191505060405180910390fd5b610ce960698261136d565b610cf4606a8361136d565b81606c85856040518083838082843791909101948552505060408051938490036020908101852080546001600160a01b039788166001600160a01b0319918216179091558887166000818152606b9093529290912080549688169690911686179055606880546001019055928892508791508083838082843760408051939091018390038320602080855284018c905295507fd433aae9ea620c1976ff88f75c629f477dbffe6bf277edad8a31c983117ab32a94508b93508a92915081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a450505050565b600054610100900460ff1680610dfa5750610dfa611380565b80610e08575060005460ff16155b610e435760405162461bcd60e51b815260040180806020018281038252602e815260200180611bf6602e913960400191505060405180910390fd5b600054610100900460ff16158015610e6e576000805460ff1961ff0019909116610100171660011790555b610e7782611386565b8015610e89576000805461ff00191690555b5050565b6060610eaa606a848415610ea15784610ea5565b6068545b61141c565b9392505050565b610eb9610a46565b610ef8576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6001600160a01b038083166000908152606b60205260409020541680610f4f5760405162461bcd60e51b8152600401808060200182810382526025815260200180611b316025913960400191505060405180910390fd5b610f5a606982611279565b610f6560698361136d565b6001600160a01b038381166000818152606b602052604080822080546001600160a01b03191687861690811790915590519093851692917f2dc9e208c924a5b14066ecb7121b371da427e696ad69456ed07a52cd2a710d9991a4505050565b6066546001600160a01b031681565b6000606c83836040518083838082843791909101948552505060405192839003602001909220546001600160a01b03169250505092915050565b611015610a46565b611054576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b61105c610a37565b6001600160a01b0316816001600160a01b03161415801561108b57506066546001600160a01b03828116911614155b6110dc576040805162461bcd60e51b815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b606680546001600160a01b0319166001600160a01b0392909216919091179055565b6060610eaa6069848415610ea15784610ea5565b61111a610a46565b611159576040805162461bcd60e51b81526020600482018190526024820152600080516020611bab833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152606760205260409020805460ff19166001179055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111cf908490611590565b505050565b3390565b6001600160a01b03811661121d5760405162461bcd60e51b8152600401808060200182810382526026815260200180611ae16026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b611283828261134e565b6112ce576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b6001600160a01b0390811660008181526020939093526040808420805460018083018054610100938490048816808a52868a209093018054919098166001600160a01b031991821681179098559688529387208054610100600160a81b031916919092021790559190935280546001600160a81b03191690558154169055565b6001600160a01b03166000908152602091909152604090205460ff1690565b610e898261137a8461174e565b83611770565b303b1590565b600054610100900460ff168061139f575061139f611380565b806113ad575060005460ff16155b6113e85760405162461bcd60e51b815260040180806020018281038252602e815260200180611bf6602e913960400191505060405180910390fd5b600054610100900460ff16158015611413576000805460ff1961ff0019909116610100171660011790555b610e7782611919565b606060008211611473576040805162461bcd60e51b815260206004820152601960248201527f4c696e6b65644c6973743a20696e76616c696420636f756e7400000000000000604482015290519081900360640190fd5b61147d848461134e565b8061148f57506001600160a01b038316155b6114da576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b606082604051908082528060200260200182016040528015611506578160200160208202803883390190505b5090506000846001600160a01b0381166115265761152387611a0a565b90505b84821015611585576001600160a01b03811661154157611585565b8083838151811061154e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506115788782611a29565b9050600182019150611526565b509095945050505050565b6115a2826001600160a01b0316611aa4565b6115f3576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106116315780518252601f199092019160209182019101611612565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b5091509150816116ef576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156117485780806020019051602081101561170b57600080fd5b50516117485760405162461bcd60e51b815260040180806020018281038252602a815260200180611c74602a913960400191505060405180910390fd5b50505050565b60008080526020829052604090205461010090046001600160a01b0316919050565b6001600160a01b0381166117cb576040805162461bcd60e51b815260206004820152601b60248201527f4c696e6b65644c6973743a20696e76616c696420616464726573730000000000604482015290519081900360640190fd5b6117d5838261134e565b15611827576040805162461bcd60e51b815260206004820152601b60248201527f4c696e6b65644c6973743a20616c726561647920696e206c6973740000000000604482015290519081900360640190fd5b611831838361134e565b8061184357506001600160a01b038216155b61188e576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b6001600160a01b0391821660008181526020949094526040808520600190810180549486168088528388208054610100600160a81b03199081166101009788021782558185018054989099166001600160a01b031998891681179099558354909716821790925595875291862080549094169285029290921790925591909252815460ff1916179055565b600054610100900460ff16806119325750611932611380565b80611940575060005460ff16155b61197b5760405162461bcd60e51b815260040180806020018281038252602e815260200180611bf6602e913960400191505060405180910390fd5b600054610100900460ff161580156119a6576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610e89576000805461ff00191690555050565b600080805260209190915260409020600101546001600160a01b031690565b6000611a35838361134e565b611a80576040805162461bcd60e51b8152602060048201526017602482015276131a5b9ad959131a5cdd0e881b9bdd081a5b881b1a5cdd604a1b604482015290519081900360640190fd5b506001600160a01b0390811660009081526020929092526040909120600101541690565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590611ad85750808214155b94935050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737343616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c654761746577617952656769737472793a20746f6b656e206e6f7420726567697374657265644761746577617952656769737472793a2073796d626f6c206d75737420626520616c7068616e756d657269634761746577617952656769737472793a20746f6b656e20616c726561647920726567697374657265644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724761746577617952656769737472793a206761746577617920616c72656164792072656769737465726564436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a6564436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e65724761746577617952656769737472793a2073796d626f6c206e6f7420726567697374657265645361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644761746577617952656769737472793a2073796d626f6c20616c72656164792072656769737465726564a265627a7a723158203e124c020e72e7914e01e46329b5ff7933e28a24336a5d5ffd1d82e7dbea299e64736f6c63430005100032
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.