diff --git a/packages/@core-js/src/TonAPI/TonAPIGenerated.ts b/packages/@core-js/src/TonAPI/TonAPIGenerated.ts index a73a3cd2a..ceb0038ea 100644 --- a/packages/@core-js/src/TonAPI/TonAPIGenerated.ts +++ b/packages/@core-js/src/TonAPI/TonAPIGenerated.ts @@ -63,6 +63,13 @@ export interface BlockValueFlow { minted: BlockCurrencyCollection; } +export interface ServiceStatus { + /** @default true */ + rest_online: boolean; + /** @example 100 */ + indexing_latency: number; +} + export interface BlockchainBlock { /** @example 130 */ tx_quantity: number; @@ -296,7 +303,7 @@ export interface ComputePhase { */ gas_used?: number; /** - * @format uint32 + * @format int32 * @example 5 */ vm_steps?: number; @@ -811,8 +818,15 @@ export interface BlockchainRawAccount { last_transaction_lt: number; /** @example "088b436a846d92281734236967970612f87fbd64a2cd3573107948379e8e4161" */ last_transaction_hash?: string; + /** @example "088b436a846d92281734236967970612f87fbd64a2cd3573107948379e8e4161" */ + frozen_hash?: string; status: AccountStatus; storage: AccountStorageInfo; + libraries?: { + /** @example true */ + public: boolean; + root: string; + }[]; } export interface Account { @@ -1692,7 +1706,7 @@ export interface TraceID { /** @example "55e8809519cd3c49098c9ee45afdafcea7a894a74d0f628d94a115a50e045122" */ id: string; /** - * @format uint64 + * @format int64 * @example 1645544908 */ utime: number; @@ -1893,17 +1907,17 @@ export interface DecodedMessage { ext_in_msg_decoded?: { wallet_v3?: { /** - * @format uint32 + * @format int64 * @example 1 */ subwallet_id: number; /** - * @format uint32 + * @format int64 * @example 1 */ valid_until: number; /** - * @format uint32 + * @format int64 * @example 1 */ seqno: number; @@ -1911,22 +1925,22 @@ export interface DecodedMessage { }; wallet_v4?: { /** - * @format uint32 + * @format int64 * @example 1 */ subwallet_id: number; /** - * @format uint32 + * @format int64 * @example 1 */ valid_until: number; /** - * @format uint32 + * @format int64 * @example 1 */ seqno: number; /** - * @format int8 + * @format int32 * @example 1 */ op: number; @@ -1934,7 +1948,7 @@ export interface DecodedMessage { }; wallet_highload_v2?: { /** - * @format uint32 + * @format int64 * @example 1 */ subwallet_id: number; @@ -2211,23 +2225,20 @@ export interface AccountInfoByStateInit { } export interface Seqno { - /** @format uint32 */ + /** @format int32 */ seqno: number; } export interface BlockRaw { /** - * @format uint32 + * @format int32 * @example 4294967295 */ workchain: number; + /** @example 800000000000000 */ + shard: string; /** - * @format uint64 - * @example 9223372036854776000 - */ - shard: number; - /** - * @format uint32 + * @format int32 * @example 30699640 */ seqno: number; @@ -2239,7 +2250,7 @@ export interface BlockRaw { export interface InitStateRaw { /** - * @format uint32 + * @format int32 * @example 4294967295 */ workchain: number; @@ -2285,6 +2296,18 @@ export interface TokenRates { diff_30d?: Record; } +export interface MarketTonRates { + /** @example "OKX" */ + market: string; + /** @example 5.2 */ + usd_price: number; + /** + * @format int64 + * @example 1668436763 + */ + last_date_update: number; +} + /** @example "int_msg" */ export enum MessageMsgTypeEnum { IntMsg = 'int_msg', @@ -2372,9 +2395,10 @@ export enum JettonSwapActionDexEnum { } export enum NftPurchaseActionAuctionTypeEnum { + DNSTon = 'DNS.ton', DNSTg = 'DNS.tg', + NUMBERTg = 'NUMBER.tg', Getgems = 'getgems', - Basic = 'basic', } /** @example "ton20" */ @@ -2448,12 +2472,21 @@ export interface EmulateMessageToTraceParams { ignore_signature_check?: boolean; } +export interface EmulateMessageToAccountEventParams { + ignore_signature_check?: boolean; + /** + * account ID + * @example "0:97264395BD65A255A429B11326C84128B7D70FFED7949ABAE3036D506BA38621" + */ + accountId: string; +} + export interface GetAccountJettonsBalancesParams { /** * accept ton and all possible fiat currencies, separated by commas - * @example "ton,usd,rub" + * @example ["ton","usd","rub"] */ - currencies?: string; + currencies?: string[]; /** * account ID * @example "0:97264395BD65A255A429B11326C84128B7D70FFED7949ABAE3036D506BA38621" @@ -2604,8 +2637,8 @@ export interface GetAccountEventsParams { before_lt?: number; /** * @min 1 - * @max 1000 - * @example 100 + * @max 100 + * @example 20 */ limit: number; /** @@ -2926,14 +2959,16 @@ export interface GetStakingPoolsParams { export interface GetRatesParams { /** * accept ton and jetton master addresses, separated by commas - * @example "ton" + * @maxItems 100 + * @example ["ton"] */ - tokens: string; + tokens: string[]; /** * accept ton and all possible fiat currencies, separated by commas - * @example "ton,usd,rub" + * @maxItems 50 + * @example ["ton","usd","rub"] */ - currencies: string; + currencies: string[]; } export interface GetChartRatesParams { @@ -2963,7 +2998,7 @@ export interface GetChartRatesParams { export interface GetRawMasterchainInfoExtParams { /** * mode - * @format uint32 + * @format int32 * @example 0 */ mode: number; @@ -2972,7 +3007,7 @@ export interface GetRawMasterchainInfoExtParams { export interface GetRawBlockchainBlockHeaderParams { /** * mode - * @format uint32 + * @format int32 * @example 0 */ mode: number; @@ -2999,13 +3034,13 @@ export interface GetRawAccountStateParams { export interface GetRawShardInfoParams { /** * workchain - * @format uint32 + * @format int32 * @example 1 */ workchain: number; /** * shard - * @format uint64 + * @format int64 * @example 1 */ shard: number; @@ -3024,13 +3059,13 @@ export interface GetRawShardInfoParams { export interface GetRawTransactionsParams { /** * count - * @format uint32 + * @format int32 * @example 100 */ count: number; /** * lt - * @format uint64 + * @format int64 * @example 23814011000000 */ lt: number; @@ -3049,13 +3084,13 @@ export interface GetRawTransactionsParams { export interface GetRawListBlockTransactionsParams { /** * mode - * @format uint32 + * @format int32 * @example 0 */ mode: number; /** * count - * @format uint32 + * @format int32 * @example 100 */ count: number; @@ -3066,7 +3101,7 @@ export interface GetRawListBlockTransactionsParams { account_id?: string; /** * lt - * @format uint64 + * @format int64 * @example 23814011000000 */ lt?: number; @@ -3090,7 +3125,7 @@ export interface GetRawBlockProofParams { target_block?: string; /** * mode - * @format uint32 + * @format int32 * @example 0 */ mode: number; @@ -3099,7 +3134,7 @@ export interface GetRawBlockProofParams { export interface GetRawConfigParams { /** * mode - * @format uint32 + * @format int32 * @example 0 */ mode: number; @@ -3357,6 +3392,22 @@ export class TonAPIGenerated { this.http = http; } + status = { + /** + * @description Reduce indexing latency + * + * @tags Blockchain + * @name ReduceIndexingLatency + * @request GET:/v2/status + */ + reduceIndexingLatency: (params: RequestParams = {}) => + this.http.request({ + path: `/v2/status`, + method: 'GET', + format: 'json', + ...params, + }), + }; blockchain = { /** * @description Get blockchain block data @@ -3895,7 +3946,7 @@ export class TonAPIGenerated { */ timestamp: number; domain: { - /** @format uint32 */ + /** @format int32 */ length_bytes?: number; value: string; }; @@ -3945,7 +3996,7 @@ export class TonAPIGenerated { * @request POST:/v2/accounts/{account_id}/events/emulate */ emulateMessageToAccountEvent: ( - accountId: string, + { accountId, ...query }: EmulateMessageToAccountEventParams, data: { /** @example "te6ccgECBQEAARUAAkWIAWTtae+KgtbrX26Bep8JSq8lFLfGOoyGR/xwdjfvpvEaHg" */ boc: string; @@ -3955,6 +4006,7 @@ export class TonAPIGenerated { this.http.request({ path: `/v2/accounts/${accountId}/events/emulate`, method: 'POST', + query: query, body: data, format: 'json', ...params, @@ -4723,6 +4775,26 @@ export class TonAPIGenerated { format: 'json', ...params, }), + + /** + * @description Get the TON price from markets + * + * @tags Rates + * @name GetMarketsRates + * @request GET:/v2/rates/markets + */ + getMarketsRates: (params: RequestParams = {}) => + this.http.request< + { + markets: MarketTonRates[]; + }, + Error + >({ + path: `/v2/rates/markets`, + method: 'GET', + format: 'json', + ...params, + }), }; tonconnect = { /** @@ -4821,28 +4893,28 @@ export class TonAPIGenerated { this.http.request< { /** - * @format uint32 + * @format int32 * @example 0 */ mode: number; /** - * @format uint32 + * @format int32 * @example 257 */ version: number; /** - * @format uint64 + * @format int64 * @example 7 */ capabilities: number; last: BlockRaw; /** - * @format uint32 + * @format int32 * @example 1687938199 */ last_utime: number; /** - * @format uint32 + * @format int32 * @example 1687938204 */ now: number; @@ -4870,7 +4942,7 @@ export class TonAPIGenerated { this.http.request< { /** - * @format uint32 + * @format int32 * @example 1687146728 */ time: number; @@ -4946,7 +5018,7 @@ export class TonAPIGenerated { { id: BlockRaw; /** - * @format uint32 + * @format int32 * @example 0 */ mode: number; @@ -4978,7 +5050,7 @@ export class TonAPIGenerated { this.http.request< { /** - * @format uint32 + * @format int32 * @example 200 */ code: number; @@ -5117,7 +5189,7 @@ export class TonAPIGenerated { { id: BlockRaw; /** - * @format uint32 + * @format int32 * @example 100 */ req_count: number; @@ -5125,13 +5197,13 @@ export class TonAPIGenerated { incomplete: boolean; ids: { /** - * @format uint32 + * @format int32 * @example 0 */ mode: number; /** @example "131D0C65055F04E9C19D687B51BC70F952FD9CA6F02C2801D3B89964A779DF85" */ account?: string; - /** @format uint64 */ + /** @format int64 */ lt?: number; /** @example "131D0C65055F04E9C19D687B51BC70F952FD9CA6F02C2801D3B89964A779DF85" */ hash?: string; @@ -5185,9 +5257,9 @@ export class TonAPIGenerated { /** @example "131D0C65055F04E9C19D687B51BC70F952FD9CA6F02C2801D3B89964A779DF85" */ config_proof: string; signatures: { - /** @format uint32 */ + /** @format int64 */ validator_set_hash: number; - /** @format uint32 */ + /** @format int32 */ catchain_seqno: number; signatures: { /** @example "131D0C65055F04E9C19D687B51BC70F952FD9CA6F02C2801D3B89964A779DF85" */ @@ -5222,7 +5294,7 @@ export class TonAPIGenerated { this.http.request< { /** - * @format uint32 + * @format int32 * @example 0 */ mode: number; diff --git a/packages/mobile/src/core/Jetton/Jetton.tsx b/packages/mobile/src/core/Jetton/Jetton.tsx index 24c9634a5..975561c65 100644 --- a/packages/mobile/src/core/Jetton/Jetton.tsx +++ b/packages/mobile/src/core/Jetton/Jetton.tsx @@ -29,6 +29,7 @@ import { useWallet, useWalletCurrency } from '@tonkeeper/shared/hooks'; import { tk } from '$wallet'; import { Chart } from '$shared/components/Chart/new/Chart'; import { ChartPeriod } from '$store/zustand/chart'; +import { formatDate } from '@tonkeeper/shared/utils/date'; const unverifiedTokenHitSlop = { top: 4, left: 4, bottom: 4, right: 4 }; @@ -37,6 +38,10 @@ export const Jetton: React.FC = ({ route }) => { const jetton = useJetton(route.params.jettonAddress); const jettonActivityList = useJettonActivityList(jetton.jettonAddress); const jettonPrice = useTokenPrice(jetton.jettonAddress, jetton.balance); + const lockedJettonPrice = useTokenPrice( + jetton.jettonAddress, + jetton.lock?.amount.toString() ?? '0', + ); const wallet = useWallet(); const isWatchOnly = wallet && wallet.isWatchOnly; @@ -95,10 +100,33 @@ export const Jetton: React.FC = ({ route }) => { > {jettonPrice.formatted.totalFiat} + {jetton.lock ? ( + <> + + + {formatter.format(jetton.lock.amount, { + decimals: jetton.metadata.decimals, + currency: jetton.metadata.symbol, + currencySeparator: 'wide', + })} +  · + {' '} + {lockedJettonPrice.formatted.totalFiat} + + + {t('jetton_locked_till', { + date: formatDate(jetton.lock.till * 1000, 'd MMM yyyy'), + })} + + + ) : null} {jettonPrice.formatted.fiat ? ( - - {t('jetton_price')} {jettonPrice.formatted.fiat} - + <> + + + {t('jetton_price')} {jettonPrice.formatted.fiat} + + ) : null} {jetton.metadata.image ? ( diff --git a/packages/mobile/src/store/models.ts b/packages/mobile/src/store/models.ts index 5747245f3..4107ed66d 100644 --- a/packages/mobile/src/store/models.ts +++ b/packages/mobile/src/store/models.ts @@ -281,6 +281,7 @@ export interface JettonBalanceModel { currency: CryptoCurrency; metadata: JettonMetadata; balance: string; + lock?: { amount: string; till: number }; jettonAddress: string; walletAddress: string; verification: JettonVerification; diff --git a/packages/mobile/src/tabs/Wallet/components/WalletContentList.tsx b/packages/mobile/src/tabs/Wallet/components/WalletContentList.tsx index 41106cca4..a969cabfb 100644 --- a/packages/mobile/src/tabs/Wallet/components/WalletContentList.tsx +++ b/packages/mobile/src/tabs/Wallet/components/WalletContentList.tsx @@ -1,4 +1,4 @@ -import React, { memo, useMemo } from 'react'; +import React, { memo, ReactNode, useMemo } from 'react'; import { t } from '@tonkeeper/shared/i18n'; import { Screen, @@ -55,7 +55,7 @@ type TokenItem = { onPress?: () => void; title: string; subtitle?: string; - value?: string; + value?: string | ReactNode; subvalue?: string; rate?: Rate; picture?: string; @@ -142,11 +142,15 @@ const RenderItem = ({ item }: { item: Content }) => { } picture={item.picture} value={ - {` ${item.value}`} + typeof item.value === 'string' ? ( + {` ${item.value}`} + ) : ( + item.value + ) } subvalue={ item.subvalue && ( @@ -303,7 +307,24 @@ export const WalletContentList = memo( onPress: () => openJetton(item.address.rawAddress), picture: item.iconUrl, title: item.symbol, - value: item.quantity.formatted, + value: item.lock ? ( + + {item.quantity.formatted} + + {' '} + ·{' '} + + + {item.lock.formatted} + + + ) : ( + item.quantity.formatted + ), subvalue: item.rate.total, rate: item.rate.price ? { diff --git a/packages/mobile/src/tabs/Wallet/hooks/useTokens.ts b/packages/mobile/src/tabs/Wallet/hooks/useTokens.ts index f09e2e94d..9e8a8d87f 100644 --- a/packages/mobile/src/tabs/Wallet/hooks/useTokens.ts +++ b/packages/mobile/src/tabs/Wallet/hooks/useTokens.ts @@ -24,6 +24,9 @@ type TokenInfo = { value: string; formatted: string; }; + lock?: { + formatted: string; + }; price: TokenPrice; rate: { price: string | null; @@ -65,6 +68,9 @@ export const useTonkens = (): { value: item.balance, formatted: formatter.format(item.balance), }, + lock: item.lock && { + formatted: formatter.format(item.lock.amount), + }, price: rate, rate: { price: rate.formatted.fiat, diff --git a/packages/mobile/src/wallet/managers/JettonsManager.ts b/packages/mobile/src/wallet/managers/JettonsManager.ts index ffe8c6a20..f2b7cddee 100644 --- a/packages/mobile/src/wallet/managers/JettonsManager.ts +++ b/packages/mobile/src/wallet/managers/JettonsManager.ts @@ -7,8 +7,6 @@ import { JettonBalanceModel } from '../models/JettonBalanceModel'; import { Address } from '@tonkeeper/core/src/formatters/Address'; import { TokenApprovalManager } from './TokenApprovalManager'; import { TonPriceManager } from './TonPriceManager'; -import BigNumber from 'bignumber.js'; -import { AmountFormatter } from '@tonkeeper/core'; import { sortByPrice } from '@tonkeeper/core/src/utils/jettons'; export type JettonsState = { diff --git a/packages/mobile/src/wallet/models/JettonBalanceModel/JettonBalanceModel.ts b/packages/mobile/src/wallet/models/JettonBalanceModel/JettonBalanceModel.ts index 3574dde41..e2e9483d5 100644 --- a/packages/mobile/src/wallet/models/JettonBalanceModel/JettonBalanceModel.ts +++ b/packages/mobile/src/wallet/models/JettonBalanceModel/JettonBalanceModel.ts @@ -8,6 +8,7 @@ export class JettonBalanceModel { jettonAddress: string; walletAddress: string; verification: JettonVerification; + lock?: { amount: string; till: number }; constructor(jettonBalance: JettonBalance) { this.metadata = jettonBalance.jetton; @@ -15,6 +16,14 @@ export class JettonBalanceModel { jettonBalance.balance, jettonBalance.jetton.decimals, ); + // @ts-ignore will be implemented in API later + this.lock = jettonBalance.lock && { + amount: AmountFormatter.fromNanoStatic( + jettonBalance.lock.amount, + jettonBalance.jetton.decimals, + ), + till: jettonBalance.lock.till, + }; this.jettonAddress = new Address(jettonBalance.jetton.address).toFriendly(); this.walletAddress = new Address(jettonBalance.wallet_address.address).toFriendly(); this.verification = jettonBalance.jetton diff --git a/packages/shared/i18n/locales/tonkeeper/en.json b/packages/shared/i18n/locales/tonkeeper/en.json index 2bd7fd459..b439a3c77 100644 --- a/packages/shared/i18n/locales/tonkeeper/en.json +++ b/packages/shared/i18n/locales/tonkeeper/en.json @@ -402,6 +402,7 @@ "jetton_name": "%{name} Token", "jetton_open_explorer": "View details", "jetton_price": "Price:", + "jetton_locked_till": "Locked until %{date}", "jettons_list_title": "Tokens", "jettons_manage_tokens": "Manage tokens", "jettons_show_jettons": "Show tokens in wallet", diff --git a/packages/shared/i18n/locales/tonkeeper/ru-RU.json b/packages/shared/i18n/locales/tonkeeper/ru-RU.json index ce2d191b7..893848576 100644 --- a/packages/shared/i18n/locales/tonkeeper/ru-RU.json +++ b/packages/shared/i18n/locales/tonkeeper/ru-RU.json @@ -348,6 +348,7 @@ "jetton_name" : "%{name} Токен", "jetton_open_explorer" : "Подробнее", "jetton_price" : "Цена:", + "jetton_locked_till": "Заблокированы до %{date}", "jettons_list_title" : "Токены", "jettons_manage_tokens" : "Настроить токены", "jetton_token" : "Токен",