Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/lang/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export default {
enterWalletAddress: "Wallet",
enterWalletAddressPrompt: "One address per line",
inquireResult: "Result",
list: ["Wallet", "Token", "Balance"],
list: ["Wallet", "Token", "Balance","Decimals"],
bntCheckBalance: "Get Balance",
btnExportExcel: "Download Excel",
exportExcelPrompt: "No balance data",
Expand Down
2 changes: 1 addition & 1 deletion src/lang/zh.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ export default {
enterWalletAddress: "钱包地址",
enterWalletAddressPrompt: "一行输入一个地址",
inquireResult: "查询结果",
list: ["钱包地址", "代币", "余额"],
list: ["钱包地址", "代币", "余额","精度"],
bntCheckBalance: "查询余额",
btnExportExcel: "下载 Excel",
exportExcelPrompt: "你当前还没有查询余额,请查询余额后再进行下载表格",
Expand Down
114 changes: 85 additions & 29 deletions src/views/BulkQuery.vue
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@
<el-input type="textarea" v-model="walletAddress" :placeholder="$t('bulkQuery.enterWalletAddressPrompt')"></el-input>
<div class="tips" v-if="searchResult.length>0">{{$t("bulkQuery.inquireResult")}}</div>
<el-table v-if="searchResult.length>0" :data="searchResult" border slot="empty" :empty-text="$t('pubilc.noData')" id="outExcel" class="table">
<el-table-column prop="walletAddress" :label="$t('bulkQuery.list[0]')" width="363">
<el-table-column prop="walletAddress" :label="$t('bulkQuery.list[0]')" width="380">
</el-table-column>
<el-table-column prop="token" :label="$t('bulkQuery.list[1]')" width="90">
<el-table-column prop="token" :label="$t('bulkQuery.list[1]')" width="80">
</el-table-column>
<el-table-column prop="balance" :label="$t('bulkQuery.list[2]')" width="250">
<el-table-column prop="balance" :label="$t('bulkQuery.list[2]')" width="160">
</el-table-column>
<el-table-column prop="decimal" :label="$t('bulkQuery.list[3]')" width="86">
</el-table-column>
</el-table>
<div class="collapse">
Expand All @@ -31,6 +33,7 @@
</template>
<div>{{$t('bulkQuery.list[1]')}}: {{item.token}}</div>
<div>{{$t('bulkQuery.list[2]')}}: {{item.balance}}</div>
<div>{{$t('bulkQuery.list[3]')}}: {{item.decimal}}</div>
</el-collapse-item>
</el-collapse>
</div>
Expand Down Expand Up @@ -143,24 +146,54 @@ export default {
this.searchResult = []
let walletBalance = []
let token = []
let decimals = []
let walletAddress = this.walletAddress.split('\n')
let provider = new ethers.providers.InfuraProvider('mainnet')
if (this.walletAddress == '') {
this.$message(this.$t('bulkQuery.checkBalancePrompt[0]'))
return
}
this.isloading = true

let multicall3Addr = "0xcA11bde05977b3631167028862bE2a173976CA11"
let abi = [
'function aggregate(tuple(address target, bytes callData)[] calls) payable returns (uint256 blockNumber, bytes[] returnData)',
'function getEthBalance(address addr) view returns (uint256 balance)',
'function balanceOf(address) view returns (uint256)',
'function symbol() view returns (string)',
'function decimals() view returns (uint8)',
]
const iface = new ethers.utils.Interface(abi);
let multicall3 = new ethers.Contract(
multicall3Addr,
abi,
provider
)
if (this.tokenAdress == '') {
let calls = []
for (let i in walletAddress) {
try {
walletBalance[i] = await (
await provider.getBalance(walletAddress[i])
)._hex
token[i] = 'ETH'
} catch (error) {
walletBalance[i] = '查询失败'
}
calls.push({
target: multicall3Addr,
callData: iface.encodeFunctionData("getEthBalance", [
walletAddress[i],
]),
})
}
try {
const result = await multicall3.callStatic.aggregate(calls);
const returnData = result.returnData;
for (let i = 0; i < returnData.length; i++) {
const balanceHex = returnData[i];
const balance = ethers.BigNumber.from(balanceHex).toString();
walletBalance.push(balance)
token.push('ETH')
decimals.push(18)
}
} catch (error) {
for (let i in walletAddress) {
walletBalance.push('查询失败')
}
}
} else {
try {
var source = await provider.getCode(this.tokenAdress)
Expand All @@ -171,33 +204,56 @@ export default {
this.$message(this.$t('bulkQuery.checkBalancePrompt[1]'))
return
}
let abi = [
'function balanceOf(address) view returns (uint256)',
'function symbol() view returns (string)',
]
let contract = new ethers.Contract(
this.tokenAdress,
abi,
provider
)

let calls = []
for (let i in walletAddress) {
try {
let balance = await contract.balanceOf(walletAddress[i])
walletBalance.push(balance._hex)
let tokenAddress = await contract.symbol()
token[i] = tokenAddress
} catch (error) {
calls.push({
target: this.tokenAdress,
callData: iface.encodeFunctionData("balanceOf", [
walletAddress[i],
]),
})
calls.push({
target: this.tokenAdress,
callData: iface.encodeFunctionData("symbol", []),
})
calls.push({
target: this.tokenAdress,
callData: iface.encodeFunctionData("decimals", []),
})
}

try {
const result = await multicall3.callStatic.aggregate(calls);
const returnData = result.returnData;
for (let i = 0; i < returnData.length; i += 3) {
const balanceHex = returnData[i];
const symbolBytes = returnData[i + 1];
const decimalHex = returnData[i + 2];

const balance = ethers.BigNumber.from(balanceHex).toString();
const symbol = ethers.utils.toUtf8String(symbolBytes);
const decimal = ethers.BigNumber.from(decimalHex).toString();

walletBalance.push(balance);
token.push(symbol);
decimals.push(decimal);
}
} catch (error) {
for (let i in walletAddress) {
walletBalance.push('查询失败')
}
}

}

for (let i in walletAddress) {
walletBalance[i] = parseInt(walletBalance[i], 16)
walletBalance[i] = ethers.utils.formatUnits(walletBalance[i], decimals[i])
let data = {
walletAddress: walletAddress[i],
balance: walletBalance[i],
// token:token[i]
token: 'ETH',
token:token[i],
decimal: decimals[i],
}
this.searchResult.push(data)
}
Expand Down