cleanup, style fixes

pull/5370/head
lianahus 2 years ago committed by yann300
parent 3e0decbd88
commit 8253d99517
  1. 32
      apps/etherscan/src/app/components/HeaderWithSettings.tsx
  2. 17
      apps/etherscan/src/app/logo.svg
  3. 12
      apps/etherscan/src/app/routes.tsx
  4. 11
      apps/etherscan/src/app/star.svg
  5. 329
      apps/etherscan/src/app/utils/verify.ts
  6. 3
      apps/etherscan/src/app/views/CaptureKeyView.tsx
  7. 18
      apps/etherscan/src/app/views/VerifyView.tsx

@ -6,7 +6,6 @@ import { AppContext } from "../AppContext"
interface Props { interface Props {
title?: string title?: string
showBackButton?: boolean
from: string from: string
} }
@ -37,22 +36,22 @@ const HomeIcon: React.FC<IconProps> = ({ from }: IconProps) => {
const ReceiptsIcon: React.FC<IconProps> = ({ from }: IconProps) => { const ReceiptsIcon: React.FC<IconProps> = ({ from }: IconProps) => {
return ( return (
<NavLink <NavLink
data-id="receipts" data-id="receipts"
to={{ to={{
pathname: "/receipts" pathname: "/receipts"
}} }}
className={({ isActive }) => isActive ? "btn p-0 m-0 mx-2" : "btn text-dark p-0 m-0 mx-2"} className={({ isActive }) => isActive ? "btn p-0 m-0 mx-2" : "btn text-dark p-0 m-0 mx-2"}
state={ from } state={ from }
>
<CustomTooltip
tooltipText='Receipts'
tooltipId='etherscan-nav-receipts'
placement='bottom'
> >
<CustomTooltip <i className="fas fa-receipt"></i>
tooltipText='Receipts' </CustomTooltip>
tooltipId='etherscan-nav-receipts' </NavLink>
placement='bottom'
>
<i className="fas fa-receipt"></i>
</CustomTooltip>
</NavLink>
) )
} }
@ -79,7 +78,6 @@ const SettingsIcon: React.FC<IconProps> = ({ from }: IconProps) => {
export const HeaderWithSettings: React.FC<Props> = ({ export const HeaderWithSettings: React.FC<Props> = ({
title = "", title = "",
showBackButton = false,
from, from,
}) => { }) => {
return ( return (

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="262px" height="163px" viewBox="0 0 262 163" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="Styles-&amp;-Quick-Wins" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Nx---Quick-Wins" transform="translate(-476.000000, -1284.000000)" fill-rule="nonzero">
<g id="Logos" transform="translate(-11.000000, 782.000000)">
<g id="Nx_Flat_White" transform="translate(487.000000, 502.000000)">
<polygon id="Path" fill="#FFFFFF" points="130.68 104.59 97.49 52.71 97.44 96.3 40.24 0 0 0 0 162.57 39.79 162.57 39.92 66.39 96.53 158.26"></polygon>
<polygon id="Path" fill="#FFFFFF" points="97.5 41.79 137.24 41.79 137.33 41.33 137.33 0 97.54 0 97.49 41.33"></polygon>
<path d="M198.66,86.86 C189.139872,86.6795216 180.538723,92.516445 177.19,101.43 C182.764789,93.0931021 193.379673,89.7432211 202.73,93.37 C207.05,95.13 212.73,97.97 217.23,96.45 C212.950306,90.4438814 206.034895,86.8725952 198.66,86.86 L198.66,86.86 Z" id="Path" fill="#96D8E9"></path>
<path d="M243.75,106.42 C243.75,101.55 241.1,100.42 235.6,98.42 C231.52,97 226.89,95.4 223.52,91 C222.86,90.13 222.25,89.15 221.6,88.11 C220.14382,85.4164099 218.169266,83.037429 215.79,81.11 C212.58,78.75 208.37,77.6 202.91,77.6 C191.954261,77.6076705 182.084192,84.2206169 177.91,94.35 C183.186964,87.0278244 191.956716,83.0605026 200.940147,83.9314609 C209.923578,84.8024193 217.767888,90.3805017 221.54,98.58 C223.424615,101.689762 227.141337,103.174819 230.65,102.22 C236.02,101.07 235.65,106.15 243.76,107.87 L243.75,106.42 Z" id="Path" fill="#48C4E5"></path>
<path d="M261.46,105.38 L261.46,105.27 C261.34,73.03 235.17,45.45 202.91,45.45 C183.207085,45.4363165 164.821777,55.3450614 154,71.81 L153.79,71.45 L137.23,45.45 L97.5,45.4499858 L135.25,104.57 L98.41,162.57 L137,162.57 L153.79,136.78 L170.88,162.57 L209.48,162.57 L174.48,107.49 C173.899005,106.416838 173.583536,105.220114 173.56,104 C173.557346,96.2203871 176.64661,88.7586448 182.147627,83.2576275 C187.648645,77.7566101 195.110387,74.6673462 202.89,74.67 C219.11,74.67 221.82,84.37 225.32,88.93 C232.23,97.93 246.03,93.99 246.03,105.73 L246.03,105.73 C246.071086,108.480945 247.576662,111.001004 249.979593,112.340896 C252.382524,113.680787 255.317747,113.636949 257.679593,112.225896 C260.041438,110.814842 261.471086,108.250945 261.43,105.5 L261.43,105.5 L261.43,105.38 L261.46,105.38 Z" id="Path" fill="#FFFFFF"></path>
<path d="M261.5,113.68 C261.892278,116.421801 261.504116,119.218653 260.38,121.75 C258.18,126.84 254.51,125.14 254.51,125.14 C254.51,125.14 251.35,123.6 253.27,120.65 C255.4,117.36 259.61,117.74 261.5,113.68 Z" id="Path" fill="#FFFFFF"></path>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.9 KiB

@ -14,18 +14,6 @@ interface Props extends RouteProps {
from: string from: string
} }
const RouteWithHeader = ({ component: Component, ...rest }: Props) => {
return (
<Route
{...rest}
>
<DefaultLayout {...rest}>
<Component />
</DefaultLayout>
</Route>
)
}
export const DisplayRoutes = () => ( export const DisplayRoutes = () => (
<Router> <Router>
<Routes> <Routes>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg
className="material-icons"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
>
<path d="M0 0h24v24H0z" fill="none" />
<path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z" />
</svg>

Before

Width:  |  Height:  |  Size: 347 B

@ -5,203 +5,202 @@ import axios from 'axios'
import { PluginClient } from "@remixproject/plugin" import { PluginClient } from "@remixproject/plugin"
const resetAfter10Seconds = (client: PluginClient, setResults: (value: string) => void) => { const resetAfter10Seconds = (client: PluginClient, setResults: (value: string) => void) => {
setTimeout(() => { setTimeout(() => {
client.emit("statusChanged", { key: "none" }) client.emit("statusChanged", { key: "none" })
setResults("") setResults("")
}, 10000) }, 10000)
} }
export type EtherScanReturn = { export type EtherScanReturn = {
guid: any, guid: any,
status: any, status: any,
} }
export const verify = async ( export const verify = async (
apiKeyParam: string, apiKeyParam: string,
contractAddress: string, contractAddress: string,
contractArgumentsParam: string, contractArgumentsParam: string,
contractName: string, contractName: string,
compilationResultParam: CompilerAbstract, compilationResultParam: CompilerAbstract,
chainRef: number | string, chainRef: number | string,
isProxyContract: boolean, isProxyContract: boolean,
expectedImplAddress: string, expectedImplAddress: string,
client: PluginClient, client: PluginClient,
onVerifiedContract: (value: EtherScanReturn) => void, onVerifiedContract: (value: EtherScanReturn) => void,
setResults: (value: string) => void setResults: (value: string) => void
) => { ) => {
let networkChainId let networkChainId
let etherscanApi let etherscanApi
if (chainRef) { if (chainRef) {
if (typeof chainRef === 'number') { if (typeof chainRef === 'number') {
networkChainId = chainRef networkChainId = chainRef
etherscanApi = getEtherScanApi(networkChainId) etherscanApi = getEtherScanApi(networkChainId)
} else if (typeof chainRef === 'string') etherscanApi = chainRef } else if (typeof chainRef === 'string') etherscanApi = chainRef
} else {
const { network, networkId } = await getNetworkName(client)
if (network === "vm") {
return {
succeed: false,
message: "Cannot verify in the selected network"
}
} else { } else {
const { network, networkId } = await getNetworkName(client) networkChainId = networkId
if (network === "vm") { etherscanApi = getEtherScanApi(networkChainId)
return { }
succeed: false, }
message: "Cannot verify in the selected network"
} try {
} else { const contractMetadata = getContractMetadata(
networkChainId = networkId // cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository
etherscanApi = getEtherScanApi(networkChainId) compilationResultParam.data as unknown as CompilationResult,
contractName
)
if (!contractMetadata) {
return {
succeed: false,
message: "Please recompile contract"
} }
} }
const contractMetadataParsed = JSON.parse(contractMetadata)
try { const fileName = getContractFileName(
const contractMetadata = getContractMetadata( // cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository
// cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository compilationResultParam.data as unknown as CompilationResult,
compilationResultParam.data as unknown as CompilationResult, contractName
contractName )
)
if (!contractMetadata) { const jsonInput = {
return { language: 'Solidity',
succeed: false, sources: compilationResultParam.source.sources,
message: "Please recompile contract" settings: {
optimizer: {
enabled: contractMetadataParsed.settings.optimizer.enabled,
runs: contractMetadataParsed.settings.optimizer.runs
} }
} }
}
const contractMetadataParsed = JSON.parse(contractMetadata)
const fileName = getContractFileName(
// cast from the remix-plugin interface to the solidity one. Should be fixed when remix-plugin move to the remix-project repository
compilationResultParam.data as unknown as CompilationResult,
contractName
)
const jsonInput = { const data: { [key: string]: string | any } = {
language: 'Solidity', apikey: apiKeyParam, // A valid API-Key is required
sources: compilationResultParam.source.sources, module: "contract", // Do not change
settings: { action: "verifysourcecode", // Do not change
optimizer: { codeformat: "solidity-standard-json-input",
enabled: contractMetadataParsed.settings.optimizer.enabled, sourceCode: JSON.stringify(jsonInput),
runs: contractMetadataParsed.settings.optimizer.runs contractname: fileName + ':' + contractName,
} compilerversion: `v${contractMetadataParsed.compiler.version}`, // see http://etherscan.io/solcversions for list of support versions
} constructorArguements: contractArgumentsParam ? contractArgumentsParam.replace('0x', '') : '', // if applicable
} }
const data: { [key: string]: string | any } = { if (isProxyContract) {
apikey: apiKeyParam, // A valid API-Key is required data.action = "verifyproxycontract"
module: "contract", // Do not change data.expectedimplementation = expectedImplAddress
action: "verifysourcecode", // Do not change data.address = contractAddress
codeformat: "solidity-standard-json-input", } else {
sourceCode: JSON.stringify(jsonInput), data.contractaddress = contractAddress
contractname: fileName + ':' + contractName, }
compilerversion: `v${contractMetadataParsed.compiler.version}`, // see http://etherscan.io/solcversions for list of support versions
constructorArguements: contractArgumentsParam ? contractArgumentsParam.replace('0x', '') : '', // if applicable
}
if (isProxyContract) { const body = new FormData()
data.action = "verifyproxycontract" Object.keys(data).forEach((key) => body.append(key, data[key]))
data.expectedimplementation = expectedImplAddress
data.address = contractAddress
} else {
data.contractaddress = contractAddress
}
const body = new FormData() client.emit("statusChanged", {
Object.keys(data).forEach((key) => body.append(key, data[key])) key: "loading",
type: "info",
title: "Verifying ...",
})
const response = await axios.post(etherscanApi, body)
const { message, result, status } = await response.data
client.emit("statusChanged", { if (message === "OK" && status === "1") {
key: "loading", resetAfter10Seconds(client, setResults)
type: "info", let receiptStatus
title: "Verifying ...", if (isProxyContract) {
}) receiptStatus = await getProxyContractReceiptStatus(
const response = await axios.post(etherscanApi, body)
const { message, result, status } = await response.data
if (message === "OK" && status === "1") {
resetAfter10Seconds(client, setResults)
let receiptStatus
if (isProxyContract) {
receiptStatus = await getProxyContractReceiptStatus(
result,
apiKeyParam,
etherscanApi
)
if (receiptStatus.status === '1') {
receiptStatus.message = receiptStatus.result
receiptStatus.result = 'Successfully Updated'
}
} else receiptStatus = await getReceiptStatus(
result, result,
apiKeyParam, apiKeyParam,
etherscanApi etherscanApi
) )
if (receiptStatus.status === '1') {
const returnValue = { receiptStatus.message = receiptStatus.result
guid: result, receiptStatus.result = 'Successfully Updated'
status: receiptStatus.result,
message: `Verification process started correctly. Receipt GUID ${result}`,
succeed: true,
isProxyContract
} }
onVerifiedContract(returnValue) } else receiptStatus = await getReceiptStatus(
return returnValue result,
} else if (message === "NOTOK") { apiKeyParam,
client.emit("statusChanged", { etherscanApi
key: "failed", )
type: "error",
title: result, const returnValue = {
}) guid: result,
const returnValue = { status: receiptStatus.result,
message: result, message: `Verification process started correctly. Receipt GUID ${result}`,
succeed: false, succeed: true,
isProxyContract isProxyContract
}
resetAfter10Seconds(client, setResults)
return returnValue
}
return {
message: 'unknown reason ' + result,
succeed: false
} }
} catch (error: any) { onVerifiedContract(returnValue)
console.error(error) return returnValue
setResults("Something wrong happened, try again") } else if (message === "NOTOK") {
return { client.emit("statusChanged", {
message: error.message, key: "failed",
succeed: false type: "error",
title: result,
})
const returnValue = {
message: result,
succeed: false,
isProxyContract
} }
resetAfter10Seconds(client, setResults)
return returnValue
}
return {
message: 'unknown reason ' + result,
succeed: false
}
} catch (error: any) {
console.error(error)
setResults("Something wrong happened, try again")
return {
message: error.message,
succeed: false
} }
} }
}
export const getContractFileName = ( export const getContractFileName = (
compilationResult: CompilationResult, compilationResult: CompilationResult,
contractName: string contractName: string
) => { ) => {
const compiledContracts = compilationResult.contracts const compiledContracts = compilationResult.contracts
let fileName = "" let fileName = ""
for (const file of Object.keys(compiledContracts)) { for (const file of Object.keys(compiledContracts)) {
for (const contract of Object.keys(compiledContracts[file])) { for (const contract of Object.keys(compiledContracts[file])) {
if (contract === contractName) { if (contract === contractName) {
fileName = file fileName = file
break break
}
} }
} }
return fileName
} }
return fileName
}
export const getContractMetadata = ( export const getContractMetadata = (
compilationResult: CompilationResult, compilationResult: CompilationResult,
contractName: string contractName: string
) => { ) => {
const compiledContracts = compilationResult.contracts const compiledContracts = compilationResult.contracts
let contractMetadata = "" let contractMetadata = ""
for (const file of Object.keys(compiledContracts)) { for (const file of Object.keys(compiledContracts)) {
for (const contract of Object.keys(compiledContracts[file])) { for (const contract of Object.keys(compiledContracts[file])) {
if (contract === contractName) { if (contract === contractName) {
contractMetadata = compiledContracts[file][contract].metadata contractMetadata = compiledContracts[file][contract].metadata
if (contractMetadata) { if (contractMetadata) {
break break
}
} }
} }
} }
return contractMetadata
} }
return contractMetadata
}

@ -62,8 +62,7 @@ export const CaptureKeyView: React.FC = () => {
</form> </form>
)} )}
</Formik> </Formik>
} }}
}
</AppContext.Consumer> </AppContext.Consumer>
) )
} }

@ -132,15 +132,15 @@ export const VerifyView: React.FC<Props> = ({
} }
name="contractName" name="contractName"
onChange={async (e) => { onChange={async (e) => {
handleChange(e) handleChange(e)
const {artefact} = await client.call("compilerArtefacts" as any, "getArtefactsByContractName", e.target.value) const {artefact} = await client.call("compilerArtefacts" as any, "getArtefactsByContractName", e.target.value)
if (artefact && artefact.abi && artefact.abi[0] && artefact.abi[0].type && artefact.abi[0].type === 'constructor' && artefact.abi[0].inputs.length > 0) { if (artefact && artefact.abi && artefact.abi[0] && artefact.abi[0].type && artefact.abi[0].type === 'constructor' && artefact.abi[0].inputs.length > 0) {
setConstructorInputs(artefact.abi[0].inputs) setConstructorInputs(artefact.abi[0].inputs)
setShowConstructorArgs(true) setShowConstructorArgs(true)
} else { } else {
setConstructorInputs([]) setConstructorInputs([])
setShowConstructorArgs(false) setShowConstructorArgs(false)
} }
}} }}
> >
<option disabled={true} value=""> <option disabled={true} value="">

Loading…
Cancel
Save