Address Contract Partially Verified
Address
0xfF252725f6122A92551A5FA9a6b6bf10eb0Be035
Balance
0 ETH
Nonce
1
Code Size
3183 bytes
Creator
0x0904Dac3...9859 at tx 0x69732fbf...d6c944
Indexed Transactions
0
Contract Bytecode
3183 bytes
0x60806040526004361061004a5760003560e01c806301ffc9a71461004f5780633971d4671461008c5780633f15457f146100c9578063bfa4a291146100f4578063e8d6dbb41461011f575b600080fd5b34801561005b57600080fd5b506100766004803603610071919081019061085e565b61013b565b6040516100839190610a27565b60405180910390f35b34801561009857600080fd5b506100b360048036036100ae9190810190610806565b610208565b6040516100c09190610aee565b60405180910390f35b3480156100d557600080fd5b506100de61032b565b6040516100eb9190610aa1565b60405180910390f35b34801561010057600080fd5b50610109610350565b6040516101169190610a86565b60405180910390f35b61013960048036036101349190810190610806565b61037c565b005b6000604051610149906109e8565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061020157506040516101a390610a12565b60405180910390206040516101b7906109fd565b6040518091039020187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000806102136105b2565b905060008090505b85859050811015610322578173ffffffffffffffffffffffffffffffffffffffff166383e7f6ff87878481811061024e57fe5b905060200281018035600160200383360303811261026b57600080fd5b8083019250508135905060208201915067ffffffffffffffff81111561029057600080fd5b6001810236038213156102a257600080fd5b876040518463ffffffff1660e01b81526004016102c193929190610abc565b60206040518083038186803b1580156102d957600080fd5b505afa1580156102ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103119190810190610887565b83019250808060010191505061021b565b50509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60405161035c90610a12565b6040518091039020604051610370906109fd565b60405180910390201881565b60006103866105b2565b905060008090505b848490508110156105645760008273ffffffffffffffffffffffffffffffffffffffff166383e7f6ff8787858181106103c357fe5b90506020028101803560016020038336030381126103e057600080fd5b8083019250508135905060208201915067ffffffffffffffff81111561040557600080fd5b60018102360382131561041757600080fd5b876040518463ffffffff1660e01b815260040161043693929190610abc565b60206040518083038186803b15801561044e57600080fd5b505afa158015610462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104869190810190610887565b90508273ffffffffffffffffffffffffffffffffffffffff1663acf1a841828888868181106104b157fe5b90506020028101803560016020038336030381126104ce57600080fd5b8083019250508135905060208201915067ffffffffffffffff8111156104f357600080fd5b60018102360382131561050557600080fd5b886040518563ffffffff1660e01b815260040161052493929190610abc565b6000604051808303818588803b15801561053d57600080fd5b505af1158015610551573d6000803e3d6000fd5b505050505050808060010191505061038e565b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156105ab573d6000803e3d6000fd5b5050505050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf7f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60001b6040518263ffffffff1660e01b81526004016106329190610a42565b60206040518083038186803b15801561064a57600080fd5b505afa15801561065e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061068291908101906107dd565b90508073ffffffffffffffffffffffffffffffffffffffff1663124a319c7f93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae60001b63018fac0660e01b6040518363ffffffff1660e01b81526004016106e9929190610a5d565b60206040518083038186803b15801561070157600080fd5b505afa158015610715573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061073991908101906107dd565b91505090565b60008151905061074e81610be7565b92915050565b60008083601f84011261076657600080fd5b8235905067ffffffffffffffff81111561077f57600080fd5b60208301915083602082028301111561079757600080fd5b9250929050565b6000813590506107ad81610bfe565b92915050565b6000813590506107c281610c15565b92915050565b6000815190506107d781610c15565b92915050565b6000602082840312156107ef57600080fd5b60006107fd8482850161073f565b91505092915050565b60008060006040848603121561081b57600080fd5b600084013567ffffffffffffffff81111561083557600080fd5b61084186828701610754565b93509350506020610854868287016107b3565b9150509250925092565b60006020828403121561087057600080fd5b600061087e8482850161079e565b91505092915050565b60006020828403121561089957600080fd5b60006108a7848285016107c8565b91505092915050565b6108b981610b37565b82525050565b6108c881610b43565b82525050565b6108d781610b4d565b82525050565b6108e681610ba3565b82525050565b60006108f88385610b09565b9350610905838584610bc7565b61090e83610bd6565b840190509392505050565b6000610926601983610b1a565b91507f737570706f727473496e746572666163652862797465733429000000000000006000830152601982019050919050565b6000610966601883610b1a565b91507f72656e74507269636528737472696e675b5d2c75696e742900000000000000006000830152601882019050919050565b60006109a6601683610b1a565b91507f72656e6577416c6c28737472696e675b5d2c75696e74000000000000000000006000830152601682019050919050565b6109e281610b99565b82525050565b60006109f382610919565b9150819050919050565b6000610a0882610959565b9150819050919050565b6000610a1d82610999565b9150819050919050565b6000602082019050610a3c60008301846108b0565b92915050565b6000602082019050610a5760008301846108bf565b92915050565b6000604082019050610a7260008301856108bf565b610a7f60208301846108ce565b9392505050565b6000602082019050610a9b60008301846108ce565b92915050565b6000602082019050610ab660008301846108dd565b92915050565b60006040820190508181036000830152610ad78185876108ec565b9050610ae660208301846109d9565b949350505050565b6000602082019050610b0360008301846109d9565b92915050565b600082825260208201905092915050565b600081905092915050565b6000610b3082610b79565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000610bae82610bb5565b9050919050565b6000610bc082610b79565b9050919050565b82818337600083830152505050565b6000601f19601f8301169050919050565b610bf081610b25565b8114610bfb57600080fd5b50565b610c0781610b4d565b8114610c1257600080fd5b50565b610c1e81610b99565b8114610c2957600080fd5b5056fea365627a7a72315820aef8589818b1d85a3f0681f26ae05e3a4114a56ce51fad2fd3e24172d9cc5f786c6578706572696d656e74616cf564736f6c63430005100040
Verified Source Code Partial Match
Compiler: v0.5.16+commit.9c3226ce
EVM: istanbul
Optimization: No
BulkRenewal.sol 536 lines
// File: @ensdomains/ens/contracts/ENS.sol
pragma solidity >=0.4.24;
interface ENS {
// Logged when the owner of a node assigns a new owner to a subnode.
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
// Logged when the owner of a node transfers ownership to a new account.
event Transfer(bytes32 indexed node, address owner);
// Logged when the resolver for a node changes.
event NewResolver(bytes32 indexed node, address resolver);
// Logged when the TTL of a node changes
event NewTTL(bytes32 indexed node, uint64 ttl);
// Logged when an operator is added or removed.
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external;
function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external;
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external returns(bytes32);
function setResolver(bytes32 node, address resolver) external;
function setOwner(bytes32 node, address owner) external;
function setTTL(bytes32 node, uint64 ttl) external;
function setApprovalForAll(address operator, bool approved) external;
function owner(bytes32 node) external view returns (address);
function resolver(bytes32 node) external view returns (address);
function ttl(bytes32 node) external view returns (uint64);
function recordExists(bytes32 node) external view returns (bool);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
// File: contracts/PriceOracle.sol
pragma solidity >=0.4.24;
interface PriceOracle {
/**
* @dev Returns the price to register or renew a name.
* @param name The name being registered or renewed.
* @param expires When the name presently expires (0 if this is a new registration).
* @param duration How long the name is being registered or extended for, in seconds.
* @return The price of this renewal or registration, in wei.
*/
function price(string calldata name, uint expires, uint duration) external view returns(uint);
}
// File: openzeppelin-solidity/contracts/introspection/IERC165.sol
pragma solidity >=0.5.0;
/**
* @title IERC165
* @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
*/
interface IERC165 {
/**
* @notice Query if a contract implements an interface
* @param interfaceId The interface identifier, as specified in ERC-165
* @dev Interface identification is specified in ERC-165. This function
* uses less than 30,000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol
pragma solidity >=0.5.0;
/**
* @title ERC721 Non-Fungible Token Standard basic interface
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/
contract IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) public view returns (uint256 balance);
function ownerOf(uint256 tokenId) public view returns (address owner);
function approve(address to, uint256 tokenId) public;
function getApproved(uint256 tokenId) public view returns (address operator);
function setApprovalForAll(address operator, bool _approved) public;
function isApprovedForAll(address owner, address operator) public view returns (bool);
function transferFrom(address from, address to, uint256 tokenId) public;
function safeTransferFrom(address from, address to, uint256 tokenId) public;
function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}
// File: openzeppelin-solidity/contracts/ownership/Ownable.sol
pragma solidity >=0.5.0;
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor () internal {
_owner = msg.sender;
emit OwnershipTransferred(address(0), _owner);
}
/**
* @return the address of the owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner());
_;
}
/**
* @return true if `msg.sender` is the owner of the contract.
*/
function isOwner() public view returns (bool) {
return msg.sender == _owner;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
* @notice Renouncing to ownership will leave the contract without an owner.
* It will not be possible to call the functions with the `onlyOwner`
* modifier anymore.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0));
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: contracts/BaseRegistrar.sol
pragma solidity >=0.4.24;
contract BaseRegistrar is IERC721, Ownable {
uint constant public GRACE_PERIOD = 90 days;
event ControllerAdded(address indexed controller);
event ControllerRemoved(address indexed controller);
event NameMigrated(uint256 indexed id, address indexed owner, uint expires);
event NameRegistered(uint256 indexed id, address indexed owner, uint expires);
event NameRenewed(uint256 indexed id, uint expires);
// The ENS registry
ENS public ens;
// The namehash of the TLD this registrar owns (eg, .eth)
bytes32 public baseNode;
// A map of addresses that are authorised to register and renew names.
mapping(address=>bool) public controllers;
// Authorises a controller, who can register and renew domains.
function addController(address controller) external;
// Revoke controller permission for an address.
function removeController(address controller) external;
// Set the resolver for the TLD this registrar manages.
function setResolver(address resolver) external;
// Returns the expiration timestamp of the specified label hash.
function nameExpires(uint256 id) external view returns(uint);
// Returns true iff the specified name is available for registration.
function available(uint256 id) public view returns(bool);
/**
* @dev Register a name.
*/
function register(uint256 id, address owner, uint duration) external returns(uint);
function renew(uint256 id, uint duration) external returns(uint);
/**
* @dev Reclaim ownership of a name in ENS, if you own it in the registrar.
*/
function reclaim(uint256 id, address owner) external;
}
// File: contracts/StringUtils.sol
pragma solidity >=0.4.24;
library StringUtils {
/**
* @dev Returns the length of a given string
*
* @param s The string to measure the length of
* @return The length of the input string
*/
function strlen(string memory s) internal pure returns (uint) {
uint len;
uint i = 0;
uint bytelength = bytes(s).length;
for(len = 0; i < bytelength; len++) {
byte b = bytes(s)[i];
if(b < 0x80) {
i += 1;
} else if (b < 0xE0) {
i += 2;
} else if (b < 0xF0) {
i += 3;
} else if (b < 0xF8) {
i += 4;
} else if (b < 0xFC) {
i += 5;
} else {
i += 6;
}
}
return len;
}
}
// File: @ensdomains/resolver/contracts/Resolver.sol
pragma solidity >=0.4.25;
/**
* A generic resolver interface which includes all the functions including the ones deprecated
*/
interface Resolver{
event AddrChanged(bytes32 indexed node, address a);
event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress);
event NameChanged(bytes32 indexed node, string name);
event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);
event TextChanged(bytes32 indexed node, string indexed indexedKey, string key);
event ContenthashChanged(bytes32 indexed node, bytes hash);
/* Deprecated events */
event ContentChanged(bytes32 indexed node, bytes32 hash);
function ABI(bytes32 node, uint256 contentTypes) external view returns (uint256, bytes memory);
function addr(bytes32 node) external view returns (address);
function addr(bytes32 node, uint coinType) external view returns(bytes memory);
function contenthash(bytes32 node) external view returns (bytes memory);
function dnsrr(bytes32 node) external view returns (bytes memory);
function name(bytes32 node) external view returns (string memory);
function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);
function text(bytes32 node, string calldata key) external view returns (string memory);
function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address);
function setABI(bytes32 node, uint256 contentType, bytes calldata data) external;
function setAddr(bytes32 node, address addr) external;
function setAddr(bytes32 node, uint coinType, bytes calldata a) external;
function setContenthash(bytes32 node, bytes calldata hash) external;
function setDnsrr(bytes32 node, bytes calldata data) external;
function setName(bytes32 node, string calldata _name) external;
function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;
function setText(bytes32 node, string calldata key, string calldata value) external;
function setInterface(bytes32 node, bytes4 interfaceID, address implementer) external;
function supportsInterface(bytes4 interfaceID) external pure returns (bool);
/* Deprecated functions */
function content(bytes32 node) external view returns (bytes32);
function multihash(bytes32 node) external view returns (bytes memory);
function setContent(bytes32 node, bytes32 hash) external;
function setMultihash(bytes32 node, bytes calldata hash) external;
}
// File: contracts/ETHRegistrarController.sol
pragma solidity >=0.5.0;
/**
* @dev A registrar controller for registering and renewing names at fixed cost.
*/
contract ETHRegistrarController is Ownable {
using StringUtils for *;
uint constant public MIN_REGISTRATION_DURATION = 28 days;
bytes4 constant private INTERFACE_META_ID = bytes4(keccak256("supportsInterface(bytes4)"));
bytes4 constant private COMMITMENT_CONTROLLER_ID = bytes4(
keccak256("rentPrice(string,uint256)") ^
keccak256("available(string)") ^
keccak256("makeCommitment(string,address,bytes32)") ^
keccak256("commit(bytes32)") ^
keccak256("register(string,address,uint256,bytes32)") ^
keccak256("renew(string,uint256)")
);
bytes4 constant private COMMITMENT_WITH_CONFIG_CONTROLLER_ID = bytes4(
keccak256("registerWithConfig(string,address,uint256,bytes32,address,address)") ^
keccak256("makeCommitmentWithConfig(string,address,bytes32,address,address)")
);
BaseRegistrar base;
PriceOracle prices;
uint public minCommitmentAge;
uint public maxCommitmentAge;
mapping(bytes32=>uint) public commitments;
event NameRegistered(string name, bytes32 indexed label, address indexed owner, uint cost, uint expires);
event NameRenewed(string name, bytes32 indexed label, uint cost, uint expires);
event NewPriceOracle(address indexed oracle);
constructor(BaseRegistrar _base, PriceOracle _prices, uint _minCommitmentAge, uint _maxCommitmentAge) public {
require(_maxCommitmentAge > _minCommitmentAge);
base = _base;
prices = _prices;
minCommitmentAge = _minCommitmentAge;
maxCommitmentAge = _maxCommitmentAge;
}
function rentPrice(string memory name, uint duration) view public returns(uint) {
bytes32 hash = keccak256(bytes(name));
return prices.price(name, base.nameExpires(uint256(hash)), duration);
}
function valid(string memory name) public pure returns(bool) {
return name.strlen() >= 3;
}
function available(string memory name) public view returns(bool) {
bytes32 label = keccak256(bytes(name));
return valid(name) && base.available(uint256(label));
}
function makeCommitment(string memory name, address owner, bytes32 secret) pure public returns(bytes32) {
return makeCommitmentWithConfig(name, owner, secret, address(0), address(0));
}
function makeCommitmentWithConfig(string memory name, address owner, bytes32 secret, address resolver, address addr) pure public returns(bytes32) {
bytes32 label = keccak256(bytes(name));
if (resolver == address(0) && addr == address(0)) {
return keccak256(abi.encodePacked(label, owner, secret));
}
require(resolver != address(0));
return keccak256(abi.encodePacked(label, owner, resolver, addr, secret));
}
function commit(bytes32 commitment) public {
require(commitments[commitment] + maxCommitmentAge < now);
commitments[commitment] = now;
}
function register(string calldata name, address owner, uint duration, bytes32 secret) external payable {
registerWithConfig(name, owner, duration, secret, address(0), address(0));
}
function registerWithConfig(string memory name, address owner, uint duration, bytes32 secret, address resolver, address addr) public payable {
bytes32 commitment = makeCommitmentWithConfig(name, owner, secret, resolver, addr);
uint cost = _consumeCommitment(name, duration, commitment);
bytes32 label = keccak256(bytes(name));
uint256 tokenId = uint256(label);
uint expires;
if(resolver != address(0)) {
// Set this contract as the (temporary) owner, giving it
// permission to set up the resolver.
expires = base.register(tokenId, address(this), duration);
// The nodehash of this label
bytes32 nodehash = keccak256(abi.encodePacked(base.baseNode(), label));
// Set the resolver
base.ens().setResolver(nodehash, resolver);
// Configure the resolver
if (addr != address(0)) {
Resolver(resolver).setAddr(nodehash, addr);
}
// Now transfer full ownership to the expeceted owner
base.reclaim(tokenId, owner);
base.transferFrom(address(this), owner, tokenId);
} else {
require(addr == address(0));
expires = base.register(tokenId, owner, duration);
}
emit NameRegistered(name, label, owner, cost, expires);
// Refund any extra payment
if(msg.value > cost) {
msg.sender.transfer(msg.value - cost);
}
}
function renew(string calldata name, uint duration) external payable {
uint cost = rentPrice(name, duration);
require(msg.value >= cost);
bytes32 label = keccak256(bytes(name));
uint expires = base.renew(uint256(label), duration);
if(msg.value > cost) {
msg.sender.transfer(msg.value - cost);
}
emit NameRenewed(name, label, cost, expires);
}
function setPriceOracle(PriceOracle _prices) public onlyOwner {
prices = _prices;
emit NewPriceOracle(address(prices));
}
function setCommitmentAges(uint _minCommitmentAge, uint _maxCommitmentAge) public onlyOwner {
minCommitmentAge = _minCommitmentAge;
maxCommitmentAge = _maxCommitmentAge;
}
function withdraw() public onlyOwner {
msg.sender.transfer(address(this).balance);
}
function supportsInterface(bytes4 interfaceID) external pure returns (bool) {
return interfaceID == INTERFACE_META_ID ||
interfaceID == COMMITMENT_CONTROLLER_ID ||
interfaceID == COMMITMENT_WITH_CONFIG_CONTROLLER_ID;
}
function _consumeCommitment(string memory name, uint duration, bytes32 commitment) internal returns (uint256) {
// Require a valid commitment
require(commitments[commitment] + minCommitmentAge <= now);
// If the commitment is too old, or the name is registered, stop
require(commitments[commitment] + maxCommitmentAge > now);
require(available(name));
delete(commitments[commitment]);
uint cost = rentPrice(name, duration);
require(duration >= MIN_REGISTRATION_DURATION);
require(msg.value >= cost);
return cost;
}
}
// File: contracts/BulkRenewal.sol
pragma solidity >=0.5.0;
pragma experimental ABIEncoderV2;
contract BulkRenewal {
bytes32 constant private ETH_NAMEHASH = 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;
bytes4 constant private REGISTRAR_CONTROLLER_ID = 0x018fac06;
bytes4 constant private INTERFACE_META_ID = bytes4(keccak256("supportsInterface(bytes4)"));
bytes4 constant public BULK_RENEWAL_ID = bytes4(
keccak256("rentPrice(string[],uint)") ^
keccak256("renewAll(string[],uint")
);
ENS public ens;
constructor(ENS _ens) public {
ens = _ens;
}
function getController() internal view returns(ETHRegistrarController) {
Resolver r = Resolver(ens.resolver(ETH_NAMEHASH));
return ETHRegistrarController(r.interfaceImplementer(ETH_NAMEHASH, REGISTRAR_CONTROLLER_ID));
}
function rentPrice(string[] calldata names, uint duration) external view returns(uint total) {
ETHRegistrarController controller = getController();
for(uint i = 0; i < names.length; i++) {
total += controller.rentPrice(names[i], duration);
}
}
function renewAll(string[] calldata names, uint duration) external payable {
ETHRegistrarController controller = getController();
for(uint i = 0; i < names.length; i++) {
uint cost = controller.rentPrice(names[i], duration);
controller.renew.value(cost)(names[i], duration);
}
// Send any excess funds back
msg.sender.transfer(address(this).balance);
}
function supportsInterface(bytes4 interfaceID) external pure returns (bool) {
return interfaceID == INTERFACE_META_ID || interfaceID == BULK_RENEWAL_ID;
}
}
Read Contract
BULK_RENEWAL_ID 0xbfa4a291 → bytes4
ens 0x3f15457f → address
rentPrice 0x3971d467 → uint256
supportsInterface 0x01ffc9a7 → bool
Write Contract 1 functions
These functions modify contract state and require a wallet transaction to execute.
renewAll 0xe8d6dbb4
string[] names
uint256 duration
Recent Transactions
No transactions found for this address