mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
112 lines
4.3 KiB
Solidity
112 lines
4.3 KiB
Solidity
|
//sol FixedFeeRegistrar
|
||
|
// Simple global registrar with fixed-fee reservations.
|
||
|
// @authors:
|
||
|
// Gav Wood <g@ethdev.com>
|
||
|
|
||
|
pragma solidity >=0.4.0 <0.9.0;
|
||
|
|
||
|
abstract contract Registrar {
|
||
|
event Changed(string indexed name);
|
||
|
|
||
|
function owner(string memory _name) public virtual view returns (address o_owner);
|
||
|
function addr(string memory _name) public virtual view returns (address o_address);
|
||
|
function subRegistrar(string memory _name) virtual public view returns (address o_subRegistrar);
|
||
|
function content(string memory _name) public virtual view returns (bytes32 o_content);
|
||
|
}
|
||
|
|
||
|
contract FixedFeeRegistrar is Registrar {
|
||
|
struct Record {
|
||
|
address addr;
|
||
|
address subRegistrar;
|
||
|
bytes32 content;
|
||
|
address owner;
|
||
|
}
|
||
|
|
||
|
modifier onlyrecordowner(string memory _name) { if (m_record(_name).owner == msg.sender) _; }
|
||
|
|
||
|
function reserve(string memory _name) public payable {
|
||
|
Record storage rec = m_record(_name);
|
||
|
if (rec.owner == 0x0000000000000000000000000000000000000000 && msg.value >= c_fee) {
|
||
|
rec.owner = msg.sender;
|
||
|
emit Changed(_name);
|
||
|
}
|
||
|
}
|
||
|
function disown(string memory _name, address payable _refund) onlyrecordowner(_name) public {
|
||
|
delete m_recordData[uint(keccak256(bytes(_name))) / 8];
|
||
|
if (!_refund.send(c_fee))
|
||
|
revert();
|
||
|
emit Changed(_name);
|
||
|
}
|
||
|
function transfer(string memory _name, address _newOwner) onlyrecordowner(_name) public {
|
||
|
m_record(_name).owner = _newOwner;
|
||
|
emit Changed(_name);
|
||
|
}
|
||
|
function setAddr(string memory _name, address _a) onlyrecordowner(_name) public {
|
||
|
m_record(_name).addr = _a;
|
||
|
emit Changed(_name);
|
||
|
}
|
||
|
function setSubRegistrar(string memory _name, address _registrar) onlyrecordowner(_name) public {
|
||
|
m_record(_name).subRegistrar = _registrar;
|
||
|
emit Changed(_name);
|
||
|
}
|
||
|
function setContent(string memory _name, bytes32 _content) onlyrecordowner(_name) public {
|
||
|
m_record(_name).content = _content;
|
||
|
emit Changed(_name);
|
||
|
}
|
||
|
|
||
|
function record(string memory _name) public view returns (address o_addr, address o_subRegistrar, bytes32 o_content, address o_owner) {
|
||
|
Record storage rec = m_record(_name);
|
||
|
o_addr = rec.addr;
|
||
|
o_subRegistrar = rec.subRegistrar;
|
||
|
o_content = rec.content;
|
||
|
o_owner = rec.owner;
|
||
|
}
|
||
|
function addr(string memory _name) public override view returns (address) { return m_record(_name).addr; }
|
||
|
function subRegistrar(string memory _name) public override view returns (address) { return m_record(_name).subRegistrar; }
|
||
|
function content(string memory _name) public override view returns (bytes32) { return m_record(_name).content; }
|
||
|
function owner(string memory _name) public override view returns (address) { return m_record(_name).owner; }
|
||
|
|
||
|
Record[2**253] m_recordData;
|
||
|
function m_record(string memory _name) view internal returns (Record storage o_record) {
|
||
|
return m_recordData[uint(keccak256(bytes(_name))) / 8];
|
||
|
}
|
||
|
uint constant c_fee = 69 ether;
|
||
|
}
|
||
|
// ====
|
||
|
// compileViaYul: also
|
||
|
// ----
|
||
|
// constructor()
|
||
|
// gas irOptimized: 544916
|
||
|
// gas legacy: 942808
|
||
|
// gas legacyOptimized: 492291
|
||
|
// reserve(string), 69 ether: 0x20, 3, "abc" ->
|
||
|
// gas irOptimized: 45527
|
||
|
// gas legacy: 46242
|
||
|
// gas legacyOptimized: 45491
|
||
|
// owner(string): 0x20, 3, "abc" -> 0x1212121212121212121212121212120000000012
|
||
|
// reserve(string), 70 ether: 0x20, 3, "def" ->
|
||
|
// owner(string): 0x20, 3, "def" -> 0x1212121212121212121212121212120000000012
|
||
|
// reserve(string), 68 ether: 0x20, 3, "ghi" ->
|
||
|
// owner(string): 0x20, 3, "ghi" -> 0
|
||
|
// account: 1 -> 0x1212121212121212121212121212120000001012
|
||
|
// reserve(string), 69 ether: 0x20, 3, "abc" ->
|
||
|
// owner(string): 0x20, 3, "abc" -> 0x1212121212121212121212121212120000000012
|
||
|
// account: 0 -> 0x1212121212121212121212121212120000000012
|
||
|
// setContent(string,bytes32): 0x40, 0, 3, "abc" ->
|
||
|
// transfer(string,address): 0x40, 555, 3, "abc" ->
|
||
|
// owner(string): 0x20, 3, "abc" -> 555
|
||
|
// content(string): 0x20, 3, "abc" -> 0x00
|
||
|
// setContent(string,bytes32): 0x40, 333, 3, "def" ->
|
||
|
// setAddr(string,address): 0x40, 124, 3, "def" ->
|
||
|
// setSubRegistrar(string,address): 0x40, 125, 3, "def" ->
|
||
|
// content(string): 0x20, 3, "def" -> 333
|
||
|
// addr(string): 0x20, 3, "def" -> 124
|
||
|
// subRegistrar(string): 0x20, 3, "def" -> 125
|
||
|
// balance: 0x124 -> 0
|
||
|
// disown(string,address): 0x40, 0x124, 3, "def" ->
|
||
|
// balance: 0x124 -> 0
|
||
|
// owner(string): 0x20, 3, "def" -> 0
|
||
|
// content(string): 0x20, 3, "def" -> 0
|
||
|
// addr(string): 0x20, 3, "def" -> 0
|
||
|
// subRegistrar(string): 0x20, 3, "def" -> 0
|