11 .topbar .topbar-middle {
18 .topbar-left .btn-menu i {
33 .content .token-amount {
38 .transaction-title h3 {
41 padding: 10px 0 10px 20px;
50 justify-content: space-between;
80 <div class="warp-chlid bg-white">
81 <section class="bg-image">
83 <div class="topbar-left">
84 <i class="iconfont icon-back" @click="close"></i>
86 <div class="topbar-middle">
87 <div v-if="currentAsset!=undefined" class="amount color-white">
88 <div v-if="currentAsset.symbol!=='Asset'">
90 {{currentAsset.symbol}}
93 <div class="alias color-grey">{{currentAsset.name}}</div>
100 <div class="alias color-grey">{{shortAddress(currentAsset.asset)}}</div>
105 <div class="content">
106 <div v-if="currentAsset!=undefined" class="amount color-white">
107 <div class="token-amount">
108 {{itemBalance(currentAsset)}}
110 <div>{{formatCurrency(currentAsset[ currency ])}}</div>
114 <section class="transaction-title">
115 <h3 class="bg-gray color-grey">{{ $t('main.record') }}</h3>
117 <section class="transactions">
118 <div class="transactions" v-if="transactions.length != 0">
119 <vue-scroll ref="vs" @handle-scroll="handleScroll">
121 <li class="list-item" v-for="(transaction, index) in transactions" :key="index" @click="$router.push({name: 'transfer-info', params: {transaction: transaction, address: currentAccount.address}})">
123 <div>{{transaction.address}}</div>
124 <div class="addr color-grey" v-if="transaction.hasOwnProperty('block_timestamp')">
125 {{transaction.submission_timestamp | moment}}
127 <div class="addr color-grey" v-else>
128 {{ $t('main.unconfirmed') }}
131 <div class="text-align-right">
132 <div class="value">{{transaction.direct}} {{transaction.val}}</div>
133 <div v-if="transaction.type == 'vote'" class="addr color-grey">{{ $t('listVote.vote')}} {{transaction.vAmount}}</div>
134 <div v-else-if="transaction.type == 'veto'" class="addr color-grey">{{ $t('listVote.cancelVote')}} {{transaction.vAmount}}</div>
135 <div v-else-if="transaction.type == 'crossChain'" class="addr color-grey">{{ $t('crossChain.title')}}</div>
142 <div class="bg-emptytx"></div>
144 <span class="color-lightgrey center-text no-record">{{$t('main.noRecord')}}</span>
153 import address from "@/utils/address";
154 import query from "@/models/query";
155 import transaction from "@/models/transaction";
156 import { BTM } from "@/utils/constants";
157 import { mapActions, mapGetters, mapState } from 'vuex'
158 import * as Actions from '@/store/constants';
159 import _ from 'lodash';
160 import { Number as Num } from "@/utils/Number"
163 const EnterActive = 'animated faster fadeInLeft';
164 const LeaveActive = 'animated faster fadeOutLeft';
174 enterActive: EnterActive,
175 leaveActive: LeaveActive,
180 if (to.name.startsWith('menu')) {
182 } else if (from.name.startsWith('menu')) {
183 this.maskShow = false
186 // remove transition for some page
187 this.enterActive = EnterActive
188 this.leaveActive = LeaveActive
190 'currentAccount.balances'() {
191 this.$refs['vs'].scrollTo(
199 this.refreshTransactions( this.start, this.limit).then(transactions => {
200 this.transactions = transactions
220 shortAddress: function (add) {
221 return address.short(add)
223 formatCurrency: function (num) {
224 return Num.formatCurrency(num, this.currency)
226 itemBalance: function(asset){
227 if(asset.asset === BTM){
228 return Num.formatNue(asset.balance,8)
230 return Num.formatNue(asset.balance,asset.decimals)
234 handleScroll(vertical, horizontal, nativeEvent) {
235 if (vertical.process == 0) {
237 this.refreshTransactions( this.start, this.limit).then(transactions => {
238 this.transactions = transactions
243 if ( (vertical.process == 1) && (this.transactions.length == (this.start+1)*this.limit) ) {
244 this.start += this.limit;
245 this.refreshTransactions( this.start, this.limit).then(transactions => {
246 transactions.forEach(transaction => {
247 this.transactions.push(transaction);
252 refreshTransactions: function (start, limit) {
253 return new Promise((resolve, reject) => {
254 transaction.list(this.currentAccount.guid, this.currentAsset.asset, start, limit).then(transactions => {
255 if (transactions == null) {
259 const formattedTx = this.transactionsFormat(transactions);
267 transactionsFormat: function (transactions) {
268 const formattedTransactions = []
269 const assetID = this.currentAsset.asset
271 transactions.forEach(transaction => {
272 const balanceObject = transaction.balances
273 .filter(b => b.asset === assetID);
275 const filterInput = _.find(transaction.inputs, function(o) { return o.type =='veto'; })
276 const filterOutput = _.find(transaction.outputs, function(o) { return o.type =='vote'; })
279 transaction.type = 'veto'
280 const inAmount = _.sumBy((transaction.inputs.filter(i => i.type ==='veto')), 'amount')
281 const outAmount = _.sumBy((transaction.outputs.filter(i => i.type ==='vote')), 'amount')
282 transaction.pubkey = filterInput.vote
283 transaction.vAmount = Num.formatNue(inAmount-outAmount,8)
284 }else if(filterOutput){
285 const outAmount = _.sumBy((transaction.outputs.filter(i => i.type ==='vote')), 'amount')
286 transaction.pubkey = filterOutput.vote
287 transaction.vAmount = Num.formatNue(outAmount,8)
288 transaction.type = 'vote'
289 }else if(_.find(transaction.outputs, function(o) { return o.type =='crosschain_output'; })){
290 transaction.type = 'crossChain'
291 transaction.cDirection ='Vapor -> Bytom'
292 }else if(_.find(transaction.inputs, function(o) { return o.type =='crosschain_input'; })){
293 transaction.type = 'crossChain'
294 transaction.cDirection ='Bytom -> Vapor'
297 if(balanceObject.length ===1 ){
298 const inputAddresses = transaction.inputs
299 .filter(input => input.asset === assetID && input.address !== this.currentAccount.address)
300 .map(input => input.address)
302 const outputAddresses = transaction.outputs
303 .filter(output => output.asset === assetID && output.address !== this.currentAccount.address)
304 .map(output => output.address)
306 let val = Math.abs(balanceObject[0].amount)
308 if (Number(balanceObject[0].amount) > 0) {
309 transaction.direct = "+";
310 const resultAddr = inputAddresses.pop()
311 transaction.address = (resultAddr && resultAddr.includes(' '))?resultAddr:address.short(resultAddr);
313 transaction.direct = "-";
314 const resultAddr = outputAddresses.pop()
315 transaction.address = (resultAddr && resultAddr.includes(' '))?resultAddr:address.short(resultAddr);
318 transaction.val = Num.formatNue(val, this.currentAsset.decimals) ;
319 transaction.fee = transaction.fee / 100000000;
321 formattedTransactions.push(transaction);
324 return formattedTransactions;
327 Actions.UPDATE_STORED_BYTOM,
328 Actions.SET_LIST_VOTE
332 this.refreshTransactions( this.start, this.limit).then(transactions => {
333 this.transactions = transactions
335 if(this.listVote.length == 0 && this.netType === 'vapor'){
336 query.chainStatus().then(resp => {
338 const votes = resp.consensus_nodes.map( (item, index) => {
342 this[Actions.SET_LIST_VOTE](votes)