From 964c82c88f69086a93a82f716a5290152912ed0c Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Wed, 5 Jan 2022 17:00:24 +0100 Subject: [PATCH 01/15] feat: Add ens lookup functions --- .gitignore | 1 + .../src/ethereumLibs/Web3Adapter.ts | 19 +++++++-- packages/safe-core-sdk/tests/ens.test.ts | 41 +++++++++++++++++++ packages/safe-core-sdk/tsconfig.json | 2 +- 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 packages/safe-core-sdk/tests/ens.test.ts diff --git a/.gitignore b/.gitignore index 1d6f82d93..46be1b063 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ deployments typechain openapi/ +.idea \ No newline at end of file diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index 8d78986af..17ef50d5c 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -1,3 +1,5 @@ +import Web3 from 'web3' +import { ethers } from 'ethers' import { BigNumber } from '@ethersproject/bignumber' import { SafeVersion } from '../contracts/config' import { @@ -24,7 +26,7 @@ export interface Web3AdapterConfig { } class Web3Adapter implements EthAdapter { - #web3: any + #web3: Web3 #signerAddress: string constructor({ web3, signerAddress }: Web3AdapterConfig) { @@ -105,7 +107,7 @@ class Web3Adapter implements EthAdapter { return getGnosisSafeProxyFactoryContractInstance(safeVersion, proxyFactoryContract) } - getContract(address: string, abi: AbiItem[]): any { + getContract(address: string, abi: any): any { return new this.#web3.eth.Contract(abi, address) } @@ -125,13 +127,24 @@ class Web3Adapter implements EthAdapter { return this.#web3.eth.sign(message, this.#signerAddress) } - estimateGas(transaction: EthAdapterTransaction, options?: string): Promise { + estimateGas(transaction: EthAdapterTransaction, options?: any): Promise { return this.#web3.eth.estimateGas(transaction, options) } call(transaction: EthAdapterTransaction): Promise { return this.#web3.eth.call(transaction) } + + ensLookup(name: string): Promise { + return this.#web3.eth.ens.getAddress(name) + } + + async ensReverseLookup(address: string): Promise { + const lookup = address.toLowerCase().substr(2) + '.addr.reverse' + const node = ethers.utils.namehash(lookup) + const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); + return await ResolverContract.methods.name(node).call() + } } export default Web3Adapter diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts new file mode 100644 index 000000000..e567144d7 --- /dev/null +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -0,0 +1,41 @@ +import Web3 from 'web3' +import { Web3Adapter } from '../src' +import { ZERO_ADDRESS } from '../src/utils/constants' +import chai from 'chai' + +describe.only("Web3Adapter", () => { + const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby-light.eth.linkpool.io/', {})) + const web3Adapter = new Web3Adapter({web3, signerAddress: ZERO_ADDRESS}) + + describe("ENS direct lookup", () => { + it("returns an address for ens name", async () => { + const address = await web3Adapter.ensLookup("safe.eth") + + chai.expect(address).match(/0x[0-9a-z]{40}/i) + }) + + it("throws an error for a non existing name", async () => { + try { + await web3Adapter.ensLookup("nonexistingname") + } catch(error) { + chai.expect((error as Error).message).to.equal("The resolver at 0x0000000000000000000000000000000000000000does not implement requested method: \"addr\".") + } + }) + }) + + describe("ENS reverse lookup", () => { + it("returns a name for existing address", async () => { + const address = await web3Adapter.ensReverseLookup("0x203aBBf9F190009606C317439360c9f3c0874452") + + chai.expect(address).to.equal("marco.eth") + }) + + it("throws an error if no name exists for address", async () => { + try { + await web3Adapter.ensReverseLookup("0x16B110D5b7583266B29159d89eF0d001adf6f6FD") + } catch(error: any) { + chai.expect(error.message).to.exist + } + }) + }) +}) \ No newline at end of file diff --git a/packages/safe-core-sdk/tsconfig.json b/packages/safe-core-sdk/tsconfig.json index 560cb7edb..5b0327b09 100644 --- a/packages/safe-core-sdk/tsconfig.json +++ b/packages/safe-core-sdk/tsconfig.json @@ -5,5 +5,5 @@ "outDir": "dist", "baseUrl": "src" }, - "include": ["src", "src/**/*.json", "typechain/src"] + "include": ["src", "src/**/*.json", "typechain/src", "tests"] } From da786c4f6ffa3714c9f27e486ac9fdd9293bcf1f Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Wed, 5 Jan 2022 17:02:26 +0100 Subject: [PATCH 02/15] chore: Add github handle to cla --- .github/workflows/cla.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index 471ee4ef5..c521260a0 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -20,6 +20,6 @@ jobs: path-to-signatures: 'signatures/version1/cla.json' path-to-cla-document: 'https://gnosis-safe.io/cla/' branch: 'cla-signatures' - allowlist: germartinez,mikheevm,rmeissner,Uxio0,dasanra,davidalbela,luarx,giacomolicari,lukasschor,tschubotz,gnosis-info,bot*,katspaugh + allowlist: germartinez,mikheevm,rmeissner,Uxio0,dasanra,davidalbela,luarx,giacomolicari,lukasschor,tschubotz,gnosis-info,bot*,katspaugh,usame-algan empty-commit-flag: false blockchain-storage-flag: false From edcab2d84e3f780bb59ef34899058371da299c5b Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Thu, 6 Jan 2022 13:55:46 +0100 Subject: [PATCH 03/15] fix: Move function declarations to EthAdapter and implement in EthersAdapter --- .../src/ethereumLibs/EthAdapter.ts | 2 + .../src/ethereumLibs/EthersAdapter.ts | 8 ++++ .../src/ethereumLibs/Web3Adapter.ts | 2 +- packages/safe-core-sdk/tests/ens.test.ts | 44 +++++++++++++++++-- packages/safe-core-sdk/tsconfig.json | 2 +- 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts index 4aaba31cb..bd433ac81 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts @@ -48,6 +48,8 @@ interface EthAdapter { signMessage(message: string, signerAddress: string): Promise estimateGas(transaction: EthAdapterTransaction, options?: string): Promise call(transaction: EthAdapterTransaction): Promise + ensLookup(name: string): Promise + ensReverseLookup(address: string): Promise } export default EthAdapter diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts index 615cb55ba..8872c42b6 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts @@ -151,6 +151,14 @@ class EthersAdapter implements EthAdapter { call(transaction: EthAdapterTransaction): Promise { return this.#provider.call(transaction) } + + ensLookup(name: string): Promise { + return this.#provider.resolveName(name) + } + + async ensReverseLookup(address: string): Promise { + return await this.#provider.lookupAddress(address); + } } export default EthersAdapter diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index 17ef50d5c..089a8b718 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -20,7 +20,7 @@ import EthAdapter, { EthAdapterTransaction, GetSafeContractProps } from './EthAd export interface Web3AdapterConfig { /** web3 - Web3 library */ - web3: any + web3: Web3 /** signerAddress - Address of the signer */ signerAddress: string } diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts index e567144d7..1793a579c 100644 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -1,9 +1,13 @@ import Web3 from 'web3' +import { ethers } from 'hardhat' import { Web3Adapter } from '../src' +import { EthersAdapter } from '../dist/src' import { ZERO_ADDRESS } from '../src/utils/constants' import chai from 'chai' +import { getDefaultProvider } from '@ethersproject/providers' +import { Wallet } from '@ethersproject/wallet' -describe.only("Web3Adapter", () => { +describe("Web3Adapter", () => { const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby-light.eth.linkpool.io/', {})) const web3Adapter = new Web3Adapter({web3, signerAddress: ZERO_ADDRESS}) @@ -25,9 +29,8 @@ describe.only("Web3Adapter", () => { describe("ENS reverse lookup", () => { it("returns a name for existing address", async () => { - const address = await web3Adapter.ensReverseLookup("0x203aBBf9F190009606C317439360c9f3c0874452") - - chai.expect(address).to.equal("marco.eth") + const name = await web3Adapter.ensReverseLookup("0x203aBBf9F190009606C317439360c9f3c0874452") + chai.expect(name).to.equal("marco.eth") }) it("throws an error if no name exists for address", async () => { @@ -38,4 +41,37 @@ describe.only("Web3Adapter", () => { } }) }) +}) + +describe.only("EthersAdapter", () => { + const provider = getDefaultProvider(`https://rinkeby.infura.io/v3/${process.env.INFURA_KEY}`) + const signer = new Wallet( + '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d', // A Safe owner + provider + ) + const ethersAdapter = new EthersAdapter({ ethers, signer }) + + describe("ENS direct lookup", () => { + it("returns an address for ens name", async () => { + const address = await ethersAdapter.ensLookup("safe.eth") + chai.expect(address).match(/0x[0-9a-z]{40}/i) + }) + + it("throws an error for a non existing name", async () => { + const address = await ethersAdapter.ensLookup("nonexistingname") + chai.expect(address).to.be.null + }) + }) + + describe("ENS reverse lookup", () => { + it("returns a name for existing address", async () => { + const name = await ethersAdapter.ensReverseLookup("0x203aBBf9F190009606C317439360c9f3c0874452") + chai.expect(name).to.equal("marco.eth") + }) + + it("returns null if no name exists for address", async () => { + const name = await ethersAdapter.ensReverseLookup("0x16B110D5b7583266B29159d89eF0d001adf6f6FD") + chai.expect(name).to.be.null + }) + }) }) \ No newline at end of file diff --git a/packages/safe-core-sdk/tsconfig.json b/packages/safe-core-sdk/tsconfig.json index 5b0327b09..560cb7edb 100644 --- a/packages/safe-core-sdk/tsconfig.json +++ b/packages/safe-core-sdk/tsconfig.json @@ -5,5 +5,5 @@ "outDir": "dist", "baseUrl": "src" }, - "include": ["src", "src/**/*.json", "typechain/src", "tests"] + "include": ["src", "src/**/*.json", "typechain/src"] } From 0ab298a32db9fe66b6083d93be211572be727327 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Thu, 6 Jan 2022 13:59:05 +0100 Subject: [PATCH 04/15] fix: Add eth-ens-namehash package --- packages/safe-core-sdk/package.json | 1 + packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts | 4 ++-- packages/safe-core-sdk/tests/ens.test.ts | 2 +- yarn.lock | 5 +++++ 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/safe-core-sdk/package.json b/packages/safe-core-sdk/package.json index 9bdf04a66..c4ebe03ae 100644 --- a/packages/safe-core-sdk/package.json +++ b/packages/safe-core-sdk/package.json @@ -90,6 +90,7 @@ } }, "dependencies": { + "@ensdomains/eth-ens-namehash": "^2.0.15", "@gnosis.pm/safe-core-sdk-types": "^0.1.1", "@gnosis.pm/safe-deployments": "^1.4.0", "ethereumjs-util": "^7.1.3" diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index 089a8b718..d8eef42ac 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -1,5 +1,5 @@ import Web3 from 'web3' -import { ethers } from 'ethers' +const namehash = require('@ensdomains/eth-ens-namehash') import { BigNumber } from '@ethersproject/bignumber' import { SafeVersion } from '../contracts/config' import { @@ -141,7 +141,7 @@ class Web3Adapter implements EthAdapter { async ensReverseLookup(address: string): Promise { const lookup = address.toLowerCase().substr(2) + '.addr.reverse' - const node = ethers.utils.namehash(lookup) + const node = namehash.hash(lookup) const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); return await ResolverContract.methods.name(node).call() } diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts index 1793a579c..4414c049a 100644 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -43,7 +43,7 @@ describe("Web3Adapter", () => { }) }) -describe.only("EthersAdapter", () => { +describe("EthersAdapter", () => { const provider = getDefaultProvider(`https://rinkeby.infura.io/v3/${process.env.INFURA_KEY}`) const signer = new Wallet( '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d', // A Safe owner diff --git a/yarn.lock b/yarn.lock index 238068ae8..baf061141 100644 --- a/yarn.lock +++ b/yarn.lock @@ -654,6 +654,11 @@ ethers "^5.0.13" js-sha3 "^0.8.0" +"@ensdomains/eth-ens-namehash@^2.0.15": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz#5e5f2f24ba802aff8bc19edd822c9a11200cdf4a" + integrity sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw== + "@ensdomains/resolver@0.2.4", "@ensdomains/resolver@^0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" From 87b974cf68c4199dd99f47e8e33c07a001537139 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Fri, 7 Jan 2022 09:21:42 +0100 Subject: [PATCH 05/15] fix: Replace substr with slice, remove async from method --- .../src/ethereumLibs/EthersAdapter.ts | 4 +- .../src/ethereumLibs/Web3Adapter.ts | 2 +- packages/safe-core-sdk/tests/ens.test.ts | 48 +++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts index 8872c42b6..1e55430ae 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts @@ -156,8 +156,8 @@ class EthersAdapter implements EthAdapter { return this.#provider.resolveName(name) } - async ensReverseLookup(address: string): Promise { - return await this.#provider.lookupAddress(address); + ensReverseLookup(address: string): Promise { + return this.#provider.lookupAddress(address); } } diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index d8eef42ac..e5d656a04 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -140,7 +140,7 @@ class Web3Adapter implements EthAdapter { } async ensReverseLookup(address: string): Promise { - const lookup = address.toLowerCase().substr(2) + '.addr.reverse' + const lookup = address.slice(-40) + '.addr.reverse' const node = namehash.hash(lookup) const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); return await ResolverContract.methods.name(node).call() diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts index 4414c049a..61f691ce7 100644 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -7,35 +7,35 @@ import chai from 'chai' import { getDefaultProvider } from '@ethersproject/providers' import { Wallet } from '@ethersproject/wallet' -describe("Web3Adapter", () => { +describe('Web3Adapter', () => { const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby-light.eth.linkpool.io/', {})) const web3Adapter = new Web3Adapter({web3, signerAddress: ZERO_ADDRESS}) - describe("ENS direct lookup", () => { - it("returns an address for ens name", async () => { - const address = await web3Adapter.ensLookup("safe.eth") + describe('ENS direct lookup', () => { + it('returns an address for ens name', async () => { + const address = await web3Adapter.ensLookup('safe.eth') chai.expect(address).match(/0x[0-9a-z]{40}/i) }) - it("throws an error for a non existing name", async () => { + it('throws an error for a non existing name', async () => { try { - await web3Adapter.ensLookup("nonexistingname") + await web3Adapter.ensLookup('nonexistingname') } catch(error) { - chai.expect((error as Error).message).to.equal("The resolver at 0x0000000000000000000000000000000000000000does not implement requested method: \"addr\".") + chai.expect((error as Error).message).to.equal('The resolver at 0x0000000000000000000000000000000000000000does not implement requested method: \"addr\".') } }) }) - describe("ENS reverse lookup", () => { - it("returns a name for existing address", async () => { - const name = await web3Adapter.ensReverseLookup("0x203aBBf9F190009606C317439360c9f3c0874452") + describe('ENS reverse lookup', () => { + it('returns a name for existing address', async () => { + const name = await web3Adapter.ensReverseLookup('0x203aBBf9F190009606C317439360c9f3c0874452') chai.expect(name).to.equal("marco.eth") }) - it("throws an error if no name exists for address", async () => { + it('throws an error if no name exists for address', async () => { try { - await web3Adapter.ensReverseLookup("0x16B110D5b7583266B29159d89eF0d001adf6f6FD") + await web3Adapter.ensReverseLookup('0x16B110D5b7583266B29159d89eF0d001adf6f6FD') } catch(error: any) { chai.expect(error.message).to.exist } @@ -43,7 +43,7 @@ describe("Web3Adapter", () => { }) }) -describe("EthersAdapter", () => { +describe('EthersAdapter', () => { const provider = getDefaultProvider(`https://rinkeby.infura.io/v3/${process.env.INFURA_KEY}`) const signer = new Wallet( '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d', // A Safe owner @@ -51,26 +51,26 @@ describe("EthersAdapter", () => { ) const ethersAdapter = new EthersAdapter({ ethers, signer }) - describe("ENS direct lookup", () => { - it("returns an address for ens name", async () => { - const address = await ethersAdapter.ensLookup("safe.eth") + describe('ENS direct lookup', () => { + it('returns an address for ens name', async () => { + const address = await ethersAdapter.ensLookup('safe.eth') chai.expect(address).match(/0x[0-9a-z]{40}/i) }) - it("throws an error for a non existing name", async () => { - const address = await ethersAdapter.ensLookup("nonexistingname") + it('throws an error for a non existing name', async () => { + const address = await ethersAdapter.ensLookup('nonexistingname') chai.expect(address).to.be.null }) }) - describe("ENS reverse lookup", () => { - it("returns a name for existing address", async () => { - const name = await ethersAdapter.ensReverseLookup("0x203aBBf9F190009606C317439360c9f3c0874452") - chai.expect(name).to.equal("marco.eth") + describe('ENS reverse lookup', () => { + it('returns a name for existing address', async () => { + const name = await ethersAdapter.ensReverseLookup('0x203aBBf9F190009606C317439360c9f3c0874452') + chai.expect(name).to.equal('marco.eth') }) - it("returns null if no name exists for address", async () => { - const name = await ethersAdapter.ensReverseLookup("0x16B110D5b7583266B29159d89eF0d001adf6f6FD") + it('returns null if no name exists for address', async () => { + const name = await ethersAdapter.ensReverseLookup('0x16B110D5b7583266B29159d89eF0d001adf6f6FD') chai.expect(name).to.be.null }) }) From d9026fedcb97fbe5de67f51bb3c1aaddd5045878 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Fri, 7 Jan 2022 14:00:30 +0100 Subject: [PATCH 06/15] fix: Remove eth-ens package and use ethers sub-module instead for namehash --- packages/safe-core-sdk/package.json | 1 - packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts | 9 ++++----- packages/safe-core-sdk/tests/ens.test.ts | 2 +- yarn.lock | 5 ----- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/safe-core-sdk/package.json b/packages/safe-core-sdk/package.json index c4ebe03ae..9bdf04a66 100644 --- a/packages/safe-core-sdk/package.json +++ b/packages/safe-core-sdk/package.json @@ -90,7 +90,6 @@ } }, "dependencies": { - "@ensdomains/eth-ens-namehash": "^2.0.15", "@gnosis.pm/safe-core-sdk-types": "^0.1.1", "@gnosis.pm/safe-deployments": "^1.4.0", "ethereumjs-util": "^7.1.3" diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index e5d656a04..f36c5e4b8 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -1,6 +1,5 @@ -import Web3 from 'web3' -const namehash = require('@ensdomains/eth-ens-namehash') import { BigNumber } from '@ethersproject/bignumber' +import { namehash } from '@ethersproject/hash' import { SafeVersion } from '../contracts/config' import { getGnosisSafeProxyFactoryContractInstance, @@ -20,13 +19,13 @@ import EthAdapter, { EthAdapterTransaction, GetSafeContractProps } from './EthAd export interface Web3AdapterConfig { /** web3 - Web3 library */ - web3: Web3 + web3: any /** signerAddress - Address of the signer */ signerAddress: string } class Web3Adapter implements EthAdapter { - #web3: Web3 + #web3: any #signerAddress: string constructor({ web3, signerAddress }: Web3AdapterConfig) { @@ -141,7 +140,7 @@ class Web3Adapter implements EthAdapter { async ensReverseLookup(address: string): Promise { const lookup = address.slice(-40) + '.addr.reverse' - const node = namehash.hash(lookup) + const node = namehash(lookup) const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); return await ResolverContract.methods.name(node).call() } diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts index 61f691ce7..9d6d5ce31 100644 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -35,7 +35,7 @@ describe('Web3Adapter', () => { it('throws an error if no name exists for address', async () => { try { - await web3Adapter.ensReverseLookup('0x16B110D5b7583266B29159d89eF0d001adf6f6FD') + await web3Adapter.ensReverseLookup(ZERO_ADDRESS) } catch(error: any) { chai.expect(error.message).to.exist } diff --git a/yarn.lock b/yarn.lock index baf061141..238068ae8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -654,11 +654,6 @@ ethers "^5.0.13" js-sha3 "^0.8.0" -"@ensdomains/eth-ens-namehash@^2.0.15": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz#5e5f2f24ba802aff8bc19edd822c9a11200cdf4a" - integrity sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw== - "@ensdomains/resolver@0.2.4", "@ensdomains/resolver@^0.2.4": version "0.2.4" resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" From 25764673822756a1d8ac6d1504850ec499131597 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Fri, 7 Jan 2022 14:01:48 +0100 Subject: [PATCH 07/15] chore: Adjust slice call --- packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index f36c5e4b8..9db9249ca 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -139,7 +139,7 @@ class Web3Adapter implements EthAdapter { } async ensReverseLookup(address: string): Promise { - const lookup = address.slice(-40) + '.addr.reverse' + const lookup = address.slice(2) + '.addr.reverse' const node = namehash(lookup) const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); return await ResolverContract.methods.name(node).call() From 2b7a1be35864015948efee46ab7206a33fe84b18 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Fri, 7 Jan 2022 14:53:10 +0100 Subject: [PATCH 08/15] chore: Change ens test adress --- packages/safe-core-sdk/tests/ens.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts index 9d6d5ce31..e5f563956 100644 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -29,8 +29,8 @@ describe('Web3Adapter', () => { describe('ENS reverse lookup', () => { it('returns a name for existing address', async () => { - const name = await web3Adapter.ensReverseLookup('0x203aBBf9F190009606C317439360c9f3c0874452') - chai.expect(name).to.equal("marco.eth") + const name = await web3Adapter.ensReverseLookup('0xd8bbcb76bc9aea78972ed4773a5eb67b413f26a5') + chai.expect(name).to.equal("loremipsum.eth") }) it('throws an error if no name exists for address', async () => { @@ -65,8 +65,8 @@ describe('EthersAdapter', () => { describe('ENS reverse lookup', () => { it('returns a name for existing address', async () => { - const name = await ethersAdapter.ensReverseLookup('0x203aBBf9F190009606C317439360c9f3c0874452') - chai.expect(name).to.equal('marco.eth') + const name = await ethersAdapter.ensReverseLookup('0xd8bbcb76bc9aea78972ed4773a5eb67b413f26a5') + chai.expect(name).to.equal('loremipsum.eth') }) it('returns null if no name exists for address', async () => { From 0d1af55ceeb471b9e0bd8b6d05a4099e9e8d7788 Mon Sep 17 00:00:00 2001 From: James Prestwich <10149425+prestwich@users.noreply.github.com> Date: Sun, 9 Jan 2022 10:41:21 -0800 Subject: [PATCH 09/15] fix: correct package name in safe-ethers-adapters --- packages/safe-ethers-adapters/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/safe-ethers-adapters/package.json b/packages/safe-ethers-adapters/package.json index a0288a153..d71a34848 100644 --- a/packages/safe-ethers-adapters/package.json +++ b/packages/safe-ethers-adapters/package.json @@ -73,7 +73,7 @@ } }, "peerDependencies": { - "@ethersproject/abstract-providers": "^5.0.0", + "@ethersproject/abstract-provider": "^5.0.0", "@ethersproject/abstract-signer": "^5.0.0", "@ethersproject/bignumber": "^5.0.0", "@ethersproject/properties": "^5.0.0" From 371ec1bb6739443e2ab7a91d769db04945809c83 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Mon, 10 Jan 2022 14:18:12 +0100 Subject: [PATCH 10/15] fix: Streamline error handling for ens lookup in both adapters --- .../src/ethereumLibs/EthAdapter.ts | 4 +-- .../src/ethereumLibs/EthersAdapter.ts | 21 +++++++++++--- .../src/ethereumLibs/Web3Adapter.ts | 18 +++++++++--- .../src/ethereumLibs/exceptions.ts | 6 ++++ packages/safe-core-sdk/tests/ens.test.ts | 28 +++++++++++++------ 5 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 packages/safe-core-sdk/src/ethereumLibs/exceptions.ts diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts index bd433ac81..5b231f4d7 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts @@ -48,8 +48,8 @@ interface EthAdapter { signMessage(message: string, signerAddress: string): Promise estimateGas(transaction: EthAdapterTransaction, options?: string): Promise call(transaction: EthAdapterTransaction): Promise - ensLookup(name: string): Promise - ensReverseLookup(address: string): Promise + ensLookup(name: string): Promise + ensReverseLookup(address: string): Promise } export default EthAdapter diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts index 1e55430ae..ff30bc4ce 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts @@ -19,6 +19,7 @@ import { } from '../contracts/safeDeploymentContracts' import { AbiItem } from '../types' import EthAdapter, { EthAdapterTransaction, GetSafeContractProps } from './EthAdapter' +import ErrorCodes from './exceptions' export interface EthersAdapterConfig { /** ethers - Ethers v5 library */ @@ -152,12 +153,24 @@ class EthersAdapter implements EthAdapter { return this.#provider.call(transaction) } - ensLookup(name: string): Promise { - return this.#provider.resolveName(name) + async ensLookup(name: string): Promise { + const address = await this.#provider.resolveName(name) + + if (!address) { + throw new Error(ErrorCodes._100) + } + + return address } - ensReverseLookup(address: string): Promise { - return this.#provider.lookupAddress(address); + async ensReverseLookup(address: string): Promise { + const name = await this.#provider.lookupAddress(address); + + if (!name) { + throw new Error(ErrorCodes._101) + } + + return name } } diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index 9db9249ca..1ddd98263 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -16,6 +16,7 @@ import { } from '../contracts/safeDeploymentContracts' import { AbiItem } from '../types' import EthAdapter, { EthAdapterTransaction, GetSafeContractProps } from './EthAdapter' +import ErrorCodes from './exceptions' export interface Web3AdapterConfig { /** web3 - Web3 library */ @@ -134,15 +135,24 @@ class Web3Adapter implements EthAdapter { return this.#web3.eth.call(transaction) } - ensLookup(name: string): Promise { - return this.#web3.eth.ens.getAddress(name) + async ensLookup(name: string): Promise { + try { + return await this.#web3.eth.ens.getAddress(name) + } catch (error) { + throw new Error(ErrorCodes._100) + } } async ensReverseLookup(address: string): Promise { const lookup = address.slice(2) + '.addr.reverse' const node = namehash(lookup) - const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); - return await ResolverContract.methods.name(node).call() + + try { + const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); + return await ResolverContract.methods.name(node).call() + } catch (error) { + throw new Error(ErrorCodes._101) + } } } diff --git a/packages/safe-core-sdk/src/ethereumLibs/exceptions.ts b/packages/safe-core-sdk/src/ethereumLibs/exceptions.ts new file mode 100644 index 000000000..bdc527e79 --- /dev/null +++ b/packages/safe-core-sdk/src/ethereumLibs/exceptions.ts @@ -0,0 +1,6 @@ +enum ErrorCodes { + _100 = 'Error retrieving address for ENS Name', + _101 = 'Error retrieving ENS Name for address' +} + +export default ErrorCodes \ No newline at end of file diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts index e5f563956..fc3e1992c 100644 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ b/packages/safe-core-sdk/tests/ens.test.ts @@ -6,6 +6,7 @@ import { ZERO_ADDRESS } from '../src/utils/constants' import chai from 'chai' import { getDefaultProvider } from '@ethersproject/providers' import { Wallet } from '@ethersproject/wallet' +import ErrorCodes from '../src/ethereumLibs/exceptions' describe('Web3Adapter', () => { const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby-light.eth.linkpool.io/', {})) @@ -13,16 +14,16 @@ describe('Web3Adapter', () => { describe('ENS direct lookup', () => { it('returns an address for ens name', async () => { - const address = await web3Adapter.ensLookup('safe.eth') - + const address = await web3Adapter.ensLookup('loremipsum.eth') chai.expect(address).match(/0x[0-9a-z]{40}/i) }) it('throws an error for a non existing name', async () => { try { await web3Adapter.ensLookup('nonexistingname') + chai.expect(true).to.be.false } catch(error) { - chai.expect((error as Error).message).to.equal('The resolver at 0x0000000000000000000000000000000000000000does not implement requested method: \"addr\".') + chai.expect((error as Error).message).to.equal(ErrorCodes._100) } }) }) @@ -36,8 +37,9 @@ describe('Web3Adapter', () => { it('throws an error if no name exists for address', async () => { try { await web3Adapter.ensReverseLookup(ZERO_ADDRESS) - } catch(error: any) { - chai.expect(error.message).to.exist + chai.expect(true).to.be.false + } catch(error) { + chai.expect((error as Error).message).to.equal(ErrorCodes._101) } }) }) @@ -58,8 +60,12 @@ describe('EthersAdapter', () => { }) it('throws an error for a non existing name', async () => { - const address = await ethersAdapter.ensLookup('nonexistingname') - chai.expect(address).to.be.null + try { + await ethersAdapter.ensLookup('nonexistingname') + chai.expect(true).to.be.false + } catch (error) { + chai.expect((error as Error).message).to.equal(ErrorCodes._100) + } }) }) @@ -70,8 +76,12 @@ describe('EthersAdapter', () => { }) it('returns null if no name exists for address', async () => { - const name = await ethersAdapter.ensReverseLookup('0x16B110D5b7583266B29159d89eF0d001adf6f6FD') - chai.expect(name).to.be.null + try { + await ethersAdapter.ensReverseLookup(ZERO_ADDRESS) + chai.expect(true).to.be.false + } catch (error) { + chai.expect((error as Error).message).to.equal(ErrorCodes._101) + } }) }) }) \ No newline at end of file From dca22c39a8b6362f78a5840c2a1dc0b2edc431a0 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Mon, 10 Jan 2022 15:52:47 +0100 Subject: [PATCH 11/15] fix: Add try catch block to EthersAdapter ens lookups --- .../src/ethereumLibs/EthersAdapter.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts index ff30bc4ce..f5c1dbb7d 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts @@ -154,23 +154,32 @@ class EthersAdapter implements EthAdapter { } async ensLookup(name: string): Promise { - const address = await this.#provider.resolveName(name) + try { + const address = await this.#provider.resolveName(name) - if (!address) { + if (!address) { + throw new Error(ErrorCodes._100) + } + + return address + } catch (error) { throw new Error(ErrorCodes._100) } - return address } async ensReverseLookup(address: string): Promise { - const name = await this.#provider.lookupAddress(address); + try { + const name = await this.#provider.lookupAddress(address); + + if (!name) { + throw new Error(ErrorCodes._101) + } - if (!name) { + return name + } catch (error) { throw new Error(ErrorCodes._101) } - - return name } } From 86d6638c7895913e3d9dccaa8dad01c8712ff3e2 Mon Sep 17 00:00:00 2001 From: Usame Algan Date: Mon, 10 Jan 2022 16:24:39 +0100 Subject: [PATCH 12/15] refactor: Adjust EthersAdapter error handling --- .../src/ethereumLibs/EthersAdapter.ts | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts index f5c1dbb7d..609646dc0 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts @@ -154,32 +154,36 @@ class EthersAdapter implements EthAdapter { } async ensLookup(name: string): Promise { - try { - const address = await this.#provider.resolveName(name) - - if (!address) { - throw new Error(ErrorCodes._100) - } + let address: string | null - return address + try { + address = await this.#provider.resolveName(name) } catch (error) { + address = null + } + + if (!address) { throw new Error(ErrorCodes._100) } + return address + } async ensReverseLookup(address: string): Promise { - try { - const name = await this.#provider.lookupAddress(address); - - if (!name) { - throw new Error(ErrorCodes._101) - } + let name: string | null - return name + try { + name = await this.#provider.lookupAddress(address); } catch (error) { + name = null + } + + if (!name) { throw new Error(ErrorCodes._101) } + + return name } } From 7b924b024b279967afe92ec924a83d2561e10d1f Mon Sep 17 00:00:00 2001 From: Usame Algan <5880855+usame-algan@users.noreply.github.com> Date: Mon, 17 Jan 2022 12:05:49 +0100 Subject: [PATCH 13/15] Revert "feat: Add ENS lookup methods" --- .github/workflows/cla.yml | 2 +- .gitignore | 1 - .../src/ethereumLibs/EthAdapter.ts | 2 - .../src/ethereumLibs/EthersAdapter.ts | 34 -------- .../src/ethereumLibs/Web3Adapter.ts | 26 +----- .../src/ethereumLibs/exceptions.ts | 6 -- packages/safe-core-sdk/tests/ens.test.ts | 87 ------------------- 7 files changed, 3 insertions(+), 155 deletions(-) delete mode 100644 packages/safe-core-sdk/src/ethereumLibs/exceptions.ts delete mode 100644 packages/safe-core-sdk/tests/ens.test.ts diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml index c521260a0..471ee4ef5 100644 --- a/.github/workflows/cla.yml +++ b/.github/workflows/cla.yml @@ -20,6 +20,6 @@ jobs: path-to-signatures: 'signatures/version1/cla.json' path-to-cla-document: 'https://gnosis-safe.io/cla/' branch: 'cla-signatures' - allowlist: germartinez,mikheevm,rmeissner,Uxio0,dasanra,davidalbela,luarx,giacomolicari,lukasschor,tschubotz,gnosis-info,bot*,katspaugh,usame-algan + allowlist: germartinez,mikheevm,rmeissner,Uxio0,dasanra,davidalbela,luarx,giacomolicari,lukasschor,tschubotz,gnosis-info,bot*,katspaugh empty-commit-flag: false blockchain-storage-flag: false diff --git a/.gitignore b/.gitignore index 46be1b063..1d6f82d93 100644 --- a/.gitignore +++ b/.gitignore @@ -58,4 +58,3 @@ deployments typechain openapi/ -.idea \ No newline at end of file diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts index 5b231f4d7..4aaba31cb 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthAdapter.ts @@ -48,8 +48,6 @@ interface EthAdapter { signMessage(message: string, signerAddress: string): Promise estimateGas(transaction: EthAdapterTransaction, options?: string): Promise call(transaction: EthAdapterTransaction): Promise - ensLookup(name: string): Promise - ensReverseLookup(address: string): Promise } export default EthAdapter diff --git a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts index 609646dc0..615cb55ba 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/EthersAdapter.ts @@ -19,7 +19,6 @@ import { } from '../contracts/safeDeploymentContracts' import { AbiItem } from '../types' import EthAdapter, { EthAdapterTransaction, GetSafeContractProps } from './EthAdapter' -import ErrorCodes from './exceptions' export interface EthersAdapterConfig { /** ethers - Ethers v5 library */ @@ -152,39 +151,6 @@ class EthersAdapter implements EthAdapter { call(transaction: EthAdapterTransaction): Promise { return this.#provider.call(transaction) } - - async ensLookup(name: string): Promise { - let address: string | null - - try { - address = await this.#provider.resolveName(name) - } catch (error) { - address = null - } - - if (!address) { - throw new Error(ErrorCodes._100) - } - - return address - - } - - async ensReverseLookup(address: string): Promise { - let name: string | null - - try { - name = await this.#provider.lookupAddress(address); - } catch (error) { - name = null - } - - if (!name) { - throw new Error(ErrorCodes._101) - } - - return name - } } export default EthersAdapter diff --git a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts index 1ddd98263..8d78986af 100644 --- a/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts +++ b/packages/safe-core-sdk/src/ethereumLibs/Web3Adapter.ts @@ -1,5 +1,4 @@ import { BigNumber } from '@ethersproject/bignumber' -import { namehash } from '@ethersproject/hash' import { SafeVersion } from '../contracts/config' import { getGnosisSafeProxyFactoryContractInstance, @@ -16,7 +15,6 @@ import { } from '../contracts/safeDeploymentContracts' import { AbiItem } from '../types' import EthAdapter, { EthAdapterTransaction, GetSafeContractProps } from './EthAdapter' -import ErrorCodes from './exceptions' export interface Web3AdapterConfig { /** web3 - Web3 library */ @@ -107,7 +105,7 @@ class Web3Adapter implements EthAdapter { return getGnosisSafeProxyFactoryContractInstance(safeVersion, proxyFactoryContract) } - getContract(address: string, abi: any): any { + getContract(address: string, abi: AbiItem[]): any { return new this.#web3.eth.Contract(abi, address) } @@ -127,33 +125,13 @@ class Web3Adapter implements EthAdapter { return this.#web3.eth.sign(message, this.#signerAddress) } - estimateGas(transaction: EthAdapterTransaction, options?: any): Promise { + estimateGas(transaction: EthAdapterTransaction, options?: string): Promise { return this.#web3.eth.estimateGas(transaction, options) } call(transaction: EthAdapterTransaction): Promise { return this.#web3.eth.call(transaction) } - - async ensLookup(name: string): Promise { - try { - return await this.#web3.eth.ens.getAddress(name) - } catch (error) { - throw new Error(ErrorCodes._100) - } - } - - async ensReverseLookup(address: string): Promise { - const lookup = address.slice(2) + '.addr.reverse' - const node = namehash(lookup) - - try { - const ResolverContract = await this.#web3.eth.ens.getResolver(lookup); - return await ResolverContract.methods.name(node).call() - } catch (error) { - throw new Error(ErrorCodes._101) - } - } } export default Web3Adapter diff --git a/packages/safe-core-sdk/src/ethereumLibs/exceptions.ts b/packages/safe-core-sdk/src/ethereumLibs/exceptions.ts deleted file mode 100644 index bdc527e79..000000000 --- a/packages/safe-core-sdk/src/ethereumLibs/exceptions.ts +++ /dev/null @@ -1,6 +0,0 @@ -enum ErrorCodes { - _100 = 'Error retrieving address for ENS Name', - _101 = 'Error retrieving ENS Name for address' -} - -export default ErrorCodes \ No newline at end of file diff --git a/packages/safe-core-sdk/tests/ens.test.ts b/packages/safe-core-sdk/tests/ens.test.ts deleted file mode 100644 index fc3e1992c..000000000 --- a/packages/safe-core-sdk/tests/ens.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import Web3 from 'web3' -import { ethers } from 'hardhat' -import { Web3Adapter } from '../src' -import { EthersAdapter } from '../dist/src' -import { ZERO_ADDRESS } from '../src/utils/constants' -import chai from 'chai' -import { getDefaultProvider } from '@ethersproject/providers' -import { Wallet } from '@ethersproject/wallet' -import ErrorCodes from '../src/ethereumLibs/exceptions' - -describe('Web3Adapter', () => { - const web3 = new Web3(new Web3.providers.HttpProvider('https://rinkeby-light.eth.linkpool.io/', {})) - const web3Adapter = new Web3Adapter({web3, signerAddress: ZERO_ADDRESS}) - - describe('ENS direct lookup', () => { - it('returns an address for ens name', async () => { - const address = await web3Adapter.ensLookup('loremipsum.eth') - chai.expect(address).match(/0x[0-9a-z]{40}/i) - }) - - it('throws an error for a non existing name', async () => { - try { - await web3Adapter.ensLookup('nonexistingname') - chai.expect(true).to.be.false - } catch(error) { - chai.expect((error as Error).message).to.equal(ErrorCodes._100) - } - }) - }) - - describe('ENS reverse lookup', () => { - it('returns a name for existing address', async () => { - const name = await web3Adapter.ensReverseLookup('0xd8bbcb76bc9aea78972ed4773a5eb67b413f26a5') - chai.expect(name).to.equal("loremipsum.eth") - }) - - it('throws an error if no name exists for address', async () => { - try { - await web3Adapter.ensReverseLookup(ZERO_ADDRESS) - chai.expect(true).to.be.false - } catch(error) { - chai.expect((error as Error).message).to.equal(ErrorCodes._101) - } - }) - }) -}) - -describe('EthersAdapter', () => { - const provider = getDefaultProvider(`https://rinkeby.infura.io/v3/${process.env.INFURA_KEY}`) - const signer = new Wallet( - '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d', // A Safe owner - provider - ) - const ethersAdapter = new EthersAdapter({ ethers, signer }) - - describe('ENS direct lookup', () => { - it('returns an address for ens name', async () => { - const address = await ethersAdapter.ensLookup('safe.eth') - chai.expect(address).match(/0x[0-9a-z]{40}/i) - }) - - it('throws an error for a non existing name', async () => { - try { - await ethersAdapter.ensLookup('nonexistingname') - chai.expect(true).to.be.false - } catch (error) { - chai.expect((error as Error).message).to.equal(ErrorCodes._100) - } - }) - }) - - describe('ENS reverse lookup', () => { - it('returns a name for existing address', async () => { - const name = await ethersAdapter.ensReverseLookup('0xd8bbcb76bc9aea78972ed4773a5eb67b413f26a5') - chai.expect(name).to.equal('loremipsum.eth') - }) - - it('returns null if no name exists for address', async () => { - try { - await ethersAdapter.ensReverseLookup(ZERO_ADDRESS) - chai.expect(true).to.be.false - } catch (error) { - chai.expect((error as Error).message).to.equal(ErrorCodes._101) - } - }) - }) -}) \ No newline at end of file From 926c3e266bf1c9eb6493dfe9c522988327c22d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADnez?= Date: Tue, 18 Jan 2022 00:24:30 +0100 Subject: [PATCH 14/15] 0.1.0-alpha.7 safe-ethers-adapters --- packages/safe-ethers-adapters/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/safe-ethers-adapters/package.json b/packages/safe-ethers-adapters/package.json index d71a34848..0218cb117 100644 --- a/packages/safe-ethers-adapters/package.json +++ b/packages/safe-ethers-adapters/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis.pm/safe-ethers-adapters", - "version": "0.1.0-alpha.6", + "version": "0.1.0-alpha.7", "description": "Safe Ethers Adapters", "main": "dist/src/index.js", "typings": "dist/src/index.d.ts", From 000721f37fbc473330212de3b55a988e843ec8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Mart=C3=ADnez?= Date: Tue, 18 Jan 2022 12:51:38 +0100 Subject: [PATCH 15/15] v1.1.0 safe-service-client --- packages/safe-service-client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/safe-service-client/package.json b/packages/safe-service-client/package.json index fdde24a70..2ed8382f4 100644 --- a/packages/safe-service-client/package.json +++ b/packages/safe-service-client/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis.pm/safe-service-client", - "version": "1.0.1", + "version": "1.1.0", "description": "Safe Service Client", "main": "dist/src/index.js", "typings": "dist/src/index.d.ts",