@@ -282,7 +294,10 @@ class Home extends PureComponent {
accounts.data[0]
)}
>
- {PNKBalance.data.activatedTokens} PNK
+ {weiBNToDecimalString(
+ PNKBalance.data.activatedTokens
+ )}{' '}
+ PNK
@@ -321,7 +336,8 @@ class Home extends PureComponent {
accounts.data[0]
)}
>
- {PNKBalance.data.lockedTokens} PNK
+ {weiBNToDecimalString(PNKBalance.data.lockedTokens)}{' '}
+ PNK
@@ -345,9 +361,9 @@ class Home extends PureComponent {
@@ -367,13 +383,13 @@ class Home extends PureComponent {
pendingActions.data &&
pendingActions.data.map(p => (
diff --git a/src/containers/tokens/index.js b/src/containers/tokens/index.js
index 1427172..43d6aa1 100644
--- a/src/containers/tokens/index.js
+++ b/src/containers/tokens/index.js
@@ -10,6 +10,7 @@ import * as walletActions from '../../actions/wallet'
import * as arbitratorSelectors from '../../reducers/arbitrator'
import * as arbitratorActions from '../../actions/arbitrator'
import { camelToTitleCase } from '../../utils/string'
+import { weiBNToDecimalString, decimalStringToWeiBN } from '../../utils/number'
import Icosahedron from '../../components/icosahedron'
import Button from '../../components/button'
import * as arbitratorConstants from '../../constants/arbitrator'
@@ -83,7 +84,11 @@ class Tokens extends PureComponent {
validateTransferPNKForm = values => {
const { PNKBalance } = this.props
const errors = {}
- if (PNKBalance.data.contractBalance < values.amount)
+ if (
+ PNKBalance.data.contractBalance.lessThan(
+ decimalStringToWeiBN(values.amount)
+ )
+ )
errors.amount = 'You do not own this much PNK.'
return errors
}
@@ -92,29 +97,45 @@ class Tokens extends PureComponent {
const { PNKBalance } = this.props
const errors = {}
if (
- PNKBalance.data.tokenBalance - PNKBalance.data.lockedTokens <
- values.amount
+ PNKBalance.data.tokenBalance
+ .minus(PNKBalance.data.lockedTokens)
+ .lessThan(decimalStringToWeiBN(values.amount))
)
errors.amount = 'You do not have this much free PNK.'
return errors
}
+ handleWithdrawPNKFormSubmit = formData => {
+ const { withdrawPNK } = this.props
+ const { amount } = formData
+ withdrawPNK(decimalStringToWeiBN(amount).toString())
+ }
+
+ handleTransferPNKFormSubmit = formData => {
+ const { transferPNK } = this.props
+ const { amount } = formData
+ transferPNK(decimalStringToWeiBN(amount).toString())
+ }
+
+ handleBuyPNKFormSubmit = formData => {
+ const { buyPNK } = this.props
+ const { amount } = formData
+ buyPNK(decimalStringToWeiBN(amount).toString())
+ }
+
render() {
const {
accounts,
balance,
PNKBalance,
arbitratorData,
- buyPNK,
passPeriod,
buyPNKFormIsInvalid,
submitBuyPNKForm,
passPeriodFormIsInvalid,
submitPassPeriodForm,
- transferPNK,
transferPNKFormIsInvalid,
submitTransferPNKForm,
- withdrawPNK,
withdrawPNKFormIsInvalid,
submitWithdrawPNKForm
} = this.props
@@ -122,7 +143,10 @@ class Tokens extends PureComponent {
if (!PNKBalance.data || !arbitratorData.data) return null
let withdrawInvalid = true
- if (!withdrawPNKFormIsInvalid && PNKBalance.data.activatedTokens === 0) {
+ if (
+ !withdrawPNKFormIsInvalid &&
+ PNKBalance.data.activatedTokens.toNumber() === 0
+ ) {
withdrawInvalid = false
}
@@ -152,9 +176,9 @@ class Tokens extends PureComponent {
),
- amount: PNKBalance.data.contractBalance
+ amount: weiBNToDecimalString(PNKBalance.data.contractBalance)
}}
- onSubmit={transferPNK}
+ onSubmit={this.handleTransferPNKFormSubmit}
validate={this.validateTransferPNKForm}
/>
@@ -177,9 +201,11 @@ class Tokens extends PureComponent {
not withdraw tokens that are at stake in active disputes.
),
- amount: PNKBalance.data.tokenBalance - PNKBalance.data.lockedTokens
+ amount: weiBNToDecimalString(
+ PNKBalance.data.tokenBalance.minus(PNKBalance.data.lockedTokens)
+ )
}}
- onSubmit={withdrawPNK}
+ onSubmit={this.handleWithdrawPNKFormSubmit}
validate={this.validateWithdrawPNKForm}
/>
@@ -207,7 +233,7 @@ class Tokens extends PureComponent {
)
}}
- onSubmit={buyPNK}
+ onSubmit={this.handleBuyPNKFormSubmit}
/>
- Activated PNK: {PNKBalance.data.activatedTokens}
+ Activated PNK:{' '}
+ {weiBNToDecimalString(PNKBalance.data.activatedTokens)}
- Locked PNK: {PNKBalance.data.lockedTokens}
+ Locked PNK:{' '}
+ {weiBNToDecimalString(PNKBalance.data.lockedTokens)}
Session:
diff --git a/src/reducers/arbitrator.js b/src/reducers/arbitrator.js
index 4a73656..65fb841 100644
--- a/src/reducers/arbitrator.js
+++ b/src/reducers/arbitrator.js
@@ -7,9 +7,9 @@ const {
initialState: PNKBalanceInitialState
} = createResource(
PropTypes.shape({
- tokenBalance: PropTypes.number.isRequired,
- activatedTokens: PropTypes.number.isRequired,
- lockedTokens: PropTypes.number.isRequired
+ tokenBalance: PropTypes.object.isRequired,
+ activatedTokens: PropTypes.object.isRequired,
+ lockedTokens: PropTypes.object.isRequired
}),
{ withUpdate: true }
)
@@ -24,7 +24,7 @@ const {
period: PropTypes.number.isRequired,
lastPeriodChange: PropTypes.number.isRequired,
timePerPeriod: PropTypes.arrayOf(PropTypes.number.isRequired).isRequired,
- minActivatedToken: PropTypes.number.isRequired
+ minActivatedToken: PropTypes.object.isRequired
}),
{ withUpdate: true }
)
diff --git a/src/reducers/dispute.js b/src/reducers/dispute.js
index 878018e..536993e 100644
--- a/src/reducers/dispute.js
+++ b/src/reducers/dispute.js
@@ -11,7 +11,7 @@ const {
arbitrableContractAddress: PropTypes.string.isRequired,
arbitratorAddress: PropTypes.string.isRequired,
arbitrationFeePerJuror: PropTypes.number.isRequired,
- disputeId: PropTypes.number.isRequired,
+ disputeID: PropTypes.number.isRequired,
firstSession: PropTypes.number.isRequired,
initialNumberJurors: PropTypes.number.isRequired,
numberOfAppeals: PropTypes.number.isRequired,
@@ -39,7 +39,7 @@ const {
partyB: PropTypes.string.isRequired,
// Dispute Data
- disputeId: PropTypes.number.isRequired,
+ disputeID: PropTypes.number.isRequired,
firstSession: PropTypes.number.isRequired,
lastSession: PropTypes.number.isRequired,
numberOfAppeals: PropTypes.number.isRequired,
diff --git a/src/reducers/notification.js b/src/reducers/notification.js
index 9bb1cfd..f8d4f1e 100644
--- a/src/reducers/notification.js
+++ b/src/reducers/notification.js
@@ -9,7 +9,7 @@ export const _notificationShape = PropTypes.shape({
message: PropTypes.string.isRequired,
data: PropTypes.shape({
// TODO
- disputeId: PropTypes.number,
+ disputeID: PropTypes.number,
arbitratorAddress: PropTypes.string
}).isRequired,
_id: PropTypes.string.isRequired,
diff --git a/src/sagas/arbitrator.js b/src/sagas/arbitrator.js
index ec31029..3eb40a5 100644
--- a/src/sagas/arbitrator.js
+++ b/src/sagas/arbitrator.js
@@ -44,7 +44,6 @@ function* transferPNK({ payload: { amount } }) {
* @returns {object} - The update PNK balance.
*/
function* withdrawPNK({ payload: { amount } }) {
- console.log(amount)
return yield call(
kleros.arbitrator.withdrawPNK,
amount,
diff --git a/src/sagas/dispute.js b/src/sagas/dispute.js
index 85aeed0..81d1200 100644
--- a/src/sagas/dispute.js
+++ b/src/sagas/dispute.js
@@ -87,16 +87,13 @@ const parseDispute = d => {
*/
function* fetchDisputes() {
const account = yield select(walletSelectors.getAccount)
-
const [_disputes, arbitratorData] = yield all([
call(kleros.arbitrator.getDisputesForUser, account),
call(fetchArbitratorData)
])
-
yield put(
action(arbitratorActions.arbitratorData.RECEIVE, { arbitratorData })
)
-
const disputes = []
for (const d of _disputes)
if (d.arbitrableContractAddress && d.arbitrableContractAddress !== '0x') {
@@ -105,16 +102,12 @@ function* fetchDisputes() {
d.arbitrableContractAddress
)
- const arbitrableData = yield call(kleros.arbitrable.getContractData)
+ const metaEvidence = yield call(kleros.arbitrable.getMetaEvidence)
disputes.push({
...d,
- title: arbitrableData.metaEvidence
- ? arbitrableData.metaEvidence.title
- : null,
- description: arbitrableData.metaEvidence
- ? arbitrableData.metaEvidence.description
- : null
+ title: metaEvidence ? metaEvidence.title : null,
+ description: metaEvidence ? metaEvidence.description : null
})
} else disputes.push(d)
@@ -130,7 +123,7 @@ function* fetchDisputeDeadlines({ payload: { _disputes } }) {
_disputes.map(dispute =>
call(
kleros.disputes.getDisputeDeadline,
- dispute.disputeId,
+ dispute.disputeID,
dispute.numberOfAppeals
)
)
diff --git a/src/utils/number.js b/src/utils/number.js
index 2c79db8..4931f13 100644
--- a/src/utils/number.js
+++ b/src/utils/number.js
@@ -1,3 +1,4 @@
+import Eth from 'ethjs'
/**
* Stringifies a number into the preffered Kleros percentage format.
* @param {number} n - The number.
@@ -6,3 +7,26 @@
export function numberToPercentage(n) {
return `${(n * 100).toFixed(2)}%`
}
+
+/**
+ * Convert a Big Number object of an amount in WEI to a decimal string.
+ * NOTE: Should never use decimal numbers (toNumber) as precession can be lost.
+ * For all mathematical opperations convert back to a BN object. Decimal strings
+ * are only used for display.
+ * @param {object} bn - The Big Number object.
+ * @returns {string} The amount represented as a decimal string
+ */
+export function weiBNToDecimalString(bn) {
+ // WARNING web3 and ethjs use different BN libraries.
+ return Eth.fromWei(bn, 'ether').toString()
+}
+
+/**
+ * Converts a decimal string to a Big Number object.
+ * @param {string} amount - The amount represented by a decimal string.
+ * @returns {object} The Big Number object of the amount
+ */
+export function decimalStringToWeiBN(amount) {
+ if (amount === '') return Eth.toBN(0) // to avoid errors on inputs return BN(0) for empty string
+ return Eth.toWei(amount, 'ether')
+}