From 0ca7ba53d6a3b3b81251623cdf4c87bb3f810edb Mon Sep 17 00:00:00 2001 From: kurt Date: Wed, 2 Oct 2024 12:45:50 +0800 Subject: [PATCH] fix net rent price --- src/pages/earn/step/bootstrap.svelte | 2 +- .../resources/components/forms/powerup.svelte | 8 +- .../resources/components/forms/rex.svelte | 9 +- .../resources/components/state/prices.svelte | 16 ++- src/pages/resources/resources.ts | 116 ++++++++++++++---- 5 files changed, 119 insertions(+), 32 deletions(-) diff --git a/src/pages/earn/step/bootstrap.svelte b/src/pages/earn/step/bootstrap.svelte index 80f4d290..8e41e32b 100644 --- a/src/pages/earn/step/bootstrap.svelte +++ b/src/pages/earn/step/bootstrap.svelte @@ -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 diff --git a/src/pages/resources/components/forms/powerup.svelte b/src/pages/resources/components/forms/powerup.svelte index 34bd2913..b34633d5 100644 --- a/src/pages/resources/components/forms/powerup.svelte +++ b/src/pages/resources/components/forms/powerup.svelte @@ -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' @@ -23,6 +28,7 @@ export let resource: string = 'cpu' const unit = resource === 'cpu' ? 'ms' : 'kb' + const powerupPrice = resource === 'cpu' ? cpuPowerupPrice : netPowerupPrice let amount: Writable = writable('') let error: string | undefined 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 fd517a10..ec8fbbab 100644 --- a/src/pages/resources/components/state/prices.svelte +++ b/src/pages/resources/components/state/prices.svelte @@ -5,7 +5,14 @@ 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' @@ -13,6 +20,9 @@ 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 @@ -156,9 +166,7 @@
Staking
- {(Number($stakingPrice.value) * 1000).toFixed( - $stakingPrice.symbol.precision - )} + {$stakingPrice.value.toFixed($stakingPrice.symbol.precision)}
{$token} per diff --git a/src/pages/resources/resources.ts b/src/pages/resources/resources.ts index 56b8a935..edef9b1a 100644 --- a/src/pages/resources/resources.ts +++ b/src/pages/resources/resources.ts @@ -1,14 +1,15 @@ -import {derived, Readable} from 'svelte/store' -import {API, Asset} from '@greymass/eosio' -import {Resources, SampleUsage, PowerUpState, RAMState, REXState} from '@greymass/eosio-resources' -import {activeBlockchain} from '~/store' +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' +import { getClient } from '../../api-client' +import { ChainConfig, ChainFeatures, resourceFeatures } from '~/config' const getResourceClient = (chain: ChainConfig) => { const api = getClient(chain) - const options: any = {api} + const options: any = { api } if (chain.resourceSampleAccount) { options.sampleAccount = chain.resourceSampleAccount } @@ -96,31 +97,59 @@ export const msToRent: Readable = 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, '4,EOS') + return Asset.from(0, $activeBlockchain.coreTokenSymbol) } ) -export const stakingPrice = derived( +// 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, $activeBlockchain.coreTokenSymbol) + } +) + +//price per ms +export const cpuStakingPrice = derived( [activeBlockchain, msToRent, sampleUsage], ([$activeBlockchain, $msToRent, $sampleUsage]) => { if ($msToRent && $sampleUsage) { - const {account} = $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) } @@ -152,16 +181,55 @@ export const stateREX: Readable = 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, '4,EOS') + 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, $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 = derived( [activeBlockchain],