From a8486ce0edb754bbeb21a184d01004c8d5081c18 Mon Sep 17 00:00:00 2001 From: mclamee Date: Thu, 30 May 2024 20:15:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=AF=E6=8C=81ENS=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D=E5=90=84=E7=A7=8DN/A?= =?UTF-8?q?=E5=92=8C=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Base/index.jsx | 41 ++++++++++++++-- src/pages/BaseTasks/index.jsx | 54 +++++++++++++++++++--- src/pages/Linea/index.jsx | 41 ++++++++++++++-- src/pages/LineaTasks/index.jsx | 54 +++++++++++++++++++--- src/pages/MenuHeader/index.jsx | 2 +- src/pages/Scroll/index.jsx | 43 +++++++++++++++-- src/pages/ZkRank/index.jsx | 45 ++++++++++++++++-- src/pages/Zksync/index.jsx | 72 +++++++++++++++++++++++++---- src/pages/ZksyncTasks/index.jsx | 52 +++++++++++++++++---- src/utils/base/getBaseTasks.js | 34 ++++++++++++-- src/utils/base/getBaseTx.js | 3 ++ src/utils/linea/getLineaERC20.js | 12 +++-- src/utils/linea/getLineaInfo.js | 7 ++- src/utils/linea/getLineaTasks.js | 34 ++++++++++++-- src/utils/linea/getLineaTx.js | 13 ++++-- src/utils/scroll/getScrollTx.js | 3 ++ src/utils/zksync/getZkSyncBridge.js | 3 ++ 17 files changed, 449 insertions(+), 64 deletions(-) diff --git a/src/pages/Base/index.jsx b/src/pages/Base/index.jsx index 129dab00..14a8b1f2 100644 --- a/src/pages/Base/index.jsx +++ b/src/pages/Base/index.jsx @@ -508,12 +508,47 @@ function Base() { key: "address", align: "center", render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { return '***'; - } - return text; + } + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); }, - width: 360 + width: 85 }, // { // title: "余额", diff --git a/src/pages/BaseTasks/index.jsx b/src/pages/BaseTasks/index.jsx index 42c0443d..994efd43 100644 --- a/src/pages/BaseTasks/index.jsx +++ b/src/pages/BaseTasks/index.jsx @@ -185,6 +185,9 @@ function BaseTasks() { const item = newData[index]; const taskContractsMap = new Map(); const result = await getBaseTasks(item.address, apiKey); + if (result[0].includes("Error")) { + continue; + } const contractAddresses = result[0]; taskContractsMap.set(item.address, contractAddresses); setTaskContracts(taskContractsMap); @@ -339,6 +342,9 @@ function BaseTasks() { const address = entry.address; const promise = getBaseTasks(address, apiKey) .then(result => { + if(result[0].includes("Error")) { + return; + } taskContractsMap.set(address, result[0]); timestampsArray.push(result[1]); }) @@ -437,14 +443,50 @@ function BaseTasks() { dataIndex: "address", key: "address", align: "center", - render: (text) => { + render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { - return '***'; + return '***'; } - return text; - }, - width: 200 - },{ + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); + }, + width: 85 + }, + { title: "最后交易", dataIndex: "base_last_tx", key: "base_last_tx", diff --git a/src/pages/Linea/index.jsx b/src/pages/Linea/index.jsx index 5d910646..23d3f556 100644 --- a/src/pages/Linea/index.jsx +++ b/src/pages/Linea/index.jsx @@ -512,12 +512,47 @@ function Linea() { key: "address", align: "center", render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { return '***'; - } - return text; + } + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); }, - width: 360 + width: 85 }, // { // title: "余额", diff --git a/src/pages/LineaTasks/index.jsx b/src/pages/LineaTasks/index.jsx index 7986fe15..1d3c5e03 100644 --- a/src/pages/LineaTasks/index.jsx +++ b/src/pages/LineaTasks/index.jsx @@ -185,6 +185,9 @@ function LineaTasks() { const item = newData[index]; const taskContractsMap = new Map(); const result = await getLineaTasks(item.address, apiKey); + if(result[0].includes("Error")) { + continue; + } const contractAddresses = result[0]; taskContractsMap.set(item.address, contractAddresses); setTaskContracts(taskContractsMap); @@ -339,6 +342,9 @@ function LineaTasks() { const address = entry.address; const promise = getLineaTasks(address, apiKey) .then(result => { + if(result[0].includes("Error")) { + return; + } taskContractsMap.set(address, result[0]); timestampsArray.push(result[1]); }) @@ -437,14 +443,50 @@ function LineaTasks() { dataIndex: "address", key: "address", align: "center", - render: (text) => { + render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { - return '***'; + return '***'; } - return text; - }, - width: 200 - },{ + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); + }, + width: 85 + }, + { title: "最后交易", dataIndex: "linea_last_tx", key: "linea_last_tx", diff --git a/src/pages/MenuHeader/index.jsx b/src/pages/MenuHeader/index.jsx index 365424a5..c98ebfbe 100644 --- a/src/pages/MenuHeader/index.jsx +++ b/src/pages/MenuHeader/index.jsx @@ -93,7 +93,7 @@ const MenuHeader = () => { }, { label: 捐赠 / 已空投 , - key: 'donate', + key: 'donation', children: [ { label: '捐赠', diff --git a/src/pages/Scroll/index.jsx b/src/pages/Scroll/index.jsx index f040ac94..4842a1f5 100644 --- a/src/pages/Scroll/index.jsx +++ b/src/pages/Scroll/index.jsx @@ -490,7 +490,7 @@ function Scroll() { }, width: 90 }, - { +{ title: ( 钱包地址 @@ -503,12 +503,47 @@ function Scroll() { key: "address", align: "center", render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { return '***'; - } - return text; + } + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); }, - width: 360 + width: 85 }, // { // title: "余额", diff --git a/src/pages/ZkRank/index.jsx b/src/pages/ZkRank/index.jsx index 036a557e..f50d5577 100644 --- a/src/pages/ZkRank/index.jsx +++ b/src/pages/ZkRank/index.jsx @@ -451,13 +451,48 @@ function ZkRank() { dataIndex: "address", key: "address", align: "center", - render: (text) => { + render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { - return '***'; + return '***'; } - return text; - }, - width: 175 + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); + }, + width: 85 }, // { // title: "最后交易", diff --git a/src/pages/Zksync/index.jsx b/src/pages/Zksync/index.jsx index 358d8b50..69848a86 100644 --- a/src/pages/Zksync/index.jsx +++ b/src/pages/Zksync/index.jsx @@ -827,24 +827,80 @@ function Zksync() { {getEyeIcon()} + { + const addresses = data.map(item => item.address).join('\n'); + navigator.clipboard.writeText(addresses); + message.success('地址已复制'); + }} + style={{ marginLeft: 8, cursor: 'pointer' }} + > + 复制全部 + ), dataIndex: "address", key: "address", align: "center", render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { return '***'; - } - return record.sybil ? : - isRowSatisfyCondition(record) ? -
e.target.innerHTML = `${displayText} (${record.address})💥`} + onMouseLeave={(e) => e.target.innerHTML = `${displayText}💥`} + > + ) : isRowSatisfyCondition(record) ? ( +
e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} > - {text}
: text || - ; + {displayText} +
+ ) : ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText || } + + ); }, - width: 168 + width: 85 }, // { // title: "余额", diff --git a/src/pages/ZksyncTasks/index.jsx b/src/pages/ZksyncTasks/index.jsx index 17bb345e..fe9c73ea 100644 --- a/src/pages/ZksyncTasks/index.jsx +++ b/src/pages/ZksyncTasks/index.jsx @@ -445,7 +445,7 @@ function ZksyncTasks() { message.info("等待数据加载完成再刷新"); return "error"; } - const count = contractAddresses.reduce((accumulator, contractAddress) => { + const count = contractAddresses?.reduce((accumulator, contractAddress) => { if (contractAddress === taskContract) { return accumulator + 1; } @@ -457,7 +457,7 @@ function ZksyncTasks() { const checkTaskStatusByArray = (contractAddresses, taskContract) => { taskContract = taskContract.toLowerCase(); - const count = contractAddresses.reduce((accumulator, contractAddress) => { + const count = contractAddresses?.reduce((accumulator, contractAddress) => { if (contractAddress === taskContract) { return accumulator + 1; } @@ -599,14 +599,50 @@ function ZksyncTasks() { dataIndex: "address", key: "address", align: "center", - render: (text) => { + render: (text, record) => { + const [ensData, setEnsData] = useState(null); + + useEffect(() => { + if (record.ens) { + setEnsData(record.ens); + } else { + const fetchENS = async (address) => { + try { + const response = await fetch(`https://api.ensideas.com/ens/resolve/${address}`); + const data = await response.json(); + setEnsData(data); + if (data) { + record.ens = data; + } + } catch (error) { + console.error("Error fetching ENS:", error); + setEnsData(null); + } + }; + + fetchENS(record.address); + } + }, [record.address]); + if (hideColumn) { - return '***'; + return '***'; } - return text; - }, - width: 150 - },{ + + const displayText = ensData ? ensData.displayName : text; + + return ( + e.target.innerHTML = `${displayText} (${record.address})`} + onMouseLeave={(e) => e.target.innerHTML = displayText} + > + {displayText} + + ); + }, + width: 85 + }, + { title: "最后交易", dataIndex: "zks2_last_tx", key: "zks2_last_tx", diff --git a/src/utils/base/getBaseTasks.js b/src/utils/base/getBaseTasks.js index 5e06c495..022a496c 100644 --- a/src/utils/base/getBaseTasks.js +++ b/src/utils/base/getBaseTasks.js @@ -4,20 +4,44 @@ async function getBaseTasks(address, apiKey) { try { address = address.toLowerCase(); let url = `https://api.basescan.org/api?module=account&action=txlist&address=${address}&startblock=0&endblock=99999999&page=1&offset=999&sort=asc&apikey=${apiKey}`; - const response = await axios.get(url); + + let response; + let status; + let message; + let retries = 0; + const maxRetries = 2; + + do { + response = await axios.get(url); + status = response.data.status; + message = response.data.message; + + if (status === "0" && message === "NOTOK") { + console.log("Status is 0 and message is NOTOK, trying again in 5 seconds..."); + await new Promise(resolve => setTimeout(resolve, 5000)); + retries++; + } + } while (status === "0" && message === "NOTOK" && retries < maxRetries); + + if (status === "0" && message === "NOTOK") { + return ["Error: Max retries reached"]; + } + let transactions = response.data.result; - // console.log(transactions); - if (transactions.length === 0) { - return "No transactions"; + + if (Array.isArray(transactions) && transactions.length <= 0 || message === "No transactions found") { + return [[],[]]; } + transactions = transactions?.filter(item => item.from === address); let contractAddresses = transactions?.map(item => item.to); contractAddresses = contractAddresses?.map(item => item.toLowerCase()); let timestamps = transactions?.map(item => item.timeStamp * 1000); + return [contractAddresses, timestamps]; } catch (error) { console.error(error); - return "Error"; + return ["Error: " + error.message]; } } diff --git a/src/utils/base/getBaseTx.js b/src/utils/base/getBaseTx.js index d447c945..fe1f86a7 100644 --- a/src/utils/base/getBaseTx.js +++ b/src/utils/base/getBaseTx.js @@ -18,6 +18,9 @@ function getMonthNumber(d) { } function getZkSyncLastTX(lastTxDatetime) { + if (lastTxDatetime === undefined) { + return "无交易" + } const date = new Date(lastTxDatetime); const offset = 8; const utc8Date = new Date(date.getTime() + offset * 3600 * 1000); diff --git a/src/utils/linea/getLineaERC20.js b/src/utils/linea/getLineaERC20.js index 62ab06b0..67093c3f 100644 --- a/src/utils/linea/getLineaERC20.js +++ b/src/utils/linea/getLineaERC20.js @@ -5,13 +5,19 @@ async function getLineaERC20(address, apiKey) { try { let busdUrl = `https://api.lineascan.build/api?module=account&action=tokenbalance&contractaddress=0x7d43AABC515C356145049227CeE54B608342c0ad&address=${address}&tag=latest&apikey=${apiKey}`; const response = await axios.get(busdUrl); - const balance = parseFloat(ethers.formatEther(response.data?.result)).toFixed(2); + const busdResult = response.data?.result; + const balance = busdResult && !isNaN(busdResult) ? parseFloat(ethers.formatEther(busdResult)).toFixed(2) : "Error"; + let usdcUrl = `https://api.lineascan.build/api?module=account&action=tokenbalance&contractaddress=0x176211869cA2b568f2A7D4EE941E073a821EE1ff&address=${address}&tag=latest&apikey=${apiKey}`; const response1 = await axios.get(usdcUrl); - const balance1 = parseFloat(response1.data?.result / 1000000).toFixed(2); + const usdcResult = response1.data?.result; + const balance1 = usdcResult && !isNaN(usdcResult) ? parseFloat(usdcResult / 1000000).toFixed(2) : "Error"; + let lxpUrl = `https://api.lineascan.build/api?module=account&action=tokenbalance&contractaddress=0xd83af4fbd77f3ab65c3b1dc4b38d7e67aecf599a&address=${address}&tag=latest&apikey=${apiKey}`; const response2 = await axios.get(lxpUrl); - const balance2 = parseFloat(ethers.formatEther(response2.data?.result)).toFixed(0); + const lxpResult = response2.data?.result; + const balance2 = lxpResult && !isNaN(lxpResult) ? parseFloat(ethers.formatEther(lxpResult)).toFixed(0) : "Error"; + return {BUSD: balance, USDC: balance1, LXP: balance2}; } catch (error) { console.error(error); diff --git a/src/utils/linea/getLineaInfo.js b/src/utils/linea/getLineaInfo.js index b18abfab..8adba34b 100644 --- a/src/utils/linea/getLineaInfo.js +++ b/src/utils/linea/getLineaInfo.js @@ -5,11 +5,14 @@ async function getLineaInfo(address, apiKey) { try { let url = `https://api.lineascan.build/api?module=account&action=balance&address=${address}&tag=latest&apikey=${apiKey}`; const response = await axios.get(url); + if (response.data.result === "Max rate limit reached") { + return { balance: "Error: Rate Limit Exceeded" }; + } const balance = parseFloat(ethers.formatEther(response.data.result)).toFixed(4); - return {balance: balance}; + return { balance: balance }; } catch (error) { console.error(error); - return {balance: "Error"}; + return { balance: "Error" }; } } diff --git a/src/utils/linea/getLineaTasks.js b/src/utils/linea/getLineaTasks.js index 6e23fd4c..3745fc6d 100644 --- a/src/utils/linea/getLineaTasks.js +++ b/src/utils/linea/getLineaTasks.js @@ -4,20 +4,44 @@ async function getLineaTasks(address, apiKey) { try { address = address.toLowerCase(); let url = `https://api.lineascan.build/api?module=account&action=txlist&address=${address}&startblock=1&endblock=99999999&sort=asc&apikey=${apiKey}`; - const response = await axios.get(url); + + let response; + let status; + let message; + let retries = 0; + const maxRetries = 2; + + do { + response = await axios.get(url); + status = response.data.status; + message = response.data.message; + + if (status === "0" && message === "NOTOK") { + console.log("Status is 0 and message is NOTOK, trying again in 5 seconds..."); + await new Promise(resolve => setTimeout(resolve, 5000)); + retries++; + } + } while (status === "0" && message === "NOTOK" && retries < maxRetries); + + if (status === "0" && message === "NOTOK") { + return ["Error: Max retries reached"]; + } + let transactions = response.data.result; - // console.log(transactions); - if (transactions.length === 0) { - return "No transactions"; + + if (Array.isArray(transactions) && transactions.length <= 0 || message === "No transactions found") { + return [[],[]]; } + transactions = transactions?.filter(item => item.from === address); let contractAddresses = transactions?.map(item => item.to); contractAddresses = contractAddresses?.map(item => item.toLowerCase()); let timestamps = transactions?.map(item => item.timeStamp * 1000); + return [contractAddresses, timestamps]; } catch (error) { console.error(error); - return "Error"; + return ["Error: " + error.message]; } } diff --git a/src/utils/linea/getLineaTx.js b/src/utils/linea/getLineaTx.js index a8c894b4..ec57b760 100644 --- a/src/utils/linea/getLineaTx.js +++ b/src/utils/linea/getLineaTx.js @@ -18,6 +18,9 @@ function getMonthNumber(d) { } function getZkSyncLastTX(lastTxDatetime) { + if (lastTxDatetime === undefined) { + return "无交易" + } const date = new Date(lastTxDatetime); const offset = 8; const utc8Date = new Date(date.getTime() + offset * 3600 * 1000); @@ -49,7 +52,6 @@ const getEthPrice = async () => { } } - async function getLineaTx(address, apiKey) { try { let days = new Set(); @@ -59,6 +61,9 @@ async function getLineaTx(address, apiKey) { let url = `https://api.lineascan.build/api?module=account&action=txlist&address=${address}&startblock=1&endblock=99999999&sort=asc&apikey=${apiKey}`; const response = await axios.get(url); let transactions = response.data.result; + if (!Array.isArray(transactions)) { + throw new TypeError("Expected an array of transactions, but did not receive one."); + } transactions = transactions.filter(item => item.from === address); let contractAddresses = transactions.map(item => item.to); contractAddresses = [...new Set(contractAddresses)]; @@ -70,18 +75,16 @@ async function getLineaTx(address, apiKey) { months.add(getMonthNumber(item)); }); const fee = transactions.reduce((acc, item) => acc + parseFloat(item.gasPrice) * parseFloat(item.gasUsed), 0); - // debugger const feeEth = fee / 10 ** 18; const exchangeAmount = transactions.reduce((acc, item) => acc + parseFloat(ethers.formatEther(item.value)), 0); const ethPrice = await getEthPrice(); - const toytalExchangeAmount = exchangeAmount * ethPrice; + const totalExchangeAmount = exchangeAmount * ethPrice; const tx = transactions.length; const linea_last_tx = getZkSyncLastTX(lastTxDatetime); const dayActivity = days.size; const weekActivity = weeks.size; const monthActivity = months.size; const contractActivity = contractAddresses.length; - // console.log(tx, linea_last_tx, feeEth, dayActivity, weekActivity, monthActivity, contractActivity); return { linea_tx_amount: tx, linea_last_tx: linea_last_tx, @@ -90,7 +93,7 @@ async function getLineaTx(address, apiKey) { monthActivity: monthActivity, contractActivity: contractActivity, totalFee: parseFloat(feeEth).toFixed(4), - totalExchangeAmount: parseFloat(toytalExchangeAmount).toFixed(2), + totalExchangeAmount: parseFloat(totalExchangeAmount).toFixed(2), }; } catch (error) { console.error(error); diff --git a/src/utils/scroll/getScrollTx.js b/src/utils/scroll/getScrollTx.js index 350b945e..ec90c3fd 100644 --- a/src/utils/scroll/getScrollTx.js +++ b/src/utils/scroll/getScrollTx.js @@ -18,6 +18,9 @@ function getMonthNumber(d) { } function getScrollLastTX(lastTxDatetime) { + if (lastTxDatetime === undefined) { + return "无交易" + } const date = new Date(lastTxDatetime); const offset = 8; const utc8Date = new Date(date.getTime() + offset * 3600 * 1000); diff --git a/src/utils/zksync/getZkSyncBridge.js b/src/utils/zksync/getZkSyncBridge.js index 919c64f2..778bf8ec 100644 --- a/src/utils/zksync/getZkSyncBridge.js +++ b/src/utils/zksync/getZkSyncBridge.js @@ -35,6 +35,9 @@ const getEthPrice = async () => { } function getZkSyncLastTX(lastTxDatetime) { + if (lastTxDatetime === undefined) { + return "无交易" + } const date = new Date(lastTxDatetime); const offset = 8; const utc8Date = new Date(date.getTime() + offset * 3600 * 1000); From a7730137c80d6661f10eae31abb448eaa11d2e02 Mon Sep 17 00:00:00 2001 From: mclamee Date: Thu, 30 May 2024 20:15:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?Overview=E5=8E=BB=E6=8E=89Stark=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0Base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/Overview/index.jsx | 270 ++++++++++++----------------------- 1 file changed, 95 insertions(+), 175 deletions(-) diff --git a/src/pages/Overview/index.jsx b/src/pages/Overview/index.jsx index 80da5bc6..b11aec66 100644 --- a/src/pages/Overview/index.jsx +++ b/src/pages/Overview/index.jsx @@ -72,26 +72,23 @@ const Overview = () => { const [ethPrice, setEthPrice] = useState(0); const zksAddresses = localStorage.getItem('addresses'); - const starkAddresses = localStorage.getItem('stark_addresses'); const l0Addresses = localStorage.getItem('l0_addresses'); const lineaAddresses = localStorage.getItem('linea_addresses'); const baseAddresses = localStorage.getItem('base_addresses'); const scrollAddresses = localStorage.getItem('scroll_addresses'); const zksAddressList = zksAddresses ? JSON.parse(zksAddresses) : []; - const starkAddressList = starkAddresses ? JSON.parse(starkAddresses) : []; const l0AddressList = l0Addresses ? JSON.parse(l0Addresses) : []; const lineaAddressList = lineaAddresses ? JSON.parse(lineaAddresses) : []; const baseAddressList = baseAddresses ? JSON.parse(baseAddresses) : []; const scrollAddressList = scrollAddresses ? JSON.parse(scrollAddresses) : []; const zksAddressCount = zksAddressList.length; - const starkAddressCount = starkAddressList.length; const l0AddressCount = l0AddressList.length; const lineaAddressCount = lineaAddressList.length; const baseAddressCount = baseAddressList.length; const scrollAddressCount = scrollAddressList.length; - const accountCount = zksAddressCount + starkAddressCount + l0AddressCount + lineaAddressCount + baseAddressCount + scrollAddressCount; + const accountCount = zksAddressCount + l0AddressCount + lineaAddressCount + baseAddressCount + scrollAddressCount; const accountOption = { title : { text: '账号总览', @@ -134,7 +131,6 @@ const Overview = () => { }, data: [ { value: zksAddressCount, name: 'zkSync Era' }, - { value: starkAddressCount, name: 'StarkNet' }, { value: l0AddressCount, name: 'LayerZero' }, { value: lineaAddressCount, name: 'Linea' }, { value: baseAddressCount, name: 'Base' }, @@ -145,127 +141,63 @@ const Overview = () => { }; const totalzksEthBalance = zksAddressList.reduce((total, addressData) => { - if ('eth_balance' in addressData) { - const ethBalance = parseFloat(addressData.eth_balance); - return total + ethBalance; - } - return total; + const ethBalance = parseFloat(addressData.eth_balance || 0); + return total + (isNaN(ethBalance) ? 0 : ethBalance); }, 0); const totalzks1Balance = zksAddressList.reduce((total, addressData) => { - if ('zks1_balance' in addressData) { - const zks1_balance = parseFloat(addressData.zks1_balance); - return total + zks1_balance; - } - return total; + const zks1_balance = parseFloat(addressData.zks1_balance || 0); + return total + (isNaN(zks1_balance) ? 0 : zks1_balance); }, 0); const totalzks2Balance = zksAddressList.reduce((total, addressData) => { - if ('zks2_balance' in addressData) { - const zks2_balance = parseFloat(addressData.zks2_balance); - return total + zks2_balance; - } - return total; + const zks2_balance = parseFloat(addressData.zks2_balance || 0); + return total + (isNaN(zks2_balance) ? 0 : zks2_balance); }, 0); const totalzks2UsdcBalance = zksAddressList.reduce((total, addressData) => { - if ('zks2_usdcBalance' in addressData) { - const zks2_usdcBalance = parseFloat(addressData.zks2_usdcBalance); - return total + zks2_usdcBalance; - } - return total; - }, 0); - const totalstarkEthBalance = starkAddressList.reduce((total, addressData) => { - if ('stark_eth_balance' in addressData) { - const stark_eth_balance = parseFloat(addressData.stark_eth_balance); - return total + stark_eth_balance; - } - return total; - }, 0); - const totalstarkUsdcBalance = starkAddressList.reduce((total, addressData) => { - if ('stark_usdc_balance' in addressData) { - const stark_usdc_balance = parseFloat(addressData.stark_usdc_balance); - return total + stark_usdc_balance; - } - return total; - }, 0); - const totalstarkUsdtBalance = starkAddressList.reduce((total, addressData) => { - if ('stark_usdt_balance' in addressData) { - const stark_usdt_balance = parseFloat(addressData.stark_usdt_balance); - return total + stark_usdt_balance; - } - return total; - }, 0); - const totalstarkDaiBalance = starkAddressList.reduce((total, addressData) => { - if ('stark_eth_balance' in addressData) { - const stark_eth_balance = parseFloat(addressData.stark_eth_balance); - return total + stark_eth_balance; - } - return total; + const zks2_usdcBalance = parseFloat(addressData.zks2_usdcBalance || 0); + return total + (isNaN(zks2_usdcBalance) ? 0 : zks2_usdcBalance); }, 0); const totallineaEthBalance = lineaAddressList.reduce((total, addressData) => { - if ('linea_eth_balance' in addressData) { - const linea_eth_balance = parseFloat(addressData.linea_eth_balance); - return total + linea_eth_balance; - } - return total; + const linea_eth_balance = parseFloat(addressData.linea_eth_balance || 0); + return total + (isNaN(linea_eth_balance) ? 0 : linea_eth_balance); }, 0); const totallineaBusdBalance = lineaAddressList.reduce((total, addressData) => { - if ('linea_busd_balance' in addressData) { - const linea_busd_balance = parseFloat(addressData.linea_busd_balance); - return total + linea_busd_balance; - } - return total; + const linea_busd_balance = parseFloat(addressData.linea_busd_balance || 0); + return total + (isNaN(linea_busd_balance) ? 0 : linea_busd_balance); }, 0); const totallineaUsdcBalance = lineaAddressList.reduce((total, addressData) => { - if ('linea_usdc_balance' in addressData) { - const linea_usdc_balance = parseFloat(addressData.linea_usdc_balance); - return total + linea_usdc_balance; - } - return total; + const linea_usdc_balance = parseFloat(addressData.linea_usdc_balance || 0); + return total + (isNaN(linea_usdc_balance) ? 0 : linea_usdc_balance); }, 0); const totalbaseEthBalance = baseAddressList.reduce((total, addressData) => { - if ('base_eth_balance' in addressData) { - const base_eth_balance = parseFloat(addressData.base_eth_balance); - return total + base_eth_balance; - } - return total; + const base_eth_balance = parseFloat(addressData.base_eth_balance || 0); + return total + (isNaN(base_eth_balance) ? 0 : base_eth_balance); }, 0); const totalbaseUsdcBalance = baseAddressList.reduce((total, addressData) => { - if ('base_usdc_balance' in addressData) { - const base_usdc_balance = parseFloat(addressData.base_usdc_balance); - return total + base_usdc_balance; - } - return total; + const base_usdc_balance = parseFloat(addressData.base_usdc_balance || 0); + return total + (isNaN(base_usdc_balance) ? 0 : base_usdc_balance); }, 0); const totalscrollEthBalance = scrollAddressList.reduce((total, addressData) => { - if ('scroll_eth_balance' in addressData) { - const scroll_eth_balance = parseFloat(addressData.scroll_eth_balance); - return total + scroll_eth_balance; - } - return total; + const scroll_eth_balance = parseFloat(addressData.scroll_eth_balance || 0); + return total + (isNaN(scroll_eth_balance) ? 0 : scroll_eth_balance); }, 0); const totalscrollUsdcBalance = scrollAddressList.reduce((total, addressData) => { - if ('scroll_usdc_balance' in addressData) { - const scroll_usdc_balance = parseFloat(addressData.scroll_usdc_balance); - return total + scroll_usdc_balance; - } - return total; + const scroll_usdc_balance = parseFloat(addressData.scroll_usdc_balance || 0); + return total + (isNaN(scroll_usdc_balance) ? 0 : scroll_usdc_balance); }, 0); const totalscrollUsdtBalance = scrollAddressList.reduce((total, addressData) => { - if ('scroll_usdt_balance' in addressData) { - const scroll_usdt_balance = parseFloat(addressData.scroll_usdt_balance); - return total + scroll_usdt_balance; - } - return total; + const scroll_usdt_balance = parseFloat(addressData.scroll_usdt_balance || 0); + return total + (isNaN(scroll_usdt_balance) ? 0 : scroll_usdt_balance); }, 0); - const totalEth = parseFloat(totalzksEthBalance + totalzks1Balance + totalzks2Balance + totalstarkEthBalance + totallineaEthBalance + totalbaseEthBalance + totalbaseEthBalance).toFixed(2); - const totalUsdc = parseFloat(totalzks2UsdcBalance + totalstarkUsdcBalance + totallineaUsdcBalance + totalbaseUsdcBalance + totalbaseUsdcBalance).toFixed(2); - const totalUsdt = parseFloat(totalstarkUsdtBalance + totalscrollUsdtBalance).toFixed(2); - const totalDai = parseFloat(totalstarkDaiBalance).toFixed(2); + const totalEth = parseFloat(totalzksEthBalance + totalzks1Balance + totalzks2Balance + totallineaEthBalance + totalbaseEthBalance); + const totalUsdc = parseFloat(totalzks2UsdcBalance + totallineaUsdcBalance + totalbaseUsdcBalance).toFixed(2); + const totalUsdt = parseFloat(totalscrollUsdtBalance).toFixed(2); + const totalDai = parseFloat(0).toFixed(2); const totalBusd = parseFloat(totallineaBusdBalance).toFixed(2); const totalBalance = parseFloat(Number(totalEth) * ethPrice + Number(totalUsdc) + Number(totalUsdt) + Number(totalDai) + Number(totalBusd)).toFixed(2); const valueOption = { title : { text: '资产总览', - subtext: `资产总额 ${totalBalance}U L2资产总额 ${parseInt(Number(totalBalance) - Number(totalzksEthBalance) * ethPrice)}U\n\nETH(${totalEth}) 稳定币(${parseInt(Number(totalzks2UsdcBalance) + Number(totalstarkUsdcBalance) + Number(totalstarkUsdtBalance) + Number(totalstarkDaiBalance) + Number(totallineaBusdBalance) + Number(totallineaUsdcBalance))})`, + subtext: `资产总额 ${totalBalance}U L2资产总额 ${parseInt(Number(totalBalance) - Number(totalzksEthBalance) * ethPrice)}U\n\nETH(${totalEth}) 稳定币(${parseInt(Number(totalzks2UsdcBalance) + Number(totalUsdc) + Number(totalUsdt) + Number(totalDai) + Number(totallineaBusdBalance) + Number(totallineaUsdcBalance))})`, x:'center' }, tooltip: { @@ -346,7 +278,6 @@ const Overview = () => { { value: parseInt(totalzksEthBalance * ethPrice), name: 'Ethereum' }, { value: parseInt(totalzks2Balance * ethPrice + totalzks2UsdcBalance), name: 'zkSync Era' }, { value: parseInt(totalzks1Balance * ethPrice), name: 'zkSync Lite' }, - { value: parseInt(totalstarkEthBalance * ethPrice + totalstarkUsdcBalance + totalstarkUsdtBalance + totalstarkDaiBalance), name: 'StarkNet' }, { value: parseInt(totallineaEthBalance * ethPrice + totallineaBusdBalance + totallineaUsdcBalance), name: 'Linea' }, { value: parseInt(totalbaseEthBalance * ethPrice ), name: 'Base' }, { value: parseInt(totalscrollEthBalance * ethPrice + totalscrollUsdcBalance + totalscrollUsdtBalance), name: 'Scroll' }, @@ -355,6 +286,7 @@ const Overview = () => { ] }; const zksProgress = zksAddressList.reduce((acc, entry) => { + console.log("zksp=",entry['progress'], entry) if ('progress' in entry) { acc.push(entry.progress); } @@ -395,13 +327,14 @@ const Overview = () => { '80-90': 0, '90-100': 0 }); - const starkProgress = starkAddressList.reduce((acc, entry) => { + const lineaProgress = lineaAddressList.reduce((acc, entry) => { + console.log("lineap=",entry['progress']) if ('progress' in entry) { acc.push(entry.progress); } return acc; }, []); - const starkProgressIntervalCounts = starkProgress.reduce((acc, num) => { + const lineaProgressIntervalCounts = lineaProgress.reduce((acc, num) => { if (num >= 0 && num <= 10) { acc['0-10']++; } else if (num > 10 && num <= 20) { @@ -436,13 +369,14 @@ const Overview = () => { '80-90': 0, '90-100': 0 }); - const lineaProgress = lineaAddressList.reduce((acc, entry) => { + const baseProgress = baseAddressList.reduce((acc, entry) => { + console.log("basep=",entry['progress']) if ('progress' in entry) { acc.push(entry.progress); } return acc; }, []); - const lineaProgressIntervalCounts = lineaProgress.reduce((acc, num) => { + const baseProgressIntervalCounts = baseProgress.reduce((acc, num) => { if (num >= 0 && num <= 10) { acc['0-10']++; } else if (num > 10 && num <= 20) { @@ -480,7 +414,7 @@ const Overview = () => { const progressOption = { title: { text: '任务进度分布', - subtext: `zkSyncEra平均完成率 ${parseInt(zksProgress.reduce((acc, num) => acc + parseFloat(num), 0) / zksProgress.length)}% StarkNet平均完成率 ${parseInt(starkProgress.reduce((acc, num) => acc + parseFloat(num), 0) / starkProgress.length)}% Linea平均完成率 ${parseInt(lineaProgress.reduce((acc, num) => acc + parseFloat(num), 0) / lineaProgress.length)}%`, + subtext: `zkSyncEra平均完成率 ${parseInt(zksProgress.reduce((acc, num) => acc + (isNaN(parseFloat(num)) ? 0 : parseFloat(num)), 0) / (zksProgress.length || 1))}% Linea平均完成率 ${parseInt(lineaProgress.reduce((acc, num) => acc + (isNaN(parseFloat(num)) ? 0 : parseFloat(num)), 0) / (lineaProgress.length || 1))}% Base平均完成率 ${parseInt(baseProgress.reduce((acc, num) => acc + (isNaN(parseFloat(num)) ? 0 : parseFloat(num)), 0) / (baseProgress.length || 1))}%`, left: 'center' }, tooltip: { @@ -491,7 +425,7 @@ const Overview = () => { top: '1%', orient: 'vertical', left: 'left', - data: ['zkSync Era', 'StarkNet', 'Linea'] + data: ['zkSync Era', 'Linea', 'Base'] }, xAxis: { type: 'category', @@ -510,13 +444,13 @@ const Overview = () => { type: 'bar' }, { - name: 'StarkNet', - data: [starkProgressIntervalCounts['0-10'], starkProgressIntervalCounts['10-20'], starkProgressIntervalCounts['20-30'], starkProgressIntervalCounts['30-40'], starkProgressIntervalCounts['40-50'], starkProgressIntervalCounts['50-60'], starkProgressIntervalCounts['60-70'], starkProgressIntervalCounts['70-80'], starkProgressIntervalCounts['80-90'], starkProgressIntervalCounts['90-100']], + name: 'Linea', + data: [lineaProgressIntervalCounts['0-10'], lineaProgressIntervalCounts['10-20'], lineaProgressIntervalCounts['20-30'], lineaProgressIntervalCounts['30-40'], lineaProgressIntervalCounts['40-50'], lineaProgressIntervalCounts['50-60'], lineaProgressIntervalCounts['60-70'], lineaProgressIntervalCounts['70-80'], lineaProgressIntervalCounts['80-90'], lineaProgressIntervalCounts['90-100']], type: 'bar' }, { - name: 'Linea', - data: [lineaProgressIntervalCounts['0-10'], lineaProgressIntervalCounts['10-20'], lineaProgressIntervalCounts['20-30'], lineaProgressIntervalCounts['30-40'], lineaProgressIntervalCounts['40-50'], lineaProgressIntervalCounts['50-60'], lineaProgressIntervalCounts['60-70'], lineaProgressIntervalCounts['70-80'], lineaProgressIntervalCounts['80-90'], lineaProgressIntervalCounts['90-100']], + name: 'Base', + data: [baseProgressIntervalCounts['0-10'], baseProgressIntervalCounts['10-20'], baseProgressIntervalCounts['20-30'], baseProgressIntervalCounts['30-40'], baseProgressIntervalCounts['40-50'], baseProgressIntervalCounts['50-60'], baseProgressIntervalCounts['60-70'], baseProgressIntervalCounts['70-80'], baseProgressIntervalCounts['80-90'], baseProgressIntervalCounts['90-100']], type: 'bar' } ] @@ -568,15 +502,15 @@ const Overview = () => { '90-100': 0, '100+': 0 }); - const starkTx = starkAddressList.reduce((acc, entry) => { - if ('stark_tx_amount' in entry) { - if (typeof entry.stark_tx_amount === 'number') { - acc.push(entry.stark_tx_amount); + const lineaTx = lineaAddressList.reduce((acc, entry) => { + if ('linea_tx_amount' in entry) { + if (typeof entry.linea_tx_amount === 'number') { + acc.push(entry.linea_tx_amount); } } return acc; }, []); - const starkTxIntervalCounts = starkTx.reduce((acc, num) => { + const lineaTxIntervalCounts = lineaTx.reduce((acc, num) => { if (num >= 0 && num <= 10) { acc['0-10']++; } else if (num > 10 && num <= 20) { @@ -614,15 +548,16 @@ const Overview = () => { '90-100': 0, '100+': 0 }); - const lineaTx = lineaAddressList.reduce((acc, entry) => { - if ('linea_tx_amount' in entry) { - if (typeof entry.linea_tx_amount === 'number') { - acc.push(entry.linea_tx_amount); + + const baseTx = baseAddressList.reduce((acc, entry) => { + if ('base_tx_amount' in entry) { + if (typeof entry.base_tx_amount === 'number') { + acc.push(entry.base_tx_amount); } } return acc; }, []); - const lineaTxIntervalCounts = lineaTx.reduce((acc, num) => { + const baseTxIntervalCounts = baseTx.reduce((acc, num) => { if (num >= 0 && num <= 10) { acc['0-10']++; } else if (num > 10 && num <= 20) { @@ -633,37 +568,23 @@ const Overview = () => { acc['30-40']++; } else if (num > 40 && num <= 50) { acc['40-50']++; - } else if (num > 50 && num <= 60) { - acc['50-60']++; - } else if (num > 60 && num <= 70) { - acc['60-70']++; - } else if (num > 70 && num <= 80) { - acc['70-80']++; - } else if (num > 80 && num <= 90) { - acc['80-90']++; - } else if (num > 90 && num <= 100) { - acc['90-100']++; - } else if (num > 100) { - acc['100+']++; + } else if (num > 50) { + acc['50+']++; } return acc; - }, { + }, { '0-10': 0, '10-20': 0, '20-30': 0, '30-40': 0, '40-50': 0, - '50-60': 0, - '60-70': 0, - '70-80': 0, - '80-90': 0, - '90-100': 0, - '100+': 0 - }); + '50+': 0 + }); + const txOption = { title: { text: 'Tx数分布', - subtext: `zkSyncEra平均tx ${parseInt(zksTx.reduce((acc, num) => acc + num, 0) / zksTx.length)}条 StarkNet平均tx ${parseInt(starkTx.reduce((acc, num) => acc + num, 0) / starkTx.length)}条 Linea平均tx ${parseInt(lineaTx.reduce((acc, num) => acc + num, 0) / lineaTx.length)}条`, + subtext: `zkSyncEra平均tx ${parseInt(zksTx.length ? zksTx.reduce((acc, num) => acc + num, 0) / zksTx.length : 0)}条 Linea平均tx ${parseInt(lineaTx.length ? lineaTx.reduce((acc, num) => acc + num, 0) / lineaTx.length : 0)}条 Base平均tx ${parseInt(baseTx.length ? baseTx.reduce((acc, num) => acc + num, 0) / baseTx.length : 0)}条`, left: 'center' }, tooltip: { @@ -674,7 +595,7 @@ const Overview = () => { top: '1%', orient: 'vertical', left: 'left', - data: ['zkSync Era', 'StarkNet', 'Linea'] + data: ['zkSync Era', 'Linea', 'Base'] }, xAxis: { type: 'category', @@ -693,13 +614,13 @@ const Overview = () => { type: 'bar' }, { - name: 'StarkNet', - data: [starkTxIntervalCounts['0-10'], starkTxIntervalCounts['10-20'], starkTxIntervalCounts['20-30'], starkTxIntervalCounts['30-40'], starkTxIntervalCounts['40-50'], starkTxIntervalCounts['50-60'], starkTxIntervalCounts['60-70'], starkTxIntervalCounts['70-80'], starkTxIntervalCounts['80-90'], starkTxIntervalCounts['90-100'], starkTxIntervalCounts['100+']], + name: 'Linea', + data: [lineaTxIntervalCounts['0-10'], lineaTxIntervalCounts['10-20'], lineaTxIntervalCounts['20-30'], lineaTxIntervalCounts['30-40'], lineaTxIntervalCounts['40-50'], lineaTxIntervalCounts['50-60'], lineaTxIntervalCounts['60-70'], lineaTxIntervalCounts['70-80'], lineaTxIntervalCounts['80-90'], lineaTxIntervalCounts['90-100'], lineaTxIntervalCounts['100+']], type: 'bar' }, { - name: 'Linea', - data: [lineaTxIntervalCounts['0-10'], lineaTxIntervalCounts['10-20'], lineaTxIntervalCounts['20-30'], lineaTxIntervalCounts['30-40'], lineaTxIntervalCounts['40-50'], lineaTxIntervalCounts['50-60'], lineaTxIntervalCounts['60-70'], lineaTxIntervalCounts['70-80'], lineaTxIntervalCounts['80-90'], lineaTxIntervalCounts['90-100'], lineaTxIntervalCounts['100+']], + name: 'Base', + data: [baseTxIntervalCounts['0-10'], baseTxIntervalCounts['10-20'], baseTxIntervalCounts['20-30'], baseTxIntervalCounts['30-40'], baseTxIntervalCounts['40-50'], baseTxIntervalCounts['50-60'], baseTxIntervalCounts['60-70'], baseTxIntervalCounts['70-80'], baseTxIntervalCounts['80-90'], baseTxIntervalCounts['90-100'], baseTxIntervalCounts['100+']], type: 'bar' } ] @@ -735,7 +656,7 @@ const Overview = () => { '40-50': 0, '50+': 0 }); - const starkDayActivity = starkAddressList.reduce((acc, entry) => { + const lineaDayActivity = lineaAddressList.reduce((acc, entry) => { if ('dayActivity' in entry) { if (typeof entry.dayActivity === 'number') { acc.push(entry.dayActivity); @@ -743,7 +664,7 @@ const Overview = () => { } return acc; }, []); - const starkActivityIntervalCounts = starkDayActivity.reduce((acc, num) => { + const lineaActivityIntervalCounts = lineaDayActivity.reduce((acc, num) => { if (num >= 0 && num <= 10) { acc['0-10']++; } else if (num > 10 && num <= 20) { @@ -766,7 +687,7 @@ const Overview = () => { '40-50': 0, '50+': 0, }); - const lineaDayActivity = lineaAddressList.reduce((acc, entry) => { + const baseDayActivity = baseAddressList.reduce((acc, entry) => { if ('dayActivity' in entry) { if (typeof entry.dayActivity === 'number') { acc.push(entry.dayActivity); @@ -774,7 +695,7 @@ const Overview = () => { } return acc; }, []); - const lineaActivityIntervalCounts = lineaDayActivity.reduce((acc, num) => { + const baseActivityIntervalCounts = baseDayActivity.reduce((acc, num) => { if (num >= 0 && num <= 10) { acc['0-10']++; } else if (num > 10 && num <= 20) { @@ -789,18 +710,18 @@ const Overview = () => { acc['50+']++; } return acc; - }, { + }, { '0-10': 0, '10-20': 0, '20-30': 0, '30-40': 0, '40-50': 0, - '50+': 0, - }); + '50+': 0 + }); const dayActivityOption = { title: { text: '日活跃天数分布', - subtext: `zkSyncEra平均日活 ${parseInt(zksDayActivity.reduce((acc, num) => acc + num, 0) / zksDayActivity.length)}天 StarkNet平均日活 ${parseInt(starkDayActivity.reduce((acc, num) => acc + num, 0) / starkDayActivity.length)}天 Linea平均日活 ${parseInt(lineaDayActivity.reduce((acc, num) => acc + num, 0) / lineaDayActivity.length)}天`, + subtext: `zkSyncEra平均日活 ${parseInt(zksDayActivity.reduce((acc, num) => acc + num, 0) / zksDayActivity.length)}天 Linea平均日活 ${parseInt(lineaDayActivity.reduce((acc, num) => acc + num, 0) / lineaDayActivity.length)}天 Base平均日活 ${parseInt(baseDayActivity.reduce((acc, num) => acc + num, 0) / baseDayActivity.length)}天`, left: 'center' }, tooltip: { @@ -811,7 +732,7 @@ const Overview = () => { top: '1%', orient: 'vertical', left: 'left', - data: ['zkSync Era', 'StarkNet', 'Linea'] + data: ['zkSync Era', 'Linea', 'Base'] }, xAxis: { type: 'category', @@ -830,13 +751,13 @@ const Overview = () => { type: 'bar' }, { - name: 'StarkNet', - data: [starkActivityIntervalCounts['0-10'], starkActivityIntervalCounts['10-20'], starkActivityIntervalCounts['20-30'], starkActivityIntervalCounts['30-40'], starkActivityIntervalCounts['40-50'], starkActivityIntervalCounts['50+']], + name: 'Linea', + data: [lineaActivityIntervalCounts['0-10'], lineaActivityIntervalCounts['10-20'], lineaActivityIntervalCounts['20-30'], lineaActivityIntervalCounts['30-40'], lineaActivityIntervalCounts['40-50'], lineaActivityIntervalCounts['50+']], type: 'bar' }, { - name: 'Linea', - data: [lineaActivityIntervalCounts['0-10'], lineaActivityIntervalCounts['10-20'], lineaActivityIntervalCounts['20-30'], lineaActivityIntervalCounts['30-40'], lineaActivityIntervalCounts['40-50'], lineaActivityIntervalCounts['50+']], + name: 'Base', + data: [baseActivityIntervalCounts['0-10'], baseActivityIntervalCounts['10-20'], baseActivityIntervalCounts['20-30'], baseActivityIntervalCounts['30-40'], baseActivityIntervalCounts['40-50'], baseActivityIntervalCounts['50+']], type: 'bar' } ] @@ -867,13 +788,13 @@ const Overview = () => { '5w-25w': 0, '25w+': 0 }); - const starkExchangeAmount = starkAddressList.reduce((acc, entry) => { - if ('stark_exchange_amount' in entry) { - acc.push(entry.stark_exchange_amount); + const lineaExchangeAmount = lineaAddressList.reduce((acc, entry) => { + if ('totalExchangeAmount' in entry) { + acc.push(entry.totalExchangeAmount); } return acc; }, []); - const starkExchangeAmountIntervalCounts = starkExchangeAmount.reduce((acc, num) => { + const lineaExchangeAmountIntervalCounts = lineaExchangeAmount.reduce((acc, num) => { if (num >= 0 && num <= 1000) { acc['0-1k']++; } else if (num > 1000 && num <= 10000) { @@ -893,13 +814,13 @@ const Overview = () => { '5w-25w': 0, '25w+': 0 }); - const lineaExchangeAmount = lineaAddressList.reduce((acc, entry) => { + const baseExchangeAmount = baseAddressList.reduce((acc, entry) => { if ('totalExchangeAmount' in entry) { acc.push(entry.totalExchangeAmount); } return acc; }, []); - const lineaExchangeAmountIntervalCounts = lineaExchangeAmount.reduce((acc, num) => { + const baseExchangeAmountIntervalCounts = baseExchangeAmount.reduce((acc, num) => { if (num >= 0 && num <= 1000) { acc['0-1k']++; } else if (num > 1000 && num <= 10000) { @@ -912,7 +833,7 @@ const Overview = () => { acc['25w+']++; } return acc; - }, { + }, { '0-1k': 0, '1k-1w': 0, '1w-5w': 0, @@ -922,7 +843,7 @@ const Overview = () => { const exchangeAmountOption = { title: { text: '交易额分布', - subtext: `zkSyncEra平均交易额 ${parseInt(zksExchangeAmount.reduce((acc, num) => acc + parseInt(num), 0) / zksExchangeAmount.length)}u StarkNet平均交易额 ${parseInt(starkExchangeAmount.reduce((acc, num) => acc + parseInt(num), 0) / starkExchangeAmount.length)}u Linea平均交易额 ${parseInt(lineaExchangeAmount.reduce((acc, num) => acc + parseInt(num), 0) / lineaExchangeAmount.length)}u`, + subtext: `zkSyncEra平均交易额 ${parseInt(zksExchangeAmount.reduce((acc, num) => acc + parseInt(num), 0) / zksExchangeAmount.length)}u Linea平均交易额 ${parseInt(lineaExchangeAmount.reduce((acc, num) => acc + parseInt(num), 0) / lineaExchangeAmount.length)}u Base平均交易额 ${parseInt(baseExchangeAmount.reduce((acc, num) => acc + parseInt(num), 0) / baseExchangeAmount.length)}u`, left: 'center' }, tooltip: { @@ -933,7 +854,7 @@ const Overview = () => { top: '1%', orient: 'vertical', left: 'left', - data: ['zkSync Era', 'StarkNet', 'Linea'] + data: ['zkSync Era', 'Linea', 'Base'] }, xAxis: { type: 'category', @@ -952,13 +873,13 @@ const Overview = () => { type: 'bar' }, { - name: 'StarkNet', - data: [starkExchangeAmountIntervalCounts['0-1k'], starkExchangeAmountIntervalCounts['1k-1w'], starkExchangeAmountIntervalCounts['1w-5w'], starkExchangeAmountIntervalCounts['5w-25w'], starkExchangeAmountIntervalCounts['25w+']], + name: 'Linea', + data: [lineaExchangeAmountIntervalCounts['0-1k'], lineaExchangeAmountIntervalCounts['1k-1w'], lineaExchangeAmountIntervalCounts['1w-5w'], lineaExchangeAmountIntervalCounts['5w-25w'], lineaExchangeAmountIntervalCounts['25w+']], type: 'bar' }, { - name: 'Linea', - data: [lineaExchangeAmountIntervalCounts['0-1k'], lineaExchangeAmountIntervalCounts['1k-1w'], lineaExchangeAmountIntervalCounts['1w-5w'], lineaExchangeAmountIntervalCounts['5w-25w'], lineaExchangeAmountIntervalCounts['25w+']], + name: 'Base', + data: [baseExchangeAmountIntervalCounts['0-1k'], baseExchangeAmountIntervalCounts['1k-1w'], baseExchangeAmountIntervalCounts['1w-5w'], baseExchangeAmountIntervalCounts['5w-25w'], baseExchangeAmountIntervalCounts['25w+']], type: 'bar' } ] @@ -986,17 +907,16 @@ const Overview = () => { } const zksTimestampsList = localStorage.getItem('zks_timestamps') ? JSON.parse(localStorage.getItem('zks_timestamps')) : []; - const starkTimestampsList = localStorage.getItem('stark_timestamps') ? JSON.parse(localStorage.getItem('stark_timestamps')) : []; const lineaTimestampsList = localStorage.getItem('linea_timestamps') ? JSON.parse(localStorage.getItem('linea_timestamps')) : []; const baseTimestampsList = localStorage.getItem('base_timestamps') ? JSON.parse(localStorage.getItem('base_timestamps')) : []; - const allTimestamps = zksTimestampsList.concat(starkTimestampsList).concat(lineaTimestampsList).concat(baseTimestampsList); + const allTimestamps = zksTimestampsList.concat(lineaTimestampsList).concat(baseTimestampsList); const timeOption2023 = { title: { top: 30, left: 'center', // text: '黑奴工作量证明 (Proof of Gas)', - // subtext: `2023年 日均交互次数 ${parseFloat(allTimestamps.length/365).toFixed(2) * accountCount} zkSync Era ${(parseFloat(zksTimestampsList.length/365) * zksAddressCount).toFixed(2)} StarkNet ${parseInt(starkTimestampsList.length/365) * starkAddressCount} Linea ${parseInt(lineaTimestampsList.length/365) * lineaAddressCount} Base ${parseInt(baseTimestampsList.length/365) * baseAddressCount}`, + // subtext: `2023年 日均交互次数 ${parseFloat(allTimestamps.length/365).toFixed(2) * accountCount} zkSync Era ${(parseFloat(zksTimestampsList.length/365) * zksAddressCount).toFixed(2)} Linea ${parseInt(lineaTimestampsList.length/365) * lineaAddressCount} Base ${parseInt(baseTimestampsList.length/365) * baseAddressCount}`, }, tooltip: { position: 'top', @@ -1056,7 +976,7 @@ const Overview = () => { top: 30, left: 'center', text: '黑奴工作量证明 (Proof of Gas)', - // subtext: `2024年 日均交互次数 ${parseInt(allTimestamps.length/365)} zkSync Era ${parseInt(zksTimestampsList.length/365)} StarkNet ${parseInt(starkTimestampsList.length/365)} Linea ${parseInt(lineaTimestampsList.length/365)} Base ${parseInt(baseTimestampsList.length/365)}`, + // subtext: `2024年 日均交互次数 ${parseInt(allTimestamps.length/365)} zkSync Era ${parseInt(zksTimestampsList.length/365)} Linea ${parseInt(lineaTimestampsList.length/365)} Base ${parseInt(baseTimestampsList.length/365)}`, }, tooltip: { position: 'top',