mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 17:33:47 +00:00
contracts/ens: update contracts and regenerate with solidity v0.4.19
The newer upstream version of the FIFSRegistrar contract doesn't set the resolver anymore. The resolver is now deployed separately.
This commit is contained in:
parent
d7f3b0fbd2
commit
fbad70905d
10 changed files with 1115 additions and 899 deletions
23
contracts/ens/contract/AbstractENS.sol
Normal file
23
contracts/ens/contract/AbstractENS.sol
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
pragma solidity ^0.4.0;
|
||||||
|
|
||||||
|
contract AbstractENS {
|
||||||
|
function owner(bytes32 node) constant returns(address);
|
||||||
|
function resolver(bytes32 node) constant returns(address);
|
||||||
|
function ttl(bytes32 node) constant returns(uint64);
|
||||||
|
function setOwner(bytes32 node, address owner);
|
||||||
|
function setSubnodeOwner(bytes32 node, bytes32 label, address owner);
|
||||||
|
function setResolver(bytes32 node, address resolver);
|
||||||
|
function setTTL(bytes32 node, uint64 ttl);
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
94
contracts/ens/contract/ENS.sol
Normal file
94
contracts/ens/contract/ENS.sol
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
pragma solidity ^0.4.0;
|
||||||
|
|
||||||
|
import './AbstractENS.sol';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ENS registry contract.
|
||||||
|
*/
|
||||||
|
contract ENS is AbstractENS {
|
||||||
|
struct Record {
|
||||||
|
address owner;
|
||||||
|
address resolver;
|
||||||
|
uint64 ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
mapping(bytes32=>Record) records;
|
||||||
|
|
||||||
|
// Permits modifications only by the owner of the specified node.
|
||||||
|
modifier only_owner(bytes32 node) {
|
||||||
|
if (records[node].owner != msg.sender) throw;
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new ENS registrar.
|
||||||
|
*/
|
||||||
|
function ENS() {
|
||||||
|
records[0].owner = msg.sender;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the address that owns the specified node.
|
||||||
|
*/
|
||||||
|
function owner(bytes32 node) constant returns (address) {
|
||||||
|
return records[node].owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the address of the resolver for the specified node.
|
||||||
|
*/
|
||||||
|
function resolver(bytes32 node) constant returns (address) {
|
||||||
|
return records[node].resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the TTL of a node, and any records associated with it.
|
||||||
|
*/
|
||||||
|
function ttl(bytes32 node) constant returns (uint64) {
|
||||||
|
return records[node].ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfers ownership of a node to a new address. May only be called by the current
|
||||||
|
* owner of the node.
|
||||||
|
* @param node The node to transfer ownership of.
|
||||||
|
* @param owner The address of the new owner.
|
||||||
|
*/
|
||||||
|
function setOwner(bytes32 node, address owner) only_owner(node) {
|
||||||
|
Transfer(node, owner);
|
||||||
|
records[node].owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transfers ownership of a subnode sha3(node, label) to a new address. May only be
|
||||||
|
* called by the owner of the parent node.
|
||||||
|
* @param node The parent node.
|
||||||
|
* @param label The hash of the label specifying the subnode.
|
||||||
|
* @param owner The address of the new owner.
|
||||||
|
*/
|
||||||
|
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) {
|
||||||
|
var subnode = sha3(node, label);
|
||||||
|
NewOwner(node, label, owner);
|
||||||
|
records[subnode].owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the resolver address for the specified node.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param resolver The address of the resolver.
|
||||||
|
*/
|
||||||
|
function setResolver(bytes32 node, address resolver) only_owner(node) {
|
||||||
|
NewResolver(node, resolver);
|
||||||
|
records[node].resolver = resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the TTL for the specified node.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param ttl The TTL in seconds.
|
||||||
|
*/
|
||||||
|
function setTTL(bytes32 node, uint64 ttl) only_owner(node) {
|
||||||
|
NewTTL(node, ttl);
|
||||||
|
records[node].ttl = ttl;
|
||||||
|
}
|
||||||
|
}
|
||||||
39
contracts/ens/contract/FIFSRegistrar.sol
Normal file
39
contracts/ens/contract/FIFSRegistrar.sol
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
pragma solidity ^0.4.0;
|
||||||
|
|
||||||
|
import './AbstractENS.sol';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A registrar that allocates subdomains to the first person to claim them.
|
||||||
|
*/
|
||||||
|
contract FIFSRegistrar {
|
||||||
|
AbstractENS ens;
|
||||||
|
bytes32 rootNode;
|
||||||
|
|
||||||
|
modifier only_owner(bytes32 subnode) {
|
||||||
|
var node = sha3(rootNode, subnode);
|
||||||
|
var currentOwner = ens.owner(node);
|
||||||
|
|
||||||
|
if (currentOwner != 0 && currentOwner != msg.sender) throw;
|
||||||
|
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* @param ensAddr The address of the ENS registry.
|
||||||
|
* @param node The node that this registrar administers.
|
||||||
|
*/
|
||||||
|
function FIFSRegistrar(AbstractENS ensAddr, bytes32 node) {
|
||||||
|
ens = ensAddr;
|
||||||
|
rootNode = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a name, or change the owner of an existing registration.
|
||||||
|
* @param subnode The hash of the label to register.
|
||||||
|
* @param owner The address of the new owner.
|
||||||
|
*/
|
||||||
|
function register(bytes32 subnode, address owner) only_owner(subnode) {
|
||||||
|
ens.setSubnodeOwner(rootNode, subnode, owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
212
contracts/ens/contract/PublicResolver.sol
Normal file
212
contracts/ens/contract/PublicResolver.sol
Normal file
|
|
@ -0,0 +1,212 @@
|
||||||
|
pragma solidity ^0.4.0;
|
||||||
|
|
||||||
|
import './AbstractENS.sol';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple resolver anyone can use; only allows the owner of a node to set its
|
||||||
|
* address.
|
||||||
|
*/
|
||||||
|
contract PublicResolver {
|
||||||
|
bytes4 constant INTERFACE_META_ID = 0x01ffc9a7;
|
||||||
|
bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de;
|
||||||
|
bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5;
|
||||||
|
bytes4 constant NAME_INTERFACE_ID = 0x691f3431;
|
||||||
|
bytes4 constant ABI_INTERFACE_ID = 0x2203ab56;
|
||||||
|
bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233;
|
||||||
|
bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c;
|
||||||
|
|
||||||
|
event AddrChanged(bytes32 indexed node, address a);
|
||||||
|
event ContentChanged(bytes32 indexed node, bytes32 hash);
|
||||||
|
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);
|
||||||
|
|
||||||
|
struct PublicKey {
|
||||||
|
bytes32 x;
|
||||||
|
bytes32 y;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Record {
|
||||||
|
address addr;
|
||||||
|
bytes32 content;
|
||||||
|
string name;
|
||||||
|
PublicKey pubkey;
|
||||||
|
mapping(string=>string) text;
|
||||||
|
mapping(uint256=>bytes) abis;
|
||||||
|
}
|
||||||
|
|
||||||
|
AbstractENS ens;
|
||||||
|
mapping(bytes32=>Record) records;
|
||||||
|
|
||||||
|
modifier only_owner(bytes32 node) {
|
||||||
|
if (ens.owner(node) != msg.sender) throw;
|
||||||
|
_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
* @param ensAddr The ENS registrar contract.
|
||||||
|
*/
|
||||||
|
function PublicResolver(AbstractENS ensAddr) {
|
||||||
|
ens = ensAddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the resolver implements the interface specified by the provided hash.
|
||||||
|
* @param interfaceID The ID of the interface to check for.
|
||||||
|
* @return True if the contract implements the requested interface.
|
||||||
|
*/
|
||||||
|
function supportsInterface(bytes4 interfaceID) constant returns (bool) {
|
||||||
|
return interfaceID == ADDR_INTERFACE_ID ||
|
||||||
|
interfaceID == CONTENT_INTERFACE_ID ||
|
||||||
|
interfaceID == NAME_INTERFACE_ID ||
|
||||||
|
interfaceID == ABI_INTERFACE_ID ||
|
||||||
|
interfaceID == PUBKEY_INTERFACE_ID ||
|
||||||
|
interfaceID == TEXT_INTERFACE_ID ||
|
||||||
|
interfaceID == INTERFACE_META_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the address associated with an ENS node.
|
||||||
|
* @param node The ENS node to query.
|
||||||
|
* @return The associated address.
|
||||||
|
*/
|
||||||
|
function addr(bytes32 node) constant returns (address ret) {
|
||||||
|
ret = records[node].addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the address associated with an ENS node.
|
||||||
|
* May only be called by the owner of that node in the ENS registry.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param addr The address to set.
|
||||||
|
*/
|
||||||
|
function setAddr(bytes32 node, address addr) only_owner(node) {
|
||||||
|
records[node].addr = addr;
|
||||||
|
AddrChanged(node, addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the content hash associated with an ENS node.
|
||||||
|
* Note that this resource type is not standardized, and will likely change
|
||||||
|
* in future to a resource type based on multihash.
|
||||||
|
* @param node The ENS node to query.
|
||||||
|
* @return The associated content hash.
|
||||||
|
*/
|
||||||
|
function content(bytes32 node) constant returns (bytes32 ret) {
|
||||||
|
ret = records[node].content;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the content hash associated with an ENS node.
|
||||||
|
* May only be called by the owner of that node in the ENS registry.
|
||||||
|
* Note that this resource type is not standardized, and will likely change
|
||||||
|
* in future to a resource type based on multihash.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param hash The content hash to set
|
||||||
|
*/
|
||||||
|
function setContent(bytes32 node, bytes32 hash) only_owner(node) {
|
||||||
|
records[node].content = hash;
|
||||||
|
ContentChanged(node, hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name associated with an ENS node, for reverse records.
|
||||||
|
* Defined in EIP181.
|
||||||
|
* @param node The ENS node to query.
|
||||||
|
* @return The associated name.
|
||||||
|
*/
|
||||||
|
function name(bytes32 node) constant returns (string ret) {
|
||||||
|
ret = records[node].name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the name associated with an ENS node, for reverse records.
|
||||||
|
* May only be called by the owner of that node in the ENS registry.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param name The name to set.
|
||||||
|
*/
|
||||||
|
function setName(bytes32 node, string name) only_owner(node) {
|
||||||
|
records[node].name = name;
|
||||||
|
NameChanged(node, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the ABI associated with an ENS node.
|
||||||
|
* Defined in EIP205.
|
||||||
|
* @param node The ENS node to query
|
||||||
|
* @param contentTypes A bitwise OR of the ABI formats accepted by the caller.
|
||||||
|
* @return contentType The content type of the return value
|
||||||
|
* @return data The ABI data
|
||||||
|
*/
|
||||||
|
function ABI(bytes32 node, uint256 contentTypes) constant returns (uint256 contentType, bytes data) {
|
||||||
|
var record = records[node];
|
||||||
|
for(contentType = 1; contentType <= contentTypes; contentType <<= 1) {
|
||||||
|
if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) {
|
||||||
|
data = record.abis[contentType];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contentType = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the ABI associated with an ENS node.
|
||||||
|
* Nodes may have one ABI of each content type. To remove an ABI, set it to
|
||||||
|
* the empty string.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param contentType The content type of the ABI
|
||||||
|
* @param data The ABI data.
|
||||||
|
*/
|
||||||
|
function setABI(bytes32 node, uint256 contentType, bytes data) only_owner(node) {
|
||||||
|
// Content types must be powers of 2
|
||||||
|
if (((contentType - 1) & contentType) != 0) throw;
|
||||||
|
|
||||||
|
records[node].abis[contentType] = data;
|
||||||
|
ABIChanged(node, contentType);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the SECP256k1 public key associated with an ENS node.
|
||||||
|
* Defined in EIP 619.
|
||||||
|
* @param node The ENS node to query
|
||||||
|
* @return x, y the X and Y coordinates of the curve point for the public key.
|
||||||
|
*/
|
||||||
|
function pubkey(bytes32 node) constant returns (bytes32 x, bytes32 y) {
|
||||||
|
return (records[node].pubkey.x, records[node].pubkey.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the SECP256k1 public key associated with an ENS node.
|
||||||
|
* @param node The ENS node to query
|
||||||
|
* @param x the X coordinate of the curve point for the public key.
|
||||||
|
* @param y the Y coordinate of the curve point for the public key.
|
||||||
|
*/
|
||||||
|
function setPubkey(bytes32 node, bytes32 x, bytes32 y) only_owner(node) {
|
||||||
|
records[node].pubkey = PublicKey(x, y);
|
||||||
|
PubkeyChanged(node, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text data associated with an ENS node and key.
|
||||||
|
* @param node The ENS node to query.
|
||||||
|
* @param key The text data key to query.
|
||||||
|
* @return The associated text data.
|
||||||
|
*/
|
||||||
|
function text(bytes32 node, string key) constant returns (string ret) {
|
||||||
|
ret = records[node].text[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the text data associated with an ENS node and key.
|
||||||
|
* May only be called by the owner of that node in the ENS registry.
|
||||||
|
* @param node The node to update.
|
||||||
|
* @param key The key to set.
|
||||||
|
* @param value The text data value to set.
|
||||||
|
*/
|
||||||
|
function setText(bytes32 node, string key, string value) only_owner(node) {
|
||||||
|
records[node].text[key] = value;
|
||||||
|
TextChanged(node, key, key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
// This file is an automatically generated Go binding. Do not modify as any
|
// Code generated - DO NOT EDIT.
|
||||||
// change will likely be lost upon the next re-generation!
|
// This file is a generated binding and any manual changes will be lost.
|
||||||
|
|
||||||
package contract
|
package contract
|
||||||
|
|
||||||
|
|
@ -13,18 +13,18 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// ENSABI is the input ABI used to generate the binding from.
|
// ENSABI is the input ABI used to generate the binding from.
|
||||||
const ENSABI = `[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"label","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setSubnodeOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"owner","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"inputs":[{"name":"owner","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"label","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"resolver","type":"address"}],"name":"NewResolver","type":"event"}]`
|
const ENSABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"resolver\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"label\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setSubnodeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"setTTL\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"ttl\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"setResolver\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"label\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"NewResolver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"NewTTL\",\"type\":\"event\"}]"
|
||||||
|
|
||||||
// ENSBin is the compiled bytecode used for deploying new contracts.
|
// ENSBin is the compiled bytecode used for deploying new contracts.
|
||||||
const ENSBin = `0x606060405260405160208061032683395060806040525160008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a03191682179055506102c88061005e6000396000f3606060405260e060020a60003504630178b8bf811461004757806302571be31461006e57806306ab5923146100915780631896f70a146100c85780635b0fc9c3146100fc575b005b610130600435600081815260208190526040902060010154600160a060020a03165b919050565b610130600435600081815260208190526040902054600160a060020a0316610069565b6100456004356024356044356000838152602081905260408120548490600160a060020a0390811633919091161461014d57610002565b6100456004356024356000828152602081905260409020548290600160a060020a039081163391909116146101e757610002565b6100456004356024356000828152602081905260409020548290600160a060020a0390811633919091161461025957610002565b60408051600160a060020a03929092168252519081900360200190f35b60408051868152602081810187905282519182900383018220600160a060020a03871683529251929450869288927fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8292908290030190a382600060005060008460001916815260200190815260200160002060005060000160006101000a815481600160a060020a03021916908302179055505050505050565b60408051600160a060020a0384168152905184917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0919081900360200190a2506000828152602081905260409020600101805473ffffffffffffffffffffffffffffffffffffffff1916821790555050565b60408051600160a060020a0384168152905184917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266919081900360200190a2506000828152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff191682179055505056`
|
const ENSBin = `0x6060604052341561000f57600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a033316600160a060020a0319909116179055610503806100626000396000f3006060604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100b957806306ab5923146100cf57806314ab9038146100f657806316a25cbd146101195780631896f70a1461014c5780635b0fc9c31461016e575b600080fd5b341561009257600080fd5b61009d600435610190565b604051600160a060020a03909116815260200160405180910390f35b34156100c457600080fd5b61009d6004356101ae565b34156100da57600080fd5b6100f4600435602435600160a060020a03604435166101c9565b005b341561010157600080fd5b6100f460043567ffffffffffffffff6024351661028b565b341561012457600080fd5b61012f600435610357565b60405167ffffffffffffffff909116815260200160405180910390f35b341561015757600080fd5b6100f4600435600160a060020a036024351661038e565b341561017957600080fd5b6100f4600435600160a060020a0360243516610434565b600090815260208190526040902060010154600160a060020a031690565b600090815260208190526040902054600160a060020a031690565b600083815260208190526040812054849033600160a060020a039081169116146101f257600080fd5b8484604051918252602082015260409081019051908190039020915083857fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8285604051600160a060020a03909116815260200160405180910390a3506000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b600082815260208190526040902054829033600160a060020a039081169116146102b457600080fd5b827f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa688360405167ffffffffffffffff909116815260200160405180910390a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829033600160a060020a039081169116146103b757600080fd5b827f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a083604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120600101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600082815260208190526040902054829033600160a060020a0390811691161461045d57600080fd5b827fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26683604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555600a165627a7a7230582087c335a130f7bd19015451f7e1dc0e44cdeb5b64393f51a105ee00160711fcff0029`
|
||||||
|
|
||||||
// DeployENS deploys a new Ethereum contract, binding an instance of ENS to it.
|
// DeployENS deploys a new Ethereum contract, binding an instance of ENS to it.
|
||||||
func DeployENS(auth *bind.TransactOpts, backend bind.ContractBackend, owner common.Address) (common.Address, *types.Transaction, *ENS, error) {
|
func DeployENS(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ENS, error) {
|
||||||
parsed, err := abi.JSON(strings.NewReader(ENSABI))
|
parsed, err := abi.JSON(strings.NewReader(ENSABI))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.Address{}, nil, nil, err
|
return common.Address{}, nil, nil, err
|
||||||
}
|
}
|
||||||
address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSBin), backend, owner)
|
address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSBin), backend)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.Address{}, nil, nil, err
|
return common.Address{}, nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -210,6 +210,32 @@ func (_ENS *ENSCallerSession) Resolver(node [32]byte) (common.Address, error) {
|
||||||
return _ENS.Contract.Resolver(&_ENS.CallOpts, node)
|
return _ENS.Contract.Resolver(&_ENS.CallOpts, node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ttl is a free data retrieval call binding the contract method 0x16a25cbd.
|
||||||
|
//
|
||||||
|
// Solidity: function ttl(node bytes32) constant returns(uint64)
|
||||||
|
func (_ENS *ENSCaller) Ttl(opts *bind.CallOpts, node [32]byte) (uint64, error) {
|
||||||
|
var (
|
||||||
|
ret0 = new(uint64)
|
||||||
|
)
|
||||||
|
out := ret0
|
||||||
|
err := _ENS.contract.Call(opts, out, "ttl", node)
|
||||||
|
return *ret0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ttl is a free data retrieval call binding the contract method 0x16a25cbd.
|
||||||
|
//
|
||||||
|
// Solidity: function ttl(node bytes32) constant returns(uint64)
|
||||||
|
func (_ENS *ENSSession) Ttl(node [32]byte) (uint64, error) {
|
||||||
|
return _ENS.Contract.Ttl(&_ENS.CallOpts, node)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ttl is a free data retrieval call binding the contract method 0x16a25cbd.
|
||||||
|
//
|
||||||
|
// Solidity: function ttl(node bytes32) constant returns(uint64)
|
||||||
|
func (_ENS *ENSCallerSession) Ttl(node [32]byte) (uint64, error) {
|
||||||
|
return _ENS.Contract.Ttl(&_ENS.CallOpts, node)
|
||||||
|
}
|
||||||
|
|
||||||
// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3.
|
// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3.
|
||||||
//
|
//
|
||||||
// Solidity: function setOwner(node bytes32, owner address) returns()
|
// Solidity: function setOwner(node bytes32, owner address) returns()
|
||||||
|
|
@ -273,649 +299,23 @@ func (_ENS *ENSTransactorSession) SetSubnodeOwner(node [32]byte, label [32]byte,
|
||||||
return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner)
|
return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIFSRegistrarABI is the input ABI used to generate the binding from.
|
// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038.
|
||||||
const FIFSRegistrarABI = `[{"constant":false,"inputs":[{"name":"subnode","type":"bytes32"},{"name":"owner","type":"address"}],"name":"register","outputs":[],"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"},{"name":"node","type":"bytes32"}],"type":"constructor"}]`
|
|
||||||
|
|
||||||
// FIFSRegistrarBin is the compiled bytecode used for deploying new contracts.
|
|
||||||
const FIFSRegistrarBin = `0x6060604081815280610620833960a090525160805160008054600160a060020a031916831790558160a0610367806100878339018082600160a060020a03168152602001915050604051809103906000f0600160006101000a815481600160a060020a0302191690830217905550806002600050819055505050610232806103ee6000396000f3606060405260405160208061036783395060806040525160008054600160a060020a0319168217905550610330806100376000396000f36060604052361561004b5760e060020a60003504632dff694181146100535780633b3b57de1461007557806341b9dc2b146100a0578063c3d014d614610139578063d5fa2b00146101b2575b61022b610002565b61022d6004356000818152600260205260408120549081141561027057610002565b61023f600435600081815260016020526040812054600160a060020a03169081141561027057610002565b61025c60043560243560007f6164647200000000000000000000000000000000000000000000000000000000821480156100f05750600083815260016020526040812054600160a060020a031614155b8061013257507f636f6e74656e740000000000000000000000000000000000000000000000000082148015610132575060008381526002602052604081205414155b9392505050565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a031691909114905061027557610002565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a03169190911490506102c157610002565b005b60408051918252519081900360200190f35b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b919050565b6000838152600260209081526040918290208490558151848152915185927f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc92908290030190a2505050565b600083815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916851790558151600160a060020a0385168152915185927f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd292908290030190a250505056606060405260e060020a6000350463d22057a9811461001b575b005b61001960043560243560025460408051918252602082810185905260008054835194859003840185207f02571be300000000000000000000000000000000000000000000000000000000865260048601819052935193949193600160a060020a03909116926302571be39260248181019391829003018187876161da5a03f11561000257505060405151915050600160a060020a0381166000148015906100d4575033600160a060020a031681600160a060020a031614155b156100de57610002565b60408051600080546002547f06ab592300000000000000000000000000000000000000000000000000000000845260048401526024830188905230600160a060020a03908116604485015293519316926306ab5923926064818101939291829003018183876161da5a03f11561000257505060008054600154604080517f1896f70a00000000000000000000000000000000000000000000000000000000815260048101889052600160a060020a0392831660248201529051929091169350631896f70a926044828101939192829003018183876161da5a03f11561000257505060008054604080517f5b0fc9c300000000000000000000000000000000000000000000000000000000815260048101879052600160a060020a0388811660248301529151929091169350635b0fc9c3926044828101939192829003018183876161da5a03f115610002575050505050505056`
|
|
||||||
|
|
||||||
// DeployFIFSRegistrar deploys a new Ethereum contract, binding an instance of FIFSRegistrar to it.
|
|
||||||
func DeployFIFSRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address, node [32]byte) (common.Address, *types.Transaction, *FIFSRegistrar, error) {
|
|
||||||
parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, nil, nil, err
|
|
||||||
}
|
|
||||||
address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(FIFSRegistrarBin), backend, ensAddr, node)
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, nil, nil, err
|
|
||||||
}
|
|
||||||
return address, tx, &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrar is an auto generated Go binding around an Ethereum contract.
|
|
||||||
type FIFSRegistrar struct {
|
|
||||||
FIFSRegistrarCaller // Read-only binding to the contract
|
|
||||||
FIFSRegistrarTransactor // Write-only binding to the contract
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
|
|
||||||
type FIFSRegistrarCaller struct {
|
|
||||||
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
|
|
||||||
type FIFSRegistrarTransactor struct {
|
|
||||||
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarSession is an auto generated Go binding around an Ethereum contract,
|
|
||||||
// with pre-set call and transact options.
|
|
||||||
type FIFSRegistrarSession struct {
|
|
||||||
Contract *FIFSRegistrar // Generic contract binding to set the session for
|
|
||||||
CallOpts bind.CallOpts // Call options to use throughout this session
|
|
||||||
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
|
|
||||||
// with pre-set call options.
|
|
||||||
type FIFSRegistrarCallerSession struct {
|
|
||||||
Contract *FIFSRegistrarCaller // Generic contract caller binding to set the session for
|
|
||||||
CallOpts bind.CallOpts // Call options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
|
|
||||||
// with pre-set transact options.
|
|
||||||
type FIFSRegistrarTransactorSession struct {
|
|
||||||
Contract *FIFSRegistrarTransactor // Generic contract transactor binding to set the session for
|
|
||||||
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
|
|
||||||
type FIFSRegistrarRaw struct {
|
|
||||||
Contract *FIFSRegistrar // Generic contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
|
|
||||||
type FIFSRegistrarCallerRaw struct {
|
|
||||||
Contract *FIFSRegistrarCaller // Generic read-only contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIFSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
|
|
||||||
type FIFSRegistrarTransactorRaw struct {
|
|
||||||
Contract *FIFSRegistrarTransactor // Generic write-only contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFIFSRegistrar creates a new instance of FIFSRegistrar, bound to a specific deployed contract.
|
|
||||||
func NewFIFSRegistrar(address common.Address, backend bind.ContractBackend) (*FIFSRegistrar, error) {
|
|
||||||
contract, err := bindFIFSRegistrar(address, backend, backend)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFIFSRegistrarCaller creates a new read-only instance of FIFSRegistrar, bound to a specific deployed contract.
|
|
||||||
func NewFIFSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*FIFSRegistrarCaller, error) {
|
|
||||||
contract, err := bindFIFSRegistrar(address, caller, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &FIFSRegistrarCaller{contract: contract}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewFIFSRegistrarTransactor creates a new write-only instance of FIFSRegistrar, bound to a specific deployed contract.
|
|
||||||
func NewFIFSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*FIFSRegistrarTransactor, error) {
|
|
||||||
contract, err := bindFIFSRegistrar(address, nil, transactor)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &FIFSRegistrarTransactor{contract: contract}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// bindFIFSRegistrar binds a generic wrapper to an already deployed contract.
|
|
||||||
func bindFIFSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
|
|
||||||
parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return bind.NewBoundContract(address, parsed, caller, transactor), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call invokes the (constant) contract method with params as input values and
|
|
||||||
// sets the output to result. The result type might be a single field for simple
|
|
||||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
|
||||||
// returns.
|
|
||||||
func (_FIFSRegistrar *FIFSRegistrarRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
|
||||||
return _FIFSRegistrar.Contract.FIFSRegistrarCaller.contract.Call(opts, result, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
|
||||||
// its default method if one is available.
|
|
||||||
func (_FIFSRegistrar *FIFSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
|
||||||
return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transfer(opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transact invokes the (paid) contract method with params as input values.
|
|
||||||
func (_FIFSRegistrar *FIFSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
|
||||||
return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transact(opts, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call invokes the (constant) contract method with params as input values and
|
|
||||||
// sets the output to result. The result type might be a single field for simple
|
|
||||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
|
||||||
// returns.
|
|
||||||
func (_FIFSRegistrar *FIFSRegistrarCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
|
||||||
return _FIFSRegistrar.Contract.contract.Call(opts, result, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
|
||||||
// its default method if one is available.
|
|
||||||
func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
|
||||||
return _FIFSRegistrar.Contract.contract.Transfer(opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transact invokes the (paid) contract method with params as input values.
|
|
||||||
func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
|
||||||
return _FIFSRegistrar.Contract.contract.Transact(opts, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register is a paid mutator transaction binding the contract method 0xd22057a9.
|
|
||||||
//
|
//
|
||||||
// Solidity: function register(subnode bytes32, owner address) returns()
|
// Solidity: function setTTL(node bytes32, ttl uint64) returns()
|
||||||
func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, subnode [32]byte, owner common.Address) (*types.Transaction, error) {
|
func (_ENS *ENSTransactor) SetTTL(opts *bind.TransactOpts, node [32]byte, ttl uint64) (*types.Transaction, error) {
|
||||||
return _FIFSRegistrar.contract.Transact(opts, "register", subnode, owner)
|
return _ENS.contract.Transact(opts, "setTTL", node, ttl)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register is a paid mutator transaction binding the contract method 0xd22057a9.
|
// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038.
|
||||||
//
|
//
|
||||||
// Solidity: function register(subnode bytes32, owner address) returns()
|
// Solidity: function setTTL(node bytes32, ttl uint64) returns()
|
||||||
func (_FIFSRegistrar *FIFSRegistrarSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
|
func (_ENS *ENSSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) {
|
||||||
return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
|
return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register is a paid mutator transaction binding the contract method 0xd22057a9.
|
// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038.
|
||||||
//
|
//
|
||||||
// Solidity: function register(subnode bytes32, owner address) returns()
|
// Solidity: function setTTL(node bytes32, ttl uint64) returns()
|
||||||
func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
|
func (_ENS *ENSTransactorSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) {
|
||||||
return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
|
return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl)
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverABI is the input ABI used to generate the binding from.
|
|
||||||
const PublicResolverABI = `[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"kind","type":"bytes32"}],"name":"has","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"hash","type":"bytes32"}],"name":"setContent","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"addr","type":"address"}],"name":"setAddr","outputs":[],"type":"function"},{"inputs":[{"name":"ensAddr","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"}]`
|
|
||||||
|
|
||||||
// PublicResolverBin is the compiled bytecode used for deploying new contracts.
|
|
||||||
const PublicResolverBin = `0x606060405260405160208061036783395060806040525160008054600160a060020a0319168217905550610330806100376000396000f36060604052361561004b5760e060020a60003504632dff694181146100535780633b3b57de1461007557806341b9dc2b146100a0578063c3d014d614610139578063d5fa2b00146101b2575b61022b610002565b61022d6004356000818152600260205260408120549081141561027057610002565b61023f600435600081815260016020526040812054600160a060020a03169081141561027057610002565b61025c60043560243560007f6164647200000000000000000000000000000000000000000000000000000000821480156100f05750600083815260016020526040812054600160a060020a031614155b8061013257507f636f6e74656e740000000000000000000000000000000000000000000000000082148015610132575060008381526002602052604081205414155b9392505050565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a031691909114905061027557610002565b61022b600435602435600080546040805160e060020a6302571be30281526004810186905290518593600160a060020a033381169416926302571be392602482810193602093839003909101908290876161da5a03f11561000257505060405151600160a060020a03169190911490506102c157610002565b005b60408051918252519081900360200190f35b60408051600160a060020a03929092168252519081900360200190f35b604080519115158252519081900360200190f35b919050565b6000838152600260209081526040918290208490558151848152915185927f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc92908290030190a2505050565b600083815260016020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916851790558151600160a060020a0385168152915185927f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd292908290030190a250505056`
|
|
||||||
|
|
||||||
// DeployPublicResolver deploys a new Ethereum contract, binding an instance of PublicResolver to it.
|
|
||||||
func DeployPublicResolver(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address) (common.Address, *types.Transaction, *PublicResolver, error) {
|
|
||||||
parsed, err := abi.JSON(strings.NewReader(PublicResolverABI))
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, nil, nil, err
|
|
||||||
}
|
|
||||||
address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PublicResolverBin), backend, ensAddr)
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, nil, nil, err
|
|
||||||
}
|
|
||||||
return address, tx, &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolver is an auto generated Go binding around an Ethereum contract.
|
|
||||||
type PublicResolver struct {
|
|
||||||
PublicResolverCaller // Read-only binding to the contract
|
|
||||||
PublicResolverTransactor // Write-only binding to the contract
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverCaller is an auto generated read-only Go binding around an Ethereum contract.
|
|
||||||
type PublicResolverCaller struct {
|
|
||||||
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverTransactor is an auto generated write-only Go binding around an Ethereum contract.
|
|
||||||
type PublicResolverTransactor struct {
|
|
||||||
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverSession is an auto generated Go binding around an Ethereum contract,
|
|
||||||
// with pre-set call and transact options.
|
|
||||||
type PublicResolverSession struct {
|
|
||||||
Contract *PublicResolver // Generic contract binding to set the session for
|
|
||||||
CallOpts bind.CallOpts // Call options to use throughout this session
|
|
||||||
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract,
|
|
||||||
// with pre-set call options.
|
|
||||||
type PublicResolverCallerSession struct {
|
|
||||||
Contract *PublicResolverCaller // Generic contract caller binding to set the session for
|
|
||||||
CallOpts bind.CallOpts // Call options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
|
|
||||||
// with pre-set transact options.
|
|
||||||
type PublicResolverTransactorSession struct {
|
|
||||||
Contract *PublicResolverTransactor // Generic contract transactor binding to set the session for
|
|
||||||
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverRaw is an auto generated low-level Go binding around an Ethereum contract.
|
|
||||||
type PublicResolverRaw struct {
|
|
||||||
Contract *PublicResolver // Generic contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
|
|
||||||
type PublicResolverCallerRaw struct {
|
|
||||||
Contract *PublicResolverCaller // Generic read-only contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// PublicResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
|
|
||||||
type PublicResolverTransactorRaw struct {
|
|
||||||
Contract *PublicResolverTransactor // Generic write-only contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPublicResolver creates a new instance of PublicResolver, bound to a specific deployed contract.
|
|
||||||
func NewPublicResolver(address common.Address, backend bind.ContractBackend) (*PublicResolver, error) {
|
|
||||||
contract, err := bindPublicResolver(address, backend, backend)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPublicResolverCaller creates a new read-only instance of PublicResolver, bound to a specific deployed contract.
|
|
||||||
func NewPublicResolverCaller(address common.Address, caller bind.ContractCaller) (*PublicResolverCaller, error) {
|
|
||||||
contract, err := bindPublicResolver(address, caller, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &PublicResolverCaller{contract: contract}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPublicResolverTransactor creates a new write-only instance of PublicResolver, bound to a specific deployed contract.
|
|
||||||
func NewPublicResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*PublicResolverTransactor, error) {
|
|
||||||
contract, err := bindPublicResolver(address, nil, transactor)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &PublicResolverTransactor{contract: contract}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// bindPublicResolver binds a generic wrapper to an already deployed contract.
|
|
||||||
func bindPublicResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
|
|
||||||
parsed, err := abi.JSON(strings.NewReader(PublicResolverABI))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return bind.NewBoundContract(address, parsed, caller, transactor), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call invokes the (constant) contract method with params as input values and
|
|
||||||
// sets the output to result. The result type might be a single field for simple
|
|
||||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
|
||||||
// returns.
|
|
||||||
func (_PublicResolver *PublicResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
|
||||||
return _PublicResolver.Contract.PublicResolverCaller.contract.Call(opts, result, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
|
||||||
// its default method if one is available.
|
|
||||||
func (_PublicResolver *PublicResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.PublicResolverTransactor.contract.Transfer(opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transact invokes the (paid) contract method with params as input values.
|
|
||||||
func (_PublicResolver *PublicResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.PublicResolverTransactor.contract.Transact(opts, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call invokes the (constant) contract method with params as input values and
|
|
||||||
// sets the output to result. The result type might be a single field for simple
|
|
||||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
|
||||||
// returns.
|
|
||||||
func (_PublicResolver *PublicResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
|
||||||
return _PublicResolver.Contract.contract.Call(opts, result, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
|
||||||
// its default method if one is available.
|
|
||||||
func (_PublicResolver *PublicResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.contract.Transfer(opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transact invokes the (paid) contract method with params as input values.
|
|
||||||
func (_PublicResolver *PublicResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.contract.Transact(opts, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
|
|
||||||
//
|
|
||||||
// Solidity: function addr(node bytes32) constant returns(ret address)
|
|
||||||
func (_PublicResolver *PublicResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) {
|
|
||||||
var (
|
|
||||||
ret0 = new(common.Address)
|
|
||||||
)
|
|
||||||
out := ret0
|
|
||||||
err := _PublicResolver.contract.Call(opts, out, "addr", node)
|
|
||||||
return *ret0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
|
|
||||||
//
|
|
||||||
// Solidity: function addr(node bytes32) constant returns(ret address)
|
|
||||||
func (_PublicResolver *PublicResolverSession) Addr(node [32]byte) (common.Address, error) {
|
|
||||||
return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
|
|
||||||
//
|
|
||||||
// Solidity: function addr(node bytes32) constant returns(ret address)
|
|
||||||
func (_PublicResolver *PublicResolverCallerSession) Addr(node [32]byte) (common.Address, error) {
|
|
||||||
return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content is a free data retrieval call binding the contract method 0x2dff6941.
|
|
||||||
//
|
|
||||||
// Solidity: function content(node bytes32) constant returns(ret bytes32)
|
|
||||||
func (_PublicResolver *PublicResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) {
|
|
||||||
var (
|
|
||||||
ret0 = new([32]byte)
|
|
||||||
)
|
|
||||||
out := ret0
|
|
||||||
err := _PublicResolver.contract.Call(opts, out, "content", node)
|
|
||||||
return *ret0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content is a free data retrieval call binding the contract method 0x2dff6941.
|
|
||||||
//
|
|
||||||
// Solidity: function content(node bytes32) constant returns(ret bytes32)
|
|
||||||
func (_PublicResolver *PublicResolverSession) Content(node [32]byte) ([32]byte, error) {
|
|
||||||
return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content is a free data retrieval call binding the contract method 0x2dff6941.
|
|
||||||
//
|
|
||||||
// Solidity: function content(node bytes32) constant returns(ret bytes32)
|
|
||||||
func (_PublicResolver *PublicResolverCallerSession) Content(node [32]byte) ([32]byte, error) {
|
|
||||||
return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
|
|
||||||
//
|
|
||||||
// Solidity: function has(node bytes32, kind bytes32) returns(bool)
|
|
||||||
func (_PublicResolver *PublicResolverTransactor) Has(opts *bind.TransactOpts, node [32]byte, kind [32]byte) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.contract.Transact(opts, "has", node, kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
|
|
||||||
//
|
|
||||||
// Solidity: function has(node bytes32, kind bytes32) returns(bool)
|
|
||||||
func (_PublicResolver *PublicResolverSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.Has(&_PublicResolver.TransactOpts, node, kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
|
|
||||||
//
|
|
||||||
// Solidity: function has(node bytes32, kind bytes32) returns(bool)
|
|
||||||
func (_PublicResolver *PublicResolverTransactorSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.Has(&_PublicResolver.TransactOpts, node, kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
|
|
||||||
//
|
|
||||||
// Solidity: function setAddr(node bytes32, addr address) returns()
|
|
||||||
func (_PublicResolver *PublicResolverTransactor) SetAddr(opts *bind.TransactOpts, node [32]byte, addr common.Address) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.contract.Transact(opts, "setAddr", node, addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
|
|
||||||
//
|
|
||||||
// Solidity: function setAddr(node bytes32, addr address) returns()
|
|
||||||
func (_PublicResolver *PublicResolverSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00.
|
|
||||||
//
|
|
||||||
// Solidity: function setAddr(node bytes32, addr address) returns()
|
|
||||||
func (_PublicResolver *PublicResolverTransactorSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
|
|
||||||
//
|
|
||||||
// Solidity: function setContent(node bytes32, hash bytes32) returns()
|
|
||||||
func (_PublicResolver *PublicResolverTransactor) SetContent(opts *bind.TransactOpts, node [32]byte, hash [32]byte) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.contract.Transact(opts, "setContent", node, hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
|
|
||||||
//
|
|
||||||
// Solidity: function setContent(node bytes32, hash bytes32) returns()
|
|
||||||
func (_PublicResolver *PublicResolverSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6.
|
|
||||||
//
|
|
||||||
// Solidity: function setContent(node bytes32, hash bytes32) returns()
|
|
||||||
func (_PublicResolver *PublicResolverTransactorSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) {
|
|
||||||
return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverABI is the input ABI used to generate the binding from.
|
|
||||||
const ResolverABI = `[{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"kind","type":"bytes32"}],"name":"has","outputs":[{"name":"","type":"bool"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"}]`
|
|
||||||
|
|
||||||
// ResolverBin is the compiled bytecode used for deploying new contracts.
|
|
||||||
const ResolverBin = `0x`
|
|
||||||
|
|
||||||
// DeployResolver deploys a new Ethereum contract, binding an instance of Resolver to it.
|
|
||||||
func DeployResolver(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Resolver, error) {
|
|
||||||
parsed, err := abi.JSON(strings.NewReader(ResolverABI))
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, nil, nil, err
|
|
||||||
}
|
|
||||||
address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ResolverBin), backend)
|
|
||||||
if err != nil {
|
|
||||||
return common.Address{}, nil, nil, err
|
|
||||||
}
|
|
||||||
return address, tx, &Resolver{ResolverCaller: ResolverCaller{contract: contract}, ResolverTransactor: ResolverTransactor{contract: contract}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolver is an auto generated Go binding around an Ethereum contract.
|
|
||||||
type Resolver struct {
|
|
||||||
ResolverCaller // Read-only binding to the contract
|
|
||||||
ResolverTransactor // Write-only binding to the contract
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverCaller is an auto generated read-only Go binding around an Ethereum contract.
|
|
||||||
type ResolverCaller struct {
|
|
||||||
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverTransactor is an auto generated write-only Go binding around an Ethereum contract.
|
|
||||||
type ResolverTransactor struct {
|
|
||||||
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverSession is an auto generated Go binding around an Ethereum contract,
|
|
||||||
// with pre-set call and transact options.
|
|
||||||
type ResolverSession struct {
|
|
||||||
Contract *Resolver // Generic contract binding to set the session for
|
|
||||||
CallOpts bind.CallOpts // Call options to use throughout this session
|
|
||||||
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract,
|
|
||||||
// with pre-set call options.
|
|
||||||
type ResolverCallerSession struct {
|
|
||||||
Contract *ResolverCaller // Generic contract caller binding to set the session for
|
|
||||||
CallOpts bind.CallOpts // Call options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
|
|
||||||
// with pre-set transact options.
|
|
||||||
type ResolverTransactorSession struct {
|
|
||||||
Contract *ResolverTransactor // Generic contract transactor binding to set the session for
|
|
||||||
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverRaw is an auto generated low-level Go binding around an Ethereum contract.
|
|
||||||
type ResolverRaw struct {
|
|
||||||
Contract *Resolver // Generic contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
|
|
||||||
type ResolverCallerRaw struct {
|
|
||||||
Contract *ResolverCaller // Generic read-only contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
|
|
||||||
type ResolverTransactorRaw struct {
|
|
||||||
Contract *ResolverTransactor // Generic write-only contract binding to access the raw methods on
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewResolver creates a new instance of Resolver, bound to a specific deployed contract.
|
|
||||||
func NewResolver(address common.Address, backend bind.ContractBackend) (*Resolver, error) {
|
|
||||||
contract, err := bindResolver(address, backend, backend)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &Resolver{ResolverCaller: ResolverCaller{contract: contract}, ResolverTransactor: ResolverTransactor{contract: contract}}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewResolverCaller creates a new read-only instance of Resolver, bound to a specific deployed contract.
|
|
||||||
func NewResolverCaller(address common.Address, caller bind.ContractCaller) (*ResolverCaller, error) {
|
|
||||||
contract, err := bindResolver(address, caller, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &ResolverCaller{contract: contract}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewResolverTransactor creates a new write-only instance of Resolver, bound to a specific deployed contract.
|
|
||||||
func NewResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*ResolverTransactor, error) {
|
|
||||||
contract, err := bindResolver(address, nil, transactor)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &ResolverTransactor{contract: contract}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// bindResolver binds a generic wrapper to an already deployed contract.
|
|
||||||
func bindResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
|
|
||||||
parsed, err := abi.JSON(strings.NewReader(ResolverABI))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return bind.NewBoundContract(address, parsed, caller, transactor), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call invokes the (constant) contract method with params as input values and
|
|
||||||
// sets the output to result. The result type might be a single field for simple
|
|
||||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
|
||||||
// returns.
|
|
||||||
func (_Resolver *ResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
|
||||||
return _Resolver.Contract.ResolverCaller.contract.Call(opts, result, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
|
||||||
// its default method if one is available.
|
|
||||||
func (_Resolver *ResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
|
||||||
return _Resolver.Contract.ResolverTransactor.contract.Transfer(opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transact invokes the (paid) contract method with params as input values.
|
|
||||||
func (_Resolver *ResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
|
||||||
return _Resolver.Contract.ResolverTransactor.contract.Transact(opts, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call invokes the (constant) contract method with params as input values and
|
|
||||||
// sets the output to result. The result type might be a single field for simple
|
|
||||||
// returns, a slice of interfaces for anonymous returns and a struct for named
|
|
||||||
// returns.
|
|
||||||
func (_Resolver *ResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
|
||||||
return _Resolver.Contract.contract.Call(opts, result, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer initiates a plain transaction to move funds to the contract, calling
|
|
||||||
// its default method if one is available.
|
|
||||||
func (_Resolver *ResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
|
||||||
return _Resolver.Contract.contract.Transfer(opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transact invokes the (paid) contract method with params as input values.
|
|
||||||
func (_Resolver *ResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
|
||||||
return _Resolver.Contract.contract.Transact(opts, method, params...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
|
|
||||||
//
|
|
||||||
// Solidity: function addr(node bytes32) constant returns(ret address)
|
|
||||||
func (_Resolver *ResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) {
|
|
||||||
var (
|
|
||||||
ret0 = new(common.Address)
|
|
||||||
)
|
|
||||||
out := ret0
|
|
||||||
err := _Resolver.contract.Call(opts, out, "addr", node)
|
|
||||||
return *ret0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
|
|
||||||
//
|
|
||||||
// Solidity: function addr(node bytes32) constant returns(ret address)
|
|
||||||
func (_Resolver *ResolverSession) Addr(node [32]byte) (common.Address, error) {
|
|
||||||
return _Resolver.Contract.Addr(&_Resolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Addr is a free data retrieval call binding the contract method 0x3b3b57de.
|
|
||||||
//
|
|
||||||
// Solidity: function addr(node bytes32) constant returns(ret address)
|
|
||||||
func (_Resolver *ResolverCallerSession) Addr(node [32]byte) (common.Address, error) {
|
|
||||||
return _Resolver.Contract.Addr(&_Resolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content is a free data retrieval call binding the contract method 0x2dff6941.
|
|
||||||
//
|
|
||||||
// Solidity: function content(node bytes32) constant returns(ret bytes32)
|
|
||||||
func (_Resolver *ResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) {
|
|
||||||
var (
|
|
||||||
ret0 = new([32]byte)
|
|
||||||
)
|
|
||||||
out := ret0
|
|
||||||
err := _Resolver.contract.Call(opts, out, "content", node)
|
|
||||||
return *ret0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content is a free data retrieval call binding the contract method 0x2dff6941.
|
|
||||||
//
|
|
||||||
// Solidity: function content(node bytes32) constant returns(ret bytes32)
|
|
||||||
func (_Resolver *ResolverSession) Content(node [32]byte) ([32]byte, error) {
|
|
||||||
return _Resolver.Contract.Content(&_Resolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content is a free data retrieval call binding the contract method 0x2dff6941.
|
|
||||||
//
|
|
||||||
// Solidity: function content(node bytes32) constant returns(ret bytes32)
|
|
||||||
func (_Resolver *ResolverCallerSession) Content(node [32]byte) ([32]byte, error) {
|
|
||||||
return _Resolver.Contract.Content(&_Resolver.CallOpts, node)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
|
|
||||||
//
|
|
||||||
// Solidity: function has(node bytes32, kind bytes32) returns(bool)
|
|
||||||
func (_Resolver *ResolverTransactor) Has(opts *bind.TransactOpts, node [32]byte, kind [32]byte) (*types.Transaction, error) {
|
|
||||||
return _Resolver.contract.Transact(opts, "has", node, kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
|
|
||||||
//
|
|
||||||
// Solidity: function has(node bytes32, kind bytes32) returns(bool)
|
|
||||||
func (_Resolver *ResolverSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
|
|
||||||
return _Resolver.Contract.Has(&_Resolver.TransactOpts, node, kind)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Has is a paid mutator transaction binding the contract method 0x41b9dc2b.
|
|
||||||
//
|
|
||||||
// Solidity: function has(node bytes32, kind bytes32) returns(bool)
|
|
||||||
func (_Resolver *ResolverTransactorSession) Has(node [32]byte, kind [32]byte) (*types.Transaction, error) {
|
|
||||||
return _Resolver.Contract.Has(&_Resolver.TransactOpts, node, kind)
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,226 +0,0 @@
|
||||||
// Ethereum Name Service contracts by Nick Johnson <nick@ethereum.org>
|
|
||||||
//
|
|
||||||
// To the extent possible under law, the person who associated CC0 with
|
|
||||||
// ENS contracts has waived all copyright and related or neighboring rights
|
|
||||||
// to ENS.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the CC0 legalcode along with this
|
|
||||||
// work. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The ENS registry contract.
|
|
||||||
*/
|
|
||||||
contract ENS {
|
|
||||||
struct Record {
|
|
||||||
address owner;
|
|
||||||
address resolver;
|
|
||||||
}
|
|
||||||
|
|
||||||
mapping(bytes32=>Record) records;
|
|
||||||
|
|
||||||
// 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 owner of a node changes the resolver for that node.
|
|
||||||
event NewResolver(bytes32 indexed node, address resolver);
|
|
||||||
|
|
||||||
// Permits modifications only by the owner of the specified node.
|
|
||||||
modifier only_owner(bytes32 node) {
|
|
||||||
if(records[node].owner != msg.sender) throw;
|
|
||||||
_
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new ENS registrar, with the provided address as the owner of the root node.
|
|
||||||
*/
|
|
||||||
function ENS(address owner) {
|
|
||||||
records[0].owner = owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the address that owns the specified node.
|
|
||||||
*/
|
|
||||||
function owner(bytes32 node) constant returns (address) {
|
|
||||||
return records[node].owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the address of the resolver for the specified node.
|
|
||||||
*/
|
|
||||||
function resolver(bytes32 node) constant returns (address) {
|
|
||||||
return records[node].resolver;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transfers ownership of a node to a new address. May only be called by the current
|
|
||||||
* owner of the node.
|
|
||||||
* @param node The node to transfer ownership of.
|
|
||||||
* @param owner The address of the new owner.
|
|
||||||
*/
|
|
||||||
function setOwner(bytes32 node, address owner) only_owner(node) {
|
|
||||||
Transfer(node, owner);
|
|
||||||
records[node].owner = owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transfers ownership of a subnode sha3(node, label) to a new address. May only be
|
|
||||||
* called by the owner of the parent node.
|
|
||||||
* @param node The parent node.
|
|
||||||
* @param label The hash of the label specifying the subnode.
|
|
||||||
* @param owner The address of the new owner.
|
|
||||||
*/
|
|
||||||
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) {
|
|
||||||
var subnode = sha3(node, label);
|
|
||||||
NewOwner(node, label, owner);
|
|
||||||
records[subnode].owner = owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the resolver address for the specified node.
|
|
||||||
* @param node The node to update.
|
|
||||||
* @param resolver The address of the resolver.
|
|
||||||
*/
|
|
||||||
function setResolver(bytes32 node, address resolver) only_owner(node) {
|
|
||||||
NewResolver(node, resolver);
|
|
||||||
records[node].resolver = resolver;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A registrar that allocates subdomains to the first person to claim them. It also deploys
|
|
||||||
* a simple resolver contract and sets that as the default resolver on new names for
|
|
||||||
* convenience.
|
|
||||||
*/
|
|
||||||
contract FIFSRegistrar {
|
|
||||||
ENS ens;
|
|
||||||
PublicResolver defaultResolver;
|
|
||||||
bytes32 rootNode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
* @param ensAddr The address of the ENS registry.
|
|
||||||
* @param node The node that this registrar administers.
|
|
||||||
*/
|
|
||||||
function FIFSRegistrar(address ensAddr, bytes32 node) {
|
|
||||||
ens = ENS(ensAddr);
|
|
||||||
defaultResolver = new PublicResolver(ensAddr);
|
|
||||||
rootNode = node;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register a name, or change the owner of an existing registration.
|
|
||||||
* @param subnode The hash of the label to register.
|
|
||||||
* @param owner The address of the new owner.
|
|
||||||
*/
|
|
||||||
function register(bytes32 subnode, address owner) {
|
|
||||||
var node = sha3(rootNode, subnode);
|
|
||||||
var currentOwner = ens.owner(node);
|
|
||||||
if(currentOwner != 0 && currentOwner != msg.sender)
|
|
||||||
throw;
|
|
||||||
|
|
||||||
// Temporarily set ourselves as the owner
|
|
||||||
ens.setSubnodeOwner(rootNode, subnode, this);
|
|
||||||
// Set up the default resolver
|
|
||||||
ens.setResolver(node, defaultResolver);
|
|
||||||
// Set the owner to the real owner
|
|
||||||
ens.setOwner(node, owner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
contract Resolver {
|
|
||||||
event AddrChanged(bytes32 indexed node, address a);
|
|
||||||
event ContentChanged(bytes32 indexed node, bytes32 hash);
|
|
||||||
|
|
||||||
function has(bytes32 node, bytes32 kind) returns (bool);
|
|
||||||
function addr(bytes32 node) constant returns (address ret);
|
|
||||||
function content(bytes32 node) constant returns (bytes32 ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A simple resolver anyone can use; only allows the owner of a node to set its
|
|
||||||
* address.
|
|
||||||
*/
|
|
||||||
contract PublicResolver is Resolver {
|
|
||||||
ENS ens;
|
|
||||||
mapping(bytes32=>address) addresses;
|
|
||||||
mapping(bytes32=>bytes32) contents;
|
|
||||||
|
|
||||||
modifier only_owner(bytes32 node) {
|
|
||||||
if(ens.owner(node) != msg.sender) throw;
|
|
||||||
_
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
* @param ensAddr The ENS registrar contract.
|
|
||||||
*/
|
|
||||||
function PublicResolver(address ensAddr) {
|
|
||||||
ens = ENS(ensAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fallback function.
|
|
||||||
*/
|
|
||||||
function() {
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the specified node has the specified record type.
|
|
||||||
* @param node The ENS node to query.
|
|
||||||
* @param kind The record type name, as specified in EIP137.
|
|
||||||
* @return True if this resolver has a record of the provided type on the
|
|
||||||
* provided node.
|
|
||||||
*/
|
|
||||||
function has(bytes32 node, bytes32 kind) returns (bool) {
|
|
||||||
return (kind == "addr" && addresses[node] != 0) ||
|
|
||||||
(kind == "content" && contents[node] != 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the address associated with an ENS node.
|
|
||||||
* @param node The ENS node to query.
|
|
||||||
* @return The associated address.
|
|
||||||
*/
|
|
||||||
function addr(bytes32 node) constant returns (address ret) {
|
|
||||||
ret = addresses[node];
|
|
||||||
if(ret == 0)
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the content hash associated with an ENS node.
|
|
||||||
* @param node The ENS node to query.
|
|
||||||
* @return The associated content hash.
|
|
||||||
*/
|
|
||||||
function content(bytes32 node) constant returns (bytes32 ret) {
|
|
||||||
ret = contents[node];
|
|
||||||
if(ret == 0)
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the address associated with an ENS node.
|
|
||||||
* May only be called by the owner of that node in the ENS registry.
|
|
||||||
* @param node The node to update.
|
|
||||||
* @param addr The address to set.
|
|
||||||
*/
|
|
||||||
function setAddr(bytes32 node, address addr) only_owner(node) {
|
|
||||||
addresses[node] = addr;
|
|
||||||
AddrChanged(node, addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the content hash associated with an ENS node.
|
|
||||||
* May only be called by the owner of that node in the ENS registry.
|
|
||||||
* @param node The node to update.
|
|
||||||
* @param hash The content hash to set.
|
|
||||||
*/
|
|
||||||
function setContent(bytes32 node, bytes32 hash) only_owner(node) {
|
|
||||||
contents[node] = hash;
|
|
||||||
ContentChanged(node, hash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
180
contracts/ens/contract/fifsregistrar.go
Normal file
180
contracts/ens/contract/fifsregistrar.go
Normal file
|
|
@ -0,0 +1,180 @@
|
||||||
|
// Code generated - DO NOT EDIT.
|
||||||
|
// This file is a generated binding and any manual changes will be lost.
|
||||||
|
|
||||||
|
package contract
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi"
|
||||||
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FIFSRegistrarABI is the input ABI used to generate the binding from.
|
||||||
|
const FIFSRegistrarABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"subnode\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"},{\"name\":\"node\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]"
|
||||||
|
|
||||||
|
// FIFSRegistrarBin is the compiled bytecode used for deploying new contracts.
|
||||||
|
const FIFSRegistrarBin = `0x6060604052341561000f57600080fd5b604051604080610224833981016040528080519190602001805160008054600160a060020a03909516600160a060020a03199095169490941790935550506001556101c58061005f6000396000f3006060604052600436106100275763ffffffff60e060020a600035041663d22057a9811461002c575b600080fd5b341561003757600080fd5b61004e600435600160a060020a0360243516610050565b005b816000806001548360405191825260208201526040908101905190819003902060008054919350600160a060020a03909116906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156100c857600080fd5b6102c65a03f115156100d957600080fd5b5050506040518051915050600160a060020a0381161580159061010e575033600160a060020a031681600160a060020a031614155b1561011857600080fd5b600054600154600160a060020a03909116906306ab592390878760405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561017e57600080fd5b6102c65a03f1151561018f57600080fd5b50505050505050505600a165627a7a723058209b0c0f4ed76e4fe49a71d4b838ab3d00d6bad29021172db7ced9f36abcafbf510029`
|
||||||
|
|
||||||
|
// DeployFIFSRegistrar deploys a new Ethereum contract, binding an instance of FIFSRegistrar to it.
|
||||||
|
func DeployFIFSRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address, node [32]byte) (common.Address, *types.Transaction, *FIFSRegistrar, error) {
|
||||||
|
parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
|
||||||
|
if err != nil {
|
||||||
|
return common.Address{}, nil, nil, err
|
||||||
|
}
|
||||||
|
address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(FIFSRegistrarBin), backend, ensAddr, node)
|
||||||
|
if err != nil {
|
||||||
|
return common.Address{}, nil, nil, err
|
||||||
|
}
|
||||||
|
return address, tx, &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrar is an auto generated Go binding around an Ethereum contract.
|
||||||
|
type FIFSRegistrar struct {
|
||||||
|
FIFSRegistrarCaller // Read-only binding to the contract
|
||||||
|
FIFSRegistrarTransactor // Write-only binding to the contract
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract.
|
||||||
|
type FIFSRegistrarCaller struct {
|
||||||
|
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract.
|
||||||
|
type FIFSRegistrarTransactor struct {
|
||||||
|
contract *bind.BoundContract // Generic contract wrapper for the low level calls
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarSession is an auto generated Go binding around an Ethereum contract,
|
||||||
|
// with pre-set call and transact options.
|
||||||
|
type FIFSRegistrarSession struct {
|
||||||
|
Contract *FIFSRegistrar // Generic contract binding to set the session for
|
||||||
|
CallOpts bind.CallOpts // Call options to use throughout this session
|
||||||
|
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract,
|
||||||
|
// with pre-set call options.
|
||||||
|
type FIFSRegistrarCallerSession struct {
|
||||||
|
Contract *FIFSRegistrarCaller // Generic contract caller binding to set the session for
|
||||||
|
CallOpts bind.CallOpts // Call options to use throughout this session
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
|
||||||
|
// with pre-set transact options.
|
||||||
|
type FIFSRegistrarTransactorSession struct {
|
||||||
|
Contract *FIFSRegistrarTransactor // Generic contract transactor binding to set the session for
|
||||||
|
TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract.
|
||||||
|
type FIFSRegistrarRaw struct {
|
||||||
|
Contract *FIFSRegistrar // Generic contract binding to access the raw methods on
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
|
||||||
|
type FIFSRegistrarCallerRaw struct {
|
||||||
|
Contract *FIFSRegistrarCaller // Generic read-only contract binding to access the raw methods on
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIFSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
|
||||||
|
type FIFSRegistrarTransactorRaw struct {
|
||||||
|
Contract *FIFSRegistrarTransactor // Generic write-only contract binding to access the raw methods on
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFIFSRegistrar creates a new instance of FIFSRegistrar, bound to a specific deployed contract.
|
||||||
|
func NewFIFSRegistrar(address common.Address, backend bind.ContractBackend) (*FIFSRegistrar, error) {
|
||||||
|
contract, err := bindFIFSRegistrar(address, backend, backend)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFIFSRegistrarCaller creates a new read-only instance of FIFSRegistrar, bound to a specific deployed contract.
|
||||||
|
func NewFIFSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*FIFSRegistrarCaller, error) {
|
||||||
|
contract, err := bindFIFSRegistrar(address, caller, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &FIFSRegistrarCaller{contract: contract}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFIFSRegistrarTransactor creates a new write-only instance of FIFSRegistrar, bound to a specific deployed contract.
|
||||||
|
func NewFIFSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*FIFSRegistrarTransactor, error) {
|
||||||
|
contract, err := bindFIFSRegistrar(address, nil, transactor)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &FIFSRegistrarTransactor{contract: contract}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// bindFIFSRegistrar binds a generic wrapper to an already deployed contract.
|
||||||
|
func bindFIFSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor) (*bind.BoundContract, error) {
|
||||||
|
parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return bind.NewBoundContract(address, parsed, caller, transactor), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call invokes the (constant) contract method with params as input values and
|
||||||
|
// sets the output to result. The result type might be a single field for simple
|
||||||
|
// returns, a slice of interfaces for anonymous returns and a struct for named
|
||||||
|
// returns.
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
||||||
|
return _FIFSRegistrar.Contract.FIFSRegistrarCaller.contract.Call(opts, result, method, params...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer initiates a plain transaction to move funds to the contract, calling
|
||||||
|
// its default method if one is available.
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transfer(opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transact invokes the (paid) contract method with params as input values.
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transact(opts, method, params...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call invokes the (constant) contract method with params as input values and
|
||||||
|
// sets the output to result. The result type might be a single field for simple
|
||||||
|
// returns, a slice of interfaces for anonymous returns and a struct for named
|
||||||
|
// returns.
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
|
||||||
|
return _FIFSRegistrar.Contract.contract.Call(opts, result, method, params...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer initiates a plain transaction to move funds to the contract, calling
|
||||||
|
// its default method if one is available.
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.Contract.contract.Transfer(opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transact invokes the (paid) contract method with params as input values.
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.Contract.contract.Transact(opts, method, params...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register is a paid mutator transaction binding the contract method 0xd22057a9.
|
||||||
|
//
|
||||||
|
// Solidity: function register(subnode bytes32, owner address) returns()
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, subnode [32]byte, owner common.Address) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.contract.Transact(opts, "register", subnode, owner)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register is a paid mutator transaction binding the contract method 0xd22057a9.
|
||||||
|
//
|
||||||
|
// Solidity: function register(subnode bytes32, owner address) returns()
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register is a paid mutator transaction binding the contract method 0xd22057a9.
|
||||||
|
//
|
||||||
|
// Solidity: function register(subnode bytes32, owner address) returns()
|
||||||
|
func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) {
|
||||||
|
return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner)
|
||||||
|
}
|
||||||
488
contracts/ens/contract/publicresolver.go
Normal file
488
contracts/ens/contract/publicresolver.go
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -16,7 +16,9 @@
|
||||||
|
|
||||||
package ens
|
package ens
|
||||||
|
|
||||||
//go:generate abigen --sol contract/ens.sol --pkg contract --out contract/ens.go
|
//go:generate abigen --sol contract/ENS.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/ens.go
|
||||||
|
//go:generate abigen --sol contract/FIFSRegistrar.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/fifsregistrar.go
|
||||||
|
//go:generate abigen --sol contract/PublicResolver.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/publicresolver.go
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
@ -57,31 +59,29 @@ func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contra
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeployENS deploys an instance of the ENS nameservice, with a 'first-in, first-served' root registrar.
|
// DeployENS deploys an instance of the ENS nameservice, with a 'first-in, first-served' root registrar.
|
||||||
func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (*ENS, error) {
|
func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) {
|
||||||
// Deploy the ENS registry
|
// Deploy the ENS registry.
|
||||||
ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend, transactOpts.From)
|
ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return ensAddr, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ens, err := NewENS(transactOpts, ensAddr, contractBackend)
|
ens, err := NewENS(transactOpts, ensAddr, contractBackend)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return ensAddr, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deploy the registrar
|
// Deploy the registrar.
|
||||||
regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{})
|
regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return ensAddr, nil, err
|
||||||
|
}
|
||||||
|
// Set the registrar as owner of the ENS root.
|
||||||
|
if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil {
|
||||||
|
return ensAddr, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the registrar as owner of the ENS root
|
return ensAddr, ens, nil
|
||||||
_, err = ens.SetOwner([32]byte{}, regAddr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ens, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ensParentNode(name string) (common.Hash, common.Hash) {
|
func ensParentNode(name string) (common.Hash, common.Hash) {
|
||||||
|
|
@ -155,15 +155,11 @@ func (self *ENS) Resolve(name string) (common.Hash, error) {
|
||||||
// Only works if the registrar for the parent domain implements the FIFS registrar protocol.
|
// Only works if the registrar for the parent domain implements the FIFS registrar protocol.
|
||||||
func (self *ENS) Register(name string) (*types.Transaction, error) {
|
func (self *ENS) Register(name string) (*types.Transaction, error) {
|
||||||
parentNode, label := ensParentNode(name)
|
parentNode, label := ensParentNode(name)
|
||||||
|
|
||||||
registrar, err := self.getRegistrar(parentNode)
|
registrar, err := self.getRegistrar(parentNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
return registrar.Contract.Register(&self.TransactOpts, label, self.TransactOpts.From)
|
||||||
opts := self.TransactOpts
|
|
||||||
opts.GasLimit = 200000
|
|
||||||
return registrar.Contract.Register(&opts, label, self.TransactOpts.From)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContentHash sets the content hash associated with a name. Only works if the caller
|
// SetContentHash sets the content hash associated with a name. Only works if the caller
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import (
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
"github.com/ethereum/go-ethereum/accounts/abi/bind"
|
||||||
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
|
||||||
|
"github.com/ethereum/go-ethereum/contracts/ens/contract"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
)
|
)
|
||||||
|
|
@ -36,27 +37,36 @@ var (
|
||||||
func TestENS(t *testing.T) {
|
func TestENS(t *testing.T) {
|
||||||
contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}})
|
contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}})
|
||||||
transactOpts := bind.NewKeyedTransactor(key)
|
transactOpts := bind.NewKeyedTransactor(key)
|
||||||
// Workaround for bug estimating gas in the call to Register
|
|
||||||
transactOpts.GasLimit = 1000000
|
|
||||||
|
|
||||||
ens, err := DeployENS(transactOpts, contractBackend)
|
ensAddr, ens, err := DeployENS(transactOpts, contractBackend)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("expected no error, got %v", err)
|
t.Fatalf("can't deploy root registry: %v", err)
|
||||||
}
|
}
|
||||||
contractBackend.Commit()
|
contractBackend.Commit()
|
||||||
|
|
||||||
_, err = ens.Register(name)
|
// Set ourself as the owner of the name.
|
||||||
if err != nil {
|
if _, err := ens.Register(name); err != nil {
|
||||||
t.Fatalf("expected no error, got %v", err)
|
t.Fatalf("can't register: %v", err)
|
||||||
}
|
}
|
||||||
contractBackend.Commit()
|
contractBackend.Commit()
|
||||||
|
|
||||||
_, err = ens.SetContentHash(name, hash)
|
// Deploy a resolver and make it responsible for the name.
|
||||||
|
resolverAddr, _, _, err := contract.DeployPublicResolver(transactOpts, contractBackend, ensAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("expected no error, got %v", err)
|
t.Fatalf("can't deploy resolver: %v", err)
|
||||||
|
}
|
||||||
|
if _, err := ens.SetResolver(ensNode(name), resolverAddr); err != nil {
|
||||||
|
t.Fatalf("can't set resolver: %v", err)
|
||||||
}
|
}
|
||||||
contractBackend.Commit()
|
contractBackend.Commit()
|
||||||
|
|
||||||
|
// Set the content hash for the name.
|
||||||
|
if _, err = ens.SetContentHash(name, hash); err != nil {
|
||||||
|
t.Fatalf("can't set content hash: %v", err)
|
||||||
|
}
|
||||||
|
contractBackend.Commit()
|
||||||
|
|
||||||
|
// Try to resolve the name.
|
||||||
vhost, err := ens.Resolve(name)
|
vhost, err := ens.Resolve(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("expected no error, got %v", err)
|
t.Fatalf("expected no error, got %v", err)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue