1090 lines
60 KiB
JavaScript
1090 lines
60 KiB
JavaScript
|
|
|
|
const utils = require('../utils/testUtils.js');
|
|
const web3Utils = require('web3-utils');
|
|
const namehash = require('eth-ens-namehash');
|
|
const { MerkleTree } = require('../utils/merkleTree.js');
|
|
const { ReservedUsernames } = require('../config/ens-usernames/reservedNames')
|
|
|
|
const registry = {
|
|
name: 'stateofus',
|
|
registry: 'stateofus.eth',
|
|
label: web3Utils.sha3('stateofus'),
|
|
namehash: namehash.hash('stateofus.eth'),
|
|
price: 1000
|
|
}
|
|
|
|
const dummyRegistry = {
|
|
name: 'dummyreg',
|
|
registry: 'dummyreg.eth',
|
|
label: web3Utils.sha3('dummyreg'),
|
|
namehash: namehash.hash('dummyreg.eth'),
|
|
price: 1000
|
|
}
|
|
|
|
|
|
const dummy2Registry = {
|
|
name: 'dummy2reg',
|
|
registry: 'dummy2reg.eth',
|
|
label: web3Utils.sha3('dummy2reg'),
|
|
namehash: namehash.hash('dummy2reg.eth'),
|
|
price: 1000
|
|
}
|
|
|
|
// TODO: load file of reserved names and balance array lenght to be even
|
|
|
|
const merkleTree = new MerkleTree(ReservedUsernames);
|
|
const merkleRoot = merkleTree.getHexRoot();
|
|
let accountsArr;
|
|
config(
|
|
{
|
|
contracts: {
|
|
deploy: {
|
|
"TestToken": {},
|
|
"ENSRegistry": {
|
|
"onDeploy": [
|
|
"await ENSRegistry.methods.setSubnodeOwner('0x0000000000000000000000000000000000000000000000000000000000000000', '0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0', web3.eth.defaultAccount).send()"
|
|
]
|
|
},
|
|
"PublicResolver": {
|
|
"args": [
|
|
"$ENSRegistry"
|
|
]
|
|
},
|
|
"UsernameRegistrar": {
|
|
"args": [
|
|
"$TestToken",
|
|
"$ENSRegistry",
|
|
"$PublicResolver",
|
|
registry.namehash,
|
|
"3",
|
|
merkleRoot,
|
|
"0x0000000000000000000000000000000000000000",
|
|
31536000
|
|
],
|
|
"onDeploy": [
|
|
"await ENSRegistry.methods.setSubnodeOwner('0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae', '" + registry.label + "', UsernameRegistrar.address).send()",
|
|
]
|
|
},
|
|
"UpdatedUsernameRegistrar": {
|
|
"args": [
|
|
"$TestToken",
|
|
"$ENSRegistry",
|
|
"$PublicResolver",
|
|
registry.namehash,
|
|
"3",
|
|
merkleRoot,
|
|
"$UsernameRegistrar",
|
|
31536000
|
|
]
|
|
},
|
|
"DummyUsernameRegistrar": {
|
|
"args": [
|
|
"$TestToken",
|
|
"$ENSRegistry",
|
|
"$PublicResolver",
|
|
dummyRegistry.namehash,
|
|
"3",
|
|
merkleRoot,
|
|
"0x0000000000000000000000000000000000000000",
|
|
31536000
|
|
],
|
|
"onDeploy": [
|
|
"await ENSRegistry.methods.setSubnodeOwner('0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae', '" + dummyRegistry.label + "', DummyUsernameRegistrar.address).send()",
|
|
]
|
|
},
|
|
"UpdatedDummyUsernameRegistrar": {
|
|
"args": [
|
|
"$TestToken",
|
|
"$ENSRegistry",
|
|
"$PublicResolver",
|
|
dummyRegistry.namehash,
|
|
"3",
|
|
merkleRoot,
|
|
"$DummyUsernameRegistrar",
|
|
31536000
|
|
]
|
|
},
|
|
"Dummy2UsernameRegistrar": {
|
|
"args": [
|
|
"$TestToken",
|
|
"$ENSRegistry",
|
|
"$PublicResolver",
|
|
dummy2Registry.namehash,
|
|
"3",
|
|
utils.zeroBytes32,
|
|
"0x0000000000000000000000000000000000000000",
|
|
31536000
|
|
],
|
|
"onDeploy": [
|
|
"await ENSRegistry.methods.setSubnodeOwner('0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae', '" + dummy2Registry.label + "', Dummy2UsernameRegistrar.address).send()",
|
|
"await Dummy2UsernameRegistrar.methods.activate(" + dummy2Registry.price + ").send()"
|
|
]
|
|
},
|
|
"UpdatedDummy2UsernameRegistrar": {
|
|
"args": [
|
|
"$TestToken",
|
|
"$ENSRegistry",
|
|
"$PublicResolver",
|
|
dummy2Registry.namehash,
|
|
"3",
|
|
merkleRoot,
|
|
"$Dummy2UsernameRegistrar",
|
|
31536000
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}, (_err, web3_accounts) => {
|
|
accountsArr = web3_accounts
|
|
}
|
|
);
|
|
|
|
const TestToken = artifacts.require('TestToken');
|
|
const ENSRegistry = artifacts.require('ENSRegistry');
|
|
const PublicResolver = artifacts.require('PublicResolver');
|
|
const UsernameRegistrar = artifacts.require('UsernameRegistrar');
|
|
const UpdatedUsernameRegistrar = artifacts.require('UpdatedUsernameRegistrar');
|
|
const DummyUsernameRegistrar = artifacts.require('DummyUsernameRegistrar');
|
|
const UpdatedDummyUsernameRegistrar = artifacts.require('UpdatedDummyUsernameRegistrar');
|
|
const Dummy2UsernameRegistrar = artifacts.require('Dummy2UsernameRegistrar');
|
|
const UpdatedDummy2UsernameRegistrar = artifacts.require('UpdatedDummy2UsernameRegistrar');
|
|
|
|
contract('UsernameRegistrar', function () {
|
|
|
|
describe('activate(uint256)', function () {
|
|
it('should activate registry', async () => {
|
|
await utils.increaseTime(1 * utils.timeUnits.days) //time cannot start zero
|
|
await utils.increaseTime(1000)
|
|
const initialPrice = 100
|
|
const resultSetRegistryPrice = await UsernameRegistrar.methods.activate(initialPrice).send({ from: accountsArr[0] });
|
|
assert.equal(+resultSetRegistryPrice.events.RegistryPrice.returnValues.price, initialPrice, "event RegistryPrice wrong price");
|
|
assert.equal(+await UsernameRegistrar.methods.state().call(), 1, "Wrong registry state")
|
|
assert.equal(+await UsernameRegistrar.methods.price().call(), initialPrice, "Wrong registry price")
|
|
});
|
|
});
|
|
|
|
describe('updateRegistryPrice(uint256)', function () {
|
|
it('should change registry price', async () => {
|
|
const newPrice = registry.price;
|
|
const resultUpdateRegistryPrice = await UsernameRegistrar.methods.updateRegistryPrice(newPrice).send({ from: accountsArr[0] });
|
|
assert.equal(+resultUpdateRegistryPrice.events.RegistryPrice.returnValues.price, registry.price, "event RegistryPrice wrong price");
|
|
assert.equal(+await UsernameRegistrar.methods.state().call(), 1, "Wrong registry state")
|
|
assert.equal(+await UsernameRegistrar.methods.price().call(), newPrice, "Wrong registry price")
|
|
});
|
|
});
|
|
|
|
describe('register(bytes32,address,bytes32,bytes32)', function () {
|
|
it('should register username', async () => {
|
|
const registrant = accountsArr[5];
|
|
const username = 'erin';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const label = web3Utils.sha3(username);
|
|
const registryPrice = +await UsernameRegistrar.methods.getPrice().call()
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
const initialRegistrantBalance = +await TestToken.methods.balanceOf(registrant).call();
|
|
const initialRegistryBalance = +await TestToken.methods.balanceOf(UsernameRegistrar.address).call();
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
const resultRegister = await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
assert.equal(resultRegister.events['0'].raw.topics[0], web3Utils.sha3("Transfer(address,address,uint256)"), "Wrong Event");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[1]), registrant, "Wrong Transfer from");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[2]), UsernameRegistrar.address, "Wrong transfer to");
|
|
assert.equal(+resultRegister.events['0'].raw.data, registry.price, "Wrong transfer value");
|
|
assert.equal(resultRegister.events['1'].raw.topics[0], web3Utils.sha3("NewOwner(bytes32,bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['1'].raw.topics[1], registry.namehash, "Wrong Node");
|
|
assert.equal(resultRegister.events['1'].raw.topics[2], label, "Wrong Label");
|
|
assert.equal(utils.eventAddress(resultRegister.events['1'].raw.data), registrant, "Wrong subnode owner");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.owner, registrant, "event UsernameOwner owner mismatch");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.nameHash, usernameHash, "event UsernameOwner usernameHash mismatch");
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), utils.zeroAddress, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registryPrice, "Registry username account balance wrong");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(+await TestToken.methods.balanceOf(registrant).call(), +initialRegistrantBalance - registryPrice, "User final balance wrong")
|
|
assert.equal(+await TestToken.methods.balanceOf(UsernameRegistrar.address).call(), (+initialRegistryBalance) + (+registry.price), "Registry final balance wrong")
|
|
});
|
|
it('should register username only resolveing address ', async () => {
|
|
const registrant = accountsArr[2];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
const username = 'bob';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const label = web3Utils.sha3(username);
|
|
const resultRegister = await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
|
|
registrant,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
assert.equal(resultRegister.events['0'].raw.topics[0], web3Utils.sha3("Transfer(address,address,uint256)"), "Wrong Event");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[1]), registrant, "Wrong Transfer from");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[2]), UsernameRegistrar.address, "Wrong transfer to");
|
|
assert.equal(+resultRegister.events['0'].raw.data, registry.price, "Wrong transfer value");
|
|
assert.equal(resultRegister.events['1'].raw.topics[0], web3Utils.sha3("NewOwner(bytes32,bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['1'].raw.topics[1], registry.namehash, "Wrong Node");
|
|
assert.equal(resultRegister.events['1'].raw.topics[2], label, "Wrong Label");
|
|
assert.equal(utils.eventAddress(resultRegister.events['1'].raw.data), UsernameRegistrar.address, "Wrong subnode owner");
|
|
assert.equal(resultRegister.events['2'].raw.topics[0], web3Utils.sha3("NewResolver(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['2'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['2'].raw.data), PublicResolver.address, "Wrong Resolver");
|
|
assert.equal(resultRegister.events['3'].raw.topics[0], web3Utils.sha3("AddrChanged(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['3'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['3'].raw.data), registrant, "Wrong address to resolve");
|
|
assert.equal(resultRegister.events['4'].raw.topics[0], web3Utils.sha3("Transfer(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['4'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['4'].raw.data), registrant, "Wrong registry.namehash owner");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.owner, registrant, "event UsernameOwner owner mismatch");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.nameHash, usernameHash, "event UsernameOwner usernameHash mismatch");
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registry.price, "Wrong account balance");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
const resolverPubKey = await PublicResolver.methods.pubkey(usernameHash).call();
|
|
assert.equal(resolverPubKey[0], utils.zeroBytes32, "Unexpected resolved pubkey[0]");
|
|
assert.equal(resolverPubKey[1], utils.zeroBytes32, "Unexpected resolved pubkey[1]");
|
|
});
|
|
it('should register username with only status contact', async () => {
|
|
const username = 'carlos';
|
|
const registrant = accountsArr[3];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const contactCode = '0x04dbb31252d9bddb4e4d362c7b9c80cba74732280737af97971f42ccbdc716f3f3efb1db366880e52d09b1bfd59842e833f3004088892b7d14b9ce9e957cea9a82';
|
|
const points = utils.generateXY(contactCode);
|
|
const label = web3Utils.sha3(username);
|
|
const resultRegister = await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
points.x,
|
|
points.y
|
|
).send({ from: registrant });
|
|
assert.equal(resultRegister.events['0'].raw.topics[0], web3Utils.sha3("Transfer(address,address,uint256)"), "Wrong Event");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[1]), registrant, "Wrong Transfer from");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[2]), UsernameRegistrar.address, "Wrong transfer to");
|
|
assert.equal(+resultRegister.events['0'].raw.data, registry.price, "Wrong transfer value");
|
|
assert.equal(resultRegister.events['1'].raw.topics[0], web3Utils.sha3("NewOwner(bytes32,bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['1'].raw.topics[1], registry.namehash, "Wrong Node");
|
|
assert.equal(resultRegister.events['1'].raw.topics[2], label, "Wrong Label");
|
|
assert.equal(utils.eventAddress(resultRegister.events['1'].raw.data), UsernameRegistrar.address, "Wrong subnode owner");
|
|
assert.equal(resultRegister.events['2'].raw.topics[0], web3Utils.sha3("NewResolver(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['2'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['2'].raw.data), PublicResolver.address, "Wrong Resolver");
|
|
assert.equal(resultRegister.events['3'].raw.topics[0], web3Utils.sha3("PubkeyChanged(bytes32,bytes32,bytes32)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['3'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(resultRegister.events['3'].raw.data, points.x.concat(points.y.substr(2)))
|
|
assert.equal(resultRegister.events['4'].raw.topics[0], web3Utils.sha3("Transfer(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['4'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['4'].raw.data), registrant, "Wrong registry.namehash owner");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.owner, registrant, "event UsernameOwner owner mismatch");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.nameHash, usernameHash, "event UsernameOwner usernameHash mismatch");
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registry.price, "Wrong account balance");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), utils.zeroAddress, "Resolved address not set");
|
|
const resolverPubKey = await PublicResolver.methods.pubkey(usernameHash).call();
|
|
const pubKey = utils.keyFromXY(resolverPubKey[0], resolverPubKey[1]);
|
|
assert.equal(pubKey, contactCode, "pubKey does not match contract code");
|
|
});
|
|
it('should register username with status contact code and address', async () => {
|
|
const registrant = accountsArr[2];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
const username = 'bob2';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const contactCode = '0x04dbb31252d9bddb4e4d362c7b9c80cba74732280737af97971f42ccbdc716f3f3efb1db366880e52d09b1bfd59842e833f3004088892b7d14b9ce9e957cea9a82';
|
|
const points = utils.generateXY(contactCode);
|
|
const label = web3Utils.sha3(username);
|
|
const resultRegister = await UsernameRegistrar.methods.register(
|
|
label,
|
|
registrant,
|
|
points.x,
|
|
points.y
|
|
).send({ from: registrant });
|
|
assert.equal(resultRegister.events['0'].raw.topics[0], web3Utils.sha3("Transfer(address,address,uint256)"), "Wrong Event");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[1]), registrant, "Wrong Transfer from");
|
|
assert.equal(utils.eventAddress(resultRegister.events['0'].raw.topics[2]), UsernameRegistrar.address, "Wrong transfer to");
|
|
assert.equal(+resultRegister.events['0'].raw.data, registry.price, "Wrong transfer value");
|
|
assert.equal(resultRegister.events['1'].raw.topics[0], web3Utils.sha3("NewOwner(bytes32,bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['1'].raw.topics[1], registry.namehash, "Wrong Node");
|
|
assert.equal(resultRegister.events['1'].raw.topics[2], label, "Wrong Label");
|
|
assert.equal(utils.eventAddress(resultRegister.events['1'].raw.data), UsernameRegistrar.address, "Wrong subnode owner");
|
|
assert.equal(resultRegister.events['2'].raw.topics[0], web3Utils.sha3("NewResolver(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['2'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['2'].raw.data), await UsernameRegistrar.methods.resolver().call(), "Wrong Resolver");
|
|
assert.equal(resultRegister.events['3'].raw.topics[0], web3Utils.sha3("AddrChanged(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['3'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['3'].raw.data), registrant, "Wrong address to resolve");
|
|
assert.equal(resultRegister.events['4'].raw.topics[0], web3Utils.sha3("PubkeyChanged(bytes32,bytes32,bytes32)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['4'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(resultRegister.events['4'].raw.data, points.x.concat(points.y.substr(2)))
|
|
assert.equal(resultRegister.events['5'].raw.topics[0], web3Utils.sha3("Transfer(bytes32,address)"), "Wrong Event");
|
|
assert.equal(resultRegister.events['5'].raw.topics[1], usernameHash, "Wrong Username");
|
|
assert.equal(utils.eventAddress(resultRegister.events['5'].raw.data), registrant, "Wrong registry.namehash owner");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.owner, registrant, "event UsernameOwner owner mismatch");
|
|
assert.equal(resultRegister.events.UsernameOwner.returnValues.nameHash, usernameHash, "event UsernameOwner usernameHash mismatch");
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registry.price, "Wrong account balance");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
const resolverPubKey = await PublicResolver.methods.pubkey(usernameHash).call();
|
|
const pubKey = utils.keyFromXY(resolverPubKey[0], resolverPubKey[1]);
|
|
assert.equal(pubKey, contactCode, "pubKey does not match contract code");
|
|
});
|
|
});
|
|
|
|
describe('receiveApproval(address,uint256,address,bytes)', function () {
|
|
it('should register username', async () => {
|
|
const registrant = accountsArr[5];
|
|
const username = 'erinauto';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const label = web3Utils.sha3(username);
|
|
const registryPrice = +await UsernameRegistrar.methods.getPrice().call()
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
const initialRegistrantBalance = +await TestToken.methods.balanceOf(registrant).call();
|
|
const initialRegistryBalance = +await TestToken.methods.balanceOf(UsernameRegistrar.address).call();
|
|
|
|
const registerCall = UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).encodeABI();
|
|
const approveAndCallResult = await TestToken.methods.approveAndCall(UsernameRegistrar.address, registry.price, registerCall).send({ from: registrant });
|
|
// TODO: check events
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), utils.zeroAddress, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registryPrice, "Registry username account balance wrong");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(+await TestToken.methods.balanceOf(registrant).call(), +initialRegistrantBalance - registryPrice, "User final balance wrong")
|
|
assert.equal(+await TestToken.methods.balanceOf(UsernameRegistrar.address).call(), (+initialRegistryBalance) + (+registry.price), "Registry final balance wrong")
|
|
});
|
|
it('should register username only resolving address ', async () => {
|
|
const registrant = accountsArr[2];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
const username = 'bobauto';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const label = web3Utils.sha3(username);
|
|
const registerCall = UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
|
|
registrant,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).encodeABI();
|
|
|
|
const approveAndCallResult = await TestToken.methods.approveAndCall(UsernameRegistrar.address, registry.price, registerCall).send({ from: registrant });
|
|
// TODO: check events
|
|
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registry.price, "Wrong account balance");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
const resolverPubKey = await PublicResolver.methods.pubkey(usernameHash).call();
|
|
assert.equal(resolverPubKey[0], utils.zeroBytes32, "Unexpected resolved pubkey[0]");
|
|
assert.equal(resolverPubKey[1], utils.zeroBytes32, "Unexpected resolved pubkey[1]");
|
|
});
|
|
|
|
it('should register username with only status contact', async () => {
|
|
const username = 'carlosauto';
|
|
const registrant = accountsArr[3];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const contactCode = '0x04dbb31252d9bddb4e4d362c7b9c80cba74732280737af97971f42ccbdc716f3f3efb1db366880e52d09b1bfd59842e833f3004088892b7d14b9ce9e957cea9a82';
|
|
const points = utils.generateXY(contactCode);
|
|
const label = web3Utils.sha3(username);
|
|
const registerCall = UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
points.x,
|
|
points.y
|
|
).encodeABI();
|
|
|
|
const approveAndCallResult = await TestToken.methods.approveAndCall(UsernameRegistrar.address, registry.price, registerCall).send({ from: registrant });
|
|
// TODO: check events
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registry.price, "Wrong account balance");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), utils.zeroAddress, "Resolved address not set");
|
|
const resolverPubKey = await PublicResolver.methods.pubkey(usernameHash).call();
|
|
const pubKey = utils.keyFromXY(resolverPubKey[0], resolverPubKey[1]);
|
|
assert.equal(pubKey, contactCode, "pubKey does not match contract code");
|
|
});
|
|
it('should register username with status contact code and address', async () => {
|
|
const registrant = accountsArr[2];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
const username = 'bob2auto';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const contactCode = '0x04dbb31252d9bddb4e4d362c7b9c80cba74732280737af97971f42ccbdc716f3f3efb1db366880e52d09b1bfd59842e833f3004088892b7d14b9ce9e957cea9a82';
|
|
const points = utils.generateXY(contactCode);
|
|
const label = web3Utils.sha3(username);
|
|
const registerCall = UsernameRegistrar.methods.register(
|
|
label,
|
|
registrant,
|
|
points.x,
|
|
points.y
|
|
).encodeABI();
|
|
|
|
const approveAndCallResult = await TestToken.methods.approveAndCall(UsernameRegistrar.address, registry.price, registerCall).send({ from: registrant });
|
|
// TODO: check events
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), registry.price, "Wrong account balance");
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), registrant, "Account owner mismatch");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
const resolverPubKey = await PublicResolver.methods.pubkey(usernameHash).call();
|
|
const pubKey = utils.keyFromXY(resolverPubKey[0], resolverPubKey[1]);
|
|
assert.equal(pubKey, contactCode, "pubKey does not match contract code");
|
|
});
|
|
});
|
|
|
|
describe('release(bytes32)', function () {
|
|
it('should not release username due delay', async () => {
|
|
let registrant = accountsArr[6];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
let username = 'mistaker';
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.release(
|
|
web3Utils.sha3(username),
|
|
).send({ from: registrant });
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Released after delay period");
|
|
});
|
|
it('should release username', async () => {
|
|
;
|
|
const registrant = accountsArr[6];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
const username = 'frank';
|
|
const label = web3Utils.sha3(username);
|
|
await UsernameRegistrar.methods.register(
|
|
label,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
const releaseDelay = +await UsernameRegistrar.methods.releaseDelay().call();
|
|
await utils.increaseTime(releaseDelay)
|
|
await utils.increaseTime(1000)
|
|
const initialAccountBalance = +await UsernameRegistrar.methods.getAccountBalance(label).call();
|
|
const initialRegistrantBalance = +await TestToken.methods.balanceOf(registrant).call();
|
|
const initialRegistryBalance = +await TestToken.methods.balanceOf(UsernameRegistrar.address).call();
|
|
await utils.increaseTime(1000)
|
|
const resultRelease = await UsernameRegistrar.methods.release(
|
|
web3Utils.sha3(username),
|
|
|
|
).send({ from: registrant });
|
|
//TODO: check events
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), 0, "Final balance didnt zeroed");
|
|
assert.equal(+await TestToken.methods.balanceOf(registrant).call(), (+initialRegistrantBalance) + (+initialAccountBalance), "Releaser token balance didnt increase")
|
|
assert.equal(+await TestToken.methods.balanceOf(UsernameRegistrar.address).call(), (+initialRegistryBalance) - (+initialAccountBalance), "Registry token balance didnt decrease")
|
|
});
|
|
it('should release transfered username', async () => {
|
|
let registrant = accountsArr[7];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
let username = 'grace';
|
|
let usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
let label = web3Utils.sha3(username);
|
|
let newOwner = accountsArr[8];
|
|
await UsernameRegistrar.methods.register(
|
|
label,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await ENSRegistry.methods.setOwner(usernameHash, newOwner).send({ from: registrant });
|
|
let releaseDelay = +await UsernameRegistrar.methods.releaseDelay().call();
|
|
await utils.increaseTime(releaseDelay)
|
|
await utils.increaseTime(1000)
|
|
let initialAccountBalance = +await UsernameRegistrar.methods.getAccountBalance(label).call();
|
|
let initialRegistrantBalance = +await TestToken.methods.balanceOf(newOwner).call();
|
|
let initialRegistryBalance = +await TestToken.methods.balanceOf(UsernameRegistrar.address).call();
|
|
await utils.increaseTime(1000)
|
|
let resultRelease = await UsernameRegistrar.methods.release(
|
|
label
|
|
).send({ from: newOwner });
|
|
//TODO: check events
|
|
assert.equal(+await UsernameRegistrar.methods.getAccountBalance(label).call(), 0, "Final balance didnt zeroed");
|
|
assert.equal(+await TestToken.methods.balanceOf(newOwner).call(), (+initialRegistrantBalance) + (+initialAccountBalance), "New owner token balance didnt increase")
|
|
assert.equal(+await TestToken.methods.balanceOf(UsernameRegistrar.address).call(), (+initialRegistryBalance) - (+initialAccountBalance), "Registry token balance didnt decrease")
|
|
});
|
|
it('should release moved username account balance by owner', async () => {
|
|
const registrant = accountsArr[5];
|
|
await TestToken.methods.mint(dummyRegistry.price).send({ from: registrant });
|
|
await DummyUsernameRegistrar.methods.activate(dummyRegistry.price).send({ from: accountsArr[0] });
|
|
await TestToken.methods.approve(DummyUsernameRegistrar.address, dummyRegistry.price).send({ from: registrant });
|
|
|
|
const username = 'hardhead';
|
|
const label = web3Utils.sha3(username);
|
|
const usernameHash = namehash.hash(username + '.' + dummyRegistry.registry);
|
|
await DummyUsernameRegistrar.methods.register(
|
|
label,
|
|
registrant,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
let initialAccountBalance = +await DummyUsernameRegistrar.methods.getAccountBalance(label).call();
|
|
const initialRegistrantBalance = +await TestToken.methods.balanceOf(registrant).call();
|
|
const initialRegistryBalance = +await TestToken.methods.balanceOf(DummyUsernameRegistrar.address).call();
|
|
await DummyUsernameRegistrar.methods.moveRegistry(UpdatedDummyUsernameRegistrar.address).send();
|
|
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
|
|
const resultRelease = await DummyUsernameRegistrar.methods.release(
|
|
label
|
|
).send({ from: registrant });
|
|
//TODO: verify events
|
|
assert.equal(+await TestToken.methods.balanceOf(registrant).call(), (+initialRegistrantBalance) + (+initialAccountBalance), "New owner token balance didnt increase")
|
|
assert.equal(+await TestToken.methods.balanceOf(DummyUsernameRegistrar.address).call(), (+initialRegistryBalance) - (+initialAccountBalance), "Registry token balance didnt decrease")
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), utils.zeroAddress, "Resolver not undefined");
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress, "Owner not removed");
|
|
//We are not cleaning PublicResolver or any resolver, so the value should remain the same.
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
});
|
|
});
|
|
|
|
describe('updateAccountOwner(bytes32)', function () {
|
|
it('should update username account owner', async () => {
|
|
let username = 'heidi';
|
|
let label = web3Utils.sha3(username);
|
|
let registrant = accountsArr[8];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
let newOwner = accountsArr[9];
|
|
let usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
|
|
await UsernameRegistrar.methods.register(
|
|
label,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await ENSRegistry.methods.setOwner(usernameHash, newOwner).send({ from: registrant });
|
|
let resultUpdateOwner = await UsernameRegistrar.methods.updateAccountOwner(
|
|
label
|
|
).send({ from: newOwner });
|
|
//TODO: check events
|
|
assert.equal(await UsernameRegistrar.methods.getAccountOwner(label).call(), newOwner, "Backup owner not updated");
|
|
});
|
|
});
|
|
|
|
describe('slashInvalidUsername(string,uint256,uint256)', function () {
|
|
it('should slash invalid username', async () => {
|
|
let username = 'alicé';
|
|
let label = web3Utils.sha3(username);
|
|
let usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
let registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
assert.notEqual(+await UsernameRegistrar.methods.getCreationTime(label).call(), 0);
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
await UsernameRegistrar.methods.slashInvalidUsername(username, 4, reserveSecret).send()
|
|
//TODO: check events
|
|
assert.equal(+await UsernameRegistrar.methods.getCreationTime(label).call(), 0);
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress);
|
|
});
|
|
it('should not slash valid username', async () => {
|
|
const username = 'legituser';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.slashInvalidUsername(username, 4, reserveSecret).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
});
|
|
});
|
|
|
|
describe('slashReservedUsername(string,bytes32[],uint256)', function () {
|
|
it('should not slash not reserved name username', async () => {
|
|
const username = 'somedummyname123';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.slashReservedUsername(username, merkleTree.getHexProof(ReservedUsernames[0]), reserveSecret).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
});
|
|
it('should not slash reserved name username with wrong proof ', async () => {
|
|
const username = ReservedUsernames[5];
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.slashReservedUsername(username, merkleTree.getHexProof(ReservedUsernames[1]), reserveSecret).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
});
|
|
it('should slash reserved name username', async () => {
|
|
const username = ReservedUsernames[7];
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
result = await UsernameRegistrar.methods.slashReservedUsername(username, merkleTree.getHexProof(username), reserveSecret).send()
|
|
//TODO: check events
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress);
|
|
});
|
|
});
|
|
|
|
describe('slashSmallUsername(string,uint256)', function () {
|
|
it('should not slash big username', async () => {
|
|
let username = '1234567890';
|
|
let usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
let registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(1000)
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.slashSmallUsername(username).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
})
|
|
it('should slash small username', async () => {
|
|
let username = 'a';
|
|
let usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
let registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(web3Utils.sha3(username)).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
result = await UsernameRegistrar.methods.slashSmallUsername(username, reserveSecret).send()
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress);
|
|
});
|
|
});
|
|
|
|
describe('slashAddressLikeUsername(string,uint256)', function () {
|
|
it('should slash username that starts with 0x and is 12 of lenght or bigger', async () => {
|
|
let username = '0xc6b95bd26123';
|
|
const userlabelHash = web3Utils.soliditySha3({ value: username, type: "string" });
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
let registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
userlabelHash,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(1000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(userlabelHash).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
result = await UsernameRegistrar.methods.slashAddressLikeUsername(username, reserveSecret).send()
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress);
|
|
});
|
|
it('should not slash username that starts with 0x but is smaller then 12', async () => {
|
|
let username = "0xc6b95bd26";
|
|
const userlabelHash = web3Utils.soliditySha3({ value: username, type: "string" });
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
let registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
userlabelHash,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(userlabelHash).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
result = await UsernameRegistrar.methods.slashAddressLikeUsername(username, reserveSecret).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
});
|
|
it('should not slash username that dont starts 0x and is bigger than 12', async () => {
|
|
const username = "0a002322c6b95bd26";
|
|
const userlabelHash = web3Utils.soliditySha3({ value: username, type: "string" });
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
userlabelHash,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(userlabelHash).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.slashAddressLikeUsername(username, reserveSecret).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
});
|
|
it('should not slash username that starts with 0x but dont use hex chars', async () => {
|
|
const username = "0xprotocolstatus";
|
|
const userlabelHash = web3Utils.soliditySha3({ value: username, type: "string" });
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
userlabelHash,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(userlabelHash).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send();
|
|
let failed;
|
|
try {
|
|
await UsernameRegistrar.methods.slashAddressLikeUsername(username, reserveSecret).send()
|
|
failed = false;
|
|
} catch (e) {
|
|
failed = true;
|
|
}
|
|
assert(failed, "Was slashed anyway");
|
|
});
|
|
});
|
|
describe('slashUsername(bytes,uint256)', function () {
|
|
it('should slash a username and get funds from registrant', async () => {
|
|
const username = 'b';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
const slasher = accountsArr[2];
|
|
const label = web3Utils.sha3(username);
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
label,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
const partReward = await UsernameRegistrar.methods.getSlashRewardPart(label).call();
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const initialSlasherBalance = +await TestToken.methods.balanceOf(slasher).call();
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(label).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send({ from: slasher });
|
|
await UsernameRegistrar.methods.slashSmallUsername(username, reserveSecret).send({ from: slasher })
|
|
//TODO: check events
|
|
assert.equal(+await TestToken.methods.balanceOf(slasher).call(), (+initialSlasherBalance) + ((+partReward) * 2));
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress);
|
|
});
|
|
|
|
it('should slash a username of a not migrated subnode that became unallowed', async () => {
|
|
const registrant = accountsArr[5];
|
|
const notRegistrant = accountsArr[6];
|
|
|
|
await TestToken.methods.mint(dummy2Registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(Dummy2UsernameRegistrar.address, dummy2Registry.price).send({ from: registrant });
|
|
|
|
const username = ReservedUsernames[10];
|
|
const label = web3Utils.sha3(username);
|
|
const usernameHash = namehash.hash(username + '.' + dummy2Registry.registry);
|
|
await Dummy2UsernameRegistrar.methods.register(
|
|
label,
|
|
registrant,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
let initialAccountBalance = await Dummy2UsernameRegistrar.methods.getAccountBalance(label).call();
|
|
const initialRegistrantBalance = +await TestToken.methods.balanceOf(registrant).call();
|
|
const initialRegistryBalance = +await TestToken.methods.balanceOf(Dummy2UsernameRegistrar.address).call();
|
|
|
|
|
|
await Dummy2UsernameRegistrar.methods.moveRegistry(UpdatedDummy2UsernameRegistrar.address).send();
|
|
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant, "ENSRegistry owner mismatch");
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), PublicResolver.address, "Resolver wrongly defined");
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(label).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send({ from: notRegistrant });
|
|
const resultRelease = await UpdatedDummy2UsernameRegistrar.methods.slashReservedUsername(
|
|
username,
|
|
merkleTree.getHexProof(username),
|
|
reserveSecret
|
|
).send({ from: notRegistrant });
|
|
//TODO: verify events
|
|
|
|
assert.equal(await ENSRegistry.methods.resolver(usernameHash).call(), utils.zeroAddress, "Resolver not undefined");
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress, "Owner not removed");
|
|
//We are not cleaning PublicResolver or any resolver, so the value should remain the same.
|
|
assert.equal(await PublicResolver.methods.addr(usernameHash).call(), registrant, "Resolved address not set");
|
|
});
|
|
});
|
|
|
|
describe('reserveSlash(bytes32)', function () {
|
|
it('should send 2/3 funds to reserver', async () => {
|
|
const username = 'c';
|
|
const label = web3Utils.sha3(username);
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const registrant = accountsArr[1];
|
|
const slashReserverCaller = accountsArr[2];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
await UsernameRegistrar.methods.register(
|
|
web3Utils.sha3(username),
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
await utils.increaseTime(20000)
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const partReward = await UsernameRegistrar.methods.getSlashRewardPart(label).call();
|
|
const initialSlashReserverBalance = +await TestToken.methods.balanceOf(slashReserverCaller).call();
|
|
const creationTime = await UsernameRegistrar.methods.getCreationTime(label).call();
|
|
const reserveSecret = 1337;
|
|
const secret = web3Utils.soliditySha3(usernameHash, creationTime, reserveSecret);
|
|
await UsernameRegistrar.methods.reserveSlash(secret).send({ from: slashReserverCaller });
|
|
await UsernameRegistrar.methods.slashSmallUsername(username, reserveSecret).send({ from: slashReserverCaller })
|
|
//TODO: check events
|
|
assert.equal(+await TestToken.methods.balanceOf(slashReserverCaller).call(), (+initialSlashReserverBalance) + (+partReward * 2));
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), utils.zeroAddress);
|
|
});
|
|
});
|
|
|
|
describe('eraseNode(bytes32[])', function () {
|
|
it('should clear unowned subdomains of users', async () => {
|
|
;
|
|
const registrant = accountsArr[6];
|
|
const anyone = accountsArr[5];
|
|
await TestToken.methods.mint(registry.price).send({ from: registrant });
|
|
await TestToken.methods.approve(UsernameRegistrar.address, registry.price).send({ from: registrant });
|
|
const username = "root";
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const label = web3Utils.sha3(username);
|
|
const labels = [
|
|
web3Utils.sha3("10"),
|
|
web3Utils.sha3("9"),
|
|
web3Utils.sha3("8"),
|
|
web3Utils.sha3("7"),
|
|
web3Utils.sha3("6"),
|
|
web3Utils.sha3("5"),
|
|
web3Utils.sha3("4"),
|
|
web3Utils.sha3("3"),
|
|
web3Utils.sha3("2"),
|
|
web3Utils.sha3("1"),
|
|
web3Utils.sha3("0"),
|
|
web3Utils.sha3(username),
|
|
];
|
|
await UsernameRegistrar.methods.register(
|
|
label,
|
|
utils.zeroAddress,
|
|
utils.zeroBytes32,
|
|
utils.zeroBytes32
|
|
).send({ from: registrant });
|
|
assert.equal(await ENSRegistry.methods.owner(usernameHash).call(), registrant);
|
|
const releaseDelay = +await UsernameRegistrar.methods.releaseDelay().call();
|
|
await utils.increaseTime(releaseDelay)
|
|
await utils.increaseTime(1000)
|
|
await utils.increaseTime(1000)
|
|
let subnode = usernameHash;
|
|
for (let index = labels.length - 1; index > 0; index--) {
|
|
const label = labels[index - 1];
|
|
await ENSRegistry.methods.setSubnodeOwner(subnode, label, registrant).send({ from: registrant });
|
|
subnode = web3Utils.soliditySha3(subnode, label);
|
|
assert.equal(await ENSRegistry.methods.owner(subnode).call(), registrant);
|
|
|
|
}
|
|
|
|
const resultRelease = await UsernameRegistrar.methods.release(web3Utils.sha3(username)).send({ from: registrant });
|
|
|
|
subnode = usernameHash;
|
|
for (let index = labels.length - 1; index > 0; index--) {
|
|
const label = labels[index - 1];
|
|
subnode = web3Utils.soliditySha3(subnode, label);
|
|
assert.equal(await ENSRegistry.methods.owner(subnode).call(), registrant);
|
|
}
|
|
|
|
const resultErase = await UsernameRegistrar.methods.eraseNode(
|
|
labels
|
|
).send({ from: anyone });
|
|
//TODO: check events
|
|
|
|
subnode = usernameHash;
|
|
for (let index = labels.length - 1; index > 0; index--) {
|
|
const label = labels[index - 1];
|
|
subnode = web3Utils.soliditySha3(subnode, label);
|
|
assert.equal(await ENSRegistry.methods.owner(subnode).call(), utils.zeroAddress);
|
|
}
|
|
});
|
|
|
|
|
|
});
|
|
|
|
describe('moveRegistry(address)', function () {
|
|
it('should move registry to new registry and migrate', async () => {
|
|
const result = await UsernameRegistrar.methods.moveRegistry(UpdatedUsernameRegistrar.address).send();
|
|
//TODO: check events
|
|
assert.equal(await ENSRegistry.methods.owner(registry.namehash).call(), UpdatedUsernameRegistrar.address, "registry ownership not moved correctly")
|
|
assert.equal(+await UpdatedUsernameRegistrar.methods.getPrice().call(), registry.price, "updated registry didnt migrated price")
|
|
});
|
|
});
|
|
|
|
describe('moveAccount(label,address)', function () {
|
|
it('should move username to new registry by account owner', async () => {
|
|
const registrant = accountsArr[5];
|
|
const username = 'erin';
|
|
const usernameHash = namehash.hash(username + '.' + registry.registry);
|
|
const label = web3Utils.sha3(username);
|
|
|
|
const accountBalance = +await UsernameRegistrar.methods.getAccountBalance(label).call()
|
|
assert.notEqual(accountBalance, 0);
|
|
const initialRegistryBalance = +await TestToken.methods.balanceOf(UsernameRegistrar.address).call();
|
|
const initialUpdatedRegistryBalance = +await TestToken.methods.balanceOf(UpdatedUsernameRegistrar.address).call();
|
|
const creationTime = +await UsernameRegistrar.methods.getCreationTime(label).call();
|
|
assert.notEqual(creationTime, 0);
|
|
assert.equal(+await UpdatedUsernameRegistrar.methods.getCreationTime(label).call(), 0);
|
|
const result = await UsernameRegistrar.methods.moveAccount(label, UpdatedUsernameRegistrar.address).send({ from: registrant });
|
|
assert.equal(+await UsernameRegistrar.methods.getCreationTime(label).call(), 0);
|
|
assert.equal(+await UpdatedUsernameRegistrar.methods.getCreationTime(label).call(), creationTime);
|
|
assert.equal(+await TestToken.methods.balanceOf(UsernameRegistrar.address).call(), (+initialRegistryBalance) - (+accountBalance))
|
|
assert.equal(+await TestToken.methods.balanceOf(UpdatedUsernameRegistrar.address).call(), (+initialUpdatedRegistryBalance) + (+accountBalance))
|
|
});
|
|
});
|
|
|
|
});
|