From 3528d34774dcc4fecc8fd8e7b5c2a695bfd575df Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 5 Oct 2018 16:09:32 -0300 Subject: [PATCH 01/17] Use polling instead of event logs to check if transaction was processed --- src/components/Bridge.js | 6 ++++-- src/stores/ForeignStore.js | 12 ++++++++++++ src/stores/HomeStore.js | 17 +++++++++++++++++ src/stores/TxStore.js | 17 ++++++++++++----- src/stores/utils/sleep.js | 3 +++ 5 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 src/stores/utils/sleep.js diff --git a/src/components/Bridge.js b/src/components/Bridge.js index 1edb6a96..6a0d9aa6 100644 --- a/src/components/Bridge.js +++ b/src/components/Bridge.js @@ -94,11 +94,13 @@ export class Bridge extends React.Component { tokenAddress: homeStore.tokenAddress }) } else { + const value = Web3Utils.toHex(Web3Utils.toWei(amount)) return txStore.doSend({ to: homeStore.HOME_BRIDGE_ADDRESS, from: web3Store.defaultAccount.address, - value: Web3Utils.toHex(Web3Utils.toWei(amount)), - data: '0x' + value, + data: '0x', + sentValue: value }) } } catch (e) { diff --git a/src/stores/ForeignStore.js b/src/stores/ForeignStore.js index 9f8a0abd..a9b62bb4 100644 --- a/src/stores/ForeignStore.js +++ b/src/stores/ForeignStore.js @@ -15,6 +15,7 @@ import { getErc20TokenAddress } from './utils/contract' import { balanceLoaded, removePendingTransaction } from './utils/testUtils' +import sleep from './utils/sleep' class ForeignStore { @observable state = null; @@ -220,6 +221,17 @@ class ForeignStore { return this.dailyLimit ? this.totalSpentPerDay / this.dailyLimit * 100 : 0 } + async waitUntilProcessed(txHash) { + const bridge = this.foreignBridge + + const processed = await bridge.methods.relayedMessages(txHash).call() + + if (processed) { + return Promise.resolve() + } else { + return sleep(5000).then(() => this.waitUntilProcessed(txHash)) + } + } } export default ForeignStore; diff --git a/src/stores/HomeStore.js b/src/stores/HomeStore.js index 1472df09..9415a3b7 100644 --- a/src/stores/HomeStore.js +++ b/src/stores/HomeStore.js @@ -16,6 +16,7 @@ import { getBalanceOf } from './utils/contract' import { balanceLoaded, removePendingTransaction } from './utils/testUtils' +import sleep from './utils/sleep' import Web3Utils from 'web3-utils' import BN from 'bignumber.js' @@ -320,6 +321,22 @@ class HomeStore { getDisplayedBalance() { return this.rootStore.isErcToErcMode ? this.userBalance : this.web3Store.defaultAccount.homeBalance } + + async waitUntilProcessed(txHash, value) { + const web3 = this.rootStore.foreignStore.foreignWeb3 + const bridge = this.homeBridge + + const tx = await web3.eth.getTransaction(txHash) + const messageHash = web3.utils.soliditySha3(tx.from, web3.utils.toBN(value).toString(), txHash) + const numSigned = await bridge.methods.numAffirmationsSigned(messageHash).call() + const processed = await bridge.methods.isAlreadyProcessed(numSigned).call() + + if (processed) { + return Promise.resolve() + } else { + return sleep(5000).then(() => this.waitUntilProcessed(txHash, value)) + } + } } export default HomeStore; diff --git a/src/stores/TxStore.js b/src/stores/TxStore.js index db72b919..5dfbe803 100644 --- a/src/stores/TxStore.js +++ b/src/stores/TxStore.js @@ -4,6 +4,7 @@ import { addPendingTransaction } from './utils/testUtils' class TxStore { @observable txs = [] + @observable txsValues = {} txHashToIndex = {} constructor(rootStore) { this.web3Store = rootStore.web3Store @@ -14,7 +15,7 @@ class TxStore { } @action - async doSend({to, from, value, data}){ + async doSend({to, from, value, data, sentValue}){ const index = this.txs.length; return this.web3Store.getWeb3Promise.then(async ()=> { if(!this.web3Store.defaultAccount){ @@ -34,6 +35,7 @@ class TxStore { }).on('transactionHash', (hash) => { console.log('txHash', hash) this.txHashToIndex[hash] = index; + this.txsValues[hash] = sentValue this.txs[index] = {status: 'pending', name: `Sending ${to} ${value}`, hash} this.alertStore.setLoadingStepIndex(1) addPendingTransaction() @@ -58,7 +60,7 @@ class TxStore { const data = await contract.methods.transferAndCall( to, value, '0x00' ).encodeABI() - return this.doSend({to: tokenAddress, from, value: '0x00', data}) + return this.doSend({to: tokenAddress, from, value: '0x00', data, sentValue: value}) } else { this.alertStore.pushError('Please unlock metamask'); } @@ -76,7 +78,7 @@ class TxStore { const data = await this.foreignStore.tokenContract.methods.transfer( to, value ).encodeABI({ from: this.web3Store.defaultAccount.address }) - return this.doSend({to: this.foreignStore.tokenAddress, from, value: '0x', data}) + return this.doSend({to: this.foreignStore.tokenAddress, from, value: '0x', data, sentValue: value}) } else { this.alertStore.pushError('Please unlock metamask'); } @@ -112,7 +114,9 @@ class TxStore { if(blockConfirmations >= 8) { this.alertStore.setBlockConfirmations(8) this.alertStore.setLoadingStepIndex(2) - this.foreignStore.addWaitingForConfirmation(hash) + this.foreignStore.waitUntilProcessed(hash).then(() => { + this.alertStore.setLoadingStepIndex(3) + }) } else { if(blockConfirmations > 0) { this.alertStore.setBlockConfirmations(blockConfirmations) @@ -125,7 +129,10 @@ class TxStore { if(blockConfirmations >= 8) { this.alertStore.setBlockConfirmations(8) this.alertStore.setLoadingStepIndex(2) - this.homeStore.addWaitingForConfirmation(hash) + this.homeStore.waitUntilProcessed(hash, this.txsValues[hash]) + .then(() => { + this.alertStore.setLoadingStepIndex(3) + }) } else { if(blockConfirmations > 0) { this.alertStore.setBlockConfirmations(blockConfirmations) diff --git a/src/stores/utils/sleep.js b/src/stores/utils/sleep.js new file mode 100644 index 00000000..9ee92f7d --- /dev/null +++ b/src/stores/utils/sleep.js @@ -0,0 +1,3 @@ +const sleep = timeout => new Promise(resolve => setTimeout(resolve, timeout)) + +export default sleep From e74b4d2dc733e1c490a84c944045d1e445d4edb7 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 5 Oct 2018 16:18:08 -0300 Subject: [PATCH 02/17] Support RSK success status response --- src/stores/TxStore.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stores/TxStore.js b/src/stores/TxStore.js index 5dfbe803..03479fa8 100644 --- a/src/stores/TxStore.js +++ b/src/stores/TxStore.js @@ -104,9 +104,10 @@ class TxStore { async getTxStatus(hash) { const web3 = this.web3Store.injectedWeb3; + const { toBN } = web3.utils web3.eth.getTransactionReceipt(hash, (error, res) => { if(res && res.blockNumber){ - if(res.status === '0x1'){ + if(toBN(res.status).eq(toBN(1))) { const index = this.txHashToIndex[hash] this.txs[index].status = `mined` if(this.web3Store.metamaskNet.id === this.web3Store.homeNet.id.toString()) { From bc808005b5ca9320fcec8ec3fe83c3578e0dc2d7 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 5 Oct 2018 17:41:35 -0300 Subject: [PATCH 03/17] Ignore errors when fetching events --- src/stores/ForeignStore.js | 5 ++++- src/stores/HomeStore.js | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/stores/ForeignStore.js b/src/stores/ForeignStore.js index a9b62bb4..78bd3b6e 100644 --- a/src/stores/ForeignStore.js +++ b/src/stores/ForeignStore.js @@ -125,7 +125,10 @@ class ForeignStore { try { fromBlock = fromBlock || this.filteredBlockNumber || this.latestBlockNumber - 50 toBlock = toBlock || this.filteredBlockNumber || "latest" - let foreignEvents = await getPastEvents(this.foreignBridge, fromBlock, toBlock) + let foreignEvents = await getPastEvents(this.foreignBridge, fromBlock, toBlock).catch(e => { + console.error('Couldn\'t get events', e) + return [] + }) if(!this.filter){ this.events = foreignEvents; diff --git a/src/stores/HomeStore.js b/src/stores/HomeStore.js index 9415a3b7..fca20a39 100644 --- a/src/stores/HomeStore.js +++ b/src/stores/HomeStore.js @@ -156,7 +156,10 @@ class HomeStore { try { fromBlock = fromBlock || this.filteredBlockNumber || this.latestBlockNumber - 50 toBlock = toBlock || this.filteredBlockNumber || "latest" - let events = await getPastEvents(this.homeBridge, fromBlock, toBlock) + let events = await getPastEvents(this.homeBridge, fromBlock, toBlock).catch(e => { + console.error('Couldn\'t get events', e) + return [] + }) let homeEvents = [] await asyncForEach(events, (async (event) => { From 7f6c628333f1792af5f9247a4cd1eaa7ddfe8ade Mon Sep 17 00:00:00 2001 From: Gerardo Nardelli Date: Thu, 8 Nov 2018 10:31:53 -0300 Subject: [PATCH 04/17] Fix badges on README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f04f742a..4987767b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # POA Bridge - User Interface (UI) Application -[![Build Status](https://travis-ci.org/patitonar/bridge-ui.svg?branch=master)](https://travis-ci.org/patitonar/bridge-ui) +[![Build Status](https://travis-ci.org/poanetwork/bridge-ui.svg?branch=master)](https://travis-ci.org/poanetwork/bridge-ui) [![Gitter](https://badges.gitter.im/poanetwork/poa-bridge.svg)](https://gitter.im/poanetwork/poa-bridge?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Coverage Status](https://coveralls.io/repos/github/patitonar/bridge-ui/badge.svg?branch=master)](https://coveralls.io/github/patitonar/bridge-ui?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/poanetwork/bridge-ui/badge.svg?branch=master)](https://coveralls.io/github/poanetwork/bridge-ui?branch=master) [![dependencies Status](https://david-dm.org/poanetwork/bridge-ui/status.svg)](https://david-dm.org/poanetwork/bridge-ui) Welcome to the POA Bridge! Following is an overview of the POA Bridge and Bridge UI Application, as well as [basic instructions for getting started](#getting-started). From 65e2daa26f853bd345805de8909040e8a5c5b390 Mon Sep 17 00:00:00 2001 From: Gerardo Nardelli Date: Mon, 12 Nov 2018 14:15:35 -0300 Subject: [PATCH 05/17] Fix transfer success alert --- src/stores/TxStore.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/stores/TxStore.js b/src/stores/TxStore.js index 3908eba6..7719b015 100644 --- a/src/stores/TxStore.js +++ b/src/stores/TxStore.js @@ -1,6 +1,7 @@ import { action, observable } from "mobx"; import { estimateGas } from './utils/web3' -import { addPendingTransaction } from './utils/testUtils' +import { addPendingTransaction, removePendingTransaction } from './utils/testUtils' +import { getUnit } from './utils/bridgeMode' class TxStore { @observable txsValues = {} @@ -11,6 +12,7 @@ class TxStore { this.alertStore = rootStore.alertStore this.foreignStore = rootStore.foreignStore this.homeStore = rootStore.homeStore + this.rootStore = rootStore } @action @@ -111,6 +113,15 @@ class TxStore { this.alertStore.setLoadingStepIndex(2) this.foreignStore.waitUntilProcessed(hash).then(() => { this.alertStore.setLoadingStepIndex(3) + const unitReceived = getUnit(this.rootStore.bridgeMode).unitForeign + setTimeout(() => { + this.alertStore.pushSuccess( + `${unitReceived} received on ${this.homeStore.networkName}`, + this.alertStore.FOREIGN_TRANSFER_SUCCESS + ) + } + , 2000) + removePendingTransaction() }) } else { if(blockConfirmations > 0) { @@ -127,6 +138,15 @@ class TxStore { this.homeStore.waitUntilProcessed(hash, this.txsValues[hash]) .then(() => { this.alertStore.setLoadingStepIndex(3) + const unitReceived = getUnit(this.rootStore.bridgeMode).unitHome + setTimeout(() => { + this.alertStore.pushSuccess( + `${unitReceived} received on ${this.foreignStore.networkName}`, + this.alertStore.HOME_TRANSFER_SUCCESS + ) + } + , 2000) + removePendingTransaction() }) } else { if(blockConfirmations > 0) { From 7e7ec65eb66aff0eb6e8c2eea03056797719d4d4 Mon Sep 17 00:00:00 2001 From: Alexander Kolotov Date: Sun, 2 Dec 2018 19:03:16 +0300 Subject: [PATCH 06/17] added RSK networks tags --- src/stores/utils/web3.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/stores/utils/web3.js b/src/stores/utils/web3.js index 29027860..f9624e2b 100644 --- a/src/stores/utils/web3.js +++ b/src/stores/utils/web3.js @@ -40,6 +40,8 @@ const networks = { 1: 'ETH Mainnet', 3: 'Ropsten', 4: 'Rinkeby', + 30: 'RSK Mainnet', + 31: 'RSK Testnet', 42:'Kovan', 77:'Sokol', 99: 'POA Network', From de0aee62b8a6a3cb27226fcf81384d1cc7f531a5 Mon Sep 17 00:00:00 2001 From: Alexander Kolotov Date: Sun, 2 Dec 2018 19:10:07 +0300 Subject: [PATCH 07/17] unification of chain data retrieval interval --- src/stores/HomeStore.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/stores/HomeStore.js b/src/stores/HomeStore.js index dbe70ad6..d021000b 100644 --- a/src/stores/HomeStore.js +++ b/src/stores/HomeStore.js @@ -101,10 +101,8 @@ class HomeStore { this.getEvents() this.getBalance() this.getBlockNumber() - }, 5000) - setInterval(() => { this.getCurrentLimit() - }, 10000) + }, 15000) } @action From ff9cd4f81b36140c78bfce36c488afc4b3bf86d2 Mon Sep 17 00:00:00 2001 From: Alexander Kolotov Date: Tue, 4 Dec 2018 00:30:39 +0300 Subject: [PATCH 08/17] meta tag of the page changed --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index b869da66..833399e3 100644 --- a/public/index.html +++ b/public/index.html @@ -6,7 +6,7 @@ - + From f8cc959b73a495f172e12b612861897f6166d665 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Fri, 7 Dec 2018 16:26:53 -0300 Subject: [PATCH 09/17] Extract meta description as an .env variable --- .env.example | 6 ++++++ public/index.html | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index ba988a59..c193ffaf 100644 --- a/.env.example +++ b/.env.example @@ -21,3 +21,9 @@ REACT_APP_FOREIGN_GAS_PRICE_ORACLE_URL=https://gasprice.poa.network/ REACT_APP_FOREIGN_GAS_PRICE_SPEED_TYPE=standard REACT_APP_FOREIGN_GAS_PRICE_FALLBACK=5000000000 REACT_APP_FOREIGN_GAS_PRICE_UPDATE_INTERVAL=15000 + +# Default +REACT_APP_DESCRIPTION="The POA cross-chain bridge serves as a method of transferring POA native tokens from the POA Network to the Ethereum network in a quick and cost-efficient manner." + +# RSK +#REACT_APP_DESCRIPTION="The TokenBridge serves as a method of transferring Bancor Network tokens between the Ethereum network to Rootstock network in a quick and cost-efficient manner." diff --git a/public/index.html b/public/index.html index 833399e3..39b5b047 100644 --- a/public/index.html +++ b/public/index.html @@ -6,7 +6,7 @@ - + From 5601f4cb41039780cef093191b2995eb7409d2e1 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Fri, 7 Dec 2018 17:10:31 -0300 Subject: [PATCH 10/17] Add support for _WITHOUT_EVENTS --- .env.example | 4 +++ src/components/Header.js | 24 ++++++++----- src/components/StatisticsPage.js | 12 ++++--- src/stores/TxStore.js | 60 +++++++++++++++++++------------- 4 files changed, 62 insertions(+), 38 deletions(-) diff --git a/.env.example b/.env.example index c193ffaf..bda8b7bd 100644 --- a/.env.example +++ b/.env.example @@ -7,6 +7,10 @@ REACT_APP_HOME_NATIVE_NAME=POA REACT_APP_HOME_NETWORK_NAME="POA Sokol" REACT_APP_FOREIGN_NETWORK_NAME=Kovan +# Uncomment the constant for the network that don't support events +#REACT_APP_HOME_WITHOUT_EVENTS=1 +#REACT_APP_FOREIGN_WITHOUT_EVENTS=1 + REACT_APP_HOME_EXPLORER_TX_TEMPLATE=https://blockscout.com/poa/sokol/tx/%s REACT_APP_FOREIGN_EXPLORER_TX_TEMPLATE=https://blockscout.com/eth/kovan/tx/%s REACT_APP_HOME_EXPLORER_ADDRESS_TEMPLATE=https://blockscout.com/poa/sokol/address/%s diff --git a/src/components/Header.js b/src/components/Header.js index e2b2d613..e7dda255 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -7,11 +7,13 @@ import { Wallet } from './Wallet' import { DailyQuotaModal } from './DailyQuotaModal' import { inject, observer } from 'mobx-react/index' -const getMobileMenuLinks = (onMenuToggle) => +const getMobileMenuLinks = (onMenuToggle, withoutEvents) => (
- - Events - + {withoutEvents ? null : + + Events + + } Status @@ -25,17 +27,21 @@ const getMobileMenuLinks = (onMenuToggle) => @observer export class Header extends React.Component { render () { - const {showMobileMenu, onMenuToggle, RootStore: {alertStore}} = this.props + const { showMobileMenu, onMenuToggle, RootStore: { alertStore, web3Store } } = this.props + const { REACT_APP_HOME_WITHOUT_EVENTS: HOME, REACT_APP_FOREIGN_WITHOUT_EVENTS: FOREIGN } = process.env + const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? HOME : FOREIGN return (
- {showMobileMenu && (
{getMobileMenuLinks(onMenuToggle)}
)} + {showMobileMenu && (
{getMobileMenuLinks(onMenuToggle, withoutEvents)}
)}
- - Events - + {withoutEvents ? null : + + Events + + } Status diff --git a/src/components/StatisticsPage.js b/src/components/StatisticsPage.js index c9075c51..08e47f3e 100644 --- a/src/components/StatisticsPage.js +++ b/src/components/StatisticsPage.js @@ -10,16 +10,19 @@ import { BRIDGE_MODES } from '../stores/utils/bridgeMode' export class StatisticsPage extends React.Component { render(){ - const { homeStore, foreignStore, bridgeMode } = this.props.RootStore + const { homeStore, foreignStore, bridgeMode, web3Store } = this.props.RootStore const isNativeToErc = bridgeMode === BRIDGE_MODES.NATIVE_TO_ERC const leftTitle = isNativeToErc ? 'Deposits' : 'Withdraws' const rightTitle = isNativeToErc ? 'Withdraws' : 'Deposits' + const { REACT_APP_HOME_WITHOUT_EVENTS: HOME, REACT_APP_FOREIGN_WITHOUT_EVENTS: FOREIGN } = process.env + const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? HOME : FOREIGN return(
-
- Bridge Statistics + {withoutEvents ? null : +
+ Bridge Statistics -
+
+ }
Tokens {leftTitle} diff --git a/src/stores/TxStore.js b/src/stores/TxStore.js index 7719b015..c8a3523d 100644 --- a/src/stores/TxStore.js +++ b/src/stores/TxStore.js @@ -111,18 +111,23 @@ class TxStore { if(blockConfirmations >= 8) { this.alertStore.setBlockConfirmations(8) this.alertStore.setLoadingStepIndex(2) - this.foreignStore.waitUntilProcessed(hash).then(() => { - this.alertStore.setLoadingStepIndex(3) - const unitReceived = getUnit(this.rootStore.bridgeMode).unitForeign - setTimeout(() => { - this.alertStore.pushSuccess( - `${unitReceived} received on ${this.homeStore.networkName}`, - this.alertStore.FOREIGN_TRANSFER_SUCCESS - ) - } - , 2000) - removePendingTransaction() - }) + + if (process.env.REACT_APP_FOREIGN_WITHOUT_EVENTS) { + this.foreignStore.addWaitingForConfirmation(hash) + } else { + this.foreignStore.waitUntilProcessed(hash).then(() => { + this.alertStore.setLoadingStepIndex(3) + const unitReceived = getUnit(this.rootStore.bridgeMode).unitForeign + setTimeout(() => { + this.alertStore.pushSuccess( + `${unitReceived} received on ${this.homeStore.networkName}`, + this.alertStore.FOREIGN_TRANSFER_SUCCESS + ) + } + , 2000) + removePendingTransaction() + }) + } } else { if(blockConfirmations > 0) { this.alertStore.setBlockConfirmations(blockConfirmations) @@ -135,19 +140,24 @@ class TxStore { if(blockConfirmations >= 8) { this.alertStore.setBlockConfirmations(8) this.alertStore.setLoadingStepIndex(2) - this.homeStore.waitUntilProcessed(hash, this.txsValues[hash]) - .then(() => { - this.alertStore.setLoadingStepIndex(3) - const unitReceived = getUnit(this.rootStore.bridgeMode).unitHome - setTimeout(() => { - this.alertStore.pushSuccess( - `${unitReceived} received on ${this.foreignStore.networkName}`, - this.alertStore.HOME_TRANSFER_SUCCESS - ) - } - , 2000) - removePendingTransaction() - }) + + if (process.env.REACT_APP_FOREIGN_WITHOUT_EVENTS) { + this.homeStore.addWaitingForConfirmation(hash) + } else { + this.homeStore.waitUntilProcessed(hash, this.txsValues[hash]) + .then(() => { + this.alertStore.setLoadingStepIndex(3) + const unitReceived = getUnit(this.rootStore.bridgeMode).unitHome + setTimeout(() => { + this.alertStore.pushSuccess( + `${unitReceived} received on ${this.foreignStore.networkName}`, + this.alertStore.HOME_TRANSFER_SUCCESS + ) + } + , 2000) + removePendingTransaction() + }) + } } else { if(blockConfirmations > 0) { this.alertStore.setBlockConfirmations(blockConfirmations) From f76645b7e902d9ed4aaf4000ff79aa0ca99c482d Mon Sep 17 00:00:00 2001 From: fernandomg Date: Fri, 7 Dec 2018 17:17:46 -0300 Subject: [PATCH 11/17] Fix menu styles --- src/assets/stylesheets/application.css | 2 +- src/assets/stylesheets/application/header.scss | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/assets/stylesheets/application.css b/src/assets/stylesheets/application.css index 1effe266..d2235fc2 100644 --- a/src/assets/stylesheets/application.css +++ b/src/assets/stylesheets/application.css @@ -1 +1 @@ -.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-controls{display:flex;justify-content:space-between}.footer{left:0;right:0}.container{position:relative;width:960px;margin-left:auto;margin-right:auto}@media (max-width: 980px){.container{width:98%}}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local("Open Sans"),local("OpenSans"),url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3ZBw1xU1rKptJj_0jans920.woff2) format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local("Open Sans Bold"),local("OpenSans-Bold"),url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2) format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215}html,body{color:#333;font-size:14px;font-family:'Open Sans', sans-serif;-webkit-font-smoothing:antialiased}html,body,p,h1,h2,h3{margin:0;padding:0;font-weight:normal}html{display:flex;min-height:100%}body{position:relative;width:100%;box-sizing:border-box;padding-bottom:66px;background-color:#ffffff;font-family:'Nunito', sans-serif}@media screen and (max-width: 768px){body{padding-bottom:98px}}a{color:#08b3f2;text-decoration:none}a:hover{text-decoration:underline}button{margin-left:5px;color:#08b3f2;cursor:pointer}button:hover{text-decoration:underline}input,button{margin:0;padding:0;outline:none;border:0;font-family:'Open Sans', sans-serif;font-size:14px}strong{font-weight:bold}.hidden{overflow:hidden}.label{margin-top:15px;margin-bottom:7px;font-weight:bold}.description{color:#8197a2;line-height:24px}.break-all{word-break:break-all}.separator{width:1px;height:51px;background-color:#e4e4e4}@media screen and (max-width: 768px){.separator{display:none}}.datablock-container{height:60px;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center}@media screen and (max-width: 768px){.datablock-container{align-items:normal}}.datablock-container .datablock-value{font-size:30px;font-weight:bold;color:#5c34a2}.datablock-container .datablock-type{font-size:18px;color:#5c34a2;margin-left:10px}.datablock-container .datablock-description{font-size:14px;color:#333333}.app-container{position:relative;width:100%;margin-left:auto;margin-right:auto}@media screen and (max-width: 414px){.mobile-menu-open{position:absolute;z-index:1000000;height:100%;width:100%;background-color:rgba(78,44,137,0.9)}}.only-mobile{display:none}@media screen and (max-width: 768px){.only-mobile{display:inherit}}.bridge-container{position:relative;width:100%;margin-left:auto;margin-right:auto;height:80vh;display:flex;align-items:center}@media screen and (max-width: 768px){.bridge-container{height:512px}}.bridge{width:100%;display:flex;flex-direction:column;overflow:hidden}.bridge .bridge-home{width:960px;height:80px;display:flex;background-image:linear-gradient(to right, #5c34a2, #7b5ab2);align-self:center}@media screen and (max-width: 768px){.bridge .bridge-home{display:none}}.bridge .bridge-home .bridge-home-container{width:9%;min-width:60px;background-color:#ffffff}.bridge .bridge-home .bridge-home-container .home-logo-container{height:100%;border-radius:10px;border-bottom-right-radius:0;background-color:#5c34a2;display:flex;justify-content:center;align-items:center}.bridge .bridge-home .bridge-home-container .home-logo-container .home-logo{width:52px;height:16px}.bridge .bridge-home .bridge-home-container .home-logo-container .foreign-logo{width:54px;height:11px}.bridge .bridge-home .home-address-container{width:92%;border-bottom-left-radius:10px;background-color:#ffffff;display:flex;align-items:center}.bridge .bridge-home .home-address-container .icon-wallet{padding:20px}.bridge .bridge-foreign{width:960px;height:80px;display:flex;background-image:linear-gradient(to right, #5c34a2, #7b5ab2);align-self:center}@media screen and (max-width: 768px){.bridge .bridge-foreign{display:none}}.bridge .bridge-foreign .bridge-foreign-container{width:9%;min-width:60px;background-color:#ffffff}.bridge .bridge-foreign .bridge-foreign-container .foreign-logo-container{height:100%;border-radius:10px;border-top-left-radius:0;background-color:#7b5ab2;display:flex;justify-content:center;align-items:center}.bridge .bridge-foreign .bridge-foreign-container .foreign-logo-container .foreign-logo{width:54px;height:11px}.bridge .bridge-foreign .bridge-foreign-container .foreign-logo-container .home-logo{width:52px;height:16px}.bridge .bridge-foreign .foreign-address-container{width:92%;border-top-right-radius:10px;background-color:#ffffff;display:flex;justify-content:flex-end;align-items:center;text-align:right}.bridge .bridge-foreign .foreign-address-container .icon-wallet{padding:20px}.bridge .address-label{font-size:12px;color:#5c34a2}.bridge .address-description{font-size:16px;font-weight:bold;color:#5c34a2}@media screen and (max-width: 768px){.bridge .address-description{font-size:9px}}.bridge .bridge-transfer{height:276px;display:flex;justify-content:center}@media screen and (max-width: 768px){.bridge .bridge-transfer{height:389px}}.bridge .bridge-transfer .left-image-wrapper{background-color:#5c34a2}.bridge .bridge-transfer .left-image-wrapper .left-image{max-width:238px;height:271px;padding-top:5px;padding-right:5px;background-color:#ffffff;border-top-right-radius:10px}@media screen and (max-width: 768px){.bridge .bridge-transfer .left-image-wrapper .left-image{display:none}}.bridge .bridge-transfer .right-image-wrapper{background-color:#7b5ab2}.bridge .bridge-transfer .right-image-wrapper .right-image{max-width:238px;height:271px;padding-bottom:5px;padding-left:5px;background-color:#ffffff;border-bottom-left-radius:10px}@media screen and (max-width: 768px){.bridge .bridge-transfer .right-image-wrapper .right-image{display:none}}.bridge .bridge-transfer .bridge-transfer-content{width:880px;background-image:linear-gradient(to right, #5c34a2, #7b5ab2);border-top-right-radius:10px;border-bottom-left-radius:10px;flex-shrink:0;display:flex;flex-wrap:wrap}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content{max-width:92%;flex-direction:column;border-radius:8px}}.bridge .bridge-transfer .bridge-transfer-content .bridge-transfer-content-background{width:880px;flex-shrink:0;display:flex;flex-wrap:wrap}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .bridge-transfer-content-background{width:auto;flex-direction:column;background-image:url("../images/arrows-down@2x.png");background-position:center;background-repeat:no-repeat;background-size:164px 203px}}.bridge .bridge-transfer .bridge-transfer-content .network-container-home{width:22%;height:136px;display:flex;justify-content:space-evenly;flex-direction:column;padding:70px 1% 70px 5%;align-items:flex-start}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .network-container-home{width:auto;align-self:center;height:136px;padding:5px 0 5px 0;align-items:center}}.bridge .bridge-transfer .bridge-transfer-content .network-container-foreign{width:22%;height:136px;display:flex;justify-content:space-evenly;flex-direction:column;padding:70px 5% 70px 1%;align-items:flex-end}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .network-container-foreign{width:auto;align-self:center;height:136px;padding:5px 0 5px 0;align-items:center}}.bridge .bridge-transfer .bridge-transfer-content .bridge-network-data{display:flex;align-items:center;cursor:pointer}.bridge .bridge-transfer .bridge-transfer-content .network-basic-label{font-size:13px;color:#ffffff}.bridge .bridge-transfer .bridge-transfer-content .network-name{padding-left:5px;font-size:24px;color:#ffffff}.bridge .bridge-transfer .bridge-transfer-content .network-title{font-size:24px;font-weight:bold;color:#ffffff}.bridge .bridge-transfer .bridge-transfer-content .network-id{font-size:14px;color:#ffffff;font-weight:bold;line-height:26px}.bridge .bridge-transfer .bridge-transfer-content .network-id-container{width:32px;height:26px;border-radius:3px;background-color:#60db97;text-align:center;margin-left:10px}.bridge .bridge-transfer .bridge-transfer-content .network-balance{font-size:13px;font-weight:bold;color:#60db97}.bridge .bridge-transfer .bridge-transfer-content .network-show-more{font-size:14px;font-weight:bold;color:#60db97}.bridge .bridge-transfer .bridge-transfer-content .info-icon-left{margin-right:10px}.bridge .bridge-transfer .bridge-transfer-content .info-icon-right{margin-left:10px}.bridge .bridge-transfer .bridge-transfer-content .transfer-right{background-image:url("../images/arrows-1.svg");background-position:center;background-repeat:no-repeat}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .transfer-right{background-image:none}}.bridge .bridge-transfer .bridge-transfer-content .transfer-left{background-image:url("../images/arrows-2.svg");background-position:center;background-repeat:no-repeat}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .transfer-left{background-image:none}}.bridge .bridge-transfer .bridge-transfer-content .form-container{width:44%;max-width:384px;height:276px}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container{width:100%;height:97px;align-self:center}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form{height:276px;display:flex;flex-direction:column;justify-content:space-evenly}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form{width:100%;height:auto}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-controls{padding:8px 8px 8px 0;border-radius:5px;background-color:rgba(251,251,252,0.2)}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-controls{flex-direction:column;padding:8px 8px 8px 8px;background-color:unset}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form .bridge-form-input-container{display:flex;justify-content:space-between;width:292px}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form .bridge-form-input-container{background-color:rgba(251,251,252,0.2);border-radius:3px 3px 0 0;width:100%}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input{width:165px;height:48px;padding-left:16px;background-color:transparent;color:#ffffff;font-size:24px;font-weight:bold}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input::placeholder{font-size:24px;font-weight:bold;color:rgba(255,255,255,0.7)}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input::placeholder{font-size:18px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input::placeholder{opacity:0.3}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input{font-size:18px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-label{margin:0 10px;color:#ffffff;font-weight:bold;text-transform:uppercase;font-size:24px;line-height:48px}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-label{font-size:18px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-button{flex-shrink:0;text-decoration:none;display:block;width:92px;height:48px;border-radius:3px;background-color:#60db97;color:#ffffff;font-weight:bold}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-button{width:100%;border-radius:0 0 3px 3px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-button:hover{opacity:0.8}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form .bridge-transfer-direction{font-size:14px;color:#ffffff}.bridge .bridge-statistics-container{align-self:center;margin-top:60px}@media screen and (max-height: 720px){.bridge .bridge-statistics-container{margin-top:30px}}.bridge .network-details{display:flex;flex-direction:column;min-width:558px}@media screen and (max-width: 768px){.bridge .network-details{min-width:100%}}.bridge .network-details .details-logo-container{width:85px;height:80px;border-radius:10px;border-bottom-right-radius:0;background-color:#ffffff;display:flex;justify-content:center;align-items:center}@media screen and (max-width: 768px){.bridge .network-details .details-logo-container{display:none}}.bridge .network-details .details-logo-container .home-logo{width:52px;height:16px}.bridge .network-details .details-logo-container .foreign-logo{width:54px;height:11px}.bridge .network-details .details-logo-container:after{content:"";position:absolute;height:10px;width:20px;bottom:0}@media screen and (max-width: 768px){.bridge .network-details .details-logo-container:after{display:none}}.bridge .network-details .details-logo-container:after{right:453px;top:70px;border-radius:0 0 0 10px;box-shadow:-10px 0 0 0 #fff}@media screen and (max-width: 768px){.bridge .network-details .details-logo-container:after{display:none}}.bridge .network-details .details-body{width:440px;height:254px;background-color:#ffffff;align-self:flex-end;border-radius:0 10px 10px 10px;padding:38px;display:flex;flex-direction:column;justify-content:space-between}@media screen and (max-width: 768px){.bridge .network-details .details-body{width:85%;height:430px;padding:20px 15px 20px 15px;align-self:center;border-radius:10px 10px 10px 10px}}@media screen and (max-width: 768px) and (min-width: 415px){.bridge .network-details .details-body{height:300px}}@media screen and (max-width: 768px) and (min-width: 415px) and (max-width: 600px){.bridge .network-details .details-body{height:250px}}.bridge .network-details .details-body .details-data-container{display:flex;justify-content:space-between}@media screen and (max-width: 768px){.bridge .network-details .details-body .details-data-container{flex-direction:column}}.bridge .network-details .details-body .details-data-container .details-label{font-size:14px;color:#777777}.bridge .network-details .details-body .details-data-container .details-description{font-size:14px;color:#5c34a2}.bridge .network-details .details-body .details-data-container .details-description-black{font-size:14px;color:#333333}.bridge .network-details .details-body .details-data-container .info-icon-right{margin-left:10px}.bridge .network-details .details-body .details-data-container .details-copy{cursor:pointer}.bridge .network-details .details-body:before{content:"";position:absolute;height:10px;width:20px;bottom:0}@media screen and (max-width: 768px){.bridge .network-details .details-body:before{display:none}}.bridge .network-details .details-body:before{left:22px;top:80px;border-radius:0 10px 0 0;box-shadow:10px 0 0 0 #fff}@media screen and (max-width: 768px){.bridge .network-details .details-body:before{display:none}}.bridge .transfer-alert{display:flex;width:600px;height:265px;border-radius:8px;background-color:#ffffff}@media screen and (max-width: 768px){.bridge .transfer-alert{flex-direction:column;width:100%;height:auto}}.bridge .transfer-alert .image-container{width:166px}@media screen and (max-width: 768px){.bridge .transfer-alert .image-container{width:100%}}.bridge .transfer-alert .image-container .arrows-icon{width:124px;height:128px;margin-top:39px;margin-left:42px}.bridge .transfer-alert .alert-container{display:flex;flex-direction:column;justify-content:space-around;width:374px;padding-top:40px;padding-bottom:40px;padding-right:60px}@media screen and (max-width: 768px){.bridge .transfer-alert .alert-container{width:100%;padding-left:5px;padding-top:0}}.bridge .transfer-alert .alert-container .alert-corner{width:10px;height:12px}.bridge .transfer-alert .alert-container .transfer-title{display:flex;justify-content:space-around;align-items:center;color:#5c34a2;font-size:14px}.bridge .transfer-alert .alert-container .transfer-title .alert-logo-box{width:50px;height:50px;border-radius:4px;background-color:#5c34a2;display:flex;align-items:center;justify-content:center}.bridge .transfer-alert .alert-container .transfer-title .icon_arrow_right{width:14px;height:10px;border-radius:1px}.bridge .transfer-alert .alert-container .transfer-description{line-height:1.71;font-size:14px;color:#5c34a2;padding-top:10px;padding-bottom:10px}.bridge .transfer-alert .alert-container .transfer-buttons .transfer-confirm{width:91px;height:40px;color:#ffffff;font-size:15px;font-weight:bold;border-radius:3px;background-color:#60db97;text-decoration:none}.bridge .transfer-alert .alert-container .transfer-buttons .transfer-cancel{width:76px;height:40px;border-radius:3px;color:#5c34a2;font-size:15px;font-weight:bold;background-color:#ffffff;border:solid 1px #5c34a2;text-decoration:none;margin-left:20px}.noWallet-alert{display:flex;width:540px;height:380px;border-radius:10px 8px 8px 10px;background-color:#ffffff}@media screen and (max-width: 360px){.noWallet-alert{padding-top:60px}}@media screen and (max-width: 768px){.noWallet-alert{flex-direction:column;width:92%;height:auto;margin-left:4%}}.noWallet-alert .noWallet-image-container{width:150px;background-image:linear-gradient(to right, #7258b0, #5231a0);border-radius:8px 0 0 8px}@media screen and (max-width: 768px){.noWallet-alert .noWallet-image-container{display:none}}.noWallet-alert .noWallet-image-container .noWallet-icon{width:150px;margin-top:0}.noWallet-alert .noWallet-alert-container{display:flex;flex-direction:column;justify-content:space-around;width:389px;padding:24px 30px}@media screen and (max-width: 768px){.noWallet-alert .noWallet-alert-container{padding:10px 0;width:88%;align-self:center}}.noWallet-alert .noWallet-alert-container .noWallet-title{font-size:44px;color:#5c34a2;line-height:1}@media screen and (max-width: 768px){.noWallet-alert .noWallet-alert-container .noWallet-title{font-size:30px;padding-top:2%;padding-bottom:2%}}.noWallet-alert .noWallet-alert-container .noWallet-description{font-size:14px;color:#666666;padding-top:10px;padding-bottom:10px;line-height:1.71}@media screen and (max-width: 768px){.noWallet-alert .noWallet-alert-container .noWallet-description{padding-left:1%;padding-right:1%}}.noWallet-alert .noWallet-buttons{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;align-content:space-around;height:100%}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons{flex-direction:column}}.noWallet-alert .noWallet-buttons .noWallet-metamask{width:96px;line-height:36px;text-align:center;border-radius:3px;color:#ffffff;background-color:#ffaa07}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons .noWallet-metamask{width:100%}}.noWallet-alert .noWallet-buttons .noWallet-niftyWallet{width:106px;line-height:36px;text-align:center;border-radius:3px;color:#ffffff;background-color:#5c34a2}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons .noWallet-niftyWallet{width:100%;margin:10px 0}}.noWallet-alert .noWallet-buttons .noWallet-cancel{width:72px;height:36px;border-radius:3px;border:1px solid #5c34a2;color:#5c34a2;background-color:#ffffff}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons .noWallet-cancel{width:100%}}.disclaimer-alert{display:flex;width:600px;height:518px;border-radius:8px;background-color:#ffffff;padding:30px 0}@media screen and (max-width: 360px){.disclaimer-alert{padding-top:60px}}@media screen and (max-width: 768px){.disclaimer-alert{flex-direction:column;width:92%;height:auto;margin-left:4%}}.disclaimer-alert .image-container{width:164px}@media screen and (max-width: 768px){.disclaimer-alert .image-container{display:none}}.disclaimer-alert .image-container .disclaimer-icon{width:117px;height:173px;margin-top:44px;margin-left:25px}.disclaimer-alert .alert-container{display:flex;flex-direction:column;justify-content:space-around;width:389px;padding-top:40px;padding-bottom:40px;padding-right:46px}@media screen and (max-width: 768px){.disclaimer-alert .alert-container{padding:10px 0;width:88%;align-self:center}}.disclaimer-alert .alert-container .alert-corner{width:10px;height:12px}.disclaimer-alert .alert-container .disclaimer-title{font-size:44px;color:#5c34a2;line-height:1}@media screen and (max-width: 768px){.disclaimer-alert .alert-container .disclaimer-title{font-size:30px;padding-top:2%;padding-bottom:2%}}.disclaimer-alert .alert-container .disclaimer-description{font-size:14px;color:#666666;padding-top:10px;padding-bottom:10px;line-height:1.71}@media screen and (max-width: 768px){.disclaimer-alert .alert-container .disclaimer-description{padding-left:1%;padding-right:1%}}.disclaimer-alert .alert-container .disclaimer-tos{padding-left:5px;color:#333333}.disclaimer-alert .alert-container .disclaimer-link{color:#5c34a2}.disclaimer-alert .alert-container .disclaimer-buttons .disclaimer-confirm{width:91px;height:40px;color:#ffffff;font-size:15px;font-weight:bold;border-radius:3px;background-color:#60db97;text-decoration:none}.disclaimer-alert .alert-container .disclaimer-buttons .disclaimer-confirm-disabled{width:91px;height:40px;color:#ffffff;font-size:15px;font-weight:bold;border-radius:3px;background-color:#808080;text-decoration:none;opacity:0}.header{width:100%;background-color:#5c34a2;background-size:cover;background-repeat:no-repeat;background-position:center center;z-index:9999}.header .container{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}@media screen and (max-width: 414px){.header .container{width:93%;padding:22px 0}}@media screen and (max-width: 768px){.header .container{padding:22px 0}}.header-logo{display:block;width:162px;height:26px}.header .links_container{display:flex;justify-content:space-between;align-items:center;width:600px}@media screen and (max-width: 414px){.header .links_container{display:none}}@media screen and (max-width: 768px){.header .links_container{justify-content:flex-end;width:auto}}.header .links_container_mobile{display:none}@media screen and (max-width: 414px){.header .links_container_mobile{display:flex;align-items:center;flex-direction:column;height:100%;justify-content:space-evenly}}.header .link{margin-left:30px;line-height:16px;text-decoration:none;font-weight:bold;color:#ffffff}@media screen and (max-width: 414px){.header .link{margin-left:0}}.header .link_text{margin-left:10px}.header .icon_events{width:18px;height:16px;background-image:url(../images/icons/icon-events.svg);float:left}.header .icon_status{width:18px;height:18px;background-image:url(../images/icons/icon-status.svg);float:left}.header .icon_statistics{width:18px;height:18px;background-image:url(../images/icons/icon-statistics.svg);float:left}.header .mobile-menu{display:none}@media screen and (max-width: 414px){.header .mobile-menu{display:block}}.header .mobile-menu .mobile-menu-icon{width:18px;height:14px}.header .mobile-menu .mobile-menu-open-icon{width:18px;height:18px}@media screen and (max-width: 414px){.header .header-mobile-menu-container{height:172px;background-color:#45277a}}.header .header-wallet{width:220px;height:70px;background-color:#502d8d;display:flex;flex-direction:column;justify-content:space-evenly}@media screen and (max-width: 768px){.header .header-wallet{display:none}}.header .header-wallet .wallet-container{padding-left:20px;display:flex}.header .header-wallet .wallet-container .wallet-icon{width:18px;height:18px;margin-right:10px}.header .header-wallet .wallet-container .wallet-text{font-size:14px;font-weight:bold;line-height:18px;color:#ffffff}.header .header-wallet .wallet-container .wallet-link{cursor:pointer}.header .header-wallet .wallet-container .wallet-text-metamask{color:#60db97}.header .header-wallet .daily-quota-container{margin-left:20px;width:180px;height:6px;border-radius:3px;background-color:#45277a}.header .header-wallet .daily-quota-container .daily-quota-progress{height:6px;border-radius:3px;background-color:#60db97}@media screen and (max-width: 768px){.header .daily-quota-modal-container{display:none}}.header .daily-quota-modal-container .daily-quota-modal-arrow{content:" ";position:absolute;top:-10px;border-top:none;border-right:10px solid transparent;border-left:10px solid transparent;border-bottom:10px solid black;z-index:9999}.header .daily-quota-modal-container .daily-quota-modal{width:219px;height:102px;border-radius:3px;box-shadow:0 16px 20px 0 rgba(0,0,0,0.05);background-color:#ffffff;border:solid 1px #e4e4e9;position:fixed;z-index:999}.header .daily-quota-modal-container .daily-quota-modal .modal-container{display:flex;flex-direction:column;padding:15px;justify-content:space-between;height:72px}.header .daily-quota-modal-container .daily-quota-modal .modal-container .daily-quota-title{font-size:14px;font-weight:bold;text-align:left;color:#5c34a2}.header .daily-quota-modal-container .daily-quota-modal .modal-container .daily-quota-description{width:172px;height:45px;font-size:12px;text-align:left;color:#333333}.header .daily-quota-modal-container .daily-quota-modal:after{content:" ";position:absolute;right:105px;top:-6px;border-top:none;border-right:6px solid transparent;border-left:6px solid transparent;border-bottom:6px solid #e4e4e9}.footer{position:absolute;bottom:0;padding:18px 0;background-color:#5c34a2}.footer .container{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}@media screen and (max-width: 768px){.footer .container{flex-direction:column}}.footer .socials{order:2}@media screen and (max-width: 768px){.footer .socials{order:1;margin-top:15px}}.footer-logo{display:block;background-image:url(../images/logos/logo-poa-bottom.png);order:0;left:0;width:126px;height:18px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.footer-logo{background-image:url("../images/logos/logo-poa-bottom@2x.png");background-size:126px 18px}}.footer-rights{order:1;color:#fff;text-align:center;font-size:12px}@media screen and (max-width: 768px){.footer-rights{order:2;width:100%;margin-top:15px;line-height:normal}}.socials{font-size:0}.socials-item:not(:first-child){margin-left:10px}.socials-i{transition:0.3s background-color;position:relative;display:inline-block;vertical-align:top;width:30px;height:30px;border-radius:3px;background-color:#ffffff}.socials-i:not(:first-child){margin-left:10px}.socials-i:hover{background-color:rgba(255,255,255,0.4)}.socials-i:before{transform:translate(-50%, -50%);position:absolute;left:50%;top:50%}.socials-i_github:before{content:'';background-image:url(../images/socials/git.png);width:16px;height:16px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.socials-i_github:before{background-image:url("../images/socials/git@2x.png");background-size:16px 16px}}.socials-i_telegram:before{background-image:url(../images/socials/telegram.png);content:'';width:16px;height:14px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.socials-i_telegram:before{background-image:url("../images/socials/telegram@2x.png");background-size:16px 14px}}.socials-i_twitter:before{background-image:url(../images/socials/tw.png);content:'';width:15px;height:12px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.socials-i_twitter:before{background-image:url("../images/socials/tw@2x.png");background-size:15px 12px}}.events-page{display:flex;justify-content:center;padding-top:40px}.events-page .events-container{width:960px}.events-page .events-container .events-header{display:flex;justify-content:space-between}@media screen and (max-width: 414px){.events-page .events-container .events-header{flex-direction:column}}.events-page .events-container .events-header .events-header-title{font-size:24px;color:#333333;line-height:38px}.events-page .events-container .events-header .events-filter-container{width:400px;height:38px;border-radius:3px;background-color:#ffffff;border:solid 1px #dadada;display:flex}@media screen and (max-width: 768px){.events-page .events-container .events-header .events-filter-container{width:auto}}.events-page .events-container .events-header .events-filter-container .events-filter{padding-left:10px;width:205px;line-height:38px;color:#333333;font-size:14px}@media screen and (max-width: 330px){.events-page .events-container .events-header .events-filter-container .events-filter{width:180px}}.events-page .events-container .events-header .events-filter-container .events-filter::placeholder{color:#b2b2b2}.events-page .events-container .events-header .events-filter-container .events-filter-icon{align-self:center;display:inline-block;width:16px;height:16px;margin-right:10px;margin-left:5px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA0lBMVEWAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6McEf5GAAAARXRSTlMAAQIDBQYHDA0bHB8gISQmJyg+P0BGR0lMU1RVWFlcXV5iY2tsdXZ4iYqLo6Spqqusra7Cw8TFysvM29zm5+jr8vP4+fzSh6raAAABM0lEQVR4AYWTeVeCQBTFr6AtuaTYkpUVlqZm0JIaLhjBfP+v1NxDyDCcA7+/3nLPecu8QULFGs/9MPTnE6uCPIa9EntWtgGN5lJkWDaR4WwnNHYWFM5DxsLXfqN22Ok7sXeR5ts/jHy0Er/1Tj9oJ77J+tEICqOIfZiIsalnXlUwNvifn/O50HA5bQWky45OoHHMTrsgY2nNkONFhscgX9K6Ro6eDH+C+NKqI0ddhn0QFjtAjhpb2wuOigQscVpQorzJScGYRYv65aLSVTvQcLhqI7YHQjJEhqHyWDC/+dxPUHjkc3tm4nYC6t/Sg3GFdgGX8ZHNeo1qtdGb0ZNEd4oiEBq6ouNlc95zRMW9+nHWaXptG3jQFTCs6YJfbzG1OL+m0EkVt2WKLUoUGxRxs91c/QFA1F3oKOgExAAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:center center;background-size:16px 16px}.events-page .events-container .events-header .events-filter-container .events-select{width:154px;height:38px;line-height:38px;font-size:14px;text-align:left;color:#333333;border:solid 1px white;border-left:solid 1px #dadada;background-color:#ffffff}@media screen and (max-width: 768px){.events-page .events-container .events-header .events-filter-container .events-select{width:auto}}.events-page .events-container .events-columns{display:flex;justify-content:space-between;margin-top:38px}.events-page .events-container .events-columns .column-title{font-size:14px;font-weight:bold;text-align:left;color:#333333}@media screen and (max-width: 768px){.events-page .events-container .events-columns{display:none}}.events-page .events-container .events-header-separator{width:100%;height:3px;background-color:#e4e4e4;margin-top:20px}.events-page .events-container .txhash-column{width:375px}@media screen and (max-width: 768px){.events-page .events-container .txhash-column{width:300px}}.events-page .events-container .recipient-column{width:300px}.events-page .events-container .value-column{width:150px}.events-page .events-container .block-column{text-align:right;width:100px}.events-page .events-container .event{display:flex;justify-content:space-between;padding-top:22px;padding-bottom:22px;line-height:26px}@media screen and (max-width: 768px){.events-page .events-container .event{flex-direction:column}}.events-page .events-container .event-tx-container{line-height:26px}@media screen and (max-width: 768px){.events-page .events-container .event-tx-container{display:flex;flex-direction:column}}.events-page .events-container .event-tx-container .event-name{width:66px;height:26px;line-height:26px;border-radius:3px;font-size:14px;font-weight:bold;text-align:left;color:#ffffff;padding:5px;margin-right:5px}@media screen and (max-width: 768px){.events-page .events-container .event-tx-container .event-name{width:fit-content}}.events-page .events-container .event-tx-container .event-txhash{font-size:14px;text-align:left;color:#5c34a2;text-decoration:none}.events-page .events-container .event-tx-container .event-copy-tx{cursor:pointer;margin-left:10px}.events-page .events-container .event-recipient{font-size:14px;text-align:left;color:#5c34a2;text-decoration:none}.events-page .events-container .event-recipient-label{color:#333333}.events-page .events-container .event-value{font-size:14px;text-align:left;color:#333333}.events-page .events-container .event-block{font-size:14px;text-align:right;color:#333333}@media screen and (max-width: 768px){.events-page .events-container .event-block{text-align:left}}.events-page .events-container .event-separator{width:100%;height:1px;background-color:#e4e4e4}.green{color:#21b969}.red{color:#ff124f}.purple{color:#642f9c}.blue{color:#3ab9fe}.background-green{background-color:#60dc97}.background-red{background-color:#f13662}.background-purple{background-color:#642f9c}.background-blue{background-color:#3ab9fe}@keyframes fadeOut{0%{opacity:.2}20%{opacity:1;transform:scale(1)}100%{opacity:.2;transform:scale(0.3)}}.loading{width:234px;height:50px}.loading-container{position:fixed;z-index:1000000;left:0;right:0;top:0;bottom:0;background-color:rgba(78,44,137,0.9);display:flex;justify-content:center;align-items:center}.loading-i{width:2px;height:50px;border-radius:1px;background-color:#60db97;animation-duration:2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:fadeOut;animation-timing-function:linear;opacity:.2}.loading-i:nth-child(2){animation-delay:.1s}.loading-text{text-align:center;width:500px;font-size:24px;font-weight:normal;font-style:normal;font-stretch:normal;line-height:3;letter-spacing:normal;color:#ffffff}@media screen and (max-width: 414px){.loading-text{font-size:18px}}@media screen and (max-width: 414px){.mobile-container{flex-direction:column}}.network-modal{display:flex;justify-content:center;align-items:center;overflow-y:scroll}.network-modal .modal{min-width:558px;border-radius:10px;position:relative;min-height:410px}@media screen and (max-width: 768px){.network-modal .modal{top:30px}}@media screen and (max-width: 600px){.network-modal .modal{top:60px}}@media screen and (max-width: 414px){.network-modal .modal{min-width:100%;top:0}}.network-modal .modal .title{margin-bottom:20px;text-transform:uppercase;font-size:24px;font-weight:bold}.network-modal .modal .description{margin-bottom:25px;color:#8197a2;line-height:24px;font-size:13px}.network-modal .modal .close-button{position:absolute;top:40px;right:-40px;z-index:400000;padding:15px}.network-modal .modal .close-button i.icon:before{content:url("../images/icons/close.svg")}.network-modal .modal .close-button:hover{cursor:pointer}@media screen and (max-width: 600px){.network-modal .modal .close-button{right:-10px}}@media screen and (max-width: 414px){.network-modal .modal .close-button{top:-40px;right:0}}.status-page{display:flex;justify-content:center}.status-page .status-page-container{width:70%;display:flex;flex-direction:column}@media screen and (max-width: 768px){.status-page .status-page-container{width:90%}}.status-page .status-page-container .status-title{font-size:24px;line-height:3;text-align:left;color:#333333}.status-page .status-page-container .status-configuration-container{display:flex;flex-direction:column;padding-top:30px}.status-page .status-page-container .status-configuration-container .status-configuration-data{display:flex;justify-content:space-evenly}@media screen and (max-width: 768px){.status-page .status-page-container .status-configuration-container .status-configuration-data{flex-direction:column}}.status-page .status-page-container .status-authorities-container{display:flex;flex-direction:column;margin-top:80px}.status-page .status-page-container .status-authorities-container .status-authorities-title{padding-bottom:30px}.status-page .status-page-container .status-authorities-container .status-authorities-data{display:flex;flex-direction:column}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority{display:flex;padding-bottom:20px}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-number{font-size:30px;font-weight:bold;line-height:59px;text-align:left;color:#5c34a2;padding-right:20px}@media screen and (max-width: 768px){.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-number{padding-right:5px}}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-logo{padding-left:20px;width:59px;height:59px}@media screen and (max-width: 768px){.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-logo{display:none}}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-address{font-size:16px;font-weight:bold;line-height:59px;text-align:left;color:#333333;padding-left:20px}@media screen and (max-width: 768px){.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-address{font-size:12px;padding-left:0}}.status-page .status-left-container{width:15%;padding-top:25px}@media screen and (max-width: 414px){.status-page .status-left-container{display:none}}.status-page .status-right-container{width:15%;padding-top:25px;overflow:hidden}@media screen and (max-width: 414px){.status-page .status-right-container{display:none}}.statistics-page{display:flex;justify-content:center}.statistics-page .statistics-page-container{width:70%;display:flex;flex-direction:column}@media screen and (max-width: 768px){.statistics-page .statistics-page-container{width:90%}}.statistics-page .statistics-page-container .statistics-title{font-size:24px;line-height:3;text-align:left;color:#333333}.statistics-page .statistics-page-container .statistics-bridge-container{display:flex;flex-direction:column;padding-top:30px}.statistics-page .statistics-page-container .statistics-bridge-container .statistics-bridge-data{display:flex;justify-content:space-evenly}@media screen and (max-width: 768px){.statistics-page .statistics-page-container .statistics-bridge-container .statistics-bridge-data{flex-direction:column}}.statistics-page .statistics-page-container .statistics-transaction-container{display:flex;justify-content:space-between;padding-top:90px}.statistics-page .statistics-page-container .statistics-transaction-container .statistics-deposit-container{width:40%}.statistics-page .statistics-page-container .statistics-transaction-container .statistics-withdraw-container{width:40%;margin-bottom:80px}.statistics-page .statistics-page-container .statistics-transaction-container .statistics-bridge-data{display:flex;justify-content:space-evenly}@media screen and (max-width: 768px){.statistics-page .statistics-page-container .statistics-transaction-container .statistics-bridge-data{flex-direction:column}}.statistics-page .statistics-left-container{width:15%;padding-top:25px}@media screen and (max-width: 414px){.statistics-page .statistics-left-container{display:none}}.statistics-page .statistics-right-container{width:15%;padding-top:25px;overflow:hidden}@media screen and (max-width: 414px){.statistics-page .statistics-right-container{display:none}} +.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-controls{display:flex;justify-content:space-between}.footer{left:0;right:0}.container{position:relative;width:960px;margin-left:auto;margin-right:auto}@media (max-width: 980px){.container{width:98%}}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local("Open Sans"),local("OpenSans"),url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3ZBw1xU1rKptJj_0jans920.woff2) format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local("Open Sans Bold"),local("OpenSans-Bold"),url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzBampu5_7CjHW5spxoeN3Vs.woff2) format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215}html,body{color:#333;font-size:14px;font-family:'Open Sans', sans-serif;-webkit-font-smoothing:antialiased}html,body,p,h1,h2,h3{margin:0;padding:0;font-weight:normal}html{display:flex;min-height:100%}body{position:relative;width:100%;box-sizing:border-box;padding-bottom:66px;background-color:#ffffff;font-family:'Nunito', sans-serif}@media screen and (max-width: 768px){body{padding-bottom:98px}}a{color:#08b3f2;text-decoration:none}a:hover{text-decoration:underline}button{margin-left:5px;color:#08b3f2;cursor:pointer}button:hover{text-decoration:underline}input,button{margin:0;padding:0;outline:none;border:0;font-family:'Open Sans', sans-serif;font-size:14px}strong{font-weight:bold}.hidden{overflow:hidden}.label{margin-top:15px;margin-bottom:7px;font-weight:bold}.description{color:#8197a2;line-height:24px}.break-all{word-break:break-all}.separator{width:1px;height:51px;background-color:#e4e4e4}@media screen and (max-width: 768px){.separator{display:none}}.datablock-container{height:60px;display:flex;justify-content:space-evenly;flex-direction:column;align-items:center}@media screen and (max-width: 768px){.datablock-container{align-items:normal}}.datablock-container .datablock-value{font-size:30px;font-weight:bold;color:#5c34a2}.datablock-container .datablock-type{font-size:18px;color:#5c34a2;margin-left:10px}.datablock-container .datablock-description{font-size:14px;color:#333333}.app-container{position:relative;width:100%;margin-left:auto;margin-right:auto}@media screen and (max-width: 414px){.mobile-menu-open{position:absolute;z-index:1000000;height:100%;width:100%;background-color:rgba(78,44,137,0.9)}}.only-mobile{display:none}@media screen and (max-width: 768px){.only-mobile{display:inherit}}.bridge-container{position:relative;width:100%;margin-left:auto;margin-right:auto;height:80vh;display:flex;align-items:center}@media screen and (max-width: 768px){.bridge-container{height:512px}}.bridge{width:100%;display:flex;flex-direction:column;overflow:hidden}.bridge .bridge-home{width:960px;height:80px;display:flex;background-image:linear-gradient(to right, #5c34a2, #7b5ab2);align-self:center}@media screen and (max-width: 768px){.bridge .bridge-home{display:none}}.bridge .bridge-home .bridge-home-container{width:9%;min-width:60px;background-color:#ffffff}.bridge .bridge-home .bridge-home-container .home-logo-container{height:100%;border-radius:10px;border-bottom-right-radius:0;background-color:#5c34a2;display:flex;justify-content:center;align-items:center}.bridge .bridge-home .bridge-home-container .home-logo-container .home-logo{width:52px;height:16px}.bridge .bridge-home .bridge-home-container .home-logo-container .foreign-logo{width:54px;height:11px}.bridge .bridge-home .home-address-container{width:92%;border-bottom-left-radius:10px;background-color:#ffffff;display:flex;align-items:center}.bridge .bridge-home .home-address-container .icon-wallet{padding:20px}.bridge .bridge-foreign{width:960px;height:80px;display:flex;background-image:linear-gradient(to right, #5c34a2, #7b5ab2);align-self:center}@media screen and (max-width: 768px){.bridge .bridge-foreign{display:none}}.bridge .bridge-foreign .bridge-foreign-container{width:9%;min-width:60px;background-color:#ffffff}.bridge .bridge-foreign .bridge-foreign-container .foreign-logo-container{height:100%;border-radius:10px;border-top-left-radius:0;background-color:#7b5ab2;display:flex;justify-content:center;align-items:center}.bridge .bridge-foreign .bridge-foreign-container .foreign-logo-container .foreign-logo{width:54px;height:11px}.bridge .bridge-foreign .bridge-foreign-container .foreign-logo-container .home-logo{width:52px;height:16px}.bridge .bridge-foreign .foreign-address-container{width:92%;border-top-right-radius:10px;background-color:#ffffff;display:flex;justify-content:flex-end;align-items:center;text-align:right}.bridge .bridge-foreign .foreign-address-container .icon-wallet{padding:20px}.bridge .address-label{font-size:12px;color:#5c34a2}.bridge .address-description{font-size:16px;font-weight:bold;color:#5c34a2}@media screen and (max-width: 768px){.bridge .address-description{font-size:9px}}.bridge .bridge-transfer{height:276px;display:flex;justify-content:center}@media screen and (max-width: 768px){.bridge .bridge-transfer{height:389px}}.bridge .bridge-transfer .left-image-wrapper{background-color:#5c34a2}.bridge .bridge-transfer .left-image-wrapper .left-image{max-width:238px;height:271px;padding-top:5px;padding-right:5px;background-color:#ffffff;border-top-right-radius:10px}@media screen and (max-width: 768px){.bridge .bridge-transfer .left-image-wrapper .left-image{display:none}}.bridge .bridge-transfer .right-image-wrapper{background-color:#7b5ab2}.bridge .bridge-transfer .right-image-wrapper .right-image{max-width:238px;height:271px;padding-bottom:5px;padding-left:5px;background-color:#ffffff;border-bottom-left-radius:10px}@media screen and (max-width: 768px){.bridge .bridge-transfer .right-image-wrapper .right-image{display:none}}.bridge .bridge-transfer .bridge-transfer-content{width:880px;background-image:linear-gradient(to right, #5c34a2, #7b5ab2);border-top-right-radius:10px;border-bottom-left-radius:10px;flex-shrink:0;display:flex;flex-wrap:wrap}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content{max-width:92%;flex-direction:column;border-radius:8px}}.bridge .bridge-transfer .bridge-transfer-content .bridge-transfer-content-background{width:880px;flex-shrink:0;display:flex;flex-wrap:wrap}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .bridge-transfer-content-background{width:auto;flex-direction:column;background-image:url("../images/arrows-down@2x.png");background-position:center;background-repeat:no-repeat;background-size:164px 203px}}.bridge .bridge-transfer .bridge-transfer-content .network-container-home{width:22%;height:136px;display:flex;justify-content:space-evenly;flex-direction:column;padding:70px 1% 70px 5%;align-items:flex-start}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .network-container-home{width:auto;align-self:center;height:136px;padding:5px 0 5px 0;align-items:center}}.bridge .bridge-transfer .bridge-transfer-content .network-container-foreign{width:22%;height:136px;display:flex;justify-content:space-evenly;flex-direction:column;padding:70px 5% 70px 1%;align-items:flex-end}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .network-container-foreign{width:auto;align-self:center;height:136px;padding:5px 0 5px 0;align-items:center}}.bridge .bridge-transfer .bridge-transfer-content .bridge-network-data{display:flex;align-items:center;cursor:pointer}.bridge .bridge-transfer .bridge-transfer-content .network-basic-label{font-size:13px;color:#ffffff}.bridge .bridge-transfer .bridge-transfer-content .network-name{padding-left:5px;font-size:24px;color:#ffffff}.bridge .bridge-transfer .bridge-transfer-content .network-title{font-size:24px;font-weight:bold;color:#ffffff}.bridge .bridge-transfer .bridge-transfer-content .network-id{font-size:14px;color:#ffffff;font-weight:bold;line-height:26px}.bridge .bridge-transfer .bridge-transfer-content .network-id-container{width:32px;height:26px;border-radius:3px;background-color:#60db97;text-align:center;margin-left:10px}.bridge .bridge-transfer .bridge-transfer-content .network-balance{font-size:13px;font-weight:bold;color:#60db97}.bridge .bridge-transfer .bridge-transfer-content .network-show-more{font-size:14px;font-weight:bold;color:#60db97}.bridge .bridge-transfer .bridge-transfer-content .info-icon-left{margin-right:10px}.bridge .bridge-transfer .bridge-transfer-content .info-icon-right{margin-left:10px}.bridge .bridge-transfer .bridge-transfer-content .transfer-right{background-image:url("../images/arrows-1.svg");background-position:center;background-repeat:no-repeat}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .transfer-right{background-image:none}}.bridge .bridge-transfer .bridge-transfer-content .transfer-left{background-image:url("../images/arrows-2.svg");background-position:center;background-repeat:no-repeat}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .transfer-left{background-image:none}}.bridge .bridge-transfer .bridge-transfer-content .form-container{width:44%;max-width:384px;height:276px}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container{width:100%;height:97px;align-self:center}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form{height:276px;display:flex;flex-direction:column;justify-content:space-evenly}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form{width:100%;height:auto}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-controls{padding:8px 8px 8px 0;border-radius:5px;background-color:rgba(251,251,252,0.2)}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-controls{flex-direction:column;padding:8px 8px 8px 8px;background-color:unset}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form .bridge-form-input-container{display:flex;justify-content:space-between;width:292px}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form .bridge-form-input-container{background-color:rgba(251,251,252,0.2);border-radius:3px 3px 0 0;width:100%}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input{width:165px;height:48px;padding-left:16px;background-color:transparent;color:#ffffff;font-size:24px;font-weight:bold}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input::placeholder{font-size:24px;font-weight:bold;color:rgba(255,255,255,0.7)}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input::placeholder{font-size:18px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input::placeholder{opacity:0.3}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-input{font-size:18px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-label{margin:0 10px;color:#ffffff;font-weight:bold;text-transform:uppercase;font-size:24px;line-height:48px}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-label{font-size:18px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-button{flex-shrink:0;text-decoration:none;display:block;width:92px;height:48px;border-radius:3px;background-color:#60db97;color:#ffffff;font-weight:bold}@media screen and (max-width: 768px){.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-button{width:100%;border-radius:0 0 3px 3px}}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form-button:hover{opacity:0.8}.bridge .bridge-transfer .bridge-transfer-content .form-container .bridge-form .bridge-transfer-direction{font-size:14px;color:#ffffff}.bridge .bridge-statistics-container{align-self:center;margin-top:60px}@media screen and (max-height: 720px){.bridge .bridge-statistics-container{margin-top:30px}}.bridge .network-details{display:flex;flex-direction:column;min-width:558px}@media screen and (max-width: 768px){.bridge .network-details{min-width:100%}}.bridge .network-details .details-logo-container{width:85px;height:80px;border-radius:10px;border-bottom-right-radius:0;background-color:#ffffff;display:flex;justify-content:center;align-items:center}@media screen and (max-width: 768px){.bridge .network-details .details-logo-container{display:none}}.bridge .network-details .details-logo-container .home-logo{width:52px;height:16px}.bridge .network-details .details-logo-container .foreign-logo{width:54px;height:11px}.bridge .network-details .details-logo-container:after{content:"";position:absolute;height:10px;width:20px;bottom:0}@media screen and (max-width: 768px){.bridge .network-details .details-logo-container:after{display:none}}.bridge .network-details .details-logo-container:after{right:453px;top:70px;border-radius:0 0 0 10px;box-shadow:-10px 0 0 0 #fff}@media screen and (max-width: 768px){.bridge .network-details .details-logo-container:after{display:none}}.bridge .network-details .details-body{width:440px;height:254px;background-color:#ffffff;align-self:flex-end;border-radius:0 10px 10px 10px;padding:38px;display:flex;flex-direction:column;justify-content:space-between}@media screen and (max-width: 768px){.bridge .network-details .details-body{width:85%;height:430px;padding:20px 15px 20px 15px;align-self:center;border-radius:10px 10px 10px 10px}}@media screen and (max-width: 768px) and (min-width: 415px){.bridge .network-details .details-body{height:300px}}@media screen and (max-width: 768px) and (min-width: 415px) and (max-width: 600px){.bridge .network-details .details-body{height:250px}}.bridge .network-details .details-body .details-data-container{display:flex;justify-content:space-between}@media screen and (max-width: 768px){.bridge .network-details .details-body .details-data-container{flex-direction:column}}.bridge .network-details .details-body .details-data-container .details-label{font-size:14px;color:#777777}.bridge .network-details .details-body .details-data-container .details-description{font-size:14px;color:#5c34a2}.bridge .network-details .details-body .details-data-container .details-description-black{font-size:14px;color:#333333}.bridge .network-details .details-body .details-data-container .info-icon-right{margin-left:10px}.bridge .network-details .details-body .details-data-container .details-copy{cursor:pointer}.bridge .network-details .details-body:before{content:"";position:absolute;height:10px;width:20px;bottom:0}@media screen and (max-width: 768px){.bridge .network-details .details-body:before{display:none}}.bridge .network-details .details-body:before{left:22px;top:80px;border-radius:0 10px 0 0;box-shadow:10px 0 0 0 #fff}@media screen and (max-width: 768px){.bridge .network-details .details-body:before{display:none}}.bridge .transfer-alert{display:flex;width:600px;height:265px;border-radius:8px;background-color:#ffffff}@media screen and (max-width: 768px){.bridge .transfer-alert{flex-direction:column;width:100%;height:auto}}.bridge .transfer-alert .image-container{width:166px}@media screen and (max-width: 768px){.bridge .transfer-alert .image-container{width:100%}}.bridge .transfer-alert .image-container .arrows-icon{width:124px;height:128px;margin-top:39px;margin-left:42px}.bridge .transfer-alert .alert-container{display:flex;flex-direction:column;justify-content:space-around;width:374px;padding-top:40px;padding-bottom:40px;padding-right:60px}@media screen and (max-width: 768px){.bridge .transfer-alert .alert-container{width:100%;padding-left:5px;padding-top:0}}.bridge .transfer-alert .alert-container .alert-corner{width:10px;height:12px}.bridge .transfer-alert .alert-container .transfer-title{display:flex;justify-content:space-around;align-items:center;color:#5c34a2;font-size:14px}.bridge .transfer-alert .alert-container .transfer-title .alert-logo-box{width:50px;height:50px;border-radius:4px;background-color:#5c34a2;display:flex;align-items:center;justify-content:center}.bridge .transfer-alert .alert-container .transfer-title .icon_arrow_right{width:14px;height:10px;border-radius:1px}.bridge .transfer-alert .alert-container .transfer-description{line-height:1.71;font-size:14px;color:#5c34a2;padding-top:10px;padding-bottom:10px}.bridge .transfer-alert .alert-container .transfer-buttons .transfer-confirm{width:91px;height:40px;color:#ffffff;font-size:15px;font-weight:bold;border-radius:3px;background-color:#60db97;text-decoration:none}.bridge .transfer-alert .alert-container .transfer-buttons .transfer-cancel{width:76px;height:40px;border-radius:3px;color:#5c34a2;font-size:15px;font-weight:bold;background-color:#ffffff;border:solid 1px #5c34a2;text-decoration:none;margin-left:20px}.noWallet-alert{display:flex;width:540px;height:380px;border-radius:10px 8px 8px 10px;background-color:#ffffff}@media screen and (max-width: 360px){.noWallet-alert{padding-top:60px}}@media screen and (max-width: 768px){.noWallet-alert{flex-direction:column;width:92%;height:auto;margin-left:4%}}.noWallet-alert .noWallet-image-container{width:150px;background-image:linear-gradient(to right, #7258b0, #5231a0);border-radius:8px 0 0 8px}@media screen and (max-width: 768px){.noWallet-alert .noWallet-image-container{display:none}}.noWallet-alert .noWallet-image-container .noWallet-icon{width:150px;margin-top:0}.noWallet-alert .noWallet-alert-container{display:flex;flex-direction:column;justify-content:space-around;width:389px;padding:24px 30px}@media screen and (max-width: 768px){.noWallet-alert .noWallet-alert-container{padding:10px 0;width:88%;align-self:center}}.noWallet-alert .noWallet-alert-container .noWallet-title{font-size:44px;color:#5c34a2;line-height:1}@media screen and (max-width: 768px){.noWallet-alert .noWallet-alert-container .noWallet-title{font-size:30px;padding-top:2%;padding-bottom:2%}}.noWallet-alert .noWallet-alert-container .noWallet-description{font-size:14px;color:#666666;padding-top:10px;padding-bottom:10px;line-height:1.71}@media screen and (max-width: 768px){.noWallet-alert .noWallet-alert-container .noWallet-description{padding-left:1%;padding-right:1%}}.noWallet-alert .noWallet-buttons{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:flex-end;align-content:space-around;height:100%}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons{flex-direction:column}}.noWallet-alert .noWallet-buttons .noWallet-metamask{width:96px;line-height:36px;text-align:center;border-radius:3px;color:#ffffff;background-color:#ffaa07}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons .noWallet-metamask{width:100%}}.noWallet-alert .noWallet-buttons .noWallet-niftyWallet{width:106px;line-height:36px;text-align:center;border-radius:3px;color:#ffffff;background-color:#5c34a2}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons .noWallet-niftyWallet{width:100%;margin:10px 0}}.noWallet-alert .noWallet-buttons .noWallet-cancel{width:72px;height:36px;border-radius:3px;border:1px solid #5c34a2;color:#5c34a2;background-color:#ffffff}@media screen and (max-width: 360px){.noWallet-alert .noWallet-buttons .noWallet-cancel{width:100%}}.disclaimer-alert{display:flex;width:600px;height:518px;border-radius:8px;background-color:#ffffff;padding:30px 0}@media screen and (max-width: 360px){.disclaimer-alert{padding-top:60px}}@media screen and (max-width: 768px){.disclaimer-alert{flex-direction:column;width:92%;height:auto;margin-left:4%}}.disclaimer-alert .image-container{width:164px}@media screen and (max-width: 768px){.disclaimer-alert .image-container{display:none}}.disclaimer-alert .image-container .disclaimer-icon{width:117px;height:173px;margin-top:44px;margin-left:25px}.disclaimer-alert .alert-container{display:flex;flex-direction:column;justify-content:space-around;width:389px;padding-top:40px;padding-bottom:40px;padding-right:46px}@media screen and (max-width: 768px){.disclaimer-alert .alert-container{padding:10px 0;width:88%;align-self:center}}.disclaimer-alert .alert-container .alert-corner{width:10px;height:12px}.disclaimer-alert .alert-container .disclaimer-title{font-size:44px;color:#5c34a2;line-height:1}@media screen and (max-width: 768px){.disclaimer-alert .alert-container .disclaimer-title{font-size:30px;padding-top:2%;padding-bottom:2%}}.disclaimer-alert .alert-container .disclaimer-description{font-size:14px;color:#666666;padding-top:10px;padding-bottom:10px;line-height:1.71}@media screen and (max-width: 768px){.disclaimer-alert .alert-container .disclaimer-description{padding-left:1%;padding-right:1%}}.disclaimer-alert .alert-container .disclaimer-tos{padding-left:5px;color:#333333}.disclaimer-alert .alert-container .disclaimer-link{color:#5c34a2}.disclaimer-alert .alert-container .disclaimer-buttons .disclaimer-confirm{width:91px;height:40px;color:#ffffff;font-size:15px;font-weight:bold;border-radius:3px;background-color:#60db97;text-decoration:none}.disclaimer-alert .alert-container .disclaimer-buttons .disclaimer-confirm-disabled{width:91px;height:40px;color:#ffffff;font-size:15px;font-weight:bold;border-radius:3px;background-color:#808080;text-decoration:none;opacity:0}.header{width:100%;background-color:#5c34a2;background-size:cover;background-repeat:no-repeat;background-position:center center;z-index:9999}.header .container{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}@media screen and (max-width: 414px){.header .container{width:93%;padding:22px 0}}@media screen and (max-width: 768px){.header .container{padding:22px 0}}.header-logo{display:block;width:162px;height:26px}.header .links_container{display:flex;justify-content:space-between;align-items:center;max-width:700px}@media screen and (max-width: 414px){.header .links_container{display:none}}@media screen and (max-width: 768px){.header .links_container{justify-content:flex-end;width:auto}}.header .links_container_mobile{display:none}@media screen and (max-width: 414px){.header .links_container_mobile{display:flex;align-items:center;flex-direction:column;height:100%;justify-content:space-evenly}}.header .link{margin:0 15px;line-height:16px;text-decoration:none;font-weight:bold;color:#ffffff}@media screen and (max-width: 414px){.header .link{margin-left:0}}.header .link_text{margin-left:10px}.header .icon_events{width:18px;height:16px;background-image:url(../images/icons/icon-events.svg);float:left}.header .icon_status{width:18px;height:18px;background-image:url(../images/icons/icon-status.svg);float:left}.header .icon_statistics{width:18px;height:18px;background-image:url(../images/icons/icon-statistics.svg);float:left}.header .mobile-menu{display:none}@media screen and (max-width: 414px){.header .mobile-menu{display:block}}.header .mobile-menu .mobile-menu-icon{width:18px;height:14px}.header .mobile-menu .mobile-menu-open-icon{width:18px;height:18px}@media screen and (max-width: 414px){.header .header-mobile-menu-container{height:172px;background-color:#45277a}}.header .header-wallet{width:220px;height:70px;background-color:#502d8d;display:flex;flex-direction:column;justify-content:space-evenly}@media screen and (max-width: 768px){.header .header-wallet{display:none}}.header .header-wallet .wallet-container{padding-left:20px;display:flex}.header .header-wallet .wallet-container .wallet-icon{width:18px;height:18px;margin-right:10px}.header .header-wallet .wallet-container .wallet-text{font-size:14px;font-weight:bold;line-height:18px;color:#ffffff}.header .header-wallet .wallet-container .wallet-link{cursor:pointer}.header .header-wallet .wallet-container .wallet-text-metamask{color:#60db97}.header .header-wallet .daily-quota-container{margin-left:20px;width:180px;height:6px;border-radius:3px;background-color:#45277a}.header .header-wallet .daily-quota-container .daily-quota-progress{height:6px;border-radius:3px;background-color:#60db97}@media screen and (max-width: 768px){.header .daily-quota-modal-container{display:none}}.header .daily-quota-modal-container .daily-quota-modal-arrow{content:" ";position:absolute;top:-10px;border-top:none;border-right:10px solid transparent;border-left:10px solid transparent;border-bottom:10px solid black;z-index:9999}.header .daily-quota-modal-container .daily-quota-modal{width:219px;height:102px;border-radius:3px;box-shadow:0 16px 20px 0 rgba(0,0,0,0.05);background-color:#ffffff;border:solid 1px #e4e4e9;position:fixed;z-index:999}.header .daily-quota-modal-container .daily-quota-modal .modal-container{display:flex;flex-direction:column;padding:15px;justify-content:space-between;height:72px}.header .daily-quota-modal-container .daily-quota-modal .modal-container .daily-quota-title{font-size:14px;font-weight:bold;text-align:left;color:#5c34a2}.header .daily-quota-modal-container .daily-quota-modal .modal-container .daily-quota-description{width:172px;height:45px;font-size:12px;text-align:left;color:#333333}.header .daily-quota-modal-container .daily-quota-modal:after{content:" ";position:absolute;right:105px;top:-6px;border-top:none;border-right:6px solid transparent;border-left:6px solid transparent;border-bottom:6px solid #e4e4e9}.footer{position:absolute;bottom:0;padding:18px 0;background-color:#5c34a2}.footer .container{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}@media screen and (max-width: 768px){.footer .container{flex-direction:column}}.footer .socials{order:2}@media screen and (max-width: 768px){.footer .socials{order:1;margin-top:15px}}.footer-logo{display:block;background-image:url(../images/logos/logo-poa-bottom.png);order:0;left:0;width:126px;height:18px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.footer-logo{background-image:url("../images/logos/logo-poa-bottom@2x.png");background-size:126px 18px}}.footer-rights{order:1;color:#fff;text-align:center;font-size:12px}@media screen and (max-width: 768px){.footer-rights{order:2;width:100%;margin-top:15px;line-height:normal}}.socials{font-size:0}.socials-item:not(:first-child){margin-left:10px}.socials-i{transition:0.3s background-color;position:relative;display:inline-block;vertical-align:top;width:30px;height:30px;border-radius:3px;background-color:#ffffff}.socials-i:not(:first-child){margin-left:10px}.socials-i:hover{background-color:rgba(255,255,255,0.4)}.socials-i:before{transform:translate(-50%, -50%);position:absolute;left:50%;top:50%}.socials-i_github:before{content:'';background-image:url(../images/socials/git.png);width:16px;height:16px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.socials-i_github:before{background-image:url("../images/socials/git@2x.png");background-size:16px 16px}}.socials-i_telegram:before{background-image:url(../images/socials/telegram.png);content:'';width:16px;height:14px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.socials-i_telegram:before{background-image:url("../images/socials/telegram@2x.png");background-size:16px 14px}}.socials-i_twitter:before{background-image:url(../images/socials/tw.png);content:'';width:15px;height:12px}@media (min--moz-device-pixel-ratio: 1.3), (-o-min-device-pixel-ratio: 2.6 / 2), (-webkit-min-device-pixel-ratio: 1.3), (min-device-pixel-ratio: 1.3), (min-resolution: 1.3dppx){.socials-i_twitter:before{background-image:url("../images/socials/tw@2x.png");background-size:15px 12px}}.events-page{display:flex;justify-content:center;padding-top:40px}.events-page .events-container{width:960px}.events-page .events-container .events-header{display:flex;justify-content:space-between}@media screen and (max-width: 414px){.events-page .events-container .events-header{flex-direction:column}}.events-page .events-container .events-header .events-header-title{font-size:24px;color:#333333;line-height:38px}.events-page .events-container .events-header .events-filter-container{width:400px;height:38px;border-radius:3px;background-color:#ffffff;border:solid 1px #dadada;display:flex}@media screen and (max-width: 768px){.events-page .events-container .events-header .events-filter-container{width:auto}}.events-page .events-container .events-header .events-filter-container .events-filter{padding-left:10px;width:205px;line-height:38px;color:#333333;font-size:14px}@media screen and (max-width: 330px){.events-page .events-container .events-header .events-filter-container .events-filter{width:180px}}.events-page .events-container .events-header .events-filter-container .events-filter::placeholder{color:#b2b2b2}.events-page .events-container .events-header .events-filter-container .events-filter-icon{align-self:center;display:inline-block;width:16px;height:16px;margin-right:10px;margin-left:5px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAA0lBMVEWAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6OAl6McEf5GAAAARXRSTlMAAQIDBQYHDA0bHB8gISQmJyg+P0BGR0lMU1RVWFlcXV5iY2tsdXZ4iYqLo6Spqqusra7Cw8TFysvM29zm5+jr8vP4+fzSh6raAAABM0lEQVR4AYWTeVeCQBTFr6AtuaTYkpUVlqZm0JIaLhjBfP+v1NxDyDCcA7+/3nLPecu8QULFGs/9MPTnE6uCPIa9EntWtgGN5lJkWDaR4WwnNHYWFM5DxsLXfqN22Ok7sXeR5ts/jHy0Er/1Tj9oJ77J+tEICqOIfZiIsalnXlUwNvifn/O50HA5bQWky45OoHHMTrsgY2nNkONFhscgX9K6Ro6eDH+C+NKqI0ddhn0QFjtAjhpb2wuOigQscVpQorzJScGYRYv65aLSVTvQcLhqI7YHQjJEhqHyWDC/+dxPUHjkc3tm4nYC6t/Sg3GFdgGX8ZHNeo1qtdGb0ZNEd4oiEBq6ouNlc95zRMW9+nHWaXptG3jQFTCs6YJfbzG1OL+m0EkVt2WKLUoUGxRxs91c/QFA1F3oKOgExAAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:center center;background-size:16px 16px}.events-page .events-container .events-header .events-filter-container .events-select{width:154px;height:38px;line-height:38px;font-size:14px;text-align:left;color:#333333;border:solid 1px white;border-left:solid 1px #dadada;background-color:#ffffff}@media screen and (max-width: 768px){.events-page .events-container .events-header .events-filter-container .events-select{width:auto}}.events-page .events-container .events-columns{display:flex;justify-content:space-between;margin-top:38px}.events-page .events-container .events-columns .column-title{font-size:14px;font-weight:bold;text-align:left;color:#333333}@media screen and (max-width: 768px){.events-page .events-container .events-columns{display:none}}.events-page .events-container .events-header-separator{width:100%;height:3px;background-color:#e4e4e4;margin-top:20px}.events-page .events-container .txhash-column{width:375px}@media screen and (max-width: 768px){.events-page .events-container .txhash-column{width:300px}}.events-page .events-container .recipient-column{width:300px}.events-page .events-container .value-column{width:150px}.events-page .events-container .block-column{text-align:right;width:100px}.events-page .events-container .event{display:flex;justify-content:space-between;padding-top:22px;padding-bottom:22px;line-height:26px}@media screen and (max-width: 768px){.events-page .events-container .event{flex-direction:column}}.events-page .events-container .event-tx-container{line-height:26px}@media screen and (max-width: 768px){.events-page .events-container .event-tx-container{display:flex;flex-direction:column}}.events-page .events-container .event-tx-container .event-name{width:66px;height:26px;line-height:26px;border-radius:3px;font-size:14px;font-weight:bold;text-align:left;color:#ffffff;padding:5px;margin-right:5px}@media screen and (max-width: 768px){.events-page .events-container .event-tx-container .event-name{width:fit-content}}.events-page .events-container .event-tx-container .event-txhash{font-size:14px;text-align:left;color:#5c34a2;text-decoration:none}.events-page .events-container .event-tx-container .event-copy-tx{cursor:pointer;margin-left:10px}.events-page .events-container .event-recipient{font-size:14px;text-align:left;color:#5c34a2;text-decoration:none}.events-page .events-container .event-recipient-label{color:#333333}.events-page .events-container .event-value{font-size:14px;text-align:left;color:#333333}.events-page .events-container .event-block{font-size:14px;text-align:right;color:#333333}@media screen and (max-width: 768px){.events-page .events-container .event-block{text-align:left}}.events-page .events-container .event-separator{width:100%;height:1px;background-color:#e4e4e4}.green{color:#21b969}.red{color:#ff124f}.purple{color:#642f9c}.blue{color:#3ab9fe}.background-green{background-color:#60dc97}.background-red{background-color:#f13662}.background-purple{background-color:#642f9c}.background-blue{background-color:#3ab9fe}@keyframes fadeOut{0%{opacity:.2}20%{opacity:1;transform:scale(1)}100%{opacity:.2;transform:scale(0.3)}}.loading{width:234px;height:50px}.loading-container{position:fixed;z-index:1000000;left:0;right:0;top:0;bottom:0;background-color:rgba(78,44,137,0.9);display:flex;justify-content:center;align-items:center}.loading-i{width:2px;height:50px;border-radius:1px;background-color:#60db97;animation-duration:2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:fadeOut;animation-timing-function:linear;opacity:.2}.loading-i:nth-child(2){animation-delay:.1s}.loading-text{text-align:center;width:500px;font-size:24px;font-weight:normal;font-style:normal;font-stretch:normal;line-height:3;letter-spacing:normal;color:#ffffff}@media screen and (max-width: 414px){.loading-text{font-size:18px}}@media screen and (max-width: 414px){.mobile-container{flex-direction:column}}.network-modal{display:flex;justify-content:center;align-items:center;overflow-y:scroll}.network-modal .modal{min-width:558px;border-radius:10px;position:relative;min-height:410px}@media screen and (max-width: 768px){.network-modal .modal{top:30px}}@media screen and (max-width: 600px){.network-modal .modal{top:60px}}@media screen and (max-width: 414px){.network-modal .modal{min-width:100%;top:0}}.network-modal .modal .title{margin-bottom:20px;text-transform:uppercase;font-size:24px;font-weight:bold}.network-modal .modal .description{margin-bottom:25px;color:#8197a2;line-height:24px;font-size:13px}.network-modal .modal .close-button{position:absolute;top:40px;right:-40px;z-index:400000;padding:15px}.network-modal .modal .close-button i.icon:before{content:url("../images/icons/close.svg")}.network-modal .modal .close-button:hover{cursor:pointer}@media screen and (max-width: 600px){.network-modal .modal .close-button{right:-10px}}@media screen and (max-width: 414px){.network-modal .modal .close-button{top:-40px;right:0}}.status-page{display:flex;justify-content:center}.status-page .status-page-container{width:70%;display:flex;flex-direction:column}@media screen and (max-width: 768px){.status-page .status-page-container{width:90%}}.status-page .status-page-container .status-title{font-size:24px;line-height:3;text-align:left;color:#333333}.status-page .status-page-container .status-configuration-container{display:flex;flex-direction:column;padding-top:30px}.status-page .status-page-container .status-configuration-container .status-configuration-data{display:flex;justify-content:space-evenly}@media screen and (max-width: 768px){.status-page .status-page-container .status-configuration-container .status-configuration-data{flex-direction:column}}.status-page .status-page-container .status-authorities-container{display:flex;flex-direction:column;margin-top:80px}.status-page .status-page-container .status-authorities-container .status-authorities-title{padding-bottom:30px}.status-page .status-page-container .status-authorities-container .status-authorities-data{display:flex;flex-direction:column}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority{display:flex;padding-bottom:20px}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-number{font-size:30px;font-weight:bold;line-height:59px;text-align:left;color:#5c34a2;padding-right:20px}@media screen and (max-width: 768px){.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-number{padding-right:5px}}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-logo{padding-left:20px;width:59px;height:59px}@media screen and (max-width: 768px){.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-logo{display:none}}.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-address{font-size:16px;font-weight:bold;line-height:59px;text-align:left;color:#333333;padding-left:20px}@media screen and (max-width: 768px){.status-page .status-page-container .status-authorities-container .status-authorities-data .authority .authority-address{font-size:12px;padding-left:0}}.status-page .status-left-container{width:15%;padding-top:25px}@media screen and (max-width: 414px){.status-page .status-left-container{display:none}}.status-page .status-right-container{width:15%;padding-top:25px;overflow:hidden}@media screen and (max-width: 414px){.status-page .status-right-container{display:none}}.statistics-page{display:flex;justify-content:center}.statistics-page .statistics-page-container{width:70%;display:flex;flex-direction:column}@media screen and (max-width: 768px){.statistics-page .statistics-page-container{width:90%}}.statistics-page .statistics-page-container .statistics-title{font-size:24px;line-height:3;text-align:left;color:#333333}.statistics-page .statistics-page-container .statistics-bridge-container{display:flex;flex-direction:column;padding-top:30px}.statistics-page .statistics-page-container .statistics-bridge-container .statistics-bridge-data{display:flex;justify-content:space-evenly}@media screen and (max-width: 768px){.statistics-page .statistics-page-container .statistics-bridge-container .statistics-bridge-data{flex-direction:column}}.statistics-page .statistics-page-container .statistics-transaction-container{display:flex;justify-content:space-between;padding-top:90px}.statistics-page .statistics-page-container .statistics-transaction-container .statistics-deposit-container{width:40%}.statistics-page .statistics-page-container .statistics-transaction-container .statistics-withdraw-container{width:40%;margin-bottom:80px}.statistics-page .statistics-page-container .statistics-transaction-container .statistics-bridge-data{display:flex;justify-content:space-evenly}@media screen and (max-width: 768px){.statistics-page .statistics-page-container .statistics-transaction-container .statistics-bridge-data{flex-direction:column}}.statistics-page .statistics-left-container{width:15%;padding-top:25px}@media screen and (max-width: 414px){.statistics-page .statistics-left-container{display:none}}.statistics-page .statistics-right-container{width:15%;padding-top:25px;overflow:hidden}@media screen and (max-width: 414px){.statistics-page .statistics-right-container{display:none}} diff --git a/src/assets/stylesheets/application/header.scss b/src/assets/stylesheets/application/header.scss index 5cf864a8..dbe48671 100644 --- a/src/assets/stylesheets/application/header.scss +++ b/src/assets/stylesheets/application/header.scss @@ -32,7 +32,7 @@ display: flex; justify-content: space-between; align-items: center; - width: 600px; + max-width: 700px; @media screen and (max-width: $mobile-width) { display: none; @@ -57,7 +57,7 @@ } .link { - margin-left: 30px; + margin: 0 15px; line-height: 16px; text-decoration: none; font-weight: bold; From 305b80ba51e5ca77965498c78142247d68a44c08 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Mon, 10 Dec 2018 08:57:28 -0300 Subject: [PATCH 12/17] Update README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4987767b..05b6776b 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,8 @@ REACT_APP_HOME_HTTP_PARITY_URL | http public rpc node for Foreign Network REACT_APP_HOME_NATIVE_NAME | name of the home native coin REACT_APP_HOME_NETWORK_NAME | name to be displayed for home network REACT_APP_FOREIGN_NETWORK_NAME | name to be displayed for foreign network +REACT_APP_HOME_WITHOUT_EVENTS | set it to `1` if home network doesn't support events +REACT_APP_FOREIGN_WITHOUT_EVENTS | set it to `1` if foreign network doesn't support events REACT_APP_HOME_EXPLORER_TX_TEMPLATE | template link to transaction on home explorer. `%s` will be replaced by transaction hash REACT_APP_FOREIGN_EXPLORER_TX_TEMPLATE | template link to transaction on foreign explorer. `%s` will be replaced by transaction hash REACT_APP_HOME_EXPLORER_ADDRESS_TEMPLATE | template link to address on home explorer. `%s` will be replaced by address @@ -177,6 +179,7 @@ REACT_APP_FOREIGN_GAS_PRICE_ORACLE_URL | The URL used to get a JSON response fro REACT_APP_FOREIGN_GAS_PRICE_SPEED_TYPE | Gas Price speed (slow, standard, fast, instant) REACT_APP_FOREIGN_GAS_PRICE_FALLBACK | The gas price (in Wei) that is used if both the oracle and the fall back gas price specified in the Foreign Bridge contract are not available. REACT_APP_FOREIGN_GAS_PRICE_UPDATE_INTERVAL | An interval in milliseconds used to get the updated gas price value either from the oracle or from the Foreign Bridge contract. +REACT_APP_DESCRIPTION | The meta description for the deployed bridge page * Run `npm run start` * Make sure your web3 wallet (Nifty Wallet or MetaMask) is funded and connected to the POA Sokol Network (see step 2) From 26d8b5bf11a3c972895c384ad3c6879936cce8a7 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Mon, 10 Dec 2018 10:31:55 -0300 Subject: [PATCH 13/17] Change `_WITHOUT_EVENTS` constants to be used as boolean values --- .env.example | 6 +++--- README.md | 4 ++-- package-lock.json | 5 +++++ package.json | 3 ++- src/components/Header.js | 3 ++- src/components/StatisticsPage.js | 3 ++- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.env.example b/.env.example index bda8b7bd..254dfa27 100644 --- a/.env.example +++ b/.env.example @@ -7,9 +7,9 @@ REACT_APP_HOME_NATIVE_NAME=POA REACT_APP_HOME_NETWORK_NAME="POA Sokol" REACT_APP_FOREIGN_NETWORK_NAME=Kovan -# Uncomment the constant for the network that don't support events -#REACT_APP_HOME_WITHOUT_EVENTS=1 -#REACT_APP_FOREIGN_WITHOUT_EVENTS=1 +# Set to true if network doesn't support events +REACT_APP_HOME_WITHOUT_EVENTS=false +REACT_APP_FOREIGN_WITHOUT_EVENTS=false REACT_APP_HOME_EXPLORER_TX_TEMPLATE=https://blockscout.com/poa/sokol/tx/%s REACT_APP_FOREIGN_EXPLORER_TX_TEMPLATE=https://blockscout.com/eth/kovan/tx/%s diff --git a/README.md b/README.md index 05b6776b..42df12c7 100644 --- a/README.md +++ b/README.md @@ -165,8 +165,8 @@ REACT_APP_HOME_HTTP_PARITY_URL | http public rpc node for Foreign Network REACT_APP_HOME_NATIVE_NAME | name of the home native coin REACT_APP_HOME_NETWORK_NAME | name to be displayed for home network REACT_APP_FOREIGN_NETWORK_NAME | name to be displayed for foreign network -REACT_APP_HOME_WITHOUT_EVENTS | set it to `1` if home network doesn't support events -REACT_APP_FOREIGN_WITHOUT_EVENTS | set it to `1` if foreign network doesn't support events +REACT_APP_HOME_WITHOUT_EVENTS | `true` if home network doesn't support events +REACT_APP_FOREIGN_WITHOUT_EVENTS | `true` if foreign network doesn't support events REACT_APP_HOME_EXPLORER_TX_TEMPLATE | template link to transaction on home explorer. `%s` will be replaced by transaction hash REACT_APP_FOREIGN_EXPLORER_TX_TEMPLATE | template link to transaction on foreign explorer. `%s` will be replaced by transaction hash REACT_APP_HOME_EXPLORER_ADDRESS_TEMPLATE | template link to address on home explorer. `%s` will be replaced by address diff --git a/package-lock.json b/package-lock.json index b73d46bd..f01eb400 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17643,6 +17643,11 @@ "buffer-crc32": "0.2.13", "fd-slicer": "1.0.1" } + }, + "yn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", + "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==" } } } diff --git a/package.json b/package.json index 3e693f7f..07f0e8a8 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "react-transition-group": "^2.2.1", "selenium-webdriver": "^3.6.0", "sweetalert": "^2.1.0", - "web3": "^1.0.0-beta.30" + "web3": "^1.0.0-beta.30", + "yn": "^3.0.0" }, "scripts": { "build-css": "node-sass-chokidar src/assets/stylesheets/application.scss -o src/assets/stylesheets --output-style=compressed", diff --git a/src/components/Header.js b/src/components/Header.js index e7dda255..30e8b034 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -6,6 +6,7 @@ import menuOpenIcon from '../assets/images/icons/icon-close.svg' import { Wallet } from './Wallet' import { DailyQuotaModal } from './DailyQuotaModal' import { inject, observer } from 'mobx-react/index' +import yn from 'yn' const getMobileMenuLinks = (onMenuToggle, withoutEvents) => (
@@ -29,7 +30,7 @@ export class Header extends React.Component { render () { const { showMobileMenu, onMenuToggle, RootStore: { alertStore, web3Store } } = this.props const { REACT_APP_HOME_WITHOUT_EVENTS: HOME, REACT_APP_FOREIGN_WITHOUT_EVENTS: FOREIGN } = process.env - const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? HOME : FOREIGN + const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? yn(HOME) : yn(FOREIGN) return (
{showMobileMenu && (
{getMobileMenuLinks(onMenuToggle, withoutEvents)}
)} diff --git a/src/components/StatisticsPage.js b/src/components/StatisticsPage.js index 08e47f3e..87a4d15c 100644 --- a/src/components/StatisticsPage.js +++ b/src/components/StatisticsPage.js @@ -4,6 +4,7 @@ import pattern from '../assets/images/pattern.svg' import { BridgeStatistics } from './index' import { TransactionsStatistics } from './TransactionsStatistics' import { BRIDGE_MODES } from '../stores/utils/bridgeMode' +import yn from 'yn' @inject("RootStore") @observer @@ -15,7 +16,7 @@ export class StatisticsPage extends React.Component { const leftTitle = isNativeToErc ? 'Deposits' : 'Withdraws' const rightTitle = isNativeToErc ? 'Withdraws' : 'Deposits' const { REACT_APP_HOME_WITHOUT_EVENTS: HOME, REACT_APP_FOREIGN_WITHOUT_EVENTS: FOREIGN } = process.env - const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? HOME : FOREIGN + const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? yn(HOME) : yn(FOREIGN) return(
From a6f0ec39b20dc16a29423d4f8a423616a22b08f2 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Mon, 10 Dec 2018 10:38:17 -0300 Subject: [PATCH 14/17] Use `validatorsCount` for 'Authorities' in status page --- src/components/StatusPage.js | 2 +- src/stores/ForeignStore.js | 4 +++- src/stores/HomeStore.js | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/StatusPage.js b/src/components/StatusPage.js index 52d42d84..5db7658a 100644 --- a/src/components/StatusPage.js +++ b/src/components/StatusPage.js @@ -13,7 +13,7 @@ export class StatusPage extends React.Component { const { homeStore, foreignStore, web3Store } = this.props.RootStore const isHome = web3Store.metamaskNet.id.toString() === web3Store.homeNet.id.toString() const requiredSignatures = isHome ? homeStore.requiredSignatures : foreignStore.requiredSignatures - const authorities = isHome ? homeStore.validators.length : foreignStore.validators.length + const authorities = isHome ? homeStore.validatorsCount : foreignStore.validatorsCount const symbol = isHome ? homeStore.symbol : foreignStore.symbol const maxSingleDeposit = isHome ? homeStore.maxPerTx : foreignStore.maxPerTx const maxTotalBalance = isHome ? homeStore.maxCurrentDeposit : foreignStore.maxCurrentDeposit diff --git a/src/stores/ForeignStore.js b/src/stores/ForeignStore.js index 7caa5e54..0eade968 100644 --- a/src/stores/ForeignStore.js +++ b/src/stores/ForeignStore.js @@ -34,6 +34,7 @@ class ForeignStore { @observable minPerTx = ''; @observable latestBlockNumber = 0; @observable validators = [] + @observable validatorsCount = 0 @observable foreignBridgeValidators = '' @observable requiredSignatures = 0 @observable dailyLimit = 0 @@ -278,8 +279,9 @@ class ForeignStore { try { const foreignValidatorsAddress = await this.foreignBridge.methods.validatorContract().call() this.foreignBridgeValidators = new this.foreignWeb3.eth.Contract(BRIDGE_VALIDATORS_ABI, foreignValidatorsAddress); - this.validators = await getBridgeValidators(this.foreignBridgeValidators) + this.validators = await getBridgeValidators(this.foreignBridgeValidators) this.requiredSignatures = await this.foreignBridgeValidators.methods.requiredSignatures().call() + this.validatorsCount = await this.foreignBridgeValidators.methods.validatorCount().call() } catch(e){ console.error(e) } diff --git a/src/stores/HomeStore.js b/src/stores/HomeStore.js index d021000b..8923b99c 100644 --- a/src/stores/HomeStore.js +++ b/src/stores/HomeStore.js @@ -42,6 +42,7 @@ class HomeStore { @observable maxPerTx = ""; @observable latestBlockNumber = 0; @observable validators = [] + @observable validatorsCount = 0 @observable homeBridgeValidators = '' @observable requiredSignatures = 0 @observable dailyLimit = 0 @@ -295,8 +296,9 @@ class HomeStore { try { const homeValidatorsAddress = await this.homeBridge.methods.validatorContract().call() this.homeBridgeValidators = new this.homeWeb3.eth.Contract(BRIDGE_VALIDATORS_ABI, homeValidatorsAddress); - this.validators = await getBridgeValidators(this.homeBridgeValidators) + this.validators = await getBridgeValidators(this.homeBridgeValidators) this.requiredSignatures = await this.homeBridgeValidators.methods.requiredSignatures().call() + this.validatorsCount = await this.homeBridgeValidators.methods.validatorCount().call() } catch(e){ console.error(e) } From 42513c1673ab8e55e25eefd142d21771ae2b81f8 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Mon, 10 Dec 2018 11:39:36 -0300 Subject: [PATCH 15/17] Prevent rendering `events` and `statistic` for non-event based networks - Remove link from menu - Redirect to `/` if trying to access directly --- package-lock.json | 30 ++++++++++++++++++++++++------ package.json | 1 + src/components/Header.js | 16 ++++++++++------ src/components/RelayEvents.js | 8 ++++++-- src/components/StatisticsPage.js | 28 ++++++++++++++-------------- 5 files changed, 55 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index f01eb400..e17d64f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14120,17 +14120,35 @@ "integrity": "sha512-FlsPxavEyMuR6TjVbSSywovXSEyOg6ZDj5+Z8nbsRl9EkOzAhEIcS+GLoQDC5fz/t9suhUXWmUrOBrgeUvrMxw==" }, "react-router": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", - "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", + "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", "requires": { "history": "4.7.2", "hoist-non-react-statics": "2.5.0", - "invariant": "2.2.3", + "invariant": "2.2.4", "loose-envify": "1.3.1", "path-to-regexp": "1.7.0", "prop-types": "15.6.1", - "warning": "3.0.0" + "warning": "4.0.2" + }, + "dependencies": { + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "1.3.1" + } + }, + "warning": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz", + "integrity": "sha512-wbTp09q/9C+jJn4KKJfJfoS6VleK/Dti0yqWSm6KMvJ4MRCXFQNapHuJXutJIrWV0Cf4AhTdeIe4qdKHR1+Hug==", + "requires": { + "loose-envify": "1.3.1" + } + } } }, "react-router-dom": { @@ -14142,7 +14160,7 @@ "invariant": "2.2.3", "loose-envify": "1.3.1", "prop-types": "15.6.1", - "react-router": "4.2.0", + "react-router": "4.3.1", "warning": "3.0.0" } }, diff --git a/package.json b/package.json index 07f0e8a8..238b4167 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "react-app-rewired": "^1.5.0", "react-copy-to-clipboard": "^5.0.1", "react-dom": "^16.2.0", + "react-router": "^4.3.1", "react-router-dom": "^4.2.2", "react-scripts": "1.1.1", "react-transition-group": "^2.2.1", diff --git a/src/components/Header.js b/src/components/Header.js index 30e8b034..a825a99b 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -18,9 +18,11 @@ const getMobileMenuLinks = (onMenuToggle, withoutEvents) => Status - - Statistics - + {withoutEvents ? null : + + Statistics + + }
) @@ -46,9 +48,11 @@ export class Header extends React.Component { Status - - Statistics - + {withoutEvents ? null : + + Statistics + + }
diff --git a/src/components/RelayEvents.js b/src/components/RelayEvents.js index 129fa771..c2befb40 100644 --- a/src/components/RelayEvents.js +++ b/src/components/RelayEvents.js @@ -2,6 +2,8 @@ import React from 'react'; import { inject, observer } from "mobx-react"; import { EventsListHeader } from './index' import { Event } from './index' +import yn from 'yn' +import { Redirect } from 'react-router' const WAIT_INTERVAL = 700; @@ -132,12 +134,14 @@ export class RelayEvents extends React.Component { } render(){ - const { homeStore, foreignStore } = this.props.RootStore + const { homeStore, foreignStore, web3Store } = this.props.RootStore const { selectedList } = this.state const home = this.getHomeEvents(homeStore, foreignStore) const foreign = this.getForeignEvents(foreignStore, homeStore) + const { REACT_APP_HOME_WITHOUT_EVENTS: HOME, REACT_APP_FOREIGN_WITHOUT_EVENTS: FOREIGN } = process.env + const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? yn(HOME) : yn(FOREIGN) - return( + return withoutEvents ? () : (
) : (
- {withoutEvents ? null : -
- Bridge Statistics - -
- } +
+ Bridge Statistics + +
Tokens {leftTitle} From 03c3bc055dc882fc336b6c2e19faef17091acabd Mon Sep 17 00:00:00 2001 From: fernandomg Date: Mon, 10 Dec 2018 11:43:08 -0300 Subject: [PATCH 16/17] Prevent from displaying 'Authorities' in `status` page, if the network doesn't support events --- src/components/StatusPage.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/components/StatusPage.js b/src/components/StatusPage.js index 5db7658a..5993f40e 100644 --- a/src/components/StatusPage.js +++ b/src/components/StatusPage.js @@ -3,6 +3,7 @@ import { inject, observer } from "mobx-react" import { Configuration } from './Configuration' import { Authority } from './Authority' import pattern from '../assets/images/pattern.svg' +import yn from 'yn' @inject("RootStore") @@ -18,6 +19,9 @@ export class StatusPage extends React.Component { const maxSingleDeposit = isHome ? homeStore.maxPerTx : foreignStore.maxPerTx const maxTotalBalance = isHome ? homeStore.maxCurrentDeposit : foreignStore.maxCurrentDeposit const validatorsList = isHome ? homeStore.validators : foreignStore.validators + const { REACT_APP_HOME_WITHOUT_EVENTS: HOME, REACT_APP_FOREIGN_WITHOUT_EVENTS: FOREIGN } = process.env + const withoutEvents = web3Store.metamaskNet.id === web3Store.homeNet.id.toString() ? yn(HOME) : yn(FOREIGN) + return (
@@ -31,14 +35,16 @@ export class StatusPage extends React.Component { maxSingleDeposit={maxSingleDeposit} maxTotalBalance={maxTotalBalance} />
-
- Authorities -
- {validatorsList.map((validator,i) => ( - - ))} + {withoutEvents ? null : +
+ Authorities +
+ {validatorsList.map((validator,i) => ( + + ))} +
-
+ }
From 671f054256acdecded2d7cbb90ad522114d4ecd3 Mon Sep 17 00:00:00 2001 From: fernandomg Date: Mon, 10 Dec 2018 20:57:51 -0300 Subject: [PATCH 17/17] Remove dependency incompatible with `react-scripts-v1.1.1` - Remove dependency - Create local utils with the same evaluations than `yn` --- package-lock.json | 5 ----- package.json | 3 +-- src/components/Header.js | 2 +- src/components/RelayEvents.js | 2 +- src/components/StatisticsPage.js | 2 +- src/components/StatusPage.js | 2 +- src/components/utils/yn.js | 15 +++++++++++++++ 7 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 src/components/utils/yn.js diff --git a/package-lock.json b/package-lock.json index e17d64f3..12e6adcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17661,11 +17661,6 @@ "buffer-crc32": "0.2.13", "fd-slicer": "1.0.1" } - }, - "yn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", - "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==" } } } diff --git a/package.json b/package.json index 238b4167..2eac3524 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,7 @@ "react-transition-group": "^2.2.1", "selenium-webdriver": "^3.6.0", "sweetalert": "^2.1.0", - "web3": "^1.0.0-beta.30", - "yn": "^3.0.0" + "web3": "^1.0.0-beta.30" }, "scripts": { "build-css": "node-sass-chokidar src/assets/stylesheets/application.scss -o src/assets/stylesheets --output-style=compressed", diff --git a/src/components/Header.js b/src/components/Header.js index a825a99b..b0ab60d0 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -6,7 +6,7 @@ import menuOpenIcon from '../assets/images/icons/icon-close.svg' import { Wallet } from './Wallet' import { DailyQuotaModal } from './DailyQuotaModal' import { inject, observer } from 'mobx-react/index' -import yn from 'yn' +import yn from './utils/yn' const getMobileMenuLinks = (onMenuToggle, withoutEvents) => (
diff --git a/src/components/RelayEvents.js b/src/components/RelayEvents.js index c2befb40..31344111 100644 --- a/src/components/RelayEvents.js +++ b/src/components/RelayEvents.js @@ -2,7 +2,7 @@ import React from 'react'; import { inject, observer } from "mobx-react"; import { EventsListHeader } from './index' import { Event } from './index' -import yn from 'yn' +import yn from './utils/yn' import { Redirect } from 'react-router' diff --git a/src/components/StatisticsPage.js b/src/components/StatisticsPage.js index 856a50a1..6990f529 100644 --- a/src/components/StatisticsPage.js +++ b/src/components/StatisticsPage.js @@ -4,7 +4,7 @@ import pattern from '../assets/images/pattern.svg' import { BridgeStatistics } from './index' import { TransactionsStatistics } from './TransactionsStatistics' import { BRIDGE_MODES } from '../stores/utils/bridgeMode' -import yn from 'yn' +import yn from './utils/yn' import { Redirect } from 'react-router' @inject("RootStore") diff --git a/src/components/StatusPage.js b/src/components/StatusPage.js index 5993f40e..43549dcf 100644 --- a/src/components/StatusPage.js +++ b/src/components/StatusPage.js @@ -3,7 +3,7 @@ import { inject, observer } from "mobx-react" import { Configuration } from './Configuration' import { Authority } from './Authority' import pattern from '../assets/images/pattern.svg' -import yn from 'yn' +import yn from './utils/yn' @inject("RootStore") diff --git a/src/components/utils/yn.js b/src/components/utils/yn.js new file mode 100644 index 00000000..fe74889b --- /dev/null +++ b/src/components/utils/yn.js @@ -0,0 +1,15 @@ +const yn = input => { + input = String(input).trim(); + + if (/^(?:y|yes|true|1)$/i.test(input)) { + return true; + } + + if (/^(?:n|no|false|0)$/i.test(input)) { + return false; + } + + return false; +}; + +export default yn