Skip to content

Commit

Permalink
fix net price for powerup and stake (#211)
Browse files Browse the repository at this point in the history
* fix net price for powerup and stake

* fix rex price for net rent

* fix eos symbol to core token symbol

* fix REXInfo import error

* format resources.ts
  • Loading branch information
ttwishing authored and aaroncox committed Oct 2, 2024
1 parent 92ba012 commit 44dbe80
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 25 deletions.
2 changes: 1 addition & 1 deletion src/pages/earn/step/bootstrap.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import Form from '~/components/elements/form.svelte'
import InputAsset from '~/components/elements/input/asset.svelte'
import InputLabel from '~/components/elements/input/label.svelte'
import {REXInfo} from '../types'
import type {REXInfo} from '../types'
export let amount: string
export let availableTokens: Asset
Expand Down
8 changes: 7 additions & 1 deletion src/pages/resources/components/forms/powerup.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@
import {activeBlockchain, activeSession, currentAccount} from '~/store'
import {systemToken} from '~/stores/tokens'
import {systemTokenBalance} from '~/stores/balances'
import {powerupPrice, sampleUsage, statePowerUp} from '~/pages/resources/resources'
import {
cpuPowerupPrice,
netPowerupPrice,
sampleUsage,
statePowerUp,
} from '~/pages/resources/resources'
import type {FormTransaction} from '~/ui-types'
import Button from '~/components/elements/button.svelte'
Expand All @@ -23,6 +28,7 @@
export let resource: string = 'cpu'
const unit = resource === 'cpu' ? 'ms' : 'kb'
const powerupPrice = resource === 'cpu' ? cpuPowerupPrice : netPowerupPrice
let amount: Writable<string> = writable('')
let error: string | undefined
Expand Down
9 changes: 7 additions & 2 deletions src/pages/resources/components/forms/rex.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -24,6 +24,7 @@
export let resource = 'cpu'
const unit = resource === 'cpu' ? 'ms' : 'kb'
const rexPrice = resource === 'cpu' ? cpuRexPrice : netRexPrice
let amount: Writable<string> = writable('')
let error: string | undefined
Expand All @@ -42,6 +43,10 @@
}
)
const disabled: Readable<boolean> = 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) {
Expand Down Expand Up @@ -142,7 +147,7 @@
<FormBalance token={$systemToken} balance={systemTokenBalance} />
{/if}
<InputErrorMessage errorMessage={error} />
<Button fluid size="large" formValidation on:action={rex}
<Button fluid disabled={$disabled} size="large" formValidation on:action={rex}
>Rent {Number($amount)} {unit} for {$cost}</Button
>
</Form>
Expand Down
16 changes: 12 additions & 4 deletions src/pages/resources/components/state/prices.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,24 @@
import {ChainFeatures} from '~/config'
import {activeBlockchain} from '~/store'
import {powerupPrice, rexPrice, stakingPrice} from '~/pages/resources/resources'
import {
cpuPowerupPrice,
netPowerupPrice,
cpuRexPrice,
netRexPrice,
cpuStakingPrice,
netStakingPrice,
} from '~/pages/resources/resources'
import Button from '~/components/elements/button.svelte'
import Segment from '~/components/elements/segment.svelte'
import SegmentGroup from '~/components/elements/segment/group.svelte'
export let resource = 'cpu'
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
Expand Down Expand Up @@ -156,9 +166,7 @@
<div class="offer">
<div class="service">Staking</div>
<div class="price">
{(Number($stakingPrice.value) * 1000).toFixed(
$stakingPrice.symbol.precision
)}
{$stakingPrice.value.toFixed($stakingPrice.symbol.precision)}
</div>
<div class="pair">
{$token} per
Expand Down
109 changes: 92 additions & 17 deletions src/pages/resources/resources.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import {derived, Readable} from 'svelte/store'
import {API, Asset} from '@greymass/eosio'
import {Resources, SampleUsage, PowerUpState, RAMState, REXState} from '@greymass/eosio-resources'
import {
Resources,
SampleUsage,
PowerUpState,
RAMState,
REXState,
BNPrecision,
} from '@greymass/eosio-resources'

import {activeBlockchain} from '~/store'

import {getClient} from '../../api-client'
Expand Down Expand Up @@ -96,31 +104,59 @@ export const msToRent: Readable<number> = derived(activeBlockchain, ($activeBloc
return 1
})

export const powerupPrice = derived(
[msToRent, sampleUsage, statePowerUp, info],
([$msToRent, $sampleUsage, $statePowerUp, $info]) => {
//price per ms
export const cpuPowerupPrice = derived(
[activeBlockchain, msToRent, sampleUsage, statePowerUp, info],
([$activeBlockchain, $msToRent, $sampleUsage, $statePowerUp, $info]) => {
if ($msToRent && $sampleUsage && $statePowerUp) {
return Asset.from(
$statePowerUp.cpu.price_per_ms($sampleUsage, $msToRent, $info),
'4,EOS'
$activeBlockchain.coreTokenSymbol
)
}
return Asset.from(0, $activeBlockchain.coreTokenSymbol)
}
)

// price per kb
export const netPowerupPrice = derived(
[activeBlockchain, sampleUsage, statePowerUp, info],
([$activeBlockchain, $sampleUsage, $statePowerUp, $info]) => {
if ($sampleUsage && $statePowerUp) {
return Asset.from(
$statePowerUp.net.price_per_kb($sampleUsage, 1, $info),
$activeBlockchain.coreTokenSymbol
)
}
return Asset.from(0, '4,EOS')
return Asset.from(0, $activeBlockchain.coreTokenSymbol)
}
)

export const stakingPrice = derived(
//price per ms
export const cpuStakingPrice = derived(
[activeBlockchain, msToRent, sampleUsage],
([$activeBlockchain, $msToRent, $sampleUsage]) => {
if ($msToRent && $sampleUsage) {
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
}
return Asset.fromUnits(price, $activeBlockchain.coreTokenSymbol)
let price = (cpu_weight / cpu_limit) * $msToRent
return Asset.fromUnits(price * 1000, $activeBlockchain.coreTokenSymbol)
}
return Asset.from(0, $activeBlockchain.coreTokenSymbol)
}
)

// price per kb for staking
export const netStakingPrice = derived(
[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)
let price = net_weight / net_limit
return Asset.fromUnits(price * 1000, $activeBlockchain.coreTokenSymbol)
}
return Asset.from(0, $activeBlockchain.coreTokenSymbol)
}
Expand Down Expand Up @@ -152,16 +188,55 @@ export const stateREX: Readable<REXState | undefined> = derived(
)

// The price of CPU in the REX system
export const rexPrice = derived(
[msToRent, sampleUsage, stateREX],
([$msToRent, $sampleUsage, $stateREX]) => {
export const cpuRexPrice = derived(
[activeBlockchain, msToRent, sampleUsage, stateREX],
([$activeBlockchain, $msToRent, $sampleUsage, $stateREX]) => {
if ($msToRent && $sampleUsage && $stateREX) {
return Asset.from($stateREX.price_per($sampleUsage, $msToRent * 30000), '4,EOS')
const price = $stateREX.price_per($sampleUsage, $msToRent * 30000)
const coreTokenSymbol = $activeBlockchain.coreTokenSymbol
return compatPriceWithPrecision(price, coreTokenSymbol)
}
return Asset.from(0, $activeBlockchain.coreTokenSymbol)
}
)

// The price of Net in the REX system
export const netRexPrice = derived(
[activeBlockchain, sampleUsage, stateREX],
([$activeBlockchain, $sampleUsage, $stateREX]) => {
if ($sampleUsage && $stateREX) {
const price = calculateNetRexPrice($stateREX, $sampleUsage, 30000)
const coreTokenSymbol = $activeBlockchain.coreTokenSymbol
return compatPriceWithPrecision(price, coreTokenSymbol)
}
return Asset.from(0, '4,EOS')
return Asset.from(0, $activeBlockchain.coreTokenSymbol)
}
)

function compatPriceWithPrecision(price: number, coreTokenSymbol: Asset.Symbol) {
let precision = coreTokenSymbol.precision
if (price > 0 && price < 1 / Math.pow(10, precision)) {
precision = Number(price.toExponential().split('-')[1])
}
return Asset.from(price, `${precision},${coreTokenSymbol.name}`)
}

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<RAMState | undefined> = derived(
[activeBlockchain],
Expand Down

0 comments on commit 44dbe80

Please sign in to comment.