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.asset.symbol!=='Asset'">
90 {{currentAsset.asset.symbol}}
93 <div class="alias color-grey">{{currentAsset.asset.name}}</div>
100 <div class="alias color-grey">{{shortAddress(currentAsset.asset.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[ camelize(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('blockTimestamp')">
125 {{transaction.submissionTimestamp | 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 { camelize } from "@/utils/utils";
157 import { BTM } from "@/utils/constants";
158 import { mapActions, mapGetters, mapState } from 'vuex'
159 import * as Actions from '@/store/constants';
160 import _ from 'lodash';
161 import { Number as Num } from "@/utils/Number"
164 const EnterActive = 'animated faster fadeInLeft';
165 const LeaveActive = 'animated faster fadeOutLeft';
175 enterActive: EnterActive,
176 leaveActive: LeaveActive,
181 if (to.name.startsWith('menu')) {
183 } else if (from.name.startsWith('menu')) {
184 this.maskShow = false
187 // remove transition for some page
188 this.enterActive = EnterActive
189 this.leaveActive = LeaveActive
191 'currentAccount.balances'() {
192 this.$refs['vs'].scrollTo(
200 this.refreshTransactions( this.start, this.limit).then(transactions => {
201 this.transactions = transactions
207 if(this.netType === 'vapor'){
208 return this.currentAccount.vpAddress
210 return this.currentAccount.address
225 camelize: function (object) {
226 return camelize(object)
231 shortAddress: function (add) {
232 return address.short(add)
234 formatCurrency: function (num) {
235 return Num.formatCurrency(num, this.currency)
237 itemBalance: function(asset){
238 if(asset.asset === BTM){
239 return Num.formatNue(asset.availableBalance,8)
241 return Num.formatNue(asset.availableBalance,asset.decimals)
245 handleScroll(vertical, horizontal, nativeEvent) {
246 if (vertical.process == 0) {
248 this.refreshTransactions( this.start, this.limit).then(transactions => {
249 this.transactions = transactions
254 if ( (vertical.process == 1) && (this.transactions.length == (this.start+1)*this.limit) ) {
255 this.start += this.limit;
256 this.refreshTransactions( this.start, this.limit).then(transactions => {
257 transactions.forEach(transaction => {
258 this.transactions.push(transaction);
263 refreshTransactions: function (start, limit) {
264 return new Promise((resolve, reject) => {
265 transaction.list(this.address, this.currentAsset.asset.assetId, start, limit).then(transactions => {
266 if (transactions == null) {
270 const formattedTx = this.transactionsFormat(transactions);
278 transactionsFormat: function (transactions) {
279 const formattedTransactions = []
280 const assetID = this.currentAsset.asset.assetId
282 transactions.forEach(transaction => {
283 const balanceObject = transaction.balances
284 .filter(b => b.asset.assetId === assetID);
286 const filterInput = transaction.types.includes('veto')
287 const filterOutput = transaction.types.includes('vote')
290 transaction.type = 'veto'
291 const inAmount = _.sumBy((transaction.inputs.filter(i => i.type ==='veto')), 'amount')
292 const outAmount = _.sumBy((transaction.outputs.filter(i => i.type ==='vote')), 'amount')
293 transaction.pubkey = filterInput.vote
294 transaction.vAmount = Num.formatNue(inAmount-outAmount,8)
295 }else if(filterOutput){
296 const outAmount = _.sumBy((transaction.outputs.filter(i => i.type ==='vote')), 'amount')
297 transaction.pubkey = filterOutput.vote
298 transaction.vAmount = Num.formatNue(outAmount,8)
299 transaction.type = 'vote'
300 }else if(transaction.types.includes('out_crosschain')){
301 transaction.type = 'crossChain'
302 if(this.netType === 'vapor'){
303 transaction.cDirection ='Vapor -> Bytom'
305 transaction.cDirection ='Bytom -> Vapor'
307 }else if(transaction.types.includes('in_crosschain')){
308 transaction.type = 'crossChain'
309 if(this.netType === 'vapor'){
310 transaction.cDirection ='Bytom -> Vapor'
312 transaction.cDirection ='Vapor -> Bytom'
316 const inputAddresses = transaction.inputs
317 .filter(input => input.asset.assetId === assetID && input.address !== this.currentAccount.address)
318 .map(input => input.address)
320 const outputAddresses = transaction.outputs
321 .filter(output => output.asset.assetId === assetID && output.address !== this.currentAccount.address)
322 .map(output => output.address)
324 if(balanceObject.length ===1 ){
325 let val = Math.abs(balanceObject[0].amount)
327 if (Number(balanceObject[0].amount) > 0) {
328 transaction.direct = "+";
329 const resultAddr = inputAddresses.pop()
330 transaction.address = (resultAddr && resultAddr.includes(' '))?resultAddr:address.short(resultAddr);
332 transaction.direct = "-";
333 const resultAddr = outputAddresses.pop()
334 transaction.address = (resultAddr && resultAddr.includes(' '))?resultAddr:address.short(resultAddr);
337 transaction.val = val ;
339 formattedTransactions.push(transaction);
342 transaction.address = address.short(this.currentAccount.address)
344 formattedTransactions.push(transaction);
347 return formattedTransactions;
350 Actions.UPDATE_STORED_BYTOM,
351 Actions.SET_LIST_VOTE
355 this.refreshTransactions( this.start, this.limit).then(transactions => {
356 this.transactions = transactions
358 if(this.listVote.length == 0 && this.netType === 'vapor'){
359 query.chainStatus().then(resp => {
361 const votes = resp.consensusNodes.map( (item, index) => {
365 this[Actions.SET_LIST_VOTE](votes)