avoid api rate limit exceed

pull/3733/head
yann300 2 years ago
parent ed51e76db8
commit 2bd57d3b43
  1. 63
      apps/etherscan/src/app/app.tsx
  2. 2
      apps/etherscan/src/app/types/Receipt.ts
  3. 2
      libs/remix-ui/workspace/src/lib/components/workspace-hamburger-item.tsx

@ -36,6 +36,7 @@ const App = () => {
const [receipts, setReceipts] = useLocalStorage("receipts", []) const [receipts, setReceipts] = useLocalStorage("receipts", [])
const [contracts, setContracts] = useState([] as string[]) const [contracts, setContracts] = useState([] as string[])
const [themeType, setThemeType] = useState("dark" as ThemeType) const [themeType, setThemeType] = useState("dark" as ThemeType)
const timer = useRef(null)
const clientInstanceRef = useRef(clientInstance) const clientInstanceRef = useRef(clientInstance)
clientInstanceRef.current = clientInstance clientInstanceRef.current = clientInstance
@ -80,31 +81,35 @@ const App = () => {
}, []) }, [])
useEffect(() => { useEffect(() => {
if (!clientInstance) { let receiptsNotVerified: Receipt[] = receipts.filter((item: Receipt) => {
return return item.status === "Pending in queue" || item.status === "Max rate limit reached"
}
const receiptsNotVerified: Receipt[] = receipts.filter((item: Receipt) => {
return item.status === "Pending in queue"
}) })
if (receiptsNotVerified.length > 0) { if (receiptsNotVerified.length > 0) {
const timer1 = setInterval(() => { if (timer.current) {
receiptsNotVerified.forEach(async (item) => { clearInterval(timer.current)
if (!clientInstanceRef.current) { timer.current = null
return {} }
} timer.current = setInterval(async () => {
const { network, networkId } = await getNetworkName(clientInstanceRef.current) const { network, networkId } = await getNetworkName(clientInstanceRef.current)
if (network === "vm") { if (!clientInstanceRef.current) {
return {} return
} }
if (network === "vm") {
return
}
let newReceipts = receipts
for (const item of receiptsNotVerified) {
await new Promise(r => setTimeout(r, 500)) // avoid api rate limit exceed.
console.log('checking receipt', item.guid)
const status = await getReceiptStatus( const status = await getReceiptStatus(
item.guid, item.guid,
apiKey, apiKey,
getEtherScanApi(network, networkId) getEtherScanApi(network, networkId)
) )
if (status.result === "Pass - Verified" || status.result === "Already Verified") { if (status.result === "Pass - Verified" || status.result === "Already Verified") {
const newReceipts = receipts.map((currentReceipt: Receipt) => { newReceipts = newReceipts.map((currentReceipt: Receipt) => {
if (currentReceipt.guid === item.guid) { if (currentReceipt.guid === item.guid) {
return { return {
...currentReceipt, ...currentReceipt,
@ -112,20 +117,20 @@ const App = () => {
} }
} }
return currentReceipt return currentReceipt
}) })
}
clearInterval(timer1) }
setReceipts(newReceipts) receiptsNotVerified = newReceipts.filter((item: Receipt) => {
return item.status === "Pending in queue" || item.status === "Max rate limit reached"
return () => {
clearInterval(timer1)
}
}
return {}
}) })
}, 5000) if (timer.current && receiptsNotVerified.length === 0) {
clearInterval(timer.current)
timer.current = null
}
setReceipts(newReceipts)
}, 10000)
} }
}, [receipts, clientInstance, apiKey, setReceipts]) }, [receipts])
return ( return (
<AppContext.Provider <AppContext.Provider
@ -146,4 +151,4 @@ const App = () => {
) )
} }
export default App export default App

@ -1,4 +1,4 @@
export type ReceiptStatus = "Pending in queue" | "Pass - Verified" | "Already Verified" export type ReceiptStatus = "Pending in queue" | "Pass - Verified" | "Already Verified" | "Max rate limit reached"
export interface Receipt { export interface Receipt {
guid: string guid: string

@ -48,4 +48,4 @@ export function HamburgerMenuItem (props: HamburgerMenuItemProps) {
</Dropdown.Item> </Dropdown.Item>
</> </>
) )
} }
Loading…
Cancel
Save