From 18265cb53d801b2af4809d4795418fa5c24c009e Mon Sep 17 00:00:00 2001 From: farque65 Date: Sun, 6 Feb 2022 21:37:43 -0500 Subject: [PATCH 1/4] reset --- .../functions/handlers/filterEnsAddress.js | 36 ++++++++++++++ .../functions/handlers/filterEnsAddresses.js | 48 +++++++++++++++++++ packages/backend/functions/handlers/index.js | 1 + 3 files changed, 85 insertions(+) create mode 100644 packages/backend/functions/handlers/filterEnsAddress.js create mode 100644 packages/backend/functions/handlers/filterEnsAddresses.js diff --git a/packages/backend/functions/handlers/filterEnsAddress.js b/packages/backend/functions/handlers/filterEnsAddress.js new file mode 100644 index 00000000..59653230 --- /dev/null +++ b/packages/backend/functions/handlers/filterEnsAddress.js @@ -0,0 +1,36 @@ +const ethers = require("ethers"); + +async function lookupAddress(provider, address) { + if (address && utils.isAddress(address)) { + // console.log(`looking up ${address}`) + try { + // Accuracy of reverse resolution is not enforced. + // We then manually ensure that the reported ens name resolves to address + const reportedName = await provider.lookupAddress(address); + + const resolvedAddress = await provider.resolveName(reportedName); + + if (address && utils.getAddress(address) === utils.getAddress(resolvedAddress)) { + return reportedName; + } + return utils.getAddress(address); + } catch (e) { + return utils.getAddress(address); + } + } + return 0; +} + +module.exports = functions.https.onCall(async (data, context) => { + const { provider, addresses } = data; + + // recover address from signature + const recovered = ethers.utils.verifyMessage(room, signature).toLowerCase(); + + // validate address + if (!ethers.utils.isAddress(recovered)) { + throw new functions.https.HttpsError("Invalid signer", "Please sign room with your wallet"); + } + + return { validAddresses }; +}); diff --git a/packages/backend/functions/handlers/filterEnsAddresses.js b/packages/backend/functions/handlers/filterEnsAddresses.js new file mode 100644 index 00000000..9a382948 --- /dev/null +++ b/packages/backend/functions/handlers/filterEnsAddresses.js @@ -0,0 +1,48 @@ +const ethers = require("ethers"); + +async function lookupAddress(provider, address) { + if (address && utils.isAddress(address)) { + // console.log(`looking up ${address}`) + try { + // Accuracy of reverse resolution is not enforced. + // We then manually ensure that the reported ens name resolves to address + const reportedName = await provider.lookupAddress(address); + + const resolvedAddress = await provider.resolveName(reportedName); + + if (address && utils.getAddress(address) === utils.getAddress(resolvedAddress)) { + return reportedName; + } + return utils.getAddress(address); + } catch (e) { + return utils.getAddress(address); + } + } + return 0; +} + +const useLookupAddress = (provider, address) => { + lookupAddress(provider, address).then(name => { + if (name) { + setEnsName(name); + } + }); + return ensName; +}; + +module.exports = functions.https.onCall(async (data, context) => { + const { provider, addresses } = data; + + const validAddresses = []; + + for (const address in addresses) { + const ens = useLookupAddress(provider, address); + const ensSplit = ens && ens.split("."); + const validEnsCheck = ensSplit && ensSplit[ensSplit.length - 1] === "eth"; + if (validEnsCheck) { + validAddresses.push(address); + } + } + + return { validAddresses }; +}); diff --git a/packages/backend/functions/handlers/index.js b/packages/backend/functions/handlers/index.js index d99da377..09ab7adc 100644 --- a/packages/backend/functions/handlers/index.js +++ b/packages/backend/functions/handlers/index.js @@ -6,4 +6,5 @@ module.exports = { signRoom, addRoomTx, addRoomToken, + filterEnsAddresses, }; From c6a364cc065636f9ac5cef66e8d5ba807e5ccfda Mon Sep 17 00:00:00 2001 From: farque65 Date: Mon, 7 Feb 2022 12:57:35 -0500 Subject: [PATCH 2/4] Added Blacklist Addresses --- .../functions/handlers/filterEnsAddress.js | 36 ------------------- .../functions/handlers/filterEnsAddresses.js | 5 ++- 2 files changed, 4 insertions(+), 37 deletions(-) delete mode 100644 packages/backend/functions/handlers/filterEnsAddress.js diff --git a/packages/backend/functions/handlers/filterEnsAddress.js b/packages/backend/functions/handlers/filterEnsAddress.js deleted file mode 100644 index 59653230..00000000 --- a/packages/backend/functions/handlers/filterEnsAddress.js +++ /dev/null @@ -1,36 +0,0 @@ -const ethers = require("ethers"); - -async function lookupAddress(provider, address) { - if (address && utils.isAddress(address)) { - // console.log(`looking up ${address}`) - try { - // Accuracy of reverse resolution is not enforced. - // We then manually ensure that the reported ens name resolves to address - const reportedName = await provider.lookupAddress(address); - - const resolvedAddress = await provider.resolveName(reportedName); - - if (address && utils.getAddress(address) === utils.getAddress(resolvedAddress)) { - return reportedName; - } - return utils.getAddress(address); - } catch (e) { - return utils.getAddress(address); - } - } - return 0; -} - -module.exports = functions.https.onCall(async (data, context) => { - const { provider, addresses } = data; - - // recover address from signature - const recovered = ethers.utils.verifyMessage(room, signature).toLowerCase(); - - // validate address - if (!ethers.utils.isAddress(recovered)) { - throw new functions.https.HttpsError("Invalid signer", "Please sign room with your wallet"); - } - - return { validAddresses }; -}); diff --git a/packages/backend/functions/handlers/filterEnsAddresses.js b/packages/backend/functions/handlers/filterEnsAddresses.js index 9a382948..a728baf1 100644 --- a/packages/backend/functions/handlers/filterEnsAddresses.js +++ b/packages/backend/functions/handlers/filterEnsAddresses.js @@ -34,6 +34,7 @@ module.exports = functions.https.onCall(async (data, context) => { const { provider, addresses } = data; const validAddresses = []; + const blacklistAddresses = []; for (const address in addresses) { const ens = useLookupAddress(provider, address); @@ -41,8 +42,10 @@ module.exports = functions.https.onCall(async (data, context) => { const validEnsCheck = ensSplit && ensSplit[ensSplit.length - 1] === "eth"; if (validEnsCheck) { validAddresses.push(address); + } else { + blacklistAddresses.push(address); } } - return { validAddresses }; + return { validAddresses, blacklistAddresses }; }); From 02f3e1f3c52534d2eb1c49de5f5cdc88377ece7d Mon Sep 17 00:00:00 2001 From: farque65 Date: Wed, 9 Feb 2022 13:00:47 -0500 Subject: [PATCH 3/4] Function Implementation --- packages/react-app/src/utils/storage.js | 5 +++ packages/react-app/src/views/HostRoom.jsx | 42 +++++++++++++++-------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/packages/react-app/src/utils/storage.js b/packages/react-app/src/utils/storage.js index a4394951..f6030be1 100644 --- a/packages/react-app/src/utils/storage.js +++ b/packages/react-app/src/utils/storage.js @@ -45,3 +45,8 @@ export const registerTransactionForRoom = (room, hash, network) => { return addRoomTxFunction({ room, hash, network }); }; + +export const filterEnsAddresses = (provider, addresses) => { + const filterEnsAddressesFunction = httpsCallable(functions, "filterEnsAddresses"); + return filterEnsAddressesFunction({ provider, addresses }); +}; diff --git a/packages/react-app/src/views/HostRoom.jsx b/packages/react-app/src/views/HostRoom.jsx index e5094e5a..c47b1962 100644 --- a/packages/react-app/src/views/HostRoom.jsx +++ b/packages/react-app/src/views/HostRoom.jsx @@ -94,8 +94,8 @@ export default function HostRoom({ const parsedImports = JSON.parse(imports); setImportedAddresses(parsedImports); } - const blacklistInStorage = localStorage.getItem(room+"blacklist"); - if(blacklistInStorage){ + const blacklistInStorage = localStorage.getItem(room + "blacklist"); + if (blacklistInStorage) { const parsedBlacklist = JSON.parse(blacklistInStorage); setBlacklist(parsedBlacklist); } @@ -220,17 +220,16 @@ export default function HostRoom({ const handleListUpdate = list => { const updatedList = new Set([...addresses, ...list]); - - //removes addresses that are in blacklist - const blacklistInStorage = localStorage.getItem(room+"blacklist"); - if(blacklistInStorage && updatedList){ - const parsedBlacklist = JSON.parse(blacklistInStorage); - updatedList.forEach((addr) => { - if (parsedBlacklist.includes(addr.toLowerCase())) { - updatedList.delete(addr); - } - }); - } + //removes addresses that are in blacklist + const blacklistInStorage = localStorage.getItem(room + "blacklist"); + if (blacklistInStorage && updatedList) { + const parsedBlacklist = JSON.parse(blacklistInStorage); + updatedList.forEach(addr => { + if (parsedBlacklist.includes(addr.toLowerCase())) { + updatedList.delete(addr); + } + }); + } // update addresses list setAddresses([...updatedList]); @@ -340,6 +339,11 @@ export default function HostRoom({ } }; + const handleFilterEns = async (provider, addresses) => { + const { validAddresses, blacklistAddresses } = await storage.filterEnsAddresses(provider, addresses); + unList(blacklistAddresses); + }; + const reList = index => { const addressChanged = blacklist[index]; const updatedAddressesList = [...blacklist]; @@ -353,7 +357,7 @@ export default function HostRoom({ const updatedAddressesList = [...addresses]; updatedAddressesList.splice(index, 1); setAddresses([...updatedAddressesList]); - localStorage.setItem(room+"blacklist", JSON.stringify([...blacklist, addressChanged])); + localStorage.setItem(room + "blacklist", JSON.stringify([...blacklist, addressChanged])); setBlacklist([...blacklist, addressChanged]); }; const removeImportedAddress = index => { @@ -429,7 +433,14 @@ export default function HostRoom({ paddingBottom: 40, }} > - +
@@ -452,6 +463,7 @@ export default function HostRoom({ > Import Address + +
From 58d368b75ce44c07c23fc25a35f305da03cc3df7 Mon Sep 17 00:00:00 2001 From: farque65 Date: Thu, 10 Feb 2022 13:59:36 -0500 Subject: [PATCH 4/4] Updated Functions --- packages/backend/functions/.eslintrc.js | 3 ++ .../functions/handlers/filterEnsAddresses.js | 44 ++++++++++--------- packages/backend/functions/index.js | 1 + packages/react-app/src/views/HostRoom.jsx | 40 ++++++++++------- 4 files changed, 51 insertions(+), 37 deletions(-) diff --git a/packages/backend/functions/.eslintrc.js b/packages/backend/functions/.eslintrc.js index 0febcf15..b72c0489 100644 --- a/packages/backend/functions/.eslintrc.js +++ b/packages/backend/functions/.eslintrc.js @@ -4,6 +4,9 @@ module.exports = { es6: true, node: true, }, + parserOptions: { + ecmaVersion: 8, + }, extends: ["plugin:prettier/recommended"], rules: { quotes: ["error", "double"], diff --git a/packages/backend/functions/handlers/filterEnsAddresses.js b/packages/backend/functions/handlers/filterEnsAddresses.js index 822069e6..bf399f86 100644 --- a/packages/backend/functions/handlers/filterEnsAddresses.js +++ b/packages/backend/functions/handlers/filterEnsAddresses.js @@ -1,43 +1,47 @@ +const functions = require("firebase-functions"); const ethers = require("ethers"); module.exports = functions.https.onCall(async (data, context) => { - const { provider, addresses, importedAddresses } = data; + const { mainnetProviderUrl, addresses, importedAddresses } = data; - async function lookupAddress(provider, address) { + const lookupAddress = async (provider, address) => { if (address && ethers.utils.isAddress(address)) { try { // Accuracy of reverse resolution is not enforced. // We then manually ensure that the reported ens name resolves to address - const reportedName = await provider.lookupAddress(address); - - const resolvedAddress = await provider.resolveName(reportedName); + const ens = await provider.lookupAddress(address); + const ensSplit = ens && ens.split("."); + const validEnsCheck = ensSplit && ensSplit[ensSplit.length - 1] === "eth"; - if (address && ethers.utils.getAddress(address) === ethers.utils.getAddress(resolvedAddress)) { - return reportedName; + if (address && validEnsCheck) { + console.log(ens); + return true; } - return utils.getAddress(address); + return false; } catch (e) { - return utils.getAddress(address); + return false; } } - } + return 0; + }; - async function removeAddresses(provider, addresses) { + async function removeAddresses(providerUrl, addresses) { const temp = []; - for (const address in addresses) { - await lookupAddress(provider, address).then(name => { - const ensSplit = name && name.split("."); - const validEnsCheck = ensSplit && ensSplit[ensSplit.length - 1] === "eth"; - if (!validEnsCheck) { - temp.push(address); + if (addresses && addresses.length > 0) { + for (let index = 0; index < addresses.length; index++) { + const element = addresses[index]; + const provider = new ethers.providers.StaticJsonRpcProvider(providerUrl, 1); + let ens = await lookupAddress(provider, element); + if (!ens) { + temp.push(element); } - }); + } } return temp; } - const addToblacklistAddresses = await removeAddresses(provider, addresses); - const removeImportedAddresses = await removeAddresses(provider, importedAddresses); + const addToblacklistAddresses = await removeAddresses(mainnetProviderUrl, addresses); + const removeImportedAddresses = await removeAddresses(mainnetProviderUrl, importedAddresses); return { addToblacklistAddresses, removeImportedAddresses }; }); diff --git a/packages/backend/functions/index.js b/packages/backend/functions/index.js index f57e5412..53d409ef 100644 --- a/packages/backend/functions/index.js +++ b/packages/backend/functions/index.js @@ -15,3 +15,4 @@ admin.initializeApp(); exports.signRoom = handlers.signRoom; exports.addRoomTx = handlers.addRoomTx; exports.addRoomToken = handlers.addRoomToken; +exports.filterEnsAddresses = handlers.filterEnsAddresses; diff --git a/packages/react-app/src/views/HostRoom.jsx b/packages/react-app/src/views/HostRoom.jsx index 3ea4cee9..9ac37453 100644 --- a/packages/react-app/src/views/HostRoom.jsx +++ b/packages/react-app/src/views/HostRoom.jsx @@ -348,22 +348,19 @@ export default function HostRoom({ } }; - const handleFilterEns = async (provider, addresses) => { - const { addToblacklistAddresses, removeImportedAddresses } = await storage.filterEnsAddresses( - provider, - addresses, - importedAddresses, - ); - - // Add to Blacklist - unList(addToblacklistAddresses); - - //Remove Imported Addresses - importedAddresses.forEach((currentAddress, index) => { - if (removeImportedAddresses.includes(currentAddress)) { - removeImportedAddress(index - addresses.length); - } - }); + const handleFilterEns = async (provider, roomAddresses, localAddresses) => { + const data = await storage.filterEnsAddresses(provider, roomAddresses, localAddresses); + if (data) { + // Add to Blacklist + unList(data.addToblacklistAddresses); + + //Remove Imported Addresses + importedAddresses.forEach((currentAddress, index) => { + if (data.removeImportedAddresses.includes(currentAddress)) { + removeImportedAddress(index - addresses.length); + } + }); + } }; const reList = index => { @@ -487,7 +484,16 @@ export default function HostRoom({ > Import Address + - +