OSDN Git Service

add estimated gas
[bytom/bytom-electron.git] / src / utility / buildInOutDisplay.js
1 import {btmAmountUnit} from '../features/core/reducers'
2
3 const mappings = {
4   id: 'ID',
5   type: 'Type',
6   purpose: 'Purpose',
7   transactionId: 'Transaction ID',
8   position: 'Position',
9   assetId: 'Asset ID',
10   assetAlias: 'Asset Alias',
11   assetDefinition: 'Asset Definition',
12   assetTags: 'Asset Tags',
13   assetIsLocal: 'Asset Is Local?',
14   amount: 'Amount',
15   accountId: 'Account ID',
16   accountAlias: 'Account Alias',
17   accountTags: 'Account Tags',
18   controlProgram: 'Control Program',
19   address: 'Address',
20   programIndex: 'Program Index',
21   spentOutputId: 'Spent Output ID',
22   refData: 'Reference Data',
23   sourceId: 'Source ID',
24   sourcePos: 'Source Postion',
25   issuanceProgram: 'Issuance Program',
26   isLocal: 'Local?',
27   referenceData: 'Reference Data',
28   change: 'Change'
29 }
30
31 const mappings_ZH = {
32   id: 'ID',
33   type: '类型',
34   purpose: 'Purpose',
35   transactionId: '交易ID',
36   position: '位置',
37   assetId: '资产ID',
38   assetAlias: '资产别名',
39   assetDefinition: '资产定义',
40   assetTags: 'Asset Tags',
41   assetIsLocal: 'Asset Is Local?',
42   amount: '数量',
43   accountId: '账户ID',
44   accountAlias: '账户别名',
45   accountTags: 'Account Tags',
46   controlProgram: '合约程序',
47   address: '地址',
48   programIndex: '程序索引',
49   spentOutputId: '花费输出ID',
50   refData: 'Reference Data',
51   sourceId: '源ID',
52   sourcePos: '源位置',
53   issuanceProgram: '资产发布程序',
54   isLocal: 'Local?',
55   referenceData: 'Reference Data',
56   change: '找零'
57 }
58
59 const txInputFields = [
60   'type',
61   'assetId',
62   'assetAlias',
63   'assetDefinition',
64   'assetTags',
65   'assetIsLocal',
66   'amount',
67   'accountId',
68   'accountAlias',
69   'accountTags',
70   'issuanceProgram',
71   'controlProgram',
72   'address',
73   'spentOutputId',
74   'isLocal',
75   'referenceData',
76 ]
77
78 const txOutputFields = [
79   'type',
80   'purpose',
81   'id',
82   'position',
83   'assetId',
84   'assetAlias',
85   'assetDefinition',
86   'assetTags',
87   'assetIsLocal',
88   'amount',
89   'accountId',
90   'accountAlias',
91   'accountTags',
92   'controlProgram',
93   'address',
94   'isLocal',
95   'referenceData',
96 ]
97
98 const unspentFields = [
99   'type',
100   'purpose',
101   'transactionId',
102   'position',
103   'assetId',
104   'assetAlias',
105   'assetDefinition',
106   'assetTags',
107   'assetIsLocal',
108   'amount',
109   'accountId',
110   'accountAlias',
111   'accountTags',
112   'controlProgram',
113   'programIndex',
114   'refData',
115   'sourceId',
116   'sourcePos',
117   'isLocal',
118   'referenceData',
119   'change',
120 ]
121
122 const balanceFields = Object.keys(mappings)
123
124 const buildDisplay = (item, fields, btmAmountUnit, lang) => {
125   const details = []
126   fields.forEach(key => {
127     if (item.hasOwnProperty(key)) {
128       if(key === 'amount'){
129         details.push({label: ( lang === 'zh'? mappings_ZH[key]: mappings[key] ), value: normalizeGlobalBTMAmount(item['assetId'], item[key], btmAmountUnit)})
130       }else{
131         details.push({label: ( lang === 'zh'? mappings_ZH[key]: mappings[key] ), value: item[key]})
132       }
133     }
134   })
135   return details
136 }
137
138 const addZeroToDecimalPos = (src,pos) => {
139   if(src != null ){
140     let srcString = src.toString()
141     var rs = srcString.indexOf('.')
142     if (rs < 0) {
143       rs = srcString.length
144       srcString += '.'
145     }
146     while (srcString.length <= rs + pos) {
147       srcString += '0'
148     }
149     return srcString
150   }
151   return src
152 }
153
154 const formatIntNumToPosDecimal = (neu,pos) => {
155   if(neu != null ){
156     let neuString = neu.toString()
157     if(neuString.length<=8){
158       return addZeroToDecimalPos((neu/Math.pow(10, pos)), pos)
159     }else {
160       return neuString.slice(0, -pos) + '.' + neuString.slice(-pos)
161     }
162   }
163   return neu
164 }
165
166 export const normalizeGlobalBTMAmount = (assetID, amount, btmAmountUnit) => {
167   //normalize BTM Amount
168   if (assetID === 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff') {
169     switch (btmAmountUnit){
170       case 'BTM':
171         return formatIntNumToPosDecimal(amount, 8)+' BTM'
172       case 'mBTM':
173         return formatIntNumToPosDecimal(amount, 5)+' mBTM'
174       case 'NEU':
175         return amount+' NEU'
176     }
177   }
178   return amount
179 }
180
181 export const normalizeBTM = (amount, btmAmountUnit) => {
182   switch (btmAmountUnit){
183     case 'BTM':
184       return formatIntNumToPosDecimal(amount, 8)+' BTM'
185     case 'mBTM':
186       return formatIntNumToPosDecimal(amount, 5)+' mBTM'
187     case 'NEU':
188       return amount+' NEU'
189   }
190 }
191
192 export function formatBTMAmount(value, pos)  {
193   if (!value) {
194     return value
195   }
196
197   const onlyNums = value.toString().replace(/[^0-9.]/g, '')
198
199   // Create an array with sections split by .
200   const sections = onlyNums.split('.')
201
202   // Remove any leading 0s apart from single 0
203   if (sections[0] !== '0' && sections[0] !== '00') {
204     sections[0] = sections[0].replace(/^0+/, '')
205   } else {
206     sections[0] = '0'
207   }
208
209   // If numbers exist after first .
210   if (sections[1]) {
211     return sections[0] + '.' + sections[1].slice(0, pos)
212   } else if (onlyNums.indexOf('.') !== -1) {
213     return sections[0] + '.'
214   } else {
215     return sections[0]
216   }
217 }
218
219 export function parseBTMAmount(value, pos){
220   if (!value) {
221     return value
222   }
223
224   const onlyNums = value.replace(/[^0-9.]/g, '')
225   const sections = onlyNums.split('.')
226
227   let numDecimal = ''
228
229   if (sections[1]) {
230     numDecimal = sections[1].slice(0, pos)
231   }
232   while (numDecimal.length < pos) {
233     numDecimal += '0'
234   }
235
236   //remove all the leading 0s
237   let amountNum = sections[0] + numDecimal
238   if(/^0*$/.test(amountNum)){
239     amountNum = '0'
240   }else {
241     amountNum = amountNum.replace(/^0+/, '')
242   }
243
244   return amountNum
245 }
246
247 export function normalizeBTMAmountUnit(assetID, amount, btmAmountUnit) {
248   return normalizeGlobalBTMAmount(assetID, amount, btmAmountUnit)
249 }
250
251 export function addZeroToDecimalPosition(value, deciPoint){
252   return addZeroToDecimalPos(value, deciPoint)
253 }
254
255 export function converIntToDec(int, deciPoint){
256   return formatIntNumToPosDecimal(int, deciPoint)
257 }
258
259 export function buildTxInputDisplay(input, btmAmountUnit, lang) {
260   return buildDisplay(input, txInputFields, btmAmountUnit, lang)
261 }
262
263 export function buildTxOutputDisplay(output, btmAmountUnit, lang) {
264   return buildDisplay(output, txOutputFields, btmAmountUnit, lang)
265 }
266
267 export function buildUnspentDisplay(output, btmAmountUnit, lang) {
268   const normalized = {
269     amount: output.amount,
270     accountId: output.accountId,
271     accountAlias: output.accountAlias,
272     assetId: output.assetId,
273     assetAlias: output.assetAlias,
274     controlProgram: output.program,
275     programIndex: output.controlProgramIndex,
276     sourceId: output.sourceId,
277     sourcePos: output.sourcePos,
278     change: output.change + ''
279   }
280   return buildDisplay(normalized, unspentFields, btmAmountUnit, lang)
281 }
282
283 export function buildBalanceDisplay(balance, btmAmountUnit, lang) {
284   return buildDisplay({
285     amount: balance.amount,
286     assetId: balance.assetId,
287     assetAlias: balance.assetAlias,
288     accountAlias: balance.accountAlias
289   }, balanceFields, btmAmountUnit, lang)
290 }