diff --git a/src/pages/resources/components/forms/rex.svelte b/src/pages/resources/components/forms/rex.svelte index ccecb0e1..5605c922 100644 --- a/src/pages/resources/components/forms/rex.svelte +++ b/src/pages/resources/components/forms/rex.svelte @@ -10,7 +10,7 @@ import {activeBlockchain, activeSession, currentAccount} from '~/store' import {systemToken} from '~/stores/tokens' import {systemTokenBalance} from '~/stores/balances' - import {rexPrice} from '~/pages/resources/resources' + import {cpuRexPrice, netRexPrice} from '~/pages/resources/resources' import type {FormTransaction} from '~/ui-types' import Button from '~/components/elements/button.svelte' @@ -24,6 +24,7 @@ export let resource = 'cpu' const unit = resource === 'cpu' ? 'ms' : 'kb' + const rexPrice = resource === 'cpu' ? cpuRexPrice : netRexPrice let amount: Writable = writable('') let error: string | undefined @@ -42,6 +43,10 @@ } ) + const disabled: Readable = derived(cost, ($cost) => { + return $cost ? $cost.value <= 0 : true + }) + // Create a derived store of the field we expect to be modified export const field = derived([currentAccount], ([$currentAccount]) => { if ($currentAccount && $currentAccount.self_delegated_bandwidth) { @@ -142,7 +147,7 @@ {/if} - diff --git a/src/pages/resources/components/state/prices.svelte b/src/pages/resources/components/state/prices.svelte index 909a2597..ec8fbbab 100644 --- a/src/pages/resources/components/state/prices.svelte +++ b/src/pages/resources/components/state/prices.svelte @@ -8,7 +8,8 @@ import { cpuPowerupPrice, netPowerupPrice, - rexPrice, + cpuRexPrice, + netRexPrice, cpuStakingPrice, netStakingPrice, } from '~/pages/resources/resources' @@ -21,6 +22,7 @@ const unit = resource === 'cpu' ? 'ms' : 'kb' const powerupPrice = resource === 'cpu' ? cpuPowerupPrice : netPowerupPrice const stakingPrice = resource === 'cpu' ? cpuStakingPrice : netStakingPrice + const rexPrice = resource === 'cpu' ? cpuRexPrice : netRexPrice const {PowerUp, REX, Staking} = ChainFeatures diff --git a/src/pages/resources/resources.ts b/src/pages/resources/resources.ts index ca1d579b..fc1def9f 100644 --- a/src/pages/resources/resources.ts +++ b/src/pages/resources/resources.ts @@ -2,6 +2,7 @@ import { derived, Readable } from 'svelte/store' import { Int64, API, Asset } from '@greymass/eosio' import { Resources, SampleUsage, PowerUpState, RAMState, REXState } from '@greymass/eosio-resources' import { activeBlockchain } from '~/store' +import { BNPrecision } from '@greymass/eosio-resources' import { getClient } from '../../api-client' import { ChainConfig, ChainFeatures, resourceFeatures } from '~/config' @@ -112,12 +113,11 @@ export const cpuPowerupPrice = derived( // price per kb export const netPowerupPrice = derived( - [msToRent, sampleUsage, statePowerUp, info], - ([$msToRent, $sampleUsage, $statePowerUp, $info]) => { - if ($msToRent && $sampleUsage && $statePowerUp) { - const price = $statePowerUp.net.price_per_kb($sampleUsage, $msToRent, $info) + [sampleUsage, statePowerUp, info], + ([$sampleUsage, $statePowerUp, $info]) => { + if ($sampleUsage && $statePowerUp) { return Asset.from( - $statePowerUp.net.price_per_kb($sampleUsage, $msToRent, $info), + $statePowerUp.net.price_per_kb($sampleUsage, 1, $info), '4,EOS' ) } @@ -133,21 +133,18 @@ export const cpuStakingPrice = derived( const { account } = $sampleUsage const cpu_weight = Number(account.total_resources.cpu_weight.units) const cpu_limit = Number(account.cpu_limit.max.value) - let price = cpu_weight / cpu_limit - if ($activeBlockchain.resourceSampleMilliseconds) { - price *= $activeBlockchain.resourceSampleMilliseconds - } + let price = (cpu_weight / cpu_limit) * $msToRent return Asset.fromUnits(price * 1000, $activeBlockchain.coreTokenSymbol) } return Asset.from(0, $activeBlockchain.coreTokenSymbol) } ) -// price per kb +// price per kb for staking export const netStakingPrice = derived( - [activeBlockchain, msToRent, sampleUsage], - ([$activeBlockchain, $msToRent, $sampleUsage]) => { - if ($msToRent && $sampleUsage) { + [activeBlockchain, sampleUsage], + ([$activeBlockchain, $sampleUsage]) => { + if ($sampleUsage) { const { account } = $sampleUsage const net_weight = Number(account.total_resources.net_weight.units) const net_limit = Number(account.net_limit.max.value) @@ -184,7 +181,7 @@ export const stateREX: Readable = derived( ) // The price of CPU in the REX system -export const rexPrice = derived( +export const cpuRexPrice = derived( [msToRent, sampleUsage, stateREX], ([$msToRent, $sampleUsage, $stateREX]) => { if ($msToRent && $sampleUsage && $stateREX) { @@ -194,6 +191,38 @@ export const rexPrice = derived( } ) +// The price of Net in the REX system +export const netRexPrice = derived( + [sampleUsage, stateREX], + ([$sampleUsage, $stateREX]) => { + if ($sampleUsage && $stateREX) { + const price = calculateNetRexPrice($stateREX, $sampleUsage, 30000); + let precision = 4; + if (price > 0 && price < 0.0001) { + precision = Number(price.toExponential().split('-')[1]) + } + return Asset.from(price, `${precision},EOS`) + } + return Asset.from(0, '4,EOS') + } +) + +function calculateNetRexPrice(stateRex: REXState, sample: SampleUsage, unit = 1000): number { + // Sample token units + const tokens = Asset.fromUnits(10000, stateRex.symbol) + + // Spending 1 EOS (10000 units) on REX gives this many tokens + const bancor = Number(tokens.units) / (stateRex.total_rent.value / stateRex.total_unlent.value) + // The ratio of the number of tokens received vs the sampled values + const unitPrice = bancor * (Number(sample.net) / BNPrecision) + // The token units spent per unit + const perunit = Number(tokens.units) / unitPrice + // Multiply the per unit cost by the units requested + const cost = perunit * unit + // Converting to an Asset + return cost / Math.pow(10, stateRex.precision) +} + // The state of the REX system export const stateRAM: Readable = derived( [activeBlockchain],