mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-30 16:18:07 +01:00
commit
e23ae5371b
BIN
app/fonts/Lato/Lato-Black.ttf
Executable file
BIN
app/fonts/Lato/Lato-Black.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-BlackItalic.ttf
Executable file
BIN
app/fonts/Lato/Lato-BlackItalic.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-Bold.ttf
Executable file
BIN
app/fonts/Lato/Lato-Bold.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-BoldItalic.ttf
Executable file
BIN
app/fonts/Lato/Lato-BoldItalic.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-Hairline.ttf
Executable file
BIN
app/fonts/Lato/Lato-Hairline.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-HairlineItalic.ttf
Executable file
BIN
app/fonts/Lato/Lato-HairlineItalic.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-Italic.ttf
Executable file
BIN
app/fonts/Lato/Lato-Italic.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-Light.ttf
Executable file
BIN
app/fonts/Lato/Lato-Light.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-LightItalic.ttf
Executable file
BIN
app/fonts/Lato/Lato-LightItalic.ttf
Executable file
Binary file not shown.
BIN
app/fonts/Lato/Lato-Regular.ttf
Executable file
BIN
app/fonts/Lato/Lato-Regular.ttf
Executable file
Binary file not shown.
93
app/fonts/Lato/OFL.txt
Executable file
93
app/fonts/Lato/OFL.txt
Executable file
@ -0,0 +1,93 @@
|
|||||||
|
Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato"
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
|
||||||
|
|
||||||
|
-----------------------------------------------------------
|
||||||
|
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||||
|
-----------------------------------------------------------
|
||||||
|
|
||||||
|
PREAMBLE
|
||||||
|
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||||
|
development of collaborative font projects, to support the font creation
|
||||||
|
efforts of academic and linguistic communities, and to provide a free and
|
||||||
|
open framework in which fonts may be shared and improved in partnership
|
||||||
|
with others.
|
||||||
|
|
||||||
|
The OFL allows the licensed fonts to be used, studied, modified and
|
||||||
|
redistributed freely as long as they are not sold by themselves. The
|
||||||
|
fonts, including any derivative works, can be bundled, embedded,
|
||||||
|
redistributed and/or sold with any software provided that any reserved
|
||||||
|
names are not used by derivative works. The fonts and derivatives,
|
||||||
|
however, cannot be released under any other type of license. The
|
||||||
|
requirement for fonts to remain under this license does not apply
|
||||||
|
to any document created using the fonts or their derivatives.
|
||||||
|
|
||||||
|
DEFINITIONS
|
||||||
|
"Font Software" refers to the set of files released by the Copyright
|
||||||
|
Holder(s) under this license and clearly marked as such. This may
|
||||||
|
include source files, build scripts and documentation.
|
||||||
|
|
||||||
|
"Reserved Font Name" refers to any names specified as such after the
|
||||||
|
copyright statement(s).
|
||||||
|
|
||||||
|
"Original Version" refers to the collection of Font Software components as
|
||||||
|
distributed by the Copyright Holder(s).
|
||||||
|
|
||||||
|
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||||
|
or substituting -- in part or in whole -- any of the components of the
|
||||||
|
Original Version, by changing formats or by porting the Font Software to a
|
||||||
|
new environment.
|
||||||
|
|
||||||
|
"Author" refers to any designer, engineer, programmer, technical
|
||||||
|
writer or other person who contributed to the Font Software.
|
||||||
|
|
||||||
|
PERMISSION & CONDITIONS
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||||
|
redistribute, and sell modified and unmodified copies of the Font
|
||||||
|
Software, subject to the following conditions:
|
||||||
|
|
||||||
|
1) Neither the Font Software nor any of its individual components,
|
||||||
|
in Original or Modified Versions, may be sold by itself.
|
||||||
|
|
||||||
|
2) Original or Modified Versions of the Font Software may be bundled,
|
||||||
|
redistributed and/or sold with any software, provided that each copy
|
||||||
|
contains the above copyright notice and this license. These can be
|
||||||
|
included either as stand-alone text files, human-readable headers or
|
||||||
|
in the appropriate machine-readable metadata fields within text or
|
||||||
|
binary files as long as those fields can be easily viewed by the user.
|
||||||
|
|
||||||
|
3) No Modified Version of the Font Software may use the Reserved Font
|
||||||
|
Name(s) unless explicit written permission is granted by the corresponding
|
||||||
|
Copyright Holder. This restriction only applies to the primary font name as
|
||||||
|
presented to the users.
|
||||||
|
|
||||||
|
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||||
|
Software shall not be used to promote, endorse or advertise any
|
||||||
|
Modified Version, except to acknowledge the contribution(s) of the
|
||||||
|
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||||
|
permission.
|
||||||
|
|
||||||
|
5) The Font Software, modified or unmodified, in part or in whole,
|
||||||
|
must be distributed entirely under this license, and must not be
|
||||||
|
distributed under any other license. The requirement for fonts to
|
||||||
|
remain under this license does not apply to any document created
|
||||||
|
using the Font Software.
|
||||||
|
|
||||||
|
TERMINATION
|
||||||
|
This license becomes null and void if any of the above conditions are
|
||||||
|
not met.
|
||||||
|
|
||||||
|
DISCLAIMER
|
||||||
|
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||||
|
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||||
|
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||||
|
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||||
|
OTHER DEALINGS IN THE FONT SOFTWARE.
|
@ -37,7 +37,17 @@ EthBalanceComponent.prototype.render = function () {
|
|||||||
}
|
}
|
||||||
EthBalanceComponent.prototype.renderBalance = function (value) {
|
EthBalanceComponent.prototype.renderBalance = function (value) {
|
||||||
var props = this.props
|
var props = this.props
|
||||||
const { conversionRate, shorten, incoming, currentCurrency } = props
|
const {
|
||||||
|
conversionRate,
|
||||||
|
shorten,
|
||||||
|
incoming,
|
||||||
|
currentCurrency,
|
||||||
|
hideTooltip,
|
||||||
|
styleOveride,
|
||||||
|
} = props
|
||||||
|
|
||||||
|
const { fontSize, color, fontFamily, lineHeight } = styleOveride
|
||||||
|
|
||||||
if (value === 'None') return value
|
if (value === 'None') return value
|
||||||
if (value === '...') return value
|
if (value === '...') return value
|
||||||
var balanceObj = generateBalanceObject(value, shorten ? 1 : 3)
|
var balanceObj = generateBalanceObject(value, shorten ? 1 : 3)
|
||||||
@ -54,36 +64,41 @@ EthBalanceComponent.prototype.renderBalance = function (value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var label = balanceObj.label
|
var label = balanceObj.label
|
||||||
|
const tooltipProps = hideTooltip ? {} : {
|
||||||
|
position: 'bottom',
|
||||||
|
title: `${ethNumber} ${ethSuffix}`,
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
h(Tooltip, {
|
h(hideTooltip ? 'div' : Tooltip,
|
||||||
position: 'bottom',
|
tooltipProps,
|
||||||
title: `${ethNumber} ${ethSuffix}`,
|
h('div.flex-column', [
|
||||||
}, h('div.flex-column', [
|
h('.flex-row', {
|
||||||
h('.flex-row', {
|
|
||||||
style: {
|
|
||||||
alignItems: 'flex-end',
|
|
||||||
lineHeight: '13px',
|
|
||||||
fontFamily: 'Montserrat Light',
|
|
||||||
textRendering: 'geometricPrecision',
|
|
||||||
},
|
|
||||||
}, [
|
|
||||||
h('div', {
|
|
||||||
style: {
|
style: {
|
||||||
width: '100%',
|
alignItems: 'flex-end',
|
||||||
textAlign: 'right',
|
lineHeight: lineHeight || '13px',
|
||||||
|
fontFamily: fontFamily || 'Montserrat Light',
|
||||||
|
textRendering: 'geometricPrecision',
|
||||||
},
|
},
|
||||||
}, incoming ? `+${balance}` : balance),
|
}, [
|
||||||
h('div', {
|
h('div', {
|
||||||
style: {
|
style: {
|
||||||
color: ' #AEAEAE',
|
width: '100%',
|
||||||
fontSize: '12px',
|
textAlign: 'right',
|
||||||
marginLeft: '5px',
|
fontSize: fontSize || 'inherit',
|
||||||
},
|
color: color || 'inherit',
|
||||||
}, label),
|
},
|
||||||
]),
|
}, incoming ? `+${balance}` : balance),
|
||||||
|
h('div', {
|
||||||
|
style: {
|
||||||
|
color: color || '#AEAEAE',
|
||||||
|
fontSize: fontSize || '12px',
|
||||||
|
marginLeft: '5px',
|
||||||
|
},
|
||||||
|
}, label),
|
||||||
|
]),
|
||||||
|
|
||||||
showFiat ? h(FiatValue, { value: props.value, conversionRate, currentCurrency }) : null,
|
showFiat ? h(FiatValue, { value: props.value, conversionRate, currentCurrency }) : null,
|
||||||
]))
|
]))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ function FiatValue () {
|
|||||||
|
|
||||||
FiatValue.prototype.render = function () {
|
FiatValue.prototype.render = function () {
|
||||||
const props = this.props
|
const props = this.props
|
||||||
const { conversionRate, currentCurrency } = props
|
const { conversionRate, currentCurrency, style } = props
|
||||||
|
|
||||||
const value = formatBalance(props.value, 6)
|
const value = formatBalance(props.value, 6)
|
||||||
|
|
||||||
@ -28,16 +28,18 @@ FiatValue.prototype.render = function () {
|
|||||||
fiatTooltipNumber = 'Unknown'
|
fiatTooltipNumber = 'Unknown'
|
||||||
}
|
}
|
||||||
|
|
||||||
return fiatDisplay(fiatDisplayNumber, currentCurrency)
|
return fiatDisplay(fiatDisplayNumber, currentCurrency, style)
|
||||||
}
|
}
|
||||||
|
|
||||||
function fiatDisplay (fiatDisplayNumber, fiatSuffix) {
|
function fiatDisplay (fiatDisplayNumber, fiatSuffix, styleOveride = {}) {
|
||||||
|
const { fontSize, color, fontFamily, lineHeight } = styleOveride
|
||||||
|
|
||||||
if (fiatDisplayNumber !== 'N/A') {
|
if (fiatDisplayNumber !== 'N/A') {
|
||||||
return h('.flex-row', {
|
return h('.flex-row', {
|
||||||
style: {
|
style: {
|
||||||
alignItems: 'flex-end',
|
alignItems: 'flex-end',
|
||||||
lineHeight: '13px',
|
lineHeight: lineHeight || '13px',
|
||||||
fontFamily: 'Montserrat Light',
|
fontFamily: fontFamily || 'Montserrat Light',
|
||||||
textRendering: 'geometricPrecision',
|
textRendering: 'geometricPrecision',
|
||||||
},
|
},
|
||||||
}, [
|
}, [
|
||||||
@ -45,15 +47,15 @@ function fiatDisplay (fiatDisplayNumber, fiatSuffix) {
|
|||||||
style: {
|
style: {
|
||||||
width: '100%',
|
width: '100%',
|
||||||
textAlign: 'right',
|
textAlign: 'right',
|
||||||
fontSize: '12px',
|
fontSize: fontSize || '12px',
|
||||||
color: '#333333',
|
color: color || '#333333',
|
||||||
},
|
},
|
||||||
}, fiatDisplayNumber),
|
}, fiatDisplayNumber),
|
||||||
h('div', {
|
h('div', {
|
||||||
style: {
|
style: {
|
||||||
color: '#AEAEAE',
|
color: color || '#AEAEAE',
|
||||||
marginLeft: '5px',
|
marginLeft: '5px',
|
||||||
fontSize: '12px',
|
fontSize: fontSize || '12px',
|
||||||
},
|
},
|
||||||
}, fiatSuffix),
|
}, fiatSuffix),
|
||||||
])
|
])
|
||||||
|
102
ui/app/components/gas-tooltip.js
Normal file
102
ui/app/components/gas-tooltip.js
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
const Component = require('react').Component
|
||||||
|
const h = require('react-hyperscript')
|
||||||
|
const inherits = require('util').inherits
|
||||||
|
const InputNumber = require('./input-number.js')
|
||||||
|
const findDOMNode = require('react-dom').findDOMNode
|
||||||
|
|
||||||
|
module.exports = GasTooltip
|
||||||
|
|
||||||
|
inherits(GasTooltip, Component)
|
||||||
|
function GasTooltip () {
|
||||||
|
Component.call(this)
|
||||||
|
this.state = {
|
||||||
|
gasLimit: 0,
|
||||||
|
gasPrice: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
this.updateGasPrice = this.updateGasPrice.bind(this);
|
||||||
|
this.updateGasLimit = this.updateGasLimit.bind(this);
|
||||||
|
this.onClose = this.onClose.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
GasTooltip.prototype.componentWillMount = function () {
|
||||||
|
const { gasPrice = 0, gasLimit = 0} = this.props
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
gasPrice: parseInt(gasPrice, 16) / 1000000000,
|
||||||
|
gasLimit: parseInt(gasLimit, 16),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
GasTooltip.prototype.updateGasPrice = function (newPrice) {
|
||||||
|
const { onFeeChange } = this.props
|
||||||
|
const { gasLimit } = this.state
|
||||||
|
|
||||||
|
this.setState({ gasPrice: newPrice })
|
||||||
|
onFeeChange({
|
||||||
|
gasLimit: gasLimit.toString(16),
|
||||||
|
gasPrice: (newPrice * 1000000000).toString(16)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
GasTooltip.prototype.updateGasLimit = function (newLimit) {
|
||||||
|
const { onFeeChange } = this.props
|
||||||
|
const { gasPrice } = this.state
|
||||||
|
|
||||||
|
this.setState({ gasLimit: newLimit })
|
||||||
|
onFeeChange({
|
||||||
|
gasLimit: newLimit.toString(16),
|
||||||
|
gasPrice: (gasPrice * 1000000000).toString(16)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
GasTooltip.prototype.onClose = function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
this.props.onClose();
|
||||||
|
}
|
||||||
|
|
||||||
|
GasTooltip.prototype.render = function () {
|
||||||
|
const { position, title, children, className } = this.props
|
||||||
|
const { gasPrice, gasLimit } = this.state
|
||||||
|
|
||||||
|
return h('div.gas-tooltip', {}, [
|
||||||
|
h('div.gas-tooltip-close-area', {
|
||||||
|
onClick: this.onClose
|
||||||
|
}),
|
||||||
|
h('div.customize-gas-tooltip-container', {}, [
|
||||||
|
h('div.customize-gas-tooltip', {}, [
|
||||||
|
h('div.gas-tooltip-header.gas-tooltip-label', {}, ['Customize Gas']),
|
||||||
|
h('div.gas-tooltip-input-label', {}, [
|
||||||
|
h('span.gas-tooltip-label', {}, ['Gas Price']),
|
||||||
|
h('i.fa.fa-info-circle')
|
||||||
|
]),
|
||||||
|
h(InputNumber, {
|
||||||
|
unitLabel: 'GWEI',
|
||||||
|
step: 1,
|
||||||
|
min: 0,
|
||||||
|
placeholder: '0',
|
||||||
|
initValue: gasPrice,
|
||||||
|
onChange: (newPrice) => this.updateGasPrice(newPrice),
|
||||||
|
}),
|
||||||
|
h('div.gas-tooltip-input-label', {
|
||||||
|
style: {
|
||||||
|
'marginTop': '81px',
|
||||||
|
},
|
||||||
|
}, [
|
||||||
|
h('span.gas-tooltip-label', {}, ['Gas Limit']),
|
||||||
|
h('i.fa.fa-info-circle')
|
||||||
|
]),
|
||||||
|
h(InputNumber, {
|
||||||
|
unitLabel: 'UNITS',
|
||||||
|
step: 1,
|
||||||
|
min: 0,
|
||||||
|
placeholder: '0',
|
||||||
|
initValue: gasLimit,
|
||||||
|
onChange: (newLimit) => this.updateGasLimit(newLimit),
|
||||||
|
}),
|
||||||
|
]),
|
||||||
|
h('div.gas-tooltip-arrow', {}),
|
||||||
|
])
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
57
ui/app/components/input-number.js
Normal file
57
ui/app/components/input-number.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
const Component = require('react').Component
|
||||||
|
const h = require('react-hyperscript')
|
||||||
|
const inherits = require('util').inherits
|
||||||
|
const findDOMNode = require('react-dom').findDOMNode
|
||||||
|
|
||||||
|
module.exports = InputNumber
|
||||||
|
|
||||||
|
inherits(InputNumber, Component)
|
||||||
|
function InputNumber () {
|
||||||
|
Component.call(this)
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
value: 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setValue = this.setValue.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
InputNumber.prototype.componentWillMount = function () {
|
||||||
|
const { initValue = 0 } = this.props
|
||||||
|
|
||||||
|
this.setState({ value: initValue });
|
||||||
|
}
|
||||||
|
|
||||||
|
InputNumber.prototype.setValue = function (newValue) {
|
||||||
|
const { fixed, min, onChange } = this.props
|
||||||
|
|
||||||
|
if (fixed) newValue = Number(newValue.toFixed(4))
|
||||||
|
|
||||||
|
if (newValue >= min) {
|
||||||
|
this.setState({ value: newValue })
|
||||||
|
onChange(newValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
InputNumber.prototype.render = function () {
|
||||||
|
const { unitLabel, step = 1, min, placeholder } = this.props
|
||||||
|
const { value } = this.state
|
||||||
|
|
||||||
|
return h('div.customize-gas-input-wrapper', {}, [
|
||||||
|
h('input.customize-gas-input', {
|
||||||
|
placeholder,
|
||||||
|
type: 'number',
|
||||||
|
value,
|
||||||
|
onChange: (e) => this.setValue(Number(e.target.value))
|
||||||
|
}),
|
||||||
|
h('span.gas-tooltip-input-detail', {}, [unitLabel]),
|
||||||
|
h('div.gas-tooltip-input-arrows', {}, [
|
||||||
|
h('i.fa.fa-angle-up', {
|
||||||
|
onClick: () => this.setValue(value + step)
|
||||||
|
}),
|
||||||
|
h('i.fa.fa-angle-down', {
|
||||||
|
onClick: () => this.setValue(value - step)
|
||||||
|
}),
|
||||||
|
]),
|
||||||
|
])
|
||||||
|
}
|
@ -12,7 +12,7 @@ function Tooltip () {
|
|||||||
|
|
||||||
Tooltip.prototype.render = function () {
|
Tooltip.prototype.render = function () {
|
||||||
const props = this.props
|
const props = this.props
|
||||||
const { position, title, children } = props
|
const { position, title, children, show = true } = props
|
||||||
|
|
||||||
return h(ReactTooltip, {
|
return h(ReactTooltip, {
|
||||||
position: position || 'left',
|
position: position || 'left',
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
z-index: $send-card-z-index;
|
z-index: $send-card-z-index;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 5%;
|
top: 5%;
|
||||||
|
font-family: 'DIN OT';
|
||||||
|
|
||||||
@media screen and (max-width: $break-small) {
|
@media screen and (max-width: $break-small) {
|
||||||
top: 33px;
|
top: 33px;
|
||||||
@ -45,6 +46,7 @@
|
|||||||
|
|
||||||
.send-screen-input-wrapper {
|
.send-screen-input-wrapper {
|
||||||
width: 95%;
|
width: 95%;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.send-screen-input {
|
.send-screen-input {
|
||||||
@ -53,9 +55,18 @@
|
|||||||
|
|
||||||
.send-screen-gas-input {
|
.send-screen-gas-input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: $concrete;
|
height: 41px;
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #f3f3f3;
|
||||||
border-width: 0px;
|
border-width: 0px;
|
||||||
border-style: none;
|
border-style: none;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
color: $scorpion;
|
||||||
}
|
}
|
||||||
|
|
||||||
.send-screen-amount-labels {
|
.send-screen-amount-labels {
|
||||||
@ -70,4 +81,128 @@
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.send-screen-bolt-icon {}
|
.selected-currency {
|
||||||
|
color: $curious-blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unselected-currency {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.send-screen-gas-input-customize {
|
||||||
|
color: $curious-blue;
|
||||||
|
font-size: 12px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-close-area {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1000;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-gas-tooltip-container {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 50px;
|
||||||
|
width: 237px;
|
||||||
|
height: 307px;
|
||||||
|
background-color: white;
|
||||||
|
opacity: 1;
|
||||||
|
box-shadow: grey 0px 0px 5px;
|
||||||
|
z-index: 1050;
|
||||||
|
padding: 13px 19px;
|
||||||
|
font-size: 16px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-family: 'Lato';
|
||||||
|
font-weigth: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-arrow {
|
||||||
|
height: 25px;
|
||||||
|
width: 25px;
|
||||||
|
z-index: 1200;
|
||||||
|
background: white;
|
||||||
|
position: absolute;
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg);
|
||||||
|
left: 107px;
|
||||||
|
top: 294px;
|
||||||
|
-webkit-box-shadow: 0 0 5px grey;
|
||||||
|
box-shadow: 2px 2px 2px $alto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-gas-tooltip-container input[type=number]::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-gas-tooltip-container input[type=number]:hover::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-gas-tooltip {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-label {
|
||||||
|
font-size: 16px;
|
||||||
|
color: $tundora;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-header {
|
||||||
|
padding-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-input-label {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-input-label i {
|
||||||
|
color: $silver-chalice;
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-gas-input {
|
||||||
|
width: 178px;
|
||||||
|
height: 28px;
|
||||||
|
border: 1px solid $alto;
|
||||||
|
font-size: 16px;
|
||||||
|
color: $nile-blue;
|
||||||
|
padding-left: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.customize-gas-input-wrapper {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-input-detail {
|
||||||
|
position: absolute;
|
||||||
|
top: 4px;
|
||||||
|
right: 26px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: $silver-chalice;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gas-tooltip-input-arrows {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 178px;
|
||||||
|
width: 17px;
|
||||||
|
height: 28px;
|
||||||
|
border: 1px solid #dadada;
|
||||||
|
border-left: 0px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
color: #9b9b9b;
|
||||||
|
font-size: 0.8em;
|
||||||
|
padding: 1px 4px;
|
||||||
|
}
|
@ -41,3 +41,10 @@
|
|||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Lato';
|
||||||
|
src: url('/fonts/Lato/Lato-Regular.ttf') format('truetype');
|
||||||
|
font-weight: 400;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
@ -29,6 +29,7 @@ $curious-blue: #2f9ae0;
|
|||||||
$concrete: #f3f3f3;
|
$concrete: #f3f3f3;
|
||||||
$tundora: #4d4d4d;
|
$tundora: #4d4d4d;
|
||||||
$nile-blue: #1b344d;
|
$nile-blue: #1b344d;
|
||||||
|
$scorpion: #5d5d5d;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Z-Indicies
|
Z-Indicies
|
||||||
|
106
ui/app/send.js
106
ui/app/send.js
@ -5,13 +5,19 @@ const connect = require('react-redux').connect
|
|||||||
const Identicon = require('./components/identicon')
|
const Identicon = require('./components/identicon')
|
||||||
const actions = require('./actions')
|
const actions = require('./actions')
|
||||||
const util = require('./util')
|
const util = require('./util')
|
||||||
|
const ethUtil = require('ethereumjs-util')
|
||||||
|
const BN = ethUtil.BN
|
||||||
|
const hexToBn = require('../../app/scripts/lib/hex-to-bn')
|
||||||
const numericBalance = require('./util').numericBalance
|
const numericBalance = require('./util').numericBalance
|
||||||
const addressSummary = require('./util').addressSummary
|
const addressSummary = require('./util').addressSummary
|
||||||
|
const bnMultiplyByFraction = require('./util').bnMultiplyByFraction
|
||||||
const isHex = require('./util').isHex
|
const isHex = require('./util').isHex
|
||||||
const EthBalance = require('./components/eth-balance')
|
const EthBalance = require('./components/eth-balance')
|
||||||
const EnsInput = require('./components/ens-input')
|
const EnsInput = require('./components/ens-input')
|
||||||
const ethUtil = require('ethereumjs-util')
|
const FiatValue = require('./components/fiat-value.js')
|
||||||
|
const GasTooltip = require('./components/gas-tooltip.js')
|
||||||
const { getSelectedIdentity } = require('./selectors')
|
const { getSelectedIdentity } = require('./selectors')
|
||||||
|
const getTxFeeBn = require('./util').getTxFeeBn
|
||||||
|
|
||||||
const ARAGON = '960b236A07cf122663c4303350609A66A7B288C0'
|
const ARAGON = '960b236A07cf122663c4303350609A66A7B288C0'
|
||||||
|
|
||||||
@ -28,6 +34,7 @@ function mapStateToProps (state) {
|
|||||||
addressBook: state.metamask.addressBook,
|
addressBook: state.metamask.addressBook,
|
||||||
conversionRate: state.metamask.conversionRate,
|
conversionRate: state.metamask.conversionRate,
|
||||||
currentCurrency: state.metamask.currentCurrency,
|
currentCurrency: state.metamask.currentCurrency,
|
||||||
|
blockGasLimit: state.metamask.currentBlockGasLimit,
|
||||||
}
|
}
|
||||||
|
|
||||||
result.error = result.warning && result.warning.split('.')[0]
|
result.error = result.warning && result.warning.split('.')[0]
|
||||||
@ -51,12 +58,20 @@ function SendTransactionScreen () {
|
|||||||
to: '',
|
to: '',
|
||||||
// these values are hardcoded, so "Next" can be clicked
|
// these values are hardcoded, so "Next" can be clicked
|
||||||
amount: '0.0001', // see L544
|
amount: '0.0001', // see L544
|
||||||
gasPrice: '4a817c800',
|
gasPrice: '0x5d21dba00',
|
||||||
gas: '0x7b0d',
|
gas: '0x7b0d',
|
||||||
txData: null,
|
txData: null,
|
||||||
memo: '',
|
memo: '',
|
||||||
},
|
},
|
||||||
|
tooltipIsOpen: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.back = this.back.bind(this)
|
||||||
|
this.closeTooltip = this.closeTooltip.bind(this)
|
||||||
|
this.onSubmit = this.onSubmit.bind(this)
|
||||||
|
this.recipientDidChange = this.recipientDidChange.bind(this)
|
||||||
|
this.setCurrentCurrency = this.setCurrentCurrency.bind(this)
|
||||||
|
this.toggleTooltip = this.toggleTooltip.bind(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
SendTransactionScreen.prototype.render = function () {
|
SendTransactionScreen.prototype.render = function () {
|
||||||
@ -74,6 +89,8 @@ SendTransactionScreen.prototype.render = function () {
|
|||||||
conversionRate,
|
conversionRate,
|
||||||
currentCurrency,
|
currentCurrency,
|
||||||
} = props
|
} = props
|
||||||
|
const { blockGasLimit, newTx } = this.state
|
||||||
|
const { gas, gasPrice } = newTx
|
||||||
|
|
||||||
console.log({ selectedIdentity, identities })
|
console.log({ selectedIdentity, identities })
|
||||||
console.log("SendTransactionScreen state:", this.state)
|
console.log("SendTransactionScreen state:", this.state)
|
||||||
@ -174,7 +191,17 @@ SendTransactionScreen.prototype.render = function () {
|
|||||||
|
|
||||||
h('div.send-screen-amount-labels', {}, [
|
h('div.send-screen-amount-labels', {}, [
|
||||||
h('span', {}, ['Amount']),
|
h('span', {}, ['Amount']),
|
||||||
h('span', {}, ['ETH <> USD']), //holding on icon from design
|
h('span', {}, [
|
||||||
|
h('span', {
|
||||||
|
className: currentCurrency === 'ETH' ? 'selected-currency' : 'unselected-currency',
|
||||||
|
onClick: () => this.setCurrentCurrency('ETH')
|
||||||
|
}, ['ETH']),
|
||||||
|
'<>',
|
||||||
|
h('span', {
|
||||||
|
className: currentCurrency === 'USD' ? 'selected-currency' : 'unselected-currency',
|
||||||
|
onClick: () => this.setCurrentCurrency('USD'),
|
||||||
|
}, ['USD']),
|
||||||
|
]), //holding on icon from design
|
||||||
]),
|
]),
|
||||||
|
|
||||||
h('input.large-input.send-screen-input', {
|
h('input.large-input.send-screen-input', {
|
||||||
@ -195,6 +222,21 @@ SendTransactionScreen.prototype.render = function () {
|
|||||||
]),
|
]),
|
||||||
|
|
||||||
h('div.send-screen-input-wrapper', {}, [
|
h('div.send-screen-input-wrapper', {}, [
|
||||||
|
this.state.tooltipIsOpen && h(GasTooltip, {
|
||||||
|
className: 'send-tooltip',
|
||||||
|
gasPrice,
|
||||||
|
gasLimit: gas,
|
||||||
|
onClose: this.closeTooltip,
|
||||||
|
onFeeChange: ({gasLimit, gasPrice}) => {
|
||||||
|
this.setState({
|
||||||
|
newTx: {
|
||||||
|
...this.state.newTx,
|
||||||
|
gas: gasLimit,
|
||||||
|
gasPrice,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
|
||||||
h('div.send-screen-gas-labels', {}, [
|
h('div.send-screen-gas-labels', {}, [
|
||||||
h('span', {}, [
|
h('span', {}, [
|
||||||
@ -212,9 +254,39 @@ SendTransactionScreen.prototype.render = function () {
|
|||||||
h('span', {}, ['What\'s this?']),
|
h('span', {}, ['What\'s this?']),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
h('input.large-input.send-screen-gas-input', {
|
// TODO: handle loading time when switching to USD
|
||||||
placeholder: '0',
|
h('div.large-input.send-screen-gas-input', {}, [
|
||||||
}, []),
|
currentCurrency === 'USD'
|
||||||
|
? h(FiatValue, {
|
||||||
|
value: getTxFeeBn(gas, gasPrice, blockGasLimit),
|
||||||
|
conversionRate,
|
||||||
|
currentCurrency,
|
||||||
|
style: {
|
||||||
|
color: '#5d5d5d',
|
||||||
|
fontSize: '16px',
|
||||||
|
fontFamily: 'DIN OT',
|
||||||
|
lineHeight: '22.4px'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
: h(EthBalance, {
|
||||||
|
value: getTxFeeBn(gas, gasPrice, blockGasLimit),
|
||||||
|
currentCurrency,
|
||||||
|
conversionRate,
|
||||||
|
showFiat: false,
|
||||||
|
hideTooltip: true,
|
||||||
|
styleOveride: {
|
||||||
|
color: '#5d5d5d',
|
||||||
|
fontSize: '16px',
|
||||||
|
fontFamily: 'DIN OT',
|
||||||
|
lineHeight: '22.4px'
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
h('div.send-screen-gas-input-customize', {
|
||||||
|
onClick: this.toggleTooltip,
|
||||||
|
}, [
|
||||||
|
'Customize'
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
|
||||||
]),
|
]),
|
||||||
|
|
||||||
@ -264,7 +336,7 @@ SendTransactionScreen.prototype.render = function () {
|
|||||||
h('section.flex-column.flex-center', [
|
h('section.flex-column.flex-center', [
|
||||||
|
|
||||||
h('button.btn-light', {
|
h('button.btn-light', {
|
||||||
onClick: this.onSubmit.bind(this),
|
onClick: this.onSubmit,
|
||||||
style: {
|
style: {
|
||||||
marginTop: '8px',
|
marginTop: '8px',
|
||||||
width: '8em',
|
width: '8em',
|
||||||
@ -273,7 +345,7 @@ SendTransactionScreen.prototype.render = function () {
|
|||||||
}, 'Next'),
|
}, 'Next'),
|
||||||
|
|
||||||
h('button.btn-light', {
|
h('button.btn-light', {
|
||||||
onClick: this.back.bind(this),
|
onClick: this.back,
|
||||||
style: {
|
style: {
|
||||||
background: '#F7F7F7', // $alabaster
|
background: '#F7F7F7', // $alabaster
|
||||||
border: 'none',
|
border: 'none',
|
||||||
@ -392,7 +464,7 @@ SendTransactionScreen.prototype.renderSendToken = function () {
|
|||||||
h(EnsInput, {
|
h(EnsInput, {
|
||||||
name: 'address',
|
name: 'address',
|
||||||
placeholder: 'Recipient Address',
|
placeholder: 'Recipient Address',
|
||||||
onChange: this.recipientDidChange.bind(this),
|
onChange: this.recipientDidChange,
|
||||||
network,
|
network,
|
||||||
identities,
|
identities,
|
||||||
addressBook,
|
addressBook,
|
||||||
@ -484,7 +556,7 @@ SendTransactionScreen.prototype.renderSendToken = function () {
|
|||||||
h('section.flex-column.flex-center', [
|
h('section.flex-column.flex-center', [
|
||||||
|
|
||||||
h('button.btn-light', {
|
h('button.btn-light', {
|
||||||
onClick: this.onSubmit.bind(this),
|
onClick: this.onSubmit,
|
||||||
style: {
|
style: {
|
||||||
marginTop: '8px',
|
marginTop: '8px',
|
||||||
width: '8em',
|
width: '8em',
|
||||||
@ -493,7 +565,7 @@ SendTransactionScreen.prototype.renderSendToken = function () {
|
|||||||
}, 'Next'),
|
}, 'Next'),
|
||||||
|
|
||||||
h('button.btn-light', {
|
h('button.btn-light', {
|
||||||
onClick: this.back.bind(this),
|
onClick: this.back,
|
||||||
style: {
|
style: {
|
||||||
background: '#F7F7F7', // $alabaster
|
background: '#F7F7F7', // $alabaster
|
||||||
border: 'none',
|
border: 'none',
|
||||||
@ -507,6 +579,18 @@ SendTransactionScreen.prototype.renderSendToken = function () {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SendTransactionScreen.prototype.toggleTooltip = function () {
|
||||||
|
this.setState({ tooltipIsOpen: !this.state.tooltipIsOpen })
|
||||||
|
}
|
||||||
|
|
||||||
|
SendTransactionScreen.prototype.closeTooltip = function () {
|
||||||
|
this.setState({ tooltipIsOpen: false })
|
||||||
|
}
|
||||||
|
|
||||||
|
SendTransactionScreen.prototype.setCurrentCurrency = function (newCurrency) {
|
||||||
|
this.props.dispatch(actions.setCurrentCurrency(newCurrency))
|
||||||
|
}
|
||||||
|
|
||||||
SendTransactionScreen.prototype.navigateToAccounts = function (event) {
|
SendTransactionScreen.prototype.navigateToAccounts = function (event) {
|
||||||
event.stopPropagation()
|
event.stopPropagation()
|
||||||
this.props.dispatch(actions.showAccountsPage())
|
this.props.dispatch(actions.showAccountsPage())
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
const ethUtil = require('ethereumjs-util')
|
const ethUtil = require('ethereumjs-util')
|
||||||
|
const hexToBn = require('../../app/scripts/lib/hex-to-bn')
|
||||||
const vreme = new (require('vreme'))()
|
const vreme = new (require('vreme'))()
|
||||||
|
|
||||||
// formatData :: ( date: <Unix Timestamp> ) -> String
|
// formatData :: ( date: <Unix Timestamp> ) -> String
|
||||||
@ -43,6 +44,8 @@ module.exports = {
|
|||||||
bnTable: bnTable,
|
bnTable: bnTable,
|
||||||
isHex: isHex,
|
isHex: isHex,
|
||||||
formatDate,
|
formatDate,
|
||||||
|
bnMultiplyByFraction,
|
||||||
|
getTxFeeBn,
|
||||||
}
|
}
|
||||||
|
|
||||||
function valuesFor (obj) {
|
function valuesFor (obj) {
|
||||||
@ -222,3 +225,22 @@ function readableDate (ms) {
|
|||||||
function isHex (str) {
|
function isHex (str) {
|
||||||
return Boolean(str.match(/^(0x)?[0-9a-fA-F]+$/))
|
return Boolean(str.match(/^(0x)?[0-9a-fA-F]+$/))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function bnMultiplyByFraction (targetBN, numerator, denominator) {
|
||||||
|
const numBN = new ethUtil.BN(numerator)
|
||||||
|
const denomBN = new ethUtil.BN(denominator)
|
||||||
|
return targetBN.mul(numBN).div(denomBN)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTxFeeBn (gas, gasPrice = MIN_GAS_PRICE_BN.toString(16), blockGasLimit) {
|
||||||
|
// Gas Limit
|
||||||
|
const gasBn = hexToBn(gas)
|
||||||
|
const gasLimit = new ethUtil.BN(parseInt(blockGasLimit))
|
||||||
|
const safeGasLimit = bnMultiplyByFraction(gasLimit, 19, 20).toString(10)
|
||||||
|
|
||||||
|
// Gas Price
|
||||||
|
const gasPriceBn = hexToBn(gasPrice)
|
||||||
|
const txFeeBn = gasBn.mul(gasPriceBn)
|
||||||
|
|
||||||
|
return txFeeBn.toString(16);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user