diff --git a/package-lock.json b/package-lock.json index 1fb703d..9280d59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1095,10 +1095,13 @@ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", "dev": true }, - "@decent-bet/contract-migration": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@decent-bet/contract-migration/-/contract-migration-1.0.1.tgz", - "integrity": "sha512-r/c9p+w9mqgq/s/F3siQRXYEaDDFojHMq2BDu++NPIqNDrjBOiW9wrssz56lgkhnt8cs+hBvfex7B1Y9GtK4Ug==" + "@decent-bet/contract-playdbet": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@decent-bet/contract-playdbet/-/contract-playdbet-1.0.3.tgz", + "integrity": "sha512-Cfiio9nRszUG1FsymLuZcpNeDON8BnBl+HIZO91DbZiT12bGqaqvr0iwDfAzBqak6ewwrAZq9tRwA8fTg6bSAQ==", + "requires": { + "ethereum-protocol": "^1.0.1" + } }, "@fortawesome/fontawesome": { "version": "1.1.8", @@ -7450,6 +7453,11 @@ } } }, + "ethereum-protocol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz", + "integrity": "sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==" + }, "ethereum-units": { "version": "0.0.1-b", "resolved": "https://registry.npmjs.org/ethereum-units/-/ethereum-units-0.0.1-b.tgz", diff --git a/package.json b/package.json index c9c1d5a..abf98b2 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "whatwg-fetch": "^2.0.3" }, "dependencies": { - "@decent-bet/contract-migration": "^1.0.0", + "@decent-bet/contract-playdbet": "^1.0.3", "@fortawesome/fontawesome": "^1.1.8", "@fortawesome/fontawesome-svg-core": "^1.2.6", "@fortawesome/free-brands-svg-icons": "^5.0.13", diff --git a/src/Components/Base/BalanceListener.ts b/src/Components/Base/BalanceListener.ts index 63ab564..b38ee62 100644 --- a/src/Components/Base/BalanceListener.ts +++ b/src/Components/Base/BalanceListener.ts @@ -1,51 +1,45 @@ - - import { Subscription, timer, from, zip, Observable } from 'rxjs' import { map, switchMap } from 'rxjs/operators' const LISTENER_INTERVAL = 8000 -export type ListenerParam = (result: { vthoBalance: number, ethBalance: number, updatedAt: Date }) => void +export type ListenerParam = ( + result: { vthoBalance: number; ethBalance: number; updatedAt: Date } +) => void export default class BalanceListener { private _subscription$: Subscription - constructor(private web3: any, - private thor: any,) {} + constructor(private thor: any) {} public onBalancesChange(listener: ListenerParam): BalanceListener { this.stop() - this._subscription$ = this.createBalanceSubscription() - .subscribe(listener) + this._subscription$ = this.createBalanceSubscription().subscribe( + listener + ) return this } public stop(): void { - if(this._subscription$) { + if (this._subscription$) { this._subscription$.unsubscribe() } } private createBalanceSubscription(): Observable { - // Polling works best with RPC endpoint - const web3Http = (window as any).web3Http - const web3DefaultAccount = this.web3.eth.defaultAccount const thorDefaultAccount = this.thor.eth.defaultAccount - + return timer(0, LISTENER_INTERVAL).pipe( - switchMap(() => zip( - from(this.thor.eth.getEnergy(thorDefaultAccount)), - from(web3Http.eth.getBalance(web3DefaultAccount)) - )), - map((i) => { - return { - vthoBalance: i[0], - ethBalance: i[1], - updatedAt: new Date() - } - }) - ) + switchMap(() => + zip(from(this.thor.eth.getEnergy(thorDefaultAccount))) + ), + map(i => { + return { + vthoBalance: i[0], + updatedAt: new Date() + } + }) + ) } - -} \ No newline at end of file +} diff --git a/src/Components/Base/Web3Loader.js b/src/Components/Base/Web3Loader.js index 5d55d92..e2f8841 100644 --- a/src/Components/Base/Web3Loader.js +++ b/src/Components/Base/Web3Loader.js @@ -14,17 +14,6 @@ const keyHandler = new KeyHandler() let initWeb3 = async () => { - let provider = new Web3.providers.WebsocketProvider(Config.gethUrl, { timeout: 60*60*1000 }) - - window.web3Http = new Web3(Config.gethRpcUrl) - window.web3Object = new Web3(provider) - - provider.on('error', e => console.error('WS Error', e)) - provider.on('end', e => { - provider = new Web3.providers.WebsocketProvider(Config.gethUrl, { timeout: 60*60*1000 }) - window.web3Object.setProvider(provider) - }) - window.thor = thorify( new Web3(), process.env.THOR_URL || Config.thorUrl @@ -35,7 +24,7 @@ let initWeb3 = async () => { }) - const contractHelper = new ContractHelper(window.web3Object, window.thor) + const contractHelper = new ContractHelper(window.thor) window.contractHelper = contractHelper window.web3Loaded = true EventBus.publish('web3Loaded') @@ -52,7 +41,6 @@ class Web3Loader { setDefaultAccounts() { if (keyHandler.isLoggedIn()) { - window.web3Object.eth.defaultAccount = keyHandler.getAddress() window.thor.eth.defaultAccount = keyHandler.getPubAddress().toLowerCase() } } diff --git a/src/Components/Dashboard/Dashboard.jsx b/src/Components/Dashboard/Dashboard.jsx index fea9139..c9b852d 100644 --- a/src/Components/Dashboard/Dashboard.jsx +++ b/src/Components/Dashboard/Dashboard.jsx @@ -44,14 +44,13 @@ class Dashboard extends Component { constructor(props) { super(props) this._balanceListener = new BalanceListener( - window.web3Object, window.thor ) i18n = getI18nFn(props.intl, messages) this.state = { view: props.view, - address: helper.getWeb3().eth.defaultAccount, + address: window.thor.eth.defaultAccount, ethNetwork: 0, ethBalance: { loading: true, @@ -92,28 +91,17 @@ class Dashboard extends Component { } setPubAddress(type) { - const selectedToken = type || this.state.selectedTokenContract + const vetPubAddress = keyHandler.getPubAddress() + this.setState({ + address: vetPubAddress + }) - if (selectedToken === '2') { - const vetPubAddress = keyHandler.getPubAddress() - this.setState({ - address: vetPubAddress - }) - } else { - this.setState({ - address: helper.getWeb3().eth.defaultAccount - }) - } } loadBalances = () => { this._balanceListener.onBalancesChange( - ({ ethBalance, vthoBalance }) => { + ({ vthoBalance }) => { this.setState({ - ethBalance: { - amount: helper.formatEther(ethBalance.toString()), - loading: false - }, vthoBalance: { amount: helper.formatEther(vthoBalance.toString()), loading: false @@ -279,10 +267,8 @@ class Dashboard extends Component { selectedTokenContract={this.state.selectedTokenContract} address={this.state.address} currency={this.state.currency} - ethBalance={this.state.ethBalance.amount} vthoBalance={this.state.vthoBalance.amount} isLoading={ - this.state.ethBalance.loading && this.state.vthoBalance.loading } onMenuToggle={this.onMenuToggle} @@ -317,7 +303,6 @@ class Dashboard extends Component { {this.renderAppBar()}
{ - if (contractType === constants.TOKEN_TYPE_DBET_TOKEN_VET) { - return ( - - ) - } return ( ) @@ -80,7 +70,6 @@ function DashboardAppBar({ @@ -88,9 +77,6 @@ function DashboardAppBar({ address={address} listener={onAddressCopyListener} /> -
diff --git a/src/Components/Dashboard/DashboardDrawer.jsx b/src/Components/Dashboard/DashboardDrawer.jsx index 99cd685..3fd90ec 100644 --- a/src/Components/Dashboard/DashboardDrawer.jsx +++ b/src/Components/Dashboard/DashboardDrawer.jsx @@ -205,51 +205,6 @@ class DashboardDrawer extends React.Component { className={this.props.classes.menuItem} iconClass={this.props.classes.icon} /> - - - - - - {this.state.isDrawerTokenVersionSubmenuOpen ? ( - - ) : ( - - )} - - - - {this.renderTokenVersionListItem( - i18n('V3Vet'), - constants.TOKEN_TYPE_DBET_TOKEN_VET - )} - - {this.renderTokenVersionListItem( - i18n('V2Current'), - constants.TOKEN_TYPE_DBET_TOKEN_NEW - )} - - {this.renderTokenVersionListItem( - i18n('V1Initial'), - constants.TOKEN_TYPE_DBET_TOKEN_OLD - )} - - - {/* { - return localStorage.getItem(constants.LS_KEY_SELECTED_TOKEN_CONTRACT) != - null - ? localStorage.getItem(constants.LS_KEY_SELECTED_TOKEN_CONTRACT) - : constants.DBET_VET_TOKEN_ADDRESS + return constants.TOKEN_TYPE_DBET_TOKEN_VET; } setSelectedTokenContract = type => { diff --git a/src/Components/Send/Send.jsx b/src/Components/Send/Send.jsx index f648364..7b509a6 100644 --- a/src/Components/Send/Send.jsx +++ b/src/Components/Send/Send.jsx @@ -62,7 +62,7 @@ class Send extends Component { super(props) i18n = getI18nFn(props.intl, messages) TOKEN_BALANCE_LOADING = i18n('Loading') - let address = helper.getWeb3().eth.defaultAccount + let address = window.thor.eth.defaultAccount console.log('Pending txs', pendingTxHandler.getTxs()) this.state = new SendState(address, props.selectedTokenContract) } @@ -92,16 +92,8 @@ class Send extends Component { } initWeb3Data = () => { - if ( - this.state.selectedTokenContract === - constants.TOKEN_TYPE_DBET_TOKEN_VET - ) { - this.vetTokenBalance() - this.loadEnergyCost() - } else { - this.oldTokenBalance() - this.newTokenBalance() - } + this.vetTokenBalance() + this.loadEnergyCost() } async loadEnergyCost(amount) { @@ -132,42 +124,6 @@ class Send extends Component { } } - async oldTokenBalance() { - const contracts = helper.getContractHelper() - try { - const balance = await contracts.V1Token.balanceOf( - helper.getWeb3().eth.defaultAccount - ) - let balances = this.state.balances - balances.oldToken = { - amount: helper.formatDbetsMax(balance), - loading: false - } - this.setState({ balances: balances }) - console.log('V1 token balance', balance) - } catch (err) { - console.log('dbetBalance V1 err', err.message) - } - } - - async newTokenBalance() { - const contracts = helper.getContractHelper() - try { - const balance = await contracts.V2Token.balanceOf( - helper.getWeb3().eth.defaultAccount - ) - let balances = this.state.balances - balances.newToken = { - amount: helper.formatDbetsMax(balance), - loading: false - } - this.setState({ balances: balances }) - console.log('V2 token balance', balance) - } catch (err) { - console.log('dbetBalance V2 err', err.message) - } - } - toggleDialog = (type, open) => { let dialogs = this.state.dialogs diff --git a/src/Components/Wallet/Wallet.jsx b/src/Components/Wallet/Wallet.jsx index e816222..45f16a2 100644 --- a/src/Components/Wallet/Wallet.jsx +++ b/src/Components/Wallet/Wallet.jsx @@ -124,23 +124,10 @@ class Wallet extends Component { } get isLoading() { - if ( - this.state.selectedTokenContract === - constants.TOKEN_TYPE_DBET_TOKEN_VET - ) { - let { newVETToken, vet } = this.state.balances - return ( - newVETToken.loading || vet.loading || this.isLoadingTransactions - ) - } else { - let { oldToken, newToken, eth } = this.state.balances - return ( - oldToken.loading || - newToken.loading || - eth.loading || - this.isLoadingTransactions - ) - } + let { newVETToken, vet } = this.state.balances + return ( + newVETToken.loading || vet.loading || this.isLoadingTransactions + ) } static getDerivedStateFromProps(props, state) { @@ -200,28 +187,14 @@ class Wallet extends Component { web3Loaded() }) } - const contracts = helper.getContractHelper() - progressBarSubscription = contracts.DepositToVET.onProgress.subscribe(i => { - this.updateVETUpgradeStatus(i.status) - }) } initWeb3Data = async () => { - if ( - this.state.selectedTokenContract === - constants.TOKEN_TYPE_DBET_TOKEN_VET - ) { - this.setState({ - address: window.thor.eth.defaultAccount.toLowerCase() - }) - await this.getVETTokenBalance() - } else { - let address = helper.getWeb3().eth.defaultAccount.toLowerCase() - this.setState({ address }) - this.pendingTransactions() - } + this.setState({ + address: window.thor.eth.defaultAccount.toLowerCase() + }) + await this.getVETTokenBalance() - await this.getEthTokenBalances() let balances = this.state.balances balances.vet = { loading: false, @@ -236,17 +209,7 @@ class Wallet extends Component { } initWatchers = async () => { - if ( - this.state.selectedTokenContract !== - constants.TOKEN_TYPE_DBET_TOKEN_VET - ) { - await this.parseTransactions() - } else if ( - this.state.selectedTokenContract === - constants.TOKEN_TYPE_DBET_TOKEN_VET - ) { - await this.listVETTransactions() - } + await this.listVETTransactions(); } async listVETTransactions() { @@ -303,73 +266,15 @@ class Wallet extends Component { console.log('dbetBalance VET token err', err.message) } } - /** - * Ethereum v1/v2 Token Balance - */ - getEthTokenBalances = async () => { - try { - const contracts = helper.getContractHelper() - const v1TokenBalance = await contracts.V1TokenHttp.balanceOf( - helper.getWeb3().eth.defaultAccount - ) - const v2TokenBalance = await contracts.V2TokenHttp.balanceOf( - helper.getWeb3().eth.defaultAccount - ) - - const hasV1Balance = v1TokenBalance > 0 - const hasV2Balance = v2TokenBalance > 0 - if ( - (hasV1Balance || hasV2Balance) && - this.state.selectedTokenContract === - constants.TOKEN_TYPE_DBET_TOKEN_VET - ) { - this.showVETTokenUpgradeNotification( - v1TokenBalance, - v2TokenBalance - ) - } - - let balances = this.state.balances - balances.newToken = { - loading: false, - amount: v2TokenBalance - } - balances.oldToken = { - loading: false, - amount: v1TokenBalance - } - this.setState({ balances: balances }) - } catch (err) { - log.error(`Wallet.jsx: dbetBalance: ${err.stack}`) - console.log('dbetBalance newToken err', err.stack) - } - } + + pendingTransactions = () => { pendingTxHandler.getTxs().forEach(this.parsePendingTransaction) } - parsePendingTransaction = tx => { - helper.getWeb3().eth.getTransaction(tx.hash, (err, _tx) => { - let transactions = this.state.transactions - if (!err) { - if (!_tx && tx.tokenType === this.state.selectedTokenContract) { - // Remove pending tx if it has been stuck at pending for a day or more - if (tx.timestamp <= helper.getTimestamp() - 86400) - pendingTxHandler.removeTx(tx.hash) - else this.addPendingTransaction(tx, transactions) - } else this.switchPendingTransactionToConfirmed(tx, _tx) - } else { - if (tx.tokenType === this.state.selectedTokenContract) - this.addPendingTransaction(tx, transactions) - } - this.setState({ transactions: transactions }) - }) - } - - getBlock = (blockNumber, callback) => { - helper.getWeb3().eth.getBlock(blockNumber, callback) - } + + addConfirmedTransactions = (res, transactions) => { const items = res.map(tx => { @@ -442,22 +347,8 @@ class Wallet extends Component { let dbets let balanceIsLoading = true - switch (this.state.selectedTokenContract) { - case constants.TOKEN_TYPE_DBET_TOKEN_NEW: - balanceIsLoading = this.state.balances.newToken.loading - dbets = this.state.balances.newToken.amount - break - case constants.TOKEN_TYPE_DBET_TOKEN_OLD: - balanceIsLoading = this.state.balances.oldToken.loading - dbets = this.state.balances.oldToken.amount - break - case constants.TOKEN_TYPE_DBET_TOKEN_VET: - balanceIsLoading = this.state.balances.newVETToken.loading - dbets = this.state.balances.newVETToken.amount - break - default: - break - } + balanceIsLoading = this.state.balances.newVETToken.loading + dbets = this.state.balances.newVETToken.amount if(!balanceIsLoading) { const balance = helper.formatDbets(dbets) @@ -601,145 +492,6 @@ class Wallet extends Component { } } - /** - * Main ETH to VET Upgrade call - */ - onVETUpgradeListener = async () => { - this.updateVETUpgradeStatus(null) - - const contracts = helper.getContractHelper() - - let V1TokenBalance = this.state.balances.oldToken.amount - let V2TokenBalance = this.state.balances.newToken.amount - const vetAddress = keyHandler.getPubAddress() - - - try { - const address = helper.getWeb3().eth.defaultAccount - await this.depositToken({ - version: `V1`, - balance: V1TokenBalance, - vetAddress - }) - await this.depositToken({ - version: `V2`, - balance: V2TokenBalance, - vetAddress - }) - try { - const checkV1TokenDeposit = (_address, amount, isV2, index) => { - console.log(`V1 index: ${index}`) - return ( - _address === address && - amount.toString() === V1TokenBalance.toString() && - isV2 === false - ) - } - const checkV2TokenDeposit = (_address, amount, isV2, index) => { - console.log(`V2 index: ${index}`) - return ( - _address === address && - amount.toString() === V2TokenBalance.toString() && - isV2 === true - ) - } - - await contracts.DepositToVET.watchForDeposits( - checkV1TokenDeposit, - checkV2TokenDeposit, - log => { - console.log(log) - let transactions = this.state.transactions - transactions = { - ...transactions, - pending: { - ...transactions.pending, - log - } - } - this.setState({ transactions }) - } - ) - } catch (err) { - console.log(`Timeout`) - } - this.refresh() - } catch (e) { - log.error(`Wallet.jsx: onVETUpgradeListener: ${e}`) - this.toggleDialog(DIALOG_ERROR, true) - } - this.updateVETUpgradeStatus(null) - this.toggleDialog(DIALOG_VET_TOKEN_UPGRADE, false) - } - - onUpgradeListener = () => { - const contracts = helper.getContractHelper() - let privateKey = this.state.dialogs.upgrade.tokenUpgrade.key - let address = keyHandler.getAddress() - let oldTokenBalance = this.state.balances.oldToken.amount - - let callback = (err, res) => { - if (!err) { - this.cachePendingTransaction( - res, - helper.getWeb3().eth.defaultAccount, - helper.formatDbets(oldTokenBalance) - ) - this.refresh() - } else { - this.toggleDialog(DIALOG_ERROR, true) - } - this.toggleDialog(DIALOG_TOKEN_UPGRADE, false) - } - - contracts.V1Token.upgrade( - address, - privateKey, - oldTokenBalance, - callback - ) - } - - renderTokenUpgradeDialog = () => { - let balance = this.state.balances.oldToken.loading - ? TOKEN_BALANCE_LOADING - : helper.formatDbets(this.state.balances.oldToken.amount) - let ethBalance = this.props.ethBalance - return ( - - ) - } - - renderVETTokenUpgradeDialog = () => { - const vetPubAddress = keyHandler.getPubAddress() - let v1Balance = this.state.balances.oldToken.loading - ? TOKEN_BALANCE_LOADING - : helper.formatDbets(this.state.balances.oldToken.amount) - let v2Balance = this.state.balances.newToken.loading - ? TOKEN_BALANCE_LOADING - : helper.formatDbets(this.state.balances.newToken.amount) - let ethBalance = this.props.ethBalance - - return ( - - ) - } renderTop() { const address = keyHandler.getPubAddress() @@ -786,8 +538,6 @@ class Wallet extends Component { isOpen={this.state.dialogs.upgradeToVET.learnMore.open} onCloseListener={this.onVETLearnMoreDialogCloseListener} /> - {this.renderTokenUpgradeDialog()} - {this.renderVETTokenUpgradeDialog()} - - this.toggleDialog(DIALOG_MIGRATION_SNACKBAR, false) - } - onAccept={this.onVETUpgradeOpenListener} - onLearnMore={this.onVETLearnMoreDialogOpenListener} - /> ) } diff --git a/src/Components/Web3/ContractHelper.ts b/src/Components/Web3/ContractHelper.ts index b211f01..c09271d 100644 --- a/src/Components/Web3/ContractHelper.ts +++ b/src/Components/Web3/ContractHelper.ts @@ -15,16 +15,9 @@ export default class ContractHelper { * * @param {Web3} web3Param */ - constructor(web3Param: Web3, thor: Web3) { - this.web3 = web3Param - + constructor(thor: Web3) { // Initialize new Contracts - this.v1TokenContract = new DBETV1TokenContract(this.web3) - this.v2TokenContract = new DBETV2TokenContract(this.web3) - this.v1TokenContract_Http = new DBETV1TokenContract((window as any).web3Http) - this.v2TokenContract_Http = new DBETV2TokenContract((window as any).web3Http) - this.depositContract = new DBETToVETDepositContract(this.web3, thor) - this.vetContract = new DBETVETTokenContract(this.web3, thor) + this.vetContract = new DBETVETTokenContract(thor) } diff --git a/src/Components/Web3/Contracts/DBETToVETDepositContract.ts b/src/Components/Web3/Contracts/DBETToVETDepositContract.ts index fe5be03..66aac9e 100644 --- a/src/Components/Web3/Contracts/DBETToVETDepositContract.ts +++ b/src/Components/Web3/Contracts/DBETToVETDepositContract.ts @@ -11,7 +11,7 @@ import Contract from 'web3/eth/contract' const ethAbi = require('web3-eth-abi') -const contracts = require('@decent-bet/contract-migration') +const contracts = require('@decent-bet/contract-playdbet') const helper = new Helper() const WATCH_DEPOSIT_TIMEOUT = 9 * 60000 @@ -29,10 +29,10 @@ export default class DBETToVETDepositContract extends BaseContract { depositAddress, ) - const SENDER_CONTRACT_ADDRESS = contracts.DBETVETToken.address[Config.chainTag] + const SENDER_CONTRACT_ADDRESS = contracts.DBETVETTokenContract.address[Config.chainTag] this.senderContract = new thor.eth.Contract( - contracts.DBETVETToken.raw.abi, + contracts.DBETVETTokenContract.raw.abi, SENDER_CONTRACT_ADDRESS ) this.onProgress = new Subject() diff --git a/src/Components/Web3/Contracts/DBETVETTokenContract.ts b/src/Components/Web3/Contracts/DBETVETTokenContract.ts index 0dabb2f..bf1abb2 100644 --- a/src/Components/Web3/Contracts/DBETVETTokenContract.ts +++ b/src/Components/Web3/Contracts/DBETVETTokenContract.ts @@ -5,17 +5,17 @@ import Helper from '../../Helper' import Web3 from 'web3'; import Contract from 'web3/eth/contract'; const helper = new Helper() -const contracts = require('@decent-bet/contract-migration') +const contracts = require('@decent-bet/contract-playdbet') export default class DBETVETTokenContract extends BaseContract { protected contract: Contract; - constructor(web3: Web3, private thor: Web3) { - super(web3) - this.thor = thor + constructor(private thor: Web3) { + super(thor); + this.thor = thor; - let tokenAddress = contracts.DBETVETToken.address[Config.chainTag] + let tokenAddress = contracts.DBETVETTokenContract.address[Config.chainTag] this.contract = new thor.eth.Contract( - contracts.DBETVETToken.raw.abi, + contracts.DBETVETTokenContract.raw.abi, tokenAddress, ) }