1

I would like to register a name (e.g. 'somename' >= 7 characters) with the new ENS contract using sbt-ethereum and the .eth registrar controller, for one year.

I have confirmed that the code in the .eth ens-registrar-controller contract contains the correct code, and that the contract went live May 4th.

I am able to interact with the contract, for example to confirm that the owner is the ENS-Multisig ethTransactionView ens-registrar-controller owner

The plan is to:

  1. Make sure the somename is valid: ethTransactionView ens-registrar-controller valid somename
  2. That somename is available: ethTransactionView ens-registrar-controller available somename
  3. Calculate myrent in wei for one year worth of seconds (365*24*60*60): ethTransactionView ens-registrar-controller rentPrice somename 31536000
  4. Generate and save mysecret 32 random bytes by stripping the whitespace and adding 0x. e.g. 0x92ad4989c7906ab2b2830e534e434179f6dfdb67012187741be3520ea1a204c5
  5. Compute the secretmessage using the conveniently built in nested keccak256 function: ethTransactionView ens-registrar-controller makeCommitment somename default-sender mysecret
  6. Send the secretmessage with ethTransactionInvoke ens-registrar-controller commit secretmessage
  7. Wait >1min then register, noting that this transaction is payable in the quantity myrent, which I will tack on the end in wei: ethTransactionInvoke ens-registrar-controller register somename default-sender 31536000 mysecret myrent wei

However, calling these of the functions results in a common error, which for Step 1 is:

$NonthrowableFailureException: Failed: No matching function 'valid' for args 'somename' in ABI

Having the common error makes me suspicious I'm doing something basic wrong. Any ideas? I suspect that once I can do Step 1, Steps 2-7 will be doable.


I note that the contract code contains the controller code as a subset. Perhaps I'm not understanding how to call a function within a deployed contract that has multiple contract sections. For example the owner function I was able to call is within a contract Ownable section, separate from contract ETHRegistrarController is Ownable which contains the functions I am interested in.

1

Note: Usually I'd use address aliases, rather than hex addresses, for almost everything. But all of the addresses except the base ens could change, and ideally should be looked up dynamically with each use. So I'll use hex addresses for everything but that. ENS is not really a convenient application to work with "by hand". sbt-ethereum's ens* tasks will hopefully be updated soon to make this much easier.

So, let's start with the docs here.

Finding the address of the new registrar is straightforward: look up the owner of the domain 'eth' in ENS, by calling owner(namehash('eth')) on the ENS registry.

namehash("eth") is 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae. (sbt-ethereum should surface namehash as a utility. In general, its ens* tasks need to be updated for the new ENS registrar.)

Make sure we have ens (the one unchanging contract) set as an address alias.

sbt:ethdocstore> ethAddressAliasCheck ens
The alias 'ens' points to address '0x314159265dd8dbb310642f98f50c066173c1259b'.

If we don't, set that via ethAddressAliasSet ens 0x314159265dd8dbb310642f98f50c066173c1259b. Kewl.

Next, let's look up the current registrar by finding the owner of the namehash('eth'). As of this writing (it might someday change again!) that yields...

sbt:ethdocstore> ethTransactionView ens owner 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae
[info] The function 'owner' yields 1 result.
[info]  + Result 1 of type 'address' is 0xfac7bea255a6990f749363002136af6556b31e04
[success] Total time: 1 s, completed May 6, 2019 4:29:01 PM

That's the address of the new/current registrar.

However, it's probably a bit easier to work with a controller (which saves us the work of computing the label hash, as we would to register directly with the registrar). According to the docs, we'll want the resolver of the top-level-domain eth to find that:

sbt:ethdocstore> ethTransactionView ens resolver 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae
[info] The function 'resolver' yields 1 result.
[info]  + Result 1 of type 'address' is 0x97683a370239817cf33ec2c2ad3b3a1884571f69
[success] Total time: 1 s, completed May 6, 2019 4:35:37 PM

We'll want to interact with this resolver, so we'll need its ABI. (If you haven't, it's really helpful to set up an Etherscan ABI key, although of course you can copy and paste.)

> ethContractAbiImport 0x97683a370239817cf33ec2c2ad3b3a1884571f69
An Etherscan API key has been set. Would you like to try to import the ABI for this address from Etherscan? [y/n] y
Attempting to fetch ABI for address '0x97683a370239817cf33ec2c2ad3b3a1884571f69' from Etherscan.
ABI found:
[{"outputs":[{"name":"","type":"bool"}],"constant":true,"payable":false,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","stateMutability":"pure","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"key","type":"string"},{"name":"value","type":"string"}],"name":"setText","stateMutability":"nonpayable","type":"function"},{"outputs":[{"name":"","type":"address"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentTypes","type":"uint256"}],"name":"ABI","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"name":"setPubkey","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"hash","type":"bytes"}],"name":"setContenthash","stateMutability":"nonpayable","type":"function"},{"outputs":[{"name":"","type":"address"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"string"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"key","type":"string"}],"name":"text","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"name":"setABI","stateMutability":"nonpayable","type":"function"},{"outputs":[{"name":"","type":"string"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"}],"name":"name","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[],"name":"renounceOwnership","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"name","type":"string"}],"name":"setName","stateMutability":"nonpayable","type":"function"},{"outputs":[{"name":"","type":"address"}],"constant":true,"payable":false,"inputs":[],"name":"owner","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"bool"}],"constant":true,"payable":false,"inputs":[],"name":"isOwner","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"bytes"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"}],"name":"contenthash","stateMutability":"view","type":"function"},{"outputs":[{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"constant":true,"payable":false,"inputs":[{"name":"node","type":"bytes32"}],"name":"pubkey","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"addr","type":"address"}],"name":"setAddr","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"interfaceID","type":"bytes4"},{"name":"implementer","type":"address"}],"name":"setInterface","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"indexedKey","type":"string","indexed":false},{"name":"key","type":"string","indexed":false}],"name":"TextChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"x","type":"bytes32","indexed":false},{"name":"y","type":"bytes32","indexed":false}],"name":"PubkeyChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"name","type":"string","indexed":false}],"name":"NameChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"interfaceID","type":"bytes4","indexed":true},{"name":"implementer","type":"address","indexed":false}],"name":"InterfaceChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"hash","type":"bytes","indexed":false}],"name":"ContenthashChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"a","type":"address","indexed":false}],"name":"AddrChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"node","type":"bytes32","indexed":true},{"name":"contentType","type":"uint256","indexed":true}],"name":"ABIChanged","anonymous":false,"type":"event"},{"inputs":[{"name":"previousOwner","type":"address","indexed":true},{"name":"newOwner","type":"address","indexed":true}],"name":"OwnershipTransferred","anonymous":false,"type":"event"}]
Use this ABI? [y/n] y
[info] A default ABI is now known for the contract at address 0x97683a370239817cf33ec2c2ad3b3a1884571f69
[info] Refreshing caches.
[success] Total time: 6 s, completed May 6, 2019 4:36:52 PM

Now we can follow the directions to find a controller for top level domain eth, using its namehash as its node ID (computed way above), and the documented four-byte interface ID 0x018fac06:

> ethTransactionView 0x97683a370239817cf33ec2c2ad3b3a1884571f69 interfaceImplementer 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae 0x018fac06
[info] The function 'interfaceImplementer' yields 1 result.
[info]  + Result 1 of type 'address' is 0xf0ad5cad05e10572efceb849f6ff0c68f9700455
[success] Total time: 1 s, completed May 6, 2019 4:41:44 PM

Yay! We have the address of a controller for the top-level eth domain. Let's be user we have its ABI.

> ethContractAbiImport 0xf0ad5cad05e10572efceb849f6ff0c68f9700455
An Etherscan API key has been set. Would you like to try to import the ABI for this address from Etherscan? [y/n] y
Attempting to fetch ABI for address '0xf0ad5cad05e10572efceb849f6ff0c68f9700455' from Etherscan.
ABI found:
[{"outputs":[{"name":"","type":"bool"}],"constant":true,"payable":false,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","stateMutability":"pure","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[],"name":"withdraw","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"_prices","type":"address"}],"name":"setPriceOracle","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[],"name":"renounceOwnership","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"_minCommitmentAge","type":"uint256"},{"name":"_maxCommitmentAge","type":"uint256"}],"name":"setCommitmentAges","stateMutability":"nonpayable","type":"function"},{"outputs":[{"name":"","type":"uint256"}],"constant":true,"payable":false,"inputs":[{"name":"","type":"bytes32"}],"name":"commitments","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"uint256"}],"constant":true,"payable":false,"inputs":[{"name":"name","type":"string"},{"name":"duration","type":"uint256"}],"name":"rentPrice","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":true,"inputs":[{"name":"name","type":"string"},{"name":"owner","type":"address"},{"name":"duration","type":"uint256"},{"name":"secret","type":"bytes32"}],"name":"register","stateMutability":"payable","type":"function"},{"outputs":[{"name":"","type":"uint256"}],"constant":true,"payable":false,"inputs":[],"name":"MIN_REGISTRATION_DURATION","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"uint256"}],"constant":true,"payable":false,"inputs":[],"name":"minCommitmentAge","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"address"}],"constant":true,"payable":false,"inputs":[],"name":"owner","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"bool"}],"constant":true,"payable":false,"inputs":[],"name":"isOwner","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"bool"}],"constant":true,"payable":false,"inputs":[{"name":"name","type":"string"}],"name":"valid","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":true,"inputs":[{"name":"name","type":"string"},{"name":"duration","type":"uint256"}],"name":"renew","stateMutability":"payable","type":"function"},{"outputs":[{"name":"","type":"bool"}],"constant":true,"payable":false,"inputs":[{"name":"name","type":"string"}],"name":"available","stateMutability":"view","type":"function"},{"outputs":[{"name":"","type":"uint256"}],"constant":true,"payable":false,"inputs":[],"name":"maxCommitmentAge","stateMutability":"view","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"commitment","type":"bytes32"}],"name":"commit","stateMutability":"nonpayable","type":"function"},{"outputs":[],"constant":false,"payable":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","stateMutability":"nonpayable","type":"function"},{"outputs":[{"name":"","type":"bytes32"}],"constant":true,"payable":false,"inputs":[{"name":"name","type":"string"},{"name":"owner","type":"address"},{"name":"secret","type":"bytes32"}],"name":"makeCommitment","stateMutability":"pure","type":"function"},{"inputs":[{"name":"name","type":"string","indexed":false},{"name":"label","type":"bytes32","indexed":true},{"name":"owner","type":"address","indexed":true},{"name":"cost","type":"uint256","indexed":false},{"name":"expires","type":"uint256","indexed":false}],"name":"NameRegistered","anonymous":false,"type":"event"},{"inputs":[{"name":"name","type":"string","indexed":false},{"name":"label","type":"bytes32","indexed":true},{"name":"cost","type":"uint256","indexed":false},{"name":"expires","type":"uint256","indexed":false}],"name":"NameRenewed","anonymous":false,"type":"event"},{"inputs":[{"name":"oracle","type":"address","indexed":true}],"name":"NewPriceOracle","anonymous":false,"type":"event"},{"inputs":[{"name":"previousOwner","type":"address","indexed":true},{"name":"newOwner","type":"address","indexed":true}],"name":"OwnershipTransferred","anonymous":false,"type":"event"},{"payable":false,"inputs":[{"name":"_base","type":"address"},{"name":"_prices","type":"address"},{"name":"_minCommitmentAge","type":"uint256"},{"name":"_maxCommitmentAge","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"}]
Use this ABI? [y/n] y
[info] A default ABI is now known for the contract at address 0xf0ad5cad05e10572efceb849f6ff0c68f9700455
[info] Refreshing caches.
[success] Total time: 4 s, completed May 6, 2019 4:43:39 PM

Okay! Now we have an easy contract we can work with to register names! We will follow the directions here.

First, let's see if the name we want is available.

> ethTransactionView 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 available "coldbrew"
[info] The function 'available' yields 1 result.
[info]  + Result 1 of type 'bool' is false
[success] Total time: 0 s, completed May 6, 2019 4:52:40 PM
> ethTransactionView 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 available "omnivorous"
[info] The function 'available' yields 1 result.
[info]  + Result 1 of type 'bool' is true
[success] Total time: 0 s, completed May 6, 2019 4:53:11 PM

Hmm. Our first choice is not available. But our second choice, "ominvorous" is. Let's snag it.

Next, we let's check the minimum registration duration:

> ethTransactionView 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 MIN_REGISTRATION_DURATION
[info] The function 'MIN_REGISTRATION_DURATION' yields 1 result.
[info]  + Result 1 of type 'uint256' is 2419200
[success] Total time: 1 s, completed May 6, 2019 4:55:47 PM

Kewl. Let's find the rent price for that duration:

> ethTransactionView 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 rentPrice "omnivorous" 2419200
[info] The function 'rentPrice' yields 1 result.
[info]  + Result 1 of type 'uint256' is 2218914982274932
[success] Total time: 1 s, completed May 6, 2019 4:58:14 PM

That's 0.022 ETH 0.0022 ETH. The directions recommend paying a 5% - 10% premium, the difference of which will be reimbursed. We'll call it 0.025 ETH. (We, um, overpaid by A LOT, off by a factor of 10, but the difference was refunded. ENS doesn't cheat on the change! I thought the minimum registration period was a year, but it is only 2419200 / (24*60*60) = 28 days)

Next we need to generate a commitment. The controller has a utility that will do that for us. We need a 32 byte "secret", which will help protect us from people trying to guess the name we mean to register and front-run it. Maybe sbt-ethereum should have a utility for this, but for now we'll just go to a website to give us a random-ish 32 byte string. (If this were a high-value operation, we'd be more private about generating secrets, though!)

> ethTransactionView 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 makeCommitment "omnivorous" default-sender 0xec2ac5eb3d0c2b0ae1815fbd4d7cd59a7367f3404ffa67e7e3577cb15a6a5d75
[info] The function 'makeCommitment' yields 1 result.
[info]  + Result 1 of type 'bytes32' is 0xd7b8becc2e8c84946c19846ba76bd3a3d83148a1266ac04b1e668007e1cb736c
[success] Total time: 1 s, completed May 6, 2019 5:06:56 PM

OK. Now we begin actually doing this. We call commit on the controller with our generated commitment.

> ethTransactionInvoke 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 commit 0xd7b8becc2e8c84946c19846ba76bd3a3d83148a1266ac04b1e668007e1cb736c
[info] Unlocking address '0x465e79b940bc2157e4259ff6b2d92f454497f1e4' (on chain with ID 1, aliases ['default-sender','testing0'])
Enter passphrase or hex private key for address '0x465e79b940bc2157e4259ff6b2d92f454497f1e4': *******************
[info] V3 wallet(s) found for '0x465e79b940bc2157e4259ff6b2d92f454497f1e4' (aliases ['default-sender','testing0'])

==> T R A N S A C T I O N   S U B M I S S I O N   R E Q U E S T
==>
==> The transaction would be a message with...
==>   To:    0xf0ad5cad05e10572efceb849f6ff0c68f9700455 (with aliases ['ens-eth-tld-controller'] on chain with ID 1)
==>   From:  0x465e79b940bc2157e4259ff6b2d92f454497f1e4 (with aliases ['default-sender','testing0'] on chain with ID 1)
==>   Data:  0xf14fcbc8d7b8becc2e8c84946c19846ba76bd3a3d83148a1266ac04b1e668007e1cb736c
==>   Value: 0 Ether
==>
==> The transaction is signed with Chain ID 1 (which correctly matches the current session's 'ethNodeChainId').
==>
==> According to the ABI currently associated with the 'to' address, this message would amount to the following method call...
==>   Function called: commit(bytes32)
==>     Arg 1 [name=commitment, type=bytes32]: 0xd7b8becc2e8c84946c19846ba76bd3a3d83148a1266ac04b1e668007e1cb736c
==>
==> The nonce of the transaction would be 408.
==>
==> $$$ The transaction you have requested could use up to 53206 units of gas.
==> $$$ You would pay 5 gwei for each unit of gas, for a maximum cost of 0.00026603 ether.
==> $$$ This is worth 0.04655391985 USD (according to Coinbase at 5:08 PM).

Would you like to submit this transaction? [y/n] y
A transaction with hash '0x46828d4061dfc4d2c9ac41a8e6754037490e02e9754c4bc0741c18f28b03ff65' will be submitted. Please wait.
[info] Called function 'commit', with args 'd7b8becc2e8c84946c19846ba76bd3a3d83148a1266ac04b1e668007e1cb736c', sending 0 wei to address '0xf0ad5cad05e10572efceb849f6ff0c68f9700455' in transaction '0x46828d4061dfc4d2c9ac41a8e6754037490e02e9754c4bc0741c18f28b03ff65'.
[info] Waiting for the transaction to be mined (will wait up to 5 minutes).
[info] Transaction Receipt:
[info]        Transaction Hash:    0x46828d4061dfc4d2c9ac41a8e6754037490e02e9754c4bc0741c18f28b03ff65
[info]        Transaction Index:   49
[info]        Transaction Status:  SUCCEEDED
[info]        Block Hash:          0xd3957380725405739d638e2387d676ed15dbf4e766740733311045cd67788213
[info]        Block Number:        7710406
[info]        From:                0x465e79b940bc2157e4259ff6b2d92f454497f1e4
[info]        To:                  0xf0ad5cad05e10572efceb849f6ff0c68f9700455
[info]        Cumulative Gas Used: 6861463
[info]        Gas Used:            44339
[info]        Contract Address:    None
[info]        Logs:                None
[info]        Events:              None
[success] Total time: 48 s, completed May 6, 2019 5:09:28 PM

Now we have to wait at least a minute (but no more than 24h), then the finally we can register our name.

> ethTransactionInvoke 0xf0ad5cad05e10572efceb849f6ff0c68f9700455 register "omnivorous" default-sender 2419200 0xec2ac5eb3d0c2b0ae1815fbd4d7cd59a7367f3404ffa67e7e3577cb15a6a5d75 0.025 ether
Using sender address '0x465e79b940bc2157e4259ff6b2d92f454497f1e4' (on chain with ID 1, aliases ['default-sender','testing0']). OK? [y/n] y

==> T R A N S A C T I O N   S U B M I S S I O N   R E Q U E S T
==>
==> The transaction would be a message with...
==>   To:    0xf0ad5cad05e10572efceb849f6ff0c68f9700455 (with aliases ['ens-eth-tld-controller'] on chain with ID 1)
==>   From:  0x465e79b940bc2157e4259ff6b2d92f454497f1e4 (with aliases ['default-sender','testing0'] on chain with ID 1)
==>   Data:  0x85f6d1550000000000000000000000000000000000000000000000000000000000000080000000000000000000000000465e79b940bc2157e4259ff6b2d92f454497f1e4000000000000000000000000000000000000000000000000000000000024ea00ec2ac5eb3d0c2b0ae1815fbd4d7cd59a7367f3404ffa67e7e3577cb15a6a5d75000000000000000000000000000000000000000000000000000000000000000a6f6d6e69766f726f757300000000000000000000000000000000000000000000
==>   Value: 0.025 Ether
==>
==> The transaction is signed with Chain ID 1 (which correctly matches the current session's 'ethNodeChainId').
==>
==> According to the ABI currently associated with the 'to' address, this message would amount to the following method call...
==>   Function called: register(string,address,uint256,bytes32)
==>     Arg 1 [name=name, type=string]: "omnivorous"
==>     Arg 2 [name=owner, type=address]: 0x465e79b940bc2157e4259ff6b2d92f454497f1e4
==>     Arg 3 [name=duration, type=uint256]: 2419200
==>     Arg 4 [name=secret, type=bytes32]: 0xec2ac5eb3d0c2b0ae1815fbd4d7cd59a7367f3404ffa67e7e3577cb15a6a5d75
==>
==> The nonce of the transaction would be 409.
==>
==> $$$ The transaction you have requested could use up to 181833 units of gas.
==> $$$ You would pay 5 gwei for each unit of gas, for a maximum cost of 0.000909165 ether.
==> $$$ This is worth 0.160999484025 USD (according to Coinbase at 5:13 PM).
==> $$$ You would also send 0.025 ether (4.427125 USD), for a maximum total cost of 0.025909165 ether (4.588124484025 USD).

Would you like to submit this transaction? [y/n] y
A transaction with hash '0x463c24c5aef9e8c97fd571c9fa3a9c2de1dd04f8c1da0d3f31245a485cce55f1' will be submitted. Please wait.
[info] Called function 'register', with args '"omnivorous", 465e79b940bc2157e4259ff6b2d92f454497f1e4, 2419200, ec2ac5eb3d0c2b0ae1815fbd4d7cd59a7367f3404ffa67e7e3577cb15a6a5d75', sending 25000000000000000 wei to address '0xf0ad5cad05e10572efceb849f6ff0c68f9700455' in transaction '0x463c24c5aef9e8c97fd571c9fa3a9c2de1dd04f8c1da0d3f31245a485cce55f1'.
[info] Waiting for the transaction to be mined (will wait up to 5 minutes).
[info] Transaction Receipt:
[info]        Transaction Hash:    0x463c24c5aef9e8c97fd571c9fa3a9c2de1dd04f8c1da0d3f31245a485cce55f1
[info]        Transaction Index:   45
[info]        Transaction Status:  SUCCEEDED
[info]        Block Hash:          0x7ffb7eff66d8516e50f447279ff7e1409a0a4178eec89bbb6cad10367ce9754e
[info]        Block Number:        7710424
[info]        From:                0x465e79b940bc2157e4259ff6b2d92f454497f1e4
[info]        To:                  0xf0ad5cad05e10572efceb849f6ff0c68f9700455
[info]        Cumulative Gas Used: 7927356
[info]        Gas Used:            134292
[info]        Contract Address:    None
[info]        Logs:                0 => EthLogEntry [source=0xfac7bea255a6990f749363002136af6556b31e04] (
[info]                                    topics=[
[info]                                      0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef,
[info]                                      0x0000000000000000000000000000000000000000000000000000000000000000,
[info]                                      0x000000000000000000000000465e79b940bc2157e4259ff6b2d92f454497f1e4,
[info]                                      0xbdd753d3174c6057d4300908f42291e9a9b74047fe6074903970054908887b68
[info]                                    ],
[info]                                    data=
[info]                                  ),
[info]                             1 => EthLogEntry [source=0x314159265dd8dbb310642f98f50c066173c1259b] (
[info]                                    topics=[
[info]                                      0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82,
[info]                                      0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae,
[info]                                      0xbdd753d3174c6057d4300908f42291e9a9b74047fe6074903970054908887b68
[info]                                    ],
[info]                                    data=000000000000000000000000465e79b940bc2157e4259ff6b2d92f454497f1e4
[info]                                  ),
[info]                             2 => EthLogEntry [source=0xfac7bea255a6990f749363002136af6556b31e04] (
[info]                                    topics=[
[info]                                      0xb3d987963d01b2f68493b4bdb130988f157ea43070d4ad840fee0466ed9370d9,
[info]                                      0xbdd753d3174c6057d4300908f42291e9a9b74047fe6074903970054908887b68,
[info]                                      0x000000000000000000000000465e79b940bc2157e4259ff6b2d92f454497f1e4
[info]                                    ],
[info]                                    data=000000000000000000000000000000000000000000000000000000005cf5b7ec
[info]                                  ),
[info]                             3 => EthLogEntry [source=0xf0ad5cad05e10572efceb849f6ff0c68f9700455] (
[info]                                    topics=[
[info]                                      0xca6abbe9d7f11422cb6ca7629fbf6fe9efb1c621f71ce8f02b9f2a230097404f,
[info]                                      0xbdd753d3174c6057d4300908f42291e9a9b74047fe6074903970054908887b68,
[info]                                      0x000000000000000000000000465e79b940bc2157e4259ff6b2d92f454497f1e4
[info]                                    ],
[info]                                    data=0000000000000000000000000000000000000000000000000000000000000060
[info]                                         0000000000000000000000000000000000000000000000000007b3402479ec1a
[info]                                         000000000000000000000000000000000000000000000000000000005cf5b7ec
[info]                                         000000000000000000000000000000000000000000000000000000000000000a
[info]                                         6f6d6e69766f726f757300000000000000000000000000000000000000000000
[info]                                  )
[info]        Events:              0 => Anonymous Event [source=0xfac7bea255a6990f749363002136af6556b31e04],
[info]                             1 => Anonymous Event [source=0x314159265dd8dbb310642f98f50c066173c1259b],
[info]                             2 => Anonymous Event [source=0xfac7bea255a6990f749363002136af6556b31e04],
[info]                             3 => NameRegistered [source=0xf0ad5cad05e10572efceb849f6ff0c68f9700455] (
[info]                                    name (of type string): "omnivorous",
[info]                                    label (of type bytes32): 0xbdd753d3174c6057d4300908f42291e9a9b74047fe6074903970054908887b68,
[info]                                    owner (of type address): 0x465e79b940bc2157e4259ff6b2d92f454497f1e4,
[info]                                    cost (of type uint256): 2167412908223514,
[info]                                    expires (of type uint256): 1559607276
[info]                                  )
[success] Total time: 65 s, completed May 6, 2019 5:14:45 PM

Woohoo! omnivorous.eth is ours!

> ensOwnerLookup omnivorous.eth
The name 'omnivorous.eth' is owned by address '0x465e79b940bc2157e4259ff6b2d92f454497f1e4' (with aliases ['default-sender','testing0'] on chain with ID 1).
[success] Total time: 1 s, completed May 6, 2019 5:15:52 PM

I hope this helps!

  • Thank you for the comprehensive solution, including the future-proof addressing of the controller address. While I had the correct final address (0xf0ad5cad05e10572efceb849f6ff0c68f9700455) I was making two errors. 1) My contract ABI was incorrectly imported (not sure how, I have been using the etherscan auto-import feature mostly), and 2) I was making calls with my string arguments without quotations. – zederkredez May 7 at 13:24
  • Regarding ABI code, I suspect that the order of JSON elements changes, giving the appearance of incorrect code. Looking at the etherscan printed JSON ABI, the elements seem to be in a different order, even after automatic import. – zederkredez May 7 at 13:41
  • For anyone playing along at home, note that strings must be in double-quotes ("omnivorous"), not single-quotes ('omnivorous') or plain (omnivorous). The latter two will result in a Failed: No matching function error – zederkredez May 12 at 12:01
  • yes :( i should try to make that more tolerant. – Steve Waldman May 12 at 17:11
  • @zederkredez (as of version 0.1.16 sbt-ethereum is much more tolerant of string formats. In addition to double-quoted strings, single-quoted strings and unquoted no-whitespace values are now accepted.) – Steve Waldman Aug 26 at 8:36

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.