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/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',
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);