From 45254abcdb575dbaef844d57232d473919060372 Mon Sep 17 00:00:00 2001 From: v1rtl Date: Thu, 13 Jun 2024 16:30:58 +0300 Subject: [PATCH 1/4] remove usage of eth-ens-namehash --- bun.lockb | Bin 578604 -> 578604 bytes ...00_deploy_base_registrar_implementation.ts | 4 +- .../ethregistrar/00_setup_base_registrar.ts | 1 - package.json | 3 +- tasks/seed.ts | 4 +- test/dnsregistrar/TestDNSRegistrar.js | 32 ++--- test/dnsregistrar/TestOffchainDNSResolver.js | 53 ++++---- .../TestUniversalResolverWithDNS.js | 6 +- test/ethregistrar/TestBaseRegistrar.js | 31 ++--- test/ethregistrar/TestBulkRenewal.js | 8 +- .../TestExponentialPremiumPriceOracle.js | 4 +- .../TestLinearPremiumPriceOracle.js | 4 +- test/ethregistrar/TestStaticBulkRenewal.js | 8 +- test/registry/TestENS.js | 4 +- test/registry/TestENSRegistryWithFallback.js | 8 +- test/registry/TestFIFSRegistrar.js | 6 +- test/registry/TestTestRegistrar.js | 4 +- test/resolvers/TestExtendedDNSResolver.js | 4 +- test/resolvers/TestPublicResolver.js | 8 +- test/reverseRegistrar/TestReverseRegistrar.js | 4 +- test/root/TestRoot.js | 4 +- test/test-utils/ens.js | 2 +- test/test-utils/reverse.js | 4 +- test/utils/TestUniversalResolver.js | 128 ++++++++---------- test/wrapper/BytesUtils.js | 2 +- test/wrapper/ERC1155.behaviour.js | 2 +- typings-custom/eth-ens-namehash.d.ts | 1 - 27 files changed, 152 insertions(+), 187 deletions(-) delete mode 100644 typings-custom/eth-ens-namehash.d.ts diff --git a/bun.lockb b/bun.lockb index c48dfd258d72ba400ffca0257d2f65fc50346c39..f22889004f5025c27921c066d1a1a38e3adca86b 100755 GIT binary patch delta 9932 zcmXBYcNlCR?;I8>nTpjHa}VvXZiaO|l_2X`_|V6th8_ zHVun5ZOSs5a@SpPr@!wX@B4Xv--rMB?>+0x!_GSMuv6VbFMIeajy(UE?`P-z{gC5N zJo=1nJmS>j*5glVPCE8E|2*OD_PHmAFA5JhJ3R1|Lk>9L^y!cTkGcr=(xQMFyvrz- zuz-JA#R^skE~i+-2I1uu8`vST6k9N^pcO+0<`oqa=)t;@VhRJ;S60km1m`M>IZWVQ zRk45>ysIgeuz+tXR^D~1lt z+bAZ`gLPZQ6b7(wrwbzU3}7Frn866n{S|YVzH zn1x~jJy@qGrZ9m0V#N$ba9*OA!vyY26$_ZbdzoSh3-~WrtYC%U6^b=%5SEG!>=3wI_-|LN zV1?iviZyHyzEiP*9in$BwqP_`F?3*_p_o7q)|rYa3}C-oF@q7D_bBEtf%{&?0%q{e zQY>Ks|9y%TtPr${HEa;RU$KE5q7NvxV0=(3h7QaRDJIZ^^EMWovbBYzL5PV*-h7H0mC^oP|G$^)Ud{HZg4$LnpCeVZR zWyKT*u)m_1!3fS*6?2%t{hDF{Gk9NDEMWnERIFfy;2VlHY!H4^v4I_;Zz;B5d|NAq z4$Siu6X?PEj$#S}*xyymU<7AU%wYoedx{0j;C)}Qga!N`C|0mS@I%EKHVA*D*uW0a zj}==mexema2j;ApKo8bW6;l|%{+VJ1BRD@-%wYoe7m5YU;Qdmuga!OxDORvT@N2~y zHV7BR26l*kqu7G+Tdf#6Fwa*^pa<)BiYW|W|6VbJ5u6JYbC|&WgJJndIRB-X!vyYsD;6+= z_jkn-7V!T^v4RzX|5dDEgYX}U4eSv8Q?UhO*NUM7^ZyhR=*4N)K^HxPotEkzF1}B< z4-grQ;2fx!!vyX@iUrKz9jsWw0{$fwD_9{g6l>TZyrg0SJ4FAY*n;t|S}}BBUP>{6 z9;|;;Okn`~-xV_$!TArx942s0#R6vV{!_7p1^h!4D_9}8v|8 zrr5v^k*(N*adoX2Ixr7aOrQtr8j2|lU|&-)gAts=6myusy_RADGkDilEMWoPQLJEv z;5v#mY!F^ov4I_;>nXNiTwg1O4$K=UCeVX*L&X#Zuy3T8!3d74n8O6_jTH-+!MllK z2@Ci)Rjgoz;AV<7Y!KdDv4I_;TPU_*+)^us4opumfgY?|DW))heQU)GMsRMUn8O6_ zZ50cc!MmMe2@CkQSFB)#;0}s4Y!Ld24eSuzQLzQ%aIF|RFz=+8Ko8cP6;l|%zKdc8 zBRF?e%wYoeZi)rW;01~$Ea2Z=v4RzXdnnehL3mHa26l+<6+;K+BNY?q!FrTp3Io{3DP}N&^Jv8!CU6tQ0%q_YqgcWM{$mv@SRr_vVhtOF zk5_D9hv*54Ef`PKilGDZc*O*Iuu{bo2C$!`n866nlNEEAz3G`sSQZa=A>{Asp z7{Pg!Vh$6yuU0Hz2JbbBB`n~-RegYa#N4eSuTU9kn@9a=GT zV7^l^fgY@PDW))h-6&=-f^&vq4imU%Di$z<_in`!7VzJrSiuUxdlhTgAUsR4fgPgv zDYjs=S}}BBzF#qc9;^>2rZ9m0LB$M4a6Y7%!vyY!6$_Zb`-ox*3;1U%R1_+M45V1?joiZyHyeqFJF9imaO1>+l9F?3*lQ!#-atZyl%Fo6AS#SBJp&Qr`` z0{1(L1ZLh<>2hg7HJG7&Hmg7Isu7&tX-^ delta 9930 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 O>=^qmx%3K0PyY{>*5&j7 diff --git a/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts b/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts index c2e24c51..c404d23f 100644 --- a/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts +++ b/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts @@ -1,8 +1,8 @@ -import namehash from 'eth-ens-namehash' import { ethers } from 'hardhat' import { DeployFunction } from 'hardhat-deploy/types' import { HardhatRuntimeEnvironment } from 'hardhat/types' import { keccak256 } from 'js-sha3' +import { namehash } from 'viem/ens' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const { getNamedAccounts, deployments, network } = hre @@ -17,7 +17,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { const deployArgs = { from: deployer, - args: [registry.address, namehash.hash('eth')], + args: [registry.address, namehash('eth')], log: true, } diff --git a/deploy/ethregistrar/00_setup_base_registrar.ts b/deploy/ethregistrar/00_setup_base_registrar.ts index 0bb558ff..9aedb367 100644 --- a/deploy/ethregistrar/00_setup_base_registrar.ts +++ b/deploy/ethregistrar/00_setup_base_registrar.ts @@ -1,4 +1,3 @@ -import namehash from 'eth-ens-namehash' import { ethers } from 'hardhat' import { DeployFunction } from 'hardhat-deploy/types' import { HardhatRuntimeEnvironment } from 'hardhat/types' diff --git a/package.json b/package.json index 252b11ba..12c107e2 100644 --- a/package.json +++ b/package.json @@ -79,5 +79,6 @@ "homepage": "https://github.com/ensdomains/ens-contracts#readme", "volta": { "node": "16.20.2" - } + }, + "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" } diff --git a/tasks/seed.ts b/tasks/seed.ts index 8011a171..484e8f96 100644 --- a/tasks/seed.ts +++ b/tasks/seed.ts @@ -1,10 +1,8 @@ import fs from 'fs' - +import { namehash } from 'viem/ens' import * as envfile from 'envfile' -import n from 'eth-ens-namehash' import { task } from 'hardhat/config' -const namehash = n.hash const labelhash = (utils: any, label: string) => utils.keccak256(utils.toUtf8Bytes(label)) diff --git a/test/dnsregistrar/TestDNSRegistrar.js b/test/dnsregistrar/TestDNSRegistrar.js index 52708cab..ddef1380 100644 --- a/test/dnsregistrar/TestDNSRegistrar.js +++ b/test/dnsregistrar/TestDNSRegistrar.js @@ -4,7 +4,7 @@ const SimplePublixSuffixList = artifacts.require('./SimplePublicSuffixList.sol') const DNSRegistrarContract = artifacts.require('./DNSRegistrar.sol') const PublicResolver = artifacts.require('./PublicResolver.sol') const DNSSECImpl = artifacts.require('./DNSSECImpl') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const utils = require('./Helpers/Utils') const { exceptions } = require('@ensdomains/test-utils') const { assert } = require('chai') @@ -61,7 +61,7 @@ contract('DNSRegistrar', function (accounts) { const ReverseRegistrar = await deploy('ReverseRegistrar', ens.address) await ens.setSubnodeOwner(EMPTY_BYTES32, labelhash('reverse'), accounts[0]) await ens.setSubnodeOwner( - namehash.hash('reverse'), + namehash('reverse'), labelhash('addr'), ReverseRegistrar.address, ) @@ -100,7 +100,7 @@ contract('DNSRegistrar', function (accounts) { from: accounts[1], }) - assert.equal(await ens.owner(namehash.hash('foo.test')), accounts[0]) + assert.equal(await ens.owner(namehash('foo.test')), accounts[0]) }) it('allows claims on names that are not TLDs', async function () { @@ -111,7 +111,7 @@ contract('DNSRegistrar', function (accounts) { await registrar.proveAndClaim(utils.hexEncodeName('foo.co.nz'), proof) - assert.equal(await ens.owner(namehash.hash('foo.co.nz')), accounts[0]) + assert.equal(await ens.owner(namehash('foo.co.nz')), accounts[0]) }) it('allows anyone to update a DNSSEC referenced name', async function () { @@ -126,7 +126,7 @@ contract('DNSRegistrar', function (accounts) { await registrar.proveAndClaim(utils.hexEncodeName('foo.test'), proof) - assert.equal(await ens.owner(namehash.hash('foo.test')), accounts[1]) + assert.equal(await ens.owner(namehash('foo.test')), accounts[1]) }) it('rejects proofs with earlier inceptions', async function () { @@ -173,8 +173,8 @@ contract('DNSRegistrar', function (accounts) { ZERO_ADDRESS, ) - assert.equal(await ens.owner(namehash.hash('foo.test')), accounts[0]) - assert.equal(await ens.resolver(namehash.hash('foo.test')), accounts[1]) + assert.equal(await ens.owner(namehash('foo.test')), accounts[0]) + assert.equal(await ens.resolver(namehash('foo.test')), accounts[1]) }) it('does not allow anyone else to claim and set a resolver', async () => { @@ -214,7 +214,7 @@ contract('DNSRegistrar', function (accounts) { accounts[0], ) - assert.equal(await resolver.addr(namehash.hash('foo.test')), accounts[0]) + assert.equal(await resolver.addr(namehash('foo.test')), accounts[0]) }) it('forbids setting an address if the resolver is not also set', async () => { @@ -309,22 +309,22 @@ contract('DNSRegistrar', function (accounts) { // This is the expected use case. // Using the proof for `alice.test`, can claim `alice.test` - assert.equal(await ens.owner(namehash.hash('alice.test')), ZERO_ADDRESS) + assert.equal(await ens.owner(namehash('alice.test')), ZERO_ADDRESS) await registrar.proveAndClaim( utils.hexEncodeName('alice.test'), proofForAliceDotTest, ) - assert.equal(await ens.owner(namehash.hash('alice.test')), alice) + assert.equal(await ens.owner(namehash('alice.test')), alice) // Now using the same proof for `alice.test`, alice can also claim `foo.test`. Without a proof involving `foo.test` - assert.equal(await ens.owner(namehash.hash('foo.test')), ZERO_ADDRESS) + assert.equal(await ens.owner(namehash('foo.test')), ZERO_ADDRESS) await expect( registrar.proveAndClaim( utils.hexEncodeName('foo.test'), proofForAliceDotTest, ), ).to.be.revertedWith('NoOwnerRecordFound') - assert.equal(await ens.owner(namehash.hash('foo.test')), ZERO_ADDRESS) + assert.equal(await ens.owner(namehash('foo.test')), ZERO_ADDRESS) }) it('cannot takeover claimed DNS domains using unrelated proof', async function () { @@ -338,12 +338,12 @@ contract('DNSRegistrar', function (accounts) { ] // Alice claims her domain - assert.equal(await ens.owner(namehash.hash('alice.test')), ZERO_ADDRESS) + assert.equal(await ens.owner(namehash('alice.test')), ZERO_ADDRESS) await registrar.proveAndClaim( utils.hexEncodeName('alice.test'), proofForAliceDotTest, ) - assert.equal(await ens.owner(namehash.hash('alice.test')), alice) + assert.equal(await ens.owner(namehash('alice.test')), alice) // Build sample proof for a DNS record with name `bob.test` that bob owns const proofForBobDotTest = [ @@ -352,13 +352,13 @@ contract('DNSRegistrar', function (accounts) { ] // Bob claims alice's domain - assert.equal(await ens.owner(namehash.hash('alice.test')), alice) + assert.equal(await ens.owner(namehash('alice.test')), alice) await expect( registrar.proveAndClaim( utils.hexEncodeName('alice.test'), proofForBobDotTest, ), ).to.be.revertedWith('NoOwnerRecordFound') - assert.equal(await ens.owner(namehash.hash('alice.test')), alice) + assert.equal(await ens.owner(namehash('alice.test')), alice) }) }) diff --git a/test/dnsregistrar/TestOffchainDNSResolver.js b/test/dnsregistrar/TestOffchainDNSResolver.js index ef979d62..44354f6f 100644 --- a/test/dnsregistrar/TestOffchainDNSResolver.js +++ b/test/dnsregistrar/TestOffchainDNSResolver.js @@ -18,7 +18,7 @@ const DummyNonCCIPAwareResolver = artifacts.require( './DummyNonCCIPAwareResolver.sol', ) const DNSSECImpl = artifacts.require('./DNSSECImpl') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const utils = require('./Helpers/Utils') const { expect } = require('chai') const { rootKeys, hexEncodeSignedSet } = require('../utils/dnsutils.js') @@ -111,7 +111,7 @@ contract('OffchainDNSResolver', function (accounts) { const DNSGatewayInterface = new ethers.utils.Interface(IDNSGateway.abi) const dnsName = utils.hexEncodeName('test.test') const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash('test.test'), + namehash('test.test'), ).encodeABI() await expect( offchainDNSResolver.resolve(dnsName, callData), @@ -167,10 +167,10 @@ contract('OffchainDNSResolver', function (accounts) { it('handles calls to resolveCallback() with valid DNS TXT records containing an address', async function () { const name = 'test.test' const testAddress = '0xfefeFEFeFEFEFEFEFeFefefefefeFEfEfefefEfe' - await ownedResolver.setAddr(namehash.hash(name), testAddress) + await ownedResolver.setAddr(namehash(name), testAddress) const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const result = await doDNSResolveCallback( name, @@ -185,10 +185,10 @@ contract('OffchainDNSResolver', function (accounts) { it('handles calls to resolveCallback() with extra data and a legacy resolver', async function () { const name = 'test.test' const testAddress = '0xfefeFEFeFEFEFEFEFeFefefefefeFEfEfefefEfe' - await ownedResolver.setAddr(namehash.hash(name), testAddress) + await ownedResolver.setAddr(namehash(name), testAddress) const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const result = await doDNSResolveCallback( name, @@ -204,25 +204,22 @@ contract('OffchainDNSResolver', function (accounts) { // Configure dnsresolver.eth to resolve to the ownedResolver so we can use it in the test await root.setSubnodeOwner(ethers.utils.id('eth'), accounts[0]) await ens.setSubnodeOwner( - namehash.hash('eth'), + namehash('eth'), ethers.utils.id('dnsresolver'), accounts[0], ) - await ens.setResolver( - namehash.hash('dnsresolver.eth'), - ownedResolver.address, - ) + await ens.setResolver(namehash('dnsresolver.eth'), ownedResolver.address) await ownedResolver.setAddr( - namehash.hash('dnsresolver.eth'), + namehash('dnsresolver.eth'), ownedResolver.address, ) const name = 'test.test' const testAddress = '0xfefeFEFeFEFEFEFEFeFefefefefeFEfEfefefEfe' - await ownedResolver.setAddr(namehash.hash(name), testAddress) + await ownedResolver.setAddr(namehash(name), testAddress) const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const result = await doDNSResolveCallback( name, @@ -237,10 +234,10 @@ contract('OffchainDNSResolver', function (accounts) { it('rejects calls to resolveCallback() with an invalid TXT record', async function () { const name = 'test.test' const testAddress = '0xfefeFEFeFEFEFEFEFeFefefefefeFEfEfefefEfe' - await ownedResolver.setAddr(namehash.hash(name), testAddress) + await ownedResolver.setAddr(namehash(name), testAddress) const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() await expect( doDNSResolveCallback(name, ['nonsense'], callData), @@ -250,10 +247,10 @@ contract('OffchainDNSResolver', function (accounts) { it('handles calls to resolveCallback() where the valid TXT record is not the first', async function () { const name = 'test.test' const testAddress = '0xfefeFEFeFEFEFEFEFeFefefefefeFEfEfefefEfe' - await ownedResolver.setAddr(namehash.hash(name), testAddress) + await ownedResolver.setAddr(namehash(name), testAddress) const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const result = await doDNSResolveCallback( name, @@ -268,10 +265,10 @@ contract('OffchainDNSResolver', function (accounts) { it('respects the first record with a valid resolver', async function () { const name = 'test.test' const testAddress = '0xfefeFEFeFEFEFEFEFeFefefefefeFEfEfefefEfe' - await ownedResolver.setAddr(namehash.hash(name), testAddress) + await ownedResolver.setAddr(namehash(name), testAddress) const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const result = await doDNSResolveCallback( name, @@ -288,7 +285,7 @@ contract('OffchainDNSResolver', function (accounts) { const resolver = await DummyExtendedDNSSECResolver.new() const pr = await PublicResolver.at(resolver.address) const callData = pr.contract.methods['text']( - namehash.hash(name), + namehash(name), 'test', ).encodeABI() const result = await doDNSResolveCallback( @@ -307,7 +304,7 @@ contract('OffchainDNSResolver', function (accounts) { const resolver = await ExtendedDNSResolver.new() const pr = await PublicResolver.at(resolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const result = await doDNSResolveCallback( name, @@ -324,7 +321,7 @@ contract('OffchainDNSResolver', function (accounts) { const resolver = await ExtendedDNSResolver.new() const pr = await PublicResolver.at(resolver.address) const callData = pr.contract.methods['addr(bytes32,uint256)']( - namehash.hash(name), + namehash(name), COIN_TYPE_ETH, ).encodeABI() const result = await doDNSResolveCallback( @@ -342,7 +339,7 @@ contract('OffchainDNSResolver', function (accounts) { const resolver = await ExtendedDNSResolver.new() const pr = await PublicResolver.at(resolver.address) const callData = pr.contract.methods['addr(bytes32,uint256)']( - namehash.hash(name), + namehash(name), COIN_TYPE_BTC, ).encodeABI() const result = await doDNSResolveCallback( @@ -359,7 +356,7 @@ contract('OffchainDNSResolver', function (accounts) { const resolver = await ExtendedDNSResolver.new() const pr = await PublicResolver.at(resolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() await expect( doDNSResolveCallback( @@ -374,7 +371,7 @@ contract('OffchainDNSResolver', function (accounts) { const name = 'test.test' const resolver = await DummyLegacyTextResolver.new() const callData = resolver.contract.methods['text']( - namehash.hash(name), + namehash(name), 'test', ).encodeABI() const result = await doDNSResolveCallback( @@ -392,7 +389,7 @@ contract('OffchainDNSResolver', function (accounts) { const pr = await PublicResolver.at(offchainDNSResolver.address) const dnsName = utils.hexEncodeName('test.test') const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() const extraData = ethers.utils.defaultAbiCoder.encode( @@ -443,7 +440,7 @@ contract('OffchainDNSResolver', function (accounts) { const name = 'test.test' const pr = await PublicResolver.at(offchainDNSResolver.address) const callData = pr.contract.methods['addr(bytes32)']( - namehash.hash(name), + namehash(name), ).encodeABI() await expect( doDNSResolveCallback(name, [`ENS1 ${dummyResolver.address}`], callData), diff --git a/test/dnsregistrar/TestUniversalResolverWithDNS.js b/test/dnsregistrar/TestUniversalResolverWithDNS.js index d300b50c..ddcbe7a7 100644 --- a/test/dnsregistrar/TestUniversalResolverWithDNS.js +++ b/test/dnsregistrar/TestUniversalResolverWithDNS.js @@ -1,6 +1,6 @@ const { solidity } = require('ethereum-waffle') const { use, expect } = require('chai') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const { ethers } = require('hardhat') const { dns } = require('../test-utils') @@ -122,7 +122,7 @@ contract('UniversalResolver', function (accounts) { }) beforeEach(async () => { - node = namehash.hash('eth') + node = namehash('eth') ens = await deploy('ENSRegistry') root = await deploy('Root', ens.address) dnssec = await deploy('DNSSECImpl', encodeAnchors(anchors)) @@ -182,7 +182,7 @@ contract('UniversalResolver', function (accounts) { it('should revert OffchainLookup via universalResolver + offchainDNSresolver', async () => { const addrCallData = PublicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('test.test')], + [namehash('test.test')], ) const IDNSGatewayAbi = [ diff --git a/test/ethregistrar/TestBaseRegistrar.js b/test/ethregistrar/TestBaseRegistrar.js index a0c7efaf..3cc4cd46 100644 --- a/test/ethregistrar/TestBaseRegistrar.js +++ b/test/ethregistrar/TestBaseRegistrar.js @@ -3,7 +3,7 @@ const BaseRegistrar = artifacts.require( './registrar/BaseRegistrarImplementation', ) -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const toBN = require('web3-utils').toBN @@ -25,7 +25,7 @@ contract('BaseRegistrar', function (accounts) { before(async () => { ens = await ENS.new() - registrar = await BaseRegistrar.new(ens.address, namehash.hash('eth'), { + registrar = await BaseRegistrar.new(ens.address, namehash('eth'), { from: ownerAccount, }) await registrar.addController(controllerAccount, { from: ownerAccount }) @@ -40,10 +40,7 @@ contract('BaseRegistrar', function (accounts) { { from: controllerAccount }, ) var block = await web3.eth.getBlock(tx.receipt.blockHash) - assert.equal( - await ens.owner(namehash.hash('newname.eth')), - registrantAccount, - ) + assert.equal(await ens.owner(namehash('newname.eth')), registrantAccount) assert.equal(await registrar.ownerOf(sha3('newname')), registrantAccount) assert.equal( (await registrar.nameExpires(sha3('newname'))).toNumber(), @@ -59,7 +56,7 @@ contract('BaseRegistrar', function (accounts) { { from: controllerAccount }, ) var block = await web3.eth.getBlock(tx.receipt.blockHash) - assert.equal(await ens.owner(namehash.hash('silentname.eth')), ZERO_ADDRESS) + assert.equal(await ens.owner(namehash('silentname.eth')), ZERO_ADDRESS) assert.equal(await registrar.ownerOf(sha3('silentname')), registrantAccount) assert.equal( (await registrar.nameExpires(sha3('silentname'))).toNumber(), @@ -107,20 +104,13 @@ contract('BaseRegistrar', function (accounts) { it('should permit the owner to reclaim a name', async () => { await ens.setSubnodeOwner(ZERO_HASH, sha3('eth'), accounts[0]) - await ens.setSubnodeOwner( - namehash.hash('eth'), - sha3('newname'), - ZERO_ADDRESS, - ) - assert.equal(await ens.owner(namehash.hash('newname.eth')), ZERO_ADDRESS) + await ens.setSubnodeOwner(namehash('eth'), sha3('newname'), ZERO_ADDRESS) + assert.equal(await ens.owner(namehash('newname.eth')), ZERO_ADDRESS) await ens.setSubnodeOwner(ZERO_HASH, sha3('eth'), registrar.address) await registrar.reclaim(sha3('newname'), registrantAccount, { from: registrantAccount, }) - assert.equal( - await ens.owner(namehash.hash('newname.eth')), - registrantAccount, - ) + assert.equal(await ens.owner(namehash('newname.eth')), registrantAccount) }) it('should prohibit anyone else from reclaiming a name', async () => { @@ -140,10 +130,7 @@ contract('BaseRegistrar', function (accounts) { ) assert.equal(await registrar.ownerOf(sha3('newname')), otherAccount) // Transfer does not update ENS without a call to reclaim. - assert.equal( - await ens.owner(namehash.hash('newname.eth')), - registrantAccount, - ) + assert.equal(await ens.owner(namehash('newname.eth')), registrantAccount) await registrar.transferFrom( otherAccount, registrantAccount, @@ -202,6 +189,6 @@ contract('BaseRegistrar', function (accounts) { it('should allow the owner to set a resolver address', async () => { await registrar.setResolver(accounts[1], { from: ownerAccount }) - assert.equal(await ens.resolver(namehash.hash('eth')), accounts[1]) + assert.equal(await ens.resolver(namehash('eth')), accounts[1]) }) }) diff --git a/test/ethregistrar/TestBulkRenewal.js b/test/ethregistrar/TestBulkRenewal.js index a62ed6a4..582ffeff 100644 --- a/test/ethregistrar/TestBulkRenewal.js +++ b/test/ethregistrar/TestBulkRenewal.js @@ -9,13 +9,13 @@ const NameWrapper = artifacts.require('./wrapper/NameWrapper.sol') const { deploy } = require('../test-utils/contracts') const { EMPTY_BYTES32: EMPTY_BYTES } = require('../test-utils/constants') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const toBN = require('web3-utils').toBN const { exceptions } = require('../test-utils') const ETH_LABEL = sha3('eth') -const ETH_NAMEHASH = namehash.hash('eth') +const ETH_NAMEHASH = namehash('eth') contract('BulkRenewal', function (accounts) { let ens @@ -35,7 +35,7 @@ contract('BulkRenewal', function (accounts) { // Create a registry ens = await ENS.new() // Create a base registrar - baseRegistrar = await BaseRegistrar.new(ens.address, namehash.hash('eth'), { + baseRegistrar = await BaseRegistrar.new(ens.address, namehash('eth'), { from: ownerAccount, }) @@ -44,7 +44,7 @@ contract('BulkRenewal', function (accounts) { await ens.setSubnodeOwner(EMPTY_BYTES, sha3('reverse'), accounts[0]) await ens.setSubnodeOwner( - namehash.hash('reverse'), + namehash('reverse'), sha3('addr'), reverseRegistrar.address, ) diff --git a/test/ethregistrar/TestExponentialPremiumPriceOracle.js b/test/ethregistrar/TestExponentialPremiumPriceOracle.js index d84145d4..50caf26c 100644 --- a/test/ethregistrar/TestExponentialPremiumPriceOracle.js +++ b/test/ethregistrar/TestExponentialPremiumPriceOracle.js @@ -1,5 +1,5 @@ const { expect } = require('chai') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const toBN = require('web3-utils').toBN @@ -26,7 +26,7 @@ contract('ExponentialPricePremiumOracle', function (accounts) { before(async () => { ens = await ENS.new() - registrar = await BaseRegistrar.new(ens.address, namehash.hash('eth')) + registrar = await BaseRegistrar.new(ens.address, namehash('eth')) await ens.setSubnodeOwner('0x0', sha3('eth'), registrar.address) await registrar.addController(accounts[0]) diff --git a/test/ethregistrar/TestLinearPremiumPriceOracle.js b/test/ethregistrar/TestLinearPremiumPriceOracle.js index 3925677e..4b0557d4 100644 --- a/test/ethregistrar/TestLinearPremiumPriceOracle.js +++ b/test/ethregistrar/TestLinearPremiumPriceOracle.js @@ -3,7 +3,7 @@ const BaseRegistrar = artifacts.require('./BaseRegistrarImplementation') const DummyOracle = artifacts.require('./DummyOracle') const LinearPremiumPriceOracle = artifacts.require('./LinearPremiumPriceOracle') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const toBN = require('web3-utils').toBN @@ -14,7 +14,7 @@ contract('LinearPremiumPriceOracle', function (accounts) { before(async () => { ens = await ENS.new() - registrar = await BaseRegistrar.new(ens.address, namehash.hash('eth')) + registrar = await BaseRegistrar.new(ens.address, namehash('eth')) await ens.setSubnodeOwner('0x0', sha3('eth'), registrar.address) await registrar.addController(accounts[0]) diff --git a/test/ethregistrar/TestStaticBulkRenewal.js b/test/ethregistrar/TestStaticBulkRenewal.js index 3730c8be..d3c8d5d7 100644 --- a/test/ethregistrar/TestStaticBulkRenewal.js +++ b/test/ethregistrar/TestStaticBulkRenewal.js @@ -9,13 +9,13 @@ const NameWrapper = artifacts.require('./wrapper/NameWrapper.sol') const { deploy } = require('../test-utils/contracts') const { EMPTY_BYTES32: EMPTY_BYTES } = require('../test-utils/constants') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const toBN = require('web3-utils').toBN const { exceptions } = require('../test-utils') const ETH_LABEL = sha3('eth') -const ETH_NAMEHASH = namehash.hash('eth') +const ETH_NAMEHASH = namehash('eth') contract('StaticBulkRenewal', function (accounts) { let ens @@ -35,7 +35,7 @@ contract('StaticBulkRenewal', function (accounts) { // Create a registry ens = await ENS.new() // Create a base registrar - baseRegistrar = await BaseRegistrar.new(ens.address, namehash.hash('eth'), { + baseRegistrar = await BaseRegistrar.new(ens.address, namehash('eth'), { from: ownerAccount, }) @@ -44,7 +44,7 @@ contract('StaticBulkRenewal', function (accounts) { await ens.setSubnodeOwner(EMPTY_BYTES, sha3('reverse'), accounts[0]) await ens.setSubnodeOwner( - namehash.hash('reverse'), + namehash('reverse'), sha3('addr'), reverseRegistrar.address, ) diff --git a/test/registry/TestENS.js b/test/registry/TestENS.js index a3a338e7..f951b98b 100644 --- a/test/registry/TestENS.js +++ b/test/registry/TestENS.js @@ -1,4 +1,4 @@ -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const { exceptions } = require('../test-utils') @@ -86,7 +86,7 @@ contracts.forEach(function ([ENS, lang]) { from: accounts[0], }) - assert.equal(await ens.owner(namehash.hash('eth')), accounts[1]) + assert.equal(await ens.owner(namehash('eth')), accounts[1]) assert.equal(result.logs.length, 1) let args = result.logs[0].args diff --git a/test/registry/TestENSRegistryWithFallback.js b/test/registry/TestENSRegistryWithFallback.js index 6ab49508..38f1b143 100644 --- a/test/registry/TestENSRegistryWithFallback.js +++ b/test/registry/TestENSRegistryWithFallback.js @@ -1,4 +1,4 @@ -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const ENS = artifacts.require('ENSRegistryWithFallback.sol') @@ -35,7 +35,7 @@ contract('ENSRegistryWithFallback', function (accounts) { { from: accounts[0] }, ) - let hash = namehash.hash('test') + let hash = namehash('test') assert.equal(await ens.owner(hash), accounts[1]) assert.equal(await ens.resolver(hash), accounts[2]) assert.equal((await ens.ttl(hash)).toNumber(), 3600) @@ -48,7 +48,7 @@ contract('ENSRegistryWithFallback', function (accounts) { }) describe('fallback', async () => { - let hash = namehash.hash('eth') + let hash = namehash('eth') beforeEach(async () => { await old.setSubnodeOwner('0x0', sha3('eth'), accounts[0], { @@ -57,7 +57,7 @@ contract('ENSRegistryWithFallback', function (accounts) { }) it('should use fallback ttl if owner not set', async () => { - let hash = namehash.hash('eth') + let hash = namehash('eth') await old.setSubnodeOwner('0x0', sha3('eth'), accounts[0], { from: accounts[0], }) diff --git a/test/registry/TestFIFSRegistrar.js b/test/registry/TestFIFSRegistrar.js index 098fc334..a0057408 100644 --- a/test/registry/TestFIFSRegistrar.js +++ b/test/registry/TestFIFSRegistrar.js @@ -3,7 +3,7 @@ const ENS = artifacts.require('./registry/ENSRegistry.sol') const { exceptions } = require('../test-utils') const sha3 = require('web3-utils').sha3 -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') contract('FIFSRegistrar', function (accounts) { let registrar, ens @@ -18,7 +18,7 @@ contract('FIFSRegistrar', function (accounts) { it('should allow registration of names', async () => { await registrar.register(sha3('eth'), accounts[0], { from: accounts[0] }) assert.equal(await ens.owner('0x0'), registrar.address) - assert.equal(await ens.owner(namehash.hash('eth')), accounts[0]) + assert.equal(await ens.owner(namehash('eth')), accounts[0]) }) describe('transferring names', async () => { @@ -28,7 +28,7 @@ contract('FIFSRegistrar', function (accounts) { it('should allow transferring name to your own', async () => { await registrar.register(sha3('eth'), accounts[1], { from: accounts[0] }) - assert.equal(await ens.owner(namehash.hash('eth')), accounts[1]) + assert.equal(await ens.owner(namehash('eth')), accounts[1]) }) it('forbids transferring the name you do not own', async () => { diff --git a/test/registry/TestTestRegistrar.js b/test/registry/TestTestRegistrar.js index 3c4f4826..99e4e815 100644 --- a/test/registry/TestTestRegistrar.js +++ b/test/registry/TestTestRegistrar.js @@ -2,7 +2,7 @@ const TestRegistrar = artifacts.require('./registry/TestRegistrar.sol') const ENS = artifacts.require('./registry/ENSRegistry.sol') const { exceptions, evm } = require('../test-utils') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 contract('TestRegistrar', function (accounts) { @@ -10,7 +10,7 @@ contract('TestRegistrar', function (accounts) { let registrar, ens beforeEach(async () => { - node = namehash.hash('eth') + node = namehash('eth') ens = await ENS.new() registrar = await TestRegistrar.new(ens.address, '0x0') diff --git a/test/resolvers/TestExtendedDNSResolver.js b/test/resolvers/TestExtendedDNSResolver.js index 0916c19d..58dbddf5 100644 --- a/test/resolvers/TestExtendedDNSResolver.js +++ b/test/resolvers/TestExtendedDNSResolver.js @@ -1,5 +1,5 @@ const ExtendedDNSResolver = artifacts.require('ExtendedDNSResolver.sol') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const { expect } = require('chai') const packet = require('dns-packet') @@ -19,7 +19,7 @@ contract('ExtendedDNSResolver', function (accounts) { }) async function resolve(name, method, args, context) { - const node = namehash.hash(name) + const node = namehash(name) const callData = PublicResolver.interface.encodeFunctionData(method, [ node, ...args, diff --git a/test/resolvers/TestPublicResolver.js b/test/resolvers/TestPublicResolver.js index 5c9a7394..f75ff39d 100644 --- a/test/resolvers/TestPublicResolver.js +++ b/test/resolvers/TestPublicResolver.js @@ -9,7 +9,7 @@ const { } = require('../test-utils/constants') const { expect } = require('chai') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const { exceptions } = require('../test-utils') @@ -24,7 +24,7 @@ contract('PublicResolver', function (accounts) { beforeEach(async () => { signers = await ethers.getSigners() account = await signers[0].getAddress() - node = namehash.hash('eth') + node = namehash('eth') ens = await ENS.new() nameWrapper = await NameWrapper.new() @@ -34,7 +34,7 @@ contract('PublicResolver', function (accounts) { await ens.setSubnodeOwner(ROOT_NODE, labelhash('reverse'), account) await ens.setSubnodeOwner( - namehash.hash('reverse'), + namehash('reverse'), labelhash('addr'), ReverseRegistrar.address, ) @@ -1033,7 +1033,7 @@ contract('PublicResolver', function (accounts) { it('returns 0 when fetching unset interface', async () => { assert.equal( - await resolver.interfaceImplementer(namehash.hash('foo'), '0x12345678'), + await resolver.interfaceImplementer(namehash('foo'), '0x12345678'), '0x0000000000000000000000000000000000000000', ) }) diff --git a/test/reverseRegistrar/TestReverseRegistrar.js b/test/reverseRegistrar/TestReverseRegistrar.js index bb91da0d..4d50fd4c 100644 --- a/test/reverseRegistrar/TestReverseRegistrar.js +++ b/test/reverseRegistrar/TestReverseRegistrar.js @@ -1,4 +1,4 @@ -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('web3-utils').sha3 const PublicResolver = artifacts.require('./resolvers/PublicResolver.sol') const ReverseRegistrar = artifacts.require('./registry/ReverseRegistrar.sol') @@ -36,7 +36,7 @@ contract('ReverseRegistrar', function (accounts) { from: accounts[0], }) await ens.setSubnodeOwner( - namehash.hash('reverse'), + namehash('reverse'), sha3('addr'), registrar.address, { from: accounts[0] }, diff --git a/test/root/TestRoot.js b/test/root/TestRoot.js index 086c2f55..306907f7 100644 --- a/test/root/TestRoot.js +++ b/test/root/TestRoot.js @@ -2,7 +2,7 @@ const Root = artifacts.require('./Root.sol') const ENS = artifacts.require('@ensdomains/ens/contracts/ENSRegistry.sol') const { exceptions, evm } = require('@ensdomains/test-utils') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const sha3 = require('js-sha3').keccak_256 contract('Root', function (accounts) { @@ -12,7 +12,7 @@ contract('Root', function (accounts) { let now = Math.round(new Date().getTime() / 1000) beforeEach(async function () { - node = namehash.hash('eth') + node = namehash('eth') ens = await ENS.new() root = await Root.new(ens.address) diff --git a/test/test-utils/ens.js b/test/test-utils/ens.js index f8109273..caaf4552 100644 --- a/test/test-utils/ens.js +++ b/test/test-utils/ens.js @@ -2,7 +2,7 @@ const { utils, BigNumber: BN } = ethers const packet = require('dns-packet') const labelhash = (label) => utils.keccak256(utils.toUtf8Bytes(label)) -const namehash = require('eth-ens-namehash').hash +const { namehash } = require('viem/ens').hash function encodeName(name) { return '0x' + packet.name.encode(name).toString('hex') } diff --git a/test/test-utils/reverse.js b/test/test-utils/reverse.js index 247b778b..c5e62f20 100644 --- a/test/test-utils/reverse.js +++ b/test/test-utils/reverse.js @@ -1,7 +1,7 @@ -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') function getReverseNode(addr) { - return namehash.hash(addr.slice(2).toLowerCase() + '.addr.reverse') + return namehash(addr.slice(2).toLowerCase() + '.addr.reverse') } module.exports = { getReverseNode, diff --git a/test/utils/TestUniversalResolver.js b/test/utils/TestUniversalResolver.js index c805ecfe..7de04d66 100644 --- a/test/utils/TestUniversalResolver.js +++ b/test/utils/TestUniversalResolver.js @@ -1,6 +1,6 @@ const { solidity } = require('ethereum-waffle') const { use, expect } = require('chai') -const namehash = require('eth-ens-namehash') +const { namehash } = require('viem/ens') const { hexDataSlice, concat } = require('ethers/lib/utils') const sha3 = require('web3-utils').sha3 const { Contract } = require('ethers') @@ -58,7 +58,7 @@ contract('UniversalResolver', function (accounts) { }) beforeEach(async () => { - node = namehash.hash('eth') + node = namehash('eth') ens = await deploy('ENSRegistry') nameWrapper = await deploy('DummyNameWrapper') reverseRegistrar = await deploy('ReverseRegistrar', ens.address) @@ -69,7 +69,7 @@ contract('UniversalResolver', function (accounts) { from: accounts[0], }) await ens.setSubnodeOwner( - namehash.hash('reverse'), + namehash('reverse'), sha3('addr'), reverseRegistrar.address, { from: accounts[0] }, @@ -91,52 +91,49 @@ contract('UniversalResolver', function (accounts) { await ens.setSubnodeOwner(EMPTY_BYTES32, sha3('eth'), accounts[0], { from: accounts[0], }) - await ens.setSubnodeOwner(namehash.hash('eth'), sha3('test'), accounts[0], { + await ens.setSubnodeOwner(namehash('eth'), sha3('test'), accounts[0], { from: accounts[0], }) - await ens.setResolver(namehash.hash('test.eth'), publicResolver.address, { + await ens.setResolver(namehash('test.eth'), publicResolver.address, { from: accounts[0], }) - await ens.setSubnodeOwner( - namehash.hash('test.eth'), - sha3('sub'), - accounts[0], - { from: accounts[0] }, - ) - await ens.setResolver(namehash.hash('sub.test.eth'), accounts[1], { + await ens.setSubnodeOwner(namehash('test.eth'), sha3('sub'), accounts[0], { + from: accounts[0], + }) + await ens.setResolver(namehash('sub.test.eth'), accounts[1], { from: accounts[0], }) await publicResolver.functions['setAddr(bytes32,address)']( - namehash.hash('test.eth'), + namehash('test.eth'), accounts[1], { from: accounts[0] }, ) await publicResolver.functions['setText(bytes32,string,string)']( - namehash.hash('test.eth'), + namehash('test.eth'), 'foo', 'bar', { from: accounts[0] }, ) await ens.setSubnodeOwner( - namehash.hash('test.eth'), + namehash('test.eth'), sha3('offchain'), accounts[0], { from: accounts[0] }, ) await ens.setSubnodeOwner( - namehash.hash('test.eth'), + namehash('test.eth'), sha3('no-resolver'), accounts[0], { from: accounts[0] }, ) await ens.setSubnodeOwner( - namehash.hash('test.eth'), + namehash('test.eth'), sha3('revert-resolver'), accounts[0], { from: accounts[0] }, ) await ens.setSubnodeOwner( - namehash.hash('test.eth'), + namehash('test.eth'), sha3('non-contract-resolver'), accounts[0], { from: accounts[0] }, @@ -145,26 +142,23 @@ contract('UniversalResolver', function (accounts) { for (let i = 0; i < 5; i += 1) { const parent = name const label = `sub${i}` - await ens.setSubnodeOwner( - namehash.hash(parent), - sha3(label), - accounts[0], - { from: accounts[0] }, - ) + await ens.setSubnodeOwner(namehash(parent), sha3(label), accounts[0], { + from: accounts[0], + }) name = `${label}.${parent}` } await ens.setResolver( - namehash.hash('offchain.test.eth'), + namehash('offchain.test.eth'), dummyOffchainResolver.address, { from: accounts[0] }, ) await ens.setResolver( - namehash.hash('revert-resolver.test.eth'), + namehash('revert-resolver.test.eth'), dummyRevertResolver.address, { from: accounts[0] }, ) await ens.setResolver( - namehash.hash('non-contract-resolver.test.eth'), + namehash('non-contract-resolver.test.eth'), accounts[0], { from: accounts[0] }, ) @@ -172,10 +166,10 @@ contract('UniversalResolver', function (accounts) { await reverseRegistrar.claim(accounts[0], { from: accounts[0], }) - await ens.setResolver(namehash.hash(reverseNode), publicResolver.address, { + await ens.setResolver(namehash(reverseNode), publicResolver.address, { from: accounts[0], }) - await publicResolver.setName(namehash.hash(reverseNode), 'test.eth') + await publicResolver.setName(namehash(reverseNode), 'test.eth') const oldResolverSigner = await ethers.getSigner(accounts[10]) const _reverseRegistrar = reverseRegistrar.connect(oldResolverSigner) @@ -183,7 +177,7 @@ contract('UniversalResolver', function (accounts) { await _reverseRegistrar.claim(accounts[10]) await _ens.setResolver( - namehash.hash(oldResolverReverseNode), + namehash(oldResolverReverseNode), dummyOldResolver.address, ) }) @@ -248,7 +242,7 @@ contract('UniversalResolver', function (accounts) { it('should resolve a record via legacy methods', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('test.eth')], + [namehash('test.eth')], ) const result = await universalResolver['resolve(bytes,bytes)']( @@ -265,7 +259,7 @@ contract('UniversalResolver', function (accounts) { it('should throw if a resolver is not set on the queried name', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('no-resolver.test.other')], + [namehash('no-resolver.test.other')], ) await expect( @@ -279,7 +273,7 @@ contract('UniversalResolver', function (accounts) { it('should throw if a resolver is not a contract', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('non-contract-resolver.test.eth')], + [namehash('non-contract-resolver.test.eth')], ) await expect( @@ -293,7 +287,7 @@ contract('UniversalResolver', function (accounts) { it('should throw with revert data if resolver reverts', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('revert-resolver.test.eth')], + [namehash('revert-resolver.test.eth')], ) try { @@ -323,7 +317,7 @@ contract('UniversalResolver', function (accounts) { it('should throw if a resolver is not set on the queried name, and the found resolver does not support resolve()', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('no-resolver.test.eth')], + [namehash('no-resolver.test.eth')], ) await expect( @@ -336,20 +330,15 @@ contract('UniversalResolver', function (accounts) { it('should resolve a record if `supportsInterface` throws', async () => { const legacyResolver = await LegacyResolver.deploy() - await ens.setSubnodeOwner( - namehash.hash('eth'), - sha3('test2'), - accounts[0], - { from: accounts[0] }, - ) - await ens.setResolver( - namehash.hash('test2.eth'), - legacyResolver.address, - { from: accounts[0] }, - ) + await ens.setSubnodeOwner(namehash('eth'), sha3('test2'), accounts[0], { + from: accounts[0], + }) + await ens.setResolver(namehash('test2.eth'), legacyResolver.address, { + from: accounts[0], + }) const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('test.eth')], + [namehash('test.eth')], ) const result = await universalResolver['resolve(bytes,bytes)']( dns.hexEncodeName('test2.eth'), @@ -364,20 +353,15 @@ contract('UniversalResolver', function (accounts) { it('should not run out of gas if calling a non-existent function on a legacy resolver', async () => { const legacyResolver = await LegacyResolver.deploy() - await ens.setSubnodeOwner( - namehash.hash('eth'), - sha3('test2'), - accounts[0], - { from: accounts[0] }, - ) - await ens.setResolver( - namehash.hash('test2.eth'), - legacyResolver.address, - { from: accounts[0] }, - ) + await ens.setSubnodeOwner(namehash('eth'), sha3('test2'), accounts[0], { + from: accounts[0], + }) + await ens.setResolver(namehash('test2.eth'), legacyResolver.address, { + from: accounts[0], + }) const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32,uint256)', - [namehash.hash('test.eth'), 60], + [namehash('test.eth'), 60], ) try { await universalResolver['resolve(bytes,bytes)']( @@ -395,7 +379,7 @@ contract('UniversalResolver', function (accounts) { it('should return a wrapped revert if the resolver reverts with OffchainLookup', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('offchain.test.eth')], + [namehash('offchain.test.eth')], ) // OffchainLookup(address sender, string[] urls, bytes callData, bytes4 callbackFunction, bytes extraData) @@ -441,7 +425,7 @@ contract('UniversalResolver', function (accounts) { it('should use custom gateways when specified', async () => { const data = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('offchain.test.eth')], + [namehash('offchain.test.eth')], ) try { await universalResolver['resolve(bytes,bytes,string[])']( @@ -460,7 +444,7 @@ contract('UniversalResolver', function (accounts) { it('should return a wrapped revert with resolve() wrapped calls in extraData when combining onchain and offchain lookups', async () => { const addrData = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('offchain.test.eth')], + [namehash('offchain.test.eth')], ) const onchainDataCall = '0x12345678' @@ -518,11 +502,11 @@ contract('UniversalResolver', function (accounts) { it('should resolve multiple records onchain', async () => { const textData = publicResolver.interface.encodeFunctionData( 'text(bytes32,string)', - [namehash.hash('test.eth'), 'foo'], + [namehash('test.eth'), 'foo'], ) const addrData = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('test.eth')], + [namehash('test.eth')], ) const [[textResultEncoded, addrResultEncoded]] = await universalResolver['resolve(bytes,bytes[])']( @@ -545,11 +529,11 @@ contract('UniversalResolver', function (accounts) { it('should resolve multiple records offchain', async () => { const textData = publicResolver.interface.encodeFunctionData( 'text(bytes32,string)', - [namehash.hash('offchain.test.eth'), 'foo'], + [namehash('offchain.test.eth'), 'foo'], ) const addrData = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('offchain.test.eth')], + [namehash('offchain.test.eth')], ) const callData = batchGateway.encodeFunctionData('query', [ [ @@ -607,7 +591,7 @@ contract('UniversalResolver', function (accounts) { it('should resolve a record via a callback from offchain lookup', async () => { const addrData = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('offchain.test.eth')], + [namehash('offchain.test.eth')], ) const extraData = ethers.utils.defaultAbiCoder.encode( ['bool', 'address', 'string[]', 'bytes', '(bytes4,bytes)[]'], @@ -680,11 +664,11 @@ contract('UniversalResolver', function (accounts) { it('should resolve records via a callback from offchain lookup', async () => { const addrData = publicResolver.interface.encodeFunctionData( 'addr(bytes32)', - [namehash.hash('offchain.test.eth')], + [namehash('offchain.test.eth')], ) const textData = publicResolver.interface.encodeFunctionData( 'text(bytes32,string)', - [namehash.hash('offchain.test.eth'), 'foo'], + [namehash('offchain.test.eth'), 'foo'], ) const extraData = ethers.utils.defaultAbiCoder.encode( ['bool', 'address', 'string[]', 'bytes', '(bytes4,bytes)[]'], @@ -747,7 +731,7 @@ contract('UniversalResolver', function (accounts) { ) const textData = publicResolver.interface.encodeFunctionData( 'text(bytes32,string)', - [namehash.hash('offchain.test.eth'), 'foo'], + [namehash('offchain.test.eth'), 'foo'], ) const extraData = ethers.utils.defaultAbiCoder.encode( ['bool', 'address', 'string[]', 'bytes', '(bytes4,bytes)[]'], @@ -785,11 +769,11 @@ contract('UniversalResolver', function (accounts) { it('should gracefully handle a non-existent function on an offchain resolver', async () => { const addrData = publicResolver.interface.encodeFunctionData( 'addr(bytes32,uint256)', - [namehash.hash('offchain.test.eth'), 60], + [namehash('offchain.test.eth'), 60], ) const textData = publicResolver.interface.encodeFunctionData( 'text(bytes32,string)', - [namehash.hash('offchain.test.eth'), 'foo'], + [namehash('offchain.test.eth'), 'foo'], ) const extraData = ethers.utils.defaultAbiCoder.encode( ['bool', 'address', 'string[]', 'bytes', '(bytes4,bytes)[]'], diff --git a/test/wrapper/BytesUtils.js b/test/wrapper/BytesUtils.js index e5290dbc..0b75795a 100644 --- a/test/wrapper/BytesUtils.js +++ b/test/wrapper/BytesUtils.js @@ -2,7 +2,7 @@ const packet = require('dns-packet') const { expect } = require('chai') const { ethers } = require('hardhat') const { utils, BigNumber: BN } = ethers -const namehash = require('eth-ens-namehash').hash +const { namehash } = require('viem/ens').hash const NULL_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000' diff --git a/test/wrapper/ERC1155.behaviour.js b/test/wrapper/ERC1155.behaviour.js index 11282d40..05cbfd82 100644 --- a/test/wrapper/ERC1155.behaviour.js +++ b/test/wrapper/ERC1155.behaviour.js @@ -2,7 +2,7 @@ // Copyright (c) 2016-2020 zOS Global Limited // Portions Copyright (c) 2021 Nick Johnson -const namehash = require('eth-ens-namehash').hash +const { namehash } = require('viem/ens').hash const { BN, constants, expectEvent } = require('@openzeppelin/test-helpers') const { ZERO_ADDRESS } = constants const { ethers } = require('hardhat') diff --git a/typings-custom/eth-ens-namehash.d.ts b/typings-custom/eth-ens-namehash.d.ts deleted file mode 100644 index f6af2ca9..00000000 --- a/typings-custom/eth-ens-namehash.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'eth-ens-namehash' From 71b9885915bd3a2cdbf9725aab84aba71d86f051 Mon Sep 17 00:00:00 2001 From: v1rtl Date: Thu, 13 Jun 2024 16:34:59 +0300 Subject: [PATCH 2/4] remove dependency on envfile --- bun.lockb | Bin 578604 -> 578268 bytes package.json | 1 - tasks/seed.ts | 22 ++++++++-------------- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/bun.lockb b/bun.lockb index f22889004f5025c27921c066d1a1a38e3adca86b..afa02e8a0191ef76946ec7c482db94d15efb3429 100755 GIT binary patch delta 52769 zcmeIbdAvk{Y)Ofy zDwaJu<-wWzYVS?ic_Jpy{xv6SG<_oOy(b=gdE9fYk9B@)Mbk;mKTPtpg{HSH5)(V% zr2E)fhdn>);`&)jcn@|IoCdX{kdtqh~_@eNd#FcktP5 zw~p>Hpr86+$Z7;tV4-pMAww!W*t_e{JBLIP?t#_VZUYAN?bdZjYJsAj@An8#FI^<` z!O(!0kI*f!8e3?1Bvp4^_+2>`R&_=g_a9K9JDGY#%^v_OU8?!*V2z%Z zrZVU_{Rvp!~UyszDY5h~j zPKv~CKRMFQzNy3eYy7svSG+pLjbWwtkA}1%-Uv%qn>wg{1JinrRJzLeN>|#rSKk5M zx{dV0DK{1f-8MCnN2O_zvU+wMGIS7W2B!`iqU0fTwYvTjk+C@y))Y|G;`c}!TtWHO zxiykc4f4}Yt6-e?R3zU5l&xNzi?4l>);~>Ei}A9A({C&iDnoZ_Y!!l)+=C0jKh20F z>)I`C=t$;@V`Cyie`wckeKm93@N}eU55PKf^1!NI*9V3xd$0CWo`0zA4@auez1x7n z()$nSnbvn`>fnv!SBBmn9mXg{!u;Wp<$9I<<=KE&3~%b}fL9P6ICwz6fkTIQ73V~X z>(e)NnDQAH4wf&{Iy&t|r^AMX=y={UFLI#VI6u< zI0R3{#fMwpmlAv#uWlsf;gp!GZCtZqfm?$0?~PPGCY)n_N^mfqDjyr3-aaMxCSGm4 zKsX29WxPhw^uY#gBb^Z!&M_k;_z0d#iVLSx?k2oQ?bT7=;nfJY=u$hrOgmz^z4rv_ zBw?xPfpGf3l;BD{)jFsSjQP5qYc?WqOZ-UA2$jRr9;+R{0;{HP9sk2B*dgFG^|e&2 zw!XC)>ki*a>`1TpRx_;DzBLD{wr_om)!w&mx-XjIA*>eCf;+Lao9XT8De=GHwee@gIIy!xuE%W-cYCI0rV0k2xP z#q!$m4`caV7F>sQ6Hz$+>FOWxlpt2aJXoz;z~dk?ZvBQjV$f9STr)4;%6o)R2~rw*klLs9~7 zy5KnaYz*g&y5YU|)sBAytATG_#cJ(at$M0g6gmg%HsAUjtFmup>!n63w8LN)z(m7jlCNL%m}}i7CD;N_B_yib1Jhh^3bWZUL>)t#8@~-tF=#yu{72= zyF8l`Xy$@5>9#qKL~BF6<6}kzyt`c1nSt8DftY{f8NV8@Svc$A+QICPMvsT|;Y>w% zkzJu)ABv|sdSOO$;58SV9jF)c)1$80Y!0icAr9wApyTX|caQI-A5IB=jHfCmg>$@F zBWZM`r~UB|Y>20N_~Sb`7B4b*)yT5cWo@hJHW=Ge$d>|$GY}C~;7rzIuR(Nk(?O?)Vk@|Sy^jA}YZSho} z$Vh$?Pm^zKIDJS;aDT?I*v#Vt;X59$8@zLTr2p6p9Py9hssE_S6Dh%0@KXHr)9IqT ze5%%n<3MHRX^zJ{)xCD`Nvy~yrO#syO>mhO1#Sscbxjx1ivAO$V~uJDmbu*$4CrH58NIBTd)Go{M<;e8@z|0n&VG^mCx*yhri;j&XqI^lB0eB}gQt42o7$(u z*XJXCy>QkyY6oVx$xAs0?m)QNpW}bS(r2#7XOZT7CtyD2d^88kK0ggfi9d!{FT8hm zounrtoyU;lFl>jXQfLVEnSmEM>NRlp;b})RKQmPG@nu01db|$p_;z@a>2*1l4yVWv z{uZwy9z$hiO0dH8=%J>z55S9bE$8y!61>RpR#~6msj?iD@3V(yM2^D5aE`+%fxfQk zN_Oz`h^>jj4n9;PDI6KZ9DZF>0=K*1Dq=i}*d`K#QF|Ou1thri9PE{fPe=BO-_rQu zc=f~6w$@3)P{DjgC@22oH&Yb0*iOfThW9DHz&2l6Trv$g-Y43B+q3S>2X*9;V z^n8IDanA<4-Z}yTVHaG(j=I?~hq$b30=45G$K<2e1U|Q5ah~d2JNUCSrS?DW+&DAf zRmIEX(rb|yUiI+a7itIRW0m(yRQd1XMdlDbKE+&~>6*R5v6bQ`zd|PrnicSx6P1c@ zNeOPjQ&ofh>G3RHqwwB#wd1SI4tO0RwOWSRDq>#5yg8gTTsv4}&L3k~Qzo7YjC|yO z0Z*O5-rc9Z zyS>lxQER?`8t7I#xD2Zy`7o&8ND2Oo7dd`8GUBT&zza`1RXf-p%Z4~RVx4r-F!n~J z#C*5FHQNxVRe*1<`u6GtKw+TGXE%OBph$@C?E2ElmtW7j5hz+Y^D7wh(b(TIax4m6 z;>Tx?`P<(y-~H7PKORS^zh&UiUxoiOUk#ye{D!f&{Ox~oN6(8Rhymko{|zgCE1=#P z1=MqqW<*#8j|QH*vXKr}@Hn|_8Ce}a)mI~|WYf(5Z#bT~Gl0^CK?0Zsw27t9rV@)c z1#(nYCFTKbf5!@6;D<&y;J)4zD8i}bCn%&AzhI$aWxdpVv8uAt{QriPeicxuFIl>b zoEvRBP`Nv!or~db|HO&Jc;DiQHAvHe3j7dg``@tAAMi>&o=<_k9^zx2zhz`ee2ViU@Hx%j{*D#IhcaDg z_V^6oZy8w);1urX!)e*y#M0+Q{E%;G7d(fco>*eM43@qM&IGTAwf$dmtj-jhEMu_> z+zLzD#y^ebopSykS^4d;^ch(_b^tw=^1Xu=K`ir-0^rZgKVtkjtgib4RtBd`KMkv( z^A>)={GVYp;EMS%Bv!i2um*7sSmV#jiNT+jTmSyTT$J{TqpLzCVXnY?m0+dQc}%0a zI;>5siqx|3+NS>l=kycQC!%W9SP9*{w*vWcsJ!NuPYdPawjigexVz*U%fHurvD(`S zR`oiY{@<{Q>uTw`DV?jkJ&;d($Lns{WMpOE!=k4e_q2Foh4(V%l7UHVYRkydkXgjbRmdhw05>ZDPf1VZL$buY&Ju(DWgq_VFM~AXWy0jfa>n zR)rokUo8J&^Tn#zC}Z`w{4uc3&fZuI{=D(Nz-X1jCRTwHVGXi5ri-P|HD9a(7n+}u zRnT*$i$xs37EkLY@8(?Ly$@KphR?;o})2#RotbBJ`eqzm#-fk1b0oQ3K z(}Lpd!BxZd!HTh8|Nadtn*$auR=Pv5^7+*Czhea*vG5EWIV>{>en%X&h#6T09XI{& zSQYq+aLwxHEuL5(5q^O+#IBhBC)>0jK^goGYu=4lX@6l!LH>!eT6jiQ`s>ie*(_Wv zKf7@bSUs4_{M`OGAcWiqDmWR|CRW0N#)V85>!>RZE2A4Myd;(ku{jRqpKo4 zj8iRMMpk%FboGFLUNu&W`&)dm;teog%-7KV?*^_5Dc&%A?SV%u-YDZoVbyOmtW7L` zEUdBhxak>LVA>I7_Fn``B<{vUX3@hF-^N+*I?;GP&Fn``z z{wd${rhgBs!awLBP=cRf?TX(l;4-WPzng#6`~ZH?*%x#&86_!5(RusoSRe!eeJmZDNi;Z7^)lJJ_6~EGWjq$p88(|oJ zgblDNve9@GtW7Nabyyj0fmMNR=D%hB4p;^4Hh&MSbbHO;XT0C|<9HikhY)nk9D`NB zaf|Q`tWB(pPM9xNkDN7MEdK{s@qRR2Ed5tl`Cc~u9ag-nZp{0ET>egoRXjGag5r$h zVSSR!1}lpk#<^f^V#UvGzF6_{nlF~0-}rjdGjQYrK`{#uE5qXEi#7k0h1ExuP0z?G zpsML&`PE_NbF=AU?X;Sv*MgOAg9JO*HL!?cMQmukSQ#}kU###Z=KmdQ6g0PZEn!7% zV}3j1j<71)DWp&tunOu7t7fS%JIZ?iR)+my{=A|5Qw1J`6@P?8V`cb|=?|O!cdVc> z{L|4LdICf9hBICWtANGkuY{HHYFGun1Zxv3-Ydqhnl4uS^~M`b&&bMW6FLnHd0Q>w zo5tHMfmokg-Zx(?{}8MK4#NsMW_-f*Q?M#_#{6^UUoig%hi3x3d&}FE?5;P4D;ue)IVdjs1&~9mx1M%weXBA{YG@fbM5_4ik>O8*+xCRX|r#-}X&wDGsFwhSEd6P&dK z=PlxQ#us2scDaH!OY`$0tvY0Pc%d^9Z zmlM_y&I2o6URc}Tv8K%;madqkyP=0AENKZdvI;7TF0NqlDjMGetKcfIDpJk#>c%&l zUPHd?_c8YvG+r9xYRkw0H;v$sLR#`q-Epr)6Kk%!A69AIVKq~=)+Sc%dc&&41EyzW z4#dp;l?9irGF%enMDy)3l%WhB8)YE9IPEb$^6N%rjRFLZDOT+%6zdZKHL0^ ztO_kcSA`c__+kwNW$?TS8CeluFkP&8OU=*7YQPF~#b0UhR#`l;(yg}eHKvO-FgE)A zFT)~kf_43GH>?`(GycT*b6A^LEj?+zSY3JsR*zkPRq*$)D)W|nH*RJb++i7r)v}hb z;pO7E!E>UpHT@c$>}tCsu)5 zE&eu(FV>!Z8&>#Ee}#q&iy&43yUZ8M-);P^=^0tOAl>wgtaKk*y8RZOk#*FEju4;> zzJgV=ldx*`Ev%M*2djs^H~!K1XIKUN0xSLRu;Ry(tI{XHN|yvHUJzFPSz&Er^pJO* z31VfCD-z)4hBd!j59>2TDOkIvqVdhJ3aA0|=iRD*#?l*Fcw^JWs#sH4pF!^Rb@qS6 zh_Dj2vjl&~YDs$w7c0a2V5RG9x>(aoUsyde#KMQcNP$>F|fL5Jgkf- z!RnD|unKq*R=j6Tp93r2d<$O)EB*7Z3R(iI2VaEMgX>}S;8x?Ea0qzm{8It@jSs-e z_#n(~^^U>X{)v_TxWyAI{Ws=|Rgp91i&c>yGuiQv;ctJ(YVmJ`tAH!8TK2oe7t6nD zzF0jF%j~2IBp3%_RUn&YEo1d;?#%SRGRR{A8CiK2L07@WEIcDiFM+OtO2Nvfw8azW z#II?3Ez`wHSI6|aGPKpTfO-~C-~3z6zs>wc#VQEe41ojg$QOZp{z{YKxVo4(0oF)* zQo-<3u*c$;$E?|#ELg1I*UcAe|86rsBTL_5x>)|Z zu+qP0x>(~S-F&f{yB}7(k1~73A>a779B}bp28y&-w|{Q={2ivU#xOZ zntsZ3pWQIB_phg&F)vl~G4n zTSiv8`%D+h*H*|NUw19EWn}5@sSSbL{)dP%cq-vWppbIrS1`T_)|QdggepMs|899F zvaerT=1E74Q*W?kWDVA-zItt$C*AOpb%j{d`*xtiWv4#qX~Xche_|cj?^`^v2I;kB zp4XOn7S$}p247p|896L6F7H&=$k#a_eO^? znP+6qxwg!+mWBh{wPl{ymU&)V=4l7RwPl{ymU&)V=E;{}eS5jK%=6kZPyZvrwPl`k z!?k6e*Oqx+TjqIfnP(k@4Wu6(Ad+PJUwPl`>YYo?yd0t!Q>3^Ue%~fq( z@V>Up^V%}cvbq_|Ce}UvYs);l&=c2|d0t!Q$tCG)%RH|w^SrjqGvo43ohsyCTju$% z%RTiyGJDMWk=bJlj&WzF$KDa>>T1r2 zZR={xh|TKe%|PhxPDwZ^p+y)W)y)bc%nT!3kkEnkSRY#~C{MF`Ve`$Y)t79nhr@T3bqhmiCfLciw_rn`+2Hb^M6 z7$NM^79;dtjIdY2Gp@k%2>G8!81+1YbGs$%l2Bm@!Yns(3Brga2uCE$ab;gXDDwis zv=t65ez**CNzdi!g63!ghB` z!bu4&)*@|d}>k;<4 z_UjSatw-1*;R6@kfRMBSq2C6CbhlB$1_^~WBJ6i*8xeYMMA$3gfGe;GA^#?XQJWAx zal0k#l2GAwghOuR>j)!WM>rzkuq(S6q0DB4X`2y_xI+>SN~pU9;i#Lu1!2+_gtHQk zxtebv)OZ77-Wv$V-6;ttCA8Rz@U@$@6=CL9gewwGxTf0>nruT@wGH8vyCmVFgidcF zeCw9KiLmTVgsg8NoOSKrLTL9E!WIeVU2r=>(sqP?+Yv6fjS@CUDD*bM4=(L(gx+r> z?3M77E3gA0{|I3nRUS9T{tnVksJb|PGHha?=7 zP7oN!n7j@b=@He2PM?~9HE|@{5is;&k@c_Xy9rd zMW}HUVct=M+uSJ$CndD_0-=$c^##JrFA%OsxZO29hS1~~!m48kP2D947bSH165$TF z{7ZyoUm|2Zj?lujKaSAuIKmbQEnV;{gru(!`hA7a+HI7uK|-Og5$<+rUnBJX8ey-5 zHm<-o2>HK381)T8Ten-nE(sM*AhdTQPaupqfpA1ZM_2YFLYb2Y(@r9Ea)%@wlu-8+ zLKipr6vCua2xld9bu~{T)HsbW?=(VpcS^!Z2`#=wNOiNmMVR?5!W9X! zI)jkrE=jm3q0?D}K5qG0gk@(DvYtce=h~k`Xm<`_i-Z9#cpf3?JVL+o2!q^42^%C7 z`VL`;OZyI?_jd?;B@A-~E+FK;fH3L;!h>$Ngk2IUe2*~Fjr<;A#P+eU7SeO9Lu#V%+_4>*MZ^e=l36CIfUClZPA3 zc9{mo*9-lAHL^*&+g6n5+nTnhuX6Q4Rhu3Qr*Pd%(~l~&wJ}X`^eb3x_u?p>O3NmJ zO^=3CTKx)6Kj32vdF?HtGSkmHv~{$IT3)V)a%#KJ;^~5{elewtI-91i+xk_Yw)-uu z+>xerHH~E6L#B1}HGV;&8jm$m&!kh!^fSTeubTDzIkiNs_{c5?_qKRy#m8t0?}Mh+ z>UT{CE#5#hRa8IQ{LHjLmY*KBw^_fkQh`G(v3g*OMI2#?^PuUsmKVE(60$vH z8ZV&p`l}{v51Xdmd&sot1MmuvY;r?HXltrqulG+xSR?bZy5}zwn9x0y&AKN0!RzIQ3Z`xus{`^PLKXevsNWmsUE9y_SCmBAv@R$Dy%43En${2m_TB@^|Vy!&;;u<22R%CH*f zYTC=D@dg&JyJ@eWsolJb#OsNsW8qcPc;AWF%d`z>>bn}Cx21hUk0DecHNgWWZnZ*c zq4lxE+f3tST3$zs_oivQq{7qXW^HeoRu}to)3&3jg13O9roCfYJ<9jKFfsZJ#QJD@ z2#7X44^b6t0P>;fXx)RxpWf5r<+phIEZ%Ks+f7S1ts&YPG##uTn$`$A4Nc{H`%P?& z{eUI@$h6zh2BGPwK44lC>>(EKW7C?Vl~ps@^sq(+Hv>1C_63^EJHRelq=Wjn9z&^v zr8(GwsH6I8%TVKb1DcL%J=GD@yAzDZ&{2H?O=(+##}&w?r#{MT1#)8)g-=^N%^-R* zzqT_L?=H3fRfJ+dkBU_I-C!focFr_SHJgCq=~0r3r>W)*)4nt9Ui|Su2ipbH+F~CA zI?|($pKOQyr8M>b4;E3sAXh{k{y&=50b3EJ{bU+%`S9}6bRGSAe5ERLA82cb=P#yd z-fL&tMbkQ?>Bqq3;Y(=#@2R`s)G|@e!6a|*eozQabHNof9Xee>VbfxnuoSNwIM2zj zA{>vV%5(?cp=nDntp|1@X|*Mqma6f$!X}0!6MGV2HJT=pAesv41=gCD+2Zv^d%@CX zF)a;Ezs%R}WLF>jzHQ@tzw^mFW+@ zLenIa*W&4n@U>~zqv;dFK%hrmXc8)hrh*57hfOQ4wA%lJ!6PP?LgddI0!EppCxohC zonjs}tpb`d90v4E3l&n);_0-bhi+)AWZHw+529)It72(KV26exYWAyY;z;Z!mbe<4 zj@gI6uN=^t)lw|p!`Q#+AZM$ArV2g+E}K@%;*CNpWcle4r>gX$ph!dud36v~hWBDOGXBHDbk#_*k{O~RgmrdhJ3X_FOB?VG}_OnY3mTEx~GO}#Y* z+@%MGE8^W2ajI;Kc#mn*(C#sC5Y_nFoeOLiXaaRK%Lpp(j2(-vYYL!DH{nYIY~G`I^yAF=x!_EDho$9UqYf{VdH&=yRz zw9lKS>3&kQhD&h1A%*7l$(Hy9Y`r@|+Z0Q@6#E9#rdqsZXlkA2_9rafa_lcnd(yNO z_}Og=e#*4ai-Lzo`ZU_BU^#`|wL$`NF@V29DPcUFVw^Gct!crT&7 zoWMUeJxo|>*8n}|RNG9`UdHBjB>m4e%fwf(3s7)hcs80Ex)yw&DKZt$wRr2$G_`8l z)f0+U$g4n8tF-xO8mzAY&8*U%L*vg|4>Yq%TdIcytB?&qQ>(<~mf=QhO|8;apedd{ z1BB5ukFT_NuVX)L+A1{l%x16#O;h_CG*xB`ScayleVwI!L+zh{sJZ=B6SrdDiKgu} zG!?uJv@tFEDCIZN@^B1k(_@tt?=6rIP1Cp@sm!1MR02KDO4Il@1ohV2;0#(w^Z1)4 z?!dl^sCoP?)84`M?-@he(NxGz5U|SZuz0)BVoZC-;_XJeKz=$0?6P?8V%H;{&H+5j zIpo*oJ)BC2>Wz0T;vVd>XrtlxOxugCmW+k>nD#!lo_qEfyw|i3u$Q4}dml}^WFJ_8 zHUUnzcrDIBw4-QYG;L>0`vP0foYZz!2a6IP0}mnU zRB+BBeu>=&O{aqMrX9!bYl*)z?JKl?rd=@YYqVXAS)DSzM^mqU1N3xioictj?S$H2 z!o;5uF};)E2GcI1DeqIDq-k-mcK>Nm%CtmS4fz(7HZ2KO!Dm1j(=u7SvuIPuq!{dF zMpTC9z%&e0D9UG`&JD`uOQOrs+%T-5efo60fdl+4MvLIofV9F*}-O z$G6eynWlHoN!x)|-!#2{E(-;}gVw;bTxf}Cn%ZwQP2Zs7&~~BSW?CM!c(jnjh9>4k zR3W?3^b;RkFP~}eVmCHTQ=Q_yhjzPZ1x(X)ucy5$?e+Xyq5Z(t)U;%@b*42-u=9rA zlsAP8wcTM63!zx2+}EPW~bqf}a(9#OAC zN~3*=rpf<))5=)d!<6rJL&W#W^6xte(d6IVv>VY>YiT_!aXBODw|G_1 z^mOCnXnNSb4za3egVDai)`Rs`nQCYsGWx&9e$>)d*AsEFBYuOZC;Y1pHxp4^cLIB& zMNC2KYT6{zYM`m-6mK%DuC9ruo|85OR>8H<9>YF~{RE8bzc6uvuhIWcnplSr6{v_$ z!OE~MnhKOQ!!*5BQ3XnS8diq&_%{ms6!tTw)kjlHr9BHPzXoU;xTmpa!v2fzZbj7L z@h##Ui+CFvhlj7tgK@ov{L|S$r?L5_HA2(bK-vP+8lx4)*0#{J+tG@ewg^_wG(ihh z*A8QQ9#I3SDPkowofel{;$~wLJ{v=(S5Ow)G^ z^}?NKry^R&|B@lGCE^*2xR!{jS1UA~baax`ixP0X)~4y4w!yT!(C#4HDtJ*yChM$)G-v%+oB5t*a_oCG{?M*)--~G^ZKG2EgEz{az>wF+> zyJ_vQbw1F^=WWwEVDC0@%%9w%+HZc|6^;9@v{z z1GW!MOGVR#VollmP3wuBgMFxJ_aihlq!)Hh(>{*G3;FK|)vL3L6ZnZG_TLvuL}>?2 zdjMP0ZE2u)TR>hP{%H_u=KR#OzSt^QGv{G672FS71xq_(@%m%`uH#SB>E|X6zzz^m z+ELT=lF|cozh0IDkCi?nkq8|yE~&_6OO*J zL*7*W-HN6OC%ofr+&7wo(+N>qIV)r?T2s@?qp1$_ z(3+v?@Vm+4&Bxa3GPG4PZ2{W%*g7ODo3;@92h*yUwn(4jspE#6YJdJ0tk*FjY4mLck^ zst(C|7I8VYzNt#9Z`um%ET-w*HMri3{L5WfPv>%JEzmS(UdGnBT$+CPEbSF+oyw)PM$=KU7F&ni z7;vxUw@#n`G*|1mZ)=HP#nxOcO=msGdyRiOM`$kSVA^_YP1VvmnzjL34bl8?pJ^Mh zb-hOOL-YkZn=IZ0?f)(o@pTh57u;{!W^7eZb3s=$wQdWxDk!bH#d`x=71aFD!?dl~ zs-Uz~)3#wZv^hYBssCQ1HxV0|*vlfmh1M8NlSXgTwqt7!(EN~Q+S}NA8IO+f2Ta?6 z{TQ~6aUJ)N_YVJ3IdXLP^)+oLcBq>jV*O0qg{Zfo=b(oH~c!#icH0dy%VA`kHCv@LP;zUFZuEW?moTN=Q?K5m0PSU2J zsZmF;v(be*#-BnX*!vt?CoCP~VM}`yTPG}O8YfEo1-8B`N~=8E5+B3SDOJb4ey$IB zU-D0+oM_L0@C*B&x%Ik!jyxt4`9MLsJ`1V5?5jo<~!i zPGYN0(w3uPMqcb487AIJ%kMPdoO(L@??2b4C}sF9qAH_9{UwWdCKAzqjrkgjcNQ(# z#^)=hokJ^V+B!?i<-ccj`H!H&78HHo)CIJxXz#)6E&BJ^*(}}$(|$nfLf3r=Z#3;k z>^IP~Z8GgAw4P`hnL6pH-9KZqxGLn2LY;N+y6Sm2AwMu>7*26+zRuI~DzClpQfUq6XQw zmRRp&&S8nqSYo}rUdscuowInk(E6fjkexS8FSl1iG@ib*w0Y3f5NZ0@1hFuMsZlM_ zAk*h2iTQ}AmPpgbCTaQ6)YTefKbcklOPI#^MyaAL1y<^;SbK{4{wD#Qf^WrD4 zdU?^j_>@hFM2d+@x-$5L90!Rc&APAaMWD9U7Xabsns_v(G@l``bFpGlXpai%9 zlmvxAA)r?fXeFaoE^4LX6N%yEg0NO7wiLiDNYBV#erH3sKtL;?DqvY2EGJZ)0Y=$&EEAO z8EgY@0a>SQuXP zVnG}T0Ie6$Z5G{C*$6g+Enq9y2Hpg3f#<+t@H|)o7J(`HY&ZsEEMO|~iqI=XK{0SW zNJl$Iubc|BZ1k1rp@IH)AD#^ouoJ;o*k6F1U>Dd8 z-UWNW+h7NH2P_54!3yxAM&Jt=-55JvL1j<{R0Y+*1#lL84SE8t_R*O`XNtz8yB+8a zDSBN?15g~41f@VLDs>mQ8{7l*PMYh0R`_HFdMVC1z3=HXhF+kfm+>40UxFRr9k2^* z23x@$^rYT@)CqJ3T|iFu;!Et>HQ;5SRXiUPkCi)KUXTx*W5}Eb-+>F@2cVaZH3N6J z2G7Tr3*}CXtW+rgUk?g`Lg06@*WwZ_Ceh-N8lWcFiM|wQ4af5!KgH_C_e5+h*O&}4 zgG^vNhuQ?7H4~cw>mITLF-EGJL&w=NH z+U)JRpdLs8H9$?!3#0;lM$l)1vOu@j%Y%xb4SDEIN?(EZ+} zx}l;QD7r#(7q|x$21P(oPz>lEcO6g{+yd%>Y^2Q&a)6v52r`2N&`{^s#dOy5U@2Gz zbPM=JuoA2SYrxB39e5S!&Tl*jv9omJRX0$NgXB04P53?VKKKCWHKQ*A-NT#%=7M=( z0njbXVVbpbs`k`054axaW>`_6dtK$h7Zh>~d3rGSDXheO`4zvgN0bL{0jrrSw?&M!#X!Hk3bp1zEY!i4L=myOOa2<`k1b<7< z3?<$^ct7|E=*6sybxiFi(~rQ%;1i%PV26OdUwsDj{Yl@KjsktVUI$(Uy5E%p)TEGF zpe`s!A>~0ua1*Emv?94W(28TNCN2teH(((ZTcjH>V=+d9k>DYqTaS8k*!}d9E|}i} za^dT`=6tXS=(@pD&;{HNx`9-nYh`Ib*TQt|OV_$|8B3R~bV+J3&=sd);6X4V#J@+t zC@_p#?WF?m16>E-0=9x};4Sbr(6#VS>AEAJKJgoXhM*B>44Q#EKyz>>&}!l~;9j7` zyzPM&@M>*tR}kvPzaF3`=moUMHVr%g`hdPbuOsdNIs#oM?+o;1P~RL+0$nF>4C(`Y z!@K}~0s5Y$D;Fc#O}hK{0nnvr-K5hEIPR^*dQ;=v{1x$oL-p8yw}780@E33rJV$H0 z(*2!*u3PFdWdkssOdka+fG#yX4W@$kNb?eS5R3#psgSNPo+V7*O8Hvr-G#5O%leKL z3-q;$uSX#-3F8t0zk$m@U+NyBmWi@qT?y1xzC0i=$Od$UF9!&K7!V5*KqAnuNc4k_ zJzy``0bU1dz{_AI&`+CQ1l_fQzX67>1l|T3fo9+i&;qmu0V)v#n$ZLIg7)A}pry@P z%KQk(OC$1w0zlWAbZw~+(1oNdKo^Si#V-?$IYwUk!Q%a(ZHRxH!4{yaL~B70Fab;k z`l((=3hMy$!rfLN4;kGIQa~l3ivqd`@HluB+((>yKx>ebuqkNzVdKa6o52u{w4p#h zTnk-g;)=&;ick!c0(TI(Ik*)Bz>ge;)4?-fA!(kD7yg!3g6X$SgMh9y9i%e)&aKPQTfhb|9!vs5zyqK!=m&Cxm#C~(h^+DV1zc}{@nA9-4GPoHWAK+C!tDR-h&h0+k?5L;ew@%GRKGgWuS^buBj6}_$mLiQ zpD(1}cIc-ZdI@V~hDT%gB7JfR{0frs3xnbyH_)#oN~0G9g+O6Y1XLyM4)_VGy%3%c zW`L1EKWexObO4<}SI`6W)C+=oVQ6iC1yBj3fIM`tE?U$wL^_OX4rCq;%TCy7{G;Fq z_!OvcE#Ekvfxn?o^%6n7STLGTwBO5Sp|Emp(M$2UIz=^=SrBM#`)>Mh1K0>&153dW zkb_2jLel)$T6SI#6b5={DPm&}u@h9$W=h1Faf-8N33PfMs9; z7z@UM5nv?HeiHI>IOhY&;Crg0HQ8suRd4~+CQe;Y4^#qG^g*c_MpV5NZ5-oItDP@`??EBLi-KZ6m*S%PX%k^@fgSpw^fJa;pe4i` zz(e2xpcTNoXvqga*KLb4no58hKuJ&vlm=zML^^&Ncmg~Lo&wW>7QfB{eL-|bH^9CX zXr~^e{69v9gfsZjh=;I+lZ+OvPHh2n>8u=xj;KRqBzq`(nw6wpIiSU(Td34puo{#k ztOzIy^rD}PyFB#2-RD!-MOpwf3uw{LPOuB?277?QgW+z+~f zZlF6D2Ob0C!34KtE#K=O#vBD61ucLU!fD~#jUX8m1Vw<>r0GsuS)ihIH|+#C1j5Y;K15f-V`~bc1 zB3KD@>uxm&t>NFx;1#eIq>)K`dgLx}H|PblFiH!dq%8zmRi}k;4$K8%kTFeb{Al{9 zt;JB$u~UOaSK+f-4gGGVCPraU3}}Iq7Bp!A6N{7nVQR=*#FUiax*p5SXe+WECD@0PcRfTM30UQu|~Mgc-w(0mWc{w z2Dv~spxX)3|6N!+c8ylyG|_kNX5f1Y`2qY0egfT2`Gi(b^-QK*o3 ze63y4S{1EL(OML(J^80Y)+0O=?Z$r^ggV}J4il>|@ju1yPk1MKsWFhPUR94p@eB=l z3{2A`oKC3NF(PTW(<2Jaz?dKi(|I^Zp1^v@_$QbW0V=43> z2UEtxv9vBaJ~DQ5S$g3{P!W^{MS#Xdc33^PmDZ+#zMvn_V^Sg&X8-@)Jf5-8zts4D zRpDr5|2i-HF%ERMCu2)8Myx{ZtAgU71W=1|!MVWzTA)MgKNj#0`73QL4Ze&O&>*|P z3X5i*F+54XhGcu>jP8q;Dmff?Fc<`MK|o)7M}geLc>wMXx~;FgIsVB~JS*zWFXKyu zv?nwcdx2D-Z`m534+8C-K0teFI2a0s0JU`x7zot%!9Zz-0qsqVXFViGn&OWH`o=Cu zOQLGa;bmIap@Noz7r+uwm%8de)LDHlm%1Z~M!kz-srh>=8WDre%k$k4$EBrU?C*dc+G}Asn zyMw&9!qd^7fhT~8fD251J)`BR-jo;m7f}^{7C0padZ>;nJp)(*FB2IhX2?tpRT{-t z19a0z9TF`l+7XJQaNSrE&jz#N`tWrP;|prImxMF1GbWBk44}^eVzp!*Tn5&Cf#-Z8iwbOqGSHNZP9(Wh*2D^Z6sJ;ci1Xh8S;6<>) zZ6tYU1*Z1LYDqx*Qv4=Z2XtX;6L=Zu0++(1zXH|*=}}){8ZXge6fRBqOH)^>wYnlC zpFBeTvv?Fq14ZHnupYbyq6wn|Md2DG8^JUnUxP%MsuJ>5F;yyB(Ws`%sNK2-wgqek zt95lQ+BzkO4u)uE(aur=g{uY8FcqZmXvPZP1~e&a|7+hy$3Vt3il@P%@Hsj>Wn>%# zy7sgiX*<|SSbg{%cn5eJYzI0lb^z_J=-xesz86S44YcR?;C}(+e+Z|8ec%J|Fy(~a z$2bf=1s{V$;2`)2><7|h9{`^iqVc3DopfnYmVOi*0iR{imA75*P1Rc(FUR3`!3ZjS3O)f8b`tyuegnUPOW-2-1)KvvgR|f#mriz}^O$GA zx8Ss~g5@i^AX}QCIARqMwWHzDxZ-FY;_rasXzii)fvy{0#m^Dvxh|*TONMk&*#r9^ zeRqt<*3ESN;x7(+G#tI?tm{?TfG#{|0zuG{a9xO82QuSNgR{U{!F6CD=mhQqcLCii z&^-e^sbo|f3u1DU;6Z9s5v~Ao5|B#_vb$oZs!lqWX?Zc9F1Y6g>#z$d3@!z87boO@SJHPU zU76R-uw=LqnOqO&2TQ3?KDYo-;vzubw~B&i3Dftj6yht6zJE2x)=_giXapJp-A1~J zymi~CEGP}ifC~C4`%M_S-&7uy12=*S=8Kh)TH6r&HqZd*OP^ZCH$eZs)Xi{xp!-t` zh?@d0p>lQM+Mo_l_$@#WwYe4Oj!$mN_n%7B1V^`s)LM1Dy7eb~?atPq70_Pv_Z+r8 z67i~bmzF(rKvO!6!}i#B!*|14rJ{6gvF`=!Gj>w24NtE*1PKd(kij^v|6PmfMrxSYdfafA-6Y{#F zrxOYV;@p+f2?cmiZoY35ss`S2^C~13h}n0K+fX5~T(C;Tsuda4NA7WFDkSFT`Lb)j zO=yvPu1!GCZX8`?Ud$KOa;`f;{*@|LNvT-Fi)37wlGfcD(DNck-_ki|^GD~CjuNLb zb>JREZP)S)1vYb`@`-s}=nQr6lNE5Uok^(16G*=$IC)UpfR~x{P0p-aeBbG%^+{hX zl0FhSxmx>x*4d4|?o`!7{nBdY_bYL8MQ(Joc6Xnpk=@+uXDO%8`U7VZj>ZKVyH~%b zft_8wn8Zr1zz+$n1O3YNXA5o;|*^+}UDZQ(Tpbw1|Vp4f>68D!3_7awFm~-;MtAwuEZ?U;VT( z@ouKx)ldL#9};tw_K*g0z4nL zQKrPI)!Pi<`KQ#V=jYoezw*k8Dt^uVJ+W|LB-?hMR`1lj&BdaBwrRCnr5rZ9F7EhGa{udUJOo z1nKpX<99CETJ(cA=#%Qi;K=xjkW7Ts&FuEyn0wC_LX?)?Iyc;XmMyVL%x}Y8_UwuI zt0z1dIfh1Vsc>jxr(b>|X64A3%Vi-I@@%Z~&Y7Q|{xhVgYndxCZye>^=pM|@0ITI* z%$`^vxgjZZJbg8z;k>0E->JMbCs1ljca#X#+gX;s4nOzQ?az-Y??>PaL1;j zx}9x4eeIti16+k1pM2Z9QZTBSl5*ZfvN6cQN(kVa$B!f+!#n6HzuG{%;@u7J9gc8Y+N}Kq>zB!6n4k*(Kj32Z&30v;uRs@$*0Gr zC)}HUG5a68$#Xa5Cqf~XY-vBX8++x@7w=ZHz%VoY)t zR>*1s9&~=lLpSvdX7#J+577dySTX~nv}==`*n%g5FUCu*O?0*B_F@c6ITOm@lSl_8oV(UO)ynCrIdF64(3!@fxm5UH{gxgyLZ>&o$ z3e|CGMTyeb%_~YfTe>2}5(~I}MHvI_-M2`|by&Nr@wIk$XvVF*R+fwjJgQ+%(UHjH zP_tNKi{uKN*wyq7Hyy}!Dz^ROfA(Pwx2PCJ+~y7xOB|D2l=Z>t>nS~+etGk!yLIZ( zP$$1iZcuS%%aA)%oc#W0JVmR{F$aDm11h^lH{ca=BcYg| zW~^U*10y14f7tCQnK(N+&(o1}@8Z|S9Zt@FqA7(}tH>Vmyc^t@QWXAxJ5`DqKC(OA znbL{Xl7D$N;1#37!}3jSQtqkO=dn*2P1Q-1e|_yTloFV+e!z{1LjuY9T|f)WN1uLb zLDPaOZ(mIA7IUh*QjW>$*cg|;d}8zDigO};`rNkx=$75q9ka@vR^MB}J_(sSijUA(2`pCSM9S)ocy zNwg+Aw*NXOMq<$6I-y`QoA~f39;qG5*w^t)7^Eu;YuFkkc zL-q^dCFYDNc8awZ8X3DDf93M_R;^#Sgs+^B4;`D9y+_l-v2J7K#3G^p7>z~ee193e zq)*2wJ#TMNFdNG`l+DP!FI^rx;zacV_zJ%|*V`7ea9qQNEL7LIV8gkRyTTWe(#jLA z9%@y3x}C~4H(g(SyoqhAB(85;C23}BcdmR=;`$1YCB1)Vrh}0{?_|1* v-=9=G`Hikk$6k4{ZNl#j8tm*+?S)hMKlBrO%|A?XQ_jYhbiMZ{z5V|Ia-n8i delta 51972 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
|VME_JKdN~~UU!=5vtuD|<3U9}T&g?O-c z^AmA>{GXkFDz1>*c_OZGk%lbo$i`vcG+|kl)t4H#iScVyuUow)CA4r?PQ=yWfxxv+ z#ubW*zt1hI8eb(`yLz4K4DG!4xd|uZ3i>_WypwUQi`{V*D;O ztJhAfUeAk^#nX(7P-Kyzcl&Db37NVUy7*a+SCWWVt9mUJH_^2@MQK6w{BGWYrwR=DDTvmTlO4I__|+Kkk|H@%i1_^Kr#^KKRGy z<0kscH?+MFmm`*kaCiHah?|`siqGSo{59?if8~Z=|A_17#}w|qVeh55hkU<*OZttP zw(8~UftnM(x;OkzVv&7Kf<3BLy*^#*h7iGj#62#W<+5atFXS)Uu;sV7T5&CKRZ*T&^+-s28|jNeS%U?h2p39{@rd!eEfW#NuDi%Ojf!I3Gsb+-u6=o@m+bM z>rV;srTpP8SD3H~u1Yw*j{k(~idW>z!I5X2w*TtJ&Uf5*sU)?l9cjm-?$69bzv$Lx zCi)fk9jS^W4Dq#sal*6hKWOmsz}AO}&e%|ef_VAet(oH!V{RPk#%GQ%80APFt$B8} za{O2IZ*G1!E=zo(KgF%j5?|+EW7ctXv&P>L$t%B`m^HpwOs3&(N!Iw?tj964yT+lio|UM*i*?H#9oofAX|246ep z=Z?=G%S_eHbgq@a)=EN;s8-VG?fq;mzlsDqZ6X5?X6NNjxi8@Hik9`(WFE-5ehEpYAf#^U_7)Y6zg=e{FCOuCtAF(x3V-@1-o5`!=P&!4zsGM8|IXugJLqzaqG&)KgaI1E=Nh7 zT%U53wA6iEF8+ib;9Wkxb&=}M_exRHhyqWvs4{Ew!f5~0_S$SHRe{|6T^sJJ6hF+b z+lH9MiFtC?;+92UY5qKQ3VO1(xBWR^kH4Jo&^NJFTR-;Mn16=QxmPPQD0;b8Rj5HQ zm*;n5tHkF^D7PT8i*C^iaRuC(D)BXVT>jxI@q=z`!I?+LYl(W3?)-eoY|jWjBG ztx2u;4NYn#%x#-<;K<&|{d?7@R>Qt)xY?KE%WwGN(S$GV%v^C_5ZkM_&%OC+Lg}L3 n+ud3|dSz9+xU0>Yz2EhQ7f @@ -14,18 +13,13 @@ function getOpenSeaUrl(ethers: any, contract: string, namehashedname: string) { task('seed', 'Creates test subbdomains and wraps them with Namewrapper') .addPositionalParam('name', 'The ENS label to seed subdomains') .setAction(async ({ name }, hre) => { - let parsedFile - try { - parsedFile = envfile.parse(fs.readFileSync('./.env', 'utf8')) - } catch (error: any) { - if (error.code !== 'ENOENT') { - throw error - } - console.warn( - '.env file is empty, fill as in README to complete seed action', - ) - return - } + const { parsed: parsedFile, error } = dotenv.config({ + path: './.env', + encoding: 'utf8', + }) + + if (error) throw error + const ethers = hre.ethers const [deployer] = await ethers.getSigners() const CAN_DO_EVERYTHING = 0 From 128f77e44c2e3719ee353bc9914c5d9541e8831d Mon Sep 17 00:00:00 2001 From: v1rtl Date: Thu, 13 Jun 2024 17:02:03 +0300 Subject: [PATCH 3/4] fix types import --- bun.lockb | Bin 578268 -> 578276 bytes .../00_deploy_offchain_dns_resolver.ts | 2 +- .../05_deploy_public_suffix_list.ts | 2 +- deploy/dnsregistrar/10_deploy_dnsregistrar.ts | 2 +- deploy/dnsregistrar/20_set_tlds.ts | 2 +- deploy/dnssec-oracle/00_deploy_algorithms.ts | 2 +- deploy/dnssec-oracle/00_deploy_digests.ts | 2 +- deploy/dnssec-oracle/10_deploy_oracle.ts | 2 +- ...00_deploy_base_registrar_implementation.ts | 2 +- ...deploy_exponential_premium_price_oracle.ts | 2 +- ..._deploy_legacy_eth_registrar_controller.ts | 2 +- .../03_deploy_eth_registrar_controller.ts | 2 +- deploy/ethregistrar/04_deploy_bulk_renewal.ts | 2 +- deploy/registry/00_deploy_registry.ts | 2 +- .../registry/01_deploy_reverse_registrar.ts | 2 +- .../resolvers/00_deploy_eth_owned_resolver.ts | 2 +- .../00_deploy_extended_dns_resolver.ts | 2 +- .../00_deploy_legacy_public_resolver.ts | 2 +- deploy/resolvers/00_deploy_public_resolver.ts | 2 +- deploy/root/00_deploy_root.ts | 2 +- deploy/root/00_setup_root.ts | 2 +- deploy/utils/00_deploy_universal_resolver.ts | 2 +- .../00_deploy_static_metadata_service.ts | 2 +- deploy/wrapper/01_deploy_name_wrapper.ts | 2 +- deploy/wrapper/02_deploy_test_unwrap.ts | 2 +- package.json | 2 +- 26 files changed, 25 insertions(+), 25 deletions(-) diff --git a/bun.lockb b/bun.lockb index afa02e8a0191ef76946ec7c482db94d15efb3429..98942d2a130ff4eaa5d28634e5d80bd7992c65ac 100755 GIT binary patch delta 33860 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 diff --git a/deploy/dnsregistrar/00_deploy_offchain_dns_resolver.ts b/deploy/dnsregistrar/00_deploy_offchain_dns_resolver.ts index f9147e27..64e0a644 100644 --- a/deploy/dnsregistrar/00_deploy_offchain_dns_resolver.ts +++ b/deploy/dnsregistrar/00_deploy_offchain_dns_resolver.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/dnsregistrar/05_deploy_public_suffix_list.ts b/deploy/dnsregistrar/05_deploy_public_suffix_list.ts index 165a5c8b..473b1b90 100644 --- a/deploy/dnsregistrar/05_deploy_public_suffix_list.ts +++ b/deploy/dnsregistrar/05_deploy_public_suffix_list.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat' import packet from 'dns-packet' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' function encodeName(name: string) { diff --git a/deploy/dnsregistrar/10_deploy_dnsregistrar.ts b/deploy/dnsregistrar/10_deploy_dnsregistrar.ts index d7c8ed21..03df73ad 100644 --- a/deploy/dnsregistrar/10_deploy_dnsregistrar.ts +++ b/deploy/dnsregistrar/10_deploy_dnsregistrar.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/dnsregistrar/20_set_tlds.ts b/deploy/dnsregistrar/20_set_tlds.ts index fa6fc2f7..14a69901 100644 --- a/deploy/dnsregistrar/20_set_tlds.ts +++ b/deploy/dnsregistrar/20_set_tlds.ts @@ -1,7 +1,7 @@ import { namehash } from 'ethers/lib/utils' import { ethers } from 'hardhat' import packet from 'dns-packet' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' function encodeName(name: string) { diff --git a/deploy/dnssec-oracle/00_deploy_algorithms.ts b/deploy/dnssec-oracle/00_deploy_algorithms.ts index ebe60f1b..205d5eef 100644 --- a/deploy/dnssec-oracle/00_deploy_algorithms.ts +++ b/deploy/dnssec-oracle/00_deploy_algorithms.ts @@ -1,4 +1,4 @@ -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/dnssec-oracle/00_deploy_digests.ts b/deploy/dnssec-oracle/00_deploy_digests.ts index abf0ff3a..b634f7cc 100644 --- a/deploy/dnssec-oracle/00_deploy_digests.ts +++ b/deploy/dnssec-oracle/00_deploy_digests.ts @@ -1,4 +1,4 @@ -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/dnssec-oracle/10_deploy_oracle.ts b/deploy/dnssec-oracle/10_deploy_oracle.ts index 9ec08c1a..9684103e 100644 --- a/deploy/dnssec-oracle/10_deploy_oracle.ts +++ b/deploy/dnssec-oracle/10_deploy_oracle.ts @@ -1,6 +1,6 @@ import packet from 'dns-packet' import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const realAnchors = [ diff --git a/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts b/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts index c404d23f..2f1261d5 100644 --- a/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts +++ b/deploy/ethregistrar/00_deploy_base_registrar_implementation.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' import { keccak256 } from 'js-sha3' import { namehash } from 'viem/ens' diff --git a/deploy/ethregistrar/01_deploy_exponential_premium_price_oracle.ts b/deploy/ethregistrar/01_deploy_exponential_premium_price_oracle.ts index 0d4b3d85..3fc84369 100644 --- a/deploy/ethregistrar/01_deploy_exponential_premium_price_oracle.ts +++ b/deploy/ethregistrar/01_deploy_exponential_premium_price_oracle.ts @@ -1,4 +1,4 @@ -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/ethregistrar/02_deploy_legacy_eth_registrar_controller.ts b/deploy/ethregistrar/02_deploy_legacy_eth_registrar_controller.ts index e55e4a35..249e24c1 100644 --- a/deploy/ethregistrar/02_deploy_legacy_eth_registrar_controller.ts +++ b/deploy/ethregistrar/02_deploy_legacy_eth_registrar_controller.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/ethregistrar/03_deploy_eth_registrar_controller.ts b/deploy/ethregistrar/03_deploy_eth_registrar_controller.ts index 4db8768b..b766e2c3 100644 --- a/deploy/ethregistrar/03_deploy_eth_registrar_controller.ts +++ b/deploy/ethregistrar/03_deploy_eth_registrar_controller.ts @@ -1,6 +1,6 @@ import { Interface } from 'ethers/lib/utils' import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const { makeInterfaceId } = require('@openzeppelin/test-helpers') diff --git a/deploy/ethregistrar/04_deploy_bulk_renewal.ts b/deploy/ethregistrar/04_deploy_bulk_renewal.ts index 8fafecc1..130761c7 100644 --- a/deploy/ethregistrar/04_deploy_bulk_renewal.ts +++ b/deploy/ethregistrar/04_deploy_bulk_renewal.ts @@ -1,6 +1,6 @@ import { Interface } from 'ethers/lib/utils' import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const { makeInterfaceId } = require('@openzeppelin/test-helpers') diff --git a/deploy/registry/00_deploy_registry.ts b/deploy/registry/00_deploy_registry.ts index fb24b799..31759982 100644 --- a/deploy/registry/00_deploy_registry.ts +++ b/deploy/registry/00_deploy_registry.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const ZERO_HASH = diff --git a/deploy/registry/01_deploy_reverse_registrar.ts b/deploy/registry/01_deploy_reverse_registrar.ts index deeb1ee9..0a9ec8b6 100644 --- a/deploy/registry/01_deploy_reverse_registrar.ts +++ b/deploy/registry/01_deploy_reverse_registrar.ts @@ -1,6 +1,6 @@ import { namehash } from 'ethers/lib/utils' import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' import { keccak256 } from 'js-sha3' diff --git a/deploy/resolvers/00_deploy_eth_owned_resolver.ts b/deploy/resolvers/00_deploy_eth_owned_resolver.ts index 1a318784..0c2fbba1 100644 --- a/deploy/resolvers/00_deploy_eth_owned_resolver.ts +++ b/deploy/resolvers/00_deploy_eth_owned_resolver.ts @@ -1,4 +1,4 @@ -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' import { ethers } from 'hardhat' diff --git a/deploy/resolvers/00_deploy_extended_dns_resolver.ts b/deploy/resolvers/00_deploy_extended_dns_resolver.ts index 0382e27d..0ecdc5fd 100644 --- a/deploy/resolvers/00_deploy_extended_dns_resolver.ts +++ b/deploy/resolvers/00_deploy_extended_dns_resolver.ts @@ -1,4 +1,4 @@ -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/resolvers/00_deploy_legacy_public_resolver.ts b/deploy/resolvers/00_deploy_legacy_public_resolver.ts index 0b267ccc..6962b688 100644 --- a/deploy/resolvers/00_deploy_legacy_public_resolver.ts +++ b/deploy/resolvers/00_deploy_legacy_public_resolver.ts @@ -1,5 +1,5 @@ import { ethers, network } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/resolvers/00_deploy_public_resolver.ts b/deploy/resolvers/00_deploy_public_resolver.ts index fb089e79..3465f5fa 100644 --- a/deploy/resolvers/00_deploy_public_resolver.ts +++ b/deploy/resolvers/00_deploy_public_resolver.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/root/00_deploy_root.ts b/deploy/root/00_deploy_root.ts index 6b4ebf6d..d2db91f9 100644 --- a/deploy/root/00_deploy_root.ts +++ b/deploy/root/00_deploy_root.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/root/00_setup_root.ts b/deploy/root/00_setup_root.ts index e5a46b7a..7ff601a0 100644 --- a/deploy/root/00_setup_root.ts +++ b/deploy/root/00_setup_root.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const ZERO_HASH = diff --git a/deploy/utils/00_deploy_universal_resolver.ts b/deploy/utils/00_deploy_universal_resolver.ts index 0df6ecd2..96ca70c0 100644 --- a/deploy/utils/00_deploy_universal_resolver.ts +++ b/deploy/utils/00_deploy_universal_resolver.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/wrapper/00_deploy_static_metadata_service.ts b/deploy/wrapper/00_deploy_static_metadata_service.ts index 776475ef..d61bb324 100644 --- a/deploy/wrapper/00_deploy_static_metadata_service.ts +++ b/deploy/wrapper/00_deploy_static_metadata_service.ts @@ -1,4 +1,4 @@ -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { diff --git a/deploy/wrapper/01_deploy_name_wrapper.ts b/deploy/wrapper/01_deploy_name_wrapper.ts index 829afd52..8d86335a 100644 --- a/deploy/wrapper/01_deploy_name_wrapper.ts +++ b/deploy/wrapper/01_deploy_name_wrapper.ts @@ -1,6 +1,6 @@ import { Interface } from 'ethers/lib/utils' import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const { makeInterfaceId } = require('@openzeppelin/test-helpers') diff --git a/deploy/wrapper/02_deploy_test_unwrap.ts b/deploy/wrapper/02_deploy_test_unwrap.ts index 81195b48..c6b9cb15 100644 --- a/deploy/wrapper/02_deploy_test_unwrap.ts +++ b/deploy/wrapper/02_deploy_test_unwrap.ts @@ -1,5 +1,5 @@ import { ethers } from 'hardhat' -import { DeployFunction } from 'hardhat-deploy/types' +import type { DeployFunction } from 'hardhat-deploy/types.js' import { HardhatRuntimeEnvironment } from 'hardhat/types' const TESTNET_WRAPPER_ADDRESSES = { diff --git a/package.json b/package.json index 9a05e858..eb9d0c06 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "hardhat": "^2.22.2", "hardhat-abi-exporter": "^2.9.0", "hardhat-contract-sizer": "^2.6.1", - "hardhat-deploy": "^0.11.10", + "hardhat-deploy": "^0.12.4", "hardhat-gas-reporter": "^1.0.4", "husky": "^8.0.0", "prettier": "^2.6.2", From 29103ab81640a3153be93dc19aa4c4f696f8470a Mon Sep 17 00:00:00 2001 From: v1rtl Date: Thu, 13 Jun 2024 17:06:55 +0300 Subject: [PATCH 4/4] fix wrong import --- test/test-utils/ens.js | 2 +- test/wrapper/BytesUtils.js | 2 +- test/wrapper/ERC1155.behaviour.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test-utils/ens.js b/test/test-utils/ens.js index caaf4552..56dd99a6 100644 --- a/test/test-utils/ens.js +++ b/test/test-utils/ens.js @@ -2,7 +2,7 @@ const { utils, BigNumber: BN } = ethers const packet = require('dns-packet') const labelhash = (label) => utils.keccak256(utils.toUtf8Bytes(label)) -const { namehash } = require('viem/ens').hash +const { namehash } = require('viem/ens') function encodeName(name) { return '0x' + packet.name.encode(name).toString('hex') } diff --git a/test/wrapper/BytesUtils.js b/test/wrapper/BytesUtils.js index 0b75795a..035a25b0 100644 --- a/test/wrapper/BytesUtils.js +++ b/test/wrapper/BytesUtils.js @@ -2,7 +2,7 @@ const packet = require('dns-packet') const { expect } = require('chai') const { ethers } = require('hardhat') const { utils, BigNumber: BN } = ethers -const { namehash } = require('viem/ens').hash +const { namehash } = require('viem/ens') const NULL_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000' diff --git a/test/wrapper/ERC1155.behaviour.js b/test/wrapper/ERC1155.behaviour.js index 05cbfd82..5c338955 100644 --- a/test/wrapper/ERC1155.behaviour.js +++ b/test/wrapper/ERC1155.behaviour.js @@ -2,7 +2,7 @@ // Copyright (c) 2016-2020 zOS Global Limited // Portions Copyright (c) 2021 Nick Johnson -const { namehash } = require('viem/ens').hash +const { namehash } = require('viem/ens') const { BN, constants, expectEvent } = require('@openzeppelin/test-helpers') const { ZERO_ADDRESS } = constants const { ethers } = require('hardhat')