From 279a766250db48f4119895e9265116cebfaef89f Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 11 Mar 2024 20:31:35 +0530 Subject: [PATCH 1/6] save & fetch contracts using FE --- .../lib/components/instanceContainerUI.tsx | 32 +++++++++++--- .../src/lib/components/universalDappUI.tsx | 42 ++++++++++++------- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx index ec47b31f79..2d0c523c39 100644 --- a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx @@ -17,14 +17,36 @@ export function InstanceContainerUI(props: InstanceContainerProps) { if (enableSave.current) { const { network } = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') chainId.current = network.id + // Move contract saved in localstorage to Remix FE const allSavedContracts = localStorage.getItem('savedContracts') if (allSavedContracts) { - await props.plugin.call('udapp', 'clearAllSavedInstances') const savedContracts = JSON.parse(allSavedContracts) - if (savedContracts && savedContracts[network.id]) { - const instances = savedContracts[network.id] - for (const inst of instances) - if (inst) await props.plugin.call('udapp', 'addSavedInstance', inst.address, inst.abi || inst.contractData.abi, inst.name, inst.savedOn, inst.filePath) + for (const networkId in savedContracts) { + if (savedContracts[networkId].length > 0) { + for (const contractDetails of savedContracts[networkId]) { + const objToSave = { + name: contractDetails.name, + address: contractDetails.address, + abi: contractDetails.abi || contractDetails.contractData.abi, + filePath: contractDetails.filePath, + pinnedAt: contractDetails.savedOn + } + await props.plugin.call('fileManager', 'writeFile', `.deploys/pinned-contracts/${networkId}/${contractDetails.address}.json`, JSON.stringify(objToSave, null, 2)) + } + } + } + localStorage.removeItem('savedContracts') + } + // Load contracts from FE + const isPinnedAvailable = await props.plugin.call('fileManager', 'exists', `.deploys/pinned-contracts/${chainId.current}`) + if (isPinnedAvailable) { + await props.plugin.call('udapp', 'clearAllSavedInstances') + const list = await props.plugin.call('fileManager', 'readdir', `.deploys/pinned-contracts/${chainId.current}`) + const filePaths = Object.keys(list) + for (const file of filePaths) { + const pinnedContract = await props.plugin.call('fileManager', 'readFile', file) + const pinnedContractObj = JSON.parse(pinnedContract) + if (pinnedContractObj) await props.plugin.call('udapp', 'addSavedInstance', pinnedContractObj.address, pinnedContractObj.abi, pinnedContractObj.name, pinnedContractObj.pinnedAt, pinnedContractObj.filePath) } } } diff --git a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx index 77c511be90..0833c0f90b 100644 --- a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx @@ -139,23 +139,35 @@ export function UniversalDappUI(props: UdappProps) { const pinContract = async() => { const workspace = await props.plugin.call('filePanel', 'getCurrentWorkspace') const {network} = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') - const savedContracts = localStorage.getItem('savedContracts') - let objToSave - if (!savedContracts) { - objToSave = {} - objToSave[network.id] = [] - } else { - objToSave = JSON.parse(savedContracts) - if (!objToSave[network.id]) { - objToSave[network.id] = [] - } + // const hasPreviousPinned = await this.call('fileManager', 'exists', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) + + // const savedContracts = localStorage.getItem('savedContracts') + let objToSave = { + name: props.instance.name, + address: props.instance.address, + abi: props.instance.abi || props.instance.contractData.abi, + filePath: props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}`, + pinnedAt: Date.now() } - props.instance.savedOn = Date.now() - props.instance.filePath = props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}` - objToSave[network.id].push(props.instance) - localStorage.setItem('savedContracts', JSON.stringify(objToSave)) + // if (!savedContracts) { + // objToSave = {} + // objToSave[network.id] = [] + // } else { + // objToSave = JSON.parse(savedContracts) + // if (!objToSave[network.id]) { + // objToSave[network.id] = [] + // } + // } + // const deployments = await this.call('fileManager', 'readFile', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) + // const hasPreviousDeploys = await this.call('fileManager', 'exists', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) + await props.plugin.call('fileManager', 'writeFile', `.deploys/pinned-contracts/${network.id}/${props.instance.address}.json`, JSON.stringify(objToSave, null, 2)) + + // props.instance.savedOn = Date.now() + // props.instance.filePath = props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}` + // objToSave[network.id].push(props.instance) + // localStorage.setItem('savedContracts', JSON.stringify(objToSave)) // Add contract to saved contracts list on UI - await props.plugin.call('udapp', 'addSavedInstance', props.instance.address, props.instance.abi || props.instance.contractData.abi, props.instance.name, props.instance.savedOn, props.instance.filePath) + await props.plugin.call('udapp', 'addSavedInstance', objToSave.address, objToSave.abi, objToSave.name, objToSave.pinnedAt, objToSave.filePath) _paq.push(['trackEvent', 'udapp', 'pinContracts', 'pinned']) // Remove contract from deployed contracts list on UI props.removeInstance(props.index, false, false) From 35f3c9e55a38a091cc30efc07177edd84d61ff0e Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 11 Mar 2024 20:37:57 +0530 Subject: [PATCH 2/6] fix clearing --- .../lib/components/instanceContainerUI.tsx | 3 ++- .../src/lib/components/universalDappUI.tsx | 19 ------------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx index 2d0c523c39..5e44f36b43 100644 --- a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx @@ -37,10 +37,11 @@ export function InstanceContainerUI(props: InstanceContainerProps) { } localStorage.removeItem('savedContracts') } + // Clear existing saved instance state + await props.plugin.call('udapp', 'clearAllSavedInstances') // Load contracts from FE const isPinnedAvailable = await props.plugin.call('fileManager', 'exists', `.deploys/pinned-contracts/${chainId.current}`) if (isPinnedAvailable) { - await props.plugin.call('udapp', 'clearAllSavedInstances') const list = await props.plugin.call('fileManager', 'readdir', `.deploys/pinned-contracts/${chainId.current}`) const filePaths = Object.keys(list) for (const file of filePaths) { diff --git a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx index 0833c0f90b..e2416ed973 100644 --- a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx @@ -139,9 +139,6 @@ export function UniversalDappUI(props: UdappProps) { const pinContract = async() => { const workspace = await props.plugin.call('filePanel', 'getCurrentWorkspace') const {network} = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') - // const hasPreviousPinned = await this.call('fileManager', 'exists', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) - - // const savedContracts = localStorage.getItem('savedContracts') let objToSave = { name: props.instance.name, address: props.instance.address, @@ -149,23 +146,7 @@ export function UniversalDappUI(props: UdappProps) { filePath: props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}`, pinnedAt: Date.now() } - // if (!savedContracts) { - // objToSave = {} - // objToSave[network.id] = [] - // } else { - // objToSave = JSON.parse(savedContracts) - // if (!objToSave[network.id]) { - // objToSave[network.id] = [] - // } - // } - // const deployments = await this.call('fileManager', 'readFile', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) - // const hasPreviousDeploys = await this.call('fileManager', 'exists', `.deploys/upgradeable-contracts/${networkName}/UUPS.json`) await props.plugin.call('fileManager', 'writeFile', `.deploys/pinned-contracts/${network.id}/${props.instance.address}.json`, JSON.stringify(objToSave, null, 2)) - - // props.instance.savedOn = Date.now() - // props.instance.filePath = props.instance.filePath || `${workspace.name}/${props.instance.contractData.contract.file}` - // objToSave[network.id].push(props.instance) - // localStorage.setItem('savedContracts', JSON.stringify(objToSave)) // Add contract to saved contracts list on UI await props.plugin.call('udapp', 'addSavedInstance', objToSave.address, objToSave.abi, objToSave.name, objToSave.pinnedAt, objToSave.filePath) _paq.push(['trackEvent', 'udapp', 'pinContracts', 'pinned']) From baa666c2963321cca9df7091bcb8a172315ab04d Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 11 Mar 2024 20:44:26 +0530 Subject: [PATCH 3/6] tooltip text update --- apps/remix-ide/src/app/tabs/locales/en/udapp.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/locales/en/udapp.json b/apps/remix-ide/src/app/tabs/locales/en/udapp.json index 0638936cb6..1db24ca378 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/udapp.json +++ b/apps/remix-ide/src/app/tabs/locales/en/udapp.json @@ -71,8 +71,8 @@ "udapp.tooltipText6": "Autogenerated generic user interfaces for interaction with deployed/unpinned contracts", "udapp.savedContracts": "Pinned Contracts", - "udapp.tooltipTextPinnedContracts": "List of pinned contracts for selected network", - "udapp.NoSavedInstanceText": "No contracts pinned yet. Pinned contracts stay after reloading Remix IDE.", + "udapp.tooltipTextPinnedContracts": "List of pinned contracts for selected workspace & network", + "udapp.NoSavedInstanceText": "No pinned contracts found for selected workspace & network", "udapp.tooltipTextDelete": "Delete pinned contract", "udapp.tooltipTextUnpin": "Unpin contract", "udapp.savedOn": "Pinned at", From 8836d92ab5374bc675cca7b0c95625c83df4a808 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 11 Mar 2024 21:03:28 +0530 Subject: [PATCH 4/6] update unpin and delete --- .../run-tab/src/lib/components/universalDappUI.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx index e2416ed973..b4e6be1f7f 100644 --- a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx @@ -114,12 +114,7 @@ export function UniversalDappUI(props: UdappProps) { const unsavePinnedContract = async () => { const {network} = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') - const savedContracts = localStorage.getItem('savedContracts') - const savedContractsJson = JSON.parse(savedContracts) - const instanceIndex = savedContractsJson[network.id].findIndex(instance => instance && instance.address === props.instance.address) - delete savedContractsJson[network.id][instanceIndex] - savedContractsJson[network.id] = savedContractsJson[network.id].filter(Boolean) - localStorage.setItem('savedContracts', JSON.stringify(savedContractsJson)) + await props.plugin.call('fileManager', 'remove', `.deploys/pinned-contracts/${network.id}/${props.instance.address}.json`) } const remove = async() => { @@ -149,7 +144,7 @@ export function UniversalDappUI(props: UdappProps) { await props.plugin.call('fileManager', 'writeFile', `.deploys/pinned-contracts/${network.id}/${props.instance.address}.json`, JSON.stringify(objToSave, null, 2)) // Add contract to saved contracts list on UI await props.plugin.call('udapp', 'addSavedInstance', objToSave.address, objToSave.abi, objToSave.name, objToSave.pinnedAt, objToSave.filePath) - _paq.push(['trackEvent', 'udapp', 'pinContracts', 'pinned']) + _paq.push(['trackEvent', 'udapp', 'pinContracts', `pinned at ${network.id}`]) // Remove contract from deployed contracts list on UI props.removeInstance(props.index, false, false) } From 962230278b676d191a23e7e6180826262aa2bda9 Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Mon, 11 Mar 2024 21:04:27 +0530 Subject: [PATCH 5/6] fix linting --- libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx index b4e6be1f7f..33503df919 100644 --- a/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/universalDappUI.tsx @@ -134,7 +134,7 @@ export function UniversalDappUI(props: UdappProps) { const pinContract = async() => { const workspace = await props.plugin.call('filePanel', 'getCurrentWorkspace') const {network} = await props.plugin.call('blockchain', 'getCurrentNetworkStatus') - let objToSave = { + const objToSave = { name: props.instance.name, address: props.instance.address, abi: props.instance.abi || props.instance.contractData.abi, From d41ec7699e3f728ebdf46ef5df785ecd8a1c048e Mon Sep 17 00:00:00 2001 From: aniket-engg Date: Tue, 12 Mar 2024 13:03:44 +0530 Subject: [PATCH 6/6] addec catch --- .../src/lib/components/instanceContainerUI.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx index 5e44f36b43..9383875477 100644 --- a/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/instanceContainerUI.tsx @@ -42,12 +42,16 @@ export function InstanceContainerUI(props: InstanceContainerProps) { // Load contracts from FE const isPinnedAvailable = await props.plugin.call('fileManager', 'exists', `.deploys/pinned-contracts/${chainId.current}`) if (isPinnedAvailable) { - const list = await props.plugin.call('fileManager', 'readdir', `.deploys/pinned-contracts/${chainId.current}`) - const filePaths = Object.keys(list) - for (const file of filePaths) { - const pinnedContract = await props.plugin.call('fileManager', 'readFile', file) - const pinnedContractObj = JSON.parse(pinnedContract) - if (pinnedContractObj) await props.plugin.call('udapp', 'addSavedInstance', pinnedContractObj.address, pinnedContractObj.abi, pinnedContractObj.name, pinnedContractObj.pinnedAt, pinnedContractObj.filePath) + try { + const list = await props.plugin.call('fileManager', 'readdir', `.deploys/pinned-contracts/${chainId.current}`) + const filePaths = Object.keys(list) + for (const file of filePaths) { + const pinnedContract = await props.plugin.call('fileManager', 'readFile', file) + const pinnedContractObj = JSON.parse(pinnedContract) + if (pinnedContractObj) await props.plugin.call('udapp', 'addSavedInstance', pinnedContractObj.address, pinnedContractObj.abi, pinnedContractObj.name, pinnedContractObj.pinnedAt, pinnedContractObj.filePath) + } + } catch(err) { + console.log(err) } } }